OSDN Git Service

- added LightNode
authorremy.bouquet@gmail.com <remy.bouquet@gmail.com@75d07b2b-3a1a-0410-a2c5-0572b91ccdca>
Wed, 20 Apr 2011 17:21:08 +0000 (17:21 +0000)
committerremy.bouquet@gmail.com <remy.bouquet@gmail.com@75d07b2b-3a1a-0410-a2c5-0572b91ccdca>
Wed, 20 Apr 2011 17:21:08 +0000 (17:21 +0000)
- used tempVars to avoid Vector3f and Quaternion instancing in update method of CameraControl.

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

engine/src/core/com/jme3/scene/LightNode.java [new file with mode: 0644]
engine/src/core/com/jme3/scene/control/CameraControl.java
engine/src/core/com/jme3/scene/control/LightControl.java [new file with mode: 0644]
engine/src/test/jme3test/light/TestLightNode.java [new file with mode: 0644]

diff --git a/engine/src/core/com/jme3/scene/LightNode.java b/engine/src/core/com/jme3/scene/LightNode.java
new file mode 100644 (file)
index 0000000..fe4cea2
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2009-2010 jMonkeyEngine
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
+ *   may be used to endorse or promote products derived from this software
+ *   without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.jme3.scene;
+
+import com.jme3.light.Light;
+import com.jme3.scene.control.LightControl;
+import com.jme3.scene.control.LightControl.ControlDirection;
+
+/**
+ * This Node is a shorthand for using a CameraControl.
+ *
+ * @author Tim8Dev
+ */
+public class LightNode extends Node {
+
+    private LightControl lightControl;
+
+    /**
+     * for IO purpose
+     */
+    public LightNode() {
+    }
+
+    public LightNode(String name, Light light) {
+        this(name, new LightControl(light));
+    }
+
+    public LightNode(String name, LightControl control) {
+        super(name);
+        addControl(control);
+        lightControl = control;
+    }
+
+    public void setEnabled(boolean enabled) {
+        lightControl.setEnabled(enabled);
+    }
+
+    public boolean isEnabled() {
+        return lightControl.isEnabled();
+    }
+
+    public void setControlDir(ControlDirection controlDir) {
+        lightControl.setControlDir(controlDir);
+    }
+
+    public void setCamera(Light light) {
+        lightControl.setLight(light);
+    }
+
+    public ControlDirection getControlDir() {
+        return lightControl.getControlDir();
+    }
+
+    public Light getCamera() {
+        return lightControl.getLight();
+    }
+}
index b81a3b8..602323f 100644 (file)
@@ -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.scene.control;
 
 import com.jme3.export.JmeExporter;
@@ -40,6 +39,7 @@ import com.jme3.renderer.Camera;
 import com.jme3.renderer.RenderManager;
 import com.jme3.renderer.ViewPort;
 import com.jme3.scene.Spatial;
