-  Material live update in material support : now changing parameters in Material editor affect the scene in real time

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@7985 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
3.0
rem..om 14 years ago
parent 3bb3277f3a
commit b035d52fa2
  1. 34
      sdk/jme3-materialeditor/src/com/jme3/gde/materials/MaterialPropertyEditor.java
  2. 61
      sdk/jme3-materialeditor/src/com/jme3/gde/materials/multiview/MaterialEditorTopComponent.java

@ -31,7 +31,6 @@
*/ */
package com.jme3.gde.materials; package com.jme3.gde.materials;
import com.jme3.asset.AssetKey;
import com.jme3.asset.DesktopAssetManager; import com.jme3.asset.DesktopAssetManager;
import com.jme3.gde.core.assets.ProjectAssetManager; import com.jme3.gde.core.assets.ProjectAssetManager;
import com.jme3.gde.core.scene.SceneApplication; import com.jme3.gde.core.scene.SceneApplication;
@ -48,7 +47,6 @@ import java.awt.Rectangle;
import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener; import java.beans.PropertyChangeListener;
import java.beans.PropertyEditor; import java.beans.PropertyEditor;
import java.io.IOException;
import java.util.Iterator; import java.util.Iterator;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.concurrent.Callable; import java.util.concurrent.Callable;
@ -99,29 +97,33 @@ public class MaterialPropertyEditor implements PropertyEditor, SceneExplorerProp
} }
public void setAsText(final String text) throws IllegalArgumentException { public void setAsText(final String text) throws IllegalArgumentException {
if ("create j3m file".equals(text)) { if ("create j3m file".equals(text)) {
AbstractSceneExplorerNode geom = SceneExplorerTopComponent.findInstance().getLastSelected();
assert (geom != null);
ProjectAssetManager pm = geom.getLookup().lookup(ProjectAssetManager.class);
assert (pm != null);
DataObject obj = geom.getLookup().lookup(DataObject.class);
assert (obj != null);
FileObject currentFile = obj.getPrimaryFile();
FileObject currentFolder = currentFile.getParent();
try { try {
AbstractSceneExplorerNode geom = SceneExplorerTopComponent.findInstance().getLastSelected();
assert (geom != null);
ProjectAssetManager pm = geom.getLookup().lookup(ProjectAssetManager.class);
assert (pm != null);
DataObject obj = geom.getLookup().lookup(DataObject.class);
assert (obj != null);
FileObject currentFile = obj.getPrimaryFile();
FileObject currentFolder = currentFile.getParent();
int i = 0; int i = 0;
FileObject newFile = currentFolder.getFileObject(currentFile.getName(), "j3m"); String newFileName = currentFile.getName() + "-" + geom.getName();
FileObject newFile = currentFolder.getFileObject(newFileName, "j3m");
while (newFile != null) { while (newFile != null) {
i++; i++;
newFile = currentFolder.getFileObject(currentFile.getName() + "-" + i, "j3m"); newFileName = currentFile.getName() + "-" + geom.getName() + "-" + i;
newFile = currentFolder.getFileObject(newFileName, "j3m");
} }
newFile = currentFolder.createData(currentFile.getName() + "-" + i, "j3m"); newFile = currentFolder.createData(newFileName, "j3m");
EditableMaterialFile properties = new EditableMaterialFile(newFile, pm); EditableMaterialFile properties = new EditableMaterialFile(newFile, pm);
material.setKey(new MaterialKey(pm.getRelativeAssetPath(newFile.getPath()))); material.setKey(new MaterialKey(pm.getRelativeAssetPath(newFile.getPath())));
properties.setAsMaterial(material); properties.setAsMaterial(material);
currentFolder.refresh(); currentFolder.refresh();
applyMaterial(material.getAssetName()); applyMaterial(material.getAssetName());
} catch (IOException ex) { } catch (Exception ex) {
Exceptions.printStackTrace(ex); Exceptions.printStackTrace(ex);
return; return;
} }
@ -200,7 +202,7 @@ public class MaterialPropertyEditor implements PropertyEditor, SceneExplorerProp
for (Iterator<PropertyChangeListener> it = listeners.iterator(); it.hasNext();) { for (Iterator<PropertyChangeListener> it = listeners.iterator(); it.hasNext();) {
PropertyChangeListener propertyChangeListener = it.next(); PropertyChangeListener propertyChangeListener = it.next();
//TODO: check what the "programmatic name" is supposed to be here.. for now its Quaternion //TODO: check what the "programmatic name" is supposed to be here.. for now its Quaternion
propertyChangeListener.propertyChange(new PropertyChangeEvent(this, null, before, after)); propertyChangeListener.propertyChange(new PropertyChangeEvent(this, "Material", before, after));
} }
} }

@ -4,20 +4,28 @@
*/ */
package com.jme3.gde.materials.multiview; package com.jme3.gde.materials.multiview;
import com.jme3.asset.MaterialKey;
import com.jme3.gde.core.assets.AssetDataObject; import com.jme3.gde.core.assets.AssetDataObject;
import com.jme3.gde.core.assets.ProjectAssetManager; import com.jme3.gde.core.assets.ProjectAssetManager;
import com.jme3.gde.core.sceneexplorer.SceneExplorerTopComponent;
import com.jme3.gde.materials.EditableMaterialFile; import com.jme3.gde.materials.EditableMaterialFile;
import com.jme3.gde.materials.MaterialProperty; import com.jme3.gde.materials.MaterialProperty;
import com.jme3.gde.core.sceneexplorer.MaterialChangeListener;
import com.jme3.gde.core.sceneexplorer.MaterialChangeProvider;
import com.jme3.gde.core.sceneviewer.SceneViewerTopComponent;
import com.jme3.gde.materials.multiview.widgets.MaterialPropertyWidget; import com.jme3.gde.materials.multiview.widgets.MaterialPropertyWidget;
import com.jme3.gde.materials.multiview.widgets.MaterialWidgetListener; import com.jme3.gde.materials.multiview.widgets.MaterialWidgetListener;
import com.jme3.gde.materials.multiview.widgets.WidgetFactory; import com.jme3.gde.materials.multiview.widgets.WidgetFactory;
import com.jme3.material.Material;
import java.awt.Component; import java.awt.Component;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator; import java.util.Iterator;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Set;
import java.util.logging.Logger; import java.util.logging.Logger;
import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener; import javax.swing.event.DocumentListener;
@ -36,13 +44,14 @@ import org.openide.util.HelpCtx;
import org.openide.util.Lookup; import org.openide.util.Lookup;
import org.openide.util.lookup.InstanceContent; import org.openide.util.lookup.InstanceContent;
import org.openide.windows.CloneableTopComponent; import org.openide.windows.CloneableTopComponent;
import org.openide.windows.Mode;
/** /**
* Top component which displays something. * Top component which displays something.
*/ */
@ConvertAsProperties(dtd = "-//com.jme3.gde.materials.multiview//MaterialEditor//EN", @ConvertAsProperties(dtd = "-//com.jme3.gde.materials.multiview//MaterialEditor//EN",
autostore = false) autostore = false)
public final class MaterialEditorTopComponent extends CloneableTopComponent implements MaterialWidgetListener { public final class MaterialEditorTopComponent extends CloneableTopComponent implements MaterialWidgetListener, MaterialChangeProvider {
private static MaterialEditorTopComponent instance; private static MaterialEditorTopComponent instance;
/** path to the icon used by the component and its open action */ /** path to the icon used by the component and its open action */
@ -54,10 +63,12 @@ public final class MaterialEditorTopComponent extends CloneableTopComponent impl
private DataObject dataObject; private DataObject dataObject;
private EditableMaterialFile materialFile; private EditableMaterialFile materialFile;
private String materialFileName; private String materialFileName;
private String relativeMaterialFileName;
private ProjectAssetManager manager; private ProjectAssetManager manager;
private SaveCookie saveCookie = new SaveCookieImpl(); private SaveCookie saveCookie = new SaveCookieImpl();
private boolean saveImmediate = true; private boolean saveImmediate = true;
private boolean updateProperties = false; private boolean updateProperties = false;
private List<MaterialChangeListener> materialListeners = new ArrayList<MaterialChangeListener>();
public MaterialEditorTopComponent() { public MaterialEditorTopComponent() {
} }
@ -66,6 +77,7 @@ public final class MaterialEditorTopComponent extends CloneableTopComponent impl
this.dataObject = dataObject; this.dataObject = dataObject;
materialFileName = dataObject.getPrimaryFile().getPath(); materialFileName = dataObject.getPrimaryFile().getPath();
initWindow(); initWindow();
} }
private void initWindow() { private void initWindow() {
@ -87,8 +99,17 @@ public final class MaterialEditorTopComponent extends CloneableTopComponent impl
updateProperties(); updateProperties();
materialPreviewWidget1.showMaterial(manager, materialFileName); materialPreviewWidget1.showMaterial(manager, materialFileName);
relativeMaterialFileName = manager.getRelativeAssetPath(materialFileName);
for (Iterator it = WindowManager.getDefault().getModes().iterator(); it.hasNext();) {
Mode mode = (Mode) it.next();
System.out.println(mode.getName());
}
} }
/** This method is called from within the constructor to /** This method is called from within the constructor to
* initialize the form. * initialize the form.
* WARNING: Do NOT modify this code. The content of this method is * WARNING: Do NOT modify this code. The content of this method is
@ -316,6 +337,7 @@ public final class MaterialEditorTopComponent extends CloneableTopComponent impl
private void jCheckBox1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jCheckBox1ActionPerformed private void jCheckBox1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jCheckBox1ActionPerformed
saveImmediate = jCheckBox1.isSelected(); saveImmediate = jCheckBox1.isSelected();
}//GEN-LAST:event_jCheckBox1ActionPerformed }//GEN-LAST:event_jCheckBox1ActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables // Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JCheckBox jCheckBox1; private javax.swing.JCheckBox jCheckBox1;
private javax.swing.JComboBox jComboBox1; private javax.swing.JComboBox jComboBox1;
@ -388,12 +410,14 @@ public final class MaterialEditorTopComponent extends CloneableTopComponent impl
@Override @Override
public void componentOpened() { public void componentOpened() {
// TODO add custom code on component opening SceneExplorerTopComponent.getDefault().addMaterialChangeProvider(this);
} }
@Override @Override
public void componentClosed() { public void componentClosed() {
materialPreviewWidget1.cleanUp(); materialPreviewWidget1.cleanUp();
clearMaterialChangeListeners();
SceneExplorerTopComponent.getDefault().removeMaterialChangeProvider(this);
} }
void writeProperties(java.util.Properties p) { void writeProperties(java.util.Properties p) {
@ -429,6 +453,27 @@ public final class MaterialEditorTopComponent extends CloneableTopComponent impl
return PREFERRED_ID; return PREFERRED_ID;
} }
public String getKey() {
return relativeMaterialFileName;
}
public void addMaterialChangeListener(MaterialChangeListener listener) {
materialListeners.add(listener);
}
public void removeMaterialChangeListener(MaterialChangeListener listener) {
materialListeners.remove(listener);
}
public void clearMaterialChangeListeners() {
materialListeners.clear();
}
public void addAllMaterialChangeListener(List<MaterialChangeListener> listeners) {
materialListeners.addAll(listeners);
}
private class DocumentChangeListener implements DocumentListener { private class DocumentChangeListener implements DocumentListener {
String newline = "\n"; String newline = "\n";
@ -584,5 +629,17 @@ public final class MaterialEditorTopComponent extends CloneableTopComponent impl
public void propertyChanged(MaterialProperty property) { public void propertyChanged(MaterialProperty property) {
String string = materialFile.getUpdatedContent(); String string = materialFile.getUpdatedContent();
jTextArea1.setText(string); jTextArea1.setText(string);
try {
MaterialKey key = new MaterialKey(manager.getRelativeAssetPath(materialFileName));
manager.deleteFromCache(key);
Material material = (Material) manager.loadAsset(key);
if (material != null) {
for (MaterialChangeListener listener : materialListeners) {
listener.setMaterial(material);
}
}
} catch (Exception e) {
}
} }
} }

Loading…
Cancel
Save