diff --git a/sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/JmeBone.java b/sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/JmeBone.java new file mode 100644 index 000000000..53c4cdde2 --- /dev/null +++ b/sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/JmeBone.java @@ -0,0 +1,207 @@ +/* + * 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.animation.Bone; +import com.jme3.animation.SkeletonControl; +import com.jme3.gde.core.scene.SceneApplication; +import com.jme3.gde.core.sceneexplorer.SceneExplorerTopComponent; +import java.awt.Image; +import java.awt.datatransfer.DataFlavor; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import javax.swing.Action; +import org.openide.awt.Actions; +import org.openide.loaders.DataObject; +import org.openide.nodes.Sheet; +import org.openide.util.Exceptions; +import org.openide.util.ImageUtilities; + +/** + * + * @author normenhansen + */ +@org.openide.util.lookup.ServiceProvider(service = SceneExplorerNode.class) +public class JmeBone extends AbstractSceneExplorerNode { + + private static Image smallImage = + ImageUtilities.loadImage("com/jme3/gde/core/sceneexplorer/nodes/icons/bone.png"); + private Bone bone; + private JmeSkeletonControl jmeSkeletonControl; + protected final DataFlavor BONE_FLAVOR = new DataFlavor(ClipboardSpatial.class, "Bone"); + + public JmeBone() { + + } + + public JmeBone(JmeSkeletonControl jmeSkeletonControl,Bone bone, JmeBoneChildren children) { + super(children); + this.jmeChildren = children; + this.jmeSkeletonControl = jmeSkeletonControl; + getLookupContents().add(bone); + getLookupContents().add(this); + super.setName(bone.getName()); + this.bone = bone; + } + + @Override + public Image getIcon(int type) { + return smallImage; + } + + @Override + public Image getOpenedIcon(int type) { + return smallImage; + } + + @Override + protected Sheet createSheet() { + //TODO: multithreading.. + Sheet sheet = super.createSheet(); + Sheet.Set set = Sheet.createPropertiesSet(); + set.setDisplayName("Bone"); + set.setName(Bone.class.getName()); + Bone obj = bone;//getLookup().lookup(Spatial.class); + if (obj == null) { + return sheet; + } + sheet.put(set); + return sheet; + + } +// +// @Override +// public PasteType getDropType(final Transferable t, int action, int index) { +// Object data = null; +// try { +// data = t.getTransferData(BONE_FLAVOR); +// } catch (Exception ex) { +//// Exceptions.printStackTrace(ex); +// } +// if (data == null) { +// return null; +// } +// if (data instanceof ClipboardSpatial) { +// final Spatial spat = ((ClipboardSpatial) data).createSpatial(); +// return new PasteType() { +// +// @Override +// public Transferable paste() throws IOException { +// try { +// fireSave(true); +// SceneApplication.getApplication().enqueue(new Callable() { +// +// public Void call() throws Exception { +// skeletonControl.getAttachmentsNode(bone.getName()).attachChild(spat); +// return null; +// } +// }).get(); +// refresh(false); +// return t; +// } catch (InterruptedException ex) { +// Exceptions.printStackTrace(ex); +// } catch (ExecutionException ex) { +// Exceptions.printStackTrace(ex); +// } +// return null; +// } +// }; +// } +// return null; +// } +// +// @Override +// protected void createPasteTypes(Transferable t, List s) { +// super.createPasteTypes(t, s); +// PasteType paste = getDropType(t, DnDConstants.ACTION_COPY_OR_MOVE, -1); +// if (null != paste) { +// s.add(paste); +// } +// } + + @Override + public Action[] getActions(boolean context) { +// return super.getActions(context); + + return new Action[]{ + Actions.alwaysEnabled(new AttachementNodeActionListener(), "Get attachement Node", "", false), + }; +// if (((JmeBoneChildren) jmeChildren).readOnly) { +// return new Action[]{ +// Actions.alwaysEnabled(new AttachementNodeActionListener(), "Get attachement Node", "", false), +// }; +// } else { +// return new Action[]{ +// Actions.alwaysEnabled(new AttachementNodeActionListener(), "Get attachement Node", "", false), +// }; +// } + } + + private class AttachementNodeActionListener implements ActionListener{ + public void actionPerformed(ActionEvent e) { + fireSave(true); + try { + SceneApplication.getApplication().enqueue(new Callable() { + + public Void call() throws Exception { + jmeSkeletonControl.getSkeletonControl().getAttachmentsNode(bone.getName()); + return null; + } + + }).get(); + ((AbstractSceneExplorerNode)jmeSkeletonControl.getParentNode()).refresh(false); + } catch (InterruptedException ex) { + Exceptions.printStackTrace(ex); + } catch (ExecutionException ex) { + Exceptions.printStackTrace(ex); + } + + } + } + + public Class getExplorerObjectClass() { + return Bone.class; + } + + public Class getExplorerNodeClass() { + return JmeBone.class; + } + + public org.openide.nodes.Node[] createNodes(Object key, DataObject key2, boolean cookie) { + JmeBoneChildren children = new JmeBoneChildren(jmeSkeletonControl,(Bone) key); + children.setReadOnly(cookie); + children.setDataObject(key2); + return new org.openide.nodes.Node[]{new JmeBone(jmeSkeletonControl,(Bone) key, children).setReadOnly(cookie)}; + } +} diff --git a/sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/JmeBoneChildren.java b/sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/JmeBoneChildren.java new file mode 100644 index 000000000..5e4ddf153 --- /dev/null +++ b/sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/JmeBoneChildren.java @@ -0,0 +1,164 @@ +/* + * 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.animation.Bone; +import com.jme3.animation.SkeletonControl; +import com.jme3.gde.core.scene.SceneApplication; +import com.jme3.light.AmbientLight; +import com.jme3.light.DirectionalLight; +import com.jme3.light.PointLight; +import com.jme3.light.SpotLight; +import com.jme3.scene.Spatial; +import com.jme3.scene.control.Control; +import java.util.Arrays; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; +import java.util.logging.Level; +import java.util.logging.Logger; +import org.openide.loaders.DataObject; +import org.openide.nodes.Children; +import org.openide.nodes.Node; +import org.openide.util.Exceptions; +import org.openide.util.Lookup; + +/** + * + * @author normenhansen + */ +public class JmeBoneChildren extends Children.Keys { + + protected Bone rootBone; + protected JmeSkeletonControl jmeSkeletonControl; + protected boolean readOnly = true; + protected HashMap map = new HashMap(); + private DataObject dataObject; + + public JmeBoneChildren() { + } + + public JmeBoneChildren(JmeSkeletonControl jmeSkeletonControl, Bone rootBone) { + this.rootBone = rootBone; + this.jmeSkeletonControl = jmeSkeletonControl; + } + + public void refreshChildren(boolean immediate) { + setKeys(createKeys()); + refresh(); + } + + public void setReadOnly(boolean cookie) { + this.readOnly = cookie; + } + + @Override + protected void addNotify() { + super.addNotify(); + setKeys(createKeys()); + } + + protected List createKeys() { + try { + return SceneApplication.getApplication().enqueue(new Callable>() { + + public List call() throws Exception { + List keys = new LinkedList(); + if (rootBone != null) { + keys.addAll(rootBone.getChildren()); + } else { + keys.addAll(Arrays.asList(jmeSkeletonControl.getSkeletonControl().getSkeleton().getRoots())); + } +// if (spatial instanceof Geometry) { +// Geometry geom = (Geometry) spatial; +// Mesh mesh = geom.getMesh(); +// if (mesh != null) { +// keys.add(new MeshGeometryPair(mesh, geom)); +// } +// } +// LightList lights = spatial.getLocalLightList(); +// for (int i = 0; i < lights.size(); i++) { +// Light light = lights.get(i); +// if (light != null) { +// keys.add(new LightSpatialPair(light, spatial)); +// } +// } +// for (int i = 0; i < spatial.getNumControls(); i++) { +// Control control = spatial.getControl(i); +// keys.add(control); +// } + return keys; + } + }).get(); + } catch (InterruptedException ex) { + Exceptions.printStackTrace(ex); + } catch (ExecutionException ex) { + Exceptions.printStackTrace(ex); + } + return null; + } + + @Override + protected Node[] createNodes(Object key) { +// for (SceneExplorerNode di : Lookup.getDefault().lookupAll(SceneExplorerNode.class)) { +// if (di.getExplorerObjectClass().getName().equals(key.getClass().getName())) { +// Logger.getLogger(this.getClass().getName()).log(Level.FINE, "Found {0}", di.getExplorerNodeClass()); +// Node[] ret = di.createNodes(key, dataObject, readOnly); +// if (ret != null) { +// return ret; +// } +// } +// } + + if (key instanceof Bone) { + JmeBoneChildren children = new JmeBoneChildren(jmeSkeletonControl, (Bone) key); + children.setReadOnly(readOnly); + children.setDataObject(dataObject); + return new Node[]{new JmeBone(jmeSkeletonControl, (Bone) key, children).setReadOnly(readOnly)}; + } + return new Node[]{Node.EMPTY}; + } + + public void setSkeltonControl(JmeSkeletonControl jmeSkeletonControl) { + this.jmeSkeletonControl = jmeSkeletonControl; + } + + public DataObject getDataObject() { + return dataObject; + } + + public void setDataObject(DataObject dataObject) { + this.dataObject = dataObject; + } +} diff --git a/sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/JmeSkeletonControl.java b/sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/JmeSkeletonControl.java new file mode 100644 index 000000000..0931562b5 --- /dev/null +++ b/sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/JmeSkeletonControl.java @@ -0,0 +1,161 @@ +/* + * 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.animation.AnimControl; +import com.jme3.animation.SkeletonControl; +import com.jme3.gde.core.scene.SceneApplication; +import com.jme3.gde.core.properties.AnimationProperty; +import com.jme3.scene.Spatial; +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.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 normenhansen + */ +@org.openide.util.lookup.ServiceProvider(service = SceneExplorerNode.class) +public class JmeSkeletonControl extends AbstractSceneExplorerNode { + + private SkeletonControl skeletonControl; + private static Image smallImage = + ImageUtilities.loadImage("com/jme3/gde/core/sceneexplorer/nodes/icons/skeletonControl.gif"); + + public JmeSkeletonControl() { + + } + + public JmeSkeletonControl(SkeletonControl skeletonControl, JmeBoneChildren children) { + super(children); + this.skeletonControl = skeletonControl; + lookupContents.add(this); + lookupContents.add(skeletonControl); + setName("SkeletonControl"); + children.setSkeltonControl(this); + } + + @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("SkeletonControl"); + set.setName(SkeletonControl.class.getName()); + if (skeletonControl == null) { + return sheet; + } + + // set.put(new AnimationProperty(animControl)); + + 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 !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(skeletonControl); + return null; + } + }).get(); + ((AbstractSceneExplorerNode) getParentNode()).refresh(true); + } catch (InterruptedException ex) { + Exceptions.printStackTrace(ex); + } catch (ExecutionException ex) { + Exceptions.printStackTrace(ex); + } + } + + public Class getExplorerObjectClass() { + return SkeletonControl.class; + } + + @Override + public Class getExplorerNodeClass() { + return JmeSkeletonControl.class; + } + + public SkeletonControl getSkeletonControl() { + return skeletonControl; + } + + + + @Override + public Node[] createNodes(Object key, DataObject key2, boolean cookie) { + JmeBoneChildren children = new JmeBoneChildren(null, null); + JmeSkeletonControl jsc = new JmeSkeletonControl((SkeletonControl) key, children); + return new Node[]{jsc}; + } +} diff --git a/sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/icons/bone.png b/sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/icons/bone.png new file mode 100644 index 000000000..671466bec Binary files /dev/null and b/sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/icons/bone.png differ diff --git a/sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/icons/skeletonControl.gif b/sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/icons/skeletonControl.gif new file mode 100644 index 000000000..13080d0a3 Binary files /dev/null and b/sdk/jme3-core/src/com/jme3/gde/core/sceneexplorer/nodes/icons/skeletonControl.gif differ