Prechádzať zdrojové kódy

* Fix BillboardControl "Spatial was not updated before rendering" crash
* Add F5 key to hide FPS/stats

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

sha..rd 14 rokov pred
rodič
commit
87737f96e0

+ 9 - 2
engine/src/core/com/jme3/app/SimpleApplication.java

@@ -68,6 +68,7 @@ public abstract class SimpleApplication extends Application {
     public static final String INPUT_MAPPING_EXIT = "SIMPLEAPP_Exit";
     public static final String INPUT_MAPPING_CAMERA_POS = "SIMPLEAPP_CameraPos";
     public static final String INPUT_MAPPING_MEMORY = "SIMPLEAPP_Memory";
+    public static final String INPUT_MAPPING_HIDE_STATS = "SIMPLEAPP_HideStats";
                                                                          
     protected Node rootNode = new Node("Root Node");
     protected Node guiNode = new Node("Gui Node");
@@ -79,7 +80,7 @@ public abstract class SimpleApplication extends Application {
     protected boolean showSettings = true;
     private  boolean showFps = true;
     private AppActionListener actionListener = new AppActionListener();
-
+    
     private class AppActionListener implements ActionListener {
 
         public void onAction(String name, boolean value, float tpf) {
@@ -100,6 +101,10 @@ public abstract class SimpleApplication extends Application {
                 }
             } else if (name.equals(INPUT_MAPPING_MEMORY)) {
                 BufferUtils.printCurrentDirectMemory(null);
+            }else if (name.equals(INPUT_MAPPING_HIDE_STATS)){
+                boolean show = showFps;
+                setDisplayFps(!show);
+                setDisplayStatView(!show);
             }
         }
     }
@@ -215,8 +220,10 @@ public abstract class SimpleApplication extends Application {
 
             inputManager.addMapping(INPUT_MAPPING_CAMERA_POS, new KeyTrigger(KeyInput.KEY_C));
             inputManager.addMapping(INPUT_MAPPING_MEMORY, new KeyTrigger(KeyInput.KEY_M));
+            inputManager.addMapping(INPUT_MAPPING_HIDE_STATS, new KeyTrigger(KeyInput.KEY_F5));
             inputManager.addListener(actionListener, INPUT_MAPPING_EXIT,
-                    INPUT_MAPPING_CAMERA_POS, INPUT_MAPPING_MEMORY);
+                    INPUT_MAPPING_CAMERA_POS, INPUT_MAPPING_MEMORY, INPUT_MAPPING_HIDE_STATS);
+            
         }
 
         // call user code

+ 16 - 7
engine/src/core/com/jme3/scene/control/BillboardControl.java

@@ -80,9 +80,6 @@ public class BillboardControl extends AbstractControl {
         AxialZ;
     }
 
- 
-
-
     public BillboardControl() {
         super();
         orient = new Matrix3f();
@@ -107,6 +104,18 @@ public class BillboardControl extends AbstractControl {
         Camera cam = vp.getCamera();
         rotateBillboard(cam);
     }
+    
+    private void fixRefreshFlags(){
+        // force transforms to update below this node
+        spatial.updateGeometricState();
+        
+        // force world bound to update
+        Spatial rootNode = spatial;
+        while (rootNode.getParent() != null){
+            rootNode = rootNode.getParent();
+        }
+        rootNode.getWorldBound(); 
+    }
 
     /**
      * rotate the billboard based on the type set
@@ -168,7 +177,7 @@ public class BillboardControl extends AbstractControl {
         // The billboard must be oriented to face the camera before it is
         // transformed into the world.
         spatial.setLocalRotation(orient);
-        spatial.updateGeometricState();
+        fixRefreshFlags();
     }
 
     /**
@@ -188,10 +197,10 @@ public class BillboardControl extends AbstractControl {
         Quaternion rot=new Quaternion().fromRotationMatrix(orient);
         if ( parent != null ) {
             rot =  parent.getWorldRotation().inverse().multLocal(rot);
-            rot.normalize();
+            rot.normalizeLocal();
         }
         spatial.setLocalRotation(rot);
-        spatial.updateGeometricState();
+        fixRefreshFlags();
     }
 
     /**
@@ -256,7 +265,7 @@ public class BillboardControl extends AbstractControl {
         // The billboard must be oriented to face the camera before it is
         // transformed into the world.
         spatial.setLocalRotation(orient);
-        spatial.updateGeometricState();
+        fixRefreshFlags();
     }
 
     /**