+import com.jme3.util.TempVars;
 import java.io.IOException;
 
 /**
@@ -49,8 +49,9 @@ import java.io.IOException;
  * @author tim
  */
 public class CameraControl extends AbstractControl {
-    
+
     public static enum ControlDirection {
+
         /**
          * Means, that the Camera's transform is "copied"
          * to the Transform of the Spatial.
@@ -62,14 +63,14 @@ public class CameraControl extends AbstractControl {
          */
         SpatialToCamera;
     }
-
     private Camera camera;
     private ControlDirection controlDir = ControlDirection.CameraToSpatial;
 
     /**
      * Constructor used for Serialization.
      */
-    public CameraControl() {}
+    public CameraControl() {
+    }
 
     /**
      * @param camera The Camera to be synced.
@@ -103,11 +104,10 @@ public class CameraControl extends AbstractControl {
     }
 
     // fields used, when inversing ControlDirection:
-
     @Override
     protected void controlUpdate(float tpf) {
-        if(spatial != null && camera != null) {
-            switch(controlDir) {
+        if (spatial != null && camera != null) {
+            switch (controlDir) {
                 case SpatialToCamera:
                     camera.setLocation(spatial.getWorldTranslation());
                     camera.setRotation(spatial.getWorldRotation());
@@ -115,12 +115,16 @@ public class CameraControl extends AbstractControl {
                 case CameraToSpatial:
                     // set the localtransform, so that the worldtransform would be equal to the camera's transform.
                     // Location:
-                    Vector3f vecDiff = camera.getLocation().subtract(spatial.getWorldTranslation());
-                    spatial.getLocalTranslation().addLocal(vecDiff);
+                    TempVars vars = TempVars.get();
+                    assert vars.lock();
+
+                    Vector3f vecDiff = vars.vect1.set(camera.getLocation()).subtractLocal(spatial.getWorldTranslation());
+                    spatial.setLocalTranslation(vecDiff.addLocal(spatial.getLocalTranslation()));
 
                     // Rotation:
-                    Quaternion worldDiff = camera.getRotation().subtract(spatial.getWorldRotation());
-                    spatial.getLocalRotation().addLocal(worldDiff);
+                    Quaternion worldDiff = vars.quat1.set(camera.getRotation()).subtractLocal(spatial.getWorldRotation());
+                    spatial.setLocalRotation(worldDiff.addLocal(spatial.getLocalRotation()));
+                    assert vars.unlock();
                     break;
             }
         }
@@ -138,9 +142,8 @@ public class CameraControl extends AbstractControl {
         control.setEnabled(isEnabled());
         return control;
     }
-
     private static final String CONTROL_DIR_NAME = "controlDir";
-    
+
     @Override
     public void read(JmeImporter im) throws IOException {
         super.read(im);
@@ -154,5 +157,4 @@ public class CameraControl extends AbstractControl {
         ex.getCapsule(this).write(controlDir, CONTROL_DIR_NAME,
                 ControlDirection.SpatialToCamera);
     }
-
 }
\ No newline at end of file
diff --git a/engine/src/core/com/jme3/scene/control/LightControl.java b/engine/src/core/com/jme3/scene/control/LightControl.java
new file mode 100644 (file)
index 0000000..a0fcfca
--- /dev/null
@@ -0,0 +1,195 @@
+/*
+ * Copyright (c) 2009-2010 jMonkeyEngine
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
+ *   may be used to endorse or promote products derived from this software
+ *   without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package com.jme3.scene.control;
+
+import com.jme3.export.JmeExporter;
+import com.jme3.export.JmeImporter;
+import com.jme3.light.DirectionalLight;
+import com.jme3.light.Light;
+import com.jme3.light.PointLight;
+import com.jme3.math.Quaternion;
+import com.jme3.math.Vector3f;
+import com.jme3.renderer.Camera;
+import com.jme3.renderer.RenderManager;
+import com.jme3.renderer.ViewPort;
+import com.jme3.scene.Spatial;
+import com.jme3.util.TempVars;
+import java.io.IOException;
+
+/**
+ * This Control maintains a reference to a Camera,
+ * which will be synched with the position (worldTranslation)
+ * of the current spatial.
+ * @author tim
+ */
+public class LightControl extends AbstractControl {
+
+    public static enum ControlDirection {
+
+        /**
+         * Means, that the Light's transform is "copied"
+         * to the Transform of the Spatial.
+         */
+        LightToSpatial,
+        /**
+         * Means, that the Spatial's transform is "copied"
+         * to the Transform of the light.
+         */
+        SpatialToLight;
+    }
+    private Light light;
+    private ControlDirection controlDir = ControlDirection.SpatialToLight;
+
+    /**
+     * Constructor used for Serialization.
+     */
+    public LightControl() {
+    }
+
+    /**
+     * @param camera The Camera to be synced.
+     */
+    public LightControl(Light light) {
+        this.light = light;
+    }
+
+    /**
+     * @param camera The Camera to be synced.
+     */
+    public LightControl(Light light, ControlDirection controlDir) {
+        this.light = light;
+        this.controlDir = controlDir;
+    }
+
+    public Light getLight() {
+        return light;
+    }
+
+    public void setLight(Light light) {
+        this.light = light;
+    }
+
+    public ControlDirection getControlDir() {
+        return controlDir;
+    }
+
+    public void setControlDir(ControlDirection controlDir) {
+        this.controlDir = controlDir;
+    }
+
+    // fields used, when inversing ControlDirection:
+    @Override
+    protected void controlUpdate(float tpf) {
+        if (spatial != null && light != null) {
+            switch (controlDir) {
+                case SpatialToLight:
+                    spatialTolight(light);
+                    break;
+                case LightToSpatial:
+                    lightToSpatial(light);
+                    break;
+            }
+        }
+    }
+
+    private void spatialTolight(Light light) {
+        if (light instanceof PointLight) {
+            ((PointLight) light).setPosition(spatial.getWorldTranslation());
+        }
+        TempVars vars = TempVars.get();
+        assert vars.lock();
+
+        if (light instanceof DirectionalLight) {
+            ((DirectionalLight) light).setDirection(vars.vect1.set(spatial.getWorldTranslation()).multLocal(-1.0f));
+        }
+        assert vars.unlock();
+        //TODO add code for Spot light here when it's done
+//        if( light instanceof SpotLight){
+//            ((SpotLight)light).setPosition(spatial.getWorldTranslation());                
+//            ((SpotLight)light).setRotation(spatial.getWorldRotation());
+//        }
+
+    }
+
+    private void lightToSpatial(Light light) {
+        TempVars vars = TempVars.get();
+        assert vars.lock();
+        if (light instanceof PointLight) {
+
+            PointLight pLight = (PointLight) light;
+
+            Vector3f vecDiff = vars.vect1.set(pLight.getPosition()).subtractLocal(spatial.getWorldTranslation());
+            spatial.setLocalTranslation(vecDiff.addLocal(spatial.getLocalTranslation()));
+            assert vars.unlock();
+
+        }
+
+        if (light instanceof DirectionalLight) {
+            DirectionalLight dLight = (DirectionalLight) light;
+            vars.vect1.set(dLight.getDirection()).multLocal(-1.0f);
+            Vector3f vecDiff = vars.vect1.subtractLocal(spatial.getWorldTranslation());
+            spatial.setLocalTranslation(vecDiff.addLocal(spatial.getLocalTranslation()));
+        }
+        assert vars.unlock();
+        //TODO add code for Spot light here when it's done
+
+
+    }
+
+    @Override
+    protected void controlRender(RenderManager rm, ViewPort vp) {
+        // nothing to do
+    }
+
+    @Override
+    public Control cloneForSpatial(Spatial newSpatial) {
+        LightControl control = new LightControl(light, controlDir);
+        control.setSpatial(newSpatial);
+        control.setEnabled(isEnabled());
+        return control;
+    }
+    private static final String CONTROL_DIR_NAME = "controlDir";
+
+    @Override
+    public void read(JmeImporter im) throws IOException {
+        super.read(im);
+        im.getCapsule(this).readEnum(CONTROL_DIR_NAME,
+                ControlDirection.class, ControlDirection.SpatialToLight);
+    }
+
+    @Override
+    public void write(JmeExporter ex) throws IOException {
+        super.write(ex);
+        ex.getCapsule(this).write(controlDir, CONTROL_DIR_NAME,
+                ControlDirection.SpatialToLight);
+    }
+}
\ No newline at end of file
diff --git a/engine/src/test/jme3test/light/TestLightNode.java b/engine/src/test/jme3test/light/TestLightNode.java
new file mode 100644 (file)
index 0000000..955f24f
--- /dev/null
@@ -0,0 +1,111 @@
+/*
+ * Copyright (c) 2009-2010 jMonkeyEngine
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ *
+ * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
+ *   may be used to endorse or promote products derived from this software
+ *   without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package jme3test.light;
+
+import com.jme3.app.SimpleApplication;
+import com.jme3.light.DirectionalLight;
+import com.jme3.light.PointLight;
+import com.jme3.material.Material;
+import com.jme3.math.ColorRGBA;
+import com.jme3.math.FastMath;
+import com.jme3.math.Vector3f;
+import com.jme3.scene.Geometry;
+import com.jme3.scene.LightNode;
+import com.jme3.scene.Node;
+import com.jme3.scene.shape.Sphere;
+import com.jme3.scene.shape.Torus;
+
+public class TestLightNode extends SimpleApplication {
+
+    float angle;
+    Node movingNode;
+
+    public static void main(String[] args){
+        TestLightNode app = new TestLightNode();
+        app.start();
+    }
+
+    @Override
+    public void simpleInitApp() {
+        Torus torus = new Torus(10, 6, 1, 3);
+//        Torus torus = new Torus(50, 30, 1, 3);
+        Geometry g = new Geometry("Torus Geom", torus);
+        g.rotate(-FastMath.HALF_PI, 0, 0);
+        g.center();
+//        g.move(0, 1, 0);
+        
+        Material mat = new Material(assetManager, "Common/MatDefs/Light/Lighting.j3md");
+        mat.setFloat("Shininess", 32f);
+        mat.setBoolean("UseMaterialColors", true);
+        mat.setColor("Ambient",  ColorRGBA.Black);
+        mat.setColor("Diffuse",  ColorRGBA.White);
+        mat.setColor("Specular", ColorRGBA.White);
+//        mat.setBoolean("VertexLighting", true);
+//        mat.setBoolean("LowQuality", true);
+        g.setMaterial(mat);
+
+        rootNode.attachChild(g);
+
+        Geometry lightMdl = new Geometry("Light", new Sphere(10, 10, 0.1f));
+        lightMdl.setMaterial(assetManager.loadMaterial("Common/Materials/RedColor.j3m"));
+        
+        movingNode=new Node("lightParentNode");
+        movingNode.attachChild(lightMdl);  
+        rootNode.attachChild(movingNode);
+
+        PointLight pl = new PointLight();
+        pl.setColor(ColorRGBA.Green);
+        pl.setRadius(4f);
+        rootNode.addLight(pl);
+        
+        LightNode lightNode=new LightNode("pointLight", pl);
+        movingNode.attachChild(lightNode);
+
+        DirectionalLight dl = new DirectionalLight();
+        dl.setColor(ColorRGBA.Red);
+        dl.setDirection(new Vector3f(0, 1, 0));
+        rootNode.addLight(dl);
+    }
+
+    @Override
+    public void simpleUpdate(float tpf){
+//        cam.setLocation(new Vector3f(5.0347548f, 6.6481347f, 3.74853f));
+//        cam.setRotation(new Quaternion(-0.19183293f, 0.80776674f, -0.37974006f, -0.40805697f));
+
+        angle += tpf;
+        angle %= FastMath.TWO_PI;
+
+        movingNode.setLocalTranslation(new Vector3f(FastMath.cos(angle) * 3f, 2, FastMath.sin(angle) * 3f));
+    }
+
+}