diff --git a/sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/actions/impl/AtlasBatchGeometry.java b/sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/actions/impl/AtlasBatchGeometry.java new file mode 100644 index 000000000..3cd610a5d --- /dev/null +++ b/sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/actions/impl/AtlasBatchGeometry.java @@ -0,0 +1,104 @@ +/* + * 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.actions.impl; + +import com.jme3.asset.AssetManager; +import com.jme3.gde.core.assets.ProjectAssetManager; +import com.jme3.gde.core.sceneexplorer.nodes.AbstractSceneExplorerNode; +import com.jme3.gde.core.sceneexplorer.nodes.JmeNode; +import com.jme3.gde.core.sceneexplorer.nodes.actions.AbstractToolAction; +import com.jme3.gde.core.sceneexplorer.nodes.actions.ToolAction; +import com.jme3.scene.Geometry; +import com.jme3.scene.Node; +import com.jme3.scene.Spatial; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import jme3tools.optimize.TextureAtlas; + +/** + * + * @author normenhansen + */ +@org.openide.util.lookup.ServiceProvider(service = ToolAction.class) +public class AtlasBatchGeometry extends AbstractToolAction { + + private class OldNew { + + public OldNew(Spatial newSpat, List oldChildren) { + this.newSpat = newSpat; + this.oldChildren = oldChildren; + } + Spatial newSpat; + List oldChildren; + } + + public AtlasBatchGeometry() { + name = "Batch Geometry with TextureAtlas"; + } + + @Override + protected Object doApplyTool(AbstractSceneExplorerNode rootNode) { + Node parent = rootNode.getLookup().lookup(Node.class); + AssetManager mgr = rootNode.getLookup().lookup(ProjectAssetManager.class); + if (parent == null || mgr == null) { + return null; + } + Geometry batch = TextureAtlas.makeAtlasBatch(parent, mgr, 4096); + batch.setName(parent.getName() + " - batched"); + List currentChildren = new ArrayList(); + if (parent != null && batch != null) { + currentChildren.addAll(parent.getChildren()); + parent.detachAllChildren(); + parent.attachChild(batch); + } + return new OldNew(batch, currentChildren); + } + + @Override + protected void doUndoTool(AbstractSceneExplorerNode rootNode, Object undoObject) { + Node parent = rootNode.getLookup().lookup(Node.class); + OldNew undo = (OldNew) undoObject; + if (parent == null || undo == null) { + return; + } + parent.detachChild(undo.newSpat); + for (Iterator it = undo.oldChildren.iterator(); it.hasNext();) { + Spatial spatial = it.next(); + parent.attachChild(spatial); + } + } + + public Class getNodeClass() { + return JmeNode.class; + } +} diff --git a/sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/actions/impl/OptimizeGeometry.java b/sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/actions/impl/OptimizeGeometry.java index 1c7729471..15306e584 100644 --- a/sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/actions/impl/OptimizeGeometry.java +++ b/sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/actions/impl/OptimizeGeometry.java @@ -36,6 +36,10 @@ import com.jme3.gde.core.sceneexplorer.nodes.JmeNode; import com.jme3.gde.core.sceneexplorer.nodes.actions.AbstractToolAction; import com.jme3.gde.core.sceneexplorer.nodes.actions.ToolAction; import com.jme3.scene.Node; +import com.jme3.scene.Spatial; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; import jme3tools.optimize.GeometryBatchFactory; /** @@ -45,25 +49,49 @@ import jme3tools.optimize.GeometryBatchFactory; @org.openide.util.lookup.ServiceProvider(service = ToolAction.class) public class OptimizeGeometry extends AbstractToolAction { + private class OldNew { + + public OldNew(List newChildren, List oldChildren) { + this.newChildren = newChildren; + this.oldChildren = oldChildren; + } + List newChildren; + List oldChildren; + } + public OptimizeGeometry() { name = "Batch Geometry"; } @Override protected Object doApplyTool(AbstractSceneExplorerNode rootNode) { - Node geom = rootNode.getLookup().lookup(Node.class); - GeometryBatchFactory.optimize(geom); - return geom; + Node node = rootNode.getLookup().lookup(Node.class); + List currentChildren = new ArrayList(); + currentChildren.addAll(node.getChildren()); + GeometryBatchFactory.optimize(node); + List newChildren = new ArrayList(); + newChildren.addAll(node.getChildren()); + return new OldNew(newChildren, currentChildren); } @Override protected void doUndoTool(AbstractSceneExplorerNode rootNode, Object undoObject) { -// Spatial geom = rootNode.getLookup().lookup(Spatial.class); -// geom.removeFromParent(); + Node parent = rootNode.getLookup().lookup(Node.class); + OldNew undo = (OldNew) undoObject; + if (parent == null || undo == null) { + return; + } + for (Iterator it = undo.newChildren.iterator(); it.hasNext();) { + Spatial spatial = it.next(); + spatial.removeFromParent(); + } + for (Iterator it = undo.oldChildren.iterator(); it.hasNext();) { + Spatial spatial = it.next(); + parent.attachChild(spatial); + } } public Class getNodeClass() { return JmeNode.class; } - }