- added LightNode
- used tempVars to avoid Vector3f and Quaternion instancing in update method of CameraControl. git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@7275 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
This commit is contained in:
parent
e990b25822
commit
75fa331345
86
engine/src/core/com/jme3/scene/LightNode.java
Normal file
86
engine/src/core/com/jme3/scene/LightNode.java
Normal file
@ -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();
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
195
engine/src/core/com/jme3/scene/control/LightControl.java
Normal file
195
engine/src/core/com/jme3/scene/control/LightControl.java
Normal file
@ -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);
|
||||
}
|
||||
}
|
111
engine/src/test/jme3test/light/TestLightNode.java
Normal file
111
engine/src/test/jme3test/light/TestLightNode.java
Normal file
@ -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));
|
||||
}
|
||||
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user