diff --git a/engine/src/android/com/jme3/app/AndroidHarness.java b/engine/src/android/com/jme3/app/AndroidHarness.java index 72e693d3f..d4f0cd33d 100644 --- a/engine/src/android/com/jme3/app/AndroidHarness.java +++ b/engine/src/android/com/jme3/app/AndroidHarness.java @@ -1,6 +1,7 @@ package com.jme3.app; import java.util.logging.Handler; +import java.util.logging.Level; import java.util.logging.Logger; import java.util.logging.SimpleFormatter; import com.jme3.util.JmeFormatter; @@ -28,41 +29,35 @@ import com.jme3.system.JmeSystem; import com.jme3.system.android.OGLESContext; import com.jme3.system.android.AndroidConfigChooser.ConfigType; - /** * AndroidHarness wraps a jme application object and runs it on Android * @author Kirill * @author larynx */ -public class AndroidHarness extends Activity implements TouchListener, DialogInterface.OnClickListener -{ +public class AndroidHarness extends Activity implements TouchListener, DialogInterface.OnClickListener { + protected final static Logger logger = Logger.getLogger(AndroidHarness.class.getName()); - /** * The application class to start */ protected String appClass = "jme3test.android.Test"; - /** * The jme3 application object */ protected Application app = null; - /** * ConfigType.FASTEST is RGB565, GLSurfaceView default * ConfigType.BEST is RGBA8888 or better if supported by the hardware */ protected ConfigType eglConfigType = ConfigType.FASTEST; - /** * If true all valid and not valid egl configs are logged */ protected boolean eglConfigVerboseLogging = false; - /** * If true MouseEvents are generated from TouchEvents */ - protected boolean mouseEventsEnabled = true; + protected boolean mouseEventsEnabled = true; /** * Flip X axis */ @@ -71,7 +66,6 @@ public class AndroidHarness extends Activity implements TouchListener, DialogInt * Flip Y axis */ protected boolean mouseEventsInvertY = true; - /** * Title of the exit dialog, default is "Do you want to exit?" */ @@ -80,7 +74,6 @@ public class AndroidHarness extends Activity implements TouchListener, DialogInt * Message of the exit dialog, default is "Use your home key to bring this app into the background or exit to terminate it." */ protected String exitDialogMessage = "Use your home key to bring this app into the background or exit to terminate it."; - /** * Set the screen orientation, default is SENSOR * ActivityInfo.SCREEN_ORIENTATION_* constants @@ -95,31 +88,27 @@ public class AndroidHarness extends Activity implements TouchListener, DialogInt * SCREEN_ORIENTATION_NOSENSOR */ protected int screenOrientation = ActivityInfo.SCREEN_ORIENTATION_SENSOR; - protected OGLESContext ctx; protected GLSurfaceView view = null; protected boolean isGLThreadPaused = true; - final private String ESCAPE_EVENT = "TouchEscape"; + final private String ESCAPE_EVENT = "TouchEscape"; @Override - public void onCreate(Bundle savedInstanceState) - { + public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - + Logger log = logger; boolean bIsLogFormatSet = false; - do - { - if (log.getHandlers().length == 0) - { + do { + if (log.getHandlers().length == 0) { log = logger.getParent(); - if (log != null) - for (Handler h : log.getHandlers()) - { + if (log != null) { + for (Handler h : log.getHandlers()) { //h.setFormatter(new SimpleFormatter()); h.setFormatter(new JmeFormatter()); bIsLogFormatSet = true; } + } } } while (log != null && !bIsLogFormatSet); @@ -128,201 +117,172 @@ public class AndroidHarness extends Activity implements TouchListener, DialogInt requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, - WindowManager.LayoutParams.FLAG_FULLSCREEN); - + WindowManager.LayoutParams.FLAG_FULLSCREEN); + setRequestedOrientation(screenOrientation); - + // Create Settings AppSettings settings = new AppSettings(true); - + // Create the input class - AndroidInput input = new AndroidInput(this); + AndroidInput input = new AndroidInput(this); input.setMouseEventsInvertX(mouseEventsInvertX); input.setMouseEventsInvertY(mouseEventsInvertY); input.setMouseEventsEnabled(mouseEventsEnabled); - + // Create application instance - try - { - if (app == null) - { + try { + if (app == null) { @SuppressWarnings("unchecked") Class clazz = (Class) Class.forName(appClass); app = clazz.newInstance(); } - + app.setSettings(settings); - app.start(); + app.start(); ctx = (OGLESContext) app.getContext(); view = ctx.createView(input, eglConfigType, eglConfigVerboseLogging); - setContentView(view); - + setContentView(view); + // Set the screen reolution WindowManager wind = this.getWindowManager(); Display disp = wind.getDefaultDisplay(); ctx.getSettings().setResolution(disp.getWidth(), disp.getHeight()); - - AppSettings s = ctx.getSettings(); - logger.info("Settings: Width " + s.getWidth() + " Height " + s.getHeight()); - - - } - catch (Exception ex) - { + + AppSettings s = ctx.getSettings(); + logger.log(Level.INFO, "Settings: Width {0} Height {1}", new Object[]{s.getWidth(), s.getHeight()}); + } catch (Exception ex) { handleError("Class " + appClass + " init failed", ex); setContentView(new TextView(this)); } - } - @Override - protected void onRestart() - { - super.onRestart(); - if (app != null) + protected void onRestart() { + super.onRestart(); + if (app != null) { app.restart(); + } logger.info("onRestart"); } - @Override - protected void onStart() - { + protected void onStart() { super.onStart(); logger.info("onStart"); } - + @Override - protected void onResume() - { + protected void onResume() { super.onResume(); - if (view != null) + if (view != null) { view.onResume(); + } isGLThreadPaused = false; logger.info("onResume"); } @Override - protected void onPause() - { + protected void onPause() { super.onPause(); - if (view != null) + if (view != null) { view.onPause(); + } isGLThreadPaused = true; logger.info("onPause"); } - + @Override - protected void onStop() - { + protected void onStop() { super.onStop(); logger.info("onStop"); } @Override - protected void onDestroy() - { - if (app != null) - app.stop(! isGLThreadPaused); - super.onDestroy(); + protected void onDestroy() { + if (app != null) { + app.stop(!isGLThreadPaused); + } + super.onDestroy(); logger.info("onDestroy"); } - public Application getJmeApplication() - { + public Application getJmeApplication() { return app; } - + /** * Called when an error has occured. This is typically - * invoked when an uncought exception is thrown in the render thread. + * invoked when an uncaught exception is thrown in the render thread. * @param errorMsg The error message, if any, or null. * @param t Throwable object, or null. */ - public void handleError(final String errorMsg, final Throwable t) - { - - String s = ""; - if (t != null && t.getStackTrace() != null) - { - for (StackTraceElement ste: t.getStackTrace()) - { - s += ste.getClassName() + "." + ste.getMethodName() + "(" + + ste.getLineNumber() + ") "; + public void handleError(final String errorMsg, final Throwable t) { + String sTrace = ""; + if (t != null && t.getStackTrace() != null) { + for (StackTraceElement ste : t.getStackTrace()) { + sTrace += "\tat " + ste.getClassName() + "." + ste.getMethodName() + "("; + if (ste.isNativeMethod()){ + sTrace += "Native"; + }else{ + sTrace += ste.getLineNumber(); + } + sTrace += ")\n"; } - } - - final String sTrace = s; - - logger.severe(t != null ? t.toString() : "OpenGL Exception"); - logger.severe((errorMsg != null ? errorMsg + ": " : "") + sTrace); - + } + + final String stackTrace = sTrace; + + logger.log(Level.SEVERE, t != null ? t.toString() : "OpenGL Exception"); + logger.log(Level.SEVERE, "{0}{1}", new Object[]{errorMsg != null ? errorMsg + ": " : "", stackTrace}); + this.runOnUiThread(new Runnable() { @Override - public void run() - { - AlertDialog dialog = new AlertDialog.Builder(AndroidHarness.this) - // .setIcon(R.drawable.alert_dialog_icon) - .setTitle(t != null ? (t.getMessage() != null ? (t.getMessage() + ": " + t.getClass().getName()) : t.getClass().getName()) : "OpenGL Exception") - .setPositiveButton("Kill", AndroidHarness.this) - .setMessage((errorMsg != null ? errorMsg + ": " : "") + sTrace) - .create(); - dialog.show(); + public void run() { + AlertDialog dialog = new AlertDialog.Builder(AndroidHarness.this) // .setIcon(R.drawable.alert_dialog_icon) + .setTitle(t != null ? (t.getMessage() != null ? (t.getMessage() + ": " + t.getClass().getName()) : t.getClass().getName()) : "OpenGL Exception").setPositiveButton("Kill", AndroidHarness.this).setMessage((errorMsg != null ? errorMsg + ": " : "") + stackTrace).create(); + dialog.show(); } }); - + } - + /** * Called by the android alert dialog, terminate the activity and OpenGL rendering * @param dialog * @param whichButton */ - public void onClick(DialogInterface dialog, int whichButton) - { - if (whichButton != -2) - { - if (app != null) + public void onClick(DialogInterface dialog, int whichButton) { + if (whichButton != -2) { + if (app != null) { app.stop(true); + } this.finish(); } } - + /** * Gets called by the InputManager on all touch/drag/scale events - */ - @Override - public void onTouch(String name, TouchEvent evt, float tpf) - { - if (name.equals(ESCAPE_EVENT)) - { - switch(evt.getType()) - { + */ + @Override + public void onTouch(String name, TouchEvent evt, float tpf) { + if (name.equals(ESCAPE_EVENT)) { + switch (evt.getType()) { case KEY_UP: - this.runOnUiThread(new Runnable() - { + this.runOnUiThread(new Runnable() { @Override - public void run() - { - AlertDialog dialog = new AlertDialog.Builder(AndroidHarness.this) - // .setIcon(R.drawable.alert_dialog_icon) - .setTitle(exitDialogTitle) - .setPositiveButton("Yes", AndroidHarness.this) - .setNegativeButton("No", AndroidHarness.this) - .setMessage(exitDialogMessage) - .create(); - dialog.show(); + public void run() { + AlertDialog dialog = new AlertDialog.Builder(AndroidHarness.this) // .setIcon(R.drawable.alert_dialog_icon) + .setTitle(exitDialogTitle).setPositiveButton("Yes", AndroidHarness.this).setNegativeButton("No", AndroidHarness.this).setMessage(exitDialogMessage).create(); + dialog.show(); } }); - - + + break; + default: break; - - default: - break; } } - - } - + + } } diff --git a/engine/src/android/com/jme3/asset/AndroidAssetManager.java b/engine/src/android/com/jme3/asset/AndroidAssetManager.java index 57b7d3516..de70b24a5 100644 --- a/engine/src/android/com/jme3/asset/AndroidAssetManager.java +++ b/engine/src/android/com/jme3/asset/AndroidAssetManager.java @@ -29,7 +29,6 @@ * 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.asset; import com.jme3.texture.Texture; @@ -50,14 +49,14 @@ public class AndroidAssetManager extends DesktopAssetManager { private static final Logger logger = Logger.getLogger(AndroidAssetManager.class.getName()); - public AndroidAssetManager(){ + public AndroidAssetManager() { this(null); } @Deprecated - public AndroidAssetManager(boolean loadDefaults){ + public AndroidAssetManager(boolean loadDefaults) { //this(Thread.currentThread().getContextClassLoader().getResource("com/jme3/asset/Android.cfg")); - this(null); + this(null); } /** @@ -65,14 +64,13 @@ public class AndroidAssetManager extends DesktopAssetManager { * If URL == null then a default list of locators and loaders for android is set * @param configFile */ - public AndroidAssetManager(URL configFile) - { - - System.setProperty("org.xml.sax.driver","org.xmlpull.v1.sax2.Driver"); - - - // Set Default Android config - this.registerLocator("", AndroidLocator.class); + public AndroidAssetManager(URL configFile) { + + System.setProperty("org.xml.sax.driver", "org.xmlpull.v1.sax2.Driver"); + + + // Set Default Android config + this.registerLocator("", AndroidLocator.class); this.registerLocator("", ClasspathLocator.class); this.registerLoader(AndroidImageLoader.class, "jpg", "bmp", "gif", "png", "jpeg"); this.registerLoader(AndroidAudioLoader.class, "ogg", "mp3"); @@ -91,8 +89,8 @@ public class AndroidAssetManager extends DesktopAssetManager { this.registerLoader(com.jme3.scene.plugins.ogre.MaterialLoader.class, "material"); this.registerLoader(com.jme3.scene.plugins.ogre.SceneLoader.class, "scene"); this.registerLoader(com.jme3.shader.plugins.GLSLLoader.class, "vert", "frag", "glsl", "glsllib"); - - + + logger.info("AndroidAssetManager created."); } @@ -102,18 +100,17 @@ public class AndroidAssetManager extends DesktopAssetManager { * @return */ @Override - public Texture loadTexture(TextureKey key){ - Texture tex = (Texture) loadAsset(key); - - // Needed for Android + public Texture loadTexture(TextureKey key) { + Texture tex = (Texture) loadAsset(key); + + // Needed for Android tex.setMagFilter(Texture.MagFilter.Nearest); tex.setAnisotropicFilter(0); - if (tex.getMinFilter().usesMipMapLevels()){ + if (tex.getMinFilter().usesMipMapLevels()) { tex.setMinFilter(Texture.MinFilter.NearestNearestMipMap); - }else{ + } else { tex.setMinFilter(Texture.MinFilter.NearestNoMipMaps); } - return tex; + return tex; } - } diff --git a/engine/src/android/com/jme3/system/JmeSystem.java b/engine/src/android/com/jme3/system/JmeSystem.java index a7481e975..a173e5437 100644 --- a/engine/src/android/com/jme3/system/JmeSystem.java +++ b/engine/src/android/com/jme3/system/JmeSystem.java @@ -1,6 +1,5 @@ package com.jme3.system; - import android.app.Activity; import android.content.res.Resources; import com.jme3.util.AndroidLogHandler; @@ -24,172 +23,96 @@ import java.util.logging.Logger; import java.net.URL; - - -public class JmeSystem -{ - - public static enum Platform { - - /** - * Microsoft Windows 32 bit - */ - Windows32, - - /** - * Microsoft Windows 64 bit - */ - Windows64, - - /** - * Linux 32 bit - */ - Linux32, - - - /** - * Linux 64 bit - */ - Linux64, - - /** - * Apple Mac OS X 32 bit - */ - MacOSX32, - - /** - * Apple Mac OS X 64 bit - */ - MacOSX64, - - /** - * Apple Mac OS X 32 bit PowerPC - */ - MacOSX_PPC32, - - /** - * Apple Mac OS X 64 bit PowerPC - */ - MacOSX_PPC64, - - /** - * Android 2.2 - */ - Android_Froyo, - - /** - * Android 2.3 - */ - Android_Gingerbread, - - /** - * Android 3.0 - */ - Android_Honeycomb, - - - } +public class JmeSystem { private static final Logger logger = Logger.getLogger(JmeSystem.class.getName()); - private static boolean initialized = false; private static boolean lowPermissions = false; private static Resources res; private static Activity activity; - public static void initialize(AppSettings settings) - { - - if (initialized) + public static void initialize(AppSettings settings) { + if (initialized) { return; + } initialized = true; - try - { + try { JmeFormatter formatter = new JmeFormatter(); Handler consoleHandler = new AndroidLogHandler(); consoleHandler.setFormatter(formatter); - } - catch (SecurityException ex) - { + } catch (SecurityException ex) { logger.log(Level.SEVERE, "Security error in creating log file", ex); } - logger.info("Running on "+getFullName()); + logger.log(Level.INFO, "Running on {0}", getFullName()); } - public static String getFullName() - { - return "jMonkey Engine 3 ALPHA 0.7 Android"; + public static String getFullName() { + return "jMonkeyEngine 3.0.0 Beta (Android)"; } - - public static void setLowPermissions(boolean lowPerm) - { + + public static void setLowPermissions(boolean lowPerm) { lowPermissions = lowPerm; } - public static boolean isLowPermissions() - { + public static boolean isLowPermissions() { return lowPermissions; } - - public static JmeContext newContext(AppSettings settings, Type contextType) - { + + public static JmeContext newContext(AppSettings settings, Type contextType) { initialize(settings); return new OGLESContext(); } - public static AudioRenderer newAudioRenderer(AppSettings settings) - { - return new AndroidAudioRenderer(activity); + public static AudioRenderer newAudioRenderer(AppSettings settings) { + return new AndroidAudioRenderer(activity); } - public static void setResources(Resources res) - { + public static void setResources(Resources res) { JmeSystem.res = res; } - public static Resources getResources() - { + public static Resources getResources() { return res; } - public static void setActivity(Activity activity) - { + public static void setActivity(Activity activity) { JmeSystem.activity = activity; } - public static Activity getActivity() - { + public static Activity getActivity() { return activity; - } - + } - public static AssetManager newAssetManager() - { - logger.info("newAssetManager()"); + public static AssetManager newAssetManager() { + logger.log(Level.INFO, "newAssetManager()"); return new AndroidAssetManager(null); } - public static AssetManager newAssetManager(URL url) - { - logger.info("newAssetManager(" + url + ")"); + public static AssetManager newAssetManager(URL url) { + logger.log(Level.INFO, "newAssetManager({0})", url); return new AndroidAssetManager(url); } - public static boolean showSettingsDialog(AppSettings settings, boolean loadSettings) - { + public static boolean showSettingsDialog(AppSettings settings, boolean loadSettings) { return true; } - - public static Platform getPlatform() - { - String os = System.getProperty("os.name").toLowerCase(); - String arch = System.getProperty("os.arch").toLowerCase(); - return Platform.Android_Froyo; - // throw new UnsupportedOperationException("The specified platform: "+os+" is not supported."); - + public static Platform getPlatform() { + String arch = System.getProperty("os.arch").toLowerCase(); + if (arch.contains("arm")){ + if (arch.contains("v5")){ + return Platform.Android_ARM5; + }else if (arch.contains("v6")){ + return Platform.Android_ARM6; + }else if (arch.contains("v7")){ + return Platform.Android_ARM7; + }else{ + return Platform.Android_ARM5; // unknown ARM + } + }else{ + throw new UnsupportedOperationException("Unsupported Android Platform"); + } } - } diff --git a/engine/src/android/com/jme3/texture/plugins/AndroidImageLoader.java b/engine/src/android/com/jme3/texture/plugins/AndroidImageLoader.java index 1e7c8b518..3718ad989 100644 --- a/engine/src/android/com/jme3/texture/plugins/AndroidImageLoader.java +++ b/engine/src/android/com/jme3/texture/plugins/AndroidImageLoader.java @@ -14,37 +14,35 @@ import java.io.IOException; import java.io.InputStream; import java.nio.ByteBuffer; -public class AndroidImageLoader implements AssetLoader -{ +public class AndroidImageLoader implements AssetLoader { - public Object load2(AssetInfo info) throws IOException - { + public Object load2(AssetInfo info) throws IOException { ByteBuffer bb = BufferUtils.createByteBuffer(1 * 1 * 2); - bb.put( (byte) 0xff ).put( (byte) 0xff ); + bb.put((byte) 0xff).put((byte) 0xff); bb.clear(); return new Image(Format.RGB5A1, 1, 1, bb); } - public Object load(AssetInfo info) throws IOException - { + public Object load(AssetInfo info) throws IOException { InputStream in = null; Bitmap bitmap = null; try { in = info.openStream(); bitmap = BitmapFactory.decodeStream(in); - if (bitmap == null){ - throw new IOException("Failed to load image: "+info.getKey().getName()); + if (bitmap == null) { + throw new IOException("Failed to load image: " + info.getKey().getName()); } } finally { - if (in != null) + if (in != null) { in.close(); + } } int width = bitmap.getWidth(); int height = bitmap.getHeight(); Format fmt; - switch (bitmap.getConfig()){ + switch (bitmap.getConfig()) { case ALPHA_8: fmt = Format.Alpha8; break; @@ -54,15 +52,14 @@ public class AndroidImageLoader implements AssetLoader case ARGB_8888: fmt = Format.RGBA8; break; - case RGB_565: + case RGB_565: fmt = Format.RGB565; break; default: return null; } - if ( ((TextureKey)info.getKey()).isFlipY() ) - { + if (((TextureKey) info.getKey()).isFlipY()) { Bitmap newBitmap = null; Matrix flipMat = new Matrix(); flipMat.preScale(1.0f, -1.0f); @@ -70,14 +67,13 @@ public class AndroidImageLoader implements AssetLoader bitmap.recycle(); bitmap = newBitmap; - if (bitmap == null){ - throw new IOException("Failed to flip image: "+info.getKey().getName()); + if (bitmap == null) { + throw new IOException("Failed to flip image: " + info.getKey().getName()); } } Image image = new Image(fmt, width, height, null); - image.setEfficentData(bitmap); + image.setEfficentData(bitmap); return image; } - } diff --git a/engine/src/android/com/jme3/util/RingBuffer.java b/engine/src/android/com/jme3/util/RingBuffer.java index cd6393cc8..786417b04 100644 --- a/engine/src/android/com/jme3/util/RingBuffer.java +++ b/engine/src/android/com/jme3/util/RingBuffer.java @@ -8,33 +8,39 @@ import java.util.NoSuchElementException; */ // suppress unchecked warnings in Java 1.5.0_6 and later @SuppressWarnings("unchecked") -public class RingBuffer implements Iterable -{ +public class RingBuffer implements Iterable { + private Item[] buffer; // queue elements private int count = 0; // number of elements on queue private int indexOut = 0; // index of first element of queue - private int indexIn = 0; // index of next available slot + private int indexIn = 0; // index of next available slot // cast needed since no generic array creation in Java - public RingBuffer(int capacity) - { + public RingBuffer(int capacity) { buffer = (Item[]) new Object[capacity]; } - public boolean isEmpty() { return count == 0; } - public int size() { return count; } + public boolean isEmpty() { + return count == 0; + } - public void push(Item item) - { - if (count == buffer.length) { throw new RuntimeException("Ring buffer overflow"); } + public int size() { + return count; + } + + public void push(Item item) { + if (count == buffer.length) { + throw new RuntimeException("Ring buffer overflow"); + } buffer[indexIn] = item; indexIn = (indexIn + 1) % buffer.length; // wrap-around count++; } - public Item pop() - { - if (isEmpty()) { throw new RuntimeException("Ring buffer underflow"); } + public Item pop() { + if (isEmpty()) { + throw new RuntimeException("Ring buffer underflow"); + } Item item = buffer[indexOut]; buffer[indexOut] = null; // to help with garbage collection count--; @@ -42,22 +48,28 @@ public class RingBuffer implements Iterable return item; } - public Iterator iterator() { return new RingBufferIterator(); } + public Iterator iterator() { + return new RingBufferIterator(); + } // an iterator, doesn't implement remove() since it's optional private class RingBufferIterator implements Iterator { + private int i = 0; - public boolean hasNext() { return i < count; } - public void remove() { throw new UnsupportedOperationException(); } + + public boolean hasNext() { + return i < count; + } + + public void remove() { + throw new UnsupportedOperationException(); + } public Item next() { - if (!hasNext()) throw new NoSuchElementException(); + if (!hasNext()) { + throw new NoSuchElementException(); + } return buffer[i++]; } } - - - - } - diff --git a/engine/src/android/com/jme3/util/android/AndroidSkyFactory.java b/engine/src/android/com/jme3/util/android/AndroidSkyFactory.java index 7f11d3bd5..7898cfc4c 100644 --- a/engine/src/android/com/jme3/util/android/AndroidSkyFactory.java +++ b/engine/src/android/com/jme3/util/android/AndroidSkyFactory.java @@ -1,148 +1,39 @@ package com.jme3.util.android; -import java.util.ArrayList; -import android.graphics.Bitmap; import com.jme3.asset.AssetManager; -import com.jme3.asset.TextureKey; -import com.jme3.material.Material; import com.jme3.math.Vector3f; -import com.jme3.renderer.queue.RenderQueue.Bucket; -import com.jme3.scene.Geometry; import com.jme3.scene.Spatial; -import com.jme3.scene.shape.Sphere; -import com.jme3.texture.Image; -import com.jme3.texture.Image.Format; import com.jme3.texture.Texture; -import com.jme3.texture.TextureCubeMap; - +import com.jme3.util.SkyFactory; /** * AndroidSkyFactory creates a sky box spatial * @author larynx, derived from SkyFactory and adapted for android - * + * @deprecated Use {@link SkyFactory} instead */ -public class AndroidSkyFactory -{ - private static final Sphere sphereMesh = new Sphere(10, 10, 101f, false, true); - - public static Spatial createSky(AssetManager assetManager, Texture texture, Vector3f normalScale, boolean sphereMap) - { - Geometry sky = new Geometry("Sky", sphereMesh); - sky.setQueueBucket(Bucket.Sky); - sky.setCullHint(Spatial.CullHint.Never); - - Material skyMat = new Material(assetManager, "Common/MatDefs/Misc/Sky.j3md"); - skyMat.setVector3("NormalScale", normalScale); - if (sphereMap) - { - skyMat.setBoolean("SphereMap", sphereMap); - } - else if (!(texture instanceof TextureCubeMap)) - { - // make sure its a cubemap - Image img = texture.getImage(); - texture = new TextureCubeMap(); - texture.setImage(img); - } - skyMat.setTexture("Texture", texture); - sky.setMaterial(skyMat); - - return sky; - } - - private static void checkImage(Image image) - { - if (image.getWidth() != image.getHeight()) - throw new IllegalArgumentException("Image width and height must be the same"); - - if (image.getMultiSamples() != 1) - throw new IllegalArgumentException("Multisample textures not allowed"); - } - - private static void checkImagesForCubeMap(Image ... images) - { - if (images.length == 1) return; - - Format fmt = images[0].getFormat(); - int width = images[0].getWidth(); - int height = images[0].getHeight(); +@Deprecated +public class AndroidSkyFactory { - checkImage(images[0]); - - for (int i = 1; i < images.length; i++) - { - Image image = images[i]; - checkImage(images[i]); - if (image.getFormat() != fmt) throw new IllegalArgumentException("Images must have same format"); - if (image.getWidth() != width) throw new IllegalArgumentException("Images must have same width"); - if (image.getHeight() != height) throw new IllegalArgumentException("Images must have same height"); - } + public static Spatial createSky(AssetManager assetManager, Texture texture, Vector3f normalScale, boolean sphereMap) { + return SkyFactory.createSky(assetManager, texture, normalScale, sphereMap); } - public static Spatial createSky(AssetManager assetManager, Texture west, Texture east, Texture north, Texture south, - Texture up, Texture down, Vector3f normalScale) - { - Geometry sky = new Geometry("Sky", sphereMesh); - sky.setQueueBucket(Bucket.Sky); - sky.setCullHint(Spatial.CullHint.Never); - - Image westImg = west.getImage(); - Image eastImg = east.getImage(); - Image northImg = north.getImage(); - Image southImg = south.getImage(); - Image upImg = up.getImage(); - Image downImg = down.getImage(); - - checkImagesForCubeMap(westImg, eastImg, northImg, southImg, upImg, downImg); - - Image cubeImage = new Image(westImg.getFormat(), westImg.getWidth(), westImg.getHeight(), null); - - ArrayList arrayList = new ArrayList(6); - - arrayList.add((Bitmap)westImg.getEfficentData()); - arrayList.add((Bitmap)eastImg.getEfficentData()); - - arrayList.add((Bitmap)downImg.getEfficentData()); - arrayList.add((Bitmap)upImg.getEfficentData()); - - arrayList.add((Bitmap)southImg.getEfficentData()); - arrayList.add((Bitmap)northImg.getEfficentData()); - - cubeImage.setEfficentData(arrayList); - - TextureCubeMap cubeMap = new TextureCubeMap(cubeImage); - cubeMap.setAnisotropicFilter(0); - cubeMap.setMagFilter(Texture.MagFilter.Bilinear); - cubeMap.setMinFilter(Texture.MinFilter.BilinearNoMipMaps); - cubeMap.setWrap(Texture.WrapMode.EdgeClamp); - - - Material skyMat = new Material(assetManager, "Common/MatDefs/Misc/Sky.j3md"); - skyMat.setTexture("Texture", cubeMap); - skyMat.setVector3("NormalScale", normalScale); - sky.setMaterial(skyMat); - - return sky; + public static Spatial createSky(AssetManager assetManager, Texture west, Texture east, Texture north, Texture south, + Texture up, Texture down, Vector3f normalScale) { + return SkyFactory.createSky(assetManager, west, east, north, south, up, down, normalScale); } - public static Spatial createSky(AssetManager assetManager, Texture west, Texture east, Texture north, Texture south, - Texture up, Texture down) - { - return createSky(assetManager, west, east, north, south, up, down, Vector3f.UNIT_XYZ); + public static Spatial createSky(AssetManager assetManager, Texture west, Texture east, Texture north, Texture south, + Texture up, Texture down) { + return SkyFactory.createSky(assetManager, west, east, north, south, up, down, Vector3f.UNIT_XYZ); } - public static Spatial createSky(AssetManager assetManager, Texture texture, boolean sphereMap) - { - return createSky(assetManager, texture, Vector3f.UNIT_XYZ, sphereMap); + public static Spatial createSky(AssetManager assetManager, Texture texture, boolean sphereMap) { + return SkyFactory.createSky(assetManager, texture, Vector3f.UNIT_XYZ, sphereMap); } - public static Spatial createSky(AssetManager assetManager, String textureName, boolean sphereMap) - { - TextureKey key = new TextureKey(textureName, true); - key.setGenerateMips(true); - key.setAsCube(!sphereMap); - Texture tex = assetManager.loadTexture(key); - return createSky(assetManager, tex, sphereMap); + public static Spatial createSky(AssetManager assetManager, String textureName, boolean sphereMap) { + return SkyFactory.createSky(assetManager, textureName, sphereMap); } } \ No newline at end of file diff --git a/engine/src/android/jme3test/android/AboutActivity.java b/engine/src/android/jme3test/android/AboutActivity.java index bc1989114..5af463fe0 100644 --- a/engine/src/android/jme3test/android/AboutActivity.java +++ b/engine/src/android/jme3test/android/AboutActivity.java @@ -1,6 +1,5 @@ package jme3test.android; - import java.util.ArrayList; import java.util.List; @@ -30,43 +29,37 @@ import jme3test.android.AndroidActivity; import java.net.URI; - public class AboutActivity extends Activity { - private static final java.util.logging.Logger logger = java.util.logging.Logger.getLogger(AboutActivity.class.getName()); - + private static final java.util.logging.Logger logger = java.util.logging.Logger.getLogger(AboutActivity.class.getName()); - @Override - public void onCreate(Bundle savedInstanceState) { - logger.info("onCreate(" + savedInstanceState + ")"); + @Override + public void onCreate(Bundle savedInstanceState) { + logger.info("onCreate(" + savedInstanceState + ")"); - super.onCreate(savedInstanceState); + super.onCreate(savedInstanceState); - //setContentView(R.layout.about); - } + //setContentView(R.layout.about); + } - @Override - public void onDestroy() { - logger.info("onDestroy()"); - super.onDestroy(); - } + @Override + public void onDestroy() { + logger.info("onDestroy()"); + super.onDestroy(); + } + @Override + protected void onResume() { + super.onResume(); + } - @Override - protected void onResume() { - super.onResume(); - } - - @Override - protected void onStart() { - super.onStart(); - } - - @Override - protected void onStop() { - super.onStop(); - } - + @Override + protected void onStart() { + super.onStart(); + } + @Override + protected void onStop() { + super.onStop(); + } } - diff --git a/engine/src/android/jme3test/android/AndroidActivity.java b/engine/src/android/jme3test/android/AndroidActivity.java index 6f116f48d..b3cecd533 100644 --- a/engine/src/android/jme3test/android/AndroidActivity.java +++ b/engine/src/android/jme3test/android/AndroidActivity.java @@ -6,7 +6,6 @@ * * created: Mon Nov 8 00:08:07 EST 2010 */ - package jme3test.android; import android.app.Activity; @@ -23,136 +22,128 @@ import com.jme3.system.android.OGLESContext; import com.jme3.app.Application; import com.jme3.app.SimpleApplication; - public class AndroidActivity extends Activity { - private final static java.util.logging.Logger logger = java.util.logging.Logger.getLogger(AndroidActivity.class.getName()); + private final static java.util.logging.Logger logger = java.util.logging.Logger.getLogger(AndroidActivity.class.getName()); + private OGLESContext ctx; + private GLSurfaceView view; + private boolean useVA = false; + private boolean verboseLogging = false; + @Override + public void onCreate(Bundle savedInstanceState) { - private OGLESContext ctx; - private GLSurfaceView view; + super.onCreate(savedInstanceState); - private boolean useVA = false; - private boolean verboseLogging = false; + JmeSystem.setResources(getResources()); - @Override - public void onCreate(Bundle savedInstanceState) { + requestWindowFeature(Window.FEATURE_NO_TITLE); + getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, + WindowManager.LayoutParams.FLAG_FULLSCREEN); - super.onCreate(savedInstanceState); + AppSettings settings = new AppSettings(true); - JmeSystem.setResources(getResources()); + String testClassName = getIntent().getStringExtra(AndroidActivity.class.getName() + ".TEST_CLASS_NAME"); - requestWindowFeature(Window.FEATURE_NO_TITLE); - getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, - WindowManager.LayoutParams.FLAG_FULLSCREEN); + logger.info("test class name: [" + testClassName + "]"); - AppSettings settings = new AppSettings(true); + String appClass = (testClassName != null ? testClassName : "jme3test.android.SimpleTexturedTest"); - String testClassName = getIntent().getStringExtra(AndroidActivity.class.getName() + ".TEST_CLASS_NAME"); + useVA = getIntent().getBooleanExtra(AndroidActivity.class.getName() + ".USE_VA", false); - logger.info("test class name: [" + testClassName + "]"); + logger.info("USE_VA -> [" + useVA + "]"); - String appClass = (testClassName != null? testClassName: "jme3test.android.SimpleTexturedTest"); + settings.putBoolean("USE_VA", useVA); - useVA = getIntent().getBooleanExtra(AndroidActivity.class.getName() + ".USE_VA", false); + verboseLogging = getIntent().getBooleanExtra(AndroidActivity.class.getName() + ".VERBOSE_LOGGING", false); - logger.info("USE_VA -> [" + useVA + "]"); + settings.putBoolean("VERBOSE_LOGGING", verboseLogging); - settings.putBoolean("USE_VA", useVA); + Application app = null; - verboseLogging = getIntent().getBooleanExtra(AndroidActivity.class.getName() + ".VERBOSE_LOGGING", false); + try { + Class clazz = (Class) Class.forName( + appClass); - settings.putBoolean("VERBOSE_LOGGING", verboseLogging); + app = clazz.newInstance(); + /* + app = (Application) java.lang.reflect.Proxy.newProxyInstance( + this.getClass().getClassLoader(), + new Class[] {Class.forName(appClass)}, + + new java.lang.reflect.InvocationHandler() { + public Object invoke(Object proxy, java.lang.reflect.Method method, Object[] args) throws Throwable { + if ( + method.getName().equals("loadFPSText") || + method.getName().equals("loadStatsView") + ) { + logger.info("ignoring method: [" + method + "]"); + return null; + } + + return method.invoke(proxy, args); + } + } + ); + */ - Application app = null; - try { - Class clazz = (Class) Class.forName( - appClass - ); + if (app instanceof SimpleApplication) { + ((SimpleApplication) app).setShowSettings(false); + } - app = clazz.newInstance(); -/* - app = (Application) java.lang.reflect.Proxy.newProxyInstance( - this.getClass().getClassLoader(), - new Class[] {Class.forName(appClass)}, - - new java.lang.reflect.InvocationHandler() { - public Object invoke(Object proxy, java.lang.reflect.Method method, Object[] args) throws Throwable { - if ( - method.getName().equals("loadFPSText") || - method.getName().equals("loadStatsView") - ) { - logger.info("ignoring method: [" + method + "]"); - return null; - } - - return method.invoke(proxy, args); - } - } - ); -*/ - - - if (app instanceof SimpleApplication) { - ((SimpleApplication) app).setShowSettings(false); - } - - logger.info("setting settings ..."); - app.setSettings(settings); - logger.info("setting settings ... done."); - - logger.info("starting app ..."); - app.start(); - logger.info("starting app ... done."); - - if (app instanceof SimpleApplication) - ((SimpleApplication) app).getGuiNode().detachAllChildren(); - - logger.info("creating context ..."); - ctx = (OGLESContext) app.getContext(); - logger.info("creating context ... done."); - - ctx.setSettings(settings); - - logger.info("creating view ..."); - view = ctx.createView(this); - logger.info("creating view ... done."); - - logger.info("setting content view ..."); - setContentView(view); - logger.info("setting content done ..."); - - } catch (Throwable exception) { - logger.warning("exception: " + exception); - exception.printStackTrace(System.err); - } - } - - @Override - protected void onResume() { - logger.info("onResume ..."); - super.onResume(); - logger.info("view.onResume ..."); - - view.onResume(); - - logger.info("view.onResume ... done."); - logger.info("onResume ... done."); - } - - @Override - protected void onPause() { - super.onPause(); - view.onPause(); - } + logger.info("setting settings ..."); + app.setSettings(settings); + logger.info("setting settings ... done."); + + logger.info("starting app ..."); + app.start(); + logger.info("starting app ... done."); + + if (app instanceof SimpleApplication) { + ((SimpleApplication) app).getGuiNode().detachAllChildren(); + } + + logger.info("creating context ..."); + ctx = (OGLESContext) app.getContext(); + logger.info("creating context ... done."); + + ctx.setSettings(settings); + + logger.info("creating view ..."); + view = ctx.createView(this); + logger.info("creating view ... done."); + logger.info("setting content view ..."); + setContentView(view); + logger.info("setting content done ..."); + + } catch (Throwable exception) { + logger.warning("exception: " + exception); + exception.printStackTrace(System.err); + } + } + + @Override + protected void onResume() { + logger.info("onResume ..."); + super.onResume(); + logger.info("view.onResume ..."); + + view.onResume(); + + logger.info("view.onResume ... done."); + logger.info("onResume ... done."); + } + + @Override + protected void onPause() { + super.onPause(); + view.onPause(); + } // @Override // protected void onDestroy(){ // super.onDestroy(); - // Debug.stopMethodTracing(); // } - } - diff --git a/engine/src/android/jme3test/android/SimpleTexturedTest.java b/engine/src/android/jme3test/android/SimpleTexturedTest.java index 1413f99ee..fb0c70bbe 100644 --- a/engine/src/android/jme3test/android/SimpleTexturedTest.java +++ b/engine/src/android/jme3test/android/SimpleTexturedTest.java @@ -4,10 +4,8 @@ * * created: Mon Nov 8 00:08:22 EST 2010 */ - package jme3test.android; - import java.util.List; import java.util.ArrayList; @@ -35,101 +33,95 @@ import com.jme3.util.TangentBinormalGenerator; import jme3tools.converters.model.ModelConverter; - public class SimpleTexturedTest extends SimpleApplication { - private static final java.util.logging.Logger logger = java.util.logging.Logger.getLogger(SimpleTexturedTest.class.getName()); - - - private Node spheresContainer = new Node("spheres-container"); - - - private boolean lightingEnabled = true; - private boolean texturedEnabled = true; - private boolean spheres = true; - - @Override - public void simpleInitApp() { - - /* - * GUI rendering is broken on Android right now and prevents the main view from rendering. - * Detaching all children lets the main view to be rendered. - */ - - guiNode.detachAllChildren(); + private static final java.util.logging.Logger logger = java.util.logging.Logger.getLogger(SimpleTexturedTest.class.getName()); + private Node spheresContainer = new Node("spheres-container"); + private boolean lightingEnabled = true; + private boolean texturedEnabled = true; + private boolean spheres = true; + + @Override + public void simpleInitApp() { + + /* + * GUI rendering is broken on Android right now and prevents the main view from rendering. + * Detaching all children lets the main view to be rendered. + */ + + guiNode.detachAllChildren(); + + Mesh shape = null; + + if (spheres) { + shape = new Sphere(16, 16, .5f); + } else { + shape = new Box(Vector3f.ZERO, 0.3f, 0.3f, 0.3f); + } + + // ModelConverter.optimize(geom); + + Texture texture = assetManager.loadTexture(new TextureKey("icons/textured.png")); + + Material material = null; + + if (texturedEnabled) { + if (lightingEnabled) { + material = new Material(assetManager, "Common/MatDefs/Light/Lighting.j3md"); + material.setBoolean("VertexLighting", true); + material.setFloat("Shininess", 127); + material.setBoolean("LowQuality", true); + material.setTexture("DiffuseMap", texture); + } else { + material = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); + material.setTexture("ColorMap", texture); + } + } else { + material = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); + material.setColor("Color", ColorRGBA.Red); + } + + TangentBinormalGenerator.generate(shape); + + for (int y = -1; y < 2; y++) { + for (int x = -1; x < 2; x++) { + // int x = 0; + // int y = 0; + Geometry geomClone = new Geometry("geometry-" + y + "-" + x, shape); + geomClone.setMaterial(material); + geomClone.setLocalTranslation(x, y, 0); - Mesh shape = null; - - if (spheres) { - shape = new Sphere(16, 16, .5f); - } else { - shape = new Box(Vector3f.ZERO, 0.3f, 0.3f, 0.3f); - } - - // ModelConverter.optimize(geom); - - Texture texture = assetManager.loadTexture(new TextureKey("icons/textured.png")); - - Material material = null; - - if (texturedEnabled) { - if (lightingEnabled) { - material = new Material(assetManager, "Common/MatDefs/Light/Lighting.j3md"); - material.setBoolean("VertexLighting", true); - material.setFloat("Shininess", 127); - material.setBoolean("LowQuality", true); - material.setTexture("DiffuseMap", texture); - } else { - material = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); - material.setTexture("ColorMap", texture); - } - } else { - material = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md"); - material.setColor("Color", ColorRGBA.Red); - } - - TangentBinormalGenerator.generate(shape); - - for (int y = -1; y < 2; y++) { - for (int x = -1; x < 2; x++){ - // int x = 0; - // int y = 0; - Geometry geomClone = new Geometry("geometry-" + y + "-" + x, shape); - geomClone.setMaterial(material); - geomClone.setLocalTranslation(x, y, 0); - // Transform t = geom.getLocalTransform().clone(); // Transform t2 = geomClone.getLocalTransform().clone(); // t.combineWithParent(t2); // geomClone.setLocalTransform(t); - spheresContainer.attachChild(geomClone); - } - } + spheresContainer.attachChild(geomClone); + } + } - spheresContainer.setLocalTranslation(new Vector3f(0, 0, -4f)); - spheresContainer.setLocalScale(2.0f); + spheresContainer.setLocalTranslation(new Vector3f(0, 0, -4f)); + spheresContainer.setLocalScale(2.0f); - rootNode.attachChild(spheresContainer); + rootNode.attachChild(spheresContainer); - PointLight pointLight = new PointLight(); + PointLight pointLight = new PointLight(); - pointLight.setColor(new ColorRGBA(0.7f, 0.7f, 1.0f, 1.0f)); + pointLight.setColor(new ColorRGBA(0.7f, 0.7f, 1.0f, 1.0f)); - pointLight.setPosition(new Vector3f(0f, 0f, 0f)); - pointLight.setRadius(8); + pointLight.setPosition(new Vector3f(0f, 0f, 0f)); + pointLight.setRadius(8); - rootNode.addLight(pointLight); - } + rootNode.addLight(pointLight); + } - @Override - public void simpleUpdate(float tpf) { + @Override + public void simpleUpdate(float tpf) { - if (secondCounter == 0) - logger.info("Frames per second: " + timer.getFrameRate()); - - spheresContainer.rotate(0.2f * tpf, 0.4f * tpf, 0.8f * tpf); - } + if (secondCounter == 0) { + logger.info("Frames per second: " + timer.getFrameRate()); + } + spheresContainer.rotate(0.2f * tpf, 0.4f * tpf, 0.8f * tpf); + } } - diff --git a/engine/src/android/jme3test/android/Test.java b/engine/src/android/jme3test/android/Test.java index f2c529682..95ca78c87 100644 --- a/engine/src/android/jme3test/android/Test.java +++ b/engine/src/android/jme3test/android/Test.java @@ -15,19 +15,19 @@ public class Test extends SimpleApplication { public void simpleInitApp() { Sphere s = new Sphere(8, 8, .5f); Geometry geom = new Geometry("sphere", s); - // ModelConverter.optimize(geom); + // ModelConverter.optimize(geom); Material mat = new Material(assetManager, "plain_texture.j3md"); Texture tex = assetManager.loadTexture(new TextureKey("monkey.j3i")); mat.setTexture("ColorMap", tex); // geom.setMaterial(mat); - for (int y = -1; y < 2; y++){ - for (int x = -1; x < 2; x++){ + for (int y = -1; y < 2; y++) { + for (int x = -1; x < 2; x++) { Geometry geomClone = new Geometry("geom", s); geomClone.setMaterial(mat); geomClone.setLocalTranslation(x, y, 0); - + Transform t = geom.getLocalTransform().clone(); Transform t2 = geomClone.getLocalTransform().clone(); t.combineWithParent(t2); @@ -37,5 +37,4 @@ public class Test extends SimpleApplication { } } } - } diff --git a/engine/src/android/jme3test/android/TestSceneLoading.java b/engine/src/android/jme3test/android/TestSceneLoading.java index f97aaf091..73d8fb26c 100644 --- a/engine/src/android/jme3test/android/TestSceneLoading.java +++ b/engine/src/android/jme3test/android/TestSceneLoading.java @@ -7,14 +7,13 @@ import com.jme3.scene.Node; import com.jme3.scene.Spatial; import com.jme3.scene.Spatial.CullHint; - public class TestSceneLoading extends SimpleApplication { - private void setState(Spatial s){ + private void setState(Spatial s) { s.setCullHint(CullHint.Never); - if (s instanceof Node){ + if (s instanceof Node) { Node n = (Node) s; - for (int i = 0; i < n.getQuantity(); i++){ + for (int i = 0; i < n.getQuantity(); i++) { Spatial s2 = n.getChild(i); setState(s2); } @@ -22,16 +21,15 @@ public class TestSceneLoading extends SimpleApplication { } public void simpleInitApp() { - /* XXX: does not compile */ + /* XXX: does not compile */ -/* Spatial scene = inputManager.loadModel("FINAL_LEVEL2.j3o"); -// setState(scene); + /* Spatial scene = inputManager.loadModel("FINAL_LEVEL2.j3o"); + // setState(scene); rootNode.attachChild(scene); - + cam.setLocation(new Vector3f(-18.059685f, 34.64228f, 4.5048084f)); cam.setRotation(new Quaternion(0.22396432f, 0.5235024f, -0.1448922f, 0.8091919f)); cam.update(); -*/ + */ } - } diff --git a/engine/src/android/jme3test/android/TestsActivity.java b/engine/src/android/jme3test/android/TestsActivity.java index b5bba99cf..d94b074e8 100644 --- a/engine/src/android/jme3test/android/TestsActivity.java +++ b/engine/src/android/jme3test/android/TestsActivity.java @@ -1,6 +1,5 @@ package jme3test.android; - import java.util.ArrayList; import java.util.List; @@ -30,152 +29,143 @@ import jme3test.android.AndroidActivity; import java.net.URI; - public class TestsActivity extends Activity { - private static final java.util.logging.Logger logger = java.util.logging.Logger.getLogger(TestsActivity.class.getName()); - - - public static class Test { + private static final java.util.logging.Logger logger = java.util.logging.Logger.getLogger(TestsActivity.class.getName()); - private String name = null; - private String className = null; + public static class Test { - public Test(String name, String className) { - this.name = name; - this.className = className; - } + private String name = null; + private String className = null; - public String getName() { - return name; - } + public Test(String name, String className) { + this.name = name; + this.className = className; + } - public String getClassName() { - return className; - } - } + public String getName() { + return name; + } - private final static Test[] tests = { - new Test("SimpleTextured", "jme3test.android.SimpleTexturedTest"), - new Test("light.TestLightRadius", "jme3test.light.TestLightRadius"), - new Test("bullet.TestSimplePhysics", "jme3test.bullet.TestSimplePhysics"), - new Test("helloworld.HelloJME3", "jme3test.helloworld.HelloJME3"), - new Test("helloworld.HelloLoop", "jme3test.helloworld.HelloLoop"), - new Test("helloworld.HelloNode", "jme3test.helloworld.HelloNode"), - new Test("helloworld.HelloEffects", "jme3test.helloworld.HelloEffects"), - new Test("helloworld.HelloTerrain", "jme3test.helloworld.HelloTerrain") - }; + public String getClassName() { + return className; + } + } + private final static Test[] tests = { + new Test("SimpleTextured", "jme3test.android.SimpleTexturedTest"), + new Test("light.TestLightRadius", "jme3test.light.TestLightRadius"), + new Test("bullet.TestSimplePhysics", "jme3test.bullet.TestSimplePhysics"), + new Test("helloworld.HelloJME3", "jme3test.helloworld.HelloJME3"), + new Test("helloworld.HelloLoop", "jme3test.helloworld.HelloLoop"), + new Test("helloworld.HelloNode", "jme3test.helloworld.HelloNode"), + new Test("helloworld.HelloEffects", "jme3test.helloworld.HelloEffects"), + new Test("helloworld.HelloTerrain", "jme3test.helloworld.HelloTerrain") + }; + private boolean useVA; - private boolean useVA; + @Override + public void onCreate(Bundle savedInstanceState) { + logger.info("onCreate(" + savedInstanceState + ")"); - @Override - public void onCreate(Bundle savedInstanceState) { - logger.info("onCreate(" + savedInstanceState + ")"); + super.onCreate(savedInstanceState); - super.onCreate(savedInstanceState); + //setContentView(R.layout.tests); - //setContentView(R.layout.tests); + try { - try { + useVA = true; - useVA = true; + //LinearLayout buttonsContainer = (LinearLayout) findViewById(R.id.buttonsContainer); - //LinearLayout buttonsContainer = (LinearLayout) findViewById(R.id.buttonsContainer); + for (Test test : tests) { + final Button button = new Button(this); + final String finalName = test.getName(); + final String finalClassName = test.getClassName(); - for (Test test: tests) { - final Button button = new Button(this); - final String finalName = test.getName(); - final String finalClassName = test.getClassName(); - - button.setText(test.getName()); + button.setText(test.getName()); // button.setTextSize(10.0f); // button.setTextColor(Color.rgb(100, 200, 200)); - //buttonsContainer.addView(button); - - button.setOnClickListener( - new View.OnClickListener() { - @Override - public void onClick(View view) { - Intent intent = new Intent(view.getContext(), AndroidActivity.class); - intent.putExtra(AndroidActivity.class.getName() + ".TEST_CLASS_NAME", finalClassName); - intent.putExtra(AndroidActivity.class.getName() + ".USE_VA", useVA); - startActivityForResult(intent, 0); - } - } - ); - } - } catch (Exception exception) { - logger.warning("exception: " + exception); - exception.printStackTrace(System.err); - } - } - - @Override - public void onDestroy() { - logger.info("onDestroy()"); - super.onDestroy(); - } - - - @Override - protected void onResume() { - super.onResume(); - } - - @Override - protected void onStart() { - super.onStart(); - } - - @Override - protected void onStop() { - super.onStop(); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - MenuInflater inflater = getMenuInflater(); - //inflater.inflate(R.menu.options, menu); - return true; - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - /* - switch (item.getItemId()) { - case R.id.about_button: - about(); - return true; - case R.id.quit_button: - quit(); - return true; - default: - return super.onOptionsItemSelected(item); - } - */ - return false; - } - - private void quit() { - finish(); - } - - private void about() { - // Intent intent = new Intent(getView().getContext(), AboutActivity.class); - try { - Intent intent = new Intent(); - intent.setClassName( - "jme3test.android", - "jme3test.android.AboutActivity" - ); - startActivity(intent); - } catch (Exception exception) { - logger.warning("exception: " + exception); - exception.printStackTrace(System.err); - } - } - - + //buttonsContainer.addView(button); + + button.setOnClickListener( + new View.OnClickListener() { + + @Override + public void onClick(View view) { + Intent intent = new Intent(view.getContext(), AndroidActivity.class); + intent.putExtra(AndroidActivity.class.getName() + ".TEST_CLASS_NAME", finalClassName); + intent.putExtra(AndroidActivity.class.getName() + ".USE_VA", useVA); + startActivityForResult(intent, 0); + } + }); + } + } catch (Exception exception) { + logger.warning("exception: " + exception); + exception.printStackTrace(System.err); + } + } + + @Override + public void onDestroy() { + logger.info("onDestroy()"); + super.onDestroy(); + } + + @Override + protected void onResume() { + super.onResume(); + } + + @Override + protected void onStart() { + super.onStart(); + } + + @Override + protected void onStop() { + super.onStop(); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + MenuInflater inflater = getMenuInflater(); + //inflater.inflate(R.menu.options, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + /* + switch (item.getItemId()) { + case R.id.about_button: + about(); + return true; + case R.id.quit_button: + quit(); + return true; + default: + return super.onOptionsItemSelected(item); + } + */ + return false; + } + + private void quit() { + finish(); + } + + private void about() { + // Intent intent = new Intent(getView().getContext(), AboutActivity.class); + try { + Intent intent = new Intent(); + intent.setClassName( + "jme3test.android", + "jme3test.android.AboutActivity"); + startActivity(intent); + } catch (Exception exception) { + logger.warning("exception: " + exception); + exception.printStackTrace(System.err); + } + } } - diff --git a/engine/src/android/jme3tools/android/Fixed.java b/engine/src/android/jme3tools/android/Fixed.java index db7090400..6c4f23889 100644 --- a/engine/src/android/jme3tools/android/Fixed.java +++ b/engine/src/android/jme3tools/android/Fixed.java @@ -14,424 +14,413 @@ import java.util.Random; * @author CW */ public final class Fixed { - /** - * Number of bits used for 'fraction'. - */ - public static final int FIXED_POINT = 16; - /** - * Decimal one as represented by the Fixed class. - */ - public static final int ONE = 1 << FIXED_POINT; - - /** - * Half in fixed point. - */ - public static final int HALF = ONE >> 1; - - /** - * Quarter circle resolution for trig functions (should be a power of - * two). This is the number of discrete steps in 90 degrees. - */ - public static final int QUARTER_CIRCLE = 64; - - /** - * Mask used to limit angles to one revolution. If a quarter circle is 64 - * (i.e. 90 degrees is broken into 64 steps) then the mask is 255. - */ - public static final int FULL_CIRCLE_MASK = QUARTER_CIRCLE * 4 - 1; - - /** - * The trig table is generated at a higher precision than the typical - * 16.16 format used for the rest of the fixed point maths. The table - * values are then shifted to match the actual fixed point used. - */ - private static final int TABLE_SHIFT = 30; - - /** - * Equivalent to: sin((2 * PI) / (QUARTER_CIRCLE * 4)) - *

- * Note: if either QUARTER_CIRCLE or TABLE_SHIFT is changed this value - * will need recalculating (put the above formular into a calculator set - * radians, then shift the result by TABLE_SHIFT). - */ - private static final int SIN_PRECALC = 26350943; - - /** - * Equivalent to: cos((2 * PI) / (QUARTER_CIRCLE * 4)) * 2 - * - * Note: if either QUARTER_CIRCLE or TABLE_SHIFT is changed this value - * will need recalculating ((put the above formular into a calculator set - * radians, then shift the result by TABLE_SHIFT). - */ - private static final int COS_PRECALC = 2146836866; - - /** - * One quarter sine wave as fixed point values. - */ - private static final int[] SINE_TABLE = new int[QUARTER_CIRCLE + 1]; - - /** - * Scale value for indexing ATAN_TABLE[]. - */ - private static final int ATAN_SHIFT; - - /** - * Reverse atan lookup table. - */ - private static final byte[] ATAN_TABLE; - - /** - * ATAN_TABLE.length - */ - private static final int ATAN_TABLE_LEN; - - /* - * Generates the tables and fills in any remaining static ints. - */ - static { - // Generate the sine table using recursive synthesis. - SINE_TABLE[0] = 0; - SINE_TABLE[1] = SIN_PRECALC; - for (int n = 2; n < QUARTER_CIRCLE + 1; n++) { - SINE_TABLE[n] = (int) (((long) SINE_TABLE[n - 1] * COS_PRECALC) >> TABLE_SHIFT) - SINE_TABLE[n - 2]; - } - // Scale the values to the fixed point format used. - for (int n = 0; n < QUARTER_CIRCLE + 1; n++) { - SINE_TABLE[n] = SINE_TABLE[n] + (1 << (TABLE_SHIFT - FIXED_POINT - 1)) >> TABLE_SHIFT - FIXED_POINT; - } - - // Calculate a shift used to scale atan lookups - int rotl = 0; - int tan0 = tan(0); - int tan1 = tan(1); - while (rotl < 32) { - if ((tan1 >>= 1) > (tan0 >>= 1)) { - rotl++; - } else { - break; - } - } - ATAN_SHIFT = rotl; - // Create the a table of tan values - int[] lut = new int[QUARTER_CIRCLE]; - for (int n = 0; n < QUARTER_CIRCLE; n++) { - lut[n] = tan(n) >> rotl; - } - ATAN_TABLE_LEN = lut[QUARTER_CIRCLE - 1]; - // Then from the tan values create a reverse lookup - ATAN_TABLE = new byte[ATAN_TABLE_LEN]; - for (byte n = 0; n < QUARTER_CIRCLE - 1; n++) { - int min = lut[n ]; - int max = lut[n + 1]; - for (int i = min; i < max; i++) { - ATAN_TABLE[i] = n; - } - } - } - - /** - * How many decimal places to use when converting a fixed point value to - * a decimal string. - * - * @see #toString - */ - private static final int STRING_DECIMAL_PLACES = 2; - - /** - * Value to add in order to round down a fixed point number when - * converting to a string. - */ - private static final int STRING_DECIMAL_PLACES_ROUND; - static { - int i = 10; - for (int n = 1; n < STRING_DECIMAL_PLACES; n++) { - i *= i; - } - if (STRING_DECIMAL_PLACES == 0) { - STRING_DECIMAL_PLACES_ROUND = ONE / 2; - } else { - STRING_DECIMAL_PLACES_ROUND = ONE / (2 * i); - } - } + /** + * Number of bits used for 'fraction'. + */ + public static final int FIXED_POINT = 16; + /** + * Decimal one as represented by the Fixed class. + */ + public static final int ONE = 1 << FIXED_POINT; + /** + * Half in fixed point. + */ + public static final int HALF = ONE >> 1; + /** + * Quarter circle resolution for trig functions (should be a power of + * two). This is the number of discrete steps in 90 degrees. + */ + public static final int QUARTER_CIRCLE = 64; + /** + * Mask used to limit angles to one revolution. If a quarter circle is 64 + * (i.e. 90 degrees is broken into 64 steps) then the mask is 255. + */ + public static final int FULL_CIRCLE_MASK = QUARTER_CIRCLE * 4 - 1; + /** + * The trig table is generated at a higher precision than the typical + * 16.16 format used for the rest of the fixed point maths. The table + * values are then shifted to match the actual fixed point used. + */ + private static final int TABLE_SHIFT = 30; + /** + * Equivalent to: sin((2 * PI) / (QUARTER_CIRCLE * 4)) + *

+ * Note: if either QUARTER_CIRCLE or TABLE_SHIFT is changed this value + * will need recalculating (put the above formular into a calculator set + * radians, then shift the result by TABLE_SHIFT). + */ + private static final int SIN_PRECALC = 26350943; + /** + * Equivalent to: cos((2 * PI) / (QUARTER_CIRCLE * 4)) * 2 + * + * Note: if either QUARTER_CIRCLE or TABLE_SHIFT is changed this value + * will need recalculating ((put the above formular into a calculator set + * radians, then shift the result by TABLE_SHIFT). + */ + private static final int COS_PRECALC = 2146836866; + /** + * One quarter sine wave as fixed point values. + */ + private static final int[] SINE_TABLE = new int[QUARTER_CIRCLE + 1]; + /** + * Scale value for indexing ATAN_TABLE[]. + */ + private static final int ATAN_SHIFT; + /** + * Reverse atan lookup table. + */ + private static final byte[] ATAN_TABLE; + /** + * ATAN_TABLE.length + */ + private static final int ATAN_TABLE_LEN; - /** - * Random number generator. The standard java.utll.Random is - * used since it is available to both J2ME and J2SE. If a guaranteed - * sequence is required this would not be adequate. - */ - private static Random rng = null; + /* + * Generates the tables and fills in any remaining static ints. + */ + static { + // Generate the sine table using recursive synthesis. + SINE_TABLE[0] = 0; + SINE_TABLE[1] = SIN_PRECALC; + for (int n = 2; n < QUARTER_CIRCLE + 1; n++) { + SINE_TABLE[n] = (int) (((long) SINE_TABLE[n - 1] * COS_PRECALC) >> TABLE_SHIFT) - SINE_TABLE[n - 2]; + } + // Scale the values to the fixed point format used. + for (int n = 0; n < QUARTER_CIRCLE + 1; n++) { + SINE_TABLE[n] = SINE_TABLE[n] + (1 << (TABLE_SHIFT - FIXED_POINT - 1)) >> TABLE_SHIFT - FIXED_POINT; + } + + // Calculate a shift used to scale atan lookups + int rotl = 0; + int tan0 = tan(0); + int tan1 = tan(1); + while (rotl < 32) { + if ((tan1 >>= 1) > (tan0 >>= 1)) { + rotl++; + } else { + break; + } + } + ATAN_SHIFT = rotl; + // Create the a table of tan values + int[] lut = new int[QUARTER_CIRCLE]; + for (int n = 0; n < QUARTER_CIRCLE; n++) { + lut[n] = tan(n) >> rotl; + } + ATAN_TABLE_LEN = lut[QUARTER_CIRCLE - 1]; + // Then from the tan values create a reverse lookup + ATAN_TABLE = new byte[ATAN_TABLE_LEN]; + for (byte n = 0; n < QUARTER_CIRCLE - 1; n++) { + int min = lut[n]; + int max = lut[n + 1]; + for (int i = min; i < max; i++) { + ATAN_TABLE[i] = n; + } + } + } + /** + * How many decimal places to use when converting a fixed point value to + * a decimal string. + * + * @see #toString + */ + private static final int STRING_DECIMAL_PLACES = 2; + /** + * Value to add in order to round down a fixed point number when + * converting to a string. + */ + private static final int STRING_DECIMAL_PLACES_ROUND; + + static { + int i = 10; + for (int n = 1; n < STRING_DECIMAL_PLACES; n++) { + i *= i; + } + if (STRING_DECIMAL_PLACES == 0) { + STRING_DECIMAL_PLACES_ROUND = ONE / 2; + } else { + STRING_DECIMAL_PLACES_ROUND = ONE / (2 * i); + } + } + /** + * Random number generator. The standard java.utll.Random is + * used since it is available to both J2ME and J2SE. If a guaranteed + * sequence is required this would not be adequate. + */ + private static Random rng = null; - /** - * Fixed can't be instantiated. - */ - private Fixed() {} + /** + * Fixed can't be instantiated. + */ + private Fixed() { + } - /** - * Returns an integer as a fixed point value. - */ - public static int intToFixed(int n) { - return n << FIXED_POINT; - } + /** + * Returns an integer as a fixed point value. + */ + public static int intToFixed(int n) { + return n << FIXED_POINT; + } /** * Returns a fixed point value as a float. */ public static float fixedToFloat(int i) { float fp = i; - fp = fp / ((float)ONE); + fp = fp / ((float) ONE); return fp; } /** * Returns a float as a fixed point value. */ - public static int floatToFixed(float fp){ + public static int floatToFixed(float fp) { return (int) (fp * ((float) ONE)); } - /** - * Converts a fixed point value into a decimal string. - */ - public static String toString(int n) { - StringBuffer sb = new StringBuffer(16); - sb.append((n += STRING_DECIMAL_PLACES_ROUND) >> FIXED_POINT); - sb.append('.'); - n &= ONE - 1; - for (int i = 0; i < STRING_DECIMAL_PLACES; i++) { - n *= 10; - sb.append((n / ONE) % 10); - } - return sb.toString(); - } + /** + * Converts a fixed point value into a decimal string. + */ + public static String toString(int n) { + StringBuffer sb = new StringBuffer(16); + sb.append((n += STRING_DECIMAL_PLACES_ROUND) >> FIXED_POINT); + sb.append('.'); + n &= ONE - 1; + for (int i = 0; i < STRING_DECIMAL_PLACES; i++) { + n *= 10; + sb.append((n / ONE) % 10); + } + return sb.toString(); + } - /** - * Multiplies two fixed point values and returns the result. - */ - public static int mul(int a, int b) { - return (int) ((long) a * (long) b >> FIXED_POINT); - } + /** + * Multiplies two fixed point values and returns the result. + */ + public static int mul(int a, int b) { + return (int) ((long) a * (long) b >> FIXED_POINT); + } - /** - * Divides two fixed point values and returns the result. - */ - public static int div(int a, int b) { - return (int) (((long) a << FIXED_POINT * 2) / (long) b >> FIXED_POINT); - } + /** + * Divides two fixed point values and returns the result. + */ + public static int div(int a, int b) { + return (int) (((long) a << FIXED_POINT * 2) / (long) b >> FIXED_POINT); + } - /** - * Sine of an angle. - * - * @see #QUARTER_CIRCLE - */ - public static int sin(int n) { - n &= FULL_CIRCLE_MASK; - if (n < QUARTER_CIRCLE * 2) { - if (n < QUARTER_CIRCLE) { - return SINE_TABLE[n]; - } else { - return SINE_TABLE[QUARTER_CIRCLE * 2 - n]; - } - } else { - if (n < QUARTER_CIRCLE * 3) { - return -SINE_TABLE[n - QUARTER_CIRCLE * 2]; - } else { - return -SINE_TABLE[QUARTER_CIRCLE * 4 - n]; - } - } - } + /** + * Sine of an angle. + * + * @see #QUARTER_CIRCLE + */ + public static int sin(int n) { + n &= FULL_CIRCLE_MASK; + if (n < QUARTER_CIRCLE * 2) { + if (n < QUARTER_CIRCLE) { + return SINE_TABLE[n]; + } else { + return SINE_TABLE[QUARTER_CIRCLE * 2 - n]; + } + } else { + if (n < QUARTER_CIRCLE * 3) { + return -SINE_TABLE[n - QUARTER_CIRCLE * 2]; + } else { + return -SINE_TABLE[QUARTER_CIRCLE * 4 - n]; + } + } + } - /** - * Cosine of an angle. - * - * @see #QUARTER_CIRCLE - */ - public static int cos(int n) { - n &= FULL_CIRCLE_MASK; - if (n < QUARTER_CIRCLE * 2) { - if (n < QUARTER_CIRCLE) { - return SINE_TABLE[QUARTER_CIRCLE - n]; - } else { - return -SINE_TABLE[n - QUARTER_CIRCLE]; - } - } else { - if (n < QUARTER_CIRCLE * 3) { - return -SINE_TABLE[QUARTER_CIRCLE * 3 - n]; - } else { - return SINE_TABLE[n - QUARTER_CIRCLE * 3]; - } - } - } + /** + * Cosine of an angle. + * + * @see #QUARTER_CIRCLE + */ + public static int cos(int n) { + n &= FULL_CIRCLE_MASK; + if (n < QUARTER_CIRCLE * 2) { + if (n < QUARTER_CIRCLE) { + return SINE_TABLE[QUARTER_CIRCLE - n]; + } else { + return -SINE_TABLE[n - QUARTER_CIRCLE]; + } + } else { + if (n < QUARTER_CIRCLE * 3) { + return -SINE_TABLE[QUARTER_CIRCLE * 3 - n]; + } else { + return SINE_TABLE[n - QUARTER_CIRCLE * 3]; + } + } + } - /** - * Tangent of an angle. - * - * @see #QUARTER_CIRCLE - */ - public static int tan(int n) { - return div(sin(n), cos(n)); - } + /** + * Tangent of an angle. + * + * @see #QUARTER_CIRCLE + */ + public static int tan(int n) { + return div(sin(n), cos(n)); + } - /** - * Returns the arc tangent of an angle. - */ - public static int atan(int n) { - n = n + (1 << (ATAN_SHIFT - 1)) >> ATAN_SHIFT; - if (n < 0) { - if (n <= -ATAN_TABLE_LEN) { - return -(QUARTER_CIRCLE - 1); - } - return -ATAN_TABLE[-n]; - } else { - if (n >= ATAN_TABLE_LEN) { - return QUARTER_CIRCLE - 1; - } - return ATAN_TABLE[n]; - } - } + /** + * Returns the arc tangent of an angle. + */ + public static int atan(int n) { + n = n + (1 << (ATAN_SHIFT - 1)) >> ATAN_SHIFT; + if (n < 0) { + if (n <= -ATAN_TABLE_LEN) { + return -(QUARTER_CIRCLE - 1); + } + return -ATAN_TABLE[-n]; + } else { + if (n >= ATAN_TABLE_LEN) { + return QUARTER_CIRCLE - 1; + } + return ATAN_TABLE[n]; + } + } - /** - * Returns the polar angle of a rectangular coordinate. - */ - public static int atan(int x, int y) { - int n = atan(div(x, abs(y) + 1)); // kludge to prevent ArithmeticException - if (y > 0) { - return n; - } - if (y < 0) { - if (x < 0) { - return -QUARTER_CIRCLE * 2 - n; - } - if (x > 0) { - return QUARTER_CIRCLE * 2 - n; - } - return QUARTER_CIRCLE * 2; - } - if (x > 0) { - return QUARTER_CIRCLE; - } - return -QUARTER_CIRCLE; - } + /** + * Returns the polar angle of a rectangular coordinate. + */ + public static int atan(int x, int y) { + int n = atan(div(x, abs(y) + 1)); // kludge to prevent ArithmeticException + if (y > 0) { + return n; + } + if (y < 0) { + if (x < 0) { + return -QUARTER_CIRCLE * 2 - n; + } + if (x > 0) { + return QUARTER_CIRCLE * 2 - n; + } + return QUARTER_CIRCLE * 2; + } + if (x > 0) { + return QUARTER_CIRCLE; + } + return -QUARTER_CIRCLE; + } - /** - * Rough calculation of the hypotenuse. Whilst not accurate it is very fast. - *

- * Derived from a piece in Graphics Gems. - */ - public static int hyp(int x1, int y1, int x2, int y2) { - if ((x2 -= x1) < 0) { - x2 = -x2; - } - if ((y2 -= y1) < 0) { - y2 = -y2; - } - return x2 + y2 - (((x2 > y2) ? y2 : x2) >> 1); - } + /** + * Rough calculation of the hypotenuse. Whilst not accurate it is very fast. + *

+ * Derived from a piece in Graphics Gems. + */ + public static int hyp(int x1, int y1, int x2, int y2) { + if ((x2 -= x1) < 0) { + x2 = -x2; + } + if ((y2 -= y1) < 0) { + y2 = -y2; + } + return x2 + y2 - (((x2 > y2) ? y2 : x2) >> 1); + } - /** - * Fixed point square root. - *

- * Derived from a 1993 Usenet algorithm posted by Christophe Meessen. - */ - public static int sqrt(int n) { - if (n <= 0) { - return 0; - } - long sum = 0; - int bit = 0x40000000; - while (bit >= 0x100) { // lower values give more accurate results - long tmp = sum | bit; - if (n >= tmp) { - n -= tmp; - sum = tmp + bit; - } - bit >>= 1; - n <<= 1; - } - return (int) (sum >> 16 - (FIXED_POINT / 2)); - } + /** + * Fixed point square root. + *

+ * Derived from a 1993 Usenet algorithm posted by Christophe Meessen. + */ + public static int sqrt(int n) { + if (n <= 0) { + return 0; + } + long sum = 0; + int bit = 0x40000000; + while (bit >= 0x100) { // lower values give more accurate results + long tmp = sum | bit; + if (n >= tmp) { + n -= tmp; + sum = tmp + bit; + } + bit >>= 1; + n <<= 1; + } + return (int) (sum >> 16 - (FIXED_POINT / 2)); + } - /** - * Returns the absolute value. - */ - public static int abs(int n) { - return (n < 0) ? -n : n; - } + /** + * Returns the absolute value. + */ + public static int abs(int n) { + return (n < 0) ? -n : n; + } - /** - * Returns the sign of a value, -1 for negative numbers, otherwise 1. - */ - public static int sgn(int n) { - return (n < 0) ? -1 : 1; - } + /** + * Returns the sign of a value, -1 for negative numbers, otherwise 1. + */ + public static int sgn(int n) { + return (n < 0) ? -1 : 1; + } - /** - * Returns the minimum of two values. - */ - public static int min(int a, int b) { - return (a < b) ? a : b; - } + /** + * Returns the minimum of two values. + */ + public static int min(int a, int b) { + return (a < b) ? a : b; + } - /** - * Returns the maximum of two values. - */ - public static int max(int a, int b) { - return (a > b) ? a : b; - } + /** + * Returns the maximum of two values. + */ + public static int max(int a, int b) { + return (a > b) ? a : b; + } - /** - * Clamps the value n between min and max. - */ - public static int clamp(int n, int min, int max) { - return (n < min) ? min : (n > max) ? max : n; - } + /** + * Clamps the value n between min and max. + */ + public static int clamp(int n, int min, int max) { + return (n < min) ? min : (n > max) ? max : n; + } - /** - * Wraps the value n between 0 and the required limit. - */ - public static int wrap(int n, int limit) { - return ((n %= limit) < 0) ? limit + n : n; - } + /** + * Wraps the value n between 0 and the required limit. + */ + public static int wrap(int n, int limit) { + return ((n %= limit) < 0) ? limit + n : n; + } - /** - * Returns the nearest int to a fixed point value. Equivalent to - * Math.round() in the standard library. - */ - public static int round(int n) { - return n + HALF >> FIXED_POINT; - } + /** + * Returns the nearest int to a fixed point value. Equivalent to + * Math.round() in the standard library. + */ + public static int round(int n) { + return n + HALF >> FIXED_POINT; + } - /** - * Returns the nearest int rounded down from a fixed point value. - * Equivalent to Math.floor() in the standard library. - */ - public static int floor(int n) { - return n >> FIXED_POINT; - } + /** + * Returns the nearest int rounded down from a fixed point value. + * Equivalent to Math.floor() in the standard library. + */ + public static int floor(int n) { + return n >> FIXED_POINT; + } - /** - * Returns the nearest int rounded up from a fixed point value. - * Equivalent to Math.ceil() in the standard library. - */ - public static int ceil(int n) { - return n + (ONE - 1) >> FIXED_POINT; - } + /** + * Returns the nearest int rounded up from a fixed point value. + * Equivalent to Math.ceil() in the standard library. + */ + public static int ceil(int n) { + return n + (ONE - 1) >> FIXED_POINT; + } - /** - * Returns a fixed point value greater than or equal to decimal 0.0 and - * less than 1.0 (in 16.16 format this would be 0 to 65535 inclusive). - */ - public static int rand() { - if (rng == null) { - rng = new Random(); - } - return rng.nextInt() >>> (32 - FIXED_POINT); - } + /** + * Returns a fixed point value greater than or equal to decimal 0.0 and + * less than 1.0 (in 16.16 format this would be 0 to 65535 inclusive). + */ + public static int rand() { + if (rng == null) { + rng = new Random(); + } + return rng.nextInt() >>> (32 - FIXED_POINT); + } - /** - * Returns a random number between 0 and n (exclusive). - */ - public static int rand(int n) { - return (rand() * n) >> FIXED_POINT; - } + /** + * Returns a random number between 0 and n (exclusive). + */ + public static int rand(int n) { + return (rand() * n) >> FIXED_POINT; + } } \ No newline at end of file diff --git a/engine/src/android/res/layout/about.xml b/engine/src/android/res/layout/about.xml index d95af3722..1d8c2b0a3 100644 --- a/engine/src/android/res/layout/about.xml +++ b/engine/src/android/res/layout/about.xml @@ -7,25 +7,25 @@ android:layout_height="fill_parent" > - - - - + diff --git a/engine/src/android/res/layout/tests.xml b/engine/src/android/res/layout/tests.xml index afd405b87..70bd5ecbc 100644 --- a/engine/src/android/res/layout/tests.xml +++ b/engine/src/android/res/layout/tests.xml @@ -6,14 +6,12 @@ android:layout_width="fill_parent" android:layout_height="fill_parent" > - - + android:layout_height="fill_parent"> - - + diff --git a/engine/src/android/res/menu/options.xml b/engine/src/android/res/menu/options.xml index 7f7d527fa..8efec52be 100644 --- a/engine/src/android/res/menu/options.xml +++ b/engine/src/android/res/menu/options.xml @@ -1,14 +1,12 @@

- - - - diff --git a/engine/src/android/res/values/strings.xml b/engine/src/android/res/values/strings.xml index 2705a3ef6..92d63fa9e 100644 --- a/engine/src/android/res/values/strings.xml +++ b/engine/src/android/res/values/strings.xml @@ -1,6 +1,6 @@ - JMEAndroidTest - About - Quit + JMEAndroidTest + About + Quit diff --git a/engine/src/core/com/jme3/system/JmeContext.java b/engine/src/core/com/jme3/system/JmeContext.java index 57a341eab..37283a503 100644 --- a/engine/src/core/com/jme3/system/JmeContext.java +++ b/engine/src/core/com/jme3/system/JmeContext.java @@ -37,7 +37,6 @@ import com.jme3.input.KeyInput; import com.jme3.input.MouseInput; import com.jme3.input.TouchInput; import com.jme3.renderer.Renderer; -import com.jme3.system.JmeCanvasContext; /** * Represents a rendering context within the engine. diff --git a/engine/src/core/com/jme3/system/Platform.java b/engine/src/core/com/jme3/system/Platform.java new file mode 100644 index 000000000..5a3f5c951 --- /dev/null +++ b/engine/src/core/com/jme3/system/Platform.java @@ -0,0 +1,65 @@ +package com.jme3.system; + +public enum Platform { + + /** + * Microsoft Windows 32 bit + */ + Windows32, + + /** + * Microsoft Windows 64 bit + */ + Windows64, + + /** + * Linux 32 bit + */ + Linux32, + + /** + * Linux 64 bit + */ + Linux64, + + /** + * Apple Mac OS X 32 bit + */ + MacOSX32, + + /** + * Apple Mac OS X 64 bit + */ + MacOSX64, + + /** + * Apple Mac OS X 32 bit PowerPC + */ + MacOSX_PPC32, + + /** + * Apple Mac OS X 64 bit PowerPC + */ + MacOSX_PPC64, + + /** + * Android ARM5 + */ + Android_ARM5, + + /** + * Android ARM6 + */ + Android_ARM6, + + /** + * Android ARM7 + */ + Android_ARM7, + + /** + * Android x86 + */ + Android_X86; + +} \ No newline at end of file diff --git a/engine/src/core/com/jme3/util/SkyFactory.java b/engine/src/core/com/jme3/util/SkyFactory.java index 15e99903b..71863e9bd 100644 --- a/engine/src/core/com/jme3/util/SkyFactory.java +++ b/engine/src/core/com/jme3/util/SkyFactory.java @@ -13,29 +13,75 @@ import com.jme3.texture.Image; import com.jme3.texture.Image.Format; import com.jme3.texture.Texture; import com.jme3.texture.TextureCubeMap; - +import java.util.ArrayList; + +/** + * SkyFactory is used to create jME {@link Spatial}s that can + * be attached to the scene to display a sky image in the background. + * + * @author Kirill Vainer + */ public class SkyFactory { - - public static Spatial createSky(AssetManager assetManager, Texture texture, Vector3f normalScale, boolean sphereMap){ - return createSky(assetManager, texture, normalScale, sphereMap, 10); - } - public static Spatial createSky(AssetManager assetManager, Texture texture, Vector3f normalScale, boolean sphereMap, int sphereRadius){ - if (texture == null) + /** + * Creates a sky using the given texture (cubemap or spheremap). + * + * @param assetManager The asset manager to use to load materials + * @param texture Texture to use for the sky + * @param normalScale The normal scale is multiplied by the 3D normal + * to get a texture coordinate. Use Vector3f.UNIT_XYZ to not apply + * and transformation to the normal. + * @param sphereMap The way the texture is used + * depends on this value:
+ *
    + *
  • true: Its a Texture2D with the pixels arranged for + * sphere mapping.
  • + *
  • false: Its either a TextureCubeMap or Texture2D. If its a Texture2D + * then the image is taken from it and is inserted into a TextureCubeMap
  • + *
+ * @return A spatial representing the sky + */ + public static Spatial createSky(AssetManager assetManager, Texture texture, Vector3f normalScale, boolean sphereMap) { + return createSky(assetManager, texture, normalScale, sphereMap, 10); + } + + /** + * Creates a sky using the given texture (cubemap or spheremap). + * + * @param assetManager The asset manager to use to load materials + * @param texture Texture to use for the sky + * @param normalScale The normal scale is multiplied by the 3D normal + * to get a texture coordinate. Use Vector3f.UNIT_XYZ to not apply + * and transformation to the normal. + * @param sphereMap The way the texture is used + * depends on this value:
+ *
    + *
  • true: Its a Texture2D with the pixels arranged for + * sphere mapping.
  • + *
  • false: Its either a TextureCubeMap or Texture2D. If its a Texture2D + * then the image is taken from it and is inserted into a TextureCubeMap
  • + *
+ * @param sphereRadius If specified, this will be the sky sphere's radius. + * This should be the camera's near plane for optimal quality. + * @return A spatial representing the sky + */ + public static Spatial createSky(AssetManager assetManager, Texture texture, Vector3f normalScale, boolean sphereMap, int sphereRadius) { + if (texture == null) { throw new IllegalArgumentException("texture cannot be null"); + } final Sphere sphereMesh = new Sphere(10, 10, sphereRadius, false, true); - + Geometry sky = new Geometry("Sky", sphereMesh); sky.setQueueBucket(Bucket.Sky); sky.setCullHint(Spatial.CullHint.Never); sky.setModelBound(new BoundingSphere(Float.POSITIVE_INFINITY, Vector3f.ZERO)); Material skyMat = new Material(assetManager, "Common/MatDefs/Misc/Sky.j3md"); - + skyMat.setVector3("NormalScale", normalScale); - if (sphereMap){ + if (sphereMap) { skyMat.setBoolean("SphereMap", sphereMap); - }else if (!(texture instanceof TextureCubeMap)){ + } else if (!(texture instanceof TextureCubeMap)) { // make sure its a cubemap Image img = texture.getImage(); texture = new TextureCubeMap(); @@ -43,23 +89,27 @@ public class SkyFactory { } skyMat.setTexture("Texture", texture); sky.setMaterial(skyMat); - + return sky; } - private static void checkImage(Image image){ + private static void checkImage(Image image) { // if (image.getDepth() != 1) // throw new IllegalArgumentException("3D/Array images not allowed"); - if (image.getWidth() != image.getHeight()) + if (image.getWidth() != image.getHeight()) { throw new IllegalArgumentException("Image width and height must be the same"); + } - if (image.getMultiSamples() != 1) + if (image.getMultiSamples() != 1) { throw new IllegalArgumentException("Multisample textures not allowed"); + } } - private static void checkImagesForCubeMap(Image ... images){ - if (images.length == 1) return; + private static void checkImagesForCubeMap(Image... images) { + if (images.length == 1) { + return; + } Format fmt = images[0].getFormat(); int width = images[0].getWidth(); @@ -67,45 +117,63 @@ public class SkyFactory { checkImage(images[0]); - for (int i = 1; i < images.length; i++){ + for (int i = 1; i < images.length; i++) { Image image = images[i]; checkImage(images[i]); - if (image.getFormat() != fmt) throw new IllegalArgumentException("Images must have same format"); - if (image.getWidth() != width) throw new IllegalArgumentException("Images must have same resolution"); - if (image.getData(0).capacity() != size) throw new IllegalArgumentException("Images must have same size"); + if (image.getFormat() != fmt) { + throw new IllegalArgumentException("Images must have same format"); + } + if (image.getWidth() != width) { + throw new IllegalArgumentException("Images must have same resolution"); + } + if (image.getData(0).capacity() != size) { + throw new IllegalArgumentException("Images must have same size"); + } } } - public static Spatial createSky(AssetManager assetManager, Texture west, Texture east, Texture north, Texture south, Texture up, Texture down, Vector3f normalScale){ - return createSky(assetManager, west, east, north, south, up, down, normalScale, 10); + public static Spatial createSky(AssetManager assetManager, Texture west, Texture east, Texture north, Texture south, Texture up, Texture down, Vector3f normalScale) { + return createSky(assetManager, west, east, north, south, up, down, normalScale, 10); } - - public static Spatial createSky(AssetManager assetManager, Texture west, Texture east, Texture north, Texture south, Texture up, Texture down, Vector3f normalScale, int sphereRadius){ + + public static Spatial createSky(AssetManager assetManager, Texture west, Texture east, Texture north, Texture south, Texture up, Texture down, Vector3f normalScale, int sphereRadius) { final Sphere sphereMesh = new Sphere(10, 10, sphereRadius, false, true); Geometry sky = new Geometry("Sky", sphereMesh); sky.setQueueBucket(Bucket.Sky); sky.setCullHint(Spatial.CullHint.Never); sky.setModelBound(new BoundingSphere(Float.POSITIVE_INFINITY, Vector3f.ZERO)); - Image westImg = west.getImage(); - Image eastImg = east.getImage(); + Image westImg = west.getImage(); + Image eastImg = east.getImage(); Image northImg = north.getImage(); Image southImg = south.getImage(); - Image upImg = up.getImage(); - Image downImg = down.getImage(); + Image upImg = up.getImage(); + Image downImg = down.getImage(); checkImagesForCubeMap(westImg, eastImg, northImg, southImg, upImg, downImg); Image cubeImage = new Image(westImg.getFormat(), westImg.getWidth(), westImg.getHeight(), null); - + cubeImage.addData(westImg.getData(0)); cubeImage.addData(eastImg.getData(0)); - + cubeImage.addData(downImg.getData(0)); cubeImage.addData(upImg.getData(0)); cubeImage.addData(southImg.getData(0)); cubeImage.addData(northImg.getData(0)); + + if (westImg.getEfficentData() != null){ + // also consilidate efficient data + ArrayList efficientData = new ArrayList(6); + efficientData.add(westImg.getEfficentData()); + efficientData.add(eastImg.getEfficentData()); + efficientData.add(downImg.getEfficentData()); + efficientData.add(upImg.getEfficentData()); + efficientData.add(southImg.getEfficentData()); + efficientData.add(northImg.getEfficentData()); + cubeImage.setEfficentData(efficientData); + } TextureCubeMap cubeMap = new TextureCubeMap(cubeImage); cubeMap.setAnisotropicFilter(0); @@ -121,22 +189,19 @@ public class SkyFactory { return sky; } - public static Spatial createSky(AssetManager assetManager, Texture west, Texture east, Texture north, Texture south, Texture up, Texture down){ + public static Spatial createSky(AssetManager assetManager, Texture west, Texture east, Texture north, Texture south, Texture up, Texture down) { return createSky(assetManager, west, east, north, south, up, down, Vector3f.UNIT_XYZ); } - public static Spatial createSky(AssetManager assetManager, Texture texture, boolean sphereMap){ + public static Spatial createSky(AssetManager assetManager, Texture texture, boolean sphereMap) { return createSky(assetManager, texture, Vector3f.UNIT_XYZ, sphereMap); } - public static Spatial createSky(AssetManager assetManager, String textureName, boolean sphereMap){ + public static Spatial createSky(AssetManager assetManager, String textureName, boolean sphereMap) { TextureKey key = new TextureKey(textureName, true); key.setGenerateMips(true); key.setAsCube(!sphereMap); Texture tex = assetManager.loadTexture(key); return createSky(assetManager, tex, sphereMap); } - - - } diff --git a/engine/src/desktop/com/jme3/system/JmeSystem.java b/engine/src/desktop/com/jme3/system/JmeSystem.java index 9c40c7f67..e6a997dfc 100644 --- a/engine/src/desktop/com/jme3/system/JmeSystem.java +++ b/engine/src/desktop/com/jme3/system/JmeSystem.java @@ -48,41 +48,6 @@ import javax.swing.SwingUtilities; public class JmeSystem { - public static enum Platform { - - /** - * Microsoft Windows 32 bit - */ - Windows32, - /** - * Microsoft Windows 64 bit - */ - Windows64, - /** - * Linux 32 bit - */ - Linux32, - /** - * Linux 64 bit - */ - Linux64, - /** - * Apple Mac OS X 32 bit - */ - MacOSX32, - /** - * Apple Mac OS X 64 bit - */ - MacOSX64, - /** - * Apple Mac OS X 32 bit PowerPC - */ - MacOSX_PPC32, - /** - * Apple Mac OS X 64 bit PowerPC - */ - MacOSX_PPC64, - } private static final Logger logger = Logger.getLogger(JmeSystem.class.getName()); private static boolean initialized = false; private static boolean lowPermissions = false;