فهرست منبع

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

Nehon 9 سال پیش
والد
کامیت
9a5a345ded

+ 7 - 0
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);
 

+ 88 - 0
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
+ */
[email protected](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;
+    }
+
+}

+ 4 - 0
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<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;

+ 46 - 1
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<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