From 2b8ec329ab64e6b30a8d96fe09c910b622ba0525 Mon Sep 17 00:00:00 2001 From: "bre..ns" Date: Tue, 13 Sep 2011 03:22:15 +0000 Subject: [PATCH] added JmeTerrainLodControl objects for the SDK git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@8250 75d07b2b-3a1a-0410-a2c5-0572b91ccdca --- .../nodes/JmeDistanceLodCalculator.java | 145 ++++++++++++ .../nodes/JmeTerrainLodControl.java | 215 ++++++++++++++++++ .../gde/terraineditor/AddTerrainAction.java | 5 +- 3 files changed, 362 insertions(+), 3 deletions(-) create mode 100644 sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/JmeDistanceLodCalculator.java create mode 100644 sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/JmeTerrainLodControl.java diff --git a/sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/JmeDistanceLodCalculator.java b/sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/JmeDistanceLodCalculator.java new file mode 100644 index 000000000..82d0bb4c1 --- /dev/null +++ b/sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/JmeDistanceLodCalculator.java @@ -0,0 +1,145 @@ +/* + * 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.gde.core.scene.SceneApplication; +import com.jme3.terrain.geomipmap.TerrainLodControl; +import com.jme3.terrain.geomipmap.lodcalc.DistanceLodCalculator; + +import java.awt.Image; +import java.io.IOException; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import javax.swing.Action; +import org.openide.actions.DeleteAction; +import org.openide.nodes.Children; +import org.openide.nodes.Sheet; +import org.openide.util.Exceptions; +import org.openide.util.ImageUtilities; +import org.openide.util.actions.SystemAction; + + +/** + * + * @author Brent Owens + */ +@org.openide.util.lookup.ServiceProvider(service=SceneExplorerNode.class) +public class JmeDistanceLodCalculator extends AbstractSceneExplorerNode { + + private DistanceLodCalculator lodCalculator; + private TerrainLodControl lodControl; + + private static Image smallImage = + ImageUtilities.loadImage("com/jme3/gde/core/sceneexplorer/nodes/icons/physicswheel.gif"); + + public JmeDistanceLodCalculator() { + } + + public JmeDistanceLodCalculator(TerrainLodControl lodControl, DistanceLodCalculator lodCalculator) { + super(Children.LEAF); + this.lodControl=lodControl; + this.lodCalculator = lodCalculator; + getLookupContents().add(lodCalculator); + getLookupContents().add(this); + setName("DistanceLodCalculator"); + } + + @Override + public Image getIcon(int type) { + return smallImage; + } + + @Override + public Image getOpenedIcon(int type) { + return smallImage; + } + + @Override + protected Sheet createSheet() { + //TODO: multithreading.. + Sheet sheet = Sheet.createDefault(); + Sheet.Set set = Sheet.createPropertiesSet(); + set.setDisplayName("DistanceLodControl"); + DistanceLodCalculator obj = lodCalculator; + if (obj == null) { + return sheet; + } + + set.put(makeProperty(obj, float.class, "getLodMultiplier", "setLodMultiplier", "Multiplier")); + + sheet.put(set); + return sheet; + + } + + @Override + public Action[] getActions(boolean context) { + return new SystemAction[]{ + // SystemAction.get(CopyAction.class), + // SystemAction.get(CutAction.class), + // SystemAction.get(PasteAction.class), + SystemAction.get(DeleteAction.class) + }; + } + + @Override + public boolean canDestroy() { + return false; + } + + @Override + public void destroy() throws IOException { + try { + SceneApplication.getApplication().enqueue(new Callable() { + + public Void call() throws Exception { + //TODO later, cannot destroy yet + return null; + } + }).get(); + ((AbstractSceneExplorerNode)getParentNode()).refresh(true); + } catch (InterruptedException ex) { + Exceptions.printStackTrace(ex); + } catch (ExecutionException ex) { + Exceptions.printStackTrace(ex); + } + } + + public Class getExplorerObjectClass() { + return DistanceLodCalculator.class; + } + + @Override + public Class getExplorerNodeClass() { + return JmeDistanceLodCalculator.class; + } +} diff --git a/sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/JmeTerrainLodControl.java b/sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/JmeTerrainLodControl.java new file mode 100644 index 000000000..ba644821b --- /dev/null +++ b/sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/JmeTerrainLodControl.java @@ -0,0 +1,215 @@ +/* + * 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.gde.core.scene.SceneApplication; +import com.jme3.scene.Spatial; +import com.jme3.terrain.geomipmap.TerrainLodControl; +import com.jme3.terrain.geomipmap.lodcalc.DistanceLodCalculator; +import com.jme3.terrain.geomipmap.lodcalc.PerspectiveLodCalculator; +import java.awt.Image; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import javax.swing.Action; +import org.openide.actions.DeleteAction; +import org.openide.loaders.DataObject; +import org.openide.nodes.Children; +import org.openide.nodes.Node; +import org.openide.nodes.Sheet; +import org.openide.util.Exceptions; +import org.openide.util.ImageUtilities; +import org.openide.util.actions.SystemAction; + +/** + * + * @author Brent Owens + */ +@org.openide.util.lookup.ServiceProvider(service=SceneExplorerNode.class) +public class JmeTerrainLodControl extends AbstractSceneExplorerNode{ + + private static Image smallImage = + ImageUtilities.loadImage("com/jme3/gde/core/sceneexplorer/nodes/icons/physicswheel.gif"); + private TerrainLodControl terrainLodControl; + + public JmeTerrainLodControl() { + } + + public JmeTerrainLodControl(TerrainLodControl control, Children children) { + super(children); + getLookupContents().add(control); + getLookupContents().add(this); + this.terrainLodControl = control; + setName("TerrainLodControl"); + } + + @Override + public Image getIcon(int type) { + return smallImage; + } + + @Override + public Image getOpenedIcon(int type) { + return smallImage; + } + + @Override + public Action[] getActions(boolean context) { + return new SystemAction[]{ + // SystemAction.get(CopyAction.class), + // SystemAction.get(CutAction.class), + // SystemAction.get(PasteAction.class), + SystemAction.get(DeleteAction.class) + }; + } + + @Override + public boolean canDestroy() { + return !readOnly; + } + + @Override + public void destroy() throws IOException { + super.destroy(); + final Spatial spat = getParentNode().getLookup().lookup(Spatial.class); + try { + SceneApplication.getApplication().enqueue(new Callable() { + + public Void call() throws Exception { + spat.removeControl(terrainLodControl); + return null; + } + }).get(); + ((AbstractSceneExplorerNode) getParentNode()).refresh(true); + } catch (InterruptedException ex) { + Exceptions.printStackTrace(ex); + } catch (ExecutionException ex) { + Exceptions.printStackTrace(ex); + } + } + + @Override + protected Sheet createSheet() { + Sheet sheet = super.createSheet(); + Sheet.Set set = Sheet.createPropertiesSet(); + set.setDisplayName("TerrainLodControl"); + set.setName(TerrainLodControl.class.getName()); + TerrainLodControl obj = terrainLodControl; + if (obj == null) { + return sheet; + } + + set.put(makeProperty(obj, boolean.class, "isEnabled", "setEnabled", "Enabled")); + + sheet.put(set); + return sheet; + + } + + public Class getExplorerObjectClass() { + return TerrainLodControl.class; + } + + @Override + public Class getExplorerNodeClass() { + return JmeTerrainLodControl.class; + } + + @Override + public org.openide.nodes.Node[] createNodes(Object key, DataObject key2, boolean cookie) { + TerrainLodControlChildren children = new TerrainLodControlChildren((TerrainLodControl) key); + children.setReadOnly(cookie); + children.setDataObject(key2); + return new org.openide.nodes.Node[]{new JmeTerrainLodControl((TerrainLodControl) key, children).setReadOnly(cookie)}; + } + + public static class TerrainLodControlChildren extends JmeSpatialChildren { + + TerrainLodControl control; + + public TerrainLodControlChildren(TerrainLodControl control) { + this.control = control; + } + + @Override + public void refreshChildren(boolean immediate) { + setKeys(createKeys()); + refresh(); + } + + @Override + protected List createKeys() { + try { + return SceneApplication.getApplication().enqueue(new Callable>() { + + public List call() throws Exception { + List keys = new ArrayList(); + if (control.getLodCalculator() != null) + keys.add(control.getLodCalculator()); + return keys; + } + }).get(); + } catch (InterruptedException ex) { + Exceptions.printStackTrace(ex); + } catch (ExecutionException ex) { + Exceptions.printStackTrace(ex); + } + return null; + } + + @Override + public void setReadOnly(boolean cookie) { + this.readOnly = cookie; + } + + @Override + protected void addNotify() { + super.addNotify(); + setKeys(createKeys()); + } + + @Override + protected Node[] createNodes(Object key) { + if (key instanceof DistanceLodCalculator) { + DistanceLodCalculator assetKey = (DistanceLodCalculator) key; + return new Node[]{new JmeDistanceLodCalculator(control, assetKey)}; + } else if (key instanceof PerspectiveLodCalculator) { + //PerspectiveLodCalculator assetKey = (PerspectiveLodCalculator) key; + //return new Node[]{new JmePerspectiveLodCalculator(control, assetKey)}; + } + return null; + } + } +} diff --git a/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/AddTerrainAction.java b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/AddTerrainAction.java index 875614892..9d190bd21 100644 --- a/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/AddTerrainAction.java +++ b/sdk/jme3-terrain-editor/src/com/jme3/gde/terraineditor/AddTerrainAction.java @@ -10,12 +10,12 @@ import com.jme3.gde.core.assets.ProjectAssetManager; import com.jme3.gde.core.scene.SceneApplication; import com.jme3.gde.core.sceneexplorer.nodes.actions.AbstractNewSpatialWizardAction; import com.jme3.gde.core.sceneexplorer.nodes.actions.NewSpatialAction; -import com.jme3.renderer.Camera; import com.jme3.scene.Node; import com.jme3.scene.Spatial; import com.jme3.terrain.Terrain; import com.jme3.terrain.geomipmap.TerrainLodControl; import com.jme3.terrain.geomipmap.TerrainQuad; +import com.jme3.terrain.geomipmap.lodcalc.DistanceLodCalculator; import com.jme3.terrain.heightmap.AbstractHeightMap; import com.jme3.texture.Texture; import com.jme3.texture.Texture.WrapMode; @@ -25,8 +25,6 @@ import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.text.MessageFormat; -import java.util.ArrayList; -import java.util.List; import javax.imageio.ImageIO; import javax.swing.JComponent; import jme3tools.converters.ImageToAwt; @@ -163,6 +161,7 @@ public class AddTerrainAction extends AbstractNewSpatialWizardAction { // add the lod control TerrainLodControl control = new TerrainLodControl(terrain, SceneApplication.getApplication().getCamera()); + control.setLodCalculator(new DistanceLodCalculator(patchSize, 2.7f)); ((Node)terrain).addControl(control); parent.attachChild((Node)terrain);