--- /dev/null
+/*
+ * 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();
+ }
+}
* 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.renderer.RenderManager;
import com.jme3.renderer.ViewPort;
import com.jme3.scene.Spatial;
+import com.jme3.util.TempVars;
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.
*/
SpatialToCamera;
}
-
private Camera camera;
private ControlDirection controlDir = ControlDirection.CameraToSpatial;
/**
* Constructor used for Serialization.
*/
- public CameraControl() {}
+ public CameraControl() {
+ }
/**
* @param camera The Camera to be synced.
}
// 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());
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;
}
}
control.setEnabled(isEnabled());
return control;
}
-
private static final String CONTROL_DIR_NAME = "controlDir";
-
+
@Override
public void read(JmeImporter im) throws IOException {
super.read(im);
ex.getCapsule(this).write(controlDir, CONTROL_DIR_NAME,
ControlDirection.SpatialToCamera);
}
-
}
\ No newline at end of file
--- /dev/null
+/*
+ * 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
--- /dev/null
+/*
+ * 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));
+ }
+
+}