From 84e2aba9daec763343fbde2d2e875fd5ffc86039 Mon Sep 17 00:00:00 2001 From: Nehon Date: Wed, 11 Nov 2015 18:54:17 +0100 Subject: [PATCH] Initial implementation for adding a LightProbe to a scene in the SDK --- .../jme3/gde/core/scene/SceneApplication.java | 7 ++ .../sceneexplorer/nodes/JmeLightProbe.java | 88 +++++++++++++++++++ .../nodes/JmeSpatialChildren.java | 4 + .../nodes/actions/NewLightPopup.java | 47 +++++++++- 4 files changed, 145 insertions(+), 1 deletion(-) create mode 100644 sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/JmeLightProbe.java diff --git a/sdk/jme3-core/src/com/jme3/gde/core/scene/SceneApplication.java b/sdk/jme3-core/src/com/jme3/gde/core/scene/SceneApplication.java index bde49ecda..2e5f4e53d 100644 --- a/sdk/jme3-core/src/com/jme3/gde/core/scene/SceneApplication.java +++ b/sdk/jme3-core/src/com/jme3/gde/core/scene/SceneApplication.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); diff --git a/sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/JmeLightProbe.java b/sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/JmeLightProbe.java new file mode 100644 index 000000000..1f844f944 --- /dev/null +++ b/sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/JmeLightProbe.java @@ -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; + } + +} diff --git a/sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/JmeSpatialChildren.java b/sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/JmeSpatialChildren.java index e3c84a976..e578b0543 100644 --- a/sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/JmeSpatialChildren.java +++ b/sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/JmeSpatialChildren.java @@ -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 { 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; diff --git a/sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/actions/NewLightPopup.java b/sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/actions/NewLightPopup.java index a2204fe1a..5588e7bbe 100644 --- a/sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/actions/NewLightPopup.java +++ b/sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/actions/NewLightPopup.java @@ -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"); @@ -167,6 +174,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() { + + @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() { + @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