Initial implementation for adding a LightProbe to a scene in the SDK

define_list_fix
Nehon 9 years ago
parent c76182d375
commit 84e2aba9da
  1. 7
      sdk/jme3-core/src/com/jme3/gde/core/scene/SceneApplication.java
  2. 88
      sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/JmeLightProbe.java
  3. 4
      sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/JmeSpatialChildren.java
  4. 47
      sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/actions/NewLightPopup.java

@ -28,6 +28,8 @@ import com.jme3.app.Application;
import com.jme3.app.StatsView;
import com.jme3.asset.AssetManager;
import com.jme3.bullet.BulletAppState;
import com.jme3.environment.EnvironmentCamera;
import com.jme3.environment.util.LightsDebugState;
import com.jme3.font.BitmapFont;
import com.jme3.font.BitmapText;
import com.jme3.gde.core.Installer;
@ -244,6 +246,11 @@ public class SceneApplication extends Application implements LookupProvider {
viewPort.attachScene(toolsNode);
guiViewPort.attachScene(guiNode);
cam.setLocation(new Vector3f(0, 0, 10));
getStateManager().attach(new EnvironmentCamera());
LightsDebugState lightDebugState = new LightsDebugState();
getStateManager().attach(lightDebugState);
wireProcessor = new WireProcessor(assetManager);

@ -0,0 +1,88 @@
/*
* 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.gde.core.sceneexplorer.nodes;
import com.jme3.light.LightProbe;
import com.jme3.math.Vector3f;
import com.jme3.scene.Spatial;
import org.openide.nodes.Sheet;
/**
*
* @author normenhansen
*/
@org.openide.util.lookup.ServiceProvider(service=SceneExplorerNode.class)
@SuppressWarnings({"unchecked", "rawtypes"})
public class JmeLightProbe extends JmeLight{
protected LightProbe lightProbe;
public JmeLightProbe() {
}
public JmeLightProbe(Spatial spatial, LightProbe lightProbe) {
super(spatial, lightProbe);
this.lightProbe = lightProbe;
lookupContents.add(lightProbe);
setName("LightProbe");
}
@Override
protected Sheet createSheet() {
//TODO: multithreading..
Sheet sheet = super.createSheet();
Sheet.Set set = Sheet.createPropertiesSet();
set.setDisplayName("LightProbe");
set.setName(LightProbe.class.getName());
LightProbe obj = lightProbe;
if (obj == null) {
return sheet;
}
set.put(makeProperty(obj, Vector3f.class, "getPosition", "setPosition", "Position"));
//set.put(makeProperty(obj.getBounds(), Float.class, "getRadius", "setRadius", "Radius"));
sheet.put(set);
return sheet;
}
@Override
public Class getExplorerObjectClass() {
return LightProbe.class;
}
@Override
public Class getExplorerNodeClass() {
return JmeLightProbe.class;
}
}

@ -38,6 +38,7 @@ import com.jme3.light.AmbientLight;
import com.jme3.light.DirectionalLight;
import com.jme3.light.Light;
import com.jme3.light.LightList;
import com.jme3.light.LightProbe;
import com.jme3.light.PointLight;
import com.jme3.light.SpotLight;
import com.jme3.scene.Geometry;
@ -180,6 +181,9 @@ public class JmeSpatialChildren extends Children.Keys<Object> {
if (pair.getLight() instanceof AmbientLight) {
return new Node[]{new JmeAmbientLight(pair.getSpatial(), (AmbientLight) pair.getLight()).setReadOnly(readOnly)};
}
if (pair.getLight() instanceof LightProbe) {
return new Node[]{new JmeLightProbe(pair.getSpatial(), (LightProbe) pair.getLight()).setReadOnly(readOnly)};
}
return new Node[]{new JmeLight(pair.getSpatial(), pair.getLight()).setReadOnly(readOnly)};
} else if (key instanceof MeshGeometryPair) {
MeshGeometryPair pair = (MeshGeometryPair) key;

@ -31,13 +31,19 @@
*/
package com.jme3.gde.core.sceneexplorer.nodes.actions;
import com.jme3.bounding.BoundingSphere;
import com.jme3.environment.EnvironmentCamera;
import com.jme3.environment.LightProbeFactory;
import com.jme3.environment.generation.JobProgressAdapter;
import com.jme3.gde.core.scene.SceneApplication;
import com.jme3.gde.core.scene.controller.SceneToolController;
import com.jme3.gde.core.sceneexplorer.nodes.JmeSpatial;
import com.jme3.gde.core.undoredo.AbstractUndoableSceneEdit;
import com.jme3.gde.core.undoredo.SceneUndoRedoManager;
import com.jme3.light.AmbientLight;
import com.jme3.light.DirectionalLight;
import com.jme3.light.Light;
import com.jme3.light.LightProbe;
import com.jme3.light.PointLight;
import com.jme3.light.SpotLight;
import com.jme3.math.ColorRGBA;
@ -79,6 +85,7 @@ public class NewLightPopup extends AbstractAction implements Presenter.Popup {
result.add(new JMenuItem(new AddDirectionalAction()));
result.add(new JMenuItem(new AddPointAction()));
result.add(new JMenuItem(new AddSpotAction()));
result.add(new JMenuItem(new AddProbeAction()));
return result;
}
@ -147,7 +154,7 @@ public class NewLightPopup extends AbstractAction implements Presenter.Popup {
}
}
private class AddSpotAction extends AbstractAction {
private class AddSpotAction extends AbstractAction {
public AddSpotAction() {
putValue(NAME, "Spot Light");
@ -168,6 +175,44 @@ public class NewLightPopup extends AbstractAction implements Presenter.Popup {
}
}
private class AddProbeAction extends AbstractAction {
public AddProbeAction() {
putValue(NAME, "Light Probe");
}
@Override
public void actionPerformed(ActionEvent e) {
SceneApplication.getApplication().enqueue(new Callable<Void>() {
@Override
public Void call() throws Exception {
EnvironmentCamera envCam = SceneApplication.getApplication().getStateManager().getState(EnvironmentCamera.class);
SceneToolController toolController = SceneApplication.getApplication().getStateManager().getState(SceneToolController.class);
if(toolController != null){
envCam.setPosition(toolController.getCursorLocation());
} else {
envCam.setPosition(new Vector3f(0, 0, 0));
}
LightProbe lightProbe = LightProbeFactory.makeProbe(envCam, node, new JobProgressAdapter<LightProbe>() {
@Override
public void done(LightProbe t) {
System.err.println("Done computing env maps");
((BoundingSphere)t.getBounds()).setRadius(200);
}
});
node.addLight(lightProbe);
addLightUndo(node, lightProbe);
setModified();
return null;
}
});
}
}
private void addLightUndo(final Spatial undoParent, final Light undoLight) {
//add undo
if (undoParent != null && undoLight != null) {

Loading…
Cancel
Save