Browse Source

* Formatting for many android classes which needed it desperately
* Moved JmeSystem.Platform to its own class in core. Desktop's and Android's JmeSystem now both use it
* Moved proper usage of efficient data from AndroidSkyFactory to SkyFactory, deprecated AndroidSkyFactory

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@8236 75d07b2b-3a1a-0410-a2c5-0572b91ccdca

sha..rd 14 years ago
parent
commit
5ac90f46fa

+ 94 - 134
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;
 
-
 /**
  * <code>AndroidHarness</code> 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<? extends Application> clazz = (Class<? extends Application>) 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;
             }
         }
-                        
-    }    
-    
+
+    }
 }

+ 19 - 22
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;
     }
-    
 }

+ 41 - 118
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");
+        }
     }
-
 }

+ 14 - 18
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;
     }
-
 }

+ 34 - 22
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<Item> implements Iterable<Item> 
-{
+public class RingBuffer<Item> implements Iterable<Item> {
+
     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<Item> implements Iterable<Item>
         return item;
     }
 
-    public Iterator<Item> iterator() { return new RingBufferIterator(); }
+    public Iterator<Item> iterator() {
+        return new RingBufferIterator();
+    }
 
     // an iterator, doesn't implement remove() since it's optional
     private class RingBufferIterator implements Iterator<Item> {
+
         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++];
         }
     }
-
-
-
-
 }
-

+ 16 - 125
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;
 
 /**
  * <code>AndroidSkyFactory</code> 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<Bitmap> arrayList = new ArrayList<Bitmap>(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);
     }
 }

+ 24 - 31
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();
+    }
 }
-

+ 97 - 106
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<? extends Application> clazz = (Class<? extends Application>) 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<? extends Application> clazz = (Class<? extends Application>) 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();
 //	}
-
 }
-

+ 74 - 82
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);
+    }
 }
-

+ 4 - 5
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 {
             }
         }
     }
-
 }

+ 8 - 10
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();
-*/
+         */
     }
-
 }

+ 121 - 131
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);
+        }
+    }
 }
-

+ 370 - 381
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))
-	 *	<p>
-	 *	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 <code>TABLE_SHIFT</code>).
-	 */
-	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 <code>TABLE_SHIFT</code>).
-	 */
-	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))
+     *	<p>
+     *	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 <code>TABLE_SHIFT</code>).
+     */
+    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 <code>TABLE_SHIFT</code>).
+     */
+    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 <code>java.utll.Random</code> 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 <code>java.utll.Random</code> 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.
-	 *	<p>
-	 *	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.
+     *	<p>
+     *	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.
-	 *	<p>
-	 *	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.
+     *	<p>
+     *	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 <code>
-	 *	Math.round()</code> 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 <code>
+     *	Math.round()</code> 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 <code>Math.floor()</code> 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 <code>Math.floor()</code> 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 <code>Math.ceil()</code> 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 <code>Math.ceil()</code> 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 <code>n</code> (exclusive).
-	 */
-	public static int rand(int n) {
-		return (rand() * n) >> FIXED_POINT;
-	}
+    /**
+     *	Returns a random number between 0 and <code>n</code> (exclusive).
+     */
+    public static int rand(int n) {
+        return (rand() * n) >> FIXED_POINT;
+    }
 }

+ 4 - 4
engine/src/android/res/layout/about.xml

@@ -7,25 +7,25 @@
 	android:layout_height="fill_parent"
 >
 
-	<LinearLayout
+    <LinearLayout
 		android:id="@+id/buttonsContainer"
 		xmlns:android="http://schemas.android.com/apk/res/android"
 		android:orientation="vertical"
 		android:layout_width="fill_parent"
 		android:layout_height="fill_parent"
 	>
-		<TextView  
+        <TextView  
 			android:layout_width="fill_parent" 
 			android:layout_height="wrap_content" 
 			android:text="copyright (c) 2009-2010 JMonkeyEngine"
 		/>
 
-		<TextView  
+        <TextView  
 			android:layout_width="fill_parent" 
 			android:layout_height="wrap_content" 
 			android:text="http://www.jmonkeyengine.org"
 		/>
 
-	</LinearLayout>
+    </LinearLayout>
 
 </LinearLayout>

+ 3 - 6
engine/src/android/res/layout/tests.xml

@@ -6,14 +6,12 @@
 	android:layout_width="fill_parent"
 	android:layout_height="fill_parent"
 >
-
-	<LinearLayout
+    <LinearLayout
 		android:id="@+id/buttonsContainer"
 		xmlns:android="http://schemas.android.com/apk/res/android"
 		android:orientation="vertical"
 		android:layout_width="fill_parent"
-		android:layout_height="fill_parent"
-	>
+		android:layout_height="fill_parent">
 <!--
 		<Button
 			android:id="@+id/SimpleTextured"
@@ -23,6 +21,5 @@
 			android:layout_weight="1"
 		/>
 -->
-	</LinearLayout>
-
+    </LinearLayout>
 </LinearLayout>

+ 6 - 8
engine/src/android/res/menu/options.xml

@@ -1,14 +1,12 @@
 <?xml version="1.0" encoding="utf-8"?>
 <menu xmlns:android="http://schemas.android.com/apk/res/android">
-
-	<item
-		android:id="@+id/about_button"
-		android:title="@string/about"
+    <item
+        android:id="@+id/about_button"
+        android:title="@string/about"
 	/>
 
-	<item
-		android:id="@+id/quit_button"
-		android:title="@string/quit"
+    <item
+        android:id="@+id/quit_button"
+        android:title="@string/quit"
 	/>
-
 </menu>

+ 3 - 3
engine/src/android/res/values/strings.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <resources>
-	<string name="app_name">JMEAndroidTest</string>
-	<string name="about">About</string>
-	<string name="quit">Quit</string>
+    <string name="app_name">JMEAndroidTest</string>
+    <string name="about">About</string>
+    <string name="quit">Quit</string>
 </resources>

+ 0 - 1
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.

+ 65 - 0
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;
+    
+}

+ 102 - 37
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;
+
+/**
+ * <code>SkyFactory</code> 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:<br>
+     * <ul>
+     * <li>true: Its a Texture2D with the pixels arranged for  
+     * <a href="http://en.wikipedia.org/wiki/Sphere_mapping">sphere mapping</a>.</li>
+     * <li>false: Its either a TextureCubeMap or Texture2D. If its a Texture2D
+     * then the image is taken from it and is inserted into a TextureCubeMap</li>
+     * </ul>
+     * @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:<br>
+     * <ul>
+     * <li>true: Its a Texture2D with the pixels arranged for  
+     * <a href="http://en.wikipedia.org/wiki/Sphere_mapping">sphere mapping</a>.</li>
+     * <li>false: Its either a TextureCubeMap or Texture2D. If its a Texture2D
+     * then the image is taken from it and is inserted into a TextureCubeMap</li>
+     * </ul>
+     * @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<Object> efficientData = new ArrayList<Object>(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);
     }
-
-    
-
 }

+ 0 - 35
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;