sdk :
- Material live update in platform core git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@7984 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
This commit is contained in:
parent
59b00bbae9
commit
3bb3277f3a
@ -0,0 +1,18 @@
|
|||||||
|
/*
|
||||||
|
* To change this template, choose Tools | Templates
|
||||||
|
* and open the template in the editor.
|
||||||
|
*/
|
||||||
|
package com.jme3.gde.core.sceneexplorer;
|
||||||
|
|
||||||
|
import com.jme3.material.Material;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Nehon
|
||||||
|
*/
|
||||||
|
public interface MaterialChangeListener {
|
||||||
|
|
||||||
|
public String getKey();
|
||||||
|
|
||||||
|
public void setMaterial(Material material);
|
||||||
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
/*
|
||||||
|
* To change this template, choose Tools | Templates
|
||||||
|
* and open the template in the editor.
|
||||||
|
*/
|
||||||
|
package com.jme3.gde.core.sceneexplorer;
|
||||||
|
|
||||||
|
import com.jme3.gde.core.sceneexplorer.MaterialChangeListener;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Nehon
|
||||||
|
*/
|
||||||
|
public interface MaterialChangeProvider {
|
||||||
|
|
||||||
|
public String getKey();
|
||||||
|
|
||||||
|
public void addMaterialChangeListener(MaterialChangeListener listener);
|
||||||
|
|
||||||
|
public void removeMaterialChangeListener(MaterialChangeListener listener);
|
||||||
|
|
||||||
|
public void addAllMaterialChangeListener(List<MaterialChangeListener> listeners);
|
||||||
|
|
||||||
|
public void clearMaterialChangeListeners();
|
||||||
|
}
|
@ -37,8 +37,13 @@ import com.jme3.gde.core.scene.SceneListener;
|
|||||||
import com.jme3.gde.core.scene.SceneRequest;
|
import com.jme3.gde.core.scene.SceneRequest;
|
||||||
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 java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
import org.openide.util.Lookup.Result;
|
import org.openide.util.Lookup.Result;
|
||||||
import org.openide.util.NbBundle;
|
import org.openide.util.NbBundle;
|
||||||
@ -77,6 +82,8 @@ public final class SceneExplorerTopComponent extends TopComponent implements Exp
|
|||||||
private final Result<AbstractSceneExplorerNode> nodeSelectionResult;
|
private final Result<AbstractSceneExplorerNode> nodeSelectionResult;
|
||||||
private AbstractSceneExplorerNode selectedSpatial;
|
private AbstractSceneExplorerNode selectedSpatial;
|
||||||
private AbstractSceneExplorerNode lastSelected;
|
private AbstractSceneExplorerNode lastSelected;
|
||||||
|
private Map<String, MaterialChangeProvider> materialChangeProviders = new HashMap<String, MaterialChangeProvider>();
|
||||||
|
private Map<String, List<MaterialChangeListener>> materialChangeListeners = new HashMap<String, List<MaterialChangeListener>>();
|
||||||
|
|
||||||
public SceneExplorerTopComponent() {
|
public SceneExplorerTopComponent() {
|
||||||
initComponents();
|
initComponents();
|
||||||
@ -95,7 +102,7 @@ public final class SceneExplorerTopComponent extends TopComponent implements Exp
|
|||||||
CopyAction copy = SystemAction.get(CopyAction.class);
|
CopyAction copy = SystemAction.get(CopyAction.class);
|
||||||
getActionMap().put(copy.getActionMapKey(), ExplorerUtils.actionCopy(explorerManager));
|
getActionMap().put(copy.getActionMapKey(), ExplorerUtils.actionCopy(explorerManager));
|
||||||
PasteAction paste = SystemAction.get(PasteAction.class);
|
PasteAction paste = SystemAction.get(PasteAction.class);
|
||||||
getActionMap().put(paste.getActionMapKey(), ExplorerUtils.actionPaste(explorerManager));
|
getActionMap().put(paste.getActionMapKey(), ExplorerUtils.actionPaste(explorerManager));
|
||||||
DeleteAction delete = SystemAction.get(DeleteAction.class);
|
DeleteAction delete = SystemAction.get(DeleteAction.class);
|
||||||
getActionMap().put(delete.getActionMapKey(), ExplorerUtils.actionDelete(explorerManager, true));
|
getActionMap().put(delete.getActionMapKey(), ExplorerUtils.actionDelete(explorerManager, true));
|
||||||
}
|
}
|
||||||
@ -238,7 +245,6 @@ public final class SceneExplorerTopComponent extends TopComponent implements Exp
|
|||||||
public UndoRedo getUndoRedo() {
|
public UndoRedo getUndoRedo() {
|
||||||
return Lookup.getDefault().lookup(UndoRedo.class);
|
return Lookup.getDefault().lookup(UndoRedo.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
private transient ExplorerManager explorerManager = new ExplorerManager();
|
private transient ExplorerManager explorerManager = new ExplorerManager();
|
||||||
|
|
||||||
public ExplorerManager getExplorerManager() {
|
public ExplorerManager getExplorerManager() {
|
||||||
@ -261,6 +267,10 @@ public final class SceneExplorerTopComponent extends TopComponent implements Exp
|
|||||||
public void sceneRequested(SceneRequest request) {
|
public void sceneRequested(SceneRequest request) {
|
||||||
this.request = request;
|
this.request = request;
|
||||||
JmeNode node = request.getJmeNode();
|
JmeNode node = request.getJmeNode();
|
||||||
|
for (Iterator it = materialChangeProviders.values().iterator(); it.hasNext();) {
|
||||||
|
MaterialChangeProvider provider = (MaterialChangeProvider) it.next();
|
||||||
|
provider.clearMaterialChangeListeners();
|
||||||
|
}
|
||||||
if (node != null) {
|
if (node != null) {
|
||||||
explorerManager.setRootContext(node);
|
explorerManager.setRootContext(node);
|
||||||
explorerManager.getRootContext().setDisplayName(node.getName());
|
explorerManager.getRootContext().setDisplayName(node.getName());
|
||||||
@ -282,4 +292,82 @@ public final class SceneExplorerTopComponent extends TopComponent implements Exp
|
|||||||
public AbstractSceneExplorerNode getLastSelected() {
|
public AbstractSceneExplorerNode getLastSelected() {
|
||||||
return lastSelected;
|
return lastSelected;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void addMaterialChangeProvider(MaterialChangeProvider provider) {
|
||||||
|
Logger.getLogger(SceneExplorerTopComponent.class.getName()).log(Level.INFO, "New materail provider registered for: {0}", provider.getKey());
|
||||||
|
materialChangeProviders.put(provider.getKey(), provider);
|
||||||
|
List<MaterialChangeListener> listeners = materialChangeListeners.get(provider.getKey());
|
||||||
|
if (listeners == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
provider.addAllMaterialChangeListener(listeners);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeMaterialChangeProvider(MaterialChangeProvider provider) {
|
||||||
|
Logger.getLogger(SceneExplorerTopComponent.class.getName()).log(Level.INFO, "Removing material provider for : {0}", provider.getKey());
|
||||||
|
System.out.println("Removing provider : " + provider.getKey());
|
||||||
|
materialChangeProviders.remove(provider.getKey());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addMaterialChangeListener(MaterialChangeListener listener) {
|
||||||
|
|
||||||
|
if (listener.getKey() != null) {
|
||||||
|
Logger.getLogger(SceneExplorerTopComponent.class.getName()).log(Level.INFO, "New material listener for : {0}", listener.getKey());
|
||||||
|
List<MaterialChangeListener> listeners = materialChangeListeners.get(listener.getKey());
|
||||||
|
if (listeners == null) {
|
||||||
|
listeners = new ArrayList<MaterialChangeListener>();
|
||||||
|
materialChangeListeners.put(listener.getKey(), listeners);
|
||||||
|
}
|
||||||
|
listeners.add(listener);
|
||||||
|
|
||||||
|
MaterialChangeProvider provider = materialChangeProviders.get(listener.getKey());
|
||||||
|
if (provider != null) {
|
||||||
|
provider.addMaterialChangeListener(listener);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void removeMaterialChangeListener(MaterialChangeListener listener) {
|
||||||
|
Logger.getLogger(SceneExplorerTopComponent.class.getName()).log(Level.INFO, "Removing material listener for: {0}", listener.getKey());
|
||||||
|
List<MaterialChangeListener> listeners = materialChangeListeners.get(listener.getKey());
|
||||||
|
if (listeners == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
listeners.remove(listener);
|
||||||
|
|
||||||
|
MaterialChangeProvider provider = materialChangeProviders.get(listener.getKey());
|
||||||
|
if (provider != null) {
|
||||||
|
provider.removeMaterialChangeListener(listener);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void swapMaterialChangeListener(MaterialChangeListener listener, String oldKey, String newKey) {
|
||||||
|
Logger.getLogger(SceneExplorerTopComponent.class.getName()).log(Level.INFO, "Swaping material listeners : {0} -> {1}", new Object[]{oldKey, newKey});
|
||||||
|
if (oldKey != null) {
|
||||||
|
List<MaterialChangeListener> listeners = materialChangeListeners.get(oldKey);
|
||||||
|
if (listeners != null) {
|
||||||
|
listeners.remove(listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
MaterialChangeProvider provider = materialChangeProviders.get(oldKey);
|
||||||
|
if (provider != null) {
|
||||||
|
provider.removeMaterialChangeListener(listener);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newKey != null) {
|
||||||
|
// assert newKey.equals(listener.getKey());
|
||||||
|
List<MaterialChangeListener> listeners = materialChangeListeners.get(newKey);
|
||||||
|
if (listeners == null) {
|
||||||
|
listeners = new ArrayList<MaterialChangeListener>();
|
||||||
|
materialChangeListeners.put(newKey, listeners);
|
||||||
|
}
|
||||||
|
listeners.add(listener);
|
||||||
|
|
||||||
|
MaterialChangeProvider provider = materialChangeProviders.get(newKey);
|
||||||
|
if (provider != null) {
|
||||||
|
provider.addMaterialChangeListener(listener);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -31,11 +31,16 @@
|
|||||||
*/
|
*/
|
||||||
package com.jme3.gde.core.sceneexplorer.nodes;
|
package com.jme3.gde.core.sceneexplorer.nodes;
|
||||||
|
|
||||||
|
import com.jme3.gde.core.scene.SceneApplication;
|
||||||
|
import com.jme3.gde.core.sceneexplorer.SceneExplorerTopComponent;
|
||||||
import com.jme3.gde.core.sceneexplorer.nodes.SceneExplorerNode;
|
import com.jme3.gde.core.sceneexplorer.nodes.SceneExplorerNode;
|
||||||
|
import com.jme3.gde.core.sceneexplorer.MaterialChangeListener;
|
||||||
import com.jme3.material.Material;
|
import com.jme3.material.Material;
|
||||||
import com.jme3.scene.Geometry;
|
import com.jme3.scene.Geometry;
|
||||||
import com.jme3.scene.Mesh;
|
import com.jme3.scene.Mesh;
|
||||||
import java.awt.Image;
|
import java.awt.Image;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.concurrent.Callable;
|
||||||
import org.openide.loaders.DataObject;
|
import org.openide.loaders.DataObject;
|
||||||
import org.openide.nodes.Sheet;
|
import org.openide.nodes.Sheet;
|
||||||
import org.openide.util.ImageUtilities;
|
import org.openide.util.ImageUtilities;
|
||||||
@ -44,8 +49,8 @@ import org.openide.util.ImageUtilities;
|
|||||||
*
|
*
|
||||||
* @author normenhansen
|
* @author normenhansen
|
||||||
*/
|
*/
|
||||||
@org.openide.util.lookup.ServiceProvider(service=SceneExplorerNode.class)
|
@org.openide.util.lookup.ServiceProvider(service = SceneExplorerNode.class)
|
||||||
public class JmeGeometry extends JmeSpatial {
|
public class JmeGeometry extends JmeSpatial implements MaterialChangeListener {
|
||||||
|
|
||||||
private static Image smallImage =
|
private static Image smallImage =
|
||||||
ImageUtilities.loadImage("com/jme3/gde/core/sceneexplorer/nodes/icons/geometry.gif");
|
ImageUtilities.loadImage("com/jme3/gde/core/sceneexplorer/nodes/icons/geometry.gif");
|
||||||
@ -58,6 +63,18 @@ public class JmeGeometry extends JmeSpatial {
|
|||||||
super(spatial, children);
|
super(spatial, children);
|
||||||
getLookupContents().add(spatial);
|
getLookupContents().add(spatial);
|
||||||
this.geom = spatial;
|
this.geom = spatial;
|
||||||
|
java.awt.EventQueue.invokeLater(new Runnable() {
|
||||||
|
|
||||||
|
public void run() {
|
||||||
|
try {
|
||||||
|
SceneExplorerTopComponent.findInstance().addMaterialChangeListener(JmeGeometry.this);
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
setName(spatial.getName());
|
setName(spatial.getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -71,6 +88,23 @@ public class JmeGeometry extends JmeSpatial {
|
|||||||
return smallImage;
|
return smallImage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void destroy() throws IOException {
|
||||||
|
super.destroy();
|
||||||
|
java.awt.EventQueue.invokeLater(new Runnable() {
|
||||||
|
|
||||||
|
public void run() {
|
||||||
|
try {
|
||||||
|
SceneExplorerTopComponent.findInstance().removeMaterialChangeListener(JmeGeometry.this);
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Sheet createSheet() {
|
protected Sheet createSheet() {
|
||||||
//TODO: multithreading..
|
//TODO: multithreading..
|
||||||
@ -92,18 +126,62 @@ public class JmeGeometry extends JmeSpatial {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public Class getExplorerObjectClass() {
|
public Class getExplorerObjectClass() {
|
||||||
return Geometry.class;
|
return Geometry.class;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public Class getExplorerNodeClass() {
|
public Class getExplorerNodeClass() {
|
||||||
return JmeGeometry.class;
|
return JmeGeometry.class;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public org.openide.nodes.Node[] createNodes(Object key, DataObject key2, boolean cookie) {
|
public org.openide.nodes.Node[] createNodes(Object key, DataObject key2, boolean cookie) {
|
||||||
JmeSpatialChildren children=new JmeSpatialChildren((com.jme3.scene.Spatial)key);
|
JmeSpatialChildren children = new JmeSpatialChildren((com.jme3.scene.Spatial) key);
|
||||||
children.setReadOnly(cookie);
|
children.setReadOnly(cookie);
|
||||||
children.setDataObject(key2);
|
children.setDataObject(key2);
|
||||||
return new org.openide.nodes.Node[]{new JmeGeometry((Geometry) key, children).setReadOnly(cookie)};
|
return new org.openide.nodes.Node[]{new JmeGeometry((Geometry) key, children).setReadOnly(cookie)};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void propertyChange(String name, final Object before, final Object after) {
|
||||||
|
super.propertyChange(name, before, after);
|
||||||
|
System.out.println(name);
|
||||||
|
if (name.equals("Material")) {
|
||||||
|
System.out.println(before.toString()+" "+after.toString());
|
||||||
|
java.awt.EventQueue.invokeLater(new Runnable() {
|
||||||
|
|
||||||
|
public void run() {
|
||||||
|
try {
|
||||||
|
SceneExplorerTopComponent.findInstance().swapMaterialChangeListener(JmeGeometry.this, ((Material) before).getAssetName(), ((Material) after).getAssetName());
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMaterial(final Material material) {
|
||||||
|
if (material.getAssetName().equals(getKey())) {
|
||||||
|
SceneApplication.getApplication().enqueue(new Callable<Object>() {
|
||||||
|
|
||||||
|
public Object call() throws Exception {
|
||||||
|
geom.setMaterial(material);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Geometry getGeometry() {
|
||||||
|
return geom;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getKey() {
|
||||||
|
return geom.getMaterial().getAssetName();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -119,6 +119,7 @@ public class JmeParticleEmitter extends JmeGeometry {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void propertyChange(String name, Object before, Object after) {
|
public void propertyChange(String name, Object before, Object after) {
|
||||||
|
super.propertyChange(name, before, after);
|
||||||
if (!name.equals("Emit all particles")) {
|
if (!name.equals("Emit all particles")) {
|
||||||
fireSave(true);
|
fireSave(true);
|
||||||
firePropertyChange(name, before, after);
|
firePropertyChange(name, before, after);
|
||||||
|
@ -102,22 +102,25 @@ public final class SceneViewerTopComponent extends TopComponent {
|
|||||||
});
|
});
|
||||||
addKeyListener(new KeyListener() {
|
addKeyListener(new KeyListener() {
|
||||||
|
|
||||||
public void keyTyped(KeyEvent evt) {
|
public void keyTyped(KeyEvent evt) {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void keyPressed(KeyEvent evt) {
|
public void keyPressed(KeyEvent evt) {
|
||||||
int code = AwtKeyInput.convertAwtKey(evt.getKeyCode());
|
int code = AwtKeyInput.convertAwtKey(evt.getKeyCode());
|
||||||
KeyInputEvent keyEvent = new KeyInputEvent(code, evt.getKeyChar(), true, false);
|
KeyInputEvent keyEvent = new KeyInputEvent(code, evt.getKeyChar(), true, false);
|
||||||
keyEvent.setTime(evt.getWhen());
|
keyEvent.setTime(evt.getWhen());
|
||||||
app.getActiveCameraController().onKeyEvent(keyEvent);
|
if (app.getActiveCameraController() != null) {
|
||||||
|
app.getActiveCameraController().onKeyEvent(keyEvent);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void keyReleased(KeyEvent evt) {
|
public void keyReleased(KeyEvent evt) {
|
||||||
int code = AwtKeyInput.convertAwtKey(evt.getKeyCode());
|
int code = AwtKeyInput.convertAwtKey(evt.getKeyCode());
|
||||||
KeyInputEvent keyEvent = new KeyInputEvent(code, evt.getKeyChar(), false, false);
|
KeyInputEvent keyEvent = new KeyInputEvent(code, evt.getKeyChar(), false, false);
|
||||||
keyEvent.setTime(evt.getWhen());
|
keyEvent.setTime(evt.getWhen());
|
||||||
|
if (app.getActiveCameraController() != null) {
|
||||||
app.getActiveCameraController().onKeyEvent(keyEvent);
|
app.getActiveCameraController().onKeyEvent(keyEvent);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user