|
@@ -35,22 +35,80 @@ import com.jme3.asset.AssetManager;
|
|
import com.jme3.gde.core.assets.ProjectAssetManager;
|
|
import com.jme3.gde.core.assets.ProjectAssetManager;
|
|
import com.jme3.gde.core.sceneexplorer.nodes.AbstractSceneExplorerNode;
|
|
import com.jme3.gde.core.sceneexplorer.nodes.AbstractSceneExplorerNode;
|
|
import com.jme3.gde.core.sceneexplorer.nodes.JmeNode;
|
|
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.AbstractToolWizardAction;
|
|
import com.jme3.gde.core.sceneexplorer.nodes.actions.ToolAction;
|
|
import com.jme3.gde.core.sceneexplorer.nodes.actions.ToolAction;
|
|
import com.jme3.scene.Geometry;
|
|
import com.jme3.scene.Geometry;
|
|
import com.jme3.scene.Node;
|
|
import com.jme3.scene.Node;
|
|
import com.jme3.scene.Spatial;
|
|
import com.jme3.scene.Spatial;
|
|
|
|
+import java.awt.Component;
|
|
|
|
+import java.text.MessageFormat;
|
|
import java.util.ArrayList;
|
|
import java.util.ArrayList;
|
|
import java.util.Iterator;
|
|
import java.util.Iterator;
|
|
import java.util.List;
|
|
import java.util.List;
|
|
|
|
+import javax.swing.JComponent;
|
|
import jme3tools.optimize.TextureAtlas;
|
|
import jme3tools.optimize.TextureAtlas;
|
|
|
|
+import org.openide.DialogDisplayer;
|
|
|
|
+import org.openide.WizardDescriptor;
|
|
|
|
|
|
/**
|
|
/**
|
|
*
|
|
*
|
|
* @author normenhansen
|
|
* @author normenhansen
|
|
*/
|
|
*/
|
|
@org.openide.util.lookup.ServiceProvider(service = ToolAction.class)
|
|
@org.openide.util.lookup.ServiceProvider(service = ToolAction.class)
|
|
-public class AtlasBatchGeometry extends AbstractToolAction {
|
|
|
|
|
|
+public class AtlasBatchGeometry extends AbstractToolWizardAction {
|
|
|
|
+
|
|
|
|
+ public static enum AtlasResolution {
|
|
|
|
+
|
|
|
|
+ RES_256x256("256x256", 256, 256),
|
|
|
|
+ RES_512x512("512x512", 512, 512),
|
|
|
|
+ RES_1024x1024("1024x1024", 1024, 1024),
|
|
|
|
+ RES_2048x2048("2048x2048", 2048, 2048),
|
|
|
|
+ RES_4096x4096("4096x4096", 4096, 4096),
|
|
|
|
+ RES_8192x8192("8192x8192", 8192, 8192),
|
|
|
|
+ RES_16384x16384("16384x16384", 16384, 16384);
|
|
|
|
+ private final String name;
|
|
|
|
+ private final int resX;
|
|
|
|
+ private final int resY;
|
|
|
|
+
|
|
|
|
+ public String getName() {
|
|
|
|
+ return name;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public int getResX() {
|
|
|
|
+ return resX;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public int getResY() {
|
|
|
|
+ return resY;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public static AtlasResolution getNumber(int id) {
|
|
|
|
+ switch (id) {
|
|
|
|
+ case 1:
|
|
|
|
+ return RES_256x256;
|
|
|
|
+ case 2:
|
|
|
|
+ return RES_512x512;
|
|
|
|
+ case 3:
|
|
|
|
+ return RES_1024x1024;
|
|
|
|
+ case 4:
|
|
|
|
+ return RES_2048x2048;
|
|
|
|
+ case 5:
|
|
|
|
+ return RES_4096x4096;
|
|
|
|
+ case 6:
|
|
|
|
+ return RES_8192x8192;
|
|
|
|
+ case 7:
|
|
|
|
+ return RES_16384x16384;
|
|
|
|
+ default:
|
|
|
|
+ return RES_2048x2048;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private AtlasResolution(String name, int resX, int resY) {
|
|
|
|
+ this.name = name;
|
|
|
|
+ this.resX = resX;
|
|
|
|
+ this.resY = resY;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
|
|
private class OldNew {
|
|
private class OldNew {
|
|
|
|
|
|
@@ -62,18 +120,52 @@ public class AtlasBatchGeometry extends AbstractToolAction {
|
|
List<Spatial> oldChildren;
|
|
List<Spatial> oldChildren;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ @Override
|
|
|
|
+ protected Object showWizard(org.openide.nodes.Node node) {
|
|
|
|
+ List<WizardDescriptor.Panel<WizardDescriptor>> panels = new ArrayList<WizardDescriptor.Panel<WizardDescriptor>>();
|
|
|
|
+ panels.add(new AtlasBatchGeometryWizardPanel1());
|
|
|
|
+ String[] steps = new String[panels.size()];
|
|
|
|
+ for (int i = 0; i < panels.size(); i++) {
|
|
|
|
+ Component c = panels.get(i).getComponent();
|
|
|
|
+ // Default step name to component name of panel.
|
|
|
|
+ steps[i] = c.getName();
|
|
|
|
+ if (c instanceof JComponent) { // assume Swing components
|
|
|
|
+ JComponent jc = (JComponent) c;
|
|
|
|
+ jc.putClientProperty(WizardDescriptor.PROP_CONTENT_SELECTED_INDEX, i);
|
|
|
|
+ jc.putClientProperty(WizardDescriptor.PROP_CONTENT_DATA, steps);
|
|
|
|
+ jc.putClientProperty(WizardDescriptor.PROP_AUTO_WIZARD_STYLE, true);
|
|
|
|
+ jc.putClientProperty(WizardDescriptor.PROP_CONTENT_DISPLAYED, true);
|
|
|
|
+ jc.putClientProperty(WizardDescriptor.PROP_CONTENT_NUMBERED, true);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ WizardDescriptor wiz = new WizardDescriptor(new WizardDescriptor.ArrayIterator<WizardDescriptor>(panels));
|
|
|
|
+ // {0} will be replaced by WizardDesriptor.Panel.getComponent().getName()
|
|
|
|
+ wiz.setTitleFormat(new MessageFormat("{0}"));
|
|
|
|
+ wiz.setTitle("...dialog title...");
|
|
|
|
+ if (DialogDisplayer.getDefault().notify(wiz) == WizardDescriptor.FINISH_OPTION) {
|
|
|
|
+ // do something
|
|
|
|
+ return wiz;
|
|
|
|
+ }
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+
|
|
public AtlasBatchGeometry() {
|
|
public AtlasBatchGeometry() {
|
|
- name = "Batch Geometry with TextureAtlas";
|
|
|
|
|
|
+ name = "Batch Geometry with TextureAtlas..";
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
- protected Object doApplyTool(AbstractSceneExplorerNode rootNode) {
|
|
|
|
|
|
+ protected Object doApplyTool(AbstractSceneExplorerNode rootNode, Object settings) {
|
|
|
|
+ if (settings == null) {
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+ WizardDescriptor wiz = (WizardDescriptor)settings;
|
|
|
|
+ AtlasResolution res = (AtlasResolution)wiz.getProperty("size");
|
|
Node parent = rootNode.getLookup().lookup(Node.class);
|
|
Node parent = rootNode.getLookup().lookup(Node.class);
|
|
AssetManager mgr = rootNode.getLookup().lookup(ProjectAssetManager.class);
|
|
AssetManager mgr = rootNode.getLookup().lookup(ProjectAssetManager.class);
|
|
if (parent == null || mgr == null) {
|
|
if (parent == null || mgr == null) {
|
|
return null;
|
|
return null;
|
|
}
|
|
}
|
|
- Geometry batch = TextureAtlas.makeAtlasBatch(parent, mgr, 4096);
|
|
|
|
|
|
+ Geometry batch = TextureAtlas.makeAtlasBatch(parent, mgr, res.resX);
|
|
batch.setName(parent.getName() + " - batched");
|
|
batch.setName(parent.getName() + " - batched");
|
|
List<Spatial> currentChildren = new ArrayList<Spatial>();
|
|
List<Spatial> currentChildren = new ArrayList<Spatial>();
|
|
if (parent != null && batch != null) {
|
|
if (parent != null && batch != null) {
|
|
@@ -86,6 +178,9 @@ public class AtlasBatchGeometry extends AbstractToolAction {
|
|
|
|
|
|
@Override
|
|
@Override
|
|
protected void doUndoTool(AbstractSceneExplorerNode rootNode, Object undoObject) {
|
|
protected void doUndoTool(AbstractSceneExplorerNode rootNode, Object undoObject) {
|
|
|
|
+ if (undoObject == null) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
Node parent = rootNode.getLookup().lookup(Node.class);
|
|
Node parent = rootNode.getLookup().lookup(Node.class);
|
|
OldNew undo = (OldNew) undoObject;
|
|
OldNew undo = (OldNew) undoObject;
|
|
if (parent == null || undo == null) {
|
|
if (parent == null || undo == null) {
|