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.sceneexplorer.nodes.AbstractSceneExplorerNode;
|
||||
import com.jme3.gde.core.sceneexplorer.nodes.JmeNode;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
import org.openide.util.Lookup.Result;
|
||||
import org.openide.util.NbBundle;
|
||||
@ -77,6 +82,8 @@ public final class SceneExplorerTopComponent extends TopComponent implements Exp
|
||||
private final Result<AbstractSceneExplorerNode> nodeSelectionResult;
|
||||
private AbstractSceneExplorerNode selectedSpatial;
|
||||
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() {
|
||||
initComponents();
|
||||
@ -95,7 +102,7 @@ public final class SceneExplorerTopComponent extends TopComponent implements Exp
|
||||
CopyAction copy = SystemAction.get(CopyAction.class);
|
||||
getActionMap().put(copy.getActionMapKey(), ExplorerUtils.actionCopy(explorerManager));
|
||||
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);
|
||||
getActionMap().put(delete.getActionMapKey(), ExplorerUtils.actionDelete(explorerManager, true));
|
||||
}
|
||||
@ -238,7 +245,6 @@ public final class SceneExplorerTopComponent extends TopComponent implements Exp
|
||||
public UndoRedo getUndoRedo() {
|
||||
return Lookup.getDefault().lookup(UndoRedo.class);
|
||||
}
|
||||
|
||||
private transient ExplorerManager explorerManager = new ExplorerManager();
|
||||
|
||||
public ExplorerManager getExplorerManager() {
|
||||
@ -261,6 +267,10 @@ public final class SceneExplorerTopComponent extends TopComponent implements Exp
|
||||
public void sceneRequested(SceneRequest request) {
|
||||
this.request = request;
|
||||
JmeNode node = request.getJmeNode();
|
||||
for (Iterator it = materialChangeProviders.values().iterator(); it.hasNext();) {
|
||||
MaterialChangeProvider provider = (MaterialChangeProvider) it.next();
|
||||
provider.clearMaterialChangeListeners();
|
||||
}
|
||||
if (node != null) {
|
||||
explorerManager.setRootContext(node);
|
||||
explorerManager.getRootContext().setDisplayName(node.getName());
|
||||
@ -282,4 +292,82 @@ public final class SceneExplorerTopComponent extends TopComponent implements Exp
|
||||
public AbstractSceneExplorerNode getLastSelected() {
|
||||
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;
|
||||
|
||||
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.MaterialChangeListener;
|
||||
import com.jme3.material.Material;
|
||||
import com.jme3.scene.Geometry;
|
||||
import com.jme3.scene.Mesh;
|
||||
import java.awt.Image;
|
||||
import java.io.IOException;
|
||||
import java.util.concurrent.Callable;
|
||||
import org.openide.loaders.DataObject;
|
||||
import org.openide.nodes.Sheet;
|
||||
import org.openide.util.ImageUtilities;
|
||||
@ -44,8 +49,8 @@ import org.openide.util.ImageUtilities;
|
||||
*
|
||||
* @author normenhansen
|
||||
*/
|
||||
@org.openide.util.lookup.ServiceProvider(service=SceneExplorerNode.class)
|
||||
public class JmeGeometry extends JmeSpatial {
|
||||
@org.openide.util.lookup.ServiceProvider(service = SceneExplorerNode.class)
|
||||
public class JmeGeometry extends JmeSpatial implements MaterialChangeListener {
|
||||
|
||||
private static Image smallImage =
|
||||
ImageUtilities.loadImage("com/jme3/gde/core/sceneexplorer/nodes/icons/geometry.gif");
|
||||
@ -58,6 +63,18 @@ public class JmeGeometry extends JmeSpatial {
|
||||
super(spatial, children);
|
||||
getLookupContents().add(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());
|
||||
}
|
||||
|
||||
@ -71,6 +88,23 @@ public class JmeGeometry extends JmeSpatial {
|
||||
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
|
||||
protected Sheet createSheet() {
|
||||
//TODO: multithreading..
|
||||
@ -92,18 +126,62 @@ public class JmeGeometry extends JmeSpatial {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class getExplorerObjectClass() {
|
||||
return Geometry.class;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Class getExplorerNodeClass() {
|
||||
return JmeGeometry.class;
|
||||
}
|
||||
|
||||
@Override
|
||||
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.setDataObject(key2);
|
||||
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
|
||||
public void propertyChange(String name, Object before, Object after) {
|
||||
super.propertyChange(name, before, after);
|
||||
if (!name.equals("Emit all particles")) {
|
||||
fireSave(true);
|
||||
firePropertyChange(name, before, after);
|
||||
|
@ -102,22 +102,25 @@ public final class SceneViewerTopComponent extends TopComponent {
|
||||
});
|
||||
addKeyListener(new KeyListener() {
|
||||
|
||||
public void keyTyped(KeyEvent evt) {
|
||||
public void keyTyped(KeyEvent evt) {
|
||||
}
|
||||
|
||||
public void keyPressed(KeyEvent evt) {
|
||||
int code = AwtKeyInput.convertAwtKey(evt.getKeyCode());
|
||||
KeyInputEvent keyEvent = new KeyInputEvent(code, evt.getKeyChar(), true, false);
|
||||
keyEvent.setTime(evt.getWhen());
|
||||
app.getActiveCameraController().onKeyEvent(keyEvent);
|
||||
keyEvent.setTime(evt.getWhen());
|
||||
if (app.getActiveCameraController() != null) {
|
||||
app.getActiveCameraController().onKeyEvent(keyEvent);
|
||||
}
|
||||
}
|
||||
|
||||
public void keyReleased(KeyEvent evt) {
|
||||
int code = AwtKeyInput.convertAwtKey(evt.getKeyCode());
|
||||
KeyInputEvent keyEvent = new KeyInputEvent(code, evt.getKeyChar(), false, false);
|
||||
keyEvent.setTime(evt.getWhen());
|
||||
|
||||
app.getActiveCameraController().onKeyEvent(keyEvent);
|
||||
if (app.getActiveCameraController() != null) {
|
||||
app.getActiveCameraController().onKeyEvent(keyEvent);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user