OSDN Git Service

* Eclipse classpath no longer includes .svn folders
authorshadowislord <shadowislord@75d07b2b-3a1a-0410-a2c5-0572b91ccdca>
Fri, 30 Sep 2011 04:24:36 +0000 (04:24 +0000)
committershadowislord <shadowislord@75d07b2b-3a1a-0410-a2c5-0572b91ccdca>
Fri, 30 Sep 2011 04:24:36 +0000 (04:24 +0000)
 * Updated android.jar to 2.3
 * Add support for changing fullscreen mode in AndroidHarness
 * VBO now used by default for Android versions > 2.2
 * Fix wrong setting array type uniforms in android (e.g. Vector3Array)
 * Improved efficiency of setVertexAttrib in android by not creating iterator each time
 * Added method ParticleEmitter.killParticle()
 * Deleted useless com.jme3.renderer.layer package
 * Fix documentation of AppSettings.setCustomRenderer()
 * Fix SkyFactory on android (again!)
 * Deleted useless com.jme3.video package
 * Add KeyNames to get names of keyboard keys

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

engine/.classpath
engine/lib/android/android.jar
engine/src/android/com/jme3/app/AndroidHarness.java
engine/src/android/com/jme3/renderer/android/OGLESShaderRenderer.java
engine/src/core/com/jme3/effect/ParticleEmitter.java
engine/src/core/com/jme3/input/KeyNames.java [new file with mode: 0644]
engine/src/core/com/jme3/renderer/RenderContext.java
engine/src/core/com/jme3/system/AppSettings.java
engine/src/core/com/jme3/util/SkyFactory.java

index 365a083..a0756d0 100644 (file)
@@ -1,25 +1,25 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
 <classpath>\r
-       <classpathentry kind="src" path="src/core"/>\r
-       <classpathentry kind="src" path="src/core-data"/>\r
-       <classpathentry kind="src" path="src/core-plugins"/>\r
-       <classpathentry kind="src" path="src/desktop"/>\r
-       <classpathentry kind="src" path="src/desktop-fx"/>\r
-       <classpathentry kind="src" path="src/games"/>\r
-       <classpathentry kind="src" path="src/jbullet"/>\r
-       <classpathentry kind="src" path="src/jogg"/>\r
-       <classpathentry kind="src" path="src/lwjgl-oal"/>\r
-       <classpathentry kind="src" path="src/lwjgl-ogl"/>\r
-       <classpathentry kind="src" path="src/niftygui"/>\r
-       <classpathentry kind="src" path="src/ogre"/>\r
-       <classpathentry kind="src" path="src/pack"/>\r
-       <classpathentry kind="src" path="src/test"/>\r
-       <classpathentry kind="src" path="src/test-data"/>\r
-       <classpathentry kind="src" path="src/tools"/>\r
-       <classpathentry kind="src" path="src/xml"/>\r
-       <classpathentry kind="src" path="src/terrain"/>\r
-       <classpathentry kind="src" path="src/networking"/>\r
-       <classpathentry kind="src" path="src/blender"/>\r
+       <classpathentry excluding="**/.svn/*" kind="src" path="src/core"/>\r
+       <classpathentry excluding="**/.svn/*" kind="src" path="src/core-data"/>\r
+       <classpathentry excluding="**/.svn/*" kind="src" path="src/core-plugins"/>\r
+       <classpathentry excluding="**/.svn/*" kind="src" path="src/desktop"/>\r
+       <classpathentry excluding="**/.svn/*" kind="src" path="src/desktop-fx"/>\r
+       <classpathentry excluding="**/.svn/*" kind="src" path="src/games"/>\r
+       <classpathentry excluding="**/.svn/*" kind="src" path="src/jbullet"/>\r
+       <classpathentry excluding="**/.svn/*" kind="src" path="src/jogg"/>\r
+       <classpathentry excluding="**/.svn/*" kind="src" path="src/lwjgl-oal"/>\r
+       <classpathentry excluding="**/.svn/*" kind="src" path="src/lwjgl-ogl"/>\r
+       <classpathentry excluding="**/.svn/*" kind="src" path="src/niftygui"/>\r
+       <classpathentry excluding="**/.svn/*" kind="src" path="src/ogre"/>\r
+       <classpathentry excluding="**/.svn/*" kind="src" path="src/pack"/>\r
+       <classpathentry excluding="**/.svn/*" kind="src" path="src/test"/>\r
+       <classpathentry excluding="**/.svn/*" kind="src" path="src/test-data"/>\r
+       <classpathentry excluding="**/.svn/*" kind="src" path="src/tools"/>\r
+       <classpathentry excluding="**/.svn/*" kind="src" path="src/xml"/>\r
+       <classpathentry excluding="**/.svn/*" kind="src" path="src/terrain"/>\r
+       <classpathentry excluding="**/.svn/*" kind="src" path="src/networking"/>\r
+       <classpathentry excluding="**/.svn/*" kind="src" path="src/blender"/>\r
 \r
        <classpathentry kind="lib" path="lib/jbullet/asm-all-3.1.jar"/>\r
        <classpathentry kind="lib" path="lib/jbullet/jbullet.jar"/>\r
