|
|
|
@ -42,8 +42,9 @@ import com.jme3.light.SpotLight; |
|
|
|
|
import com.jme3.math.Vector3f; |
|
|
|
|
import com.jme3.renderer.RenderManager; |
|
|
|
|
import com.jme3.renderer.ViewPort; |
|
|
|
|
import com.jme3.scene.Spatial; |
|
|
|
|
import com.jme3.util.TempVars; |
|
|
|
|
import com.jme3.util.clone.Cloner; |
|
|
|
|
|
|
|
|
|
import java.io.IOException; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
@ -54,7 +55,10 @@ import java.io.IOException; |
|
|
|
|
*/ |
|
|
|
|
public class LightControl extends AbstractControl { |
|
|
|
|
|
|
|
|
|
public static enum ControlDirection { |
|
|
|
|
private static final String CONTROL_DIR_NAME = "controlDir"; |
|
|
|
|
private static final String LIGHT_NAME = "light"; |
|
|
|
|
|
|
|
|
|
public enum ControlDirection { |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Means, that the Light's transform is "copied" |
|
|
|
@ -67,6 +71,7 @@ public class LightControl extends AbstractControl { |
|
|
|
|
*/ |
|
|
|
|
SpatialToLight; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private Light light; |
|
|
|
|
private ControlDirection controlDir = ControlDirection.SpatialToLight; |
|
|
|
|
|
|
|
|
@ -113,7 +118,7 @@ public class LightControl extends AbstractControl { |
|
|
|
|
if (spatial != null && light != null) { |
|
|
|
|
switch (controlDir) { |
|
|
|
|
case SpatialToLight: |
|
|
|
|
spatialTolight(light); |
|
|
|
|
spatialToLight(light); |
|
|
|
|
break; |
|
|
|
|
case LightToSpatial: |
|
|
|
|
lightToSpatial(light); |
|
|
|
@ -122,22 +127,29 @@ public class LightControl extends AbstractControl { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void spatialTolight(Light light) { |
|
|
|
|
private void spatialToLight(Light light) { |
|
|
|
|
|
|
|
|
|
final Vector3f worldTranslation = spatial.getWorldTranslation(); |
|
|
|
|
|
|
|
|
|
if (light instanceof PointLight) { |
|
|
|
|
((PointLight) light).setPosition(spatial.getWorldTranslation()); |
|
|
|
|
((PointLight) light).setPosition(worldTranslation); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
TempVars vars = TempVars.get(); |
|
|
|
|
|
|
|
|
|
final TempVars vars = TempVars.get(); |
|
|
|
|
final Vector3f vec = vars.vect1; |
|
|
|
|
|
|
|
|
|
if (light instanceof DirectionalLight) { |
|
|
|
|
((DirectionalLight) light).setDirection(vars.vect1.set(spatial.getWorldTranslation()).multLocal(-1.0f)); |
|
|
|
|
((DirectionalLight) light).setDirection(vec.set(worldTranslation).multLocal(-1.0f)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (light instanceof SpotLight) { |
|
|
|
|
((SpotLight) light).setPosition(spatial.getWorldTranslation()); |
|
|
|
|
((SpotLight) light).setDirection(spatial.getWorldRotation().multLocal(vars.vect1.set(Vector3f.UNIT_Y).multLocal(-1))); |
|
|
|
|
final SpotLight spotLight = (SpotLight) light; |
|
|
|
|
spotLight.setPosition(worldTranslation); |
|
|
|
|
spotLight.setDirection(spatial.getWorldRotation().multLocal(vec.set(Vector3f.UNIT_Y).multLocal(-1))); |
|
|
|
|
} |
|
|
|
|
vars.release(); |
|
|
|
|
|
|
|
|
|
vars.release(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void lightToSpatial(Light light) { |
|
|
|
@ -158,8 +170,6 @@ public class LightControl extends AbstractControl { |
|
|
|
|
} |
|
|
|
|
vars.release(); |
|
|
|
|
//TODO add code for Spot light here when it's done
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@ -167,23 +177,18 @@ public class LightControl extends AbstractControl { |
|
|
|
|
// nothing to do
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// default implementation from AbstractControl is equivalent
|
|
|
|
|
//@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"; |
|
|
|
|
private static final String LIGHT_NAME = "light"; |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public void cloneFields(final Cloner cloner, final Object original) { |
|
|
|
|
super.cloneFields(cloner, original); |
|
|
|
|
light = cloner.clone(light); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public void read(JmeImporter im) throws IOException { |
|
|
|
|
super.read(im); |
|
|
|
|
InputCapsule ic = im.getCapsule(this); |
|
|
|
|
controlDir = ic.readEnum(CONTROL_DIR_NAME, ControlDirection.class, ControlDirection.SpatialToLight); |
|
|
|
|
light = (Light)ic.readSavable(LIGHT_NAME, null); |
|
|
|
|
light = (Light) ic.readSavable(LIGHT_NAME, null); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|