- 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
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package com.jme3.scene.control;
|
package com.jme3.scene.control;
|
||||||
|
|
||||||
import com.jme3.export.JmeExporter;
|
import com.jme3.export.JmeExporter;
|
||||||
@ -40,6 +39,7 @@ import com.jme3.renderer.Camera;
|
|||||||
import com.jme3.renderer.RenderManager;
|
import com.jme3.renderer.RenderManager;
|
||||||
import com.jme3.renderer.ViewPort;
|
import com.jme3.renderer.ViewPort;
|
||||||
import com.jme3.scene.Spatial;
|
import com.jme3.scene.Spatial;
|
||||||
|
import com.jme3.util.TempVars;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -51,6 +51,7 @@ import java.io.IOException;
|
|||||||
public class CameraControl extends AbstractControl {
|
public class CameraControl extends AbstractControl {
|
||||||
|
|
||||||
public static enum ControlDirection {
|
public static enum ControlDirection {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Means, that the Camera's transform is "copied"
|
* Means, that the Camera's transform is "copied"
|
||||||
* to the Transform of the Spatial.
|
* to the Transform of the Spatial.
|
||||||
@ -62,14 +63,14 @@ public class CameraControl extends AbstractControl {
|
|||||||
*/
|
*/
|
||||||
SpatialToCamera;
|
SpatialToCamera;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Camera camera;
|
private Camera camera;
|
||||||
private ControlDirection controlDir = ControlDirection.CameraToSpatial;
|
private ControlDirection controlDir = ControlDirection.CameraToSpatial;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor used for Serialization.
|
* Constructor used for Serialization.
|
||||||
*/
|
*/
|
||||||
public CameraControl() {}
|
public CameraControl() {
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param camera The Camera to be synced.
|
* @param camera The Camera to be synced.
|
||||||
@ -103,11 +104,10 @@ public class CameraControl extends AbstractControl {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// fields used, when inversing ControlDirection:
|
// fields used, when inversing ControlDirection:
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void controlUpdate(float tpf) {
|
protected void controlUpdate(float tpf) {
|
||||||
if(spatial != null && camera != null) {
|
if (spatial != null && camera != null) {
|
||||||
switch(controlDir) {
|
switch (controlDir) {
|
||||||
case SpatialToCamera:
|
case SpatialToCamera:
|
||||||
camera.setLocation(spatial.getWorldTranslation());
|
camera.setLocation(spatial.getWorldTranslation());
|
||||||
camera.setRotation(spatial.getWorldRotation());
|
camera.setRotation(spatial.getWorldRotation());
|
||||||
@ -115,12 +115,16 @@ public class CameraControl extends AbstractControl {
|
|||||||
case CameraToSpatial:
|
case CameraToSpatial:
|
||||||
// set the localtransform, so that the worldtransform would be equal to the camera's transform.
|
// set the localtransform, so that the worldtransform would be equal to the camera's transform.
|
||||||
// Location:
|
// Location:
|
||||||
Vector3f vecDiff = camera.getLocation().subtract(spatial.getWorldTranslation());
|
TempVars vars = TempVars.get();
|
||||||
spatial.getLocalTranslation().addLocal(vecDiff);
|
assert vars.lock();
|
||||||
|
|
||||||
|
Vector3f vecDiff = vars.vect1.set(camera.getLocation()).subtractLocal(spatial.getWorldTranslation());
|
||||||
|
spatial.setLocalTranslation(vecDiff.addLocal(spatial.getLocalTranslation()));
|
||||||
|
|
||||||
// Rotation:
|
// Rotation:
|
||||||
Quaternion worldDiff = camera.getRotation().subtract(spatial.getWorldRotation());
|
Quaternion worldDiff = vars.quat1.set(camera.getRotation()).subtractLocal(spatial.getWorldRotation());
|
||||||
spatial.getLocalRotation().addLocal(worldDiff);
|
spatial.setLocalRotation(worldDiff.addLocal(spatial.getLocalRotation()));
|
||||||
|
assert vars.unlock();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -138,7 +142,6 @@ public class CameraControl extends AbstractControl {
|
|||||||
control.setEnabled(isEnabled());
|
control.setEnabled(isEnabled());
|
||||||
return control;
|
return control;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final String CONTROL_DIR_NAME = "controlDir";
|
private static final String CONTROL_DIR_NAME = "controlDir";
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -154,5 +157,4 @@ public class CameraControl extends AbstractControl {
|
|||||||
ex.getCapsule(this).write(controlDir, CONTROL_DIR_NAME,
|
ex.getCapsule(this).write(controlDir, CONTROL_DIR_NAME,
|
||||||
ControlDirection.SpatialToCamera);
|
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