index 24ae563..ae040e6 100644 (file)
Binary files a/engine/lib/android/android.jar and b/engine/lib/android/android.jar differ
index d4f0cd3..f3f71dd 100644 (file)
@@ -74,6 +74,23 @@ 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."\r
      */\r
     protected String exitDialogMessage = "Use your home key to bring this app into the background or exit to terminate it.";\r
+    \r
+    /**\r
+     * Set the screen window size\r
+     * if screenFullSize is true, then the notification bar and title bar are\r
+     *   removed and the screen covers the entire display\r
+     * if screenFullSize is false, then the notification bar remains visible\r
+     *   if screenShowTitle is true while screenFullScreen is false, then the\r
+     *     title bar is also displayed under the notification bar\r
+     */\r
+    protected boolean screenFullScreen = true;\r
+    \r
+    /**\r
+     * if screenShowTitle is true while screenFullScreen is false, then the\r
+     *     title bar is also displayed under the notification bar\r
+     */\r
+    protected boolean screenShowTitle = true;\r
+    \r
     /**\r
      * Set the screen orientation, default is SENSOR\r
      * ActivityInfo.SCREEN_ORIENTATION_* constants\r
@@ -115,9 +132,15 @@ public class AndroidHarness extends Activity implements TouchListener, DialogInt
         JmeSystem.setResources(getResources());\r
         JmeSystem.setActivity(this);\r
 \r
-        requestWindowFeature(Window.FEATURE_NO_TITLE);\r
-        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,\r
-                WindowManager.LayoutParams.FLAG_FULLSCREEN);\r
+        if (screenFullScreen) {\r
+            requestWindowFeature(Window.FEATURE_NO_TITLE);\r
+            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,\r
+                    WindowManager.LayoutParams.FLAG_FULLSCREEN);\r
+        } else {\r
+            if (!screenShowTitle) {\r
+                requestWindowFeature(Window.FEATURE_NO_TITLE);\r
+            }\r
+        }\r
 \r
         setRequestedOrientation(screenOrientation);\r
 \r
index 44fd56d..a284c81 100644 (file)
@@ -81,6 +81,8 @@ import android.graphics.Bitmap;
 import android.opengl.GLES10;
 import android.opengl.GLES11;
 import android.opengl.GLES20;
+import android.os.Build;
+import java.util.ArrayList;
 
 public class OGLESShaderRenderer implements Renderer {
 
@@ -405,6 +407,12 @@ public class OGLESShaderRenderer implements Renderer {
 
 //     checkGLError();
 
+        if ("2.2".equals(Build.VERSION.RELEASE)) {
+            useVBO = false;
+        } else {
+            useVBO = true;
+        }
+        
         logger.log(Level.INFO, "Caps: {0}", caps);
     }
 
@@ -906,35 +914,35 @@ public class OGLESShaderRenderer implements Renderer {
                     logger.info("GLES20.glUniform1fv set FloatArray." + uniform.getName());
                 }
                 fb = (FloatBuffer) uniform.getValue();
-                GLES20.glUniform1fv(loc, 1, fb);
+                GLES20.glUniform1fv(loc, fb.capacity(), fb);
                 break;
             case Vector2Array:
                 if (verboseLogging) {
                     logger.info("GLES20.glUniform2fv set Vector2Array." + uniform.getName());
                 }
                 fb = (FloatBuffer) uniform.getValue();
-                GLES20.glUniform2fv(loc, 1, fb);
+                GLES20.glUniform2fv(loc, fb.capacity() / 2, fb);
                 break;
             case Vector3Array:
                 if (verboseLogging) {
                     logger.info("GLES20.glUniform3fv set Vector3Array." + uniform.getName());
                 }
                 fb = (FloatBuffer) uniform.getValue();
-                GLES20.glUniform3fv(loc, 1, fb);
+                GLES20.glUniform3fv(loc, fb.capacity() / 3, fb);
                 break;
             case Vector4Array:
                 if (verboseLogging) {
                     logger.info("GLES20.glUniform4fv set Vector4Array." + uniform.getName());
                 }
                 fb = (FloatBuffer) uniform.getValue();
-                GLES20.glUniform4fv(loc, 1, fb);
+                GLES20.glUniform4fv(loc, fb.capacity() / 4, fb);
                 break;
             case Matrix4Array:
                 if (verboseLogging) {
                     logger.info("GLES20.glUniform4fv set Matrix4Array." + uniform.getName());
                 }
                 fb = (FloatBuffer) uniform.getValue();
-                GLES20.glUniformMatrix4fv(loc, 1, false, fb);
+                GLES20.glUniformMatrix4fv(loc, fb.capacity() / 16, false, fb);
                 break;
             case Int:
                 if (verboseLogging) {
@@ -2426,7 +2434,7 @@ public class OGLESShaderRenderer implements Renderer {
                         convertFormat(vb.getFormat()),
                         vb.isNormalized(),
                         vb.getStride(),
-                        vb.getData());
+                        0);
 
                 attribs[loc] = vb;
             }
@@ -2479,7 +2487,7 @@ public class OGLESShaderRenderer implements Renderer {
 
         if (context.boundElementArrayVBO != bufId) {
             if (verboseLogging) {
-                logger.info("GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, " + bufId + ")");
+                logger.log(Level.INFO, "GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, {0})", bufId);
             }
 
             GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, bufId);
@@ -2523,7 +2531,7 @@ public class OGLESShaderRenderer implements Renderer {
                 } else {
                     indexBuf.getData().position(curOffset);
                     if (verboseLogging) {
-                        logger.info("glDrawElements(): " + elementLength + ", " + curOffset);
+                        logger.log(Level.INFO, "glDrawElements(): {0}, {1}", new Object[]{elementLength, curOffset});
                     }
 
                     GLES20.glDrawElements(elMode, elementLength, fmt, indexBuf.getData());
@@ -2554,7 +2562,7 @@ public class OGLESShaderRenderer implements Renderer {
                 indexData.clear();
 
                 if (verboseLogging) {
-                    logger.info("glDrawElements(), indexBuf.capacity (" + indexBuf.getData().capacity() + "), vertCount (" + vertCount + ")");
+                    logger.log(Level.INFO, "glDrawElements(), indexBuf.capacity ({0}), vertCount ({1})", new Object[]{indexBuf.getData().capacity(), vertCount});
                 }
 
                 GLES11.glDrawElements(
@@ -2591,7 +2599,7 @@ public class OGLESShaderRenderer implements Renderer {
     }
 
     public void updateVertexArray(Mesh mesh) {
-        logger.info("updateVertexArray(" + mesh + ")");
+        logger.log(Level.INFO, "updateVertexArray({0})", mesh);
         int id = mesh.getId();
         /*
         if (id == -1){
@@ -2613,9 +2621,9 @@ public class OGLESShaderRenderer implements Renderer {
             updateBufferData(interleavedData);
         }
 
-        IntMap<VertexBuffer> buffers = mesh.getBuffers();
-        for (Entry<VertexBuffer> entry : buffers) {
-            VertexBuffer vb = entry.getValue();
+        ArrayList<VertexBuffer> buffersList = mesh.getBufferList();
+        for (int i = 0; i < buffersList.size(); i++){
+            VertexBuffer vb = buffersList.get(i);
 
             if (vb.getBufferType() == Type.InterleavedData
                     || vb.getUsage() == Usage.CpuOnly // ignore cpu-only buffers
@@ -2674,7 +2682,8 @@ public class OGLESShaderRenderer implements Renderer {
             drawTriangleList_Array(indices, mesh, count);
         } else {
             if (verboseLogging) {
-                logger.info("GLES20.glDrawArrays(" + mesh.getMode() + ", " + 0 + ", " + mesh.getVertexCount() + ")");
+                logger.log(Level.INFO, "GLES20.glDrawArrays({0}, {1}, {2})", 
+                        new Object[]{mesh.getMode(), 0, mesh.getVertexCount()});
             }
 
             GLES20.glDrawArrays(convertElementMode(mesh.getMode()), 0, mesh.getVertexCount());
@@ -2685,7 +2694,8 @@ public class OGLESShaderRenderer implements Renderer {
 
     private void renderMeshDefault(Mesh mesh, int lod, int count) {
         if (verboseLogging) {
-            logger.info("renderMeshDefault(" + mesh + ", " + lod + ", " + count + ")");
+            logger.log(Level.INFO, "renderMeshDefault({0}, {1}, {2})", 
+                    new Object[]{mesh, lod, count});
         }
         VertexBuffer indices = null;
 
@@ -2722,7 +2732,8 @@ public class OGLESShaderRenderer implements Renderer {
         } else {
 //            throw new UnsupportedOperationException("Cannot render without index buffer");
             if (verboseLogging) {
-                logger.info("GLES20.glDrawArrays(" + convertElementMode(mesh.getMode()) + ", 0, " + mesh.getVertexCount() + ")");
+                logger.log(Level.INFO, "GLES20.glDrawArrays({0}, 0, {1})", 
+                        new Object[]{convertElementMode(mesh.getMode()), mesh.getVertexCount()});
             }
 
             GLES20.glDrawArrays(convertElementMode(mesh.getMode()), 0, mesh.getVertexCount());
@@ -2735,7 +2746,7 @@ public class OGLESShaderRenderer implements Renderer {
         if (context.pointSize != mesh.getPointSize()) {
 
             if (verboseLogging) {
-                logger.info("GLES10.glPointSize(" + mesh.getPointSize() + ")");
+                logger.log(Level.INFO, "GLES10.glPointSize({0})", mesh.getPointSize());
             }
 
             GLES10.glPointSize(mesh.getPointSize());
@@ -2744,7 +2755,7 @@ public class OGLESShaderRenderer implements Renderer {
         if (context.lineWidth != mesh.getLineWidth()) {
 
             if (verboseLogging) {
-                logger.info("GLES20.glLineWidth(" + mesh.getLineWidth() + ")");
+                logger.log(Level.INFO, "GLES20.glLineWidth({0})", mesh.getLineWidth());
             }
 
             GLES20.glLineWidth(mesh.getLineWidth());
@@ -2776,7 +2787,7 @@ public class OGLESShaderRenderer implements Renderer {
     private void checkGLError() {
         int error;
         while ((error = GLES20.glGetError()) != GLES20.GL_NO_ERROR) {
-            logger.warning("glError " + error);
+            logger.log(Level.WARNING, "glError {0}", error);
             // throw new RuntimeException("glError " + error);
         }
     }
@@ -2794,7 +2805,7 @@ public class OGLESShaderRenderer implements Renderer {
      */
     public void drawTriangleList_Array(VertexBuffer indexBuf, Mesh mesh, int count) {
         if (verboseLogging) {
-            logger.info("drawTriangleList_Array(Count = " + count + ")");
+            logger.log(Level.INFO, "drawTriangleList_Array(Count = {0})", count);
         }
 
         if (indexBuf.getBufferType() != VertexBuffer.Type.Index) {
@@ -2831,17 +2842,16 @@ public class OGLESShaderRenderer implements Renderer {
 
                 indexBuf.getData().position(curOffset);
                 if (verboseLogging) {
-                    logger.info("glDrawElements(): " + elementLength + ", " + curOffset);
+                    logger.log(Level.INFO, "glDrawElements(): {0}, {1}", new Object[]{elementLength, curOffset});
                 }
 
                 GLES20.glDrawElements(elMode, elementLength, fmt, indexBuf.getData());
 
                 curOffset += elementLength * elSize;
             }
-        } else //if (mesh.getMode() == Mode.Hybrid)
-        {
+        } else {
             if (verboseLogging) {
-                logger.info("glDrawElements(), indexBuf.capacity (" + indexBuf.getData().capacity() + "), vertCount (" + vertCount + ")");
+                logger.log(Level.INFO, "glDrawElements(), indexBuf.capacity ({0}), vertCount ({1})", new Object[]{indexBuf.getData().capacity(), vertCount});
             }
 
             GLES20.glDrawElements(
@@ -2859,7 +2869,7 @@ public class OGLESShaderRenderer implements Renderer {
      */
     public void setVertexAttrib_Array(VertexBuffer vb, VertexBuffer idb) {
         if (verboseLogging) {
-            logger.info("setVertexAttrib_Array(" + vb + ", " + idb + ")");
+            logger.log(Level.INFO, "setVertexAttrib_Array({0}, {1})", new Object[]{vb, idb});
         }
 
         if (vb.getBufferType() == VertexBuffer.Type.Index) {
@@ -2876,21 +2886,21 @@ public class OGLESShaderRenderer implements Renderer {
             if (loc == -1) {
                 //throw new IllegalArgumentException("Location is invalid for attrib: [" + vb.getBufferType().name() + "]");
                 if (verboseLogging) {
-                    logger.warning("attribute is invalid in shader: [" + vb.getBufferType().name() + "]");
+                    logger.log(Level.WARNING, "attribute is invalid in shader: [{0}]", vb.getBufferType().name());
                 }
                 return;
             } else if (loc == -2) {
                 String attributeName = "in" + vb.getBufferType().name();
 
                 if (verboseLogging) {
-                    logger.info("GLES20.glGetAttribLocation(" + programId + ", " + attributeName + ")");
+                    logger.log(Level.INFO, "GLES20.glGetAttribLocation({0}, {1})", new Object[]{programId, attributeName});
                 }
 
                 loc = GLES20.glGetAttribLocation(programId, attributeName);
                 if (loc < 0) {
                     attrib.setLocation(-1);
                     if (verboseLogging) {
-                        logger.warning("attribute is invalid in shader: [" + vb.getBufferType().name() + "]");
+                        logger.log(Level.WARNING, "attribute is invalid in shader: [{0}]", vb.getBufferType().name());
                     }
                     return; // not available in shader.
                 } else {
@@ -2906,13 +2916,19 @@ public class OGLESShaderRenderer implements Renderer {
                 avb.getData().position(vb.getOffset());
 
                 if (verboseLogging) {
-                    logger.info("GLES20.glVertexAttribPointer("
-                            + "location=" + loc + ", "
-                            + "numComponents=" + vb.getNumComponents() + ", "
-                            + "format=" + vb.getFormat() + ", "
-                            + "isNormalized=" + vb.isNormalized() + ", "
-                            + "stride=" + vb.getStride() + ", "
-                            + "data.capacity=" + avb.getData().capacity() + ")");
+                    logger.log(Level.INFO,
+                            "GLES20.glVertexAttribPointer(" + 
+                            "location={0}, " +
+                            "numComponents={1}, " +
+                            "format={2}, " + 
+                            "isNormalized={3}, " + 
+                            "stride={4}, " + 
+                            "data.capacity={5})", 
+                            new Object[]{loc, vb.getNumComponents(), 
+                                         vb.getFormat(), 
+                                         vb.isNormalized(), 
+                                         vb.getStride(), 
+                                         avb.getData().capacity()});
                 }
 
 
index df580c7..6e20602 100644 (file)
@@ -569,22 +569,6 @@ public class ParticleEmitter extends Geometry {
     }
 
     /**
-     * This method sets the gravity value of Y axis.
-     * 
-     * By default the Y axis is the only one to have gravity value non zero.
-     * 
-     * @param gravity
-     *        Set the gravity of Y axis, in units/sec/sec, of particles
-     *        spawned.
-     * 
-     * @deprecated Use {@link ParticleEmitter#setGravity(float, float, float) instead.
-     */
-    @Deprecated
-    public void setGravity(float gravity) {
-        this.gravity.y = gravity;
-    }
-
-    /**
      * Get the gravity vector.
      * 
      * @return the gravity vector.
@@ -836,31 +820,7 @@ public class ParticleEmitter extends Geometry {
         this.particleInfluencer.setVelocityVariation(variation);
     }
 
-//    private int newIndex(){
-//        liveParticles ++;
-//        return unusedIndices.remove(0);
-//        if (unusedIndices.size() > 0){
-//            liveParticles++;
-//            return unusedIndices.remove(0);
-//        }else if (next < particles.length){
-//            liveParticles++;
-//            return next++;
-//        }else{
-//            return -1;
-//        }
-//    }
-//    private void freeIndex(int index){
-//        liveParticles--;
-//        if (index == next-1)
-//            next--;
-//        else
-//        assert !unusedIndices.contains(index);
-//        unusedIndices.add(index);
-//    }
     private Particle emitParticle(Vector3f min, Vector3f max) {
-//        int idx = newIndex();
-//        if (idx == -1)
-//            return false;
         int idx = lastUsed + 1;
         if (idx >= particles.length) {
             return null;
@@ -943,6 +903,16 @@ public class ParticleEmitter extends Geometry {
             }
         }
     }
+    
+    /**
+     * Kills the particle at the given index.
+     * 
+     * @param index The index of the particle to kill
+     * @see #getParticles() 
+     */
+    public void killParticle(int index){
+        freeParticle(index);
+    }
 
     private void freeParticle(int idx) {
         Particle p = particles[idx];
@@ -953,8 +923,6 @@ public class ParticleEmitter extends Geometry {
         p.angle = 0;
         p.rotateSpeed = 0;
 
-//        freeIndex(idx);
-
         if (idx == lastUsed) {
             while (lastUsed >= 0 && particles[lastUsed].life == 0) {
                 lastUsed--;
diff --git a/engine/src/core/com/jme3/input/KeyNames.java b/engine/src/core/com/jme3/input/KeyNames.java
new file mode 100644 (file)
index 0000000..89490c0
--- /dev/null
@@ -0,0 +1,153 @@
+package com.jme3.input;
+
+import static com.jme3.input.KeyInput.*;
+
+public class KeyNames {
+    
+    private static final String[] KEY_NAMES = new String[0xFF];
+    
+    static {
+        KEY_NAMES[KEY_0] = "0";
+        KEY_NAMES[KEY_1] = "1";
+        KEY_NAMES[KEY_2] = "2";
+        KEY_NAMES[KEY_3] = "3";
+        KEY_NAMES[KEY_4] = "4";
+        KEY_NAMES[KEY_5] = "5";
+        KEY_NAMES[KEY_6] = "6";
+        KEY_NAMES[KEY_7] = "7";
+        KEY_NAMES[KEY_8] = "8";
+        KEY_NAMES[KEY_9] = "9";
+        
+        KEY_NAMES[KEY_Q] = "Q";
+        KEY_NAMES[KEY_W] = "W";
+        KEY_NAMES[KEY_E] = "E";
+        KEY_NAMES[KEY_R] = "R";
+        KEY_NAMES[KEY_T] = "T";
+        KEY_NAMES[KEY_Y] = "Y";
+        KEY_NAMES[KEY_U] = "U";
+        KEY_NAMES[KEY_I] = "I";
+        KEY_NAMES[KEY_O] = "O";
+        KEY_NAMES[KEY_P] = "P";
+        KEY_NAMES[KEY_A] = "A";
+        KEY_NAMES[KEY_S] = "S";
+        KEY_NAMES[KEY_D] = "D";
+        KEY_NAMES[KEY_F] = "F";
+        KEY_NAMES[KEY_G] = "G";
+        KEY_NAMES[KEY_H] = "H";
+        KEY_NAMES[KEY_J] = "J";
+        KEY_NAMES[KEY_K] = "K";
+        KEY_NAMES[KEY_L] = "L";
+        KEY_NAMES[KEY_Z] = "Z";
+        KEY_NAMES[KEY_X] = "X";
+        KEY_NAMES[KEY_C] = "C";
+        KEY_NAMES[KEY_V] = "V";
+        KEY_NAMES[KEY_B] = "B";
+        KEY_NAMES[KEY_N] = "N";
+        KEY_NAMES[KEY_M] = "M";
+        
+        KEY_NAMES[KEY_F1] = "F1";
+        KEY_NAMES[KEY_F2] = "F2";
+        KEY_NAMES[KEY_F3] = "F3";
+        KEY_NAMES[KEY_F4] = "F4";
+        KEY_NAMES[KEY_F5] = "F5";
+        KEY_NAMES[KEY_F6] = "F6";
+        KEY_NAMES[KEY_F7] = "F7";
+        KEY_NAMES[KEY_F8] = "F8";
+        KEY_NAMES[KEY_F9] = "F9";
+        KEY_NAMES[KEY_F10] = "F10";
+        KEY_NAMES[KEY_F11] = "F11";
+        KEY_NAMES[KEY_F12] = "F12";
+        KEY_NAMES[KEY_F13] = "F13";
+        KEY_NAMES[KEY_F14] = "F14";
+        KEY_NAMES[KEY_F15] = "F15";
+        
+        KEY_NAMES[KEY_NUMPAD0] = "Numpad 0";
+        KEY_NAMES[KEY_NUMPAD1] = "Numpad 1";
+        KEY_NAMES[KEY_NUMPAD2] = "Numpad 2";
+        KEY_NAMES[KEY_NUMPAD3] = "Numpad 3";
+        KEY_NAMES[KEY_NUMPAD4] = "Numpad 4";
+        KEY_NAMES[KEY_NUMPAD5] = "Numpad 5";
+        KEY_NAMES[KEY_NUMPAD6] = "Numpad 6";
+        KEY_NAMES[KEY_NUMPAD7] = "Numpad 7";
+        KEY_NAMES[KEY_NUMPAD8] = "Numpad 8";
+        KEY_NAMES[KEY_NUMPAD9] = "Numpad 9";
+        
+        KEY_NAMES[KEY_NUMPADEQUALS] = "Numpad =";
+        KEY_NAMES[KEY_NUMPADENTER] = "Numpad Enter";
+        KEY_NAMES[KEY_NUMPADCOMMA] = "Numpad .";
+        KEY_NAMES[KEY_DIVIDE] = "Numpad /";
+        
+        
+        KEY_NAMES[KEY_LMENU] = "Left Alt";
+        KEY_NAMES[KEY_RMENU] = "Right Alt";
+        
+        KEY_NAMES[KEY_LCONTROL] = "Left Ctrl";
+        KEY_NAMES[KEY_RCONTROL] = "Right Ctrl";
+        
+        KEY_NAMES[KEY_LSHIFT] = "Left Shift";
+        KEY_NAMES[KEY_RSHIFT] = "Right Shift";
+        
+        KEY_NAMES[KEY_LMETA] = "Left Option";
+        KEY_NAMES[KEY_RMETA] = "Right Option";
+        
+        KEY_NAMES[KEY_MINUS] = "-";
+        KEY_NAMES[KEY_EQUALS] = "=";
+        KEY_NAMES[KEY_LBRACKET] = "[";
+        KEY_NAMES[KEY_RBRACKET] = "]";
+        KEY_NAMES[KEY_SEMICOLON] = ";";
+        KEY_NAMES[KEY_APOSTROPHE] = "'";
+        KEY_NAMES[KEY_GRAVE] = "`";
+        KEY_NAMES[KEY_BACKSLASH] = "\\";
+        KEY_NAMES[KEY_COMMA] = ",";
+        KEY_NAMES[KEY_PERIOD] = ".";
+        KEY_NAMES[KEY_SLASH] = "/";
+        KEY_NAMES[KEY_MULTIPLY] = "*";
+        KEY_NAMES[KEY_ADD] = "+";
+        KEY_NAMES[KEY_COLON] = ":";
+        KEY_NAMES[KEY_UNDERLINE] = "_";
+        KEY_NAMES[KEY_AT] = "@";
+        
+        KEY_NAMES[KEY_APPS] = "Apps";
+        KEY_NAMES[KEY_POWER] = "Power";
+        KEY_NAMES[KEY_SLEEP] = "Sleep";
+        
+        KEY_NAMES[KEY_STOP] = "Stop";
+        KEY_NAMES[KEY_ESCAPE] = "Esc";
+        KEY_NAMES[KEY_RETURN] = "Enter";
+        KEY_NAMES[KEY_SPACE] = "Space";
+        KEY_NAMES[KEY_BACK] = "Backspace";
+        KEY_NAMES[KEY_TAB] = "Tab";
+        
+        KEY_NAMES[KEY_SYSRQ] = "SysEq";
+        KEY_NAMES[KEY_PAUSE] = "Pause";
+        
+        KEY_NAMES[KEY_HOME] = "Home";
+        KEY_NAMES[KEY_PGUP] = "Page Up";
+        KEY_NAMES[KEY_PGDN] = "Page Down";
+        KEY_NAMES[KEY_END] = "End";
+        KEY_NAMES[KEY_INSERT] = "Insert";
+        KEY_NAMES[KEY_DELETE] = "Delete";
+        
+        KEY_NAMES[KEY_UP] = "Up";
+        KEY_NAMES[KEY_LEFT] = "Left";
+        KEY_NAMES[KEY_RIGHT] = "Right";
+        KEY_NAMES[KEY_DOWN] = "Down";
+        
+        KEY_NAMES[KEY_NUMLOCK] = "Num Lock";
+        KEY_NAMES[KEY_CAPITAL] = "Caps Lock";
+        KEY_NAMES[KEY_SCROLL] = "Scroll Lock";
+        
+        KEY_NAMES[KEY_KANA] = "Kana";
+        KEY_NAMES[KEY_CONVERT] = "Convert";
+        KEY_NAMES[KEY_NOCONVERT] = "No Convert";
+        KEY_NAMES[KEY_YEN] = "Yen";
+        KEY_NAMES[KEY_CIRCUMFLEX] = "Circumflex";
+        KEY_NAMES[KEY_KANJI] = "Kanji";
+        KEY_NAMES[KEY_AX] = "Ax";
+        KEY_NAMES[KEY_UNLABELED] = "Unlabeled";
+    }
+    
+    public String getName(int keyId){
+        return KEY_NAMES[keyId];
+    }
+}
index 6e3b396..426a405 100644 (file)
@@ -32,7 +32,6 @@
 
 package com.jme3.renderer;
 
-import com.jme3.material.Material;
 import com.jme3.material.RenderState;
 import com.jme3.scene.Mesh;
 import com.jme3.scene.VertexBuffer;
index c6f47ae..4024254 100644 (file)
@@ -400,11 +400,11 @@ public final class AppSettings extends HashMap<String, Object> {
 
     /**
      * Set a custom graphics renderer to use. The class should implement 
-     * the {@link Renderer} interface.
-     * @param clazz The custom graphics renderer class.
+     * the {@link JmeContext} interface.
+     * @param clazz The custom context class.
      * (Default: not set)
      */
-    public void setCustomRenderer(Class clazz){
+    public void setCustomRenderer(Class<? extends JmeContext> clazz){
         put("Renderer", "CUSTOM" + clazz.getName());
     }
 
index 7a48803..2808696 100644 (file)
@@ -114,6 +114,8 @@ public class SkyFactory {
 
         Format fmt = images[0].getFormat();
         int width = images[0].getWidth();
+        int height = images[0].getHeight();
+        
         ByteBuffer data = images[0].getData(0);
         int size = data != null ? data.capacity() : 0;
 
@@ -125,12 +127,14 @@ public class SkyFactory {
             if (image.getFormat() != fmt) {
                 throw new IllegalArgumentException("Images must have same format");
             }
-            if (image.getWidth() != width) {
+            if (image.getWidth() != width || image.getHeight() != height)  {
                 throw new IllegalArgumentException("Images must have same resolution");
             }
             ByteBuffer data2 = image.getData(0);
-            if (data2.capacity() != size) {
-                throw new IllegalArgumentException("Images must have same size");
+            if (data2 != null){
+                if (data2.capacity() != size) {
+                    throw new IllegalArgumentException("Images must have same size");
+                }
             }
         }
     }