I've updated the jar again with latest version. It still doesn't work on my phone, but for the sake of completeness, please give it a try. I don't even know anymore if it really differs from the last one after reverting all my pointless tries...at least it has more debug log output if you enable that.
This is the modified test case that i was using:
package cz.chladek.shadertest;
import java.lang.reflect.Field;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.content.res.Resources;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.Window;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
import com.threed.jpct.Camera;
import com.threed.jpct.Config;
import com.threed.jpct.DepthBuffer;
import com.threed.jpct.FrameBuffer;
import com.threed.jpct.GLSLShader;
import com.threed.jpct.Light;
import com.threed.jpct.Loader;
import com.threed.jpct.Logger;
import com.threed.jpct.NPOTTexture;
import com.threed.jpct.Object3D;
import com.threed.jpct.Primitives;
import com.threed.jpct.RGBColor;
import com.threed.jpct.SimpleVector;
import com.threed.jpct.Texture;
import com.threed.jpct.TextureManager;
import com.threed.jpct.World;
public class ShaderTest extends Activity {
// Used to handle pause and resume...
private static ShaderTest master = null;
private GLSurfaceView mGLView;
private MyRenderer renderer = null;
private FrameBuffer fb = null;
private World world = null;
private World secWorld;
private World dummyWorld=new World();
private float touchTurn = 0;
private float touchTurnUp = 0;
private float xpos = -1;
private float ypos = -1;
private Texture font = null;
private Object3D[] objects;
private Light light;
private int selectedObject;
private Texture renderTarget;
private Texture renderTarget2;
protected void onCreate(Bundle savedInstanceState) {
Logger.log("onCreate");
//Logger.setLogLevel(Logger.LL_DEBUG);
Logger.setLogLevel(Logger.LL_DEBUG);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(LayoutParams.FLAG_FULLSCREEN, LayoutParams.FLAG_FULLSCREEN);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
if (master != null) {
copy(master);
}
super.onCreate(savedInstanceState);
mGLView = new GLSurfaceView(getApplication());
// Enable the OpenGL ES2.0 context
mGLView.setEGLContextClientVersion(2);
renderer = new MyRenderer();
mGLView.setRenderer(renderer);
setContentView(mGLView);
}
@Override
protected void onPause() {
Logger.log("onPause");
super.onPause();
mGLView.onPause();
}
@Override
protected void onResume() {
Logger.log("onResume");
super.onResume();
mGLView.onResume();
}
@Override
protected void onStop() {
Logger.log("onStop");
super.onStop();
}
private void copy(Object src) {
try {
Logger.log("Copying data from master Activity!");
Field[] fs = src.getClass().getDeclaredFields();
for (Field f : fs) {
f.setAccessible(true);
f.set(this, f.get(src));
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public boolean onTouchEvent(MotionEvent me) {
if (me.getAction() == MotionEvent.ACTION_DOWN) {
xpos = me.getX();
ypos = me.getY();
return true;
}
if (me.getAction() == MotionEvent.ACTION_UP) {
xpos = -1;
ypos = -1;
touchTurn = 0;
touchTurnUp = 0;
return true;
}
if (me.getAction() == MotionEvent.ACTION_MOVE) {
float xd = me.getX() - xpos;
float yd = me.getY() - ypos;
xpos = me.getX();
ypos = me.getY();
touchTurn = xd / -100f;
touchTurnUp = yd / -100f;
return true;
}
try {
Thread.sleep(15);
} catch (Exception e) {
// No need for this...
}
return super.onTouchEvent(me);
}
public boolean onKeyDown(int keyCode, KeyEvent msg) {
if (keyCode == KeyEvent.KEYCODE_MENU) {
selectedObject = (selectedObject + 1 == objects.length) ? 0 : selectedObject + 1;
renderer.showObjectIndex(selectedObject);
return true;
}
return super.onKeyDown(keyCode, msg);
}
protected boolean isFullscreenOpaque() {
return true;
}
class MyRenderer implements GLSurfaceView.Renderer {
private int fps = 0;
private int lfps = 0;
private long time = System.currentTimeMillis();
private Resources res;
private GLSLShader pointLightShader;
private TextureManager tm;
public MyRenderer() {
Config.farPlane = 2000;
Config.useNormalsFromOBJ = true;
Texture.defaultToMipmapping(true);
Texture.defaultTo4bpp(true);
}
public void onSurfaceChanged(GL10 gl, int w, int h) {
if (fb != null)
fb.dispose();
fb = new FrameBuffer(w, h);
if (master == null) {
world = new World();
res = getResources();
tm = TextureManager.getInstance();
font = new Texture(res.openRawResource(R.raw.numbers));
font.setMipmap(false);
pointLightShader = new GLSLShader(Loader.loadTextFile(res.openRawResource(R.raw.pixel_light_vertex)),
Loader.loadTextFile(res.openRawResource(R.raw.pixel_light_fragment_1)));
loadObjects();
light = new Light(world);
light.setIntensity(50, 50, 50);
light.setPosition(new SimpleVector(0, 0, -10));
Camera cam = world.getCamera();
cam.moveCamera(Camera.CAMERA_MOVEOUT, 3);
cam.lookAt(objects[selectedObject].getTransformedCenter());
Object3D sp=Primitives.getSphere(2);
sp.translate(-2, 0, 0);
world.addObject(sp);
world.setAmbientLight(100, 100, 100);
world.compileAllObjects();
renderTarget = new NPOTTexture(fb.getWidth(), fb.getHeight(), null);
tm.addTexture("renderTarget", renderTarget);
renderTarget2 = new NPOTTexture(fb.getWidth(), fb.getHeight(), null);
tm.addTexture("renderTarget2", renderTarget2);
DepthBuffer depthBuffer = new DepthBuffer(fb.getWidth(), fb.getHeight());
renderTarget.setDepthBuffer(depthBuffer);
renderTarget2.setDepthBuffer(depthBuffer);
secWorld = new World();
Object3D sp2=Primitives.getSphere(2);
sp2.translate(2, 0, 0);
secWorld.addObject(sp2);
Object3D plane = Primitives.getPlane(1, 2f);
plane.setAdditionalColor(RGBColor.BLUE);
plane.rotateX(0.5f);
plane.build();
secWorld.addObject(plane);
secWorld.getCamera().moveCamera(Camera.CAMERA_MOVEOUT, 3);
if (master == null) {
Logger.log("Saving master Activity!");
master = ShaderTest.this;
}
}
}
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
Logger.log("onSurfaceCreated");
}
public void loadObjects() {
world.removeAllObjects();
objects = new Object3D[1];
objects[0] = Loader.loadOBJ(res.openRawResource(R.raw.box_o), res.openRawResource(R.raw.box_m), 1.5f)[0];
/*
objects[1] = Loader.loadOBJ(res.openRawResource(R.raw.plane_o), res.openRawResource(R.raw.plane_m), 2)[0];
objects[2] = Loader.loadOBJ(res.openRawResource(R.raw.teapot_o), res.openRawResource(R.raw.teapot_m), 2)[0];
objects[3] = Loader.loadOBJ(res.openRawResource(R.raw.airplane_o), res.openRawResource(R.raw.airplane_m), 0.013f)[0];
objects[4] = Loader.loadOBJ(res.openRawResource(R.raw.car_o), res.openRawResource(R.raw.car_m), 0.02f)[0];
objects[5] = Loader.loadOBJ(res.openRawResource(R.raw.car2_o), res.openRawResource(R.raw.car2_m), 0.03f)[0];
*/
for (Object3D object : objects)
object.setShader(pointLightShader);
showObjectIndex(selectedObject);
world.addObjects(objects);
}
public void showObjectIndex(int index) {
for (int i = 0; i < objects.length; i++)
if (i != index)
objects[i].setVisibility(false);
else
objects[i].setVisibility(true);
}
public void onDrawFrame(GL10 gl) {
if (touchTurn != 0) {
objects[selectedObject].rotateY(touchTurn);
touchTurn = 0;
}
if (touchTurnUp != 0) {
objects[selectedObject].rotateX(touchTurnUp);
touchTurnUp = 0;
}
fb.setRenderTarget(renderTarget);
fb.clear(RGBColor.RED);
world.renderScene(fb);
world.draw(fb);
fb.display();
fb.removeRenderTarget();
fb.setRenderTarget(renderTarget2);
fb.blit(renderTarget, 0, 0, 0, 0, fb.getWidth(), fb.getHeight(), FrameBuffer.OPAQUE_BLITTING);
secWorld.renderScene(fb);
secWorld.draw(fb);
fb.display();
fb.removeRenderTarget();
fb.blit(renderTarget2, 0, 0, 0, 0, fb.getWidth(), fb.getHeight(), FrameBuffer.OPAQUE_BLITTING);
blitNumber(lfps, 5, 5);
fb.display();
if (System.currentTimeMillis() - time >= 1000) {
lfps = fps;
fps = 0;
time = System.currentTimeMillis();
}
fps++;
}
private void blitNumber(float number, int x, int y) {
if (font != null) {
String sNum = Float.toString(number);
for (int i = 0; i < sNum.length(); i++) {
char cNum = sNum.charAt(i);
int iNum = cNum - 48;
fb.blit(font, iNum * 5, 0, x, y, 5, 9, 5, 9, 10, true, null);
x += 5;
}
}
}
}
}