diff --git a/engine/src/android/com/jme3/app/AndroidHarness.java b/engine/src/android/com/jme3/app/AndroidHarness.java index 3071cedf6..67af93b60 100644 --- a/engine/src/android/com/jme3/app/AndroidHarness.java +++ b/engine/src/android/com/jme3/app/AndroidHarness.java @@ -18,8 +18,9 @@ import com.jme3.system.android.OGLESContext; /** - * + * AndroidHarness wraps a jme application object and runs it on Android * @author Kirill + * @author larynx */ public class AndroidHarness extends Activity implements DialogInterface.OnClickListener { @@ -30,6 +31,8 @@ public class AndroidHarness extends Activity implements DialogInterface.OnClickL protected String appClass = "jme3test.android.Test"; protected Application app = null; + + protected boolean debug = false; @Override public void onCreate(Bundle savedInstanceState) @@ -57,31 +60,60 @@ public class AndroidHarness extends Activity implements DialogInterface.OnClickL } app.setSettings(settings); - app.start(); - + app.start(); ctx = (OGLESContext) app.getContext(); - view = ctx.createView(input); + if (debug) + { + view = ctx.createView(input, GLSurfaceView.DEBUG_CHECK_GL_ERROR | GLSurfaceView.DEBUG_LOG_GL_CALLS); + } + else + { + view = ctx.createView(input); + } setContentView(view); } + + @Override + protected void onRestart(){ + super.onRestart(); + app.restart(); + logger.info("onRestart"); + } + + + @Override + protected void onStart(){ + super.onStart(); + logger.info("onStart"); + } + @Override protected void onResume() { super.onResume(); view.onResume(); + logger.info("onResume"); } @Override protected void onPause() { super.onPause(); view.onPause(); + logger.info("onPause"); + } + + @Override + protected void onStop(){ + super.onStop(); + logger.info("onStop"); } -// @Override -// protected void onDestroy(){ -// super.onDestroy(); - -// Debug.stopMethodTracing(); -// } + @Override + protected void onDestroy(){ + super.onDestroy(); + app.stop(); + logger.info("onDestroy"); + } /** @@ -100,8 +132,13 @@ public class AndroidHarness extends Activity implements DialogInterface.OnClickL { s += ste.getClassName() + "." + ste.getMethodName() + "(" + + ste.getLineNumber() + ") "; } - } + } + final String sTrace = s; + + logger.severe(t != null ? t.toString() : "Failed"); + logger.severe((errorMsg != null ? errorMsg + ": " : "") + sTrace); + this.runOnUiThread(new Runnable() { @Override public void run() diff --git a/engine/src/android/com/jme3/renderer/android/OGLESRenderer.java b/engine/src/android/com/jme3/renderer/android/OGLESRenderer.java index 7d7244a8b..47d9cedd1 100644 --- a/engine/src/android/com/jme3/renderer/android/OGLESRenderer.java +++ b/engine/src/android/com/jme3/renderer/android/OGLESRenderer.java @@ -988,4 +988,22 @@ public final class OGLESRenderer implements Renderer { } } + @Override + public void invalidateState() { + // TODO Auto-generated method stub + + } + + @Override + public void deleteImage(Image image) { + // TODO Auto-generated method stub + + } + + @Override + public void setAlphaToCoverage(boolean value) { + // TODO Auto-generated method stub + + } + } diff --git a/engine/src/android/com/jme3/renderer/android/OGLESShaderRenderer.java b/engine/src/android/com/jme3/renderer/android/OGLESShaderRenderer.java index 4c30650e5..95cca4b3b 100644 --- a/engine/src/android/com/jme3/renderer/android/OGLESShaderRenderer.java +++ b/engine/src/android/com/jme3/renderer/android/OGLESShaderRenderer.java @@ -32,6 +32,7 @@ package com.jme3.renderer.android; +import com.jme3.asset.TextureKey; import com.jme3.light.LightList; import com.jme3.material.RenderState; import com.jme3.math.ColorRGBA; @@ -57,6 +58,7 @@ import com.jme3.shader.Shader; import com.jme3.shader.Shader.ShaderSource; import com.jme3.shader.Shader.ShaderType; import com.jme3.shader.Uniform; +import com.jme3.system.JmeSystem; import com.jme3.texture.FrameBuffer; import com.jme3.texture.FrameBuffer.RenderBuffer; import com.jme3.texture.Image; @@ -77,6 +79,8 @@ import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.microedition.khronos.opengles.GL10; + +import android.graphics.Bitmap; import android.opengl.GLES10; import android.opengl.GLES11; import android.opengl.GLES20; @@ -407,7 +411,11 @@ public class OGLESShaderRenderer implements Renderer { logger.log(Level.INFO, "Caps: " + caps); } - public void resetGLObjects(){ + /** + * resetGLObjects should be called when die GLView gets recreated to reset all GPU objects + */ + public void resetGLObjects() + { objManager.resetObjects(); statistics.clearMemory(); boundShader = null; @@ -1853,18 +1861,29 @@ public class OGLESShaderRenderer implements Renderer { img.clearUpdateNeeded(); } - public void setTexture(int unit, Texture tex){ + public void setTexture(int unit, Texture tex) + { Image image = tex.getImage(); - if (image.isUpdateNeeded()){ + if (image.isUpdateNeeded()) + { + Bitmap bmp = (Bitmap)image.getEfficentData(); + // Check if the bitmap got recycled, can happen after wakeup/restart + if ( bmp.isRecycled() ) + { + // We need to reload the bitmap + Texture textureReloaded = JmeSystem.newAssetManager().loadTexture((TextureKey)tex.getKey()); + image.setEfficentData( textureReloaded.getImage().getEfficentData()); + } updateTexImageData(image, tex.getType(), tex.getMinFilter().usesMipMapLevels()); } int texId = image.getId(); assert texId != -1; - if (texId == -1) { - logger.warning("error: texture image has -1 id"); - } + if (texId == -1) + { + logger.warning("error: texture image has -1 id"); + } Image[] textures = context.boundTextures; @@ -1877,22 +1896,26 @@ public class OGLESShaderRenderer implements Renderer { // glEnable(type); } - if (textures[unit] != image){ - if (context.boundTextureUnit != unit){ - if (verboseLogging) - logger.info("GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + " + unit + ")"); - GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + unit); - context.boundTextureUnit = unit; + if (textures[unit] != image) + { + if (context.boundTextureUnit != unit) + { + if (verboseLogging) + logger.info("GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + " + unit + ")"); + GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + unit); + context.boundTextureUnit = unit; } - if (verboseLogging) - logger.info("GLES20.glBindTexture(" + type + ", " + texId + ")"); + if (verboseLogging) + logger.info("GLES20.glBindTexture(" + type + ", " + texId + ")"); GLES20.glBindTexture(type, texId); textures[unit] = image; statistics.onTextureUse(tex.getImage(), true); - }else{ + } + else + { statistics.onTextureUse(tex.getImage(), false); } diff --git a/engine/src/android/com/jme3/system/android/OGLESContext.java b/engine/src/android/com/jme3/system/android/OGLESContext.java index 3b569067c..069300148 100644 --- a/engine/src/android/com/jme3/system/android/OGLESContext.java +++ b/engine/src/android/com/jme3/system/android/OGLESContext.java @@ -90,13 +90,32 @@ public class OGLESContext implements JmeContext, GLSurfaceView.Renderer return Type.Display; } + /** + * createView + * @param activity The Android activity which is parent for the GLSurfaceView + * @return GLSurfaceView The newly created view + */ public GLSurfaceView createView(Activity activity) { return createView(new AndroidInput(activity)); } - - + /** + * createView + * @param AndroidInput The Android input which must be bound to an activity + * @return GLSurfaceView The newly created view + */ public GLSurfaceView createView(AndroidInput view) + { + return createView(view, 0); + } + + /** + * createView + * @param AndroidInput The Android input which must be bound to an activity + * @param debugflags 0, GLSurfaceView.DEBUG_CHECK_GL_ERROR | GLSurfaceView.DEBUG_LOG_GL_CALLS + * @return GLSurfaceView The newly created view + */ + public GLSurfaceView createView(AndroidInput view, int debugflags) { this.view = view; @@ -112,11 +131,9 @@ public class OGLESContext implements JmeContext, GLSurfaceView.Renderer view.setFocusableInTouchMode(true); view.setFocusable(true); view.getHolder().setType(SurfaceHolder.SURFACE_TYPE_GPU); -// view.setDebugFlags(GLSurfaceView.DEBUG_CHECK_GL_ERROR); -// | GLSurfaceView.DEBUG_LOG_GL_CALLS); + view.setDebugFlags(debugflags); view.setRenderer(this); return view; - } @@ -253,9 +270,16 @@ public class OGLESContext implements JmeContext, GLSurfaceView.Renderer @Override public void onSurfaceCreated(GL10 gl, EGLConfig cfg) { - logger.info("GL Surface created"); - initInThread(); - renderable.set(true); + if (created.get() && renderer != null) + { + renderer.resetGLObjects(); + } + else + { + logger.info("GL Surface created"); + initInThread(); + renderable.set(true); + } } // SystemListener:reshape