Refactor Android system

* Minor clean in context creation
 * Remove AndroidGLSurfaceView (it wasn't doing anything)
 * Delete AndroidTimer. Now android will be using NanoTimer
experimental
shadowislord 10 years ago
parent 26d8ae8942
commit 18b9ef5540
  1. 4
      jme3-android/src/main/java/com/jme3/app/AndroidHarness.java
  2. 6
      jme3-android/src/main/java/com/jme3/input/android/AndroidInputHandler.java
  3. 26
      jme3-android/src/main/java/com/jme3/renderer/android/AndroidGLSurfaceView.java
  4. 96
      jme3-android/src/main/java/com/jme3/system/android/AndroidTimer.java
  5. 53
      jme3-android/src/main/java/com/jme3/system/android/OGLESContext.java

@ -6,6 +6,7 @@ import android.content.DialogInterface;
import android.content.pm.ActivityInfo; import android.content.pm.ActivityInfo;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.graphics.drawable.NinePatchDrawable; import android.graphics.drawable.NinePatchDrawable;
import android.opengl.GLSurfaceView;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log; import android.util.Log;
import android.view.*; import android.view.*;
@ -21,7 +22,6 @@ import com.jme3.input.android.AndroidSensorJoyInput;
import com.jme3.input.controls.TouchListener; import com.jme3.input.controls.TouchListener;
import com.jme3.input.controls.TouchTrigger; import com.jme3.input.controls.TouchTrigger;
import com.jme3.input.event.TouchEvent; import com.jme3.input.event.TouchEvent;
import com.jme3.renderer.android.AndroidGLSurfaceView;
import com.jme3.system.AppSettings; import com.jme3.system.AppSettings;
import com.jme3.system.SystemListener; import com.jme3.system.SystemListener;
import com.jme3.system.android.AndroidConfigChooser.ConfigType; import com.jme3.system.android.AndroidConfigChooser.ConfigType;
@ -195,7 +195,7 @@ public class AndroidHarness extends Activity implements TouchListener, DialogInt
*/ */
protected int screenOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR; protected int screenOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR;
protected OGLESContext ctx; protected OGLESContext ctx;
protected AndroidGLSurfaceView view = null; protected GLSurfaceView view = null;
protected boolean isGLThreadPaused = true; protected boolean isGLThreadPaused = true;
protected ImageView splashImageView = null; protected ImageView splashImageView = null;
protected FrameLayout frameLayout = null; protected FrameLayout frameLayout = null;

@ -32,6 +32,7 @@
package com.jme3.input.android; package com.jme3.input.android;
import android.opengl.GLSurfaceView;
import android.os.Build; import android.os.Build;
import android.view.View; import android.view.View;
import com.jme3.input.RawInputListener; import com.jme3.input.RawInputListener;
@ -41,7 +42,6 @@ import com.jme3.input.event.KeyInputEvent;
import com.jme3.input.event.MouseButtonEvent; import com.jme3.input.event.MouseButtonEvent;
import com.jme3.input.event.MouseMotionEvent; import com.jme3.input.event.MouseMotionEvent;
import com.jme3.input.event.TouchEvent; import com.jme3.input.event.TouchEvent;
import com.jme3.renderer.android.AndroidGLSurfaceView;
import com.jme3.system.AppSettings; import com.jme3.system.AppSettings;
import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.logging.Level; import java.util.logging.Level;
@ -67,7 +67,7 @@ public class AndroidInputHandler implements TouchInput {
// Internal // Internal
private AndroidGLSurfaceView view; private GLSurfaceView view;
private AndroidTouchHandler touchHandler; private AndroidTouchHandler touchHandler;
private AndroidKeyHandler keyHandler; private AndroidKeyHandler keyHandler;
private AndroidGestureHandler gestureHandler; private AndroidGestureHandler gestureHandler;
@ -112,7 +112,7 @@ public class AndroidInputHandler implements TouchInput {
if (gestureHandler != null) { if (gestureHandler != null) {
gestureHandler.setView(view); gestureHandler.setView(view);
} }
this.view = (AndroidGLSurfaceView)view; this.view = (GLSurfaceView)view;
} }
public View getView() { public View getView() {

@ -1,26 +0,0 @@
package com.jme3.renderer.android;
import android.content.Context;
import android.opengl.GLSurfaceView;
import android.util.AttributeSet;
import java.util.logging.Logger;
/**
* <code>AndroidGLSurfaceView</code> is derived from GLSurfaceView
* @author iwgeric
*
*/
public class AndroidGLSurfaceView extends GLSurfaceView {
private final static Logger logger = Logger.getLogger(AndroidGLSurfaceView.class.getName());
public AndroidGLSurfaceView(Context ctx, AttributeSet attribs) {
super(ctx, attribs);
}
public AndroidGLSurfaceView(Context ctx) {
super(ctx);
}
}

@ -1,96 +0,0 @@
/*
* Copyright (c) 2009-2012 jMonkeyEngine
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package com.jme3.system.android;
import com.jme3.system.Timer;
/**
* <code>AndroidTimer</code> is a System.nanoTime implementation of <code>Timer</code>.
*/
public class AndroidTimer extends Timer {
//private static final long TIMER_RESOLUTION = 1000L;
//private static final float INVERSE_TIMER_RESOLUTION = 1f/1000L;
private static final long TIMER_RESOLUTION = 1000000000L;
private static final float INVERSE_TIMER_RESOLUTION = 1f/1000000000L;
private long startTime;
private long previousTime;
private float tpf;
private float fps;
public AndroidTimer() {
//startTime = System.currentTimeMillis();
startTime = System.nanoTime();
}
/**
* Returns the time in seconds. The timer starts
* at 0.0 seconds.
*
* @return the current time in seconds
*/
@Override
public float getTimeInSeconds() {
return getTime() * INVERSE_TIMER_RESOLUTION;
}
public long getTime() {
//return System.currentTimeMillis() - startTime;
return System.nanoTime() - startTime;
}
public long getResolution() {
return TIMER_RESOLUTION;
}
public float getFrameRate() {
return fps;
}
public float getTimePerFrame() {
return tpf;
}
public void update() {
tpf = (getTime() - previousTime) * (1.0f / TIMER_RESOLUTION);
fps = 1.0f / tpf;
previousTime = getTime();
}
public void reset() {
//startTime = System.currentTimeMillis();
startTime = System.nanoTime();
previousTime = getTime();
}
}

@ -47,13 +47,11 @@ import android.view.ViewGroup.LayoutParams;
import android.widget.EditText; import android.widget.EditText;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import com.jme3.input.*; import com.jme3.input.*;
import com.jme3.input.android.AndroidInput;
import com.jme3.input.android.AndroidSensorJoyInput; import com.jme3.input.android.AndroidSensorJoyInput;
import com.jme3.input.android.AndroidInputHandler; import com.jme3.input.android.AndroidInputHandler;
import com.jme3.input.controls.SoftTextDialogInputListener; import com.jme3.input.controls.SoftTextDialogInputListener;
import com.jme3.input.dummy.DummyKeyInput; import com.jme3.input.dummy.DummyKeyInput;
import com.jme3.input.dummy.DummyMouseInput; import com.jme3.input.dummy.DummyMouseInput;
import com.jme3.renderer.android.AndroidGLSurfaceView;
import com.jme3.renderer.android.OGLESShaderRenderer; import com.jme3.renderer.android.OGLESShaderRenderer;
import com.jme3.system.*; import com.jme3.system.*;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
@ -80,11 +78,6 @@ public class OGLESContext implements JmeContext, GLSurfaceView.Renderer, SoftTex
protected AndroidInputHandler androidInput; protected AndroidInputHandler androidInput;
protected int minFrameDuration = 0; // No FPS cap protected int minFrameDuration = 0; // No FPS cap
protected JoyInput androidSensorJoyInput = null; protected JoyInput androidSensorJoyInput = null;
/**
* EGL_RENDERABLE_TYPE: EGL_OPENGL_ES_BIT = OpenGL ES 1.0 |
* EGL_OPENGL_ES2_BIT = OpenGL ES 2.0
*/
protected int clientOpenGLESVersion = 1;
public OGLESContext() { public OGLESContext() {
} }
@ -103,12 +96,17 @@ public class OGLESContext implements JmeContext, GLSurfaceView.Renderer, SoftTex
* *
* @return GLSurfaceView The newly created view * @return GLSurfaceView The newly created view
*/ */
public AndroidGLSurfaceView createView() { public GLSurfaceView createView() {
AndroidGLSurfaceView view; Context appContext = JmeAndroidSystem.getActivity().getApplication();
int buildVersion = Build.VERSION.SDK_INT;
ActivityManager am = (ActivityManager) appContext.getSystemService(Context.ACTIVITY_SERVICE);
ConfigurationInfo info = am.getDeviceConfigurationInfo();
if (info.reqGlEsVersion < 0x20000) {
throw new UnsupportedOperationException("OpenGL ES 2.0 is not supported on this device");
}
// Start to set up the view // Start to set up the view
view = new AndroidGLSurfaceView(JmeAndroidSystem.getActivity().getApplication()); GLSurfaceView view = new GLSurfaceView(appContext);
if (androidInput == null) { if (androidInput == null) {
androidInput = new AndroidInputHandler(); androidInput = new AndroidInputHandler();
} }
@ -117,20 +115,11 @@ public class OGLESContext implements JmeContext, GLSurfaceView.Renderer, SoftTex
// setEGLContextClientVersion must be set before calling setRenderer // setEGLContextClientVersion must be set before calling setRenderer
// this means it cannot be set in AndroidConfigChooser (too late) // this means it cannot be set in AndroidConfigChooser (too late)
int rawOpenGLESVersion = getOpenGLESVersion(); view.setEGLContextClientVersion(2);
// logger.log(Level.FINE, "clientOpenGLESVersion {0}.{1}",
// new Object[]{clientOpenGLESVersion>>16, clientOpenGLESVersion<<16});
if (rawOpenGLESVersion < 0x20000) {
throw new UnsupportedOperationException("OpenGL ES 2.0 is not supported on this device");
} else {
clientOpenGLESVersion = 2;
view.setEGLContextClientVersion(clientOpenGLESVersion);
}
view.setFocusableInTouchMode(true); view.setFocusableInTouchMode(true);
view.setFocusable(true); view.setFocusable(true);
view.getHolder().setType(SurfaceHolder.SURFACE_TYPE_GPU);
// setFormat must be set before AndroidConfigChooser is called by the surfaceview. // setFormat must be set before AndroidConfigChooser is called by the surfaceview.
// if setFormat is called after ConfigChooser is called, then execution // if setFormat is called after ConfigChooser is called, then execution
// stops at the setFormat call without a crash. // stops at the setFormat call without a crash.
@ -160,25 +149,13 @@ public class OGLESContext implements JmeContext, GLSurfaceView.Renderer, SoftTex
// Not destroying and recreating the EGL context // Not destroying and recreating the EGL context
// will help with resume time by reusing the existing context to avoid // will help with resume time by reusing the existing context to avoid
// reloading all the OpenGL objects. // reloading all the OpenGL objects.
if (buildVersion >= 11) { if (Build.VERSION.SDK_INT >= 11) {
view.setPreserveEGLContextOnPause(true); view.setPreserveEGLContextOnPause(true);
} }
return view; return view;
} }
/**
* Get the OpenGL ES version
* @return version returns the int value of the GLES version
*/
public int getOpenGLESVersion() {
ActivityManager am =
(ActivityManager) JmeAndroidSystem.getActivity().getApplication().getSystemService(Context.ACTIVITY_SERVICE);
ConfigurationInfo info = am.getDeviceConfigurationInfo();
logger.log(Level.FINE, "OpenGL Version {0}:", info.getGlEsVersion());
return info.reqGlEsVersion;
// return (info.reqGlEsVersion >= 0x20000);
}
// renderer:initialize // renderer:initialize
@Override @Override
public void onSurfaceCreated(GL10 gl, EGLConfig cfg) { public void onSurfaceCreated(GL10 gl, EGLConfig cfg) {
@ -207,7 +184,7 @@ public class OGLESContext implements JmeContext, GLSurfaceView.Renderer, SoftTex
} }
}); });
timer = new AndroidTimer(); timer = new NanoTimer();
renderer = new OGLESShaderRenderer(); renderer = new OGLESShaderRenderer();
renderer.initialize(); renderer.initialize();

Loading…
Cancel
Save