git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@10441 75d07b2b-3a1a-0410-a2c5-0572b91ccdca3.0
@ -0,0 +1,4 @@ |
||||
MatParamTopComponent.jScrollPane2.TabConstraints.tabTitle=Parameters |
||||
MatParamTopComponent.jScrollPane3.TabConstraints.tabTitle=Render states |
||||
MatParamTopComponent.jScrollPane3.TabConstraints.tabToolTip=Material parameters |
||||
MatParamTopComponent.jScrollPane2.TabConstraints.tabToolTip=Additional render states |
@ -0,0 +1,264 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition; |
||||
|
||||
import com.jme3.asset.AssetKey; |
||||
import com.jme3.asset.MaterialKey; |
||||
import com.jme3.gde.core.assets.ProjectAssetManager; |
||||
import com.jme3.gde.core.scene.SceneApplication; |
||||
import com.jme3.gde.materialdefinition.fileStructure.MatDefBlock; |
||||
import com.jme3.gde.materialdefinition.fileStructure.ShaderNodeBlock; |
||||
import com.jme3.gde.materialdefinition.fileStructure.TechniqueBlock; |
||||
import com.jme3.gde.materialdefinition.fileStructure.UberStatement; |
||||
import com.jme3.gde.materialdefinition.fileStructure.leaves.InputMappingBlock; |
||||
import com.jme3.gde.materialdefinition.fileStructure.leaves.LeafStatement; |
||||
import com.jme3.gde.materialdefinition.fileStructure.leaves.OutputMappingBlock; |
||||
import com.jme3.gde.materialdefinition.navigator.node.MatDefNode; |
||||
import com.jme3.material.MatParam; |
||||
import com.jme3.material.Material; |
||||
import com.jme3.material.MaterialDef; |
||||
import com.jme3.material.plugins.J3MLoader; |
||||
import com.jme3.shader.Glsl100ShaderGenerator; |
||||
import com.jme3.shader.Glsl150ShaderGenerator; |
||||
import com.jme3.shader.Shader; |
||||
import com.jme3.shader.ShaderGenerator; |
||||
import com.jme3.util.blockparser.BlockLanguageParser; |
||||
import com.jme3.util.blockparser.Statement; |
||||
import java.beans.PropertyChangeEvent; |
||||
import java.beans.PropertyChangeListener; |
||||
import java.io.IOException; |
||||
import java.util.ArrayList; |
||||
import java.util.Collection; |
||||
import java.util.Iterator; |
||||
import java.util.List; |
||||
import java.util.logging.Level; |
||||
import java.util.logging.Logger; |
||||
import javax.swing.text.BadLocationException; |
||||
import javax.swing.text.SimpleAttributeSet; |
||||
import javax.swing.text.StyledDocument; |
||||
import org.openide.cookies.EditorCookie; |
||||
import org.openide.explorer.ExplorerManager; |
||||
import org.openide.filesystems.FileLock; |
||||
import org.openide.filesystems.FileObject; |
||||
import org.openide.nodes.Node; |
||||
import org.openide.text.NbDocument; |
||||
import org.openide.util.Exceptions; |
||||
import org.openide.util.Lookup; |
||||
import org.openide.util.WeakListeners; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public class EditableMatDefFile { |
||||
|
||||
private FileObject matDefFile; |
||||
private MatDefDataObject obj; |
||||
private Material material; |
||||
private MatDefBlock matDefStructure; |
||||
private TechniqueBlock currentTechnique; |
||||
private MaterialDef materialDef; |
||||
private ProjectAssetManager assetManager; |
||||
// MatParamTopComponent matParamComponent;
|
||||
private ShaderGenerator glsl100; |
||||
private ShaderGenerator glsl150; |
||||
private String selectedTechnique = "Default"; |
||||
private final static String GLSL100 = "GLSL100"; |
||||
private final static String GLSL150 = "GLSL150"; |
||||
private Lookup lookup; |
||||
|
||||
public EditableMatDefFile(Lookup lookup) { |
||||
obj = lookup.lookup(MatDefDataObject.class); |
||||
|
||||
this.matDefFile = obj.getPrimaryFile(); |
||||
this.assetManager = lookup.lookup(ProjectAssetManager.class); |
||||
this.glsl100 = new Glsl100ShaderGenerator(assetManager); |
||||
this.glsl150 = new Glsl150ShaderGenerator(assetManager); |
||||
this.lookup = lookup; |
||||
|
||||
materialDef = null; |
||||
matDefStructure = null; |
||||
FileLock lock = null; |
||||
|
||||
try { |
||||
lock = matDefFile.lock(); |
||||
List<Statement> sta = BlockLanguageParser.parse(obj.getPrimaryFile().getInputStream()); |
||||
matDefStructure = new MatDefBlock(sta.get(0)); |
||||
// System.err.println(block.toString());
|
||||
materialDef = (MaterialDef) assetManager.loadAsset(assetManager.getRelativeAssetPath(matDefFile.getPath())); |
||||
lock.releaseLock(); |
||||
} catch (Exception ex) { |
||||
Exceptions.printStackTrace(ex); |
||||
} finally { |
||||
if (lock != null) { |
||||
lock.releaseLock(); |
||||
} |
||||
} |
||||
if (materialDef != null) { |
||||
currentTechnique = matDefStructure.getTechniques().get(0); |
||||
registerListener(matDefStructure); |
||||
obj.getLookupContents().add(matDefStructure); |
||||
updateLookupWithMaterialData(obj); |
||||
} |
||||
|
||||
} |
||||
|
||||
private void registerListener(Statement sta) { |
||||
if (sta instanceof UberStatement) { |
||||
((UberStatement) sta).addPropertyChangeListener(WeakListeners.propertyChange(changeListener, ((UberStatement) sta))); |
||||
} else if (sta instanceof LeafStatement) { |
||||
((LeafStatement) sta).addPropertyChangeListener(WeakListeners.propertyChange(changeListener, ((LeafStatement) sta))); |
||||
} |
||||
if (sta.getContents() != null) { |
||||
for (Statement statement : sta.getContents()) { |
||||
registerListener(statement); |
||||
} |
||||
} |
||||
} |
||||
|
||||
public void buildOverview(ExplorerManager mgr) { |
||||
if (materialDef != null) { |
||||
mgr.setRootContext(new MatDefNode(lookup)); |
||||
|
||||
} else { |
||||
mgr.setRootContext(Node.EMPTY); |
||||
} |
||||
} |
||||
|
||||
public String getShaderCode(String version, Shader.ShaderType type) { |
||||
try { |
||||
material.selectTechnique("Default", SceneApplication.getApplication().getRenderManager()); |
||||
Shader s = null; |
||||
if (version.equals(GLSL100)) { |
||||
s = glsl100.generateShader(material.getActiveTechnique()); |
||||
} else { |
||||
s = glsl150.generateShader(material.getActiveTechnique()); |
||||
} |
||||
for (Iterator<Shader.ShaderSource> it = s.getSources().iterator(); it.hasNext();) { |
||||
Shader.ShaderSource source = it.next(); |
||||
if (source.getType() == type) { |
||||
return source.getSource(); |
||||
} |
||||
} |
||||
return ""; |
||||
} catch (Exception e) { |
||||
Exceptions.printStackTrace(e); |
||||
return "error generating shader " + e.getMessage(); |
||||
} |
||||
} |
||||
|
||||
// public MatParamTopComponent getMatParamComponent() {
|
||||
// return matParamComponent;
|
||||
// }
|
||||
//
|
||||
// public void setMatParamComponent(MatParamTopComponent matParamComponent) {
|
||||
// this.matParamComponent = matParamComponent;
|
||||
// }
|
||||
public TechniqueBlock getCurrentTechnique() { |
||||
return currentTechnique; |
||||
} |
||||
|
||||
public MatDefBlock getMatDefStructure() { |
||||
return matDefStructure; |
||||
} |
||||
private MatStructChangeListener changeListener = new MatStructChangeListener(); |
||||
J3MLoader loader = new J3MLoader(); |
||||
|
||||
private void updateLookupWithMaterialData(MatDefDataObject obj) { |
||||
obj.getLookupContents().add(materialDef); |
||||
material = new Material(materialDef); |
||||
|
||||
try { |
||||
material.selectTechnique("Default", SceneApplication.getApplication().getRenderManager()); |
||||
if (matToRemove != null) { |
||||
for (MatParam matParam : matToRemove.getParams()) { |
||||
material.setParam(matParam.getName(), matParam.getVarType(), matParam.getValue()); |
||||
} |
||||
obj.getLookupContents().remove(matToRemove); |
||||
matToRemove = null; |
||||
} |
||||
obj.getLookupContents().add(material); |
||||
} catch (Exception e) { |
||||
Logger.getLogger(EditableMatDefFile.class.getName()).log(Level.WARNING, "Error making material {0}", e.getMessage()); |
||||
material = matToRemove; |
||||
} |
||||
} |
||||
|
||||
private class MatStructChangeListener implements PropertyChangeListener { |
||||
|
||||
public void propertyChange(PropertyChangeEvent evt) { |
||||
if (evt.getSource() instanceof ShaderNodeBlock && evt.getPropertyName().equals("name")) { |
||||
String oldValue = (String) evt.getOldValue(); |
||||
String newValue = (String) evt.getNewValue(); |
||||
for (ShaderNodeBlock shaderNodeBlock : currentTechnique.getShaderNodes()) { |
||||
List<InputMappingBlock> lin = shaderNodeBlock.getInputs(); |
||||
if (lin != null) { |
||||
for (InputMappingBlock inputMappingBlock : shaderNodeBlock.getInputs()) { |
||||
if (inputMappingBlock.getLeftNameSpace().equals(oldValue)) { |
||||
inputMappingBlock.setLeftNameSpace(newValue); |
||||
} |
||||
if (inputMappingBlock.getRightNameSpace().equals(oldValue)) { |
||||
inputMappingBlock.setRightNameSpace(newValue); |
||||
} |
||||
} |
||||
} |
||||
List<OutputMappingBlock> l = shaderNodeBlock.getOutputs(); |
||||
if (l != null) { |
||||
for (OutputMappingBlock outputMappingBlock : l) { |
||||
if (outputMappingBlock.getRightNameSpace().equals(oldValue)) { |
||||
outputMappingBlock.setRightNameSpace(newValue); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
if (evt.getPropertyName().equals(MatDefBlock.ADD_MAT_PARAM) |
||||
|| evt.getPropertyName().equals(TechniqueBlock.ADD_SHADER_NODE) |
||||
|| evt.getPropertyName().equals(ShaderNodeBlock.ADD_MAPPING)) { |
||||
registerListener((Statement) evt.getNewValue()); |
||||
} |
||||
applyChange(); |
||||
} |
||||
} |
||||
Material matToRemove; |
||||
|
||||
private void applyChange() { |
||||
|
||||
try { |
||||
EditorCookie ec = (EditorCookie) lookup.lookup(EditorCookie.class); |
||||
final StyledDocument doc = ec.getDocument(); |
||||
final BadLocationException[] exc = new BadLocationException[]{null}; |
||||
NbDocument.runAtomicAsUser(ec.getDocument(), new Runnable() { |
||||
public void run() { |
||||
try { |
||||
doc.remove(0, doc.getLength()); |
||||
doc.insertString(doc.getLength(), |
||||
matDefStructure.toString(), |
||||
SimpleAttributeSet.EMPTY); |
||||
} catch (BadLocationException e) { |
||||
exc[0] = e; |
||||
} |
||||
} |
||||
}); |
||||
} catch (BadLocationException ex) { |
||||
Exceptions.printStackTrace(ex); |
||||
} |
||||
AssetKey<MaterialDef> key = new AssetKey<MaterialDef>(assetManager.getRelativeAssetPath(matDefFile.getPath())); |
||||
obj.getLookupContents().remove(materialDef); |
||||
matToRemove = material; |
||||
|
||||
List<Statement> l = new ArrayList<Statement>(); |
||||
l.add(matDefStructure); |
||||
try { |
||||
materialDef = loader.loadMaterialDef(l, assetManager, key); |
||||
} catch (IOException ex) { |
||||
Logger.getLogger(EditableMatDefFile.class.getName()).log(Level.SEVERE, ex.getMessage()); |
||||
} |
||||
updateLookupWithMaterialData(obj); |
||||
AssetKey matDefKey = new AssetKey(assetManager.getRelativeAssetPath(assetManager.getRelativeAssetPath(matDefFile.getPath()))); |
||||
assetManager.deleteFromCache(matDefKey); |
||||
|
||||
} |
||||
} |
@ -0,0 +1,34 @@ |
||||
MaterialDef Simple { |
||||
MaterialParameters { |
||||
Color Color |
||||
} |
||||
Technique { |
||||
WorldParameters { |
||||
WorldViewProjectionMatrix |
||||
} |
||||
VertexShaderNodes { |
||||
ShaderNode CommonVert { |
||||
Definition : CommonVert : Common/MatDefs/ShaderNodes/Common/CommonVert.j3sn |
||||
InputMappings { |
||||
worldViewProjectionMatrix = WorldParam.WorldViewProjectionMatrix |
||||
modelPosition = Global.position.xyz |
||||
} |
||||
OutputMappings { |
||||
Global.position = projPosition |
||||
} |
||||
} |
||||
} |
||||
FragmentShaderNodes { |
||||
ShaderNode ColorMult { |
||||
Definition : ColorMult : Common/MatDefs/ShaderNodes/Basic/ColorMult.j3sn |
||||
InputMappings { |
||||
color1 = MatParam.Color |
||||
color2 = Global.color |
||||
} |
||||
OutputMappings { |
||||
Global.color = outColor |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,309 @@ |
||||
/* |
||||
* 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.materialdefinition; |
||||
|
||||
import com.jme3.gde.core.assets.ProjectAssetManager; |
||||
import com.jme3.gde.materialdefinition.navigator.MatDefNavigatorPanel; |
||||
import java.io.IOException; |
||||
import org.netbeans.api.project.Project; |
||||
import org.netbeans.api.project.ProjectManager; |
||||
import org.netbeans.core.spi.multiview.MultiViewElement; |
||||
import org.netbeans.core.spi.multiview.text.MultiViewEditorElement; |
||||
import org.openide.awt.ActionID; |
||||
import org.openide.awt.ActionReference; |
||||
import org.openide.awt.ActionReferences; |
||||
import org.openide.cookies.SaveCookie; |
||||
import org.openide.filesystems.FileChangeAdapter; |
||||
import org.openide.filesystems.FileChangeListener; |
||||
import org.openide.filesystems.FileEvent; |
||||
import org.openide.filesystems.FileObject; |
||||
import org.openide.filesystems.MIMEResolver; |
||||
import org.openide.loaders.DataFolder; |
||||
import org.openide.loaders.DataObject; |
||||
import org.openide.loaders.DataObjectExistsException; |
||||
import org.openide.loaders.MultiDataObject; |
||||
import org.openide.loaders.MultiFileLoader; |
||||
import org.openide.util.Lookup; |
||||
import org.openide.util.NbBundle.Messages; |
||||
import org.openide.util.lookup.AbstractLookup; |
||||
import org.openide.util.lookup.InstanceContent; |
||||
import org.openide.util.lookup.ProxyLookup; |
||||
import org.openide.windows.TopComponent; |
||||
|
||||
@Messages({ |
||||
"LBL_MatDef_LOADER=JME Material definition" |
||||
}) |
||||
@MIMEResolver.ExtensionRegistration( |
||||
displayName = "#LBL_MatDef_LOADER", |
||||
mimeType = "text/jme-materialdefinition", |
||||
extension = {"j3md", "J3MD"}) |
||||
@DataObject.Registration( |
||||
mimeType = "text/jme-materialdefinition", |
||||
iconBase = "com/jme3/gde/materialdefinition/icons/matdef.png", |
||||
displayName = "#LBL_MatDef_LOADER", |
||||
position = 300) |
||||
@ActionReferences({ |
||||
@ActionReference( |
||||
path = "Loaders/text/jme-materialdefinition/Actions", |
||||
id = |
||||
@ActionID(category = "System", id = "org.openide.actions.OpenAction"), |
||||
position = 100, |
||||
separatorAfter = 200), |
||||
@ActionReference( |
||||
path = "Loaders/text/jme-materialdefinition/Actions", |
||||
id = |
||||
@ActionID(category = "Edit", id = "org.openide.actions.CutAction"), |
||||
position = 300), |
||||
@ActionReference( |
||||
path = "Loaders/text/jme-materialdefinition/Actions", |
||||
id = |
||||
@ActionID(category = "Edit", id = "org.openide.actions.CopyAction"), |
||||
position = 400, |
||||
separatorAfter = 500), |
||||
@ActionReference( |
||||
path = "Loaders/text/jme-materialdefinition/Actions", |
||||
id = |
||||
@ActionID(category = "Edit", id = "org.openide.actions.DeleteAction"), |
||||
position = 600), |
||||
@ActionReference( |
||||
path = "Loaders/text/jme-materialdefinition/Actions", |
||||
id = |
||||
@ActionID(category = "System", id = "org.openide.actions.RenameAction"), |
||||
position = 700, |
||||
separatorAfter = 800), |
||||
@ActionReference( |
||||
path = "Loaders/text/jme-materialdefinition/Actions", |
||||
id = |
||||
@ActionID(category = "System", id = "org.openide.actions.SaveAsTemplateAction"), |
||||
position = 900, |
||||
separatorAfter = 1000), |
||||
@ActionReference( |
||||
path = "Loaders/text/jme-materialdefinition/Actions", |
||||
id = |
||||
@ActionID(category = "System", id = "org.openide.actions.FileSystemAction"), |
||||
position = 1100, |
||||
separatorAfter = 1200), |
||||
@ActionReference( |
||||
path = "Loaders/text/jme-materialdefinition/Actions", |
||||
id = |
||||
@ActionID(category = "System", id = "org.openide.actions.ToolsAction"), |
||||
position = 1300), |
||||
@ActionReference( |
||||
path = "Loaders/text/jme-materialdefinition/Actions", |
||||
id = |
||||
@ActionID(category = "System", id = "org.openide.actions.PropertiesAction"), |
||||
position = 1400) |
||||
}) |
||||
public class MatDefDataObject extends MultiDataObject { |
||||
|
||||
protected final Lookup lookup; |
||||
protected final InstanceContent lookupContents = new InstanceContent(); |
||||
protected AbstractLookup contentLookup; |
||||
private EditableMatDefFile file = null; |
||||
private boolean loaded = false; |
||||
|
||||
public MatDefDataObject(FileObject pf, MultiFileLoader loader) throws DataObjectExistsException, IOException { |
||||
super(pf, loader); |
||||
registerEditor("text/jme-materialdefinition", true); |
||||
contentLookup = new AbstractLookup(lookupContents); |
||||
lookupContents.add(this); |
||||
lookup = new ProxyLookup(getCookieSet().getLookup(), contentLookup); |
||||
findAssetManager(); |
||||
final MatDefMetaData metaData = new MatDefMetaData(this); |
||||
lookupContents.add(metaData); |
||||
pf.addFileChangeListener(new FileChangeAdapter(){ |
||||
|
||||
@Override |
||||
public void fileChanged(FileEvent fe) { |
||||
super.fileChanged(fe); |
||||
metaData.save(); |
||||
} |
||||
|
||||
}); |
||||
|
||||
} |
||||
|
||||
private void findAssetManager() { |
||||
FileObject primaryFile = getPrimaryFile(); |
||||
ProjectManager pm = ProjectManager.getDefault(); |
||||
while (primaryFile != null) { |
||||
if (primaryFile.isFolder() && pm.isProject(primaryFile)) { |
||||
try { |
||||
Project project = ProjectManager.getDefault().findProject(primaryFile); |
||||
if (project != null) { |
||||
getLookupContents().add(project); |
||||
ProjectAssetManager mgr = project.getLookup().lookup(ProjectAssetManager.class); |
||||
if (mgr != null) { |
||||
getLookupContents().add(mgr); |
||||
return; |
||||
} |
||||
} |
||||
} catch (IOException ex) { |
||||
} catch (IllegalArgumentException ex) { |
||||
} |
||||
} |
||||
primaryFile = primaryFile.getParent(); |
||||
} |
||||
// getLookupContents().add(new ProjectAssetManager(file.getParent()));
|
||||
} |
||||
|
||||
@Override |
||||
protected int associateLookup() { |
||||
return 1; |
||||
} |
||||
|
||||
@Override |
||||
public Lookup getLookup() { |
||||
return lookup; |
||||
} |
||||
|
||||
@MultiViewElement.Registration( |
||||
displayName = "#LBL_MatDef_EDITOR", |
||||
iconBase = "com/jme3/gde/materialdefinition/icons/matdef.png", |
||||
mimeType = "text/jme-materialdefinition", |
||||
persistenceType = TopComponent.PERSISTENCE_ONLY_OPENED, |
||||
preferredID = "MatDef", |
||||
position = 1000) |
||||
@Messages("LBL_MatDef_EDITOR=Text") |
||||
public static MultiViewEditorElement createEditor(Lookup lkp) { |
||||
final MatDefDataObject obj = lkp.lookup(MatDefDataObject.class); |
||||
obj.loaded = true; |
||||
MatDefNavigatorPanel nav = obj.getLookup().lookup(MatDefNavigatorPanel.class); |
||||
if (nav != null) { |
||||
nav.updateData(obj); |
||||
} |
||||
MultiViewEditorElement ed = new MultiViewEditorElement(lkp) { |
||||
@Override |
||||
public void componentClosed() { |
||||
super.componentClosed(); |
||||
obj.unload(); |
||||
} |
||||
}; |
||||
|
||||
|
||||
return ed; |
||||
} |
||||
|
||||
@Override |
||||
protected void handleDelete() throws IOException { |
||||
MatDefMetaData metaData = lookup.lookup(MatDefMetaData.class); |
||||
metaData.cleanup(); |
||||
super.handleDelete(); |
||||
} |
||||
|
||||
@Override |
||||
protected FileObject handleRename(String name) throws IOException { |
||||
MatDefMetaData metaData = lookup.lookup(MatDefMetaData.class); |
||||
metaData.rename(null, name); |
||||
return super.handleRename(name); |
||||
} |
||||
|
||||
@Override |
||||
protected FileObject handleMove(DataFolder df) throws IOException { |
||||
MatDefMetaData metaData = lookup.lookup(MatDefMetaData.class); |
||||
metaData.rename(df, null); |
||||
return super.handleMove(df); |
||||
} |
||||
|
||||
@Override |
||||
protected DataObject handleCopy(DataFolder df) throws IOException { |
||||
MatDefMetaData metaData = lookup.lookup(MatDefMetaData.class); |
||||
metaData.duplicate(df, null); |
||||
return super.handleCopy(df); |
||||
} |
||||
|
||||
@Override |
||||
protected DataObject handleCopyRename(DataFolder df, String name, String ext) throws IOException { |
||||
MatDefMetaData metaData = lookup.lookup(MatDefMetaData.class); |
||||
metaData.duplicate(df, name); |
||||
return super.handleCopyRename(df, name, ext); |
||||
} |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public EditableMatDefFile getEditableFile() { |
||||
if (file == null) { |
||||
file = new EditableMatDefFile(getLookup()); |
||||
} |
||||
|
||||
return file; |
||||
} |
||||
|
||||
public boolean isLoaded() { |
||||
return loaded; |
||||
} |
||||
|
||||
public void unload() { |
||||
if (loaded) { |
||||
loaded = false; |
||||
getLookup().lookup(MatDefNavigatorPanel.class).updateData(null); |
||||
} |
||||
} |
||||
|
||||
public InstanceContent getLookupContents() { |
||||
return lookupContents; |
||||
} |
||||
// @Override
|
||||
// public synchronized void saveAsset() throws IOException {
|
||||
//
|
||||
//// ProgressHandle progressHandle = ProgressHandleFactory.createHandle("Saving File..");
|
||||
//// progressHandle.start();
|
||||
// // BinaryExporter exp = BinaryExporter.getInstance();
|
||||
// FileLock lock = null;
|
||||
// OutputStream out = null;
|
||||
// try {
|
||||
// PrintWriter to = new PrintWriter(getPrimaryFile().getOutputStream(lock));
|
||||
// try {
|
||||
// to.print(getEditableFile().getMatDefStructure().toString());
|
||||
//
|
||||
// } finally {
|
||||
// to.close();
|
||||
// }
|
||||
// } finally {
|
||||
// if (lock != null) {
|
||||
// lock.releaseLock();
|
||||
// }
|
||||
// if (out != null) {
|
||||
// out.close();
|
||||
// }
|
||||
// }
|
||||
// // progressHandle.finish();
|
||||
// StatusDisplayer.getDefault().setStatusText(getPrimaryFile().getNameExt() + " saved.");
|
||||
// setModified(false);
|
||||
//
|
||||
//// getPrimaryFile().
|
||||
//// getOutputStream().write(getEditableFile().getMatDefStructure().toString().getBytes());
|
||||
//
|
||||
// }
|
||||
} |
@ -0,0 +1,398 @@ |
||||
/* |
||||
* 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.materialdefinition; |
||||
|
||||
import java.beans.PropertyChangeEvent; |
||||
import java.beans.PropertyChangeListener; |
||||
import java.io.BufferedOutputStream; |
||||
import java.io.BufferedInputStream; |
||||
import java.io.FileNotFoundException; |
||||
import java.io.IOException; |
||||
import java.io.InputStream; |
||||
import java.io.OutputStream; |
||||
import java.util.ArrayList; |
||||
import java.util.Date; |
||||
import java.util.Iterator; |
||||
import java.util.List; |
||||
import java.util.Properties; |
||||
import java.util.logging.Level; |
||||
import java.util.logging.Logger; |
||||
import org.netbeans.api.project.Project; |
||||
import org.openide.filesystems.FileLock; |
||||
import org.openide.filesystems.FileObject; |
||||
import org.openide.filesystems.FileUtil; |
||||
import org.openide.loaders.DataFolder; |
||||
import org.openide.util.Exceptions; |
||||
import org.openide.util.Mutex; |
||||
import org.openide.util.Mutex.Action; |
||||
|
||||
/** |
||||
* Global object to access actual jME3 data within an AssetDataObject, available |
||||
* through the Lookup of any AssetDataObject. AssetDataObjects that wish to use |
||||
* |
||||
* @author normenhansen |
||||
*/ |
||||
@SuppressWarnings("unchecked") |
||||
public class MatDefMetaData { |
||||
|
||||
private static final Logger logger = Logger.getLogger(MatDefMetaData.class.getName()); |
||||
private final List<PropertyChangeListener> listeners = new ArrayList<PropertyChangeListener>(); |
||||
private final Mutex propsMutex = new Mutex(); |
||||
private final Properties props = new Properties(); |
||||
private static final Properties defaultProps = new Properties(); |
||||
|
||||
static { |
||||
defaultProps.put("Default/position", "0,120"); |
||||
defaultProps.put("Default/MatParam.Color", "438,351"); |
||||
defaultProps.put("Default/Default/ColorMult", "605,372"); |
||||
defaultProps.put("Default/WorldParam.WorldViewProjectionMatrix", "33,241"); |
||||
defaultProps.put("Default/color", "0,478"); |
||||
defaultProps.put("Default/Default/CommonVert", "211,212"); |
||||
} |
||||
private MatDefDataObject file; |
||||
private String extension = "jmpdata"; |
||||
private Date lastLoaded; |
||||
private FileObject folder; |
||||
private FileObject root; |
||||
|
||||
// private XMLFileSystem fs;
|
||||
public MatDefMetaData(MatDefDataObject file) { |
||||
try { |
||||
this.file = file; |
||||
getFolder(); |
||||
FileObject primaryFile = file.getPrimaryFile(); |
||||
|
||||
if (primaryFile != null) { |
||||
extension = primaryFile.getExt() + "data"; |
||||
} |
||||
|
||||
} catch (IOException ex) { |
||||
Exceptions.printStackTrace(ex); |
||||
} |
||||
} |
||||
|
||||
public MatDefMetaData(MatDefDataObject file, String extension) { |
||||
this.file = file; |
||||
this.extension = extension; |
||||
} |
||||
|
||||
public synchronized String getProperty(final String key) { |
||||
readProperties(); |
||||
return propsMutex.readAccess(new Action<String>() { |
||||
public String run() { |
||||
String prop = props.getProperty(key); |
||||
if (prop == null) { |
||||
return defaultProps.getProperty(key); |
||||
} |
||||
return prop; |
||||
} |
||||
}); |
||||
} |
||||
|
||||
public synchronized String getProperty(final String key, final String defaultValue) { |
||||
readProperties(); |
||||
return propsMutex.readAccess(new Action<String>() { |
||||
public String run() { |
||||
String prop = props.getProperty(key); |
||||
if (prop == null) { |
||||
return defaultProps.getProperty(key); |
||||
} |
||||
return prop; |
||||
} |
||||
}); |
||||
} |
||||
|
||||
public synchronized String setProperty(final String key, final String value) { |
||||
readProperties(); |
||||
String ret = propsMutex.writeAccess(new Action<String>() { |
||||
public String run() { |
||||
String ret = (String) props.setProperty(key, value); |
||||
return ret; |
||||
} |
||||
}); |
||||
// writeProperties();
|
||||
notifyListeners(key, ret, value); |
||||
return ret; |
||||
} |
||||
|
||||
private void readProperties() { |
||||
propsMutex.writeAccess(new Runnable() { |
||||
public void run() { |
||||
try { |
||||
FileObject pFile = file.getPrimaryFile(); |
||||
FileObject storageFolder = getFolder(); |
||||
if (storageFolder == null) { |
||||
return; |
||||
} |
||||
final FileObject myFile = storageFolder.getFileObject(getFileFullName(pFile)); //fs.findResource(fs.getRoot().getPath()+"/"+ file.getPrimaryFile().getName() + "." + extension);//
|
||||
|
||||
if (myFile == null) { |
||||
return; |
||||
} |
||||
final Date lastMod = myFile.lastModified(); |
||||
if (!lastMod.equals(lastLoaded)) { |
||||
props.clear(); |
||||
lastLoaded = lastMod; |
||||
InputStream in = null; |
||||
try { |
||||
in = new BufferedInputStream(myFile.getInputStream()); |
||||
try { |
||||
props.load(in); |
||||
} catch (IOException ex) { |
||||
Exceptions.printStackTrace(ex); |
||||
} |
||||
} catch (FileNotFoundException ex) { |
||||
Exceptions.printStackTrace(ex); |
||||
} finally { |
||||
try { |
||||
in.close(); |
||||
} catch (IOException ex) { |
||||
Exceptions.printStackTrace(ex); |
||||
} |
||||
} |
||||
logger.log(Level.FINE, "Read AssetData properties for {0}", file); |
||||
} |
||||
} catch (IOException ex) { |
||||
Exceptions.printStackTrace(ex); |
||||
} |
||||
} |
||||
}); |
||||
} |
||||
|
||||
public void cleanup() { |
||||
propsMutex.writeAccess(new Runnable() { |
||||
public void run() { |
||||
OutputStream out = null; |
||||
FileLock lock = null; |
||||
try { |
||||
FileObject pFile = file.getPrimaryFile(); |
||||
FileObject storageFolder = getFolder(); |
||||
if (storageFolder == null) { |
||||
return; |
||||
} |
||||
|
||||
FileObject myFile = storageFolder.getFileObject(getFileFullName(pFile));//FileUtil.findBrother(pFile, extension);//fs.findResource(fs.getRoot().getPath()+"/"+ pFile.getName() + "." + extension);//
|
||||
if (myFile == null) { |
||||
return; |
||||
} |
||||
lock = myFile.lock(); |
||||
myFile.delete(lock); |
||||
} catch (IOException e) { |
||||
Exceptions.printStackTrace(e); |
||||
} finally { |
||||
if (out != null) { |
||||
try { |
||||
out.close(); |
||||
} catch (IOException ex) { |
||||
Exceptions.printStackTrace(ex); |
||||
} |
||||
} |
||||
if (lock != null) { |
||||
lock.releaseLock(); |
||||
} |
||||
} |
||||
} |
||||
}); |
||||
|
||||
} |
||||
|
||||
public void rename(final DataFolder df, final String name) { |
||||
propsMutex.writeAccess(new Runnable() { |
||||
public void run() { |
||||
OutputStream out = null; |
||||
FileLock lock = null; |
||||
try { |
||||
FileObject pFile = file.getPrimaryFile(); |
||||
FileObject storageFolder = getFolder(); |
||||
if (storageFolder == null) { |
||||
return; |
||||
} |
||||
|
||||
FileObject myFile = storageFolder.getFileObject(getFileFullName(pFile));//FileUtil.findBrother(pFile, extension);//fs.findResource(fs.getRoot().getPath()+"/"+ pFile.getName() + "." + extension);//
|
||||
if (myFile == null) { |
||||
return; |
||||
} |
||||
lock = myFile.lock(); |
||||
if (df == null) { |
||||
myFile.rename(lock, getFileFullName(pFile).replaceAll(file.getName() + "." + extension, name + "." + extension), ""); |
||||
} else { |
||||
myFile.rename(lock, FileUtil.getRelativePath(root, df.getPrimaryFile()).replaceAll("/", ".") + "." + pFile.getName(), extension); |
||||
} |
||||
} catch (IOException e) { |
||||
Exceptions.printStackTrace(e); |
||||
} finally { |
||||
if (out != null) { |
||||
try { |
||||
out.close(); |
||||
} catch (IOException ex) { |
||||
Exceptions.printStackTrace(ex); |
||||
} |
||||
} |
||||
if (lock != null) { |
||||
lock.releaseLock(); |
||||
} |
||||
} |
||||
} |
||||
}); |
||||
|
||||
} |
||||
|
||||
public void duplicate(final DataFolder df, final String name) { |
||||
propsMutex.writeAccess(new Runnable() { |
||||
public void run() { |
||||
OutputStream out = null; |
||||
FileLock lock = null; |
||||
try { |
||||
FileObject pFile = file.getPrimaryFile(); |
||||
FileObject storageFolder = getFolder(); |
||||
if (storageFolder == null) { |
||||
return; |
||||
} |
||||
String newName = name; |
||||
if (newName == null) { |
||||
newName = file.getName(); |
||||
} |
||||
String path = FileUtil.getRelativePath(root, df.getPrimaryFile()).replaceAll("/", ".") + "." + newName; |
||||
FileObject myFile = storageFolder.getFileObject(getFileFullName(pFile)); |
||||
if (myFile == null) { |
||||
return; |
||||
} |
||||
|
||||
myFile.copy(storageFolder, path, extension); |
||||
|
||||
} catch (IOException e) { |
||||
Exceptions.printStackTrace(e); |
||||
} finally { |
||||
if (out != null) { |
||||
try { |
||||
out.close(); |
||||
} catch (IOException ex) { |
||||
Exceptions.printStackTrace(ex); |
||||
} |
||||
} |
||||
if (lock != null) { |
||||
lock.releaseLock(); |
||||
} |
||||
} |
||||
} |
||||
}); |
||||
|
||||
} |
||||
|
||||
public void save(){ |
||||
writeProperties(); |
||||
} |
||||
|
||||
private void writeProperties() { |
||||
//writeAccess because we write lastMod date, not because we write to the file
|
||||
//the mutex protects the properties object, not the file
|
||||
propsMutex.writeAccess(new Runnable() { |
||||
public void run() { |
||||
OutputStream out = null; |
||||
FileLock lock = null; |
||||
try { |
||||
FileObject pFile = file.getPrimaryFile(); |
||||
FileObject storageFolder = getFolder(); |
||||
if (storageFolder == null) { |
||||
return; |
||||
} |
||||
|
||||
FileObject myFile = storageFolder.getFileObject(getFileFullName(pFile));//FileUtil.findBrother(pFile, extension);//fs.findResource(fs.getRoot().getPath()+"/"+ pFile.getName() + "." + extension);//
|
||||
if (myFile == null) { |
||||
myFile = FileUtil.createData(storageFolder, getFileFullName(pFile)); |
||||
} |
||||
lock = myFile.lock(); |
||||
out = new BufferedOutputStream(myFile.getOutputStream(lock)); |
||||
props.store(out, ""); |
||||
out.flush(); |
||||
lastLoaded = myFile.lastModified(); |
||||
logger.log(Level.FINE, "Written AssetData properties for {0}", file); |
||||
} catch (IOException e) { |
||||
Exceptions.printStackTrace(e); |
||||
} finally { |
||||
if (out != null) { |
||||
try { |
||||
out.close(); |
||||
} catch (IOException ex) { |
||||
Exceptions.printStackTrace(ex); |
||||
} |
||||
} |
||||
if (lock != null) { |
||||
lock.releaseLock(); |
||||
} |
||||
} |
||||
} |
||||
}); |
||||
} |
||||
|
||||
private String getFileFullName(FileObject pFile) { |
||||
return FileUtil.getRelativePath(root, pFile).replaceAll("/", ".").replaceAll("j3md", extension); |
||||
} |
||||
|
||||
protected void notifyListeners(String property, String before, String after) { |
||||
synchronized (listeners) { |
||||
for (Iterator<PropertyChangeListener> it = listeners.iterator(); it.hasNext();) { |
||||
PropertyChangeListener propertyChangeListener = it.next(); |
||||
propertyChangeListener.propertyChange(new PropertyChangeEvent(this, property, before, after)); |
||||
} |
||||
} |
||||
} |
||||
|
||||
public void addPropertyChangeListener(PropertyChangeListener listener) { |
||||
synchronized (listeners) { |
||||
listeners.add(listener); |
||||
} |
||||
} |
||||
|
||||
public void removePropertyChangeListener(PropertyChangeListener listener) { |
||||
synchronized (listeners) { |
||||
listeners.remove(listener); |
||||
} |
||||
} |
||||
|
||||
private FileObject getFolder() throws IOException { |
||||
if (folder == null) { |
||||
Project p = file.getLookup().lookup(Project.class); |
||||
if (p != null) { |
||||
root = p.getProjectDirectory(); |
||||
|
||||
FileObject jmedataFolder = root.getFileObject("/nbproject/jme3Data"); |
||||
if (jmedataFolder == null) { |
||||
jmedataFolder = root.getFileObject("/nbproject"); |
||||
jmedataFolder = jmedataFolder.createFolder("jme3Data"); |
||||
} |
||||
return jmedataFolder; |
||||
} |
||||
} |
||||
return folder; |
||||
} |
||||
} |
@ -0,0 +1,135 @@ |
||||
<?xml version="1.0" encoding="UTF-8" ?> |
||||
|
||||
<Form version="1.5" maxVersion="1.8" type="org.netbeans.modules.form.forminfo.JDialogFormInfo"> |
||||
<Properties> |
||||
<Property name="defaultCloseOperation" type="int" value="2"/> |
||||
<Property name="title" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor"> |
||||
<ResourceString bundle="com/jme3/gde/materialdefinition/dialog/Bundle.properties" key="AddAttributeDialog.title" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/> |
||||
</Property> |
||||
<Property name="modal" type="boolean" value="true"/> |
||||
</Properties> |
||||
<SyntheticProperties> |
||||
<SyntheticProperty name="formSizePolicy" type="int" value="1"/> |
||||
</SyntheticProperties> |
||||
<AuxValues> |
||||
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/> |
||||
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/> |
||||
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/> |
||||
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/> |
||||
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/> |
||||
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/> |
||||
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/> |
||||
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/> |
||||
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/> |
||||
</AuxValues> |
||||
|
||||
<Layout> |
||||
<DimensionLayout dim="0"> |
||||
<Group type="103" groupAlignment="0" attributes="0"> |
||||
<Group type="102" attributes="0"> |
||||
<EmptySpace max="-2" attributes="0"/> |
||||
<Group type="103" groupAlignment="0" attributes="0"> |
||||
<Group type="102" alignment="1" attributes="0"> |
||||
<Component id="jButton2" min="-2" max="-2" attributes="0"/> |
||||
<EmptySpace max="32767" attributes="0"/> |
||||
<Component id="jButton1" min="-2" max="-2" attributes="0"/> |
||||
</Group> |
||||
<Group type="102" alignment="0" attributes="0"> |
||||
<Group type="103" groupAlignment="1" attributes="0"> |
||||
<Component id="jLabel2" min="-2" max="-2" attributes="0"/> |
||||
<Component id="jLabel1" min="-2" pref="123" max="-2" attributes="0"/> |
||||
</Group> |
||||
<EmptySpace max="-2" attributes="0"/> |
||||
<Group type="103" groupAlignment="0" attributes="0"> |
||||
<Component id="nameField" pref="253" max="32767" attributes="0"/> |
||||
<Component id="typeField" max="32767" attributes="0"/> |
||||
</Group> |
||||
</Group> |
||||
</Group> |
||||
<EmptySpace max="-2" attributes="0"/> |
||||
</Group> |
||||
</Group> |
||||
</DimensionLayout> |
||||
<DimensionLayout dim="1"> |
||||
<Group type="103" groupAlignment="0" attributes="0"> |
||||
<Group type="102" alignment="1" attributes="0"> |
||||
<EmptySpace max="-2" attributes="0"/> |
||||
<Group type="103" groupAlignment="3" attributes="0"> |
||||
<Component id="jLabel1" alignment="3" min="-2" max="-2" attributes="0"/> |
||||
<Component id="nameField" alignment="3" min="-2" max="-2" attributes="0"/> |
||||
</Group> |
||||
<EmptySpace max="-2" attributes="0"/> |
||||
<Group type="103" groupAlignment="3" attributes="0"> |
||||
<Component id="jLabel2" alignment="3" min="-2" max="-2" attributes="0"/> |
||||
<Component id="typeField" alignment="3" min="-2" max="-2" attributes="0"/> |
||||
</Group> |
||||
<EmptySpace max="32767" attributes="0"/> |
||||
<Group type="103" groupAlignment="3" attributes="0"> |
||||
<Component id="jButton1" alignment="3" min="-2" max="-2" attributes="0"/> |
||||
<Component id="jButton2" alignment="3" min="-2" max="-2" attributes="0"/> |
||||
</Group> |
||||
<EmptySpace max="-2" attributes="0"/> |
||||
</Group> |
||||
</Group> |
||||
</DimensionLayout> |
||||
</Layout> |
||||
<SubComponents> |
||||
<Component class="javax.swing.JButton" name="jButton1"> |
||||
<Properties> |
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor"> |
||||
<ResourceString bundle="com/jme3/gde/materialdefinition/dialog/Bundle.properties" key="AddAttributeDialog.jButton1.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/> |
||||
</Property> |
||||
</Properties> |
||||
<Events> |
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButton1ActionPerformed"/> |
||||
</Events> |
||||
</Component> |
||||
<Component class="javax.swing.JButton" name="jButton2"> |
||||
<Properties> |
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor"> |
||||
<ResourceString bundle="com/jme3/gde/materialdefinition/dialog/Bundle.properties" key="AddAttributeDialog.jButton2.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/> |
||||
</Property> |
||||
</Properties> |
||||
<Events> |
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButton2ActionPerformed"/> |
||||
</Events> |
||||
</Component> |
||||
<Component class="javax.swing.JLabel" name="jLabel1"> |
||||
<Properties> |
||||
<Property name="horizontalAlignment" type="int" value="11"/> |
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor"> |
||||
<ResourceString bundle="com/jme3/gde/materialdefinition/dialog/Bundle.properties" key="AddAttributeDialog.jLabel1.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/> |
||||
</Property> |
||||
</Properties> |
||||
</Component> |
||||
<Component class="javax.swing.JComboBox" name="nameField"> |
||||
<Properties> |
||||
<Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor"> |
||||
<StringArray count="4"> |
||||
<StringItem index="0" value="Item 1"/> |
||||
<StringItem index="1" value="Item 2"/> |
||||
<StringItem index="2" value="Item 3"/> |
||||
<StringItem index="3" value="Item 4"/> |
||||
</StringArray> |
||||
</Property> |
||||
</Properties> |
||||
<Events> |
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="nameFieldActionPerformed"/> |
||||
</Events> |
||||
</Component> |
||||
<Component class="javax.swing.JLabel" name="jLabel2"> |
||||
<Properties> |
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor"> |
||||
<ResourceString bundle="com/jme3/gde/materialdefinition/dialog/Bundle.properties" key="AddAttributeDialog.jLabel2.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/> |
||||
</Property> |
||||
</Properties> |
||||
</Component> |
||||
<Component class="javax.swing.JTextField" name="typeField"> |
||||
<Properties> |
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor"> |
||||
<ResourceString bundle="com/jme3/gde/materialdefinition/dialog/Bundle.properties" key="AddAttributeDialog.typeField.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/> |
||||
</Property> |
||||
</Properties> |
||||
</Component> |
||||
</SubComponents> |
||||
</Form> |
@ -0,0 +1,196 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.dialog; |
||||
|
||||
import com.jme3.gde.materialdefinition.editor.Diagram; |
||||
import com.jme3.scene.VertexBuffer; |
||||
import com.jme3.shader.UniformBinding; |
||||
import java.awt.Point; |
||||
import javax.swing.DefaultComboBoxModel; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public class AddAttributeDialog extends javax.swing.JDialog { |
||||
|
||||
private Diagram diagram; |
||||
private Point clickPosition; |
||||
|
||||
/** |
||||
* Creates new form AddMaterialParameter |
||||
*/ |
||||
public AddAttributeDialog(java.awt.Frame parent, boolean modal, Diagram diagram, Point clickPosition) { |
||||
super(parent, modal); |
||||
initComponents(); |
||||
DefaultComboBoxModel<String> model = new DefaultComboBoxModel<String>(); |
||||
|
||||
for (VertexBuffer.Type attr : VertexBuffer.Type.values()) { |
||||
model.addElement("in" + attr.name()); |
||||
} |
||||
this.diagram = diagram; |
||||
this.clickPosition = clickPosition; |
||||
nameField.setModel(model); |
||||
updateType(); |
||||
} |
||||
|
||||
/** |
||||
* This method is called from within the constructor to initialize the form. |
||||
* WARNING: Do NOT modify this code. The content of this method is always |
||||
* regenerated by the Form Editor. |
||||
*/ |
||||
@SuppressWarnings("unchecked") |
||||
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
||||
private void initComponents() { |
||||
|
||||
jButton1 = new javax.swing.JButton(); |
||||
jButton2 = new javax.swing.JButton(); |
||||
jLabel1 = new javax.swing.JLabel(); |
||||
nameField = new javax.swing.JComboBox(); |
||||
jLabel2 = new javax.swing.JLabel(); |
||||
typeField = new javax.swing.JTextField(); |
||||
|
||||
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); |
||||
setTitle(org.openide.util.NbBundle.getMessage(AddAttributeDialog.class, "AddAttributeDialog.title")); // NOI18N
|
||||
setModal(true); |
||||
|
||||
org.openide.awt.Mnemonics.setLocalizedText(jButton1, org.openide.util.NbBundle.getMessage(AddAttributeDialog.class, "AddAttributeDialog.jButton1.text")); // NOI18N
|
||||
jButton1.addActionListener(new java.awt.event.ActionListener() { |
||||
public void actionPerformed(java.awt.event.ActionEvent evt) { |
||||
jButton1ActionPerformed(evt); |
||||
} |
||||
}); |
||||
|
||||
org.openide.awt.Mnemonics.setLocalizedText(jButton2, org.openide.util.NbBundle.getMessage(AddAttributeDialog.class, "AddAttributeDialog.jButton2.text")); // NOI18N
|
||||
jButton2.addActionListener(new java.awt.event.ActionListener() { |
||||
public void actionPerformed(java.awt.event.ActionEvent evt) { |
||||
jButton2ActionPerformed(evt); |
||||
} |
||||
}); |
||||
|
||||
jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); |
||||
org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(AddAttributeDialog.class, "AddAttributeDialog.jLabel1.text")); // NOI18N
|
||||
|
||||
nameField.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" })); |
||||
nameField.addActionListener(new java.awt.event.ActionListener() { |
||||
public void actionPerformed(java.awt.event.ActionEvent evt) { |
||||
nameFieldActionPerformed(evt); |
||||
} |
||||
}); |
||||
|
||||
org.openide.awt.Mnemonics.setLocalizedText(jLabel2, org.openide.util.NbBundle.getMessage(AddAttributeDialog.class, "AddAttributeDialog.jLabel2.text")); // NOI18N
|
||||
|
||||
typeField.setText(org.openide.util.NbBundle.getMessage(AddAttributeDialog.class, "AddAttributeDialog.typeField.text")); // NOI18N
|
||||
|
||||
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); |
||||
getContentPane().setLayout(layout); |
||||
layout.setHorizontalGroup( |
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) |
||||
.addGroup(layout.createSequentialGroup() |
||||
.addContainerGap() |
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) |
||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() |
||||
.addComponent(jButton2) |
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) |
||||
.addComponent(jButton1)) |
||||
.addGroup(layout.createSequentialGroup() |
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) |
||||
.addComponent(jLabel2) |
||||
.addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 123, javax.swing.GroupLayout.PREFERRED_SIZE)) |
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) |
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) |
||||
.addComponent(nameField, 0, 253, Short.MAX_VALUE) |
||||
.addComponent(typeField)))) |
||||
.addContainerGap()) |
||||
); |
||||
layout.setVerticalGroup( |
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) |
||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() |
||||
.addContainerGap() |
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) |
||||
.addComponent(jLabel1) |
||||
.addComponent(nameField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) |
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) |
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) |
||||
.addComponent(jLabel2) |
||||
.addComponent(typeField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) |
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) |
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) |
||||
.addComponent(jButton1) |
||||
.addComponent(jButton2)) |
||||
.addContainerGap()) |
||||
); |
||||
|
||||
pack(); |
||||
}// </editor-fold>//GEN-END:initComponents
|
||||
|
||||
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed
|
||||
setVisible(false); |
||||
}//GEN-LAST:event_jButton2ActionPerformed
|
||||
|
||||
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
|
||||
diagram.addAttribute((String) nameField.getSelectedItem(), typeField.getText(), clickPosition); |
||||
setVisible(false); |
||||
}//GEN-LAST:event_jButton1ActionPerformed
|
||||
|
||||
private void nameFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_nameFieldActionPerformed
|
||||
updateType(); |
||||
} |
||||
|
||||
private void updateType() { |
||||
VertexBuffer.Type attr = VertexBuffer.Type.valueOf(((String) nameField.getSelectedItem()).replaceFirst("in", "")); |
||||
switch (attr) { |
||||
|
||||
case BoneWeight: |
||||
|
||||
case BindPoseNormal: |
||||
case Binormal: |
||||
|
||||
case Normal: |
||||
typeField.setText("vec3"); |
||||
break; |
||||
|
||||
case Size: |
||||
typeField.setText("float"); |
||||
break; |
||||
|
||||
case Position: |
||||
case BindPosePosition: |
||||
case BindPoseTangent: |
||||
case Tangent: |
||||
case Color: |
||||
typeField.setText("vec4"); |
||||
break; |
||||
case InterleavedData: |
||||
typeField.setText("int"); |
||||
break; |
||||
case Index: |
||||
typeField.setText("uint"); |
||||
break; |
||||
case BoneIndex: |
||||
typeField.setText("uvec4"); |
||||
break; |
||||
|
||||
case TexCoord: |
||||
case TexCoord2: |
||||
case TexCoord3: |
||||
case TexCoord4: |
||||
case TexCoord5: |
||||
case TexCoord6: |
||||
case TexCoord7: |
||||
case TexCoord8: |
||||
typeField.setText("vec2"); |
||||
break; |
||||
} |
||||
}//GEN-LAST:event_nameFieldActionPerformed
|
||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||
private javax.swing.JButton jButton1; |
||||
private javax.swing.JButton jButton2; |
||||
private javax.swing.JLabel jLabel1; |
||||
private javax.swing.JLabel jLabel2; |
||||
private javax.swing.JComboBox nameField; |
||||
private javax.swing.JTextField typeField; |
||||
// End of variables declaration//GEN-END:variables
|
||||
} |
@ -0,0 +1,135 @@ |
||||
<?xml version="1.0" encoding="UTF-8" ?> |
||||
|
||||
<Form version="1.5" maxVersion="1.8" type="org.netbeans.modules.form.forminfo.JDialogFormInfo"> |
||||
<Properties> |
||||
<Property name="defaultCloseOperation" type="int" value="2"/> |
||||
<Property name="title" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor"> |
||||
<ResourceString bundle="com/jme3/gde/materialdefinition/dialog/Bundle.properties" key="AddMaterialParameterDialog.title" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/> |
||||
</Property> |
||||
<Property name="modal" type="boolean" value="true"/> |
||||
</Properties> |
||||
<SyntheticProperties> |
||||
<SyntheticProperty name="formSizePolicy" type="int" value="1"/> |
||||
</SyntheticProperties> |
||||
<AuxValues> |
||||
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/> |
||||
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/> |
||||
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/> |
||||
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/> |
||||
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/> |
||||
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/> |
||||
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/> |
||||
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/> |
||||
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/> |
||||
</AuxValues> |
||||
|
||||
<Layout> |
||||
<DimensionLayout dim="0"> |
||||
<Group type="103" groupAlignment="0" attributes="0"> |
||||
<Group type="102" attributes="0"> |
||||
<EmptySpace max="-2" attributes="0"/> |
||||
<Group type="103" groupAlignment="0" attributes="0"> |
||||
<Group type="102" alignment="1" attributes="0"> |
||||
<Component id="jButton2" min="-2" max="-2" attributes="0"/> |
||||
<EmptySpace max="32767" attributes="0"/> |
||||
<Component id="jButton1" min="-2" max="-2" attributes="0"/> |
||||
</Group> |
||||
<Group type="102" alignment="0" attributes="0"> |
||||
<Group type="103" groupAlignment="1" attributes="0"> |
||||
<Component id="jLabel3" min="-2" max="-2" attributes="0"/> |
||||
<Component id="jLabel1" min="-2" pref="123" max="-2" attributes="0"/> |
||||
</Group> |
||||
<EmptySpace max="-2" attributes="0"/> |
||||
<Group type="103" groupAlignment="0" attributes="0"> |
||||
<Component id="typeField" pref="253" max="32767" attributes="0"/> |
||||
<Component id="nameField" max="32767" attributes="0"/> |
||||
</Group> |
||||
</Group> |
||||
</Group> |
||||
<EmptySpace max="-2" attributes="0"/> |
||||
</Group> |
||||
</Group> |
||||
</DimensionLayout> |
||||
<DimensionLayout dim="1"> |
||||
<Group type="103" groupAlignment="0" attributes="0"> |
||||
<Group type="102" alignment="1" attributes="0"> |
||||
<EmptySpace max="-2" attributes="0"/> |
||||
<Group type="103" groupAlignment="3" attributes="0"> |
||||
<Component id="jLabel1" alignment="3" min="-2" max="-2" attributes="0"/> |
||||
<Component id="typeField" alignment="3" min="-2" max="-2" attributes="0"/> |
||||
</Group> |
||||
<EmptySpace type="unrelated" max="-2" attributes="0"/> |
||||
<Group type="103" groupAlignment="3" attributes="0"> |
||||
<Component id="jLabel3" alignment="3" min="-2" max="-2" attributes="0"/> |
||||
<Component id="nameField" alignment="3" min="-2" max="-2" attributes="0"/> |
||||
</Group> |
||||
<EmptySpace pref="23" max="32767" attributes="0"/> |
||||
<Group type="103" groupAlignment="3" attributes="0"> |
||||
<Component id="jButton1" alignment="3" min="-2" max="-2" attributes="0"/> |
||||
<Component id="jButton2" alignment="3" min="-2" max="-2" attributes="0"/> |
||||
</Group> |
||||
<EmptySpace max="-2" attributes="0"/> |
||||
</Group> |
||||
</Group> |
||||
</DimensionLayout> |
||||
</Layout> |
||||
<SubComponents> |
||||
<Component class="javax.swing.JButton" name="jButton1"> |
||||
<Properties> |
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor"> |
||||
<ResourceString bundle="com/jme3/gde/materialdefinition/dialog/Bundle.properties" key="AddMaterialParameterDialog.jButton1.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/> |
||||
</Property> |
||||
</Properties> |
||||
<Events> |
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButton1ActionPerformed"/> |
||||
</Events> |
||||
</Component> |
||||
<Component class="javax.swing.JButton" name="jButton2"> |
||||
<Properties> |
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor"> |
||||
<ResourceString bundle="com/jme3/gde/materialdefinition/dialog/Bundle.properties" key="AddMaterialParameterDialog.jButton2.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/> |
||||
</Property> |
||||
</Properties> |
||||
<Events> |
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButton2ActionPerformed"/> |
||||
</Events> |
||||
</Component> |
||||
<Component class="javax.swing.JLabel" name="jLabel1"> |
||||
<Properties> |
||||
<Property name="horizontalAlignment" type="int" value="11"/> |
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor"> |
||||
<ResourceString bundle="com/jme3/gde/materialdefinition/dialog/Bundle.properties" key="AddMaterialParameterDialog.jLabel1.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/> |
||||
</Property> |
||||
</Properties> |
||||
</Component> |
||||
<Component class="javax.swing.JComboBox" name="typeField"> |
||||
<Properties> |
||||
<Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor"> |
||||
<StringArray count="4"> |
||||
<StringItem index="0" value="Item 1"/> |
||||
<StringItem index="1" value="Item 2"/> |
||||
<StringItem index="2" value="Item 3"/> |
||||
<StringItem index="3" value="Item 4"/> |
||||
</StringArray> |
||||
</Property> |
||||
</Properties> |
||||
</Component> |
||||
<Component class="javax.swing.JLabel" name="jLabel3"> |
||||
<Properties> |
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor"> |
||||
<ResourceString bundle="com/jme3/gde/materialdefinition/dialog/Bundle.properties" key="AddMaterialParameterDialog.jLabel3.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/> |
||||
</Property> |
||||
</Properties> |
||||
</Component> |
||||
<Component class="javax.swing.JTextField" name="nameField"> |
||||
<Properties> |
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor"> |
||||
<ResourceString bundle="com/jme3/gde/materialdefinition/dialog/Bundle.properties" key="AddMaterialParameterDialog.nameField.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/> |
||||
</Property> |
||||
</Properties> |
||||
<Events> |
||||
<EventHandler event="keyPressed" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="nameFieldKeyPressed"/> |
||||
</Events> |
||||
</Component> |
||||
</SubComponents> |
||||
</Form> |
@ -0,0 +1,161 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.dialog; |
||||
|
||||
import com.jme3.gde.materialdefinition.editor.Diagram; |
||||
import com.jme3.shader.VarType; |
||||
import java.awt.Point; |
||||
import java.awt.event.KeyEvent; |
||||
import javax.swing.DefaultComboBoxModel; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public class AddMaterialParameterDialog extends javax.swing.JDialog { |
||||
|
||||
private Diagram diagram; |
||||
private Point clickPosition; |
||||
|
||||
/** |
||||
* Creates new form AddMaterialParameter |
||||
*/ |
||||
public AddMaterialParameterDialog(java.awt.Frame parent, boolean modal, Diagram diagram, Point clickPosition) { |
||||
super(parent, modal); |
||||
initComponents(); |
||||
DefaultComboBoxModel<String> model = new DefaultComboBoxModel<String>(); |
||||
model.addElement("Color"); |
||||
for (VarType varType : VarType.values()) { |
||||
|
||||
model.addElement(varType.name()); |
||||
} |
||||
this.diagram = diagram; |
||||
this.clickPosition = clickPosition; |
||||
typeField.setModel(model); |
||||
} |
||||
|
||||
/** |
||||
* This method is called from within the constructor to initialize the form. |
||||
* WARNING: Do NOT modify this code. The content of this method is always |
||||
* regenerated by the Form Editor. |
||||
*/ |
||||
@SuppressWarnings("unchecked") |
||||
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
||||
private void initComponents() { |
||||
|
||||
jButton1 = new javax.swing.JButton(); |
||||
jButton2 = new javax.swing.JButton(); |
||||
jLabel1 = new javax.swing.JLabel(); |
||||
typeField = new javax.swing.JComboBox(); |
||||
jLabel3 = new javax.swing.JLabel(); |
||||
nameField = new javax.swing.JTextField(); |
||||
|
||||
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); |
||||
setTitle(org.openide.util.NbBundle.getMessage(AddMaterialParameterDialog.class, "AddMaterialParameterDialog.title")); // NOI18N
|
||||
setModal(true); |
||||
|
||||
org.openide.awt.Mnemonics.setLocalizedText(jButton1, org.openide.util.NbBundle.getMessage(AddMaterialParameterDialog.class, "AddMaterialParameterDialog.jButton1.text")); // NOI18N
|
||||
jButton1.addActionListener(new java.awt.event.ActionListener() { |
||||
public void actionPerformed(java.awt.event.ActionEvent evt) { |
||||
jButton1ActionPerformed(evt); |
||||
} |
||||
}); |
||||
|
||||
org.openide.awt.Mnemonics.setLocalizedText(jButton2, org.openide.util.NbBundle.getMessage(AddMaterialParameterDialog.class, "AddMaterialParameterDialog.jButton2.text")); // NOI18N
|
||||
jButton2.addActionListener(new java.awt.event.ActionListener() { |
||||
public void actionPerformed(java.awt.event.ActionEvent evt) { |
||||
jButton2ActionPerformed(evt); |
||||
} |
||||
}); |
||||
|
||||
jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); |
||||
org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(AddMaterialParameterDialog.class, "AddMaterialParameterDialog.jLabel1.text")); // NOI18N
|
||||
|
||||
typeField.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" })); |
||||
|
||||
org.openide.awt.Mnemonics.setLocalizedText(jLabel3, org.openide.util.NbBundle.getMessage(AddMaterialParameterDialog.class, "AddMaterialParameterDialog.jLabel3.text")); // NOI18N
|
||||
|
||||
nameField.setText(org.openide.util.NbBundle.getMessage(AddMaterialParameterDialog.class, "AddMaterialParameterDialog.nameField.text")); // NOI18N
|
||||
nameField.addKeyListener(new java.awt.event.KeyAdapter() { |
||||
public void keyPressed(java.awt.event.KeyEvent evt) { |
||||
nameFieldKeyPressed(evt); |
||||
} |
||||
}); |
||||
|
||||
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); |
||||
getContentPane().setLayout(layout); |
||||
layout.setHorizontalGroup( |
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) |
||||
.addGroup(layout.createSequentialGroup() |
||||
.addContainerGap() |
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) |
||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() |
||||
.addComponent(jButton2) |
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) |
||||
.addComponent(jButton1)) |
||||
.addGroup(layout.createSequentialGroup() |
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) |
||||
.addComponent(jLabel3) |
||||
.addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 123, javax.swing.GroupLayout.PREFERRED_SIZE)) |
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) |
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) |
||||
.addComponent(typeField, 0, 253, Short.MAX_VALUE) |
||||
.addComponent(nameField)))) |
||||
.addContainerGap()) |
||||
); |
||||
layout.setVerticalGroup( |
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) |
||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() |
||||
.addContainerGap() |
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) |
||||
.addComponent(jLabel1) |
||||
.addComponent(typeField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) |
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) |
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) |
||||
.addComponent(jLabel3) |
||||
.addComponent(nameField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) |
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 23, Short.MAX_VALUE) |
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) |
||||
.addComponent(jButton1) |
||||
.addComponent(jButton2)) |
||||
.addContainerGap()) |
||||
); |
||||
|
||||
pack(); |
||||
}// </editor-fold>//GEN-END:initComponents
|
||||
|
||||
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed
|
||||
setVisible(false); |
||||
}//GEN-LAST:event_jButton2ActionPerformed
|
||||
|
||||
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
|
||||
okPressed(); |
||||
}//GEN-LAST:event_jButton1ActionPerformed
|
||||
|
||||
private void nameFieldKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_nameFieldKeyPressed
|
||||
if (evt.getKeyCode() == KeyEvent.VK_ENTER) { |
||||
okPressed(); |
||||
} |
||||
}//GEN-LAST:event_nameFieldKeyPressed
|
||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||
private javax.swing.JButton jButton1; |
||||
private javax.swing.JButton jButton2; |
||||
private javax.swing.JLabel jLabel1; |
||||
private javax.swing.JLabel jLabel3; |
||||
private javax.swing.JTextField nameField; |
||||
private javax.swing.JComboBox typeField; |
||||
// End of variables declaration//GEN-END:variables
|
||||
|
||||
private void okPressed() { |
||||
String name = nameField.getText(); |
||||
if (name.length() > 1) { |
||||
name = name.substring(0, 1).toUpperCase() + name.substring(1); |
||||
} else { |
||||
name = name.toUpperCase(); |
||||
} |
||||
diagram.addMatParam((String) typeField.getSelectedItem(), name, clickPosition); |
||||
setVisible(false); |
||||
} |
||||
} |
@ -0,0 +1,167 @@ |
||||
<?xml version="1.0" encoding="UTF-8" ?> |
||||
|
||||
<Form version="1.3" maxVersion="1.8" type="org.netbeans.modules.form.forminfo.JDialogFormInfo"> |
||||
<Properties> |
||||
<Property name="defaultCloseOperation" type="int" value="2"/> |
||||
<Property name="title" type="java.lang.String" value="Add a Shader Node"/> |
||||
<Property name="modal" type="boolean" value="true"/> |
||||
</Properties> |
||||
<SyntheticProperties> |
||||
<SyntheticProperty name="formSizePolicy" type="int" value="1"/> |
||||
</SyntheticProperties> |
||||
<AuxValues> |
||||
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/> |
||||
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/> |
||||
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/> |
||||
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/> |
||||
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/> |
||||
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/> |
||||
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/> |
||||
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/> |
||||
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/> |
||||
</AuxValues> |
||||
|
||||
<Layout> |
||||
<DimensionLayout dim="0"> |
||||
<Group type="103" groupAlignment="1" attributes="0"> |
||||
<Component id="jPanel2" max="32767" attributes="0"/> |
||||
<Component id="jSplitPane1" alignment="0" max="32767" attributes="0"/> |
||||
</Group> |
||||
</DimensionLayout> |
||||
<DimensionLayout dim="1"> |
||||
<Group type="103" groupAlignment="0" attributes="0"> |
||||
<Group type="102" alignment="0" attributes="0"> |
||||
<Component id="jSplitPane1" max="32767" attributes="0"/> |
||||
<EmptySpace max="-2" attributes="0"/> |
||||
<Component id="jPanel2" min="-2" max="-2" attributes="0"/> |
||||
</Group> |
||||
</Group> |
||||
</DimensionLayout> |
||||
</Layout> |
||||
<SubComponents> |
||||
<Container class="javax.swing.JPanel" name="jPanel2"> |
||||
|
||||
<Layout> |
||||
<DimensionLayout dim="0"> |
||||
<Group type="103" groupAlignment="0" attributes="0"> |
||||
<Group type="102" alignment="1" attributes="0"> |
||||
<EmptySpace max="-2" attributes="0"/> |
||||
<Component id="jButton2" min="-2" max="-2" attributes="0"/> |
||||
<EmptySpace max="32767" attributes="0"/> |
||||
<Component id="jButton1" min="-2" max="-2" attributes="0"/> |
||||
<EmptySpace max="-2" attributes="0"/> |
||||
</Group> |
||||
</Group> |
||||
</DimensionLayout> |
||||
<DimensionLayout dim="1"> |
||||
<Group type="103" groupAlignment="0" attributes="0"> |
||||
<Group type="103" groupAlignment="3" attributes="0"> |
||||
<Component id="jButton1" alignment="3" min="-2" max="-2" attributes="0"/> |
||||
<Component id="jButton2" alignment="3" min="-2" max="-2" attributes="0"/> |
||||
</Group> |
||||
</Group> |
||||
</DimensionLayout> |
||||
</Layout> |
||||
<SubComponents> |
||||
<Component class="javax.swing.JButton" name="jButton1"> |
||||
<Properties> |
||||
<Property name="text" type="java.lang.String" value="ok"/> |
||||
</Properties> |
||||
<Events> |
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButton1ActionPerformed"/> |
||||
</Events> |
||||
</Component> |
||||
<Component class="javax.swing.JButton" name="jButton2"> |
||||
<Properties> |
||||
<Property name="mnemonic" type="int" editor="org.netbeans.modules.form.RADConnectionPropertyEditor"> |
||||
<Connection code="KeyEvent.VK_ESCAPE" type="code"/> |
||||
</Property> |
||||
<Property name="text" type="java.lang.String" value="cancel"/> |
||||
</Properties> |
||||
<Events> |
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButton2ActionPerformed"/> |
||||
</Events> |
||||
</Component> |
||||
</SubComponents> |
||||
</Container> |
||||
<Container class="javax.swing.JSplitPane" name="jSplitPane1"> |
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout"/> |
||||
<SubComponents> |
||||
<Container class="javax.swing.JPanel" name="jPanel1"> |
||||
<Properties> |
||||
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor"> |
||||
<Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo"> |
||||
<TitledBorder title="Shader node definitions"/> |
||||
</Border> |
||||
</Property> |
||||
</Properties> |
||||
<Constraints> |
||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout$JSplitPaneConstraintsDescription"> |
||||
<JSplitPaneConstraints position="left"/> |
||||
</Constraint> |
||||
</Constraints> |
||||
|
||||
<Layout> |
||||
<DimensionLayout dim="0"> |
||||
<Group type="103" groupAlignment="0" attributes="0"> |
||||
<Component id="jScrollPane3" alignment="0" pref="236" max="32767" attributes="0"/> |
||||
</Group> |
||||
</DimensionLayout> |
||||
<DimensionLayout dim="1"> |
||||
<Group type="103" groupAlignment="0" attributes="0"> |
||||
<Component id="jScrollPane3" alignment="0" pref="468" max="32767" attributes="0"/> |
||||
</Group> |
||||
</DimensionLayout> |
||||
</Layout> |
||||
<SubComponents> |
||||
<Container class="javax.swing.JScrollPane" name="jScrollPane3"> |
||||
<AuxValues> |
||||
<AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/> |
||||
</AuxValues> |
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/> |
||||
<SubComponents> |
||||
<Component class="javax.swing.JTree" name="jTree1"> |
||||
</Component> |
||||
</SubComponents> |
||||
</Container> |
||||
</SubComponents> |
||||
</Container> |
||||
<Container class="javax.swing.JPanel" name="shaderNodesList"> |
||||
<Properties> |
||||
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor"> |
||||
<Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo"> |
||||
<TitledBorder title="Shader node definition"/> |
||||
</Border> |
||||
</Property> |
||||
</Properties> |
||||
<Constraints> |
||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout$JSplitPaneConstraintsDescription"> |
||||
<JSplitPaneConstraints position="right"/> |
||||
</Constraint> |
||||
</Constraints> |
||||
|
||||
<Layout> |
||||
<DimensionLayout dim="0"> |
||||
<Group type="103" groupAlignment="0" attributes="0"> |
||||
<Component id="jTabbedPane1" alignment="1" pref="339" max="32767" attributes="0"/> |
||||
</Group> |
||||
</DimensionLayout> |
||||
<DimensionLayout dim="1"> |
||||
<Group type="103" groupAlignment="0" attributes="0"> |
||||
<Component id="jTabbedPane1" alignment="1" pref="468" max="32767" attributes="0"/> |
||||
</Group> |
||||
</DimensionLayout> |
||||
</Layout> |
||||
<SubComponents> |
||||
<Container class="javax.swing.JTabbedPane" name="jTabbedPane1"> |
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout"/> |
||||
</Container> |
||||
</SubComponents> |
||||
</Container> |
||||
</SubComponents> |
||||
</Container> |
||||
</SubComponents> |
||||
</Form> |
@ -0,0 +1,254 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.dialog; |
||||
|
||||
import com.jme3.asset.ShaderNodeDefinitionKey; |
||||
import com.jme3.gde.core.assets.ProjectAssetManager; |
||||
import com.jme3.gde.core.util.TreeUtil; |
||||
import com.jme3.gde.materialdefinition.editor.Diagram; |
||||
import com.jme3.gde.materialdefinition.editor.NodePanel; |
||||
import com.jme3.gde.materialdefinition.fileStructure.ShaderNodeBlock; |
||||
import com.jme3.gde.materialdefinition.icons.Icons; |
||||
import com.jme3.gde.materialdefinition.utils.DocFormatter; |
||||
import com.jme3.shader.Shader; |
||||
import com.jme3.shader.ShaderNodeDefinition; |
||||
import java.awt.Point; |
||||
import java.awt.event.KeyEvent; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
import javax.swing.JScrollPane; |
||||
import javax.swing.JTextPane; |
||||
import javax.swing.event.TreeSelectionEvent; |
||||
import javax.swing.event.TreeSelectionListener; |
||||
import javax.swing.tree.DefaultMutableTreeNode; |
||||
import javax.swing.tree.TreeNode; |
||||
import javax.swing.tree.TreeSelectionModel; |
||||
|
||||
/** |
||||
* |
||||
* @author m327836 |
||||
*/ |
||||
public class AddNodeDialog extends javax.swing.JDialog { |
||||
|
||||
private List<ShaderNodeDefinition> defList = new ArrayList<ShaderNodeDefinition>(); |
||||
private Diagram diagram; |
||||
private Point clickPosition; |
||||
private String path; |
||||
|
||||
/** |
||||
* Creates new form NewJDialog |
||||
*/ |
||||
public AddNodeDialog(java.awt.Frame parent, boolean modal, ProjectAssetManager mgr, Diagram diagram, Point clickPosition) { |
||||
super(parent, modal); |
||||
this.diagram = diagram; |
||||
initComponents(); |
||||
loadDefs(mgr); |
||||
fillList(mgr); |
||||
this.clickPosition = clickPosition; |
||||
|
||||
} |
||||
|
||||
/** |
||||
* This method is called from within the constructor to initialize the form. |
||||
* WARNING: Do NOT modify this code. The content of this method is always |
||||
* regenerated by the Form Editor. |
||||
*/ |
||||
@SuppressWarnings("unchecked") |
||||
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
||||
private void initComponents() { |
||||
|
||||
jPanel2 = new javax.swing.JPanel(); |
||||
jButton1 = new javax.swing.JButton(); |
||||
jButton2 = new javax.swing.JButton(); |
||||
jSplitPane1 = new javax.swing.JSplitPane(); |
||||
jPanel1 = new javax.swing.JPanel(); |
||||
jScrollPane3 = new javax.swing.JScrollPane(); |
||||
jTree1 = new javax.swing.JTree(); |
||||
shaderNodesList = new javax.swing.JPanel(); |
||||
jTabbedPane1 = new javax.swing.JTabbedPane(); |
||||
|
||||
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); |
||||
setTitle("Add a Shader Node"); |
||||
setModal(true); |
||||
|
||||
jButton1.setText("ok"); |
||||
jButton1.addActionListener(new java.awt.event.ActionListener() { |
||||
public void actionPerformed(java.awt.event.ActionEvent evt) { |
||||
jButton1ActionPerformed(evt); |
||||
} |
||||
}); |
||||
|
||||
jButton2.setMnemonic(KeyEvent.VK_ESCAPE); |
||||
jButton2.setText("cancel"); |
||||
jButton2.addActionListener(new java.awt.event.ActionListener() { |
||||
public void actionPerformed(java.awt.event.ActionEvent evt) { |
||||
jButton2ActionPerformed(evt); |
||||
} |
||||
}); |
||||
|
||||
javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2); |
||||
jPanel2.setLayout(jPanel2Layout); |
||||
jPanel2Layout.setHorizontalGroup( |
||||
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) |
||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup() |
||||
.addContainerGap() |
||||
.addComponent(jButton2) |
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) |
||||
.addComponent(jButton1) |
||||
.addContainerGap()) |
||||
); |
||||
jPanel2Layout.setVerticalGroup( |
||||
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) |
||||
.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) |
||||
.addComponent(jButton1) |
||||
.addComponent(jButton2)) |
||||
); |
||||
|
||||
jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder("Shader node definitions")); |
||||
|
||||
jScrollPane3.setViewportView(jTree1); |
||||
|
||||
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); |
||||
jPanel1.setLayout(jPanel1Layout); |
||||
jPanel1Layout.setHorizontalGroup( |
||||
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) |
||||
.addComponent(jScrollPane3, javax.swing.GroupLayout.DEFAULT_SIZE, 236, Short.MAX_VALUE) |
||||
); |
||||
jPanel1Layout.setVerticalGroup( |
||||
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) |
||||
.addComponent(jScrollPane3, javax.swing.GroupLayout.DEFAULT_SIZE, 468, Short.MAX_VALUE) |
||||
); |
||||
|
||||
jSplitPane1.setLeftComponent(jPanel1); |
||||
|
||||
shaderNodesList.setBorder(javax.swing.BorderFactory.createTitledBorder("Shader node definition")); |
||||
|
||||
javax.swing.GroupLayout shaderNodesListLayout = new javax.swing.GroupLayout(shaderNodesList); |
||||
shaderNodesList.setLayout(shaderNodesListLayout); |
||||
shaderNodesListLayout.setHorizontalGroup( |
||||
shaderNodesListLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) |
||||
.addComponent(jTabbedPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 339, Short.MAX_VALUE) |
||||
); |
||||
shaderNodesListLayout.setVerticalGroup( |
||||
shaderNodesListLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) |
||||
.addComponent(jTabbedPane1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 468, Short.MAX_VALUE) |
||||
); |
||||
|
||||
jSplitPane1.setRightComponent(shaderNodesList); |
||||
|
||||
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); |
||||
getContentPane().setLayout(layout); |
||||
layout.setHorizontalGroup( |
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) |
||||
.addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) |
||||
.addComponent(jSplitPane1, javax.swing.GroupLayout.Alignment.LEADING) |
||||
); |
||||
layout.setVerticalGroup( |
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) |
||||
.addGroup(layout.createSequentialGroup() |
||||
.addComponent(jSplitPane1) |
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) |
||||
.addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) |
||||
); |
||||
|
||||
pack(); |
||||
}// </editor-fold>//GEN-END:initComponents
|
||||
|
||||
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed
|
||||
setVisible(false); |
||||
}//GEN-LAST:event_jButton2ActionPerformed
|
||||
|
||||
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
|
||||
setVisible(false); |
||||
diagram.addNodesFromDefs(defList, path, clickPosition); |
||||
}//GEN-LAST:event_jButton1ActionPerformed
|
||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||
private javax.swing.JButton jButton1; |
||||
private javax.swing.JButton jButton2; |
||||
private javax.swing.JPanel jPanel1; |
||||
private javax.swing.JPanel jPanel2; |
||||
private javax.swing.JScrollPane jScrollPane3; |
||||
private javax.swing.JSplitPane jSplitPane1; |
||||
private javax.swing.JTabbedPane jTabbedPane1; |
||||
private javax.swing.JTree jTree1; |
||||
private javax.swing.JPanel shaderNodesList; |
||||
// End of variables declaration//GEN-END:variables
|
||||
|
||||
private void loadDefs(ProjectAssetManager mgr) { |
||||
// defList.addAll();
|
||||
// defList.addAll(mgr.getDependenciesShaderNodeDefs());
|
||||
// List<ShaderNodeVariable> inputs = new ArrayList<ShaderNodeVariable>();
|
||||
// inputs.add(new ShaderNodeVariable("vec2", "texCoord1"));
|
||||
// inputs.add(new ShaderNodeVariable("vec2", "texCoord2"));
|
||||
// List<ShaderNodeVariable> outputs = new ArrayList<ShaderNodeVariable>();
|
||||
// outputs.add(new ShaderNodeVariable("vec2", "texCoord1"));
|
||||
// outputs.add(new ShaderNodeVariable("vec2", "texCoord2"));
|
||||
// ShaderNodeDefinition fogdef = new ShaderNodeDefinition("FogFactor", Shader.ShaderType.Vertex, "", "");
|
||||
// fogdef.setInputs(inputs);
|
||||
// fogdef.setOutputs(outputs);
|
||||
// fogdef.setDocumentation(
|
||||
// " This Node is responsible for adding a fog contribution to a color according to a fogColor and a fogFactor.\n"
|
||||
// + " This node should be used with a FogFactor node that will be responsible to compute the fogFactor in the vertex shader.\n"
|
||||
// + " Inputs : \n"
|
||||
// + " color : the color on which the fog contribution will be added.\n"
|
||||
// + " fogFactor : the previously computed fog factor \n"
|
||||
// + " fogColor : the fog color\n"
|
||||
// + " Outputs : \n"
|
||||
// + " outColor : the color with fog contribution (usually assigned to Global.color) ");
|
||||
//
|
||||
// defList.add(fogdef);
|
||||
} |
||||
|
||||
private void createDoc(ShaderNodeDefinition def) { |
||||
JTextPane doc = new JTextPane(); |
||||
doc.setEditable(false); |
||||
doc.setBackground(new java.awt.Color(240, 240, 240)); |
||||
doc.setMaximumSize(new java.awt.Dimension(300, 300)); |
||||
doc.setMinimumSize(new java.awt.Dimension(300, 300)); |
||||
doc.setPreferredSize(new java.awt.Dimension(300, 300)); |
||||
JScrollPane defPanel = new JScrollPane(); |
||||
defPanel.setViewportView(doc); |
||||
|
||||
jTabbedPane1.addTab(def.getName(), def.getType() == Shader.ShaderType.Vertex ? Icons.vert : Icons.frag, defPanel); |
||||
doc.setText(""); |
||||
DocFormatter.addDoc(def, doc.getStyledDocument()); |
||||
doc.setCaretPosition(0); |
||||
} |
||||
|
||||
private void fillList(final ProjectAssetManager mgr) { |
||||
List<String> l = new ArrayList<String>(); |
||||
l.addAll(mgr.getProjectShaderNodeDefs()); |
||||
l.addAll(mgr.getDependenciesShaderNodeDefs()); |
||||
String[] leaves = l.toArray(new String[l.size()]); |
||||
TreeUtil.createTree(jTree1, leaves); |
||||
TreeUtil.expandTree(jTree1, (TreeNode) jTree1.getModel().getRoot(), 10); |
||||
jTree1.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); |
||||
jTree1.addTreeSelectionListener(new TreeSelectionListener() { |
||||
public void valueChanged(TreeSelectionEvent e) { |
||||
|
||||
DefaultMutableTreeNode node = (DefaultMutableTreeNode) jTree1.getLastSelectedPathComponent(); |
||||
|
||||
if (node == null) { |
||||
return; |
||||
} |
||||
|
||||
|
||||
if (node.isLeaf()) { |
||||
jTabbedPane1.removeAll(); |
||||
path = TreeUtil.getPath(node.getUserObjectPath()); |
||||
path = path.substring(0, path.lastIndexOf("/")); |
||||
ShaderNodeDefinitionKey k = new ShaderNodeDefinitionKey(path); |
||||
k.setLoadDocumentation(true); |
||||
defList = (List<ShaderNodeDefinition>) mgr.loadAsset(k); |
||||
|
||||
for (ShaderNodeDefinition def : defList) { |
||||
createDoc(def); |
||||
} |
||||
|
||||
} |
||||
} |
||||
}); |
||||
} |
||||
} |
@ -0,0 +1,107 @@ |
||||
<?xml version="1.0" encoding="UTF-8" ?> |
||||
|
||||
<Form version="1.5" maxVersion="1.8" type="org.netbeans.modules.form.forminfo.JDialogFormInfo"> |
||||
<Properties> |
||||
<Property name="defaultCloseOperation" type="int" value="2"/> |
||||
<Property name="title" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor"> |
||||
<ResourceString bundle="com/jme3/gde/materialdefinition/dialog/Bundle.properties" key="AddWorldParameterDialog.title" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/> |
||||
</Property> |
||||
<Property name="modal" type="boolean" value="true"/> |
||||
</Properties> |
||||
<SyntheticProperties> |
||||
<SyntheticProperty name="formSizePolicy" type="int" value="1"/> |
||||
</SyntheticProperties> |
||||
<AuxValues> |
||||
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/> |
||||
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/> |
||||
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/> |
||||
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/> |
||||
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/> |
||||
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/> |
||||
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/> |
||||
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/> |
||||
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/> |
||||
</AuxValues> |
||||
|
||||
<Layout> |
||||
<DimensionLayout dim="0"> |
||||
<Group type="103" groupAlignment="0" attributes="0"> |
||||
<Group type="102" attributes="0"> |
||||
<EmptySpace max="-2" attributes="0"/> |
||||
<Group type="103" groupAlignment="0" attributes="0"> |
||||
<Group type="102" alignment="1" attributes="0"> |
||||
<Component id="jButton2" min="-2" max="-2" attributes="0"/> |
||||
<EmptySpace max="32767" attributes="0"/> |
||||
<Component id="jButton1" min="-2" max="-2" attributes="0"/> |
||||
</Group> |
||||
<Group type="102" alignment="0" attributes="0"> |
||||
<Component id="jLabel1" min="-2" pref="123" max="-2" attributes="0"/> |
||||
<EmptySpace max="-2" attributes="0"/> |
||||
<Component id="nameField" pref="253" max="32767" attributes="0"/> |
||||
</Group> |
||||
</Group> |
||||
<EmptySpace max="-2" attributes="0"/> |
||||
</Group> |
||||
</Group> |
||||
</DimensionLayout> |
||||
<DimensionLayout dim="1"> |
||||
<Group type="103" groupAlignment="0" attributes="0"> |
||||
<Group type="102" alignment="1" attributes="0"> |
||||
<EmptySpace max="-2" attributes="0"/> |
||||
<Group type="103" groupAlignment="3" attributes="0"> |
||||
<Component id="jLabel1" alignment="3" min="-2" max="-2" attributes="0"/> |
||||
<Component id="nameField" alignment="3" min="-2" max="-2" attributes="0"/> |
||||
</Group> |
||||
<EmptySpace max="32767" attributes="0"/> |
||||
<Group type="103" groupAlignment="3" attributes="0"> |
||||
<Component id="jButton1" alignment="3" min="-2" max="-2" attributes="0"/> |
||||
<Component id="jButton2" alignment="3" min="-2" max="-2" attributes="0"/> |
||||
</Group> |
||||
<EmptySpace max="-2" attributes="0"/> |
||||
</Group> |
||||
</Group> |
||||
</DimensionLayout> |
||||
</Layout> |
||||
<SubComponents> |
||||
<Component class="javax.swing.JButton" name="jButton1"> |
||||
<Properties> |
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor"> |
||||
<ResourceString bundle="com/jme3/gde/materialdefinition/dialog/Bundle.properties" key="AddWorldParameterDialog.jButton1.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/> |
||||
</Property> |
||||
</Properties> |
||||
<Events> |
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButton1ActionPerformed"/> |
||||
</Events> |
||||
</Component> |
||||
<Component class="javax.swing.JButton" name="jButton2"> |
||||
<Properties> |
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor"> |
||||
<ResourceString bundle="com/jme3/gde/materialdefinition/dialog/Bundle.properties" key="AddWorldParameterDialog.jButton2.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/> |
||||
</Property> |
||||
</Properties> |
||||
<Events> |
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jButton2ActionPerformed"/> |
||||
</Events> |
||||
</Component> |
||||
<Component class="javax.swing.JLabel" name="jLabel1"> |
||||
<Properties> |
||||
<Property name="horizontalAlignment" type="int" value="11"/> |
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor"> |
||||
<ResourceString bundle="com/jme3/gde/materialdefinition/dialog/Bundle.properties" key="AddWorldParameterDialog.jLabel1.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/> |
||||
</Property> |
||||
</Properties> |
||||
</Component> |
||||
<Component class="javax.swing.JComboBox" name="nameField"> |
||||
<Properties> |
||||
<Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor"> |
||||
<StringArray count="4"> |
||||
<StringItem index="0" value="Item 1"/> |
||||
<StringItem index="1" value="Item 2"/> |
||||
<StringItem index="2" value="Item 3"/> |
||||
<StringItem index="3" value="Item 4"/> |
||||
</StringArray> |
||||
</Property> |
||||
</Properties> |
||||
</Component> |
||||
</SubComponents> |
||||
</Form> |
@ -0,0 +1,122 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.dialog; |
||||
|
||||
import com.jme3.gde.materialdefinition.editor.Diagram; |
||||
import com.jme3.shader.UniformBinding; |
||||
import java.awt.Point; |
||||
import javax.swing.DefaultComboBoxModel; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public class AddWorldParameterDialog extends javax.swing.JDialog { |
||||
|
||||
private Diagram diagram; |
||||
private Point clickPosition; |
||||
|
||||
/** |
||||
* Creates new form AddMaterialParameter |
||||
*/ |
||||
public AddWorldParameterDialog(java.awt.Frame parent, boolean modal, Diagram diagram, Point clickPosition) { |
||||
super(parent, modal); |
||||
initComponents(); |
||||
DefaultComboBoxModel<UniformBinding> model = new DefaultComboBoxModel<UniformBinding>(); |
||||
|
||||
for (UniformBinding binding : UniformBinding.values()) { |
||||
model.addElement(binding); |
||||
} |
||||
this.diagram = diagram; |
||||
this.clickPosition = clickPosition; |
||||
nameField.setModel(model); |
||||
} |
||||
|
||||
/** |
||||
* This method is called from within the constructor to initialize the form. |
||||
* WARNING: Do NOT modify this code. The content of this method is always |
||||
* regenerated by the Form Editor. |
||||
*/ |
||||
@SuppressWarnings("unchecked") |
||||
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
||||
private void initComponents() { |
||||
|
||||
jButton1 = new javax.swing.JButton(); |
||||
jButton2 = new javax.swing.JButton(); |
||||
jLabel1 = new javax.swing.JLabel(); |
||||
nameField = new javax.swing.JComboBox(); |
||||
|
||||
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); |
||||
setTitle(org.openide.util.NbBundle.getMessage(AddWorldParameterDialog.class, "AddWorldParameterDialog.title")); // NOI18N
|
||||
setModal(true); |
||||
|
||||
org.openide.awt.Mnemonics.setLocalizedText(jButton1, org.openide.util.NbBundle.getMessage(AddWorldParameterDialog.class, "AddWorldParameterDialog.jButton1.text")); // NOI18N
|
||||
jButton1.addActionListener(new java.awt.event.ActionListener() { |
||||
public void actionPerformed(java.awt.event.ActionEvent evt) { |
||||
jButton1ActionPerformed(evt); |
||||
} |
||||
}); |
||||
|
||||
org.openide.awt.Mnemonics.setLocalizedText(jButton2, org.openide.util.NbBundle.getMessage(AddWorldParameterDialog.class, "AddWorldParameterDialog.jButton2.text")); // NOI18N
|
||||
jButton2.addActionListener(new java.awt.event.ActionListener() { |
||||
public void actionPerformed(java.awt.event.ActionEvent evt) { |
||||
jButton2ActionPerformed(evt); |
||||
} |
||||
}); |
||||
|
||||
jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); |
||||
org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(AddWorldParameterDialog.class, "AddWorldParameterDialog.jLabel1.text")); // NOI18N
|
||||
|
||||
nameField.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" })); |
||||
|
||||
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); |
||||
getContentPane().setLayout(layout); |
||||
layout.setHorizontalGroup( |
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) |
||||
.addGroup(layout.createSequentialGroup() |
||||
.addContainerGap() |
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) |
||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() |
||||
.addComponent(jButton2) |
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) |
||||
.addComponent(jButton1)) |
||||
.addGroup(layout.createSequentialGroup() |
||||
.addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 123, javax.swing.GroupLayout.PREFERRED_SIZE) |
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) |
||||
.addComponent(nameField, 0, 253, Short.MAX_VALUE))) |
||||
.addContainerGap()) |
||||
); |
||||
layout.setVerticalGroup( |
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) |
||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() |
||||
.addContainerGap() |
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) |
||||
.addComponent(jLabel1) |
||||
.addComponent(nameField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) |
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) |
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) |
||||
.addComponent(jButton1) |
||||
.addComponent(jButton2)) |
||||
.addContainerGap()) |
||||
); |
||||
|
||||
pack(); |
||||
}// </editor-fold>//GEN-END:initComponents
|
||||
|
||||
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed
|
||||
setVisible(false); |
||||
}//GEN-LAST:event_jButton2ActionPerformed
|
||||
|
||||
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
|
||||
diagram.addWorldParam((UniformBinding) nameField.getSelectedItem(), clickPosition); |
||||
setVisible(false); |
||||
}//GEN-LAST:event_jButton1ActionPerformed
|
||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||
private javax.swing.JButton jButton1; |
||||
private javax.swing.JButton jButton2; |
||||
private javax.swing.JLabel jLabel1; |
||||
private javax.swing.JComboBox nameField; |
||||
// End of variables declaration//GEN-END:variables
|
||||
} |
@ -0,0 +1,17 @@ |
||||
|
||||
AddMaterialParameterDialog.nameField.text= |
||||
AddMaterialParameterDialog.jLabel3.text=Parameter Name |
||||
AddMaterialParameterDialog.jLabel1.text=Parameter Type |
||||
AddMaterialParameterDialog.title=Add Material Parameter |
||||
AddMaterialParameterDialog.jButton1.text=Ok |
||||
AddMaterialParameterDialog.jButton2.text=Cancel |
||||
AddWorldParameterDialog.title=Add Material Parameter |
||||
AddWorldParameterDialog.jButton1.text=Ok |
||||
AddWorldParameterDialog.jButton2.text=Cancel |
||||
AddWorldParameterDialog.jLabel1.text=Parameter Name |
||||
AddAttributeDialog.jButton2.text=Cancel |
||||
AddAttributeDialog.jLabel1.text=Attribute |
||||
AddAttributeDialog.title=Add Material Parameter |
||||
AddAttributeDialog.jButton1.text=Ok |
||||
AddAttributeDialog.jLabel2.text=GLSL Type |
||||
AddAttributeDialog.typeField.text= |
@ -0,0 +1,539 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.editor; |
||||
|
||||
import com.jme3.gde.materialdefinition.fileStructure.leaves.MappingBlock; |
||||
import com.jme3.gde.materialdefinition.utils.MaterialUtils; |
||||
import java.awt.Color; |
||||
import java.awt.Component; |
||||
import java.awt.Graphics; |
||||
import java.awt.Point; |
||||
import java.awt.event.ComponentEvent; |
||||
import java.awt.event.ComponentListener; |
||||
import java.awt.event.KeyEvent; |
||||
import java.awt.event.KeyListener; |
||||
import java.awt.event.MouseEvent; |
||||
import java.awt.event.MouseWheelEvent; |
||||
import java.beans.PropertyChangeEvent; |
||||
import java.beans.PropertyChangeListener; |
||||
import javax.swing.JPanel; |
||||
import javax.swing.SwingUtilities; |
||||
import javax.swing.event.MenuDragMouseEvent; |
||||
import javax.swing.event.MouseInputListener; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public class Connection extends JPanel implements ComponentListener, MouseInputListener, KeyListener, Selectable, PropertyChangeListener { |
||||
|
||||
protected Dot start; |
||||
protected Dot end; |
||||
private Point[] points = new Point[6]; |
||||
private int pointsSize = 6; |
||||
private Corner[] corners = new Corner[6]; |
||||
private String key = ""; |
||||
protected MappingBlock mapping; |
||||
|
||||
private MouseEvent convertEvent(MouseEvent e) { |
||||
MouseEvent me = null; |
||||
//workaround for swing utilities removing mouse button when converting events.
|
||||
if (e instanceof MouseWheelEvent || e instanceof MenuDragMouseEvent) { |
||||
SwingUtilities.convertMouseEvent(this, e, getDiagram()); |
||||
} else { |
||||
Point p = SwingUtilities.convertPoint(this, new Point(e.getX(), |
||||
e.getY()), |
||||
getDiagram()); |
||||
|
||||
me = new MouseEvent(getDiagram(), |
||||
e.getID(), |
||||
e.getWhen(), |
||||
e.getModifiers() |
||||
| e.getModifiersEx(), |
||||
p.x, p.y, |
||||
e.getXOnScreen(), |
||||
e.getYOnScreen(), |
||||
e.getClickCount(), |
||||
e.isPopupTrigger(), |
||||
e.getButton()); |
||||
} |
||||
return me; |
||||
} |
||||
|
||||
private enum Corner { |
||||
|
||||
RightBottom, |
||||
BottomRight, |
||||
BottomLeft, |
||||
LeftBottom, |
||||
RightTop, |
||||
TopRight, |
||||
LeftTop, |
||||
TopLeft, |
||||
Top, |
||||
Bottom, |
||||
None,} |
||||
|
||||
public Connection(Dot start, Dot end) { |
||||
|
||||
|
||||
if (start.getParamType() == Dot.ParamType.Output |
||||
|| (start.getParamType() == Dot.ParamType.Both && end.getParamType() != Dot.ParamType.Output) |
||||
|| (end.getParamType() == Dot.ParamType.Both && start.getParamType() != Dot.ParamType.Input)) { |
||||
this.start = start; |
||||
this.end = end; |
||||
} else { |
||||
this.start = end; |
||||
this.end = start; |
||||
} |
||||
|
||||
for (int i = 0; i < 6; i++) { |
||||
points[i] = new Point(); |
||||
} |
||||
resize(this.start, this.end); |
||||
addMouseMotionListener(this); |
||||
addMouseListener(this); |
||||
addKeyListener(this); |
||||
setFocusable(true); |
||||
setOpaque(false); |
||||
|
||||
} |
||||
|
||||
private void translate(Point p, Point store) { |
||||
store.x = p.x - getLocation().x - 1; |
||||
store.y = p.y - getLocation().y - 1; |
||||
} |
||||
private Point p1 = new Point(); |
||||
private Point p2 = new Point(); |
||||
private Point tp1 = new Point(); |
||||
private Point bp1 = new Point(); |
||||
private Point tp2 = new Point(); |
||||
private Point bp2 = new Point(); |
||||
|
||||
@Override |
||||
protected void paintBorder(Graphics g) { |
||||
// super.paintBorder(g);
|
||||
//
|
||||
// g.setColor(Color.GRAY);
|
||||
// g.drawLine(0, 0, getWidth(), 0);
|
||||
// g.drawLine(getWidth(), 0, getWidth(), getHeight() - 1);
|
||||
// g.drawLine(getWidth(), getHeight() - 1, 0, getHeight() - 1);
|
||||
// g.drawLine(0, getHeight() - 1, 0, 0);
|
||||
} |
||||
|
||||
public String getKey() { |
||||
return key; |
||||
} |
||||
|
||||
protected void makeKey(MappingBlock mapping, String techName) { |
||||
this.mapping = mapping; |
||||
key = MaterialUtils.makeKey(mapping, techName); |
||||
} |
||||
|
||||
private void adjustCorners(Corner corner, Point tp, Point bp) { |
||||
switch (corner) { |
||||
case LeftTop: |
||||
case TopLeft: |
||||
tp.x -= 1; |
||||
bp.x += 1; |
||||
tp.y += 1; |
||||
bp.y -= 1; |
||||
break; |
||||
case RightBottom: |
||||
case BottomRight: |
||||
tp.x += 1; |
||||
bp.x -= 1; |
||||
tp.y -= 1; |
||||
bp.y += 1; |
||||
break; |
||||
case RightTop: |
||||
case TopRight: |
||||
tp.x -= 1; |
||||
bp.x += 1; |
||||
tp.y -= 1; |
||||
bp.y += 1; |
||||
break; |
||||
case LeftBottom: |
||||
case BottomLeft: |
||||
tp.x += 1; |
||||
bp.x -= 1; |
||||
tp.y += 1; |
||||
bp.y -= 1; |
||||
break; |
||||
case None: |
||||
tp.y -= 1; |
||||
bp.y += 1; |
||||
break; |
||||
case Top: |
||||
tp.x -= 1; |
||||
bp.x += 1; |
||||
break; |
||||
case Bottom: |
||||
tp.x += 1; |
||||
bp.x -= 1; |
||||
break; |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
protected void paintComponent(Graphics g) { |
||||
if (paintDebug) { |
||||
for (int i = 0; i < pointsSize - 1; i++) { |
||||
translate(points[i], p1); |
||||
p1.x -= MARGIN; |
||||
p1.y -= MARGIN; |
||||
translate(points[i + 1], p2); |
||||
p2.x += MARGIN; |
||||
p2.y += MARGIN; |
||||
g.setColor(Color.GRAY); |
||||
g.drawLine(p1.x, p1.y, p2.x, p1.y); |
||||
g.drawLine(p2.x, p1.y, p2.x, p2.y); |
||||
g.drawLine(p2.x, p2.y, p1.x, p2.y); |
||||
g.drawLine(p1.x, p2.y, p1.x, p1.y); |
||||
|
||||
|
||||
} |
||||
|
||||
paintDebug = false; |
||||
} |
||||
|
||||
for (int i = 0; i < pointsSize - 1; i++) { |
||||
|
||||
g.setColor(Color.YELLOW); |
||||
translate(points[i], p1); |
||||
translate(points[i + 1], p2); |
||||
g.drawLine(p1.x, p1.y, p2.x, p2.y); |
||||
|
||||
|
||||
if (getDiagram().selectedItem == this) { |
||||
g.setColor(Color.CYAN); |
||||
} else { |
||||
g.setColor(Color.GRAY); |
||||
} |
||||
tp1.setLocation(p1); |
||||
bp1.setLocation(p1); |
||||
tp2.setLocation(p2); |
||||
bp2.setLocation(p2); |
||||
adjustCorners(corners[i], tp1, bp1); |
||||
adjustCorners(corners[i + 1], tp2, bp2); |
||||
g.drawLine(tp1.x, tp1.y, tp2.x, tp2.y); |
||||
g.drawLine(bp1.x, bp1.y, bp2.x, bp2.y); |
||||
|
||||
} |
||||
|
||||
} |
||||
public final static int MARGIN = 10; |
||||
|
||||
private int getOffset() { |
||||
return 5 * start.getIndex(); |
||||
} |
||||
|
||||
private int getHMiddle() { |
||||
int st = start.getNode().getLocation().y + start.getNode().getHeight(); |
||||
int diff = end.getNode().getLocation().y - st; |
||||
return st + diff / 2 + getOffset(); |
||||
|
||||
} |
||||
|
||||
private int getVMiddleStart() { |
||||
Point startLocation = start.getStartLocation(); |
||||
Point endLocation = end.getEndLocation(); |
||||
return startLocation.x + Math.max(MARGIN, (endLocation.x - startLocation.x) / 2) + getOffset(); |
||||
} |
||||
|
||||
private int getVMiddleStartClampedRight() { |
||||
Point startLocation = start.getStartLocation(); |
||||
Point endLocation = end.getEndLocation(); |
||||
int right = end.getNode().getLocation().x + end.getNode().getWidth() + MARGIN; |
||||
int loc = startLocation.x + Math.max(MARGIN, (endLocation.x - startLocation.x) / 2); |
||||
return Math.max(loc, right) + getOffset(); |
||||
} |
||||
|
||||
private int getVMiddleEnd() { |
||||
Point startLocation = start.getStartLocation(); |
||||
Point endLocation = end.getEndLocation(); |
||||
return endLocation.x - Math.max(0, Math.max(MARGIN, (endLocation.x - startLocation.x) / 2) + getOffset()); |
||||
|
||||
} |
||||
|
||||
private int getVMiddleEndClampedLeft() { |
||||
Point startLocation = start.getStartLocation(); |
||||
Point endLocation = end.getEndLocation(); |
||||
int left = start.getNode().getLocation().x - MARGIN;//+ end.getNode().getWidth() + MARGIN;
|
||||
int loc = endLocation.x - Math.max(0, Math.max(MARGIN, (endLocation.x - startLocation.x) / 2)); |
||||
return Math.min(loc, left) + getOffset(); |
||||
|
||||
} |
||||
|
||||
private int getHBottom() { |
||||
int endBottom = end.getNode().getLocation().y + end.getNode().getHeight() + MARGIN; |
||||
int startBottom = start.getNode().getLocation().y + start.getNode().getHeight() + MARGIN; |
||||
return Math.max(endBottom, startBottom) + getOffset(); |
||||
|
||||
} |
||||
|
||||
public final void resize(Dot start, Dot end) { |
||||
Point startLocation = start.getStartLocation(); |
||||
Point endLocation = end.getEndLocation(); |
||||
|
||||
if (start.getParamType() == Dot.ParamType.Both) { |
||||
startLocation.x = endLocation.x - MARGIN * 2; |
||||
pointsSize = 3; |
||||
points[0].setLocation(startLocation); |
||||
points[1].x = startLocation.x; |
||||
points[1].y = endLocation.y; |
||||
points[2].setLocation(endLocation); |
||||
if (startLocation.y <= endLocation.y) { |
||||
corners[0] = Corner.Bottom; |
||||
corners[1] = Corner.BottomRight; |
||||
corners[2] = Corner.None; |
||||
} else { |
||||
corners[0] = Corner.Top; |
||||
corners[1] = Corner.TopRight; |
||||
corners[2] = Corner.None; |
||||
} |
||||
} else if (end.getParamType() == Dot.ParamType.Both) { |
||||
endLocation.x = startLocation.x + MARGIN * 2; |
||||
pointsSize = 3; |
||||
points[0].setLocation(startLocation); |
||||
points[1].x = endLocation.x; |
||||
points[1].y = startLocation.y; |
||||
points[2].setLocation(endLocation); |
||||
if (startLocation.y <= endLocation.y) { |
||||
corners[0] = Corner.None; |
||||
corners[1] = Corner.RightBottom; |
||||
corners[2] = Corner.Bottom; |
||||
} else { |
||||
corners[0] = Corner.None; |
||||
corners[1] = Corner.RightTop; |
||||
corners[2] = Corner.Top; |
||||
} |
||||
} else if (startLocation.x + MARGIN <= endLocation.x - MARGIN) { |
||||
pointsSize = 4; |
||||
points[0].setLocation(startLocation); |
||||
points[1].x = getVMiddleStart(); |
||||
points[1].y = startLocation.y; |
||||
points[2].x = getVMiddleStart(); |
||||
points[2].y = endLocation.y; |
||||
corners[0] = Corner.None; |
||||
corners[3] = Corner.None; |
||||
points[3].setLocation(endLocation); |
||||
if (startLocation.y <= endLocation.y) { |
||||
corners[1] = Corner.RightBottom; |
||||
corners[2] = Corner.BottomRight; |
||||
} else { |
||||
corners[1] = Corner.RightTop; |
||||
corners[2] = Corner.TopRight; |
||||
} |
||||
|
||||
} else { |
||||
pointsSize = 6; |
||||
points[0].setLocation(startLocation); |
||||
points[5].setLocation(endLocation); |
||||
points[1].x = getVMiddleStart(); |
||||
points[1].y = startLocation.y; |
||||
|
||||
points[4].x = getVMiddleEnd(); |
||||
points[4].y = endLocation.y; |
||||
corners[0] = Corner.None; |
||||
corners[5] = Corner.None; |
||||
if ((start.getNode().getLocation().y + start.getNode().getHeight() + MARGIN |
||||
> end.getNode().getLocation().y - MARGIN) |
||||
&& (end.getNode().getLocation().y + end.getNode().getHeight() + MARGIN |
||||
> start.getNode().getLocation().y - MARGIN)) { |
||||
|
||||
if (startLocation.y + MARGIN <= endLocation.y - MARGIN) { |
||||
points[1].x = getVMiddleStartClampedRight(); |
||||
points[2].x = getVMiddleStartClampedRight(); |
||||
} else { |
||||
points[1].x = getVMiddleStart(); |
||||
points[2].x = getVMiddleStart(); |
||||
} |
||||
points[2].y = getHBottom(); |
||||
|
||||
if (startLocation.y + MARGIN > endLocation.y - MARGIN) { |
||||
points[3].x = getVMiddleEndClampedLeft(); |
||||
points[4].x = getVMiddleEndClampedLeft(); |
||||
|
||||
} else { |
||||
points[3].x = getVMiddleEnd(); |
||||
points[4].x = getVMiddleEnd(); |
||||
} |
||||
|
||||
points[3].y = getHBottom(); |
||||
|
||||
corners[1] = Corner.RightBottom; |
||||
corners[2] = Corner.BottomLeft; |
||||
corners[3] = Corner.LeftTop; |
||||
corners[4] = Corner.TopRight; |
||||
|
||||
} else { |
||||
|
||||
points[2].x = getVMiddleStart(); |
||||
points[2].y = getHMiddle(); |
||||
|
||||
points[3].x = getVMiddleEnd(); |
||||
points[3].y = getHMiddle(); |
||||
|
||||
|
||||
if (startLocation.y <= endLocation.y) { |
||||
corners[1] = Corner.RightBottom; |
||||
corners[2] = Corner.BottomLeft; |
||||
corners[3] = Corner.LeftBottom; |
||||
corners[4] = Corner.BottomRight; |
||||
} else { |
||||
corners[1] = Corner.RightTop; |
||||
corners[2] = Corner.TopLeft; |
||||
corners[3] = Corner.LeftTop; |
||||
corners[4] = Corner.TopRight; |
||||
} |
||||
} |
||||
} |
||||
updateBounds(); |
||||
} |
||||
|
||||
private void updateBounds() { |
||||
int minX = Integer.MAX_VALUE, minY = Integer.MAX_VALUE, maxX = Integer.MIN_VALUE, maxY = Integer.MIN_VALUE; |
||||
for (int i = 0; i < pointsSize; i++) { |
||||
if (points[i].x < minX) { |
||||
minX = points[i].x; |
||||
} |
||||
if (points[i].y < minY) { |
||||
minY = points[i].y; |
||||
} |
||||
|
||||
if (points[i].x > maxX) { |
||||
maxX = points[i].x; |
||||
} |
||||
if (points[i].y > maxY) { |
||||
maxY = points[i].y; |
||||
} |
||||
} |
||||
maxX += MARGIN; |
||||
maxY += MARGIN; |
||||
minX -= MARGIN; |
||||
minY -= MARGIN; |
||||
|
||||
setLocation(minX, minY); |
||||
setSize(maxX - minX, maxY - minY); |
||||
} |
||||
|
||||
private Diagram getDiagram() { |
||||
return (Diagram) start.getDiagram(); |
||||
} |
||||
|
||||
@Override |
||||
public void mouseDragged(MouseEvent e) { |
||||
dispatchEventToDiagram(e); |
||||
} |
||||
|
||||
private void dispatchEventToDiagram(MouseEvent e) { |
||||
MouseEvent me = null; |
||||
me = convertEvent(e); |
||||
getDiagram().dispatchEvent(me); |
||||
} |
||||
|
||||
@Override |
||||
public void mouseMoved(MouseEvent e) { |
||||
dispatchEventToDiagram(e); |
||||
} |
||||
private boolean paintDebug = false; |
||||
|
||||
private void debug() { |
||||
paintDebug = true; |
||||
repaint(); |
||||
} |
||||
|
||||
@Override |
||||
public void mouseClicked(MouseEvent e) { |
||||
dispatchEventToDiagram(e); |
||||
} |
||||
|
||||
@Override |
||||
public void mousePressed(MouseEvent e) { |
||||
dispatchEventToDiagram(e); |
||||
} |
||||
|
||||
@Override |
||||
public void mouseReleased(MouseEvent e) { |
||||
dispatchEventToDiagram(e); |
||||
} |
||||
|
||||
public void select(MouseEvent e) { |
||||
boolean selected = false; |
||||
requestFocusInWindow(true); |
||||
for (int i = 0; i < pointsSize - 1; i++) { |
||||
translate(points[i], p1); |
||||
translate(points[i + 1], p2); |
||||
if (p1.x > p2.x || p1.y > p2.y) { |
||||
tp1.setLocation(p1); |
||||
p1.setLocation(p2); |
||||
p2.setLocation(tp1); |
||||
} |
||||
|
||||
p1.x -= MARGIN / 2; |
||||
p1.y -= MARGIN / 2; |
||||
|
||||
p2.x += MARGIN / 2; |
||||
p2.y += MARGIN / 2; |
||||
|
||||
|
||||
if (e.getX() >= p1.x && e.getX() <= p2.x |
||||
&& e.getY() >= p1.y && e.getY() <= p2.y) { |
||||
selected = true; |
||||
} |
||||
} |
||||
|
||||
if (selected) { |
||||
getDiagram().select(this); |
||||
e.consume(); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void mouseEntered(MouseEvent e) { |
||||
} |
||||
|
||||
@Override |
||||
public void mouseExited(MouseEvent e) { |
||||
} |
||||
|
||||
@Override |
||||
public void keyTyped(KeyEvent e) { |
||||
} |
||||
|
||||
@Override |
||||
public void keyPressed(KeyEvent e) { |
||||
|
||||
if (e.getKeyCode() == KeyEvent.VK_DELETE) { |
||||
Diagram diag = getDiagram(); |
||||
if (diag.selectedItem == this) { |
||||
diag.removeSelectedConnection(); |
||||
} |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void keyReleased(KeyEvent e) { |
||||
} |
||||
|
||||
public void componentResized(ComponentEvent e) { |
||||
} |
||||
|
||||
public void componentMoved(ComponentEvent e) { |
||||
resize(start, end); |
||||
} |
||||
|
||||
public void componentShown(ComponentEvent e) { |
||||
} |
||||
|
||||
public void componentHidden(ComponentEvent e) { |
||||
} |
||||
|
||||
public void propertyChange(PropertyChangeEvent evt) { |
||||
MappingBlock mapping = (MappingBlock) evt.getSource(); |
||||
key = MaterialUtils.makeKey(mapping, getDiagram().getCurrentTechniqueName()); |
||||
} |
||||
} |
@ -0,0 +1,531 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.editor; |
||||
|
||||
import com.jme3.gde.core.assets.ProjectAssetManager; |
||||
import com.jme3.gde.materialdefinition.dialog.AddAttributeDialog; |
||||
import com.jme3.gde.materialdefinition.dialog.AddMaterialParameterDialog; |
||||
import com.jme3.gde.materialdefinition.dialog.AddNodeDialog; |
||||
import com.jme3.gde.materialdefinition.dialog.AddWorldParameterDialog; |
||||
import com.jme3.gde.materialdefinition.fileStructure.ShaderNodeBlock; |
||||
import com.jme3.gde.materialdefinition.icons.Icons; |
||||
import com.jme3.material.Material; |
||||
import com.jme3.shader.Shader; |
||||
import com.jme3.shader.ShaderNodeDefinition; |
||||
import com.jme3.shader.ShaderNodeVariable; |
||||
import com.jme3.shader.UniformBinding; |
||||
import com.jme3.shader.VarType; |
||||
import java.awt.Color; |
||||
import java.awt.Component; |
||||
import java.awt.Dimension; |
||||
import java.awt.Font; |
||||
import java.awt.Graphics; |
||||
import java.awt.Point; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
import java.awt.event.ComponentEvent; |
||||
import java.awt.event.ComponentListener; |
||||
import java.awt.event.MouseEvent; |
||||
import java.awt.event.MouseListener; |
||||
import java.awt.event.MouseMotionListener; |
||||
import java.util.ArrayList; |
||||
import java.util.Iterator; |
||||
import java.util.List; |
||||
import javax.swing.BorderFactory; |
||||
import javax.swing.Icon; |
||||
import javax.swing.JMenuItem; |
||||
import javax.swing.JOptionPane; |
||||
import javax.swing.JPanel; |
||||
import javax.swing.JPopupMenu; |
||||
import javax.swing.JSeparator; |
||||
import javax.swing.SwingUtilities; |
||||
import javax.swing.border.Border; |
||||
import javax.swing.border.TitledBorder; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public class Diagram extends JPanel implements MouseListener, MouseMotionListener, ComponentListener { |
||||
|
||||
protected Dot draggedFrom; |
||||
protected Dot draggedTo; |
||||
protected Selectable selectedItem; |
||||
protected List<Connection> connections = new ArrayList<Connection>(); |
||||
protected List<NodePanel> nodes = new ArrayList<NodePanel>(); |
||||
protected List<OutBusPanel> outBuses = new ArrayList<OutBusPanel>(); |
||||
private MyMenu contextMenu = new MyMenu("Add"); |
||||
private MatDefEditorlElement parent; |
||||
private String currentTechniqueName; |
||||
|
||||
public Diagram() { |
||||
|
||||
addMouseListener(this); |
||||
addMouseMotionListener(this); |
||||
createPopupMenu(); |
||||
} |
||||
|
||||
@Override |
||||
public void mouseClicked(MouseEvent e) { |
||||
} |
||||
|
||||
@Override |
||||
public void mousePressed(MouseEvent e) { |
||||
|
||||
for (OutBusPanel outBusPanel : outBuses) { |
||||
Point p = SwingUtilities.convertPoint(this, e.getX(), e.getY(), outBusPanel); |
||||
if (outBusPanel.contains(p)) { |
||||
MouseEvent me = SwingUtilities.convertMouseEvent(this, e, outBusPanel); |
||||
outBusPanel.dispatchEvent(me); |
||||
if (me.isConsumed()) { |
||||
return; |
||||
} |
||||
} |
||||
} |
||||
|
||||
for (Connection connection : connections) { |
||||
MouseEvent me = SwingUtilities.convertMouseEvent(this, e, connection); |
||||
connection.select(me); |
||||
if (me.isConsumed()) { |
||||
return; |
||||
} |
||||
} |
||||
|
||||
selectedItem = null; |
||||
repaint(); |
||||
} |
||||
|
||||
public void refreshPreviews(Material mat) { |
||||
for (OutBusPanel outBusPanel : outBuses) { |
||||
outBusPanel.updatePreview(mat); |
||||
} |
||||
} |
||||
Point clickLoc = new Point(0, 0); |
||||
|
||||
@Override |
||||
public void mouseReleased(MouseEvent e) { |
||||
if (draggedFrom != null && draggedFrom.getNode() instanceof OutBusPanel) { |
||||
MouseEvent me = SwingUtilities.convertMouseEvent(this, e, draggedFrom.getNode()); |
||||
draggedFrom.getNode().dispatchEvent(me); |
||||
if (me.isConsumed()) { |
||||
return; |
||||
} |
||||
} |
||||
if (e.getButton() != MouseEvent.BUTTON3) { |
||||
dispatchToOutBuses(e); |
||||
} else { |
||||
contextMenu.show(this, e.getX(), e.getY()); |
||||
clickLoc.setLocation(e.getX(), e.getY()); |
||||
} |
||||
|
||||
} |
||||
|
||||
public MatDefEditorlElement getEditorParent() { |
||||
return parent; |
||||
} |
||||
|
||||
public void addConnection(Connection conn) { |
||||
connections.add(conn); |
||||
add(conn); |
||||
for (OutBusPanel bus : outBuses) { |
||||
setComponentZOrder(bus, getComponentCount() - 1); |
||||
} |
||||
repaint(); |
||||
} |
||||
|
||||
public void notifyMappingCreation(Connection conn) { |
||||
parent.makeMapping(conn); |
||||
} |
||||
|
||||
public void addNode(NodePanel node) { |
||||
add(node); |
||||
node.setTechName(currentTechniqueName); |
||||
node.setDiagram(this); |
||||
nodes.add(node); |
||||
setComponentZOrder(node, 0); |
||||
node.addComponentListener(this); |
||||
} |
||||
|
||||
public void addOutBus(OutBusPanel bus) { |
||||
outBuses.add(bus); |
||||
bus.setDiagram(this); |
||||
add(bus); |
||||
setComponentZOrder(bus, getComponentCount() - 1); |
||||
addComponentListener(bus); |
||||
bus.componentResized(new ComponentEvent(this, ActionEvent.ACTION_PERFORMED)); |
||||
bus.revalidate(); |
||||
} |
||||
|
||||
@Override |
||||
public void mouseEntered(MouseEvent e) { |
||||
} |
||||
|
||||
@Override |
||||
public void mouseExited(MouseEvent e) { |
||||
} |
||||
|
||||
protected void removeSelectedConnection() { |
||||
if (selectedItem instanceof Connection) { |
||||
Connection selectedConnection = (Connection) selectedItem; |
||||
removeConnection(selectedConnection); |
||||
selectedItem = null; |
||||
parent.notifyRemoveConnection(selectedConnection); |
||||
} |
||||
} |
||||
|
||||
public void addNodesFromDefs(List<ShaderNodeDefinition> defList, String path, Point clickPosition) { |
||||
int i = 0; |
||||
for (ShaderNodeDefinition def : defList) { |
||||
ShaderNodeBlock sn = new ShaderNodeBlock(def, path); |
||||
NodePanel np = new NodePanel(sn, def); |
||||
addNode(np); |
||||
np.setLocation(clickPosition.x + i * 150, clickPosition.y); |
||||
sn.setSpatialOrder(np.getLocation().x); |
||||
i++; |
||||
np.revalidate(); |
||||
getEditorParent().notifyAddNode(sn, def); |
||||
} |
||||
repaint(); |
||||
} |
||||
|
||||
public void addMatParam(String type, String name, Point point) { |
||||
String fixedType = type; |
||||
if (type.equals("Color")) { |
||||
fixedType = "Vector4"; |
||||
} |
||||
ShaderNodeVariable param = new ShaderNodeVariable(VarType.valueOf(fixedType).getGlslType(), name); |
||||
NodePanel np = new NodePanel(param, NodePanel.NodeType.MatParam); |
||||
addNode(np); |
||||
np.setLocation(point.x, point.y); |
||||
np.revalidate(); |
||||
repaint(); |
||||
getEditorParent().notifyAddMapParam(type, name); |
||||
} |
||||
|
||||
public void addWorldParam(UniformBinding binding, Point point) { |
||||
|
||||
ShaderNodeVariable param = new ShaderNodeVariable(binding.getGlslType(), binding.name()); |
||||
NodePanel np = new NodePanel(param, NodePanel.NodeType.WorldParam); |
||||
addNode(np); |
||||
np.setLocation(point.x, point.y); |
||||
np.revalidate(); |
||||
repaint(); |
||||
getEditorParent().notifyAddWorldParam(binding.name()); |
||||
} |
||||
|
||||
public void addAttribute(String name, String type, Point point) { |
||||
ShaderNodeVariable param = new ShaderNodeVariable(type, "Attr", name); |
||||
NodePanel np = new NodePanel(param, NodePanel.NodeType.Attribute); |
||||
addNode(np); |
||||
np.setLocation(point.x, point.y); |
||||
np.revalidate(); |
||||
repaint(); |
||||
} |
||||
|
||||
protected void removeSelectedNode() { |
||||
if (selectedItem instanceof NodePanel) { |
||||
int result = JOptionPane.showConfirmDialog(null, "Delete this node and all its mappings?", "Delete Shader Node", JOptionPane.OK_CANCEL_OPTION); |
||||
if (result == JOptionPane.OK_OPTION) { |
||||
NodePanel selectedNode = (NodePanel) selectedItem; |
||||
nodes.remove(selectedNode); |
||||
for (Iterator<Connection> it = connections.iterator(); it.hasNext();) { |
||||
Connection conn = it.next(); |
||||
if (conn.start.getNode() == selectedNode || conn.end.getNode() == selectedNode) { |
||||
it.remove(); |
||||
conn.end.disconnect(); |
||||
conn.start.disconnect(); |
||||
remove(conn); |
||||
} |
||||
} |
||||
|
||||
remove(selectedNode); |
||||
selectedItem = null; |
||||
repaint(); |
||||
parent.notifyRemoveNode(selectedNode); |
||||
} |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void mouseDragged(MouseEvent e) { |
||||
if (draggedFrom == null) { |
||||
if (selectedItem instanceof OutBusPanel) { |
||||
OutBusPanel bus = (OutBusPanel) selectedItem; |
||||
MouseEvent me = SwingUtilities.convertMouseEvent(this, e, bus); |
||||
bus.dispatchEvent(me); |
||||
} |
||||
} |
||||
} |
||||
|
||||
protected void draggingDot(MouseEvent e) { |
||||
for (OutBusPanel outBusPanel : outBuses) { |
||||
Point p = SwingUtilities.convertPoint(this, e.getX(), e.getY(), outBusPanel); |
||||
if (outBusPanel.contains(p)) { |
||||
MouseEvent me = SwingUtilities.convertMouseEvent(this, e, outBusPanel); |
||||
outBusPanel.draggingDot(me); |
||||
if (me.isConsumed()) { |
||||
return; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
public Connection connect(Dot start, Dot end) { |
||||
Connection conn = new Connection(start, end); |
||||
start.connect(conn); |
||||
end.connect(conn); |
||||
|
||||
|
||||
addConnection(conn); |
||||
|
||||
return conn; |
||||
} |
||||
|
||||
public NodePanel getNodePanel(String key) { |
||||
for (NodePanel nodePanel : nodes) { |
||||
if (nodePanel.getKey().equals(key)) { |
||||
return nodePanel; |
||||
} |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
public OutBusPanel getOutBusPanel(String key) { |
||||
for (OutBusPanel out : outBuses) { |
||||
if (out.getKey().equals(key)) { |
||||
return out; |
||||
} |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
/** |
||||
* selection from the editor. Select the item and notify the topComponent |
||||
* |
||||
* @param selectable |
||||
*/ |
||||
public void select(Selectable selectable) { |
||||
parent.selectionChanged(doSelect(selectable)); |
||||
} |
||||
|
||||
/** |
||||
* do select the item and repaint the diagram |
||||
* |
||||
* @param selectable |
||||
* @return |
||||
*/ |
||||
private Selectable doSelect(Selectable selectable) { |
||||
this.selectedItem = selectable; |
||||
if (selectable instanceof Component) { |
||||
((Component) selectable).requestFocusInWindow(); |
||||
} |
||||
repaint(); |
||||
return selectable; |
||||
} |
||||
|
||||
/** |
||||
* find the item with the given key and select it without notifying the |
||||
* topComponent |
||||
* |
||||
* @param key |
||||
* @return |
||||
*/ |
||||
public Selectable select(String key) { |
||||
|
||||
for (NodePanel nodePanel : nodes) { |
||||
if (nodePanel.getKey().equals(key)) { |
||||
return doSelect(nodePanel); |
||||
} |
||||
} |
||||
|
||||
for (Connection connection : connections) { |
||||
if (connection.getKey().equals(key)) { |
||||
return doSelect(connection); |
||||
} |
||||
} |
||||
|
||||
for (OutBusPanel outBusPanel : outBuses) { |
||||
if (outBusPanel.getKey().equals(key)) { |
||||
return doSelect(outBusPanel); |
||||
} |
||||
} |
||||
return doSelect(null); |
||||
} |
||||
|
||||
@Override |
||||
public void mouseMoved(MouseEvent e) { |
||||
dispatchToOutBuses(e); |
||||
} |
||||
|
||||
private JMenuItem createMenuItem(String text, Icon icon) { |
||||
JMenuItem item = new JMenuItem(text, icon); |
||||
item.setFont(new Font("Tahoma", 1, 10)); // NOI18N
|
||||
return item; |
||||
} |
||||
|
||||
private void createPopupMenu() { |
||||
contextMenu.setFont(new Font("Tahoma", 1, 10)); // NOI18N
|
||||
contextMenu.setOpaque(true); |
||||
Border titleUnderline = BorderFactory.createMatteBorder(1, 0, 0, 0, Color.BLACK); |
||||
TitledBorder labelBorder = BorderFactory.createTitledBorder( |
||||
titleUnderline, contextMenu.getLabel(), |
||||
TitledBorder.LEADING, TitledBorder.ABOVE_TOP, contextMenu.getFont(), Color.BLACK); |
||||
|
||||
contextMenu.setBorder(BorderFactory.createLineBorder(Color.BLACK)); |
||||
contextMenu.setBorder(BorderFactory.createCompoundBorder(contextMenu.getBorder(), |
||||
labelBorder)); |
||||
|
||||
|
||||
JMenuItem nodeItem = createMenuItem("Node", Icons.node); |
||||
nodeItem.addActionListener(new ActionListener() { |
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
AddNodeDialog d = new AddNodeDialog(null, true, parent.obj.getLookup().lookup(ProjectAssetManager.class), Diagram.this, clickLoc); |
||||
d.setLocationRelativeTo(null); |
||||
d.setVisible(true); |
||||
} |
||||
}); |
||||
|
||||
contextMenu.add(nodeItem); |
||||
contextMenu.add(createSeparator()); |
||||
JMenuItem matParamItem = createMenuItem("Material Parameter", Icons.mat); |
||||
matParamItem.addActionListener(new ActionListener() { |
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
AddMaterialParameterDialog d = new AddMaterialParameterDialog(null, true, Diagram.this, clickLoc); |
||||
d.setLocationRelativeTo(null); |
||||
d.setVisible(true); |
||||
} |
||||
}); |
||||
contextMenu.add(matParamItem); |
||||
JMenuItem worldParamItem = createMenuItem("World Parameter", Icons.world); |
||||
worldParamItem.addActionListener(new ActionListener() { |
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
AddWorldParameterDialog d = new AddWorldParameterDialog(null, true, Diagram.this, clickLoc); |
||||
d.setLocationRelativeTo(null); |
||||
d.setVisible(true); |
||||
} |
||||
}); |
||||
contextMenu.add(worldParamItem); |
||||
JMenuItem attributeItem = createMenuItem("Attribute", Icons.attrib); |
||||
attributeItem.addActionListener(new ActionListener() { |
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
AddAttributeDialog d = new AddAttributeDialog(null, true, Diagram.this, clickLoc); |
||||
d.setLocationRelativeTo(null); |
||||
d.setVisible(true); |
||||
} |
||||
}); |
||||
contextMenu.add(attributeItem); |
||||
contextMenu.add(createSeparator()); |
||||
JMenuItem outputItem = createMenuItem("Output color", Icons.output); |
||||
contextMenu.add(outputItem); |
||||
outputItem.addActionListener(new ActionListener() { |
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
OutBusPanel p2 = new OutBusPanel("color" + (outBuses.size() - 1), Shader.ShaderType.Fragment); |
||||
p2.setBounds(0, 350 + 50 * (outBuses.size() - 1), p2.getWidth(), p2.getHeight()); |
||||
|
||||
addOutBus(p2); |
||||
|
||||
} |
||||
}); |
||||
} |
||||
|
||||
private JSeparator createSeparator() { |
||||
JSeparator jsep = new JSeparator(JSeparator.HORIZONTAL); |
||||
jsep.setBackground(Color.BLACK); |
||||
return jsep; |
||||
} |
||||
|
||||
private void dispatchToOutBuses(MouseEvent e) { |
||||
for (OutBusPanel outBusPanel : outBuses) { |
||||
Point p = SwingUtilities.convertPoint(this, e.getX(), e.getY(), outBusPanel); |
||||
if (outBusPanel.contains(p)) { |
||||
MouseEvent me = SwingUtilities.convertMouseEvent(this, e, outBusPanel); |
||||
outBusPanel.dispatchEvent(me); |
||||
if (me.isConsumed()) { |
||||
return; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
private void removeConnection(Connection selectedConnection) { |
||||
connections.remove(selectedConnection); |
||||
selectedConnection.end.disconnect(); |
||||
selectedConnection.start.disconnect(); |
||||
remove(selectedConnection); |
||||
} |
||||
|
||||
private class MyMenu extends JPopupMenu { |
||||
|
||||
public MyMenu(String label) { |
||||
super(label); |
||||
} |
||||
|
||||
@Override |
||||
protected void paintComponent(Graphics g) { |
||||
//Color c1 = new Color(100, 100, 100, 255);
|
||||
Color bg = new Color(175, 175, 175); |
||||
g.setColor(bg); |
||||
g.fillRect(0, 0, getWidth(), getHeight()); |
||||
} |
||||
} |
||||
|
||||
public void fixSize() { |
||||
int maxWidth = minWidth; |
||||
int maxHeight = minHeight; |
||||
|
||||
for (NodePanel nodePanel : nodes) { |
||||
int w = nodePanel.getLocation().x + nodePanel.getWidth() + 150; |
||||
if (w > maxWidth) { |
||||
maxWidth = w; |
||||
} |
||||
int h = nodePanel.getLocation().y + nodePanel.getHeight(); |
||||
if (h > maxHeight) { |
||||
maxHeight = h; |
||||
} |
||||
} |
||||
for (OutBusPanel outBusPanel : outBuses) { |
||||
int h = outBusPanel.getLocation().y + outBusPanel.getHeight(); |
||||
if (h > maxHeight) { |
||||
maxHeight = h; |
||||
} |
||||
} |
||||
setPreferredSize(new Dimension(maxWidth, maxHeight)); |
||||
revalidate(); |
||||
} |
||||
int minWidth = 0; |
||||
int minHeight = 0; |
||||
|
||||
public void componentResized(ComponentEvent e) { |
||||
minWidth = e.getComponent().getWidth() - 2; |
||||
minHeight = e.getComponent().getHeight() - 2; |
||||
fixSize(); |
||||
} |
||||
|
||||
public void componentMoved(ComponentEvent e) { |
||||
} |
||||
|
||||
public void componentShown(ComponentEvent e) { |
||||
} |
||||
|
||||
public void componentHidden(ComponentEvent e) { |
||||
} |
||||
|
||||
public void setParent(MatDefEditorlElement parent) { |
||||
this.parent = parent; |
||||
} |
||||
|
||||
public void setCurrentTechniqueName(String currentTechniqueName) { |
||||
this.currentTechniqueName = currentTechniqueName; |
||||
} |
||||
|
||||
public String getCurrentTechniqueName() { |
||||
return currentTechniqueName; |
||||
} |
||||
} |
@ -0,0 +1,262 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.editor; |
||||
|
||||
import com.jme3.gde.materialdefinition.icons.Icons; |
||||
import com.jme3.shader.ShaderUtils; |
||||
import java.awt.Component; |
||||
import java.awt.Dimension; |
||||
import java.awt.Graphics; |
||||
import java.awt.Point; |
||||
import java.awt.event.MouseEvent; |
||||
import javax.swing.ImageIcon; |
||||
import javax.swing.JPanel; |
||||
import javax.swing.SwingUtilities; |
||||
import javax.swing.event.MouseInputListener; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public class Dot extends JPanel implements MouseInputListener { |
||||
|
||||
public static boolean pressed = false; |
||||
protected ImageIcon img; |
||||
protected ImageIcon prevImg; |
||||
private String type; |
||||
private ParamType paramType; |
||||
private String text = ""; |
||||
private DraggablePanel node; |
||||
private int index = 1; |
||||
|
||||
public String getText() { |
||||
return text; |
||||
} |
||||
|
||||
public void setText(String text) { |
||||
this.text = text; |
||||
} |
||||
|
||||
public enum ParamType { |
||||
|
||||
Input, |
||||
Output, |
||||
Both |
||||
} |
||||
|
||||
public Dot() { |
||||
super(); |
||||
setMaximumSize(new Dimension(10, 10)); |
||||
setMinimumSize(new Dimension(10, 10)); |
||||
setPreferredSize(new Dimension(10, 10)); |
||||
setSize(10, 10); |
||||
addMouseMotionListener(this); |
||||
addMouseListener(this); |
||||
} |
||||
|
||||
@Override |
||||
protected void paintComponent(Graphics g) { |
||||
if (img == null) { |
||||
|
||||
img = Icons.imgGrey; |
||||
} |
||||
g.drawImage(img.getImage(), 0, 0, this); |
||||
} |
||||
|
||||
@Override |
||||
public void mouseClicked(MouseEvent e) { |
||||
} |
||||
|
||||
@Override |
||||
public void mousePressed(MouseEvent e) { |
||||
prevImg = img; |
||||
img = Icons.imgOrange; |
||||
Diagram diag = getDiagram(); |
||||
diag.draggedFrom = this; |
||||
repaint(); |
||||
e.consume(); |
||||
} |
||||
|
||||
@Override |
||||
public void repaint() { |
||||
if (getNode() != null) { |
||||
getDiagram().repaint(); |
||||
} else { |
||||
super.repaint(); |
||||
} |
||||
} |
||||
|
||||
public Diagram getDiagram() { |
||||
return node.getDiagram(); |
||||
} |
||||
|
||||
public DraggablePanel getNode() { |
||||
return node; |
||||
} |
||||
|
||||
public void setNode(DraggablePanel node) { |
||||
this.node = node; |
||||
} |
||||
|
||||
@Override |
||||
public void mouseReleased(MouseEvent e) { |
||||
Diagram diag = getDiagram(); |
||||
if (diag.draggedFrom == this && diag.draggedTo != null) { |
||||
if (this.canConnect(diag.draggedTo)) { |
||||
diag.notifyMappingCreation(diag.connect(this, diag.draggedTo)); |
||||
|
||||
} else { |
||||
diag.draggedTo.reset(); |
||||
this.reset(); |
||||
} |
||||
diag.draggedFrom = null; |
||||
diag.draggedTo = null; |
||||
} else { |
||||
reset(); |
||||
diag.draggedFrom = null; |
||||
} |
||||
e.consume(); |
||||
} |
||||
|
||||
public void reset() { |
||||
img = prevImg; |
||||
repaint(); |
||||
} |
||||
|
||||
public void disconnect() { |
||||
img = Icons.imgGrey; |
||||
repaint(); |
||||
} |
||||
|
||||
@Override |
||||
public void mouseEntered(MouseEvent e) { |
||||
Diagram diag = getDiagram(); |
||||
if (diag.draggedFrom != null && diag.draggedFrom != this) { |
||||
prevImg = img; |
||||
canConnect(diag.draggedFrom); |
||||
diag.draggedTo = this; |
||||
diag.draggedFrom.canConnect(this); |
||||
} |
||||
|
||||
} |
||||
|
||||
public boolean canConnect(Dot pair) { |
||||
if (pair == null) { |
||||
img = Icons.imgOrange; |
||||
repaint(); |
||||
return false; |
||||
} |
||||
|
||||
|
||||
|
||||
if (matches(pair.getType(), type) && (pair.getParamType() != paramType |
||||
|| pair.getParamType() == ParamType.Both |
||||
|| paramType == ParamType.Both) |
||||
|| ShaderUtils.isSwizzlable(pair.getType()) && ShaderUtils.isSwizzlable(type)) { |
||||
img = Icons.imgGreen; |
||||
repaint(); |
||||
return true; |
||||
} |
||||
|
||||
|
||||
img = Icons.imgRed; |
||||
repaint(); |
||||
return false; |
||||
} |
||||
|
||||
private boolean matches(String type1, String type2) { |
||||
String[] s1 = type1.split("\\|"); |
||||
String[] s2 = type2.split("\\|"); |
||||
for (String string : s1) { |
||||
for (String string1 : s2) { |
||||
if (string.equals(string1)) { |
||||
return true; |
||||
} |
||||
} |
||||
} |
||||
return false; |
||||
|
||||
} |
||||
|
||||
protected void connect(Connection connection) { |
||||
img = Icons.imgGreen; |
||||
getNode().addComponentListener(connection); |
||||
repaint(); |
||||
} |
||||
|
||||
@Override |
||||
public void mouseExited(MouseEvent e) { |
||||
Diagram diag = getDiagram(); |
||||
if (diag.draggedFrom != null) { |
||||
diag.draggedFrom.canConnect(null); |
||||
if (diag.draggedFrom != this) { |
||||
reset(); |
||||
} |
||||
if (diag.draggedTo == this) { |
||||
diag.draggedTo = null; |
||||
} |
||||
} |
||||
} |
||||
|
||||
public Point getStartLocation() { |
||||
Point p = getLocation(); |
||||
Component parent = getParent(); |
||||
while (parent != getNode()) { |
||||
p.x += parent.getLocation().x; |
||||
p.y += parent.getLocation().y; |
||||
parent = parent.getParent(); |
||||
} |
||||
p.x += 10 + getNode().getLocation().x; |
||||
p.y += 5 + getNode().getLocation().y; |
||||
return p; |
||||
} |
||||
|
||||
public Point getEndLocation() { |
||||
Point p = getLocation(); |
||||
Component parent = getParent(); |
||||
while (parent != getNode()) { |
||||
p.x += parent.getLocation().x; |
||||
p.y += parent.getLocation().y; |
||||
parent = parent.getParent(); |
||||
} |
||||
p.x += getNode().getLocation().x + 2; |
||||
p.y += 5 + getNode().getLocation().y; |
||||
return p; |
||||
} |
||||
|
||||
@Override |
||||
public void mouseDragged(MouseEvent e) { |
||||
MouseEvent me = SwingUtilities.convertMouseEvent(this, e, getDiagram()); |
||||
getDiagram().draggingDot(me); |
||||
} |
||||
|
||||
@Override |
||||
public void mouseMoved(MouseEvent e) { |
||||
} |
||||
|
||||
public String getType() { |
||||
return type; |
||||
} |
||||
|
||||
public void setType(String type) { |
||||
this.type = type; |
||||
} |
||||
|
||||
public ParamType getParamType() { |
||||
return paramType; |
||||
} |
||||
|
||||
public void setParamType(ParamType paramType) { |
||||
this.paramType = paramType; |
||||
} |
||||
|
||||
public int getIndex() { |
||||
return index; |
||||
} |
||||
|
||||
public void setIndex(int index) { |
||||
this.index = index; |
||||
} |
||||
} |
@ -0,0 +1,82 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.editor; |
||||
|
||||
import java.awt.event.MouseEvent; |
||||
import java.awt.event.MouseListener; |
||||
import java.awt.event.MouseMotionListener; |
||||
import javax.swing.JPanel; |
||||
|
||||
/** |
||||
* |
||||
* @author m327836 |
||||
*/ |
||||
public class DraggablePanel extends JPanel implements MouseListener, MouseMotionListener { |
||||
|
||||
protected int svdx, svdy, svdex, svdey; |
||||
private boolean vertical = false; |
||||
protected Diagram diagram; |
||||
|
||||
|
||||
public DraggablePanel(boolean vertical) { |
||||
this(); |
||||
this.vertical = vertical; |
||||
} |
||||
|
||||
public DraggablePanel() { |
||||
addMouseListener(this); |
||||
addMouseMotionListener(this); |
||||
} |
||||
|
||||
@Override |
||||
public void mouseClicked(MouseEvent e) { |
||||
} |
||||
|
||||
@Override |
||||
public void mousePressed(MouseEvent e) { |
||||
svdx = getLocation().x; |
||||
if (!vertical) { |
||||
svdex = e.getXOnScreen(); |
||||
} |
||||
svdy = getLocation().y; |
||||
svdey = e.getYOnScreen(); |
||||
e.consume(); |
||||
} |
||||
|
||||
@Override |
||||
public void mouseReleased(MouseEvent e) { |
||||
} |
||||
|
||||
@Override |
||||
public void mouseEntered(MouseEvent e) { |
||||
} |
||||
|
||||
@Override |
||||
public void mouseExited(MouseEvent e) { |
||||
} |
||||
|
||||
@Override |
||||
public void mouseMoved(MouseEvent e) { |
||||
} |
||||
|
||||
@Override |
||||
public void mouseDragged(MouseEvent e) { |
||||
int xoffset = 0; |
||||
if (!vertical) { |
||||
xoffset = e.getLocationOnScreen().x - svdex; |
||||
} |
||||
int yoffset = e.getLocationOnScreen().y - svdey; |
||||
setLocation(Math.max(0, svdx + xoffset), Math.max(0,svdy + yoffset)); |
||||
e.consume(); |
||||
} |
||||
|
||||
public Diagram getDiagram() { |
||||
return diagram; |
||||
} |
||||
|
||||
public void setDiagram(Diagram diagram) { |
||||
this.diagram = diagram; |
||||
} |
||||
} |
@ -0,0 +1,25 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.editor; |
||||
|
||||
import com.jme3.gde.materialdefinition.fileStructure.leaves.InputMappingBlock; |
||||
import com.jme3.gde.materialdefinition.fileStructure.leaves.OutputMappingBlock; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public interface InOut { |
||||
|
||||
public String getName(); |
||||
|
||||
public void addInputMapping(InputMappingBlock block); |
||||
|
||||
public void removeInputMapping(InputMappingBlock block); |
||||
|
||||
public void addOutputMapping(OutputMappingBlock block); |
||||
|
||||
public void removeOutputMapping(OutputMappingBlock block); |
||||
} |
@ -0,0 +1,56 @@ |
||||
<?xml version="1.0" encoding="UTF-8" ?> |
||||
|
||||
<Form version="1.4" maxVersion="1.8" type="org.netbeans.modules.form.forminfo.JPanelFormInfo"> |
||||
<AuxValues> |
||||
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/> |
||||
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/> |
||||
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/> |
||||
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/> |
||||
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/> |
||||
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/> |
||||
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/> |
||||
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/> |
||||
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/> |
||||
</AuxValues> |
||||
|
||||
<Layout> |
||||
<DimensionLayout dim="0"> |
||||
<Group type="103" groupAlignment="0" attributes="0"> |
||||
<Component id="jScrollPane1" alignment="0" max="32767" attributes="0"/> |
||||
</Group> |
||||
</DimensionLayout> |
||||
<DimensionLayout dim="1"> |
||||
<Group type="103" groupAlignment="0" attributes="0"> |
||||
<Component id="jScrollPane1" alignment="0" max="32767" attributes="0"/> |
||||
</Group> |
||||
</DimensionLayout> |
||||
</Layout> |
||||
<SubComponents> |
||||
<Container class="javax.swing.JScrollPane" name="jScrollPane1"> |
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/> |
||||
<SubComponents> |
||||
<Container class="com.jme3.gde.materialdefinition.editor.Diagram" name="diagram1"> |
||||
<Properties> |
||||
<Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor"> |
||||
<Color blue="99" green="99" red="99" type="rgb"/> |
||||
</Property> |
||||
</Properties> |
||||
|
||||
<Layout> |
||||
<DimensionLayout dim="0"> |
||||
<Group type="103" groupAlignment="0" attributes="0"> |
||||
<EmptySpace min="0" pref="398" max="32767" attributes="0"/> |
||||
</Group> |
||||
</DimensionLayout> |
||||
<DimensionLayout dim="1"> |
||||
<Group type="103" groupAlignment="0" attributes="0"> |
||||
<EmptySpace min="0" pref="298" max="32767" attributes="0"/> |
||||
</Group> |
||||
</DimensionLayout> |
||||
</Layout> |
||||
</Container> |
||||
</SubComponents> |
||||
</Container> |
||||
</SubComponents> |
||||
</Form> |
@ -0,0 +1,566 @@ |
||||
/* |
||||
* 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.materialdefinition.editor; |
||||
|
||||
import com.jme3.gde.core.assets.ProjectAssetManager; |
||||
import com.jme3.gde.materialdefinition.EditableMatDefFile; |
||||
import com.jme3.gde.materialdefinition.MatDefDataObject; |
||||
import com.jme3.gde.materialdefinition.MatDefMetaData; |
||||
import com.jme3.gde.materialdefinition.fileStructure.MatDefBlock; |
||||
import com.jme3.gde.materialdefinition.fileStructure.ShaderNodeBlock; |
||||
import com.jme3.gde.materialdefinition.fileStructure.TechniqueBlock; |
||||
import com.jme3.gde.materialdefinition.fileStructure.leaves.InputMappingBlock; |
||||
import com.jme3.gde.materialdefinition.fileStructure.leaves.MappingBlock; |
||||
import com.jme3.gde.materialdefinition.fileStructure.leaves.MatParamBlock; |
||||
import com.jme3.gde.materialdefinition.fileStructure.leaves.OutputMappingBlock; |
||||
import com.jme3.gde.materialdefinition.fileStructure.leaves.WorldParamBlock; |
||||
import com.jme3.gde.materialdefinition.navigator.MatDefNavigatorPanel; |
||||
import com.jme3.gde.materialdefinition.utils.MaterialUtils; |
||||
import com.jme3.material.Material; |
||||
import com.jme3.shader.Shader; |
||||
import com.jme3.shader.ShaderNodeDefinition; |
||||
import com.jme3.shader.ShaderNodeVariable; |
||||
import com.jme3.shader.ShaderUtils; |
||||
import java.awt.Dimension; |
||||
import java.awt.Point; |
||||
import java.beans.PropertyVetoException; |
||||
import java.util.ArrayList; |
||||
import java.util.Collection; |
||||
import java.util.List; |
||||
import javax.swing.Action; |
||||
import javax.swing.JComponent; |
||||
import javax.swing.JPanel; |
||||
import javax.swing.JToolBar; |
||||
import org.netbeans.core.spi.multiview.CloseOperationState; |
||||
import org.netbeans.core.spi.multiview.MultiViewElement; |
||||
import org.netbeans.core.spi.multiview.MultiViewElementCallback; |
||||
import org.openide.awt.UndoRedo; |
||||
import org.openide.nodes.Children; |
||||
import org.openide.nodes.Node; |
||||
import org.openide.util.Exceptions; |
||||
import org.openide.util.Lookup; |
||||
import org.openide.util.LookupEvent; |
||||
import org.openide.util.LookupListener; |
||||
import org.openide.util.NbBundle.Messages; |
||||
import org.openide.util.lookup.InstanceContent; |
||||
import org.openide.windows.TopComponent; |
||||
|
||||
@MultiViewElement.Registration( |
||||
displayName = "#LBL_MatDef_EDITOR", |
||||
iconBase = "com/jme3/gde/materialdefinition/icons/matdef.png", |
||||
mimeType = "text/jme-materialdefinition", |
||||
persistenceType = TopComponent.PERSISTENCE_ONLY_OPENED, |
||||
preferredID = "MatDefVisual", |
||||
position = 2000) |
||||
@Messages("LBL_MatDef_EDITOR=Editor") |
||||
public final class MatDefEditorlElement extends JPanel implements MultiViewElement { |
||||
|
||||
protected MatDefDataObject obj; |
||||
private JToolBar toolbar = new JToolBar(); |
||||
private transient MultiViewElementCallback callback; |
||||
InstanceContent content; |
||||
Selectable prevNode; |
||||
MatDefMetaData metaData; |
||||
|
||||
public MatDefEditorlElement(Lookup lkp) { |
||||
obj = lkp.lookup(MatDefDataObject.class); |
||||
metaData = lkp.lookup(MatDefMetaData.class); |
||||
assert obj != null; |
||||
EditableMatDefFile file = obj.getEditableFile(); |
||||
initComponents(); |
||||
diagram1.setParent(this); |
||||
|
||||
Material mat = lkp.lookup(Material.class); |
||||
|
||||
ProjectAssetManager manager = obj.getLookup().lookup(ProjectAssetManager.class); |
||||
final MatDefBlock matDef = obj.getLookup().lookup(MatDefBlock.class); |
||||
TechniqueBlock technique = getTechnique(matDef); |
||||
|
||||
diagram1.setCurrentTechniqueName(technique.getName()); |
||||
|
||||
List<ShaderNodeVariable> vertexGlobals = new ArrayList<ShaderNodeVariable>(); |
||||
List<ShaderNodeVariable> fragmentGlobals = new ArrayList<ShaderNodeVariable>(); |
||||
List<ShaderNodeVariable> attributes = new ArrayList<ShaderNodeVariable>(); |
||||
List<ShaderNodeVariable> uniforms = new ArrayList<ShaderNodeVariable>(); |
||||
initData(technique, manager, vertexGlobals, fragmentGlobals, attributes, matDef, uniforms); |
||||
|
||||
int i = 0; |
||||
for (ShaderNodeBlock sn : technique.getShaderNodes()) { |
||||
ShaderNodeDefinition def = MaterialUtils.loadShaderNodeDefinition(sn, manager); |
||||
NodePanel np = new NodePanel(sn, def); |
||||
diagram1.addNode(np); |
||||
Point position = getPositionFromMetaData(np.getKey(), 150 * i + 20, 190); |
||||
np.setLocation(position); |
||||
sn.setSpatialOrder(np.getLocation().x); |
||||
i++; |
||||
} |
||||
// TechniqueDef tech = def.getDefaultTechniques().get(0);
|
||||
for (ShaderNodeVariable shaderNodeVariable : vertexGlobals) { |
||||
OutBusPanel out = new OutBusPanel(shaderNodeVariable.getName(), Shader.ShaderType.Vertex); |
||||
diagram1.addOutBus(out); |
||||
Point position = getPositionFromMetaData(out.getKey(), 0, 125); |
||||
out.setLocation(position); |
||||
} |
||||
|
||||
i = 2; |
||||
for (ShaderNodeVariable var : fragmentGlobals) { |
||||
OutBusPanel out2 = new OutBusPanel(var.getName(), Shader.ShaderType.Fragment); |
||||
diagram1.addOutBus(out2); |
||||
Point position = getPositionFromMetaData(out2.getKey(), 0, 150 * i + 190); |
||||
out2.setLocation(position); |
||||
i++; |
||||
} |
||||
i = 0; |
||||
for (ShaderNodeVariable shaderNodeVariable : attributes) { |
||||
NodePanel np = diagram1.getNodePanel(shaderNodeVariable.getNameSpace() + "." + shaderNodeVariable.getName()); |
||||
if (np == null) { |
||||
np = new NodePanel(shaderNodeVariable, NodePanel.NodeType.Attribute); |
||||
diagram1.addNode(np); |
||||
Point position = getPositionFromMetaData(np.getKey(), 150 * i + 20, 5); |
||||
np.setLocation(position); |
||||
i++; |
||||
} |
||||
} |
||||
i = 0; |
||||
for (ShaderNodeVariable shaderNodeVariable : uniforms) { |
||||
NodePanel np = diagram1.getNodePanel(shaderNodeVariable.getNameSpace() + "." + shaderNodeVariable.getName()); |
||||
if (np == null) { |
||||
np = new NodePanel(shaderNodeVariable, shaderNodeVariable.getNameSpace().equals("MatParam") ? NodePanel.NodeType.MatParam : NodePanel.NodeType.WorldParam); |
||||
diagram1.addNode(np); |
||||
Point position = getPositionFromMetaData(np.getKey(), 150 * i + 20, 65); |
||||
np.setLocation(position); |
||||
|
||||
i++; |
||||
} |
||||
} |
||||
|
||||
for (ShaderNodeBlock sn : technique.getShaderNodes()) { |
||||
//NodePanel np = diagram1.getNodePanel(sn.getName());
|
||||
List<InputMappingBlock> ins = sn.getInputs(); |
||||
if (ins != null) { |
||||
for (InputMappingBlock mapping : ins) { |
||||
makeConnection(mapping); |
||||
if (!mapping.getRightNameSpace().equals("Global") |
||||
&& !mapping.getRightNameSpace().equals("MatParam") |
||||
&& !mapping.getRightNameSpace().equals("Attribute") |
||||
&& !mapping.getRightNameSpace().equals("WorldParam")) { |
||||
sn.addInputNode(mapping.getRightNameSpace()); |
||||
} else if (mapping.getRightNameSpace().equals("Global")) { |
||||
sn.setGlobalInput(true); |
||||
} |
||||
} |
||||
} |
||||
List<OutputMappingBlock> outs = sn.getOutputs(); |
||||
if (outs != null) { |
||||
for (OutputMappingBlock mapping : outs) { |
||||
makeConnection(mapping); |
||||
if (mapping.getLeftNameSpace().equals("Global")) { |
||||
sn.setGlobalOutput(true); |
||||
} |
||||
} |
||||
} |
||||
|
||||
} |
||||
|
||||
diagram1.setPreferredSize(new Dimension(jScrollPane1.getWidth() - 2, jScrollPane1.getHeight() - 2)); |
||||
diagram1.revalidate(); |
||||
jScrollPane1.addComponentListener(diagram1); |
||||
|
||||
|
||||
diagram1.refreshPreviews(mat); |
||||
final Lookup.Result<Material> resMat = obj.getLookup().lookupResult(Material.class); |
||||
resMat.addLookupListener(new LookupListener() { |
||||
public void resultChanged(LookupEvent ev) { |
||||
Collection<Material> col = (Collection<Material>) resMat.allInstances(); |
||||
if (!col.isEmpty()) { |
||||
Material material = col.iterator().next(); |
||||
diagram1.refreshPreviews(material); |
||||
} |
||||
} |
||||
}); |
||||
|
||||
|
||||
final MatDefNavigatorPanel nav = obj.getLookup().lookup(MatDefNavigatorPanel.class); |
||||
if (nav != null) { |
||||
|
||||
Lookup.Result<Selectable> res = nav.getLookup().lookupResult(Selectable.class); |
||||
res.addLookupListener(new LookupListener() { |
||||
public void resultChanged(LookupEvent ev) { |
||||
Selectable selected = nav.getLookup().lookup(Selectable.class); |
||||
if (selected != null && (prevNode == null || !(selected.getKey().equals(prevNode.getKey())))) { |
||||
prevNode = diagram1.select(selected.getKey()); |
||||
} |
||||
|
||||
} |
||||
}); |
||||
} |
||||
|
||||
|
||||
|
||||
} |
||||
|
||||
@Override |
||||
public String getName() { |
||||
return "MatDefVisualElement"; |
||||
} |
||||
|
||||
protected void selectionChanged(Selectable selectable) { |
||||
MatDefNavigatorPanel nav = obj.getLookup().lookup(MatDefNavigatorPanel.class); |
||||
try { |
||||
Node n = findNode(nav.getExplorerManager().getRootContext(), selectable.getKey()); |
||||
if (n == null) { |
||||
n = nav.getExplorerManager().getRootContext(); |
||||
} |
||||
prevNode = selectable; |
||||
nav.getExplorerManager().setSelectedNodes(new Node[]{n}); |
||||
//FIXME this is hackish, each time it's used it spits a warning in the log.
|
||||
//without this line selecting a node in the editor select it in
|
||||
//the navigator explorer but does not displays its property sheet.
|
||||
//the warning says to manipulate the MultiViewElement lookup, but it just voids the tree view
|
||||
callback.getTopComponent().setActivatedNodes(new Node[]{n}); |
||||
|
||||
} catch (PropertyVetoException ex) { |
||||
Exceptions.printStackTrace(ex); |
||||
} |
||||
} |
||||
|
||||
private Node findNode(Node root, String key) { |
||||
if (root instanceof Selectable) { |
||||
Selectable s = (Selectable) root; |
||||
if (s.getKey().equals(key)) { |
||||
return root; |
||||
} else if (root.getChildren() != Children.LEAF) { |
||||
Node n; |
||||
for (Node node : root.getChildren().getNodes()) { |
||||
n = findNode(node, key); |
||||
if (n != null) { |
||||
return n; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
return null; |
||||
|
||||
} |
||||
|
||||
/** |
||||
* This method is called from within the constructor to initialize the form. |
||||
* WARNING: Do NOT modify this code. The content of this method is always |
||||
* regenerated by the Form Editor. |
||||
*/ |
||||
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
||||
private void initComponents() { |
||||
|
||||
jScrollPane1 = new javax.swing.JScrollPane(); |
||||
diagram1 = new com.jme3.gde.materialdefinition.editor.Diagram(); |
||||
|
||||
diagram1.setBackground(new java.awt.Color(153, 153, 153)); |
||||
|
||||
javax.swing.GroupLayout diagram1Layout = new javax.swing.GroupLayout(diagram1); |
||||
diagram1.setLayout(diagram1Layout); |
||||
diagram1Layout.setHorizontalGroup( |
||||
diagram1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) |
||||
.addGap(0, 398, Short.MAX_VALUE) |
||||
); |
||||
diagram1Layout.setVerticalGroup( |
||||
diagram1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) |
||||
.addGap(0, 298, Short.MAX_VALUE) |
||||
); |
||||
|
||||
jScrollPane1.setViewportView(diagram1); |
||||
|
||||
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); |
||||
this.setLayout(layout); |
||||
layout.setHorizontalGroup( |
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) |
||||
.addComponent(jScrollPane1) |
||||
); |
||||
layout.setVerticalGroup( |
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) |
||||
.addComponent(jScrollPane1) |
||||
); |
||||
}// </editor-fold>//GEN-END:initComponents
|
||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||
private com.jme3.gde.materialdefinition.editor.Diagram diagram1; |
||||
private javax.swing.JScrollPane jScrollPane1; |
||||
// End of variables declaration//GEN-END:variables
|
||||
|
||||
@Override |
||||
public JComponent getVisualRepresentation() { |
||||
return this; |
||||
} |
||||
|
||||
@Override |
||||
public JComponent getToolbarRepresentation() { |
||||
return toolbar; |
||||
} |
||||
|
||||
@Override |
||||
public Action[] getActions() { |
||||
return new Action[0]; |
||||
} |
||||
|
||||
@Override |
||||
public Lookup getLookup() { |
||||
return obj.getLookup(); |
||||
} |
||||
|
||||
@Override |
||||
public void componentOpened() { |
||||
} |
||||
|
||||
@Override |
||||
public void componentClosed() { |
||||
} |
||||
|
||||
@Override |
||||
public void componentShowing() { |
||||
} |
||||
|
||||
@Override |
||||
public void componentHidden() { |
||||
} |
||||
|
||||
@Override |
||||
public void componentActivated() { |
||||
} |
||||
|
||||
@Override |
||||
public void componentDeactivated() { |
||||
} |
||||
|
||||
@Override |
||||
public UndoRedo getUndoRedo() { |
||||
return UndoRedo.NONE; |
||||
} |
||||
|
||||
@Override |
||||
public void setMultiViewCallback(MultiViewElementCallback callback) { |
||||
this.callback = callback; |
||||
} |
||||
|
||||
@Override |
||||
public CloseOperationState canCloseElement() { |
||||
return CloseOperationState.STATE_OK; |
||||
} |
||||
|
||||
protected void makeMapping(Connection conn) { |
||||
InOut startNode = (InOut) conn.start.getNode(); |
||||
InOut endNode = (InOut) conn.end.getNode(); |
||||
String leftVarName = conn.end.getText(); |
||||
String rightVarName = conn.start.getText(); |
||||
String leftVarSwizzle = null; |
||||
String rightVarSwizzle = null; |
||||
|
||||
int endCard = ShaderUtils.getCardinality(conn.end.getType(), ""); |
||||
int startCard = ShaderUtils.getCardinality(conn.start.getType(), ""); |
||||
String swizzle = "xyzw"; |
||||
if (startCard > endCard) { |
||||
rightVarSwizzle = swizzle.substring(0, endCard); |
||||
} else if (endCard > startCard) { |
||||
leftVarSwizzle = swizzle.substring(0, startCard); |
||||
} |
||||
|
||||
if (endNode instanceof OutBusPanel) { |
||||
OutputMappingBlock mapping = new OutputMappingBlock(leftVarName, rightVarName, leftVarSwizzle, rightVarSwizzle, endNode.getName(), startNode.getName(), null); |
||||
startNode.addOutputMapping(mapping); |
||||
conn.makeKey(mapping, diagram1.getCurrentTechniqueName()); |
||||
} else { |
||||
InputMappingBlock mapping = new InputMappingBlock(leftVarName, rightVarName, leftVarSwizzle, rightVarSwizzle, endNode.getName(), startNode.getName(), null); |
||||
endNode.addInputMapping(mapping); |
||||
conn.makeKey(mapping, diagram1.getCurrentTechniqueName()); |
||||
} |
||||
} |
||||
|
||||
protected void notifyRemoveConnection(Connection conn) { |
||||
InOut startNode = (InOut) conn.start.getNode(); |
||||
InOut endNode = (InOut) conn.end.getNode(); |
||||
if (endNode instanceof OutBusPanel) { |
||||
startNode.removeOutputMapping((OutputMappingBlock) conn.mapping); |
||||
} else { |
||||
endNode.removeInputMapping((InputMappingBlock) conn.mapping); |
||||
} |
||||
} |
||||
|
||||
public void notifyAddNode(ShaderNodeBlock node, ShaderNodeDefinition def) { |
||||
MatDefBlock matDef = obj.getLookup().lookup(MatDefBlock.class); |
||||
TechniqueBlock technique = getTechnique(matDef); |
||||
if (def.getType() == Shader.ShaderType.Vertex) { |
||||
technique.addVertexShaderNode(node); |
||||
} else if (def.getType() == Shader.ShaderType.Fragment) { |
||||
technique.addFragmentShaderNode(node); |
||||
} |
||||
} |
||||
|
||||
public void notifyAddMapParam(String type, String name) { |
||||
MatDefBlock matDef = obj.getLookup().lookup(MatDefBlock.class); |
||||
//FIXME add a way to set fixed pipeline function and default value
|
||||
MatParamBlock param = new MatParamBlock(type, name, null, null); |
||||
matDef.addMatParam(param); |
||||
} |
||||
|
||||
public void notifyAddWorldParam(String name) { |
||||
MatDefBlock matDef = obj.getLookup().lookup(MatDefBlock.class); |
||||
//FIXME add a way to set fixed pipeline function and default value
|
||||
WorldParamBlock param = new WorldParamBlock(name); |
||||
getTechnique(matDef).addWorldParam(param); |
||||
} |
||||
|
||||
public void notifyRemoveNode(NodePanel node) { |
||||
MatDefBlock matDef = obj.getLookup().lookup(MatDefBlock.class); |
||||
if (node.getType() == NodePanel.NodeType.Fragment || node.getType() == NodePanel.NodeType.Vertex) { |
||||
TechniqueBlock technique = getTechnique(matDef); |
||||
for (ShaderNodeBlock shaderNodeBlock : technique.getShaderNodes()) { |
||||
if (shaderNodeBlock.getName().equals(node.getName())) { |
||||
technique.removeShaderNode(shaderNodeBlock); |
||||
} |
||||
} |
||||
} else if (node.getType() == NodePanel.NodeType.MatParam) { |
||||
matDef.removeMatParam(new MatParamBlock("", node.getKey().replaceAll("MatParam.", ""), "", "")); |
||||
} else if (node.getType() == NodePanel.NodeType.WorldParam) { |
||||
getTechnique(matDef).removeWorldParam(new WorldParamBlock(node.getKey().replaceAll("WorldParam.", ""))); |
||||
} else if (node.getType() == NodePanel.NodeType.Attribute) { |
||||
getTechnique(matDef).cleanupMappings("Attr", node.getKey().replaceAll("Attr.", "")); |
||||
} |
||||
} |
||||
|
||||
private Dot findConnectPoint(String nameSpace, String name, boolean isInput) { |
||||
|
||||
if (nameSpace.equals("MatParam") |
||||
|| nameSpace.equals("WorldParam") |
||||
|| nameSpace.equals("Attr")) { |
||||
NodePanel np = diagram1.getNodePanel(nameSpace + "." + name); |
||||
return isInput ? np.getInputConnectPoint(name) : np.getOutputConnectPoint(name); |
||||
} else if (nameSpace.equals("Global")) { |
||||
OutBusPanel outBus = diagram1.getOutBusPanel(name); |
||||
return outBus.getConnectPoint(); |
||||
} else { |
||||
NodePanel np = diagram1.getNodePanel(diagram1.getCurrentTechniqueName() + "/" + nameSpace); |
||||
return isInput ? np.getInputConnectPoint(name) : np.getOutputConnectPoint(name); |
||||
} |
||||
} |
||||
|
||||
private void makeConnection(MappingBlock mapping) { |
||||
|
||||
Dot leftDot = findConnectPoint(mapping.getLeftNameSpace(), mapping.getLeftVar(), true); |
||||
Dot rightDot = findConnectPoint(mapping.getRightNameSpace(), mapping.getRightVar(), false); |
||||
Connection conn = diagram1.connect(leftDot, rightDot); |
||||
mapping.addPropertyChangeListener(conn); |
||||
conn.makeKey(mapping, diagram1.getCurrentTechniqueName()); |
||||
} |
||||
|
||||
private void initData(TechniqueBlock technique, ProjectAssetManager manager, List<ShaderNodeVariable> vertexGlobals, List<ShaderNodeVariable> fragmentGlobals, List<ShaderNodeVariable> attributes, MatDefBlock matDef, List<ShaderNodeVariable> uniforms) { |
||||
for (ShaderNodeBlock sn : technique.getShaderNodes()) { |
||||
ShaderNodeDefinition def = MaterialUtils.loadShaderNodeDefinition(sn, manager); |
||||
List<InputMappingBlock> in = sn.getInputs(); |
||||
if (in != null) { |
||||
for (InputMappingBlock map : in) { |
||||
ShaderNodeVariable var = new ShaderNodeVariable("", map.getRightNameSpace(), map.getRightVar()); |
||||
if (var.getNameSpace().equals("Global")) { |
||||
var.setType("vec4"); |
||||
if (def.getType() == Shader.ShaderType.Vertex) { |
||||
if (!MaterialUtils.contains(vertexGlobals, var)) { |
||||
vertexGlobals.add(var); |
||||
} |
||||
} else { |
||||
if (!MaterialUtils.contains(fragmentGlobals, var)) { |
||||
fragmentGlobals.add(var); |
||||
} |
||||
} |
||||
} else if (var.getNameSpace().equals("Attr")) { |
||||
ShaderNodeVariable left = MaterialUtils.getVar(def.getInputs(), map.getLeftVar()); |
||||
var.setType(MaterialUtils.guessType(map, left)); |
||||
attributes.add(var); |
||||
} |
||||
} |
||||
} |
||||
List<OutputMappingBlock> out = sn.getOutputs(); |
||||
if (out != null) { |
||||
for (OutputMappingBlock map : out) { |
||||
ShaderNodeVariable var = new ShaderNodeVariable("", map.getLeftNameSpace(), map.getLeftVar()); |
||||
if (var.getNameSpace().equals("Global")) { |
||||
var.setType("vec4"); |
||||
if (def.getType() == Shader.ShaderType.Vertex) { |
||||
if (!MaterialUtils.contains(vertexGlobals, var)) { |
||||
vertexGlobals.add(var); |
||||
} |
||||
} else { |
||||
if (!MaterialUtils.contains(fragmentGlobals, var)) { |
||||
fragmentGlobals.add(var); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
} |
||||
|
||||
|
||||
for (WorldParamBlock worldParamBlock : technique.getWorldParams()) { |
||||
ShaderNodeVariable var = new ShaderNodeVariable("", "WorldParam", worldParamBlock.getName()); |
||||
var.setType(MaterialUtils.getWorldParamType(var.getName())); |
||||
uniforms.add(var); |
||||
} |
||||
|
||||
for (MatParamBlock matParamBlock : matDef.getMatParams()) { |
||||
ShaderNodeVariable var = new ShaderNodeVariable("", "MatParam", matParamBlock.getName()); |
||||
var.setType(MaterialUtils.getMatParamType(matParamBlock)); |
||||
uniforms.add(var); |
||||
} |
||||
|
||||
} |
||||
|
||||
private TechniqueBlock getTechnique(MatDefBlock matDef) { |
||||
TechniqueBlock technique = matDef.getTechniques().get(0); |
||||
|
||||
return technique; |
||||
} |
||||
|
||||
protected Point getPositionFromMetaData(String key, int defaultx, int defaulty) throws NumberFormatException { |
||||
Point position = new Point(); |
||||
String pos = metaData.getProperty(diagram1.getCurrentTechniqueName() + "/" + key, defaultx + "," + defaulty); |
||||
|
||||
if (pos != null) { |
||||
String[] s = pos.split(","); |
||||
position.x = Integer.parseInt(s[0]); |
||||
position.y = Integer.parseInt(s[1]); |
||||
} |
||||
return position; |
||||
} |
||||
|
||||
protected void savePositionToMetaData(String key, int x, int y) throws NumberFormatException { |
||||
|
||||
metaData.setProperty(diagram1.getCurrentTechniqueName() + "/" + key, x + "," + y); |
||||
|
||||
} |
||||
} |
@ -0,0 +1,277 @@ |
||||
<?xml version="1.0" encoding="UTF-8" ?> |
||||
|
||||
<Form version="1.3" maxVersion="1.8" type="org.netbeans.modules.form.forminfo.JPanelFormInfo"> |
||||
<Properties> |
||||
<Property name="opaque" type="boolean" value="false"/> |
||||
</Properties> |
||||
<AuxValues> |
||||
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/> |
||||
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/> |
||||
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/> |
||||
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/> |
||||
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/> |
||||
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/> |
||||
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/> |
||||
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/> |
||||
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/> |
||||
<AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,0,120,0,0,0,120"/> |
||||
</AuxValues> |
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout"> |
||||
<Property name="useNullLayout" type="boolean" value="true"/> |
||||
</Layout> |
||||
<SubComponents> |
||||
<Container class="javax.swing.JPanel" name="toolBar"> |
||||
<Properties> |
||||
<Property name="opaque" type="boolean" value="false"/> |
||||
</Properties> |
||||
<Constraints> |
||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> |
||||
<AbsoluteConstraints x="0" y="0" width="120" height="120"/> |
||||
</Constraint> |
||||
</Constraints> |
||||
|
||||
<Layout> |
||||
<DimensionLayout dim="0"> |
||||
<Group type="103" groupAlignment="0" attributes="0"> |
||||
<Group type="102" attributes="0"> |
||||
<Group type="103" groupAlignment="0" attributes="0"> |
||||
<Component id="sphereButton" min="-2" pref="16" max="-2" attributes="0"/> |
||||
<Component id="boxButton" min="-2" pref="16" max="-2" attributes="0"/> |
||||
<Component id="quadButton" min="-2" pref="16" max="-2" attributes="0"/> |
||||
</Group> |
||||
<EmptySpace pref="104" max="32767" attributes="0"/> |
||||
</Group> |
||||
<Group type="102" attributes="0"> |
||||
<Component id="expandButton" min="-2" pref="16" max="-2" attributes="0"/> |
||||
<EmptySpace max="32767" attributes="0"/> |
||||
<Component id="reloadButton" min="-2" pref="16" max="-2" attributes="0"/> |
||||
</Group> |
||||
</Group> |
||||
</DimensionLayout> |
||||
<DimensionLayout dim="1"> |
||||
<Group type="103" groupAlignment="0" attributes="0"> |
||||
<Group type="102" alignment="0" attributes="0"> |
||||
<Group type="103" groupAlignment="0" attributes="0"> |
||||
<Component id="expandButton" min="-2" pref="16" max="-2" attributes="0"/> |
||||
<Component id="reloadButton" min="-2" pref="16" max="-2" attributes="0"/> |
||||
</Group> |
||||
<EmptySpace pref="39" max="32767" attributes="0"/> |
||||
<Component id="sphereButton" min="-2" pref="16" max="-2" attributes="0"/> |
||||
<EmptySpace max="-2" attributes="0"/> |
||||
<Component id="boxButton" min="-2" pref="16" max="-2" attributes="0"/> |
||||
<EmptySpace max="-2" attributes="0"/> |
||||
<Component id="quadButton" min="-2" pref="16" max="-2" attributes="0"/> |
||||
<EmptySpace min="-2" pref="5" max="-2" attributes="0"/> |
||||
</Group> |
||||
</Group> |
||||
</DimensionLayout> |
||||
</Layout> |
||||
<SubComponents> |
||||
<Component class="javax.swing.JButton" name="sphereButton"> |
||||
<Properties> |
||||
<Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor"> |
||||
<Color blue="99" green="99" red="99" type="rgb"/> |
||||
</Property> |
||||
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor"> |
||||
<Image iconType="3" name="/com/jme3/gde/materialdefinition/icons/Sphere.png"/> |
||||
</Property> |
||||
<Property name="toolTipText" type="java.lang.String" value="Sphere"/> |
||||
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor"> |
||||
<Border info="null"/> |
||||
</Property> |
||||
<Property name="borderPainted" type="boolean" value="false"/> |
||||
<Property name="contentAreaFilled" type="boolean" value="false"/> |
||||
<Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor"> |
||||
<Color id="Curseur par défaut"/> |
||||
</Property> |
||||
<Property name="focusable" type="boolean" value="false"/> |
||||
<Property name="iconTextGap" type="int" value="0"/> |
||||
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> |
||||
<Dimension value="[24, 24]"/> |
||||
</Property> |
||||
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> |
||||
<Dimension value="[24, 24]"/> |
||||
</Property> |
||||
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> |
||||
<Dimension value="[24, 24]"/> |
||||
</Property> |
||||
</Properties> |
||||
<Events> |
||||
<EventHandler event="mouseEntered" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="sphereButtonMouseEntered"/> |
||||
<EventHandler event="mouseExited" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="sphereButtonMouseExited"/> |
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="sphereButtonActionPerformed"/> |
||||
</Events> |
||||
</Component> |
||||
<Component class="javax.swing.JButton" name="boxButton"> |
||||
<Properties> |
||||
<Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor"> |
||||
<Color blue="99" green="99" red="99" type="rgb"/> |
||||
</Property> |
||||
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor"> |
||||
<Image iconType="3" name="/com/jme3/gde/materialdefinition/icons/cube.png"/> |
||||
</Property> |
||||
<Property name="toolTipText" type="java.lang.String" value="Cube"/> |
||||
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor"> |
||||
<Border info="null"/> |
||||
</Property> |
||||
<Property name="borderPainted" type="boolean" value="false"/> |
||||
<Property name="contentAreaFilled" type="boolean" value="false"/> |
||||
<Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor"> |
||||
<Color id="Curseur par défaut"/> |
||||
</Property> |
||||
<Property name="focusable" type="boolean" value="false"/> |
||||
<Property name="iconTextGap" type="int" value="0"/> |
||||
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> |
||||
<Dimension value="[24, 24]"/> |
||||
</Property> |
||||
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> |
||||
<Dimension value="[24, 24]"/> |
||||
</Property> |
||||
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> |
||||
<Dimension value="[24, 24]"/> |
||||
</Property> |
||||
</Properties> |
||||
<Events> |
||||
<EventHandler event="mouseEntered" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="boxButtonMouseEntered"/> |
||||
<EventHandler event="mouseExited" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="boxButtonMouseExited"/> |
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="boxButtonActionPerformed"/> |
||||
</Events> |
||||
</Component> |
||||
<Component class="javax.swing.JButton" name="reloadButton"> |
||||
<Properties> |
||||
<Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor"> |
||||
<Color blue="99" green="99" red="99" type="rgb"/> |
||||
</Property> |
||||
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor"> |
||||
<Image iconType="3" name="/com/jme3/gde/materialdefinition/icons/reload.png"/> |
||||
</Property> |
||||
<Property name="toolTipText" type="java.lang.String" value="Refresh"/> |
||||
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor"> |
||||
<Border info="null"/> |
||||
</Property> |
||||
<Property name="borderPainted" type="boolean" value="false"/> |
||||
<Property name="contentAreaFilled" type="boolean" value="false"/> |
||||
<Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor"> |
||||
<Color id="Curseur par défaut"/> |
||||
</Property> |
||||
<Property name="focusable" type="boolean" value="false"/> |
||||
<Property name="iconTextGap" type="int" value="0"/> |
||||
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> |
||||
<Dimension value="[24, 24]"/> |
||||
</Property> |
||||
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> |
||||
<Dimension value="[24, 24]"/> |
||||
</Property> |
||||
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> |
||||
<Dimension value="[24, 24]"/> |
||||
</Property> |
||||
</Properties> |
||||
<Events> |
||||
<EventHandler event="mouseEntered" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="reloadButtonMouseEntered"/> |
||||
<EventHandler event="mouseExited" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="reloadButtonMouseExited"/> |
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="reloadButtonActionPerformed"/> |
||||
</Events> |
||||
</Component> |
||||
<Component class="javax.swing.JButton" name="quadButton"> |
||||
<Properties> |
||||
<Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor"> |
||||
<Color blue="99" green="99" red="99" type="rgb"/> |
||||
</Property> |
||||
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor"> |
||||
<Image iconType="3" name="/com/jme3/gde/materialdefinition/icons/Quad.png"/> |
||||
</Property> |
||||
<Property name="toolTipText" type="java.lang.String" value="Quad"/> |
||||
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor"> |
||||
<Border info="null"/> |
||||
</Property> |
||||
<Property name="borderPainted" type="boolean" value="false"/> |
||||
<Property name="contentAreaFilled" type="boolean" value="false"/> |
||||
<Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor"> |
||||
<Color id="Curseur par défaut"/> |
||||
</Property> |
||||
<Property name="focusable" type="boolean" value="false"/> |
||||
<Property name="iconTextGap" type="int" value="0"/> |
||||
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> |
||||
<Dimension value="[24, 24]"/> |
||||
</Property> |
||||
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> |
||||
<Dimension value="[24, 24]"/> |
||||
</Property> |
||||
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> |
||||
<Dimension value="[24, 24]"/> |
||||
</Property> |
||||
</Properties> |
||||
<Events> |
||||
<EventHandler event="mouseEntered" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="quadButtonMouseEntered"/> |
||||
<EventHandler event="mouseExited" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="quadButtonMouseExited"/> |
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="quadButtonActionPerformed"/> |
||||
</Events> |
||||
</Component> |
||||
<Component class="javax.swing.JButton" name="expandButton"> |
||||
<Properties> |
||||
<Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor"> |
||||
<Color blue="99" green="99" red="99" type="rgb"/> |
||||
</Property> |
||||
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor"> |
||||
<Image iconType="3" name="/com/jme3/gde/materialdefinition/icons/expend.png"/> |
||||
</Property> |
||||
<Property name="toolTipText" type="java.lang.String" value="Expand"/> |
||||
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor"> |
||||
<Border info="null"/> |
||||
</Property> |
||||
<Property name="borderPainted" type="boolean" value="false"/> |
||||
<Property name="contentAreaFilled" type="boolean" value="false"/> |
||||
<Property name="cursor" type="java.awt.Cursor" editor="org.netbeans.modules.form.editors2.CursorEditor"> |
||||
<Color id="Curseur par défaut"/> |
||||
</Property> |
||||
<Property name="focusable" type="boolean" value="false"/> |
||||
<Property name="iconTextGap" type="int" value="0"/> |
||||
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> |
||||
<Dimension value="[24, 24]"/> |
||||
</Property> |
||||
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> |
||||
<Dimension value="[24, 24]"/> |
||||
</Property> |
||||
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> |
||||
<Dimension value="[24, 24]"/> |
||||
</Property> |
||||
</Properties> |
||||
<Events> |
||||
<EventHandler event="mouseEntered" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="expandButtonMouseEntered"/> |
||||
<EventHandler event="mouseExited" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="expandButtonMouseExited"/> |
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="expandButtonActionPerformed"/> |
||||
</Events> |
||||
</Component> |
||||
</SubComponents> |
||||
</Container> |
||||
<Component class="javax.swing.JLabel" name="previewLabel"> |
||||
<Properties> |
||||
<Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor"> |
||||
<Color blue="64" green="64" red="64" type="rgb"/> |
||||
</Property> |
||||
<Property name="foreground" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor"> |
||||
<Color blue="64" green="64" red="64" type="rgb"/> |
||||
</Property> |
||||
<Property name="horizontalAlignment" type="int" value="0"/> |
||||
<Property name="horizontalTextPosition" type="int" value="0"/> |
||||
<Property name="iconTextGap" type="int" value="0"/> |
||||
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> |
||||
<Dimension value="[100, 100]"/> |
||||
</Property> |
||||
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> |
||||
<Dimension value="[100, 100]"/> |
||||
</Property> |
||||
<Property name="opaque" type="boolean" value="true"/> |
||||
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor"> |
||||
<Dimension value="[100, 100]"/> |
||||
</Property> |
||||
</Properties> |
||||
<Constraints> |
||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> |
||||
<AbsoluteConstraints x="20" y="20" width="-1" height="100"/> |
||||
</Constraint> |
||||
</Constraints> |
||||
</Component> |
||||
</SubComponents> |
||||
</Form> |
@ -0,0 +1,379 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.editor; |
||||
|
||||
import com.jme3.gde.core.assets.ProjectAssetManager; |
||||
import com.jme3.gde.materials.MaterialPreviewRenderer; |
||||
import com.jme3.material.Material; |
||||
import java.awt.Component; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
import java.awt.event.ComponentEvent; |
||||
import java.awt.event.ComponentListener; |
||||
import java.awt.event.MouseEvent; |
||||
import java.awt.event.MouseListener; |
||||
import javax.swing.SwingUtilities; |
||||
import javax.swing.Timer; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public class MatPanel extends javax.swing.JPanel implements MouseListener,ComponentListener { |
||||
|
||||
|
||||
private MaterialPreviewRenderer renderer; |
||||
private Material mat; |
||||
/** |
||||
* Creates new form PreviewPanel |
||||
*/ |
||||
public MatPanel() { |
||||
initComponents(); |
||||
setBounds(0, 0, 120, 120); |
||||
toolBar.setVisible(false); |
||||
addMouseListener(this); |
||||
renderer = new MaterialPreviewRenderer(previewLabel); |
||||
} |
||||
|
||||
public void cleanup(){ |
||||
renderer.cleanUp(); |
||||
cleanup(); |
||||
} |
||||
|
||||
public void showMaterial(Material mat) { |
||||
this.mat = mat; |
||||
renderer.showMaterial(mat); |
||||
} |
||||
|
||||
|
||||
|
||||
/** |
||||
* This method is called from within the constructor to initialize the form. |
||||
* WARNING: Do NOT modify this code. The content of this method is always |
||||
* regenerated by the Form Editor. |
||||
*/ |
||||
@SuppressWarnings("unchecked") |
||||
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
||||
private void initComponents() { |
||||
|
||||
toolBar = new javax.swing.JPanel(); |
||||
sphereButton = new javax.swing.JButton(); |
||||
boxButton = new javax.swing.JButton(); |
||||
reloadButton = new javax.swing.JButton(); |
||||
quadButton = new javax.swing.JButton(); |
||||
expandButton = new javax.swing.JButton(); |
||||
previewLabel = new javax.swing.JLabel(); |
||||
|
||||
setOpaque(false); |
||||
setLayout(null); |
||||
|
||||
toolBar.setOpaque(false); |
||||
|
||||
sphereButton.setBackground(new java.awt.Color(153, 153, 153)); |
||||
sphereButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/jme3/gde/materialdefinition/icons/Sphere.png"))); // NOI18N
|
||||
sphereButton.setToolTipText("Sphere"); |
||||
sphereButton.setBorder(null); |
||||
sphereButton.setBorderPainted(false); |
||||
sphereButton.setContentAreaFilled(false); |
||||
sphereButton.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); |
||||
sphereButton.setFocusable(false); |
||||
sphereButton.setIconTextGap(0); |
||||
sphereButton.setMaximumSize(new java.awt.Dimension(24, 24)); |
||||
sphereButton.setMinimumSize(new java.awt.Dimension(24, 24)); |
||||
sphereButton.setPreferredSize(new java.awt.Dimension(24, 24)); |
||||
sphereButton.addMouseListener(new java.awt.event.MouseAdapter() { |
||||
public void mouseEntered(java.awt.event.MouseEvent evt) { |
||||
sphereButtonMouseEntered(evt); |
||||
} |
||||
public void mouseExited(java.awt.event.MouseEvent evt) { |
||||
sphereButtonMouseExited(evt); |
||||
} |
||||
}); |
||||
sphereButton.addActionListener(new java.awt.event.ActionListener() { |
||||
public void actionPerformed(java.awt.event.ActionEvent evt) { |
||||
sphereButtonActionPerformed(evt); |
||||
} |
||||
}); |
||||
|
||||
boxButton.setBackground(new java.awt.Color(153, 153, 153)); |
||||
boxButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/jme3/gde/materialdefinition/icons/cube.png"))); // NOI18N
|
||||
boxButton.setToolTipText("Cube"); |
||||
boxButton.setBorder(null); |
||||
boxButton.setBorderPainted(false); |
||||
boxButton.setContentAreaFilled(false); |
||||
boxButton.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); |
||||
boxButton.setFocusable(false); |
||||
boxButton.setIconTextGap(0); |
||||
boxButton.setMaximumSize(new java.awt.Dimension(24, 24)); |
||||
boxButton.setMinimumSize(new java.awt.Dimension(24, 24)); |
||||
boxButton.setPreferredSize(new java.awt.Dimension(24, 24)); |
||||
boxButton.addMouseListener(new java.awt.event.MouseAdapter() { |
||||
public void mouseEntered(java.awt.event.MouseEvent evt) { |
||||
boxButtonMouseEntered(evt); |
||||
} |
||||
public void mouseExited(java.awt.event.MouseEvent evt) { |
||||
boxButtonMouseExited(evt); |
||||
} |
||||
}); |
||||
boxButton.addActionListener(new java.awt.event.ActionListener() { |
||||
public void actionPerformed(java.awt.event.ActionEvent evt) { |
||||
boxButtonActionPerformed(evt); |
||||
} |
||||
}); |
||||
|
||||
reloadButton.setBackground(new java.awt.Color(153, 153, 153)); |
||||
reloadButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/jme3/gde/materialdefinition/icons/reload.png"))); // NOI18N
|
||||
reloadButton.setToolTipText("Refresh"); |
||||
reloadButton.setBorder(null); |
||||
reloadButton.setBorderPainted(false); |
||||
reloadButton.setContentAreaFilled(false); |
||||
reloadButton.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); |
||||
reloadButton.setFocusable(false); |
||||
reloadButton.setIconTextGap(0); |
||||
reloadButton.setMaximumSize(new java.awt.Dimension(24, 24)); |
||||
reloadButton.setMinimumSize(new java.awt.Dimension(24, 24)); |
||||
reloadButton.setPreferredSize(new java.awt.Dimension(24, 24)); |
||||
reloadButton.addMouseListener(new java.awt.event.MouseAdapter() { |
||||
public void mouseEntered(java.awt.event.MouseEvent evt) { |
||||
reloadButtonMouseEntered(evt); |
||||
} |
||||
public void mouseExited(java.awt.event.MouseEvent evt) { |
||||
reloadButtonMouseExited(evt); |
||||
} |
||||
}); |
||||
reloadButton.addActionListener(new java.awt.event.ActionListener() { |
||||
public void actionPerformed(java.awt.event.ActionEvent evt) { |
||||
reloadButtonActionPerformed(evt); |
||||
} |
||||
}); |
||||
|
||||
quadButton.setBackground(new java.awt.Color(153, 153, 153)); |
||||
quadButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/jme3/gde/materialdefinition/icons/Quad.png"))); // NOI18N
|
||||
quadButton.setToolTipText("Quad"); |
||||
quadButton.setBorder(null); |
||||
quadButton.setBorderPainted(false); |
||||
quadButton.setContentAreaFilled(false); |
||||
quadButton.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); |
||||
quadButton.setFocusable(false); |
||||
quadButton.setIconTextGap(0); |
||||
quadButton.setMaximumSize(new java.awt.Dimension(24, 24)); |
||||
quadButton.setMinimumSize(new java.awt.Dimension(24, 24)); |
||||
quadButton.setPreferredSize(new java.awt.Dimension(24, 24)); |
||||
quadButton.addMouseListener(new java.awt.event.MouseAdapter() { |
||||
public void mouseEntered(java.awt.event.MouseEvent evt) { |
||||
quadButtonMouseEntered(evt); |
||||
} |
||||
public void mouseExited(java.awt.event.MouseEvent evt) { |
||||
quadButtonMouseExited(evt); |
||||
} |
||||
}); |
||||
quadButton.addActionListener(new java.awt.event.ActionListener() { |
||||
public void actionPerformed(java.awt.event.ActionEvent evt) { |
||||
quadButtonActionPerformed(evt); |
||||
} |
||||
}); |
||||
|
||||
expandButton.setBackground(new java.awt.Color(153, 153, 153)); |
||||
expandButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/jme3/gde/materialdefinition/icons/expend.png"))); // NOI18N
|
||||
expandButton.setToolTipText("Expand"); |
||||
expandButton.setBorder(null); |
||||
expandButton.setBorderPainted(false); |
||||
expandButton.setContentAreaFilled(false); |
||||
expandButton.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); |
||||
expandButton.setFocusable(false); |
||||
expandButton.setIconTextGap(0); |
||||
expandButton.setMaximumSize(new java.awt.Dimension(24, 24)); |
||||
expandButton.setMinimumSize(new java.awt.Dimension(24, 24)); |
||||
expandButton.setPreferredSize(new java.awt.Dimension(24, 24)); |
||||
expandButton.addMouseListener(new java.awt.event.MouseAdapter() { |
||||
public void mouseEntered(java.awt.event.MouseEvent evt) { |
||||
expandButtonMouseEntered(evt); |
||||
} |
||||
public void mouseExited(java.awt.event.MouseEvent evt) { |
||||
expandButtonMouseExited(evt); |
||||
} |
||||
}); |
||||
expandButton.addActionListener(new java.awt.event.ActionListener() { |
||||
public void actionPerformed(java.awt.event.ActionEvent evt) { |
||||
expandButtonActionPerformed(evt); |
||||
} |
||||
}); |
||||
|
||||
javax.swing.GroupLayout toolBarLayout = new javax.swing.GroupLayout(toolBar); |
||||
toolBar.setLayout(toolBarLayout); |
||||
toolBarLayout.setHorizontalGroup( |
||||
toolBarLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) |
||||
.addGroup(toolBarLayout.createSequentialGroup() |
||||
.addGroup(toolBarLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) |
||||
.addComponent(sphereButton, javax.swing.GroupLayout.PREFERRED_SIZE, 16, javax.swing.GroupLayout.PREFERRED_SIZE) |
||||
.addComponent(boxButton, javax.swing.GroupLayout.PREFERRED_SIZE, 16, javax.swing.GroupLayout.PREFERRED_SIZE) |
||||
.addComponent(quadButton, javax.swing.GroupLayout.PREFERRED_SIZE, 16, javax.swing.GroupLayout.PREFERRED_SIZE)) |
||||
.addContainerGap(104, Short.MAX_VALUE)) |
||||
.addGroup(toolBarLayout.createSequentialGroup() |
||||
.addComponent(expandButton, javax.swing.GroupLayout.PREFERRED_SIZE, 16, javax.swing.GroupLayout.PREFERRED_SIZE) |
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) |
||||
.addComponent(reloadButton, javax.swing.GroupLayout.PREFERRED_SIZE, 16, javax.swing.GroupLayout.PREFERRED_SIZE)) |
||||
); |
||||
toolBarLayout.setVerticalGroup( |
||||
toolBarLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) |
||||
.addGroup(toolBarLayout.createSequentialGroup() |
||||
.addGroup(toolBarLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) |
||||
.addComponent(expandButton, javax.swing.GroupLayout.PREFERRED_SIZE, 16, javax.swing.GroupLayout.PREFERRED_SIZE) |
||||
.addComponent(reloadButton, javax.swing.GroupLayout.PREFERRED_SIZE, 16, javax.swing.GroupLayout.PREFERRED_SIZE)) |
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 39, Short.MAX_VALUE) |
||||
.addComponent(sphereButton, javax.swing.GroupLayout.PREFERRED_SIZE, 16, javax.swing.GroupLayout.PREFERRED_SIZE) |
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) |
||||
.addComponent(boxButton, javax.swing.GroupLayout.PREFERRED_SIZE, 16, javax.swing.GroupLayout.PREFERRED_SIZE) |
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) |
||||
.addComponent(quadButton, javax.swing.GroupLayout.PREFERRED_SIZE, 16, javax.swing.GroupLayout.PREFERRED_SIZE) |
||||
.addGap(5, 5, 5)) |
||||
); |
||||
|
||||
add(toolBar); |
||||
toolBar.setBounds(0, 0, 120, 120); |
||||
|
||||
previewLabel.setBackground(new java.awt.Color(100, 100, 100)); |
||||
previewLabel.setForeground(new java.awt.Color(100, 100, 100)); |
||||
previewLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); |
||||
previewLabel.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); |
||||
previewLabel.setIconTextGap(0); |
||||
previewLabel.setMaximumSize(new java.awt.Dimension(100, 100)); |
||||
previewLabel.setMinimumSize(new java.awt.Dimension(100, 100)); |
||||
previewLabel.setOpaque(true); |
||||
previewLabel.setPreferredSize(new java.awt.Dimension(100, 100)); |
||||
add(previewLabel); |
||||
previewLabel.setBounds(20, 20, 100, 100); |
||||
}// </editor-fold>//GEN-END:initComponents
|
||||
|
||||
private void expandButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_expandButtonActionPerformed
|
||||
// TODO add your handling code here:
|
||||
}//GEN-LAST:event_expandButtonActionPerformed
|
||||
|
||||
private void expandButtonMouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_expandButtonMouseEntered
|
||||
mouseEntered(SwingUtilities.convertMouseEvent(expandButton, evt, this)); |
||||
}//GEN-LAST:event_expandButtonMouseEntered
|
||||
|
||||
private void expandButtonMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_expandButtonMouseExited
|
||||
mouseExited(SwingUtilities.convertMouseEvent(expandButton, evt, this)); |
||||
}//GEN-LAST:event_expandButtonMouseExited
|
||||
|
||||
private void sphereButtonMouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_sphereButtonMouseEntered
|
||||
mouseEntered(SwingUtilities.convertMouseEvent(sphereButton, evt, this)); |
||||
}//GEN-LAST:event_sphereButtonMouseEntered
|
||||
|
||||
private void sphereButtonMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_sphereButtonMouseExited
|
||||
mouseExited(SwingUtilities.convertMouseEvent(sphereButton, evt, this)); |
||||
}//GEN-LAST:event_sphereButtonMouseExited
|
||||
|
||||
private void sphereButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_sphereButtonActionPerformed
|
||||
renderer.switchDisplay(MaterialPreviewRenderer.DisplayType.Sphere); |
||||
refresh(); |
||||
}//GEN-LAST:event_sphereButtonActionPerformed
|
||||
|
||||
private void boxButtonMouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_boxButtonMouseEntered
|
||||
mouseEntered(SwingUtilities.convertMouseEvent(boxButton, evt, this)); |
||||
}//GEN-LAST:event_boxButtonMouseEntered
|
||||
|
||||
private void boxButtonMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_boxButtonMouseExited
|
||||
mouseExited(SwingUtilities.convertMouseEvent(boxButton, evt, this)); |
||||
}//GEN-LAST:event_boxButtonMouseExited
|
||||
|
||||
private void boxButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_boxButtonActionPerformed
|
||||
renderer.switchDisplay(MaterialPreviewRenderer.DisplayType.Box); |
||||
refresh(); |
||||
}//GEN-LAST:event_boxButtonActionPerformed
|
||||
|
||||
private void reloadButtonMouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_reloadButtonMouseEntered
|
||||
mouseEntered(SwingUtilities.convertMouseEvent(reloadButton, evt, this)); |
||||
}//GEN-LAST:event_reloadButtonMouseEntered
|
||||
|
||||
private void reloadButtonMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_reloadButtonMouseExited
|
||||
mouseExited(SwingUtilities.convertMouseEvent(reloadButton, evt, this)); |
||||
}//GEN-LAST:event_reloadButtonMouseExited
|
||||
|
||||
private void reloadButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_reloadButtonActionPerformed
|
||||
refresh(); |
||||
}//GEN-LAST:event_reloadButtonActionPerformed
|
||||
|
||||
private void quadButtonMouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_quadButtonMouseEntered
|
||||
mouseEntered(SwingUtilities.convertMouseEvent(quadButton, evt, this)); |
||||
}//GEN-LAST:event_quadButtonMouseEntered
|
||||
|
||||
private void quadButtonMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_quadButtonMouseExited
|
||||
mouseExited(SwingUtilities.convertMouseEvent(quadButton, evt, this)); |
||||
}//GEN-LAST:event_quadButtonMouseExited
|
||||
|
||||
private void quadButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_quadButtonActionPerformed
|
||||
renderer.switchDisplay(MaterialPreviewRenderer.DisplayType.Quad); |
||||
refresh(); |
||||
}//GEN-LAST:event_quadButtonActionPerformed
|
||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||
private javax.swing.JButton boxButton; |
||||
private javax.swing.JButton expandButton; |
||||
private javax.swing.JLabel previewLabel; |
||||
private javax.swing.JButton quadButton; |
||||
private javax.swing.JButton reloadButton; |
||||
private javax.swing.JButton sphereButton; |
||||
private javax.swing.JPanel toolBar; |
||||
// End of variables declaration//GEN-END:variables
|
||||
|
||||
@Override |
||||
public void mouseClicked(MouseEvent e) { |
||||
} |
||||
|
||||
@Override |
||||
public void mousePressed(MouseEvent e) { |
||||
} |
||||
|
||||
@Override |
||||
public void mouseReleased(MouseEvent e) { |
||||
} |
||||
|
||||
@Override |
||||
public void mouseEntered(MouseEvent e) { |
||||
toolBar.setVisible(true); |
||||
t.stop(); |
||||
} |
||||
Timer t = new Timer(500, new ActionListener() { |
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
toolBar.setVisible(false); |
||||
} |
||||
}); |
||||
|
||||
@Override |
||||
public void mouseExited(MouseEvent e) { |
||||
t.restart(); |
||||
} |
||||
|
||||
@Override |
||||
public void componentResized(ComponentEvent e) { |
||||
update(e.getComponent()); |
||||
} |
||||
|
||||
@Override |
||||
public void componentMoved(ComponentEvent e) { |
||||
update(e.getComponent()); |
||||
} |
||||
|
||||
@Override |
||||
public void componentShown(ComponentEvent e) { |
||||
update(e.getComponent()); |
||||
} |
||||
|
||||
@Override |
||||
public void componentHidden(ComponentEvent e) { |
||||
} |
||||
|
||||
protected void update(Component c) { |
||||
setLocation(c.getLocation().x + c.getWidth() - 150, c.getLocation().y + 10 - 120); |
||||
} |
||||
|
||||
private void refresh() { |
||||
if(mat!=null){ |
||||
renderer.showMaterial(mat); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,460 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.editor; |
||||
|
||||
import com.jme3.gde.materialdefinition.fileStructure.ShaderNodeBlock; |
||||
import com.jme3.gde.materialdefinition.fileStructure.leaves.InputMappingBlock; |
||||
import com.jme3.gde.materialdefinition.fileStructure.leaves.OutputMappingBlock; |
||||
import com.jme3.gde.materialdefinition.icons.Icons; |
||||
import com.jme3.shader.Shader; |
||||
import com.jme3.shader.ShaderNodeDefinition; |
||||
import com.jme3.shader.ShaderNodeVariable; |
||||
import java.awt.Color; |
||||
import java.awt.Font; |
||||
import java.awt.GradientPaint; |
||||
import java.awt.Graphics; |
||||
import java.awt.Graphics2D; |
||||
import java.awt.RadialGradientPaint; |
||||
import java.awt.RenderingHints; |
||||
import java.awt.event.KeyEvent; |
||||
import java.awt.event.KeyListener; |
||||
import java.awt.event.MouseAdapter; |
||||
import java.awt.event.MouseEvent; |
||||
import java.beans.PropertyChangeEvent; |
||||
import java.beans.PropertyChangeListener; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
import javax.swing.GroupLayout; |
||||
import javax.swing.ImageIcon; |
||||
import javax.swing.JLabel; |
||||
import javax.swing.JPanel; |
||||
import javax.swing.LayoutStyle; |
||||
import javax.swing.SwingConstants; |
||||
import javax.swing.SwingUtilities; |
||||
import org.openide.util.WeakListeners; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public class NodePanel extends DraggablePanel implements Selectable, PropertyChangeListener, InOut, KeyListener { |
||||
|
||||
List<JLabel> inputLabels = new ArrayList<JLabel>(); |
||||
List<JLabel> outputLabels = new ArrayList<JLabel>(); |
||||
List<Dot> inputDots = new ArrayList<Dot>(); |
||||
List<Dot> outputDots = new ArrayList<Dot>(); |
||||
private NodeType type = NodeType.Vertex; |
||||
private JPanel content; |
||||
private JLabel header; |
||||
private Color color; |
||||
private String name; |
||||
private String techName; |
||||
|
||||
// private List listeners = Collections.synchronizedList(new LinkedList());
|
||||
//
|
||||
// public void addPropertyChangeListener(PropertyChangeListener pcl) {
|
||||
// listeners.add(pcl);
|
||||
// }
|
||||
//
|
||||
// public void removePropertyChangeListener(PropertyChangeListener pcl) {
|
||||
// listeners.remove(pcl);
|
||||
// }
|
||||
//
|
||||
// protected void fire(String propertyName, Object old, Object nue) {
|
||||
// //Passing 0 below on purpose, so you only synchronize for one atomic call:
|
||||
// PropertyChangeListener[] pcls = (PropertyChangeListener[]) listeners.toArray(new PropertyChangeListener[0]);
|
||||
// for (int i = 0; i < pcls.length; i++) {
|
||||
// pcls[i].propertyChange(new PropertyChangeEvent(this, propertyName, old, nue));
|
||||
// }
|
||||
// }
|
||||
public enum NodeType { |
||||
|
||||
Vertex(new Color(220, 220, 70)),//yellow
|
||||
Fragment(new Color(114, 200, 255)),//bleue
|
||||
Attribute(Color.WHITE), |
||||
MatParam(new Color(70, 220, 70)),//green
|
||||
WorldParam(new Color(220, 70, 70)); //red
|
||||
private Color color; |
||||
|
||||
private NodeType() { |
||||
} |
||||
|
||||
private NodeType(Color color) { |
||||
this.color = color; |
||||
} |
||||
|
||||
public Color getColor() { |
||||
return color; |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Creates new form NodePanel |
||||
*/ |
||||
public NodePanel(ShaderNodeBlock node, ShaderNodeDefinition def) { |
||||
super(); |
||||
if (def.getType() == Shader.ShaderType.Vertex) { |
||||
type = NodePanel.NodeType.Vertex; |
||||
} else { |
||||
type = NodePanel.NodeType.Fragment; |
||||
} |
||||
init(def.getInputs(), def.getOutputs()); |
||||
|
||||
node.addPropertyChangeListener(WeakListeners.propertyChange(this, node)); |
||||
this.addPropertyChangeListener(WeakListeners.propertyChange(node, this)); |
||||
refresh(node); |
||||
addKeyListener(this); |
||||
} |
||||
|
||||
/** |
||||
* Creates new form NodePanel |
||||
*/ |
||||
public NodePanel(ShaderNodeVariable singleOut, NodePanel.NodeType type) { |
||||
super(); |
||||
List<ShaderNodeVariable> outputs = new ArrayList<ShaderNodeVariable>(); |
||||
outputs.add(singleOut); |
||||
this.type = type; |
||||
init(new ArrayList<ShaderNodeVariable>(), outputs); |
||||
addKeyListener(this); |
||||
} |
||||
|
||||
public final void refresh(ShaderNodeBlock node) { |
||||
name = node.getName(); |
||||
header.setText(node.getName()); |
||||
header.setToolTipText(node.getName()); |
||||
|
||||
} |
||||
|
||||
public void propertyChange(PropertyChangeEvent evt) { |
||||
if (evt.getPropertyName().equals("name")) { |
||||
refresh((ShaderNodeBlock) evt.getSource()); |
||||
} |
||||
} |
||||
|
||||
private void init(List<ShaderNodeVariable> inputs, List<ShaderNodeVariable> outputs) { |
||||
|
||||
setBounds(0, 0, 120, 30 + inputs.size() * 20 + outputs.size() * 20); |
||||
|
||||
for (ShaderNodeVariable input : inputs) { |
||||
|
||||
JLabel label = createLabel(input.getType(), input.getName(), Dot.ParamType.Input); |
||||
Dot dot = createDot(input.getType(), Dot.ParamType.Input, input.getName()); |
||||
inputLabels.add(label); |
||||
inputDots.add(dot); |
||||
} |
||||
int index = 0; |
||||
for (ShaderNodeVariable output : outputs) { |
||||
String outName = output.getName(); |
||||
JLabel label = createLabel(output.getType(), outName, Dot.ParamType.Output); |
||||
Dot dot = createDot(output.getType(), Dot.ParamType.Output, outName); |
||||
dot.setIndex(index++); |
||||
outputLabels.add(label); |
||||
outputDots.add(dot); |
||||
} |
||||
|
||||
initComponents(); |
||||
updateType(); |
||||
setOpaque(false); |
||||
|
||||
} |
||||
|
||||
public void setTitle(String s) { |
||||
header.setText(s); |
||||
header.setToolTipText(s); |
||||
} |
||||
|
||||
public Dot getInputConnectPoint(String varName) { |
||||
return getConnectPoint(inputLabels, varName, inputDots); |
||||
} |
||||
|
||||
public Dot getOutputConnectPoint(String varName) { |
||||
return getConnectPoint(outputLabels, varName, outputDots); |
||||
} |
||||
|
||||
private Dot getConnectPoint(List<JLabel> list, String varName, List<Dot> listDot) { |
||||
if (varName.startsWith("m_") || varName.startsWith("g_")) { |
||||
varName = varName.substring(2); |
||||
} |
||||
for (int i = 0; i < list.size(); i++) { |
||||
if (list.get(i).getText().equals(varName)) { |
||||
return listDot.get(i); |
||||
} |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
protected void paintComponent(Graphics g1) { |
||||
Graphics2D g = (Graphics2D) g1; |
||||
Color boderColor = Color.BLACK; |
||||
if (diagram.selectedItem == this) { |
||||
boderColor = Color.WHITE; |
||||
} |
||||
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, // Anti-alias!
|
||||
RenderingHints.VALUE_ANTIALIAS_ON); |
||||
Color[] colors = {new Color(0, 0, 0, 0.7f), new Color(0, 0, 0, 0.15f)}; |
||||
if (diagram.selectedItem == this) { |
||||
colors = new Color[]{new Color(0.6f, 0.6f, 1.0f, 0.9f), new Color(0.6f, 0.6f, 1.0f, 0.5f)}; |
||||
} |
||||
float[] factors = {0f, 1f}; |
||||
g.setPaint(new RadialGradientPaint(getWidth() / 2, getHeight() / 2, getWidth() / 2, factors, colors)); |
||||
g.fillRoundRect(8, 3, getWidth() - 10, getHeight() - 6, 15, 15); |
||||
g.setColor(new Color(170, 170, 170)); |
||||
g.fillRoundRect(5, 1, getWidth() - 9, getHeight() - 6, 15, 15); |
||||
g.setColor(boderColor); |
||||
|
||||
g.drawRoundRect(4, 0, getWidth() - 9, getHeight() - 6, 15, 15); |
||||
g.setColor(new Color(170, 170, 170)); |
||||
g.fillRect(4, 1, 10, 10); |
||||
g.setColor(boderColor); |
||||
g.drawLine(4, 0, 14, 0); |
||||
g.drawLine(4, 0, 4, 10); |
||||
g.setColor(Color.BLACK); |
||||
g.drawLine(5, 15, getWidth() - 6, 15); |
||||
g.setColor(new Color(190, 190, 190)); |
||||
g.drawLine(5, 16, getWidth() - 6, 16); |
||||
|
||||
Color c1 = new Color(color.getRed(), color.getGreen(), color.getBlue(), 150); |
||||
Color c2 = new Color(color.getRed(), color.getGreen(), color.getBlue(), 0); |
||||
g.setPaint(new GradientPaint(0, 15, c1, getWidth(), 15, c2)); |
||||
g.fillRect(5, 1, getWidth() - 10, 14); |
||||
|
||||
} |
||||
|
||||
public String getKey() { |
||||
switch (type) { |
||||
case Attribute: |
||||
return "Attr." + outputLabels.get(0).getText(); |
||||
case WorldParam: |
||||
return "WorldParam." + outputLabels.get(0).getText(); |
||||
case MatParam: |
||||
return "MatParam." + outputLabels.get(0).getText(); |
||||
default: |
||||
return techName + "/" + name; |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public String getName() { |
||||
return name; |
||||
} |
||||
|
||||
@Override |
||||
public void mousePressed(MouseEvent e) { |
||||
super.mousePressed(e); |
||||
diagram.select(this); |
||||
} |
||||
|
||||
public NodeType getType() { |
||||
return type; |
||||
} |
||||
|
||||
@Override |
||||
public void mouseReleased(MouseEvent e) { |
||||
diagram.fixSize(); |
||||
if (svdx != getLocation().x) { |
||||
firePropertyChange(ShaderNodeBlock.POSITION, svdx, getLocation().x); |
||||
getDiagram().getEditorParent().savePositionToMetaData(getKey(), getLocation().x, getLocation().y); |
||||
} |
||||
} |
||||
|
||||
public final void updateType() { |
||||
|
||||
switch (type) { |
||||
case Vertex: |
||||
header.setIcon(Icons.vert); |
||||
break; |
||||
case Fragment: |
||||
header.setIcon(Icons.frag); |
||||
break; |
||||
case Attribute: |
||||
header.setIcon(Icons.attrib); |
||||
header.setText("Attribute"); |
||||
header.setToolTipText("Attribute"); |
||||
name = "Attr"; |
||||
break; |
||||
case WorldParam: |
||||
header.setIcon(Icons.world); |
||||
header.setText("WorldParam"); |
||||
header.setToolTipText("WorldParam"); |
||||
name = "WorldParam"; |
||||
break; |
||||
case MatParam: |
||||
header.setIcon(Icons.mat); |
||||
header.setText("MatParam"); |
||||
header.setToolTipText("MatParam"); |
||||
name = "MatParam"; |
||||
break; |
||||
} |
||||
color = type.getColor(); |
||||
} |
||||
|
||||
/** |
||||
* This method is called from within the constructor to initialize the form. |
||||
* WARNING: Do NOT modify this code. The content of this method is always |
||||
* regenerated by the Form Editor. |
||||
*/ |
||||
@SuppressWarnings("unchecked") |
||||
// <editor-fold defaultstate="collapsed" desc="Generated Code">
|
||||
private void initComponents() { |
||||
|
||||
|
||||
|
||||
ImageIcon icon = Icons.vert; |
||||
if (type == NodeType.Fragment) { |
||||
icon = Icons.frag; |
||||
} |
||||
header = new JLabel(icon); |
||||
header.addMouseListener(labelMouseMotionListener); |
||||
header.addMouseMotionListener(labelMouseMotionListener); |
||||
header.setHorizontalAlignment(SwingConstants.LEFT); |
||||
header.setFont(new Font("Tahoma", Font.BOLD, 11)); |
||||
content = new JPanel(); |
||||
content.setOpaque(false); |
||||
GroupLayout contentLayout = new GroupLayout(content); |
||||
content.setLayout(contentLayout); |
||||
|
||||
|
||||
|
||||
int txtLength = 100; |
||||
|
||||
GroupLayout.ParallelGroup grpHoriz = contentLayout.createParallelGroup(GroupLayout.Alignment.LEADING); |
||||
|
||||
for (int i = 0; i < outputDots.size(); i++) { |
||||
grpHoriz.addGroup(GroupLayout.Alignment.TRAILING, contentLayout.createSequentialGroup() |
||||
.addGap(0, 0, Short.MAX_VALUE) |
||||
.addComponent(outputLabels.get(i), GroupLayout.PREFERRED_SIZE, txtLength, GroupLayout.PREFERRED_SIZE) |
||||
.addGap(2, 2, 2) |
||||
.addComponent(outputDots.get(i), GroupLayout.PREFERRED_SIZE, 10, GroupLayout.PREFERRED_SIZE)); |
||||
} |
||||
for (int i = 0; i < inputDots.size(); i++) { |
||||
grpHoriz.addGroup(GroupLayout.Alignment.LEADING, contentLayout.createSequentialGroup() |
||||
.addComponent(inputDots.get(i), GroupLayout.PREFERRED_SIZE, 10, GroupLayout.PREFERRED_SIZE) |
||||
.addGap(2, 2, 2) |
||||
.addComponent(inputLabels.get(i), GroupLayout.PREFERRED_SIZE, txtLength, GroupLayout.PREFERRED_SIZE)); |
||||
} |
||||
|
||||
contentLayout.setHorizontalGroup(grpHoriz); |
||||
|
||||
GroupLayout.ParallelGroup grpVert = contentLayout.createParallelGroup(GroupLayout.Alignment.LEADING); |
||||
|
||||
GroupLayout.SequentialGroup grp = contentLayout.createSequentialGroup(); |
||||
for (int i = 0; i < inputDots.size(); i++) { |
||||
grp.addGroup(contentLayout.createParallelGroup(GroupLayout.Alignment.CENTER) |
||||
.addComponent(inputDots.get(i), GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) |
||||
.addComponent(inputLabels.get(i))).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED); |
||||
} |
||||
for (int i = 0; i < outputDots.size(); i++) { |
||||
grp.addGroup(contentLayout.createParallelGroup(GroupLayout.Alignment.CENTER) |
||||
.addComponent(outputDots.get(i), GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) |
||||
.addComponent(outputLabels.get(i))).addPreferredGap(LayoutStyle.ComponentPlacement.RELATED); |
||||
} |
||||
|
||||
|
||||
grpVert.addGroup(GroupLayout.Alignment.TRAILING, grp); |
||||
|
||||
contentLayout.setVerticalGroup(grpVert); |
||||
|
||||
GroupLayout layout = new GroupLayout(this); |
||||
this.setLayout(layout); |
||||
layout.setHorizontalGroup( |
||||
layout.createParallelGroup(GroupLayout.Alignment.LEADING) |
||||
.addGroup(GroupLayout.Alignment.LEADING, layout.createSequentialGroup() |
||||
.addGap(6, 6, 6) |
||||
.addComponent(header, 100, 100, 100)) |
||||
.addGroup(GroupLayout.Alignment.LEADING, layout.createSequentialGroup() |
||||
.addGap(6, 6, 6)) |
||||
.addComponent(content, GroupLayout.Alignment.TRAILING, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)); |
||||
layout.setVerticalGroup( |
||||
layout.createParallelGroup(GroupLayout.Alignment.LEADING) |
||||
.addGroup(layout.createSequentialGroup() |
||||
.addComponent(header, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) |
||||
.addGap(10, 10, 10) |
||||
.addComponent(content, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) |
||||
.addGap(10, 10, 10)); |
||||
} |
||||
|
||||
public JLabel createLabel(String glslType, String txt, Dot.ParamType type) { |
||||
JLabel label = new JLabel(txt); |
||||
label.setToolTipText(glslType + " " + txt); |
||||
label.setOpaque(false); |
||||
//label.setPreferredSize(new Dimension(50, 15));
|
||||
label.setHorizontalAlignment(type == Dot.ParamType.Output ? SwingConstants.RIGHT : SwingConstants.LEFT); |
||||
label.setFont(new Font("Tahoma", 0, 10)); |
||||
label.addMouseListener(labelMouseMotionListener); |
||||
label.addMouseMotionListener(labelMouseMotionListener); |
||||
// label.setBorder(BorderFactory.createLineBorder(Color.BLACK));
|
||||
return label; |
||||
} |
||||
|
||||
public Dot createDot(String type, Dot.ParamType paramType, String paramName) { |
||||
Dot dot1 = new Dot(); |
||||
dot1.setNode(this); |
||||
dot1.setText(paramName); |
||||
dot1.setParamType(paramType); |
||||
dot1.setType(type); |
||||
return dot1; |
||||
} |
||||
|
||||
public void keyTyped(KeyEvent e) { |
||||
} |
||||
|
||||
@Override |
||||
public void keyPressed(KeyEvent e) { |
||||
|
||||
if (e.getKeyCode() == KeyEvent.VK_DELETE) { |
||||
Diagram diag = getDiagram(); |
||||
if (diag.selectedItem == this) { |
||||
diag.removeSelectedNode(); |
||||
} |
||||
} |
||||
} |
||||
|
||||
public void keyReleased(KeyEvent e) { |
||||
} |
||||
// used to pass press and drag events to the NodePanel when they occur on the label
|
||||
private LabelMouseMotionListener labelMouseMotionListener = new LabelMouseMotionListener(); |
||||
|
||||
private class LabelMouseMotionListener extends MouseAdapter { |
||||
|
||||
@Override |
||||
public void mousePressed(MouseEvent e) { |
||||
MouseEvent me = SwingUtilities.convertMouseEvent(e.getComponent(), e, NodePanel.this); |
||||
NodePanel.this.dispatchEvent(me); |
||||
} |
||||
|
||||
@Override |
||||
public void mouseDragged(MouseEvent e) { |
||||
MouseEvent me = SwingUtilities.convertMouseEvent(e.getComponent(), e, NodePanel.this); |
||||
NodePanel.this.dispatchEvent(me); |
||||
} |
||||
|
||||
@Override |
||||
public void mouseReleased(MouseEvent e) { |
||||
MouseEvent me = SwingUtilities.convertMouseEvent(e.getComponent(), e, NodePanel.this); |
||||
NodePanel.this.dispatchEvent(me); |
||||
} |
||||
} |
||||
|
||||
public void setTechName(String techName) { |
||||
this.techName = techName; |
||||
} |
||||
|
||||
public void addInputMapping(InputMappingBlock block) { |
||||
firePropertyChange(ShaderNodeBlock.INPUT, null, block); |
||||
} |
||||
|
||||
public void removeInputMapping(InputMappingBlock block) { |
||||
firePropertyChange(ShaderNodeBlock.INPUT, block, null); |
||||
} |
||||
|
||||
public void addOutputMapping(OutputMappingBlock block) { |
||||
firePropertyChange(ShaderNodeBlock.OUTPUT, null, block); |
||||
} |
||||
|
||||
public void removeOutputMapping(OutputMappingBlock block) { |
||||
firePropertyChange(ShaderNodeBlock.OUTPUT, block, null); |
||||
} |
||||
} |
@ -0,0 +1,283 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.editor; |
||||
|
||||
import com.jme3.gde.materialdefinition.fileStructure.leaves.InputMappingBlock; |
||||
import com.jme3.gde.materialdefinition.fileStructure.leaves.OutputMappingBlock; |
||||
import com.jme3.material.Material; |
||||
import com.jme3.shader.Shader; |
||||
import java.awt.Color; |
||||
import java.awt.GradientPaint; |
||||
import java.awt.Graphics; |
||||
import java.awt.Graphics2D; |
||||
import java.awt.LinearGradientPaint; |
||||
import java.awt.Point; |
||||
import java.awt.Polygon; |
||||
import java.awt.RenderingHints; |
||||
import java.awt.event.ComponentEvent; |
||||
import java.awt.event.ComponentListener; |
||||
import java.awt.event.MouseEvent; |
||||
import javax.swing.GroupLayout; |
||||
import javax.swing.JLabel; |
||||
import javax.swing.SwingUtilities; |
||||
|
||||
/** |
||||
* |
||||
* @author m327836 |
||||
*/ |
||||
public class OutBusPanel extends DraggablePanel implements ComponentListener, Selectable, InOut { |
||||
|
||||
private Color color = new Color(220, 220, 70); |
||||
private String name = ""; |
||||
private InnerPanel panel; |
||||
private MatPanel preview; |
||||
private Shader.ShaderType type; |
||||
|
||||
public OutBusPanel(String name, Shader.ShaderType type) { |
||||
this(name); |
||||
this.type = type; |
||||
if (type == Shader.ShaderType.Fragment) { |
||||
this.color = new Color(114, 200, 255); |
||||
} |
||||
} |
||||
|
||||
private OutBusPanel(String name) { |
||||
super(true); |
||||
setBounds(0, 0, 300, 50); |
||||
JLabel title = new JLabel(); |
||||
this.name = name; |
||||
title.setFont(new java.awt.Font("Impact", 1, 15)); // NOI18N
|
||||
title.setForeground(new java.awt.Color(153, 153, 153)); |
||||
title.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); |
||||
title.setText(name); |
||||
setOpaque(false); |
||||
panel = new InnerPanel(); |
||||
|
||||
javax.swing.GroupLayout outBusPanel1Layout = new javax.swing.GroupLayout(this); |
||||
this.setLayout(outBusPanel1Layout); |
||||
outBusPanel1Layout.setHorizontalGroup( |
||||
outBusPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) |
||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, outBusPanel1Layout.createSequentialGroup() |
||||
.addContainerGap(70, 70) |
||||
.addComponent(panel, 20, 200, Short.MAX_VALUE) |
||||
.addComponent(title, GroupLayout.PREFERRED_SIZE, 70, GroupLayout.PREFERRED_SIZE) |
||||
.addGap(30, 30, 30))); |
||||
outBusPanel1Layout.setVerticalGroup( |
||||
outBusPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) |
||||
.addGroup(outBusPanel1Layout.createSequentialGroup() |
||||
.addContainerGap() |
||||
.addComponent(title, javax.swing.GroupLayout.DEFAULT_SIZE, 28, Short.MAX_VALUE) |
||||
.addContainerGap()) |
||||
.addGroup(outBusPanel1Layout.createSequentialGroup() |
||||
.addContainerGap(20, 20) |
||||
.addComponent(panel, 10, 10, 10) |
||||
.addContainerGap())); |
||||
|
||||
preview = new MatPanel(); |
||||
addComponentListener(preview); |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void setDiagram(Diagram diagram) { |
||||
super.setDiagram(diagram); |
||||
// preview.setBounds(350,300,128,100);
|
||||
diagram.add(preview); |
||||
preview.update(this); |
||||
} |
||||
|
||||
@Override |
||||
protected void paintComponent(Graphics g1) { |
||||
Graphics2D g = (Graphics2D) g1; |
||||
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, // Anti-alias!
|
||||
RenderingHints.VALUE_ANTIALIAS_ON); |
||||
|
||||
int width = getWidth(); |
||||
int[] xs = {38, width - 30, width - 30, width, width - 30, width - 30, 38, 38}; |
||||
int[] ys = {10, 10, 0, getHeight() / 2, getHeight(), getHeight() - 10, getHeight() - 10, 10}; |
||||
|
||||
Polygon p = new Polygon(xs, ys, 8); |
||||
|
||||
if (diagram.selectedItem == this) { |
||||
int[] xs2 = {0, width - 30, width - 30, width, width - 32, width - 32, 0, 0}; |
||||
int[] ys2 = {10, 10, 0, getHeight() / 2 + 2, getHeight(), getHeight() - 8, getHeight() - 8, 10}; |
||||
|
||||
Polygon p2 = new Polygon(xs2, ys2, 8); |
||||
g.setPaint(new GradientPaint(0, 0, new Color(0.6f, 0.6f, 1.0f, 0.9f), 0, getHeight(), new Color(0.6f, 0.6f, 1.0f, 0.5f))); |
||||
g.fillPolygon(p2); |
||||
} |
||||
|
||||
Color c1 = new Color(100, 100, 100, 255); |
||||
Color c2 = new Color(100, 100, 100, 100); |
||||
g.setPaint(new GradientPaint(0, 0, c1, width, 0, c2)); |
||||
g.fillPolygon(p); |
||||
g.fillRect(0, 10, 3, getHeight() - 20); |
||||
g.fillRect(5, 10, 6, getHeight() - 20); |
||||
g.fillRect(13, 10, 9, getHeight() - 20); |
||||
g.fillRect(24, 10, 12, getHeight() - 20); |
||||
|
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void componentResized(ComponentEvent e) { |
||||
setSize(e.getComponent().getWidth(), 50); |
||||
} |
||||
|
||||
@Override |
||||
public void componentMoved(ComponentEvent e) { |
||||
} |
||||
|
||||
@Override |
||||
public void componentShown(ComponentEvent e) { |
||||
} |
||||
|
||||
@Override |
||||
public void componentHidden(ComponentEvent e) { |
||||
} |
||||
|
||||
@Override |
||||
public void mousePressed(MouseEvent e) { |
||||
if (dispatchToInnerPanel(e)) { |
||||
return; |
||||
} |
||||
super.mousePressed(e); |
||||
diagram.select(this); |
||||
} |
||||
|
||||
@Override |
||||
public void mouseDragged(MouseEvent e) { |
||||
if (panel.dragging == false) { |
||||
super.mouseDragged(e); |
||||
} |
||||
} |
||||
|
||||
protected void draggingDot(MouseEvent e) { |
||||
Point p = SwingUtilities.convertPoint(this, e.getX(), e.getY(), panel); |
||||
if (panel.contains(p)) { |
||||
MouseEvent me = SwingUtilities.convertMouseEvent(this, e, panel); |
||||
panel.mouseEntered(me); |
||||
} else { |
||||
MouseEvent me = SwingUtilities.convertMouseEvent(this, e, panel); |
||||
panel.mouseExited(me); |
||||
} |
||||
} |
||||
|
||||
public Dot getConnectPoint() { |
||||
return panel; |
||||
} |
||||
|
||||
public void updatePreview(Material mat) { |
||||
if (type == Shader.ShaderType.Fragment) { |
||||
preview.showMaterial(mat); |
||||
} else { |
||||
Material vmat = mat.clone(); |
||||
vmat.getAdditionalRenderState().setWireframe(true); |
||||
preview.showMaterial(vmat); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public String getName() { |
||||
return "Global"; |
||||
} |
||||
|
||||
@Override |
||||
public void mouseReleased(MouseEvent e) { |
||||
diagram.fixSize(); |
||||
MouseEvent me = SwingUtilities.convertMouseEvent(this, e, panel); |
||||
panel.mouseReleased(me); |
||||
getDiagram().getEditorParent().savePositionToMetaData(getKey(), 0, getLocation().y); |
||||
|
||||
} |
||||
|
||||
public String getKey() { |
||||
return name; |
||||
} |
||||
|
||||
private boolean dispatchToInnerPanel(MouseEvent e) { |
||||
Point p = SwingUtilities.convertPoint(this, e.getX(), e.getY(), panel); |
||||
if (panel.contains(p)) { |
||||
MouseEvent me = SwingUtilities.convertMouseEvent(this, e, panel); |
||||
panel.dispatchEvent(me); |
||||
if (me.isConsumed()) { |
||||
return true; |
||||
} |
||||
} |
||||
return false; |
||||
} |
||||
|
||||
public void addInputMapping(InputMappingBlock block) { |
||||
} |
||||
|
||||
public void removeInputMapping(InputMappingBlock block) { |
||||
} |
||||
|
||||
public void addOutputMapping(OutputMappingBlock block) { |
||||
} |
||||
|
||||
public void removeOutputMapping(OutputMappingBlock block) { |
||||
} |
||||
|
||||
class InnerPanel extends Dot { |
||||
|
||||
boolean over = false; |
||||
boolean dragging = false; |
||||
|
||||
public InnerPanel() { |
||||
setOpaque(false); |
||||
setNode(OutBusPanel.this); |
||||
setParamType(Dot.ParamType.Both); |
||||
setType("vec4"); |
||||
setText(name); |
||||
} |
||||
|
||||
@Override |
||||
protected void paintComponent(Graphics g1) { |
||||
Graphics2D g = (Graphics2D) g1; |
||||
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, // Anti-alias!
|
||||
RenderingHints.VALUE_ANTIALIAS_ON); |
||||
|
||||
Color c1 = new Color(color.getRed(), color.getGreen(), color.getBlue(), 255); |
||||
Color c2 = new Color(color.getRed(), color.getGreen(), color.getBlue(), 0); |
||||
g.setPaint(new LinearGradientPaint(0, 0, 0, getHeight(), new float[]{0, 0.5f, 1}, new Color[]{c2, c1, c2})); |
||||
g.fillRoundRect(1, 1, getWidth() - 1, getHeight() - 1, 10, 10); |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void mousePressed(MouseEvent e) { |
||||
super.mousePressed(e); |
||||
dragging = true; |
||||
} |
||||
|
||||
@Override |
||||
public void mouseDragged(MouseEvent e) { |
||||
e.consume(); |
||||
} |
||||
|
||||
@Override |
||||
public void mouseReleased(MouseEvent e) { |
||||
super.mouseReleased(e); |
||||
dragging = false; |
||||
} |
||||
|
||||
@Override |
||||
public void mouseEntered(MouseEvent e) { |
||||
if (!over) { |
||||
super.mouseEntered(e); |
||||
over = true; |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void mouseExited(MouseEvent e) { |
||||
if (over) { |
||||
super.mouseExited(e); |
||||
over = false; |
||||
} |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,16 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.editor; |
||||
|
||||
/** |
||||
* |
||||
* @author m327836 |
||||
*/ |
||||
public interface Selectable { |
||||
|
||||
public String getKey(); |
||||
|
||||
|
||||
} |
@ -0,0 +1,22 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.fileStructure; |
||||
|
||||
import com.jme3.util.blockparser.Statement; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public class FragmentShaderNodesBlock extends ShaderNodesBlock { |
||||
|
||||
public FragmentShaderNodesBlock(int lineNumber, String line) { |
||||
super(lineNumber, line); |
||||
} |
||||
|
||||
public FragmentShaderNodesBlock(Statement sta) { |
||||
super(sta); |
||||
} |
||||
} |
@ -0,0 +1,42 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.fileStructure; |
||||
|
||||
import com.jme3.gde.materialdefinition.fileStructure.*; |
||||
import com.jme3.gde.materialdefinition.fileStructure.leaves.InputMappingBlock; |
||||
import com.jme3.gde.materialdefinition.fileStructure.leaves.MatParamBlock; |
||||
import com.jme3.gde.materialdefinition.fileStructure.leaves.OutputMappingBlock; |
||||
import com.jme3.util.blockparser.Statement; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public class InputMappingsBlock extends UberStatement { |
||||
|
||||
protected InputMappingsBlock(int lineNumber, String line) { |
||||
super(lineNumber, line); |
||||
} |
||||
|
||||
public InputMappingsBlock(Statement sta, String nodeName) { |
||||
this(sta.getLineNumber(), sta.getLine()); |
||||
for (Statement statement : sta.getContents()) { |
||||
addStatement(new InputMappingBlock(statement, nodeName)); |
||||
} |
||||
} |
||||
|
||||
public List<InputMappingBlock> getMappings() { |
||||
return getBlocks(InputMappingBlock.class); |
||||
} |
||||
|
||||
public void addMapping(InputMappingBlock mapping) { |
||||
addStatement(mapping); |
||||
} |
||||
|
||||
public void removeMapping(InputMappingBlock mapping) { |
||||
contents.remove(mapping); |
||||
} |
||||
} |
@ -0,0 +1,94 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.fileStructure; |
||||
|
||||
import com.jme3.gde.materialdefinition.fileStructure.leaves.MatParamBlock; |
||||
import com.jme3.gde.materialdefinition.fileStructure.leaves.UnsupportedStatement; |
||||
import com.jme3.util.blockparser.Statement; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public class MatDefBlock extends UberStatement { |
||||
|
||||
public static final String ADD_MAT_PARAM = "addMatParam"; |
||||
public static final String REMOVE_MAT_PARAM = "removeMatParam"; |
||||
protected String name; |
||||
|
||||
protected MatDefBlock(int lineNumber, String line) { |
||||
super(lineNumber, line); |
||||
} |
||||
|
||||
public MatDefBlock(Statement sta) { |
||||
this(sta.getLineNumber(), sta.getLine()); |
||||
for (Statement statement : sta.getContents()) { |
||||
if (statement.getLine().trim().startsWith("MaterialParameters")) { |
||||
addStatement(new MaterialParametersBlock(statement)); |
||||
} else if (statement.getLine().trim().startsWith("Technique")) { |
||||
addStatement(new TechniqueBlock(statement)); |
||||
} else { |
||||
addStatement(new UnsupportedStatement(statement)); |
||||
} |
||||
} |
||||
String[] s = line.split("\\s"); |
||||
name = s[1]; |
||||
} |
||||
|
||||
public String getName() { |
||||
return name; |
||||
} |
||||
|
||||
public void setName(String name) { |
||||
String oldName = this.name; |
||||
this.name = name; |
||||
line = "MaterialDef " + name; |
||||
fire("name", oldName, name); |
||||
} |
||||
|
||||
protected MaterialParametersBlock getMaterialParameters() { |
||||
return getBlock(MaterialParametersBlock.class); |
||||
} |
||||
|
||||
public List<MatParamBlock> getMatParams() { |
||||
return getMaterialParameters().getMatParams(); |
||||
} |
||||
|
||||
public void addMatParam(MatParamBlock matParam) { |
||||
MaterialParametersBlock mpBlock = getMaterialParameters(); |
||||
if (mpBlock == null) { |
||||
mpBlock = new MaterialParametersBlock(0, "MaterialParameters"); |
||||
addStatement(0, mpBlock); |
||||
} |
||||
mpBlock.addMatParam(matParam); |
||||
fire(ADD_MAT_PARAM, null, matParam); |
||||
} |
||||
|
||||
public void removeMatParam(MatParamBlock matParam) { |
||||
MaterialParametersBlock mpBlock = getMaterialParameters(); |
||||
if (mpBlock == null) { |
||||
return; |
||||
} |
||||
mpBlock.removeMatParam(matParam); |
||||
|
||||
for (TechniqueBlock techniqueBlock : getTechniques()) { |
||||
VertexShaderNodesBlock vblock = techniqueBlock.getBlock(VertexShaderNodesBlock.class); |
||||
FragmentShaderNodesBlock fblock = techniqueBlock.getBlock(FragmentShaderNodesBlock.class); |
||||
techniqueBlock.cleanMappings(vblock, "MatParam", matParam.getName()); |
||||
techniqueBlock.cleanMappings(fblock, "MatParam", matParam.getName()); |
||||
} |
||||
fire(REMOVE_MAT_PARAM, null, matParam); |
||||
} |
||||
|
||||
public List<TechniqueBlock> getTechniques() { |
||||
return getBlocks(TechniqueBlock.class); |
||||
} |
||||
|
||||
public void addTechnique(TechniqueBlock techniqueBlock) { |
||||
addStatement(techniqueBlock); |
||||
fire("technique", null, techniqueBlock); |
||||
} |
||||
} |
@ -0,0 +1,40 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.fileStructure; |
||||
|
||||
import com.jme3.gde.materialdefinition.fileStructure.leaves.MatParamBlock; |
||||
import com.jme3.util.blockparser.Statement; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public class MaterialParametersBlock extends UberStatement { |
||||
|
||||
protected MaterialParametersBlock(int lineNumber, String line) { |
||||
super(lineNumber, line); |
||||
} |
||||
|
||||
public MaterialParametersBlock(Statement sta) { |
||||
this(sta.getLineNumber(), sta.getLine()); |
||||
for (Statement statement : sta.getContents()) { |
||||
addStatement(new MatParamBlock(statement)); |
||||
} |
||||
} |
||||
|
||||
public List<MatParamBlock> getMatParams() { |
||||
return getBlocks(MatParamBlock.class); |
||||
} |
||||
|
||||
public void addMatParam(MatParamBlock matParam){ |
||||
addStatement(matParam); |
||||
} |
||||
|
||||
public void removeMatParam(MatParamBlock matParam){ |
||||
contents.remove(matParam); |
||||
} |
||||
} |
@ -0,0 +1,39 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.fileStructure; |
||||
|
||||
import com.jme3.gde.materialdefinition.fileStructure.leaves.OutputMappingBlock; |
||||
import com.jme3.util.blockparser.Statement; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public class OutputMappingsBlock extends UberStatement { |
||||
|
||||
protected OutputMappingsBlock(int lineNumber, String line) { |
||||
super(lineNumber, line); |
||||
} |
||||
|
||||
public OutputMappingsBlock(Statement sta, String nodeName) { |
||||
this(sta.getLineNumber(), sta.getLine()); |
||||
for (Statement statement : sta.getContents()) { |
||||
addStatement(new OutputMappingBlock(statement, nodeName)); |
||||
} |
||||
} |
||||
|
||||
public List<OutputMappingBlock> getMappings() { |
||||
return getBlocks(OutputMappingBlock.class); |
||||
} |
||||
|
||||
public void addMapping(OutputMappingBlock mapping) { |
||||
addStatement(mapping); |
||||
} |
||||
|
||||
public void removeMapping(OutputMappingBlock mapping) { |
||||
contents.remove(mapping); |
||||
} |
||||
} |
@ -0,0 +1,250 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.fileStructure; |
||||
|
||||
import com.jme3.gde.materialdefinition.fileStructure.leaves.ConditionBlock; |
||||
import com.jme3.gde.materialdefinition.fileStructure.leaves.DefinitionBlock; |
||||
import com.jme3.gde.materialdefinition.fileStructure.leaves.InputMappingBlock; |
||||
import com.jme3.gde.materialdefinition.fileStructure.leaves.OutputMappingBlock; |
||||
import com.jme3.shader.ShaderNodeDefinition; |
||||
import com.jme3.util.blockparser.Statement; |
||||
import java.beans.PropertyChangeEvent; |
||||
import java.beans.PropertyChangeListener; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public class ShaderNodeBlock extends UberStatement implements Comparable<ShaderNodeBlock>, PropertyChangeListener { |
||||
|
||||
public final static String POSITION = "position"; |
||||
public final static String INPUT = "input"; |
||||
public final static String OUTPUT = "output"; |
||||
public static final String ADD_MAPPING = "addMapping"; |
||||
public static final String REMOVE_MAPPING = "removeMapping"; |
||||
protected String name; |
||||
//built up data for fast sorting
|
||||
protected int spatialOrder; |
||||
protected List<String> inputNodes = new ArrayList<String>(); |
||||
protected boolean globalInput = false; |
||||
protected boolean globalOutput = false; |
||||
|
||||
protected ShaderNodeBlock(int lineNumber, String line) { |
||||
super(lineNumber, line); |
||||
} |
||||
|
||||
public ShaderNodeBlock(Statement sta) { |
||||
this(sta.getLineNumber(), sta.getLine()); |
||||
String[] s = line.split("\\s"); |
||||
name = s[1]; |
||||
for (Statement statement : sta.getContents()) { |
||||
if (statement.getLine().trim().startsWith("Definition")) { |
||||
addStatement(new DefinitionBlock(statement)); |
||||
} else if (statement.getLine().trim().startsWith("Condition")) { |
||||
addStatement(new ConditionBlock(statement)); |
||||
} else if (statement.getLine().trim().startsWith("InputMapping")) { |
||||
addStatement(new InputMappingsBlock(statement, name)); |
||||
} else if (statement.getLine().trim().startsWith("OutputMapping")) { |
||||
addStatement(new OutputMappingsBlock(statement, name)); |
||||
} else { |
||||
addStatement(statement); |
||||
} |
||||
} |
||||
|
||||
} |
||||
|
||||
public ShaderNodeBlock(ShaderNodeDefinition def, String path) { |
||||
super(0, "ShaderNode " + def.getName()); |
||||
name = def.getName(); |
||||
DefinitionBlock b = new DefinitionBlock(name, path); |
||||
addStatement(0, b); |
||||
} |
||||
|
||||
public String getName() { |
||||
return name; |
||||
} |
||||
|
||||
public void setName(String name) { |
||||
String oldName = this.name; |
||||
this.name = name; |
||||
line = "ShaderNode " + name; |
||||
fire("name", oldName, name); |
||||
} |
||||
|
||||
public void setSpatialOrder(int spatialOrder) { |
||||
this.spatialOrder = spatialOrder; |
||||
} |
||||
|
||||
public void addInputNode(String name) { |
||||
if (!inputNodes.contains(name)) { |
||||
inputNodes.add(name); |
||||
} |
||||
} |
||||
|
||||
public void setGlobalInput(boolean globalInput) { |
||||
this.globalInput = globalInput; |
||||
} |
||||
|
||||
public void setGlobalOutput(boolean globalOutput) { |
||||
this.globalOutput = globalOutput; |
||||
} |
||||
|
||||
public DefinitionBlock getDefinition() { |
||||
return getBlock(DefinitionBlock.class); |
||||
} |
||||
|
||||
public void setDefinition(String name, String path) { |
||||
DefinitionBlock b = getDefinition(); |
||||
|
||||
if (b == null) { |
||||
b = new DefinitionBlock(name, path); |
||||
addStatement(0, b); |
||||
} else { |
||||
b.setName(name); |
||||
b.setPath(path); |
||||
} |
||||
fire("definition", null, b); |
||||
} |
||||
|
||||
public String getCondition() { |
||||
ConditionBlock b = getBlock(ConditionBlock.class); |
||||
if (b == null) { |
||||
return null; |
||||
} |
||||
return b.getCondition(); |
||||
} |
||||
|
||||
public void setCondition(String condition) { |
||||
ConditionBlock b = getBlock(ConditionBlock.class); |
||||
String prevCond = null; |
||||
if (condition.trim().length() == 0 || condition.equals("<null value>")) { |
||||
condition = null; |
||||
} |
||||
if (b == null) { |
||||
if (condition == null) { |
||||
return; |
||||
} |
||||
b = new ConditionBlock(condition); |
||||
addStatement(b); |
||||
} else { |
||||
if (condition == null) { |
||||
contents.remove(b); |
||||
} |
||||
prevCond = b.getCondition(); |
||||
b.setCondition(condition); |
||||
} |
||||
fire("condition", prevCond, condition); |
||||
} |
||||
|
||||
public List<InputMappingBlock> getInputs() { |
||||
InputMappingsBlock b = getBlock(InputMappingsBlock.class); |
||||
if (b == null) { |
||||
return null; |
||||
} |
||||
return b.getMappings(); |
||||
} |
||||
|
||||
public List<OutputMappingBlock> getOutputs() { |
||||
OutputMappingsBlock b = getBlock(OutputMappingsBlock.class); |
||||
if (b == null) { |
||||
return null; |
||||
} |
||||
return b.getMappings(); |
||||
} |
||||
|
||||
public void addInputMapping(InputMappingBlock mapping) { |
||||
InputMappingsBlock b = getBlock(InputMappingsBlock.class); |
||||
if (b == null) { |
||||
b = new InputMappingsBlock(0, "InputMappings"); |
||||
addStatement(b); |
||||
} |
||||
b.addMapping(mapping); |
||||
fire(ADD_MAPPING, null, mapping); |
||||
} |
||||
|
||||
public void addOutputMapping(OutputMappingBlock mapping) { |
||||
OutputMappingsBlock b = getBlock(OutputMappingsBlock.class); |
||||
if (b == null) { |
||||
b = new OutputMappingsBlock(0, "OutputMappings"); |
||||
addStatement(b); |
||||
} |
||||
b.addMapping(mapping); |
||||
fire(ADD_MAPPING, null, mapping); |
||||
} |
||||
|
||||
public void removeInputMapping(InputMappingBlock mapping) { |
||||
InputMappingsBlock b = getBlock(InputMappingsBlock.class); |
||||
if (b != null) { |
||||
b.removeMapping(mapping); |
||||
} |
||||
fire(REMOVE_MAPPING, mapping, null); |
||||
} |
||||
|
||||
public void removeOutputMapping(OutputMappingBlock mapping) { |
||||
OutputMappingsBlock b = getBlock(OutputMappingsBlock.class); |
||||
if (b != null) { |
||||
b.removeMapping(mapping); |
||||
} |
||||
fire(REMOVE_MAPPING, mapping, null); |
||||
} |
||||
|
||||
public int compareTo(ShaderNodeBlock o) { |
||||
if (inputNodes.contains(o.getName())) { |
||||
return 1; |
||||
} |
||||
if (o.inputNodes.contains(name)) { |
||||
return -1; |
||||
} |
||||
if ((globalInput && o.globalOutput) || (o.globalInput && globalOutput)) { |
||||
return (int) Math.signum(spatialOrder - o.spatialOrder); |
||||
} |
||||
return 0; |
||||
} |
||||
|
||||
public void propertyChange(PropertyChangeEvent evt) { |
||||
if (evt.getPropertyName().equals(POSITION)) { |
||||
spatialOrder = (Integer) evt.getNewValue(); |
||||
fire("order", null, null); |
||||
} else if (evt.getPropertyName().equals(INPUT)) { |
||||
InputMappingBlock mapping = (InputMappingBlock) evt.getNewValue(); |
||||
if (mapping != null) { |
||||
if (mapping.getRightNameSpace().equals("Global")) { |
||||
globalInput = true; |
||||
} else { |
||||
inputNodes.add(mapping.getRightNameSpace()); |
||||
} |
||||
addInputMapping(mapping); |
||||
} else { |
||||
InputMappingBlock oldMapping = (InputMappingBlock) evt.getOldValue(); |
||||
if (oldMapping.getRightNameSpace().equals("Global")) { |
||||
globalInput = false; |
||||
} else { |
||||
inputNodes.remove(oldMapping.getRightNameSpace()); |
||||
} |
||||
removeInputMapping(oldMapping); |
||||
} |
||||
fire("order", null, null); |
||||
|
||||
} else if (evt.getPropertyName().equals(OUTPUT)) { |
||||
OutputMappingBlock mapping = (OutputMappingBlock) evt.getNewValue(); |
||||
if (mapping != null) { |
||||
if (mapping.getLeftNameSpace().equals("Global")) { |
||||
globalOutput = true; |
||||
} |
||||
addOutputMapping(mapping); |
||||
} else { |
||||
OutputMappingBlock oldMapping = (OutputMappingBlock) evt.getOldValue(); |
||||
|
||||
if (oldMapping.getLeftNameSpace().equals("Global")) { |
||||
globalOutput = false; |
||||
} |
||||
removeOutputMapping(oldMapping); |
||||
} |
||||
fire("order", null, null); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,59 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.fileStructure; |
||||
|
||||
import com.jme3.util.blockparser.Statement; |
||||
import java.beans.PropertyChangeEvent; |
||||
import java.beans.PropertyChangeListener; |
||||
import java.util.Collections; |
||||
import java.util.List; |
||||
import org.openide.util.WeakListeners; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public class ShaderNodesBlock extends UberStatement implements PropertyChangeListener { |
||||
|
||||
protected ShaderNodesBlock(int lineNumber, String line) { |
||||
super(lineNumber, line); |
||||
} |
||||
|
||||
public ShaderNodesBlock(Statement sta) { |
||||
this(sta.getLineNumber(), sta.getLine()); |
||||
for (Statement statement : sta.getContents()) { |
||||
ShaderNodeBlock b = new ShaderNodeBlock(statement); |
||||
b.addPropertyChangeListener(WeakListeners.propertyChange(this, b)); |
||||
addStatement(b); |
||||
} |
||||
} |
||||
|
||||
public List<ShaderNodeBlock> getShaderNodes() { |
||||
return getBlocks(ShaderNodeBlock.class); |
||||
} |
||||
|
||||
public void addShaderNode(ShaderNodeBlock shaderNodeBlock) { |
||||
addStatement(shaderNodeBlock); |
||||
shaderNodeBlock.addPropertyChangeListener(WeakListeners.propertyChange(this, shaderNodeBlock)); |
||||
} |
||||
|
||||
public boolean removeShaderNode(ShaderNodeBlock shaderNodeBlock) { |
||||
return contents.remove(shaderNodeBlock); |
||||
} |
||||
|
||||
public void propertyChange(PropertyChangeEvent evt) { |
||||
if (evt.getPropertyName().equals("order")) { |
||||
sort(); |
||||
} |
||||
} |
||||
|
||||
public void sort() { |
||||
List<ShaderNodeBlock> list = getShaderNodes(); |
||||
Collections.sort(list); |
||||
contents.clear(); |
||||
contents.addAll(list); |
||||
fire("reorder", null, null); |
||||
} |
||||
} |
@ -0,0 +1,239 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.fileStructure; |
||||
|
||||
import com.jme3.gde.materialdefinition.fileStructure.leaves.FragmentShaderFileBlock; |
||||
import com.jme3.gde.materialdefinition.fileStructure.leaves.InputMappingBlock; |
||||
import com.jme3.gde.materialdefinition.fileStructure.leaves.LightModeBlock; |
||||
import com.jme3.gde.materialdefinition.fileStructure.leaves.MatParamBlock; |
||||
import com.jme3.gde.materialdefinition.fileStructure.leaves.ShaderFileBlock; |
||||
import com.jme3.gde.materialdefinition.fileStructure.leaves.UnsupportedStatement; |
||||
import com.jme3.gde.materialdefinition.fileStructure.leaves.VertexShaderFileBlock; |
||||
import com.jme3.gde.materialdefinition.fileStructure.leaves.WorldParamBlock; |
||||
import com.jme3.util.blockparser.Statement; |
||||
import java.beans.PropertyChangeListener; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
import org.openide.util.WeakListeners; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public class TechniqueBlock extends UberStatement { |
||||
|
||||
public static final String ADD_SHADER_NODE = "addShaderNode"; |
||||
public static final String REMOVE_SHADER_NODE = "removeShaderNode"; |
||||
public static final String ADD_WORLD_PARAM = "addWorldParam"; |
||||
public static final String REMOVE_WORLD_PARAM = "removeWorldParam"; |
||||
protected String name; |
||||
|
||||
protected TechniqueBlock(int lineNumber, String line) { |
||||
super(lineNumber, line); |
||||
} |
||||
|
||||
public TechniqueBlock(Statement sta) { |
||||
this(sta.getLineNumber(), sta.getLine()); |
||||
for (Statement statement : sta.getContents()) { |
||||
if (statement.getLine().trim().startsWith("WorldParameters")) { |
||||
addStatement(new WorldParametersBlock(statement)); |
||||
} else if (statement.getLine().trim().startsWith("LightMode")) { |
||||
addStatement(new LightModeBlock(statement)); |
||||
} else if (statement.getLine().trim().startsWith("VertexShader ")) { |
||||
addStatement(new VertexShaderFileBlock(statement)); |
||||
} else if (statement.getLine().trim().startsWith("FragmentShader ")) { |
||||
addStatement(new FragmentShaderFileBlock(statement)); |
||||
} else if (statement.getLine().trim().startsWith("VertexShaderNodes")) { |
||||
addStatement(new VertexShaderNodesBlock(statement)); |
||||
} else if (statement.getLine().trim().startsWith("FragmentShaderNodes")) { |
||||
addStatement(new FragmentShaderNodesBlock(statement)); |
||||
} else { |
||||
addStatement(new UnsupportedStatement(statement)); |
||||
} |
||||
} |
||||
String[] s = line.split("\\s"); |
||||
if (s.length == 1) { |
||||
name = "Default"; |
||||
} else { |
||||
name = s[1]; |
||||
} |
||||
} |
||||
|
||||
public String getName() { |
||||
return name; |
||||
} |
||||
|
||||
public void setName(String name) { |
||||
String oldName = this.name; |
||||
this.name = name; |
||||
line = "Technique " + (name.equals("Default") ? "" : name); |
||||
fire("name", oldName, name); |
||||
} |
||||
|
||||
public String getLightMode() { |
||||
LightModeBlock l = getBlock(LightModeBlock.class); |
||||
if (l == null) { |
||||
return null; |
||||
} |
||||
return l.getLightMode(); |
||||
} |
||||
|
||||
public void setLightMode(String lightMode) { |
||||
String oldLightMode = null; |
||||
LightModeBlock l = getBlock(LightModeBlock.class); |
||||
if (l == null) { |
||||
l = new LightModeBlock(lightMode); |
||||
addStatement(0, l); |
||||
} else { |
||||
oldLightMode = l.getLightMode(); |
||||
l.setLightMode(lightMode); |
||||
} |
||||
fire("lightMode", oldLightMode, lightMode); |
||||
} |
||||
|
||||
protected WorldParametersBlock getWorldParameters() { |
||||
return getBlock(WorldParametersBlock.class); |
||||
} |
||||
|
||||
public List<WorldParamBlock> getWorldParams() { |
||||
return getWorldParameters().getWorldParams(); |
||||
} |
||||
|
||||
public void addWorldParam(WorldParamBlock block) { |
||||
WorldParametersBlock wpBlock = getBlock(WorldParametersBlock.class); |
||||
if (wpBlock == null) { |
||||
wpBlock = new WorldParametersBlock(0, "WorldParameters"); |
||||
addStatement(0, wpBlock); |
||||
} |
||||
wpBlock.addWorldParam(block); |
||||
fire(ADD_WORLD_PARAM, null, block); |
||||
} |
||||
|
||||
public void addVertexShaderNode(ShaderNodeBlock block) { |
||||
VertexShaderNodesBlock vblock = getBlock(VertexShaderNodesBlock.class); |
||||
|
||||
if (vblock == null) { |
||||
vblock = new VertexShaderNodesBlock(0, "VertexShaderNodes "); |
||||
addStatement(0, vblock); |
||||
} |
||||
vblock.addShaderNode(block); |
||||
fire(ADD_SHADER_NODE, null, block); |
||||
} |
||||
|
||||
public void addFragmentShaderNode(ShaderNodeBlock block) { |
||||
FragmentShaderNodesBlock fblock = getBlock(FragmentShaderNodesBlock.class); |
||||
|
||||
if (fblock == null) { |
||||
fblock = new FragmentShaderNodesBlock(0, "FragmentShaderNodes "); |
||||
addStatement(0, fblock); |
||||
} |
||||
fblock.addShaderNode(block); |
||||
fire(ADD_SHADER_NODE, null, block); |
||||
} |
||||
|
||||
public void removeShaderNode(ShaderNodeBlock block) { |
||||
VertexShaderNodesBlock vblock = getBlock(VertexShaderNodesBlock.class); |
||||
FragmentShaderNodesBlock fblock = getBlock(FragmentShaderNodesBlock.class); |
||||
boolean removed = false; |
||||
String eventToFire = null; |
||||
if (vblock != null) { |
||||
removed = vblock.removeShaderNode(block); |
||||
eventToFire = REMOVE_SHADER_NODE; |
||||
} |
||||
if (fblock != null) { |
||||
if (!removed) { |
||||
removed = fblock.removeShaderNode(block); |
||||
eventToFire = REMOVE_SHADER_NODE; |
||||
} |
||||
} |
||||
|
||||
if (removed) { |
||||
cleanMappings(vblock, block); |
||||
cleanMappings(fblock, block); |
||||
} |
||||
|
||||
if (eventToFire != null) { |
||||
fire(eventToFire, block, null); |
||||
} |
||||
} |
||||
|
||||
public void removeWorldParam(WorldParamBlock worldParam) { |
||||
WorldParametersBlock wpBlock = getWorldParameters(); |
||||
if (wpBlock == null) { |
||||
return; |
||||
} |
||||
wpBlock.removeWorldParam(worldParam); |
||||
|
||||
VertexShaderNodesBlock vblock = getBlock(VertexShaderNodesBlock.class); |
||||
FragmentShaderNodesBlock fblock = getBlock(FragmentShaderNodesBlock.class); |
||||
cleanMappings(vblock, "WorldParam", worldParam.getName()); |
||||
cleanMappings(fblock, "WorldParam", worldParam.getName()); |
||||
|
||||
fire(REMOVE_WORLD_PARAM, null, worldParam); |
||||
} |
||||
|
||||
public List<ShaderNodeBlock> getShaderNodes() { |
||||
List<ShaderNodeBlock> list = new ArrayList<ShaderNodeBlock>(); |
||||
list.addAll(getBlock(VertexShaderNodesBlock.class).getShaderNodes()); |
||||
list.addAll(getBlock(FragmentShaderNodesBlock.class).getShaderNodes()); |
||||
return list; |
||||
} |
||||
|
||||
public ShaderFileBlock getVertexShader() { |
||||
return getBlock(VertexShaderFileBlock.class); |
||||
} |
||||
|
||||
public ShaderFileBlock getFragmentShader() { |
||||
return getBlock(FragmentShaderFileBlock.class); |
||||
} |
||||
|
||||
@Override |
||||
public void addPropertyChangeListener(PropertyChangeListener pcl) { |
||||
super.addPropertyChangeListener(pcl); |
||||
VertexShaderNodesBlock vblock = getBlock(VertexShaderNodesBlock.class); |
||||
if (vblock != null) { |
||||
vblock.addPropertyChangeListener(WeakListeners.propertyChange(pcl, vblock)); |
||||
} |
||||
FragmentShaderNodesBlock fblock = getBlock(FragmentShaderNodesBlock.class); |
||||
if (fblock != null) { |
||||
fblock.addPropertyChangeListener(WeakListeners.propertyChange(pcl, fblock)); |
||||
} |
||||
} |
||||
|
||||
private void cleanMappings(ShaderNodesBlock vblock, ShaderNodeBlock block) { |
||||
if (vblock != null) { |
||||
for (ShaderNodeBlock shaderNodeBlock : vblock.getShaderNodes()) { |
||||
List<InputMappingBlock> lInput = shaderNodeBlock.getInputs(); |
||||
if (lInput != null) { |
||||
for (InputMappingBlock inputMappingBlock : lInput) { |
||||
if (inputMappingBlock.getRightNameSpace().equals(block.getName())) { |
||||
shaderNodeBlock.removeInputMapping(inputMappingBlock); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
protected void cleanMappings(ShaderNodesBlock vblock, String nameSpace, String name) { |
||||
if (vblock != null) { |
||||
for (ShaderNodeBlock shaderNodeBlock : vblock.getShaderNodes()) { |
||||
List<InputMappingBlock> lInput = shaderNodeBlock.getInputs(); |
||||
if (lInput != null) { |
||||
for (InputMappingBlock inputMappingBlock : lInput) { |
||||
if (inputMappingBlock.getRightNameSpace().equals(nameSpace) && inputMappingBlock.getRightVar().equals(name)) { |
||||
shaderNodeBlock.removeInputMapping(inputMappingBlock); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
public void cleanupMappings(String nameSpace, String name) { |
||||
cleanMappings(getBlock(VertexShaderNodesBlock.class), nameSpace, name); |
||||
cleanMappings(getBlock(FragmentShaderNodesBlock.class), nameSpace, name); |
||||
} |
||||
} |
@ -0,0 +1,61 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.fileStructure; |
||||
|
||||
import com.jme3.util.blockparser.Statement; |
||||
import java.beans.PropertyChangeEvent; |
||||
import java.beans.PropertyChangeListener; |
||||
import java.util.ArrayList; |
||||
import java.util.Collections; |
||||
import java.util.LinkedList; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public class UberStatement extends Statement { |
||||
|
||||
private List listeners = Collections.synchronizedList(new LinkedList()); |
||||
|
||||
public void addPropertyChangeListener(PropertyChangeListener pcl) { |
||||
listeners.add(pcl); |
||||
} |
||||
|
||||
public void removePropertyChangeListener(PropertyChangeListener pcl) { |
||||
listeners.remove(pcl); |
||||
} |
||||
|
||||
protected void fire(String propertyName, Object old, Object nue) { |
||||
//Passing 0 below on purpose, so you only synchronize for one atomic call:
|
||||
PropertyChangeListener[] pcls = (PropertyChangeListener[]) listeners.toArray(new PropertyChangeListener[0]); |
||||
for (int i = 0; i < pcls.length; i++) { |
||||
pcls[i].propertyChange(new PropertyChangeEvent(this, propertyName, old, nue)); |
||||
} |
||||
} |
||||
|
||||
public UberStatement(int lineNumber, String line) { |
||||
super(lineNumber, line); |
||||
} |
||||
|
||||
protected <T extends Statement> T getBlock(Class<T> blockType) { |
||||
for (Statement statement : contents) { |
||||
if (statement.getClass().isAssignableFrom(blockType)) { |
||||
return (T) statement; |
||||
} |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
protected <T extends Statement> List<T> getBlocks(Class<T> blockType) { |
||||
List<T> blocks = new ArrayList<T>(); |
||||
for (Statement statement : contents) { |
||||
if (statement.getClass().isAssignableFrom(blockType)) { |
||||
blocks.add((T) statement); |
||||
} |
||||
} |
||||
return blocks; |
||||
} |
||||
} |
@ -0,0 +1,23 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.fileStructure; |
||||
|
||||
import com.jme3.util.blockparser.Statement; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public class VertexShaderNodesBlock extends ShaderNodesBlock { |
||||
|
||||
public VertexShaderNodesBlock(int lineNumber, String line) { |
||||
super(lineNumber, line); |
||||
} |
||||
|
||||
public VertexShaderNodesBlock(Statement sta) { |
||||
super(sta); |
||||
} |
||||
} |
||||
|
@ -0,0 +1,39 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.fileStructure; |
||||
|
||||
import com.jme3.gde.materialdefinition.fileStructure.leaves.WorldParamBlock; |
||||
import com.jme3.util.blockparser.Statement; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public class WorldParametersBlock extends UberStatement { |
||||
|
||||
protected WorldParametersBlock(int lineNumber, String line) { |
||||
super(lineNumber, line); |
||||
} |
||||
|
||||
public WorldParametersBlock(Statement sta) { |
||||
this(sta.getLineNumber(), sta.getLine()); |
||||
for (Statement statement : sta.getContents()) { |
||||
addStatement(new WorldParamBlock(statement)); |
||||
} |
||||
} |
||||
|
||||
public List<WorldParamBlock> getWorldParams() { |
||||
return getBlocks(WorldParamBlock.class); |
||||
} |
||||
|
||||
public void addWorldParam(WorldParamBlock block) { |
||||
contents.add(block); |
||||
} |
||||
|
||||
public void removeWorldParam(WorldParamBlock block) { |
||||
contents.remove(block); |
||||
} |
||||
} |
@ -0,0 +1,57 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.fileStructure.leaves; |
||||
|
||||
import com.jme3.util.blockparser.Statement; |
||||
import java.util.logging.Level; |
||||
import java.util.logging.Logger; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public class ConditionBlock extends LeafStatement { |
||||
|
||||
protected String condition; |
||||
|
||||
protected ConditionBlock(int lineNumber, String line) { |
||||
super(lineNumber, line); |
||||
} |
||||
|
||||
public ConditionBlock(Statement sta) { |
||||
this(sta.getLineNumber(), sta.getLine()); |
||||
parse(sta); |
||||
updateLine(); |
||||
} |
||||
|
||||
public ConditionBlock(String condition) { |
||||
super(0, ""); |
||||
this.condition = condition; |
||||
updateLine(); |
||||
} |
||||
|
||||
private void updateLine() { |
||||
this.line = "Condition : " + condition; |
||||
} |
||||
|
||||
public String getCondition() { |
||||
return condition; |
||||
} |
||||
|
||||
public void setCondition(String condition) { |
||||
this.condition = condition; |
||||
updateLine(); |
||||
} |
||||
|
||||
private void parse(Statement sta) { |
||||
try { |
||||
String[] split = sta.getLine().split(":"); |
||||
condition = split[1].trim(); |
||||
|
||||
} catch (ArrayIndexOutOfBoundsException e) { |
||||
Logger.getLogger(ConditionBlock.class.getName()).log(Level.WARNING, "Parsing error line " + sta.getLineNumber() + " : " + sta.getLine()); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,72 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.fileStructure.leaves; |
||||
|
||||
import com.jme3.util.blockparser.Statement; |
||||
import java.util.logging.Level; |
||||
import java.util.logging.Logger; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public class DefinitionBlock extends LeafStatement { |
||||
|
||||
protected String name; |
||||
protected String path; |
||||
|
||||
protected DefinitionBlock(int lineNumber, String line) { |
||||
super(lineNumber, line); |
||||
} |
||||
|
||||
public DefinitionBlock(Statement sta) { |
||||
this(sta.getLineNumber(), sta.getLine()); |
||||
parse(sta); |
||||
updateLine(); |
||||
} |
||||
|
||||
public DefinitionBlock(String name, String path) { |
||||
super(0, ""); |
||||
this.name = name; |
||||
this.path = path; |
||||
updateLine(); |
||||
} |
||||
|
||||
private void updateLine() { |
||||
this.line = "Definition : " + name + (path == null ? "" : " : " + path); |
||||
} |
||||
|
||||
public String getName() { |
||||
return name; |
||||
} |
||||
|
||||
public void setName(String name) { |
||||
this.name = name; |
||||
updateLine(); |
||||
} |
||||
|
||||
public String getPath() { |
||||
return path; |
||||
} |
||||
|
||||
public void setPath(String path) { |
||||
this.path = path; |
||||
updateLine(); |
||||
} |
||||
|
||||
private void parse(Statement sta) { |
||||
try { |
||||
String[] split = sta.getLine().split(":"); |
||||
if (split.length > 2) { |
||||
path = split[2].trim(); |
||||
} |
||||
name = split[1].trim(); |
||||
|
||||
|
||||
} catch (ArrayIndexOutOfBoundsException e) { |
||||
Logger.getLogger(DefinitionBlock.class.getName()).log(Level.WARNING, "Parsing error line " + sta.getLineNumber() + " : " + sta.getLine()); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,32 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.fileStructure.leaves; |
||||
|
||||
import com.jme3.util.blockparser.Statement; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public class FragmentShaderFileBlock extends ShaderFileBlock { |
||||
|
||||
public FragmentShaderFileBlock(int lineNumber, String line) { |
||||
super(lineNumber, line); |
||||
} |
||||
|
||||
public FragmentShaderFileBlock(Statement sta) { |
||||
super(sta); |
||||
} |
||||
|
||||
public FragmentShaderFileBlock(String language, String path, int lineNumber, String line) { |
||||
super(language, path, lineNumber, line); |
||||
} |
||||
|
||||
@Override |
||||
protected void updateLine() { |
||||
super.updateLine(); |
||||
line = "Fragment" + line; |
||||
} |
||||
} |
@ -0,0 +1,69 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.fileStructure.leaves; |
||||
|
||||
import com.jme3.util.blockparser.Statement; |
||||
import java.util.logging.Level; |
||||
import java.util.logging.Logger; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public class InputMappingBlock extends MappingBlock { |
||||
|
||||
protected InputMappingBlock(int lineNumber, String line) { |
||||
super(lineNumber, line); |
||||
} |
||||
|
||||
public InputMappingBlock(Statement sta, String name) { |
||||
this(sta.getLineNumber(), sta.getLine()); |
||||
parse(sta); |
||||
leftNameSpace = name; |
||||
updateLine(); |
||||
} |
||||
|
||||
public InputMappingBlock(String leftVar, String rightVar, String leftVarSwizzle, String rightVarSwizzle, String leftNameSpace,String rightNameSpace, String condition) { |
||||
super(0, ""); |
||||
this.leftVar = leftVar; |
||||
this.rightVar = rightVar; |
||||
this.leftVarSwizzle = leftVarSwizzle; |
||||
this.leftNameSpace = leftNameSpace; |
||||
this.rightVarSwizzle = rightVarSwizzle; |
||||
this.rightNameSpace = rightNameSpace; |
||||
this.condition = condition; |
||||
updateLine(); |
||||
} |
||||
|
||||
@Override |
||||
protected final void updateLine() { |
||||
this.line = leftVar + (leftVarSwizzle == null ? "" : "." + leftVarSwizzle) + " = " + rightNameSpace + "." + rightVar + (rightVarSwizzle == null ? "" : "." + rightVarSwizzle) + (condition != null ? " : " + condition : ""); |
||||
} |
||||
|
||||
private void parse(Statement sta) { |
||||
try { |
||||
String[] split = sta.getLine().split(":"); |
||||
if (split.length > 1) { |
||||
condition = split[1].trim(); |
||||
} |
||||
String mapping = split[0].trim(); |
||||
String[] s = mapping.split("="); |
||||
String[] left = s[0].split("\\."); |
||||
leftVar = left[0].trim(); |
||||
if (left.length > 1) { |
||||
leftVarSwizzle = left[1].trim(); |
||||
} |
||||
String[] right = s[1].split("\\."); |
||||
rightNameSpace = right[0].trim(); |
||||
rightVar = right[1].trim(); |
||||
if (right.length > 2) { |
||||
rightVarSwizzle = right[2].trim(); |
||||
} |
||||
|
||||
} catch (ArrayIndexOutOfBoundsException e) { |
||||
Logger.getLogger(InputMappingBlock.class.getName()).log(Level.WARNING, "Parsing error line " + sta.getLineNumber() + " : " + sta.getLine()); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,42 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.fileStructure.leaves; |
||||
|
||||
import com.jme3.util.blockparser.Statement; |
||||
import java.beans.PropertyChangeEvent; |
||||
import java.beans.PropertyChangeListener; |
||||
import java.util.Collections; |
||||
import java.util.LinkedList; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public class LeafStatement extends Statement { |
||||
|
||||
private List listeners = Collections.synchronizedList(new LinkedList()); |
||||
|
||||
public void addPropertyChangeListener(PropertyChangeListener pcl) { |
||||
listeners.add(pcl); |
||||
} |
||||
|
||||
public void removePropertyChangeListener(PropertyChangeListener pcl) { |
||||
listeners.remove(pcl); |
||||
} |
||||
|
||||
protected void fire(String propertyName, Object old, Object nue) { |
||||
//Passing 0 below on purpose, so you only synchronize for one atomic call:
|
||||
PropertyChangeListener[] pcls = (PropertyChangeListener[]) listeners.toArray(new PropertyChangeListener[0]); |
||||
for (int i = 0; i < pcls.length; i++) { |
||||
pcls[i].propertyChange(new PropertyChangeEvent(this, propertyName, old, nue)); |
||||
} |
||||
} |
||||
|
||||
public LeafStatement(int lineNumber, String line) { |
||||
super(lineNumber, line); |
||||
contents = null; |
||||
} |
||||
} |
@ -0,0 +1,62 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.fileStructure.leaves; |
||||
|
||||
import com.jme3.material.TechniqueDef; |
||||
import com.jme3.util.blockparser.Statement; |
||||
import java.util.logging.Level; |
||||
import java.util.logging.Logger; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public class LightModeBlock extends LeafStatement { |
||||
|
||||
protected String lightMode; |
||||
|
||||
protected LightModeBlock(int lineNumber, String line) { |
||||
super(lineNumber, line); |
||||
} |
||||
|
||||
public LightModeBlock(Statement sta) { |
||||
this(sta.getLineNumber(), sta.getLine()); |
||||
parse(sta); |
||||
updateLine(); |
||||
} |
||||
|
||||
public LightModeBlock(String lightMode) { |
||||
super(0, ""); |
||||
this.lightMode = lightMode; |
||||
updateLine(); |
||||
} |
||||
|
||||
private void updateLine() { |
||||
this.line = "LightMode " + lightMode; |
||||
} |
||||
|
||||
public String getLightMode() { |
||||
return lightMode; |
||||
} |
||||
|
||||
public void setLightMode(String lightMode) { |
||||
this.lightMode = lightMode; |
||||
updateLine(); |
||||
} |
||||
|
||||
private void parse(Statement sta) { |
||||
try { |
||||
String[] split = sta.getLine().split("\\s"); |
||||
lightMode = split[1].trim(); |
||||
|
||||
TechniqueDef.LightMode.valueOf(lightMode); |
||||
|
||||
} catch (ArrayIndexOutOfBoundsException e) { |
||||
Logger.getLogger(LightModeBlock.class.getName()).log(Level.WARNING, "Parsing error line " + sta.getLineNumber() + " : " + sta.getLine()); |
||||
} catch (IllegalArgumentException ex){ |
||||
Logger.getLogger(LightModeBlock.class.getName()).log(Level.WARNING, "Invalid light mode : " + sta.getLineNumber() + " : " + sta.getLine()); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,112 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.fileStructure.leaves; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public abstract class MappingBlock extends LeafStatement { |
||||
|
||||
protected String leftVar; |
||||
protected String rightVar; |
||||
protected String leftVarSwizzle; |
||||
protected String rightVarSwizzle; |
||||
protected String leftNameSpace; |
||||
protected String rightNameSpace; |
||||
protected String condition; |
||||
|
||||
public MappingBlock(int lineNumber, String line) { |
||||
super(lineNumber, line); |
||||
} |
||||
|
||||
protected abstract void updateLine(); |
||||
|
||||
public String getCondition() { |
||||
return condition; |
||||
} |
||||
|
||||
public void setCondition(String condition) { |
||||
String old = this.condition; |
||||
if (condition.trim().length() == 0 || condition.equals("<null value>")) { |
||||
condition = null; |
||||
} |
||||
this.condition = condition; |
||||
updateLine(); |
||||
fire("condition", old, condition); |
||||
} |
||||
|
||||
public String getLeftVar() { |
||||
return leftVar; |
||||
} |
||||
|
||||
public void setLeftVar(String leftVar) { |
||||
this.leftVar = leftVar; |
||||
updateLine(); |
||||
} |
||||
|
||||
public String getRightVar() { |
||||
return rightVar; |
||||
} |
||||
|
||||
public void setRightVar(String rightVar) { |
||||
this.rightVar = rightVar; |
||||
updateLine(); |
||||
} |
||||
|
||||
public String getRightNameSpace() { |
||||
return rightNameSpace; |
||||
} |
||||
|
||||
public void setRightNameSpace(String rightnameSpace) { |
||||
String old = this.rightNameSpace; |
||||
this.rightNameSpace = rightnameSpace; |
||||
updateLine(); |
||||
fire("rightNameSpace", old, rightnameSpace); |
||||
} |
||||
|
||||
public String getLeftVarSwizzle() { |
||||
return leftVarSwizzle; |
||||
} |
||||
|
||||
public void setLeftVarSwizzle(String leftVarSwizzle) { |
||||
String old = this.leftVarSwizzle; |
||||
if (leftVarSwizzle.trim().length() == 0) { |
||||
leftVarSwizzle = null; |
||||
} |
||||
this.leftVarSwizzle = leftVarSwizzle; |
||||
updateLine(); |
||||
fire("leftVarSwizzle", old, leftVarSwizzle); |
||||
} |
||||
|
||||
public String getRightVarSwizzle() { |
||||
return rightVarSwizzle; |
||||
} |
||||
|
||||
public void setRightVarSwizzle(String rightVarSwizzle) { |
||||
String old = this.rightVarSwizzle; |
||||
this.rightVarSwizzle = rightVarSwizzle; |
||||
if (rightVarSwizzle.trim().length() == 0) { |
||||
rightVarSwizzle = null; |
||||
} |
||||
this.rightVarSwizzle = rightVarSwizzle; |
||||
updateLine(); |
||||
fire("rightVarSwizzle", old, rightVarSwizzle); |
||||
} |
||||
|
||||
public String getLeftNameSpace() { |
||||
return leftNameSpace; |
||||
} |
||||
|
||||
public void setLeftNameSpace(String leftNameSpace) { |
||||
String old = this.leftNameSpace; |
||||
this.leftNameSpace = leftNameSpace; |
||||
updateLine(); |
||||
fire("leftNameSpace", old, leftNameSpace); |
||||
} |
||||
|
||||
|
||||
|
||||
} |
@ -0,0 +1,128 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.fileStructure.leaves; |
||||
|
||||
import com.jme3.util.blockparser.Statement; |
||||
import java.util.logging.Level; |
||||
import java.util.logging.Logger; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public class MatParamBlock extends LeafStatement { |
||||
|
||||
protected String type; |
||||
protected String name; |
||||
protected String fixedFuncBinding; |
||||
protected String defaultValue; |
||||
|
||||
protected MatParamBlock(int lineNumber, String line) { |
||||
super(lineNumber, line); |
||||
} |
||||
|
||||
public MatParamBlock(Statement sta) { |
||||
this(sta.getLineNumber(), sta.getLine()); |
||||
parse(sta); |
||||
updateLine(); |
||||
} |
||||
|
||||
public MatParamBlock(String type, String name, String fixedPipelineBinding, String defaultValue) { |
||||
super(0, ""); |
||||
this.type = type; |
||||
this.name = name; |
||||
this.fixedFuncBinding = fixedPipelineBinding; |
||||
this.defaultValue = defaultValue; |
||||
updateLine(); |
||||
} |
||||
|
||||
private void updateLine() { |
||||
this.line = type + " " + name + (fixedFuncBinding != null ? " (" + fixedFuncBinding + ") " : "") + (defaultValue != null ? " : " + defaultValue : ""); |
||||
} |
||||
|
||||
public String getType() { |
||||
return type; |
||||
} |
||||
|
||||
public void setType(String type) { |
||||
this.type = type; |
||||
updateLine(); |
||||
} |
||||
|
||||
public String getName() { |
||||
return name; |
||||
} |
||||
|
||||
public void setName(String name) { |
||||
this.name = name; |
||||
updateLine(); |
||||
} |
||||
|
||||
public String getFixedPipelineBinding() { |
||||
return fixedFuncBinding; |
||||
} |
||||
|
||||
public void setFixedPipelineBinding(String fixedPipelineBinding) { |
||||
this.fixedFuncBinding = fixedPipelineBinding; |
||||
updateLine(); |
||||
} |
||||
|
||||
public String getDefaultValue() { |
||||
return defaultValue; |
||||
} |
||||
|
||||
public void setDefaultValue(String defaultValue) { |
||||
this.defaultValue = defaultValue; |
||||
updateLine(); |
||||
} |
||||
|
||||
@Override |
||||
public boolean equals(Object obj) { |
||||
if(!(obj instanceof MatParamBlock)){ |
||||
return false; |
||||
} |
||||
return ((MatParamBlock)obj).getName().equals(name); |
||||
} |
||||
|
||||
@Override |
||||
public int hashCode() { |
||||
int hash = 7; |
||||
hash = 89 * hash + (this.name != null ? this.name.hashCode() : 0); |
||||
return hash; |
||||
} |
||||
|
||||
private void parse(Statement sta) { |
||||
try { |
||||
String[] split = sta.getLine().split(":"); |
||||
String statement = split[0].trim(); |
||||
|
||||
// Parse default val
|
||||
if (split.length > 1) { |
||||
|
||||
defaultValue = split[1].trim(); |
||||
} |
||||
|
||||
// Parse ffbinding
|
||||
int startParen = statement.indexOf("("); |
||||
if (startParen != -1) { |
||||
// get content inside parentheses
|
||||
int endParen = statement.indexOf(")", startParen); |
||||
fixedFuncBinding = statement.substring(startParen + 1, endParen).trim(); |
||||
statement = statement.substring(0, startParen); |
||||
} |
||||
|
||||
// Parse type + name
|
||||
split = statement.split("\\p{javaWhitespace}+"); |
||||
|
||||
type = split[0]; |
||||
name = split[1]; |
||||
|
||||
|
||||
} catch (Exception e) { |
||||
e.printStackTrace(); |
||||
Logger.getLogger(MatParamBlock.class.getName()).log(Level.WARNING, "Parsing error line " + sta.getLineNumber() + " : " + sta.getLine()); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,73 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.fileStructure.leaves; |
||||
|
||||
import com.jme3.util.blockparser.Statement; |
||||
import java.util.logging.Level; |
||||
import java.util.logging.Logger; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public class OutputMappingBlock extends MappingBlock { |
||||
|
||||
protected OutputMappingBlock(int lineNumber, String line) { |
||||
super(lineNumber, line); |
||||
} |
||||
|
||||
public OutputMappingBlock(Statement sta, String name) { |
||||
this(sta.getLineNumber(), sta.getLine()); |
||||
parse(sta); |
||||
rightNameSpace = name; |
||||
updateLine(); |
||||
} |
||||
|
||||
public OutputMappingBlock(String leftVar, String rightVar, String leftVarSwizzle, String rightVarSwizzle, String leftNameSpace, String rightNameSpace, String condition) { |
||||
super(0, ""); |
||||
this.leftVar = leftVar; |
||||
this.rightVar = rightVar; |
||||
this.leftVarSwizzle = leftVarSwizzle; |
||||
this.rightVarSwizzle = rightVarSwizzle; |
||||
this.leftNameSpace = leftNameSpace; |
||||
this.rightNameSpace = rightNameSpace; |
||||
this.condition = condition; |
||||
updateLine(); |
||||
} |
||||
|
||||
@Override |
||||
protected final void updateLine() { |
||||
this.line = leftNameSpace + "." + leftVar + (leftVarSwizzle == null ? "" : "." + leftVarSwizzle) + " = " + rightVar + (rightVarSwizzle == null ? "" : "." + rightVarSwizzle) + (condition != null ? " : " + condition : ""); |
||||
} |
||||
|
||||
private void parse(Statement sta) { |
||||
try { |
||||
String[] split = sta.getLine().split(":"); |
||||
if (split.length > 1) { |
||||
condition = split[1].trim(); |
||||
} |
||||
String mapping = split[0].trim(); |
||||
String[] s = mapping.split("="); |
||||
|
||||
String[] left = s[0].split("\\."); |
||||
leftNameSpace = left[0].trim(); |
||||
leftVar = left[1].trim(); |
||||
if (left.length > 2) { |
||||
leftVarSwizzle = left[2].trim(); |
||||
} |
||||
|
||||
String[] right = s[1].split("\\."); |
||||
|
||||
rightVar = right[0].trim(); |
||||
if (right.length > 1) { |
||||
rightVarSwizzle = right[1].trim(); |
||||
} |
||||
|
||||
|
||||
} catch (ArrayIndexOutOfBoundsException e) { |
||||
Logger.getLogger(OutputMappingBlock.class.getName()).log(Level.WARNING, "Parsing error line {0} : {1}", new Object[]{sta.getLineNumber(), sta.getLine()}); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,53 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.fileStructure.leaves; |
||||
|
||||
import com.jme3.util.blockparser.Statement; |
||||
import java.util.logging.Level; |
||||
import java.util.logging.Logger; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public class ShaderFileBlock extends LeafStatement { |
||||
|
||||
protected String language; |
||||
protected String path; |
||||
|
||||
protected ShaderFileBlock(int lineNumber, String line) { |
||||
super(lineNumber, line); |
||||
} |
||||
|
||||
public ShaderFileBlock(Statement sta) { |
||||
this(sta.getLineNumber(), sta.getLine()); |
||||
parse(sta); |
||||
updateLine(); |
||||
} |
||||
|
||||
public ShaderFileBlock(String language, String path, int lineNumber, String line) { |
||||
super(lineNumber, line); |
||||
this.language = language; |
||||
this.path = path; |
||||
updateLine(); |
||||
} |
||||
|
||||
protected void updateLine() { |
||||
this.line = "Shader " + language + ": " + path; |
||||
} |
||||
|
||||
private void parse(Statement sta) { |
||||
try { |
||||
String[] split = sta.getLine().split("\\s"); |
||||
language = split[1].trim(); |
||||
path = split[2].trim(); |
||||
|
||||
} catch (ArrayIndexOutOfBoundsException e) { |
||||
Logger.getLogger(ShaderFileBlock.class.getName()).log(Level.WARNING, "Parsing error line " + sta.getLineNumber() + " : " + sta.getLine()); |
||||
} catch (IllegalArgumentException ex) { |
||||
Logger.getLogger(ShaderFileBlock.class.getName()).log(Level.WARNING, "Invalid light mode : " + sta.getLineNumber() + " : " + sta.getLine()); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,22 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.fileStructure.leaves; |
||||
|
||||
import com.jme3.util.blockparser.Statement; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public class UnsupportedStatement extends Statement { |
||||
|
||||
public UnsupportedStatement(int lineNumber, String line) { |
||||
super(lineNumber, line); |
||||
} |
||||
|
||||
public UnsupportedStatement(Statement sta) { |
||||
super(sta.getLineNumber(), sta.getLine()); |
||||
} |
||||
} |
@ -0,0 +1,32 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.fileStructure.leaves; |
||||
|
||||
import com.jme3.util.blockparser.Statement; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public class VertexShaderFileBlock extends ShaderFileBlock { |
||||
|
||||
public VertexShaderFileBlock(int lineNumber, String line) { |
||||
super(lineNumber, line); |
||||
} |
||||
|
||||
public VertexShaderFileBlock(Statement sta) { |
||||
super(sta); |
||||
} |
||||
|
||||
public VertexShaderFileBlock(String language, String path, int lineNumber, String line) { |
||||
super(language, path, lineNumber, line); |
||||
} |
||||
|
||||
@Override |
||||
protected void updateLine() { |
||||
super.updateLine(); |
||||
line = "Vertex" + line; |
||||
} |
||||
} |
@ -0,0 +1,64 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.fileStructure.leaves; |
||||
|
||||
import com.jme3.util.blockparser.Statement; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public class WorldParamBlock extends LeafStatement { |
||||
|
||||
protected String name; |
||||
|
||||
protected WorldParamBlock(int lineNumber, String line) { |
||||
super(lineNumber, line); |
||||
} |
||||
|
||||
public WorldParamBlock(Statement sta) { |
||||
this(sta.getLineNumber(), sta.getLine()); |
||||
parse(sta); |
||||
updateLine(); |
||||
} |
||||
|
||||
public WorldParamBlock(String name) { |
||||
super(0, ""); |
||||
this.name = name; |
||||
updateLine(); |
||||
} |
||||
|
||||
private void updateLine() { |
||||
this.line = name; |
||||
} |
||||
|
||||
public String getName() { |
||||
return name; |
||||
} |
||||
|
||||
public void setName(String name) { |
||||
this.name = name; |
||||
updateLine(); |
||||
} |
||||
|
||||
private void parse(Statement sta) { |
||||
name = sta.getLine().trim(); |
||||
} |
||||
|
||||
@Override |
||||
public boolean equals(Object obj) { |
||||
if(!(obj instanceof WorldParamBlock)){ |
||||
return false; |
||||
} |
||||
return ((WorldParamBlock)obj).getName().equals(name); |
||||
} |
||||
|
||||
@Override |
||||
public int hashCode() { |
||||
int hash = 7; |
||||
hash = 89 * hash + (this.name != null ? this.name.hashCode() : 0); |
||||
return hash; |
||||
} |
||||
} |
@ -0,0 +1,30 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.icons; |
||||
|
||||
import javax.swing.ImageIcon; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public class Icons { |
||||
|
||||
public final static ImageIcon node = new ImageIcon(Icons.class.getResource("node.png")); |
||||
public final static ImageIcon output = new ImageIcon(Icons.class.getResource("output.png")); |
||||
public final static ImageIcon world = new ImageIcon(Icons.class.getResource("earth.png")); |
||||
public final static ImageIcon attrib = new ImageIcon(Icons.class.getResource("attrib.png")); |
||||
public final static ImageIcon mat = new ImageIcon(Icons.class.getResource("mat.png")); |
||||
public final static ImageIcon vert = new ImageIcon(Icons.class.getResource("vert.png")); |
||||
public final static ImageIcon frag = new ImageIcon(Icons.class.getResource("fragment.png")); |
||||
public final static ImageIcon imgGrey = new ImageIcon(Icons.class.getResource("dot.png")); |
||||
public final static ImageIcon imgGreen = new ImageIcon(Icons.class.getResource("dotGreen.png")); |
||||
public final static ImageIcon imgOrange = new ImageIcon(Icons.class.getResource("dotOrange.png")); |
||||
public final static ImageIcon imgRed = new ImageIcon(Icons.class.getResource("dotRed.png")); |
||||
public final static ImageIcon matDef = new ImageIcon(Icons.class.getResource("matdef.png")); |
||||
public final static ImageIcon tech = new ImageIcon(Icons.class.getResource("tech.png")); |
||||
public final static ImageIcon in = new ImageIcon(Icons.class.getResource("in.png")); |
||||
public final static ImageIcon out = new ImageIcon(Icons.class.getResource("out.png")); |
||||
} |
After Width: | Height: | Size: 2.9 KiB |
After Width: | Height: | Size: 3.2 KiB |
After Width: | Height: | Size: 1.0 KiB |
After Width: | Height: | Size: 390 B |
After Width: | Height: | Size: 3.3 KiB |
After Width: | Height: | Size: 367 B |
After Width: | Height: | Size: 364 B |
After Width: | Height: | Size: 367 B |
After Width: | Height: | Size: 366 B |
After Width: | Height: | Size: 865 B |
After Width: | Height: | Size: 865 B |
After Width: | Height: | Size: 3.0 KiB |
After Width: | Height: | Size: 653 B |
After Width: | Height: | Size: 775 B |
After Width: | Height: | Size: 501 B |
After Width: | Height: | Size: 822 B |
After Width: | Height: | Size: 3.5 KiB |
After Width: | Height: | Size: 596 B |
After Width: | Height: | Size: 457 B |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 3.0 KiB |
After Width: | Height: | Size: 3.4 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 365 B |
@ -0,0 +1,37 @@ |
||||
<?xml version="1.0" encoding="UTF-8" ?> |
||||
|
||||
<Form version="1.4" maxVersion="1.8" type="org.netbeans.modules.form.forminfo.JPanelFormInfo"> |
||||
<AuxValues> |
||||
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/> |
||||
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/> |
||||
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/> |
||||
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/> |
||||
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/> |
||||
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/> |
||||
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/> |
||||
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/> |
||||
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/> |
||||
</AuxValues> |
||||
|
||||
<Layout> |
||||
<DimensionLayout dim="0"> |
||||
<Group type="103" groupAlignment="0" attributes="0"> |
||||
<Component id="jScrollPane1" alignment="0" pref="400" max="32767" attributes="0"/> |
||||
</Group> |
||||
</DimensionLayout> |
||||
<DimensionLayout dim="1"> |
||||
<Group type="103" groupAlignment="0" attributes="0"> |
||||
<Component id="jScrollPane1" alignment="0" pref="300" max="32767" attributes="0"/> |
||||
</Group> |
||||
</DimensionLayout> |
||||
</Layout> |
||||
<SubComponents> |
||||
<Container class="javax.swing.JScrollPane" name="jScrollPane1"> |
||||
<AuxValues> |
||||
<AuxValue name="JavaCodeGenerator_CreateCodeCustom" type="java.lang.String" value="new BeanTreeView()"/> |
||||
</AuxValues> |
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/> |
||||
</Container> |
||||
</SubComponents> |
||||
</Form> |
@ -0,0 +1,182 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.navigator; |
||||
|
||||
import com.jme3.gde.materialdefinition.MatDefDataObject; |
||||
import java.util.Collection; |
||||
import javax.swing.JComponent; |
||||
import javax.swing.JPanel; |
||||
import org.netbeans.spi.navigator.NavigatorPanel; |
||||
import org.openide.explorer.ExplorerManager; |
||||
import org.openide.explorer.ExplorerUtils; |
||||
import org.openide.explorer.view.BeanTreeView; |
||||
import org.openide.nodes.Node; |
||||
import org.openide.util.Lookup; |
||||
import org.openide.util.LookupEvent; |
||||
import org.openide.util.LookupListener; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
@NavigatorPanel.Registration(mimeType = "text/jme-materialdefinition", displayName = "Material Def") |
||||
public class MatDefNavigatorPanel extends JPanel implements NavigatorPanel, ExplorerManager.Provider { |
||||
|
||||
/** |
||||
* template for finding data in given context. |
||||
*/ |
||||
private static final Lookup.Template MY_DATA = new Lookup.Template(MatDefDataObject.class); |
||||
|
||||
/** |
||||
* current context to work on |
||||
*/ |
||||
private Lookup.Result curContext; |
||||
private Lookup lookup; |
||||
/** |
||||
* listener to context changes |
||||
*/ |
||||
private LookupListener contextL; |
||||
private final ExplorerManager mgr = new ExplorerManager(); |
||||
|
||||
/** |
||||
* Creates new form MatDefNavigatorPanel |
||||
*/ |
||||
public MatDefNavigatorPanel() { |
||||
initComponents(); |
||||
lookup = ExplorerUtils.createLookup(mgr, getActionMap()); |
||||
|
||||
} |
||||
|
||||
public String getDisplayHint() { |
||||
return "Material definition outline view"; |
||||
} |
||||
|
||||
@Override |
||||
public String getDisplayName() { |
||||
return "Bla"; |
||||
} |
||||
|
||||
public JComponent getComponent() { |
||||
return this; |
||||
} |
||||
|
||||
public void panelActivated(Lookup context) { |
||||
// lookup context and listen to result to get notified about context changes
|
||||
curContext = context.lookup(MY_DATA); |
||||
//lookup = context;
|
||||
curContext.addLookupListener(getContextListener()); |
||||
// get actual data and recompute content
|
||||
Collection data = curContext.allInstances(); |
||||
setNewContent(data); |
||||
|
||||
// ExplorerUtils.activateActions(mgr, true);
|
||||
|
||||
} |
||||
|
||||
public void panelDeactivated() { |
||||
Collection data = curContext.allInstances(); |
||||
if (!data.isEmpty()) { |
||||
MatDefDataObject obj = (MatDefDataObject) data.iterator().next(); |
||||
obj.getLookupContents().remove(this); |
||||
} |
||||
curContext.removeLookupListener(getContextListener()); |
||||
curContext = null; |
||||
mgr.setRootContext(Node.EMPTY); |
||||
//ExplorerUtils.activateActions(mgr, false);
|
||||
} |
||||
|
||||
public Lookup getLookup() { |
||||
// go with default activated Node strategy
|
||||
return lookup; |
||||
} |
||||
|
||||
/** |
||||
* *********** non - public part *********** |
||||
*/ |
||||
private void setNewContent(Collection newData) { |
||||
if (!newData.isEmpty()) { |
||||
MatDefDataObject data = (MatDefDataObject) newData.iterator().next(); |
||||
data.getLookupContents().add(this); |
||||
if (data.isLoaded()) { |
||||
updateData(data); |
||||
} else { |
||||
mgr.setRootContext(Node.EMPTY); |
||||
} |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Accessor for listener to context |
||||
*/ |
||||
private LookupListener getContextListener() { |
||||
if (contextL == null) { |
||||
contextL = new ContextListener(); |
||||
} |
||||
return contextL; |
||||
} |
||||
|
||||
public ExplorerManager getExplorerManager() { |
||||
return mgr; |
||||
} |
||||
|
||||
public void updateData(MatDefDataObject data) { |
||||
if (data != null) { |
||||
data.getEditableFile().buildOverview(mgr); |
||||
} else { |
||||
mgr.setRootContext(Node.EMPTY); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* Listens to changes of context and triggers proper action |
||||
*/ |
||||
private class ContextListener implements LookupListener { |
||||
|
||||
public void resultChanged(LookupEvent ev) { |
||||
Collection data = ((Lookup.Result) ev.getSource()).allInstances(); |
||||
setNewContent(data); |
||||
} |
||||
} // end of ContextListener
|
||||
|
||||
/** |
||||
* This method is called from within the constructor to initialize the form. |
||||
* WARNING: Do NOT modify this code. The content of this method is always |
||||
* regenerated by the Form Editor. |
||||
*/ |
||||
@SuppressWarnings("unchecked") |
||||
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
||||
private void initComponents() { |
||||
|
||||
jScrollPane1 = new BeanTreeView(); |
||||
|
||||
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); |
||||
this.setLayout(layout); |
||||
layout.setHorizontalGroup( |
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) |
||||
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE) |
||||
); |
||||
layout.setVerticalGroup( |
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) |
||||
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 300, Short.MAX_VALUE) |
||||
); |
||||
}// </editor-fold>//GEN-END:initComponents
|
||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||
private javax.swing.JScrollPane jScrollPane1; |
||||
// End of variables declaration//GEN-END:variables
|
||||
|
||||
/** |
||||
* Gets default instance. Do not use directly: reserved for *.settings files |
||||
* only, i.e. deserialization routines; otherwise you could get a |
||||
* non-deserialized instance. To obtain the singleton instance, use |
||||
* {@link #findInstance}. |
||||
*/ |
||||
public static synchronized MatDefNavigatorPanel getDefault() { |
||||
if (instance == null) { |
||||
instance = new MatDefNavigatorPanel(); |
||||
} |
||||
return instance; |
||||
} |
||||
private static MatDefNavigatorPanel instance; |
||||
} |
@ -0,0 +1,66 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.navigator.node; |
||||
|
||||
import com.jme3.gde.materialdefinition.fileStructure.MatDefBlock; |
||||
import com.jme3.gde.materialdefinition.fileStructure.leaves.MatParamBlock; |
||||
import com.jme3.gde.materialdefinition.navigator.node.properties.MatParamProperty; |
||||
import java.beans.PropertyChangeEvent; |
||||
import java.beans.PropertyChangeListener; |
||||
import java.util.List; |
||||
import javax.swing.Action; |
||||
import org.openide.nodes.AbstractNode; |
||||
import org.openide.nodes.Children; |
||||
import org.openide.nodes.Sheet; |
||||
import org.openide.util.Lookup; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public class AbstractMatDefNode extends AbstractNode { |
||||
|
||||
protected Lookup lookup; |
||||
|
||||
public AbstractMatDefNode(Children children, Lookup lookup) { |
||||
super(children, lookup); |
||||
this.lookup = lookup; |
||||
MatDefBlock block = lookup.lookup(MatDefBlock.class); |
||||
block.addPropertyChangeListener(new PropertyChangeListener() { |
||||
public void propertyChange(PropertyChangeEvent evt) { |
||||
if (evt.getPropertyName().equals(MatDefBlock.ADD_MAT_PARAM) || evt.getPropertyName().equals(MatDefBlock.REMOVE_MAT_PARAM)) { |
||||
setSheet(createSheet()); |
||||
firePropertySetsChange(null, null); |
||||
} |
||||
} |
||||
}); |
||||
|
||||
} |
||||
|
||||
|
||||
@Override |
||||
public Action[] getActions(boolean popup) { |
||||
return new Action[]{}; |
||||
} |
||||
|
||||
@Override |
||||
protected Sheet createSheet() { |
||||
Sheet sheet = super.createSheet(); |
||||
MatDefBlock def = lookup.lookup(MatDefBlock.class); |
||||
List<MatParamBlock> params = def.getMatParams(); |
||||
|
||||
Sheet.Set set = new Sheet.Set(); |
||||
set.setName("MaterialParameters"); |
||||
set.setDisplayName("Material Parameters"); |
||||
for (MatParamBlock matParamBlock : params) { |
||||
set.put(MatParamProperty.makeProperty(matParamBlock, lookup)); |
||||
} |
||||
|
||||
sheet.put(set); |
||||
|
||||
return sheet; |
||||
|
||||
} |
||||
} |
@ -0,0 +1,112 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.navigator.node; |
||||
|
||||
import com.jme3.gde.materialdefinition.MatDefDataObject; |
||||
import com.jme3.gde.materialdefinition.editor.Selectable; |
||||
import com.jme3.gde.materialdefinition.fileStructure.leaves.InputMappingBlock; |
||||
import com.jme3.gde.materialdefinition.fileStructure.leaves.MappingBlock; |
||||
import com.jme3.gde.materialdefinition.icons.Icons; |
||||
import com.jme3.gde.materialdefinition.navigator.node.properties.DefaultProperty; |
||||
import com.jme3.gde.materialdefinition.utils.MaterialUtils; |
||||
import java.awt.Image; |
||||
import java.beans.PropertyChangeEvent; |
||||
import java.beans.PropertyChangeListener; |
||||
import org.openide.nodes.Children; |
||||
import org.openide.nodes.Sheet; |
||||
import org.openide.util.Exceptions; |
||||
import org.openide.util.Lookup; |
||||
import org.openide.util.WeakListeners; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public class MappingNode extends AbstractMatDefNode implements Selectable, PropertyChangeListener { |
||||
|
||||
MappingBlock mapping; |
||||
String key; |
||||
|
||||
public MappingNode(final MappingBlock mapping) { |
||||
this(null, mapping); |
||||
} |
||||
|
||||
public MappingNode(Lookup lookup, final MappingBlock mapping) { |
||||
super(Children.LEAF, lookup); |
||||
this.mapping = mapping; |
||||
setName(makeName(mapping)); |
||||
key = makeKey(); |
||||
} |
||||
|
||||
private String makeName(MappingBlock mapping) { |
||||
// ShaderNodeVariable left = mapping.getLeftVar();
|
||||
// ShaderNodeVariable right = mapping.getRightVariable();
|
||||
// String rightName = right.getName().replaceAll("g_", "").replaceAll("m_", "");
|
||||
// String leftName = left.getName().replaceAll("g_", "").replaceAll("m_", "");
|
||||
// String leftSwizzle = mapping.getLeftSwizzling().length() > 0 ? "." + mapping.getLeftSwizzling() : "";
|
||||
// String rightSwizzle = mapping.getRightSwizzling().length() > 0 ? "." + mapping.getRightSwizzling() : "";
|
||||
// if (isInput()) {
|
||||
// return leftName + leftSwizzle + " = " + right.getNameSpace() + "." + rightName + rightSwizzle;
|
||||
// }
|
||||
return mapping.toString();//right.getNameSpace() + "." + leftName + leftSwizzle + " = " + rightName + rightSwizzle;
|
||||
} |
||||
|
||||
private boolean isInput() { |
||||
return (mapping instanceof InputMappingBlock); |
||||
} |
||||
|
||||
@Override |
||||
public Image getIcon(int type) { |
||||
if (isInput()) { |
||||
return Icons.in.getImage(); |
||||
} |
||||
return Icons.out.getImage(); |
||||
} |
||||
|
||||
@Override |
||||
protected Sheet createSheet() { |
||||
Sheet sheet = super.createSheet(); |
||||
Sheet.Set set = new Sheet.Set(); |
||||
set.setName(mapping.getLeftVar() + " <- " + mapping.getRightVar()); |
||||
set.setDisplayName(mapping.getLeftVar() + " <- " + mapping.getRightVar()); |
||||
|
||||
|
||||
try { |
||||
set.put(new DefaultProperty<String>(mapping, String.class, "Condition", "getCondition", "setCondition")); |
||||
|
||||
set.put(new DefaultProperty<String>(mapping, String.class, "Left name space", "getLeftNameSpace", "setLeftNameSpace", true)); |
||||
set.put(new DefaultProperty<String>(mapping, String.class, "Left variable", "getLeftVar", "setLeftVar", true)); |
||||
set.put(new DefaultProperty<String>(mapping, String.class, "Left swizzle", "getLeftVarSwizzle", "setLeftVarSwizzle")); |
||||
|
||||
set.put(new DefaultProperty<String>(mapping, String.class, "Right name space", "getRightNameSpace", "setRightNameSpace", true)); |
||||
set.put(new DefaultProperty<String>(mapping, String.class, "Right variable", "getRightVar", "setRightVar", true)); |
||||
set.put(new DefaultProperty<String>(mapping, String.class, "Right swizzle", "getRightVarSwizzle", "setRightVarSwizzle")); |
||||
|
||||
|
||||
} catch (NoSuchMethodException ex) { |
||||
Exceptions.printStackTrace(ex); |
||||
} |
||||
|
||||
mapping.addPropertyChangeListener(WeakListeners.propertyChange(this, mapping)); |
||||
|
||||
|
||||
sheet.put(set); |
||||
|
||||
return sheet; |
||||
} |
||||
|
||||
private String makeKey() { |
||||
return MaterialUtils.makeKey(mapping, lookup.lookup(MatDefDataObject.class).getEditableFile().getCurrentTechnique().getName()); |
||||
} |
||||
|
||||
public String getKey() { |
||||
return key; |
||||
} |
||||
|
||||
public void propertyChange(PropertyChangeEvent evt) { |
||||
setName(makeName(mapping)); |
||||
key = makeKey(); |
||||
} |
||||
} |
@ -0,0 +1,103 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.navigator.node; |
||||
|
||||
import com.jme3.gde.materialdefinition.editor.Selectable; |
||||
import com.jme3.gde.materialdefinition.fileStructure.MatDefBlock; |
||||
import com.jme3.gde.materialdefinition.fileStructure.TechniqueBlock; |
||||
import com.jme3.gde.materialdefinition.icons.Icons; |
||||
import com.jme3.gde.materialdefinition.navigator.node.properties.DefaultProperty; |
||||
import java.awt.Image; |
||||
import java.beans.PropertyChangeEvent; |
||||
import java.beans.PropertyChangeListener; |
||||
import java.util.List; |
||||
import javax.swing.Action; |
||||
import org.openide.actions.RenameAction; |
||||
import org.openide.nodes.ChildFactory; |
||||
import org.openide.nodes.Children; |
||||
import org.openide.nodes.Node; |
||||
import org.openide.nodes.Sheet; |
||||
import org.openide.util.Exceptions; |
||||
import org.openide.util.Lookup; |
||||
import org.openide.util.WeakListeners; |
||||
import org.openide.util.actions.SystemAction; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public class MatDefNode extends AbstractMatDefNode implements Selectable, PropertyChangeListener { |
||||
|
||||
|
||||
public MatDefNode(final Lookup lookup) { |
||||
super(Children.create(new ChildFactory<TechniqueBlock>() { |
||||
@Override |
||||
protected boolean createKeys(List<TechniqueBlock> list) { |
||||
list.addAll(lookup.lookup(MatDefBlock.class).getTechniques()); |
||||
return true; |
||||
} |
||||
|
||||
@Override |
||||
protected Node createNodeForKey(TechniqueBlock key) { |
||||
return new TechniqueNode(lookup, key); |
||||
} |
||||
}, true),lookup); |
||||
|
||||
setName(lookup.lookup(MatDefBlock.class).getName()); |
||||
|
||||
} |
||||
|
||||
|
||||
|
||||
@Override |
||||
protected Sheet createSheet() { |
||||
Sheet sheet = super.createSheet(); |
||||
MatDefBlock def = lookup.lookup(MatDefBlock.class); |
||||
|
||||
Sheet.Set set = new Sheet.Set(); |
||||
set.setName(def.getName() + "MaterialDefinition"); |
||||
set.setDisplayName(def.getName() + " Material Definition"); |
||||
set.setShortDescription(def.getName() + " Material Definition"); |
||||
try { |
||||
DefaultProperty<String> prop = new DefaultProperty<String>(def, String.class, "Name", "getName", "setName"); |
||||
set.put(prop); |
||||
|
||||
} catch (NoSuchMethodException ex) { |
||||
Exceptions.printStackTrace(ex); |
||||
} |
||||
|
||||
def.addPropertyChangeListener(WeakListeners.propertyChange(this, def)); |
||||
|
||||
// for (MatParam matParam : def.getMaterialParams()) {
|
||||
// set.put(MatParamProperty.makeProperty(matParam, lookup));
|
||||
// }
|
||||
sheet.put(set); |
||||
|
||||
return sheet; |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public Image getIcon(int type) { |
||||
return Icons.matDef.getImage(); |
||||
} |
||||
|
||||
@Override |
||||
public Image getOpenedIcon(int type) { |
||||
return Icons.matDef.getImage(); |
||||
} |
||||
|
||||
public String getKey() { |
||||
return getName(); |
||||
} |
||||
|
||||
public void propertyChange(PropertyChangeEvent evt) { |
||||
if(evt.getPropertyName().equals("name")){ |
||||
setName((String)evt.getNewValue()); |
||||
setDisplayName((String)evt.getNewValue()); |
||||
} |
||||
|
||||
} |
||||
} |
@ -0,0 +1,177 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.navigator.node; |
||||
|
||||
import com.jme3.gde.core.assets.ProjectAssetManager; |
||||
import com.jme3.gde.materialdefinition.MatDefDataObject; |
||||
import com.jme3.gde.materialdefinition.editor.Selectable; |
||||
import com.jme3.gde.materialdefinition.fileStructure.ShaderNodeBlock; |
||||
import com.jme3.gde.materialdefinition.fileStructure.leaves.MappingBlock; |
||||
import com.jme3.gde.materialdefinition.icons.Icons; |
||||
import com.jme3.gde.materialdefinition.navigator.node.properties.DefaultProperty; |
||||
import com.jme3.gde.materialdefinition.utils.MaterialUtils; |
||||
import com.jme3.shader.Shader; |
||||
import com.jme3.shader.ShaderNodeDefinition; |
||||
import java.awt.Image; |
||||
import java.beans.PropertyChangeEvent; |
||||
import java.beans.PropertyChangeListener; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
import org.openide.nodes.Children; |
||||
import org.openide.nodes.Node; |
||||
import org.openide.nodes.Sheet; |
||||
import org.openide.util.Exceptions; |
||||
import org.openide.util.Lookup; |
||||
import org.openide.util.WeakListeners; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public class ShaderNodeNode extends AbstractMatDefNode implements Selectable, PropertyChangeListener { |
||||
|
||||
ShaderNodeBlock shaderNode; |
||||
ShaderNodeDefinition def; |
||||
String key = ""; |
||||
|
||||
|
||||
public ShaderNodeNode(final Lookup lookup, final ShaderNodeBlock shaderNode) { |
||||
// super(Children.create(new ChildFactory<MappingBlock>() {
|
||||
// @Override
|
||||
// protected boolean createKeys(List<MappingBlock> list) {
|
||||
// list.addAll(shaderNode.getInputs());
|
||||
// List<OutputMappingBlock> out = shaderNode.getOutputs();
|
||||
// if (out != null) {
|
||||
// list.addAll(shaderNode.getOutputs());
|
||||
// }
|
||||
//
|
||||
// return true;
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// protected Node createNodeForKey(MappingBlock key) {
|
||||
// return new MappingNode(lookup, key);
|
||||
// }
|
||||
// }, true), lookup);
|
||||
super(new MappingNodeChildren(lookup, shaderNode), lookup); |
||||
this.shaderNode = shaderNode; |
||||
setName(shaderNode.getName()); |
||||
key = makeKey(); |
||||
ProjectAssetManager manager = lookup.lookup(ProjectAssetManager.class); |
||||
def = MaterialUtils.loadShaderNodeDefinition(shaderNode, manager); |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public Image getIcon(int type) { |
||||
return getImageIcon(); |
||||
} |
||||
|
||||
@Override |
||||
protected Sheet createSheet() { |
||||
|
||||
Sheet sheet = super.createSheet(); |
||||
Sheet.Set set = new Sheet.Set(); |
||||
set.setName(shaderNode.getName() + "ShaderNode"); |
||||
set.setDisplayName(shaderNode.getName() + " ShaderNode"); |
||||
set.setShortDescription(def.getDocumentation()); |
||||
try { |
||||
set.put(new DefaultProperty<String>(shaderNode, String.class, "Name", "getName", "setName")); |
||||
set.put(new DefaultProperty<String>(shaderNode, String.class, "Condition", "getCondition", "setCondition")); |
||||
|
||||
} catch (NoSuchMethodException ex) { |
||||
Exceptions.printStackTrace(ex); |
||||
} |
||||
|
||||
shaderNode.addPropertyChangeListener(WeakListeners.propertyChange(this, shaderNode)); |
||||
|
||||
|
||||
sheet.put(set); |
||||
|
||||
return sheet; |
||||
|
||||
|
||||
} |
||||
|
||||
@Override |
||||
public String getShortDescription() { |
||||
return def.getDocumentation(); |
||||
} |
||||
|
||||
@Override |
||||
public Image getOpenedIcon(int type) { |
||||
return getImageIcon(); |
||||
} |
||||
|
||||
private Image getImageIcon() { |
||||
if (def.getType() == Shader.ShaderType.Vertex) { |
||||
return Icons.vert.getImage(); |
||||
} else { |
||||
return Icons.frag.getImage(); |
||||
} |
||||
} |
||||
|
||||
private String makeKey() { |
||||
String defName = lookup.lookup(MatDefDataObject.class).getEditableFile().getCurrentTechnique().getName(); |
||||
return defName + "/" + getName(); |
||||
} |
||||
|
||||
public String getKey() { |
||||
return key; |
||||
} |
||||
|
||||
public ShaderNodeDefinition getShaderNodeDefinition() { |
||||
return def; |
||||
} |
||||
|
||||
public void propertyChange(PropertyChangeEvent evt) { |
||||
if (evt.getPropertyName().equals("name")) { |
||||
setName((String) evt.getNewValue()); |
||||
setDisplayName((String) evt.getNewValue()); |
||||
key = makeKey(); |
||||
} else if (evt.getPropertyName().equals(ShaderNodeBlock.ADD_MAPPING) |
||||
|| evt.getPropertyName().equals(ShaderNodeBlock.REMOVE_MAPPING)) { |
||||
((MappingNodeChildren) getChildren()).reload(); |
||||
} |
||||
} |
||||
|
||||
public static class MappingNodeChildren extends Children.Keys<MappingBlock> { |
||||
|
||||
Lookup lookup; |
||||
ShaderNodeBlock node; |
||||
|
||||
public MappingNodeChildren(Lookup lookup, ShaderNodeBlock node) { |
||||
this.lookup = lookup; |
||||
this.node = node; |
||||
} |
||||
|
||||
@Override |
||||
protected void addNotify() { |
||||
super.addNotify(); |
||||
setKeys(createKeys()); |
||||
} |
||||
|
||||
public void reload() { |
||||
setKeys(createKeys()); |
||||
} |
||||
|
||||
public List<MappingBlock> createKeys() { |
||||
List<MappingBlock> l = new ArrayList<MappingBlock>(); |
||||
if (node.getInputs() != null) { |
||||
l.addAll(node.getInputs()); |
||||
} |
||||
if (node.getOutputs() != null) { |
||||
l.addAll(node.getOutputs()); |
||||
} |
||||
|
||||
return l; |
||||
} |
||||
|
||||
@Override |
||||
protected Node[] createNodes(MappingBlock key) { |
||||
return new Node[]{new MappingNode(lookup, key)}; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,118 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.navigator.node; |
||||
|
||||
import com.jme3.gde.materialdefinition.editor.Selectable; |
||||
import com.jme3.gde.materialdefinition.fileStructure.ShaderNodeBlock; |
||||
import com.jme3.gde.materialdefinition.fileStructure.TechniqueBlock; |
||||
import com.jme3.gde.materialdefinition.icons.Icons; |
||||
import com.jme3.gde.materialdefinition.navigator.node.properties.DefaultProperty; |
||||
import java.awt.Image; |
||||
import java.beans.PropertyChangeEvent; |
||||
import java.beans.PropertyChangeListener; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
import org.openide.nodes.Children; |
||||
import org.openide.nodes.Node; |
||||
import org.openide.nodes.Sheet; |
||||
import org.openide.util.Exceptions; |
||||
import org.openide.util.Lookup; |
||||
import org.openide.util.WeakListeners; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public class TechniqueNode extends AbstractMatDefNode implements Selectable, PropertyChangeListener { |
||||
|
||||
TechniqueBlock def; |
||||
|
||||
public TechniqueNode(final Lookup lookup, final TechniqueBlock def) { |
||||
super(new ShaderNodeChildren(lookup, def), lookup); |
||||
this.def = def; |
||||
def.addPropertyChangeListener(WeakListeners.propertyChange(this, def)); |
||||
setName(def.getName()); |
||||
} |
||||
|
||||
@Override |
||||
protected Sheet createSheet() { |
||||
Sheet sheet = super.createSheet(); |
||||
Sheet.Set set = Sheet.createPropertiesSet(); |
||||
set.setName("Technique"); |
||||
try { |
||||
DefaultProperty<String> prop = new DefaultProperty<String>(def, String.class, "Name", "getName", "setName"); |
||||
set.put(prop); |
||||
} catch (NoSuchMethodException ex) { |
||||
Exceptions.printStackTrace(ex); |
||||
} |
||||
|
||||
sheet.put(set); |
||||
|
||||
|
||||
|
||||
return sheet; |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public Image getIcon(int type) { |
||||
return Icons.tech.getImage(); |
||||
} |
||||
|
||||
@Override |
||||
public Image getOpenedIcon(int type) { |
||||
return Icons.tech.getImage(); |
||||
} |
||||
|
||||
public String getKey() { |
||||
return getName(); |
||||
} |
||||
|
||||
public void propertyChange(PropertyChangeEvent evt) { |
||||
if (evt.getPropertyName().equals("name")) { |
||||
setName((String) evt.getNewValue()); |
||||
setDisplayName((String) evt.getNewValue()); |
||||
} |
||||
if (evt.getPropertyName().equals("reorder") |
||||
|| evt.getPropertyName().equals(TechniqueBlock.ADD_SHADER_NODE) |
||||
|| evt.getPropertyName().equals(TechniqueBlock.REMOVE_SHADER_NODE)) { |
||||
((ShaderNodeChildren) getChildren()).reload(); |
||||
} |
||||
} |
||||
|
||||
public static class ShaderNodeChildren extends Children.Keys<ShaderNodeBlock> { |
||||
|
||||
Lookup lookup; |
||||
TechniqueBlock def; |
||||
|
||||
public ShaderNodeChildren(Lookup lookup, TechniqueBlock def) { |
||||
this.lookup = lookup; |
||||
this.def = def; |
||||
} |
||||
|
||||
@Override |
||||
protected void addNotify() { |
||||
super.addNotify(); |
||||
setKeys(createKeys()); |
||||
} |
||||
|
||||
public void reload() { |
||||
setKeys(createKeys()); |
||||
} |
||||
|
||||
public List<ShaderNodeBlock> createKeys() { |
||||
List<ShaderNodeBlock> l = new ArrayList<ShaderNodeBlock>(); |
||||
if (def.getVertexShader() == null) { |
||||
l.addAll(def.getShaderNodes()); |
||||
} |
||||
return l; |
||||
} |
||||
|
||||
@Override |
||||
protected Node[] createNodes(ShaderNodeBlock key) { |
||||
return new Node[]{new ShaderNodeNode(lookup, key)}; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,32 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.navigator.node.properties; |
||||
|
||||
import org.openide.nodes.PropertySupport; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public class DefaultProperty<T> extends PropertySupport.Reflection<T> { |
||||
|
||||
private boolean readOnly = false; |
||||
|
||||
public DefaultProperty(Object instance, Class<T> valueType, String displayName, String getter, String setter) throws NoSuchMethodException { |
||||
super(instance, valueType, getter, setter); |
||||
setName(displayName); |
||||
setDisplayName(displayName); |
||||
} |
||||
|
||||
public DefaultProperty(Object instance, Class<T> valueType, String displayName, String getter, String setter, boolean readOnly) throws NoSuchMethodException { |
||||
this(instance, valueType, displayName, getter, setter); |
||||
this.readOnly = readOnly; |
||||
} |
||||
|
||||
@Override |
||||
public boolean canWrite() { |
||||
return !readOnly; |
||||
} |
||||
} |
@ -0,0 +1,208 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.navigator.node.properties; |
||||
|
||||
import com.jme3.gde.core.assets.ProjectAssetManager; |
||||
import com.jme3.gde.core.properties.ColorRGBAPropertyEditor; |
||||
import com.jme3.gde.core.properties.Matrix3fPropertyEditor; |
||||
import com.jme3.gde.core.properties.QuaternionPropertyEditor; |
||||
import com.jme3.gde.core.properties.TexturePropertyEditor; |
||||
import com.jme3.gde.core.properties.Vector2fPropertyEditor; |
||||
import com.jme3.gde.core.properties.Vector3fPropertyEditor; |
||||
import com.jme3.gde.materialdefinition.MatDefDataObject; |
||||
import com.jme3.gde.materialdefinition.fileStructure.leaves.MatParamBlock; |
||||
import com.jme3.material.MatParam; |
||||
import com.jme3.material.Material; |
||||
import com.jme3.math.ColorRGBA; |
||||
import com.jme3.math.Matrix3f; |
||||
import com.jme3.math.Matrix4f; |
||||
import com.jme3.math.Quaternion; |
||||
import com.jme3.math.Vector2f; |
||||
import com.jme3.math.Vector3f; |
||||
import com.jme3.math.Vector4f; |
||||
import com.jme3.shader.VarType; |
||||
import com.jme3.texture.Texture; |
||||
import java.beans.PropertyChangeListener; |
||||
import java.beans.PropertyEditor; |
||||
import java.lang.reflect.InvocationTargetException; |
||||
import java.util.logging.Level; |
||||
import java.util.logging.Logger; |
||||
import org.openide.nodes.Node; |
||||
import org.openide.util.Lookup; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public class MatParamProperty<T> extends Node.Property<T> { |
||||
|
||||
private Lookup lookup; |
||||
private String type; |
||||
private Class<T> valueType; |
||||
|
||||
public MatParamProperty(String name, String type, Class<T> valueType, Lookup lookup) { |
||||
super(valueType); |
||||
this.valueType = valueType; |
||||
setName(name); |
||||
this.type = type; |
||||
this.lookup = lookup; |
||||
setDisplayName(name); |
||||
} |
||||
|
||||
@Override |
||||
public boolean canRead() { |
||||
return true; |
||||
} |
||||
|
||||
|
||||
|
||||
@Override |
||||
public T getValue() throws IllegalAccessException, InvocationTargetException { |
||||
MatParam param = lookup.lookup(Material.class).getParam(getName()); |
||||
if (param != null) { |
||||
return (T) param.getValue(); |
||||
} |
||||
return null; |
||||
} |
||||
|
||||
@Override |
||||
public boolean canWrite() { |
||||
return true; |
||||
} |
||||
|
||||
@Override |
||||
public void setValue(T val) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { |
||||
Object v = val; |
||||
if (valueType == Vector3f.class) { |
||||
float[] f = getFloatArrayValue((String) val, 3); |
||||
v = new Vector3f(f[0], f[1], f[2]); |
||||
} else if (valueType == Quaternion.class) { |
||||
float[] f = getFloatArrayValue((String) val, 4); |
||||
v = new Quaternion(f[0], f[1], f[2], f[3]); |
||||
} else if (valueType == Vector4f.class) { |
||||
float[] f = getFloatArrayValue((String) val, 4); |
||||
v = new Vector4f(f[0], f[1], f[2], f[3]); |
||||
} else if (valueType == Vector2f.class) { |
||||
float[] f = getFloatArrayValue((String) val, 2); |
||||
v = new Vector2f(f[0], f[1]); |
||||
} |
||||
VarType vType = MatParamProperty.getVarType(type); |
||||
|
||||
Material m = lookup.lookup(Material.class); |
||||
m.setParam(getName(), vType, v); |
||||
MatDefDataObject obj = lookup.lookup(MatDefDataObject.class); |
||||
obj.getLookupContents().remove(m); |
||||
obj.getLookupContents().add(m); |
||||
|
||||
} |
||||
|
||||
|
||||
|
||||
public float[] getFloatArrayValue(String value, int capacity) { |
||||
float[] ret = new float[capacity]; |
||||
String[] vals = extractValues(value); |
||||
try { |
||||
for (int i = 0; i < vals.length; i++) { |
||||
ret[i] = Float.parseFloat(vals[i]); |
||||
} |
||||
} catch (NumberFormatException e) { |
||||
Logger.getLogger(VectorTextField.class.getName()).log(Level.WARNING, "Invalid format"); |
||||
} |
||||
return ret; |
||||
} |
||||
|
||||
private String[] extractValues(String value) { |
||||
String text = value.replaceAll("[\\[\\]]", ""); |
||||
String[] values = text.split(","); |
||||
return values; |
||||
} |
||||
|
||||
public String getStringFromFloatArray(float[] vals) { |
||||
String t = "["; |
||||
for (float f : vals) { |
||||
t += f + ","; |
||||
} |
||||
t = t.substring(0, t.length() - 1) + "]"; |
||||
return t; |
||||
} |
||||
|
||||
@Override |
||||
public PropertyEditor getPropertyEditor() { |
||||
if (valueType == Vector3f.class) { |
||||
return new Vector3fPropertyEditor(); |
||||
} else if (valueType == Quaternion.class) { |
||||
return new QuaternionPropertyEditor(); |
||||
} else if (valueType == Matrix3f.class) { |
||||
return new Matrix3fPropertyEditor(); |
||||
} else if (valueType == ColorRGBA.class) { |
||||
return new ColorRGBAPropertyEditor(); |
||||
} else if (valueType == Vector2f.class) { |
||||
return new Vector2fPropertyEditor(); |
||||
} else if (valueType == Texture.class) { |
||||
return new TexturePropertyEditor(lookup.lookup(ProjectAssetManager.class)); |
||||
} |
||||
|
||||
|
||||
return super.getPropertyEditor(); |
||||
} |
||||
|
||||
public static MatParamProperty<?> makeProperty(MatParamBlock param, Lookup lookup) { |
||||
|
||||
VarType vType = MatParamProperty.getVarType(param.getType()); |
||||
switch (vType) { |
||||
case Boolean: |
||||
return new MatParamProperty<Boolean>(param.getName(), param.getType(), Boolean.class, lookup); |
||||
case Float: |
||||
return new MatParamProperty<Float>(param.getName(), param.getType(), Float.class, lookup); |
||||
case FloatArray: |
||||
return new MatParamProperty<Object>(param.getName(), param.getType(), Object.class, lookup); |
||||
case Int: |
||||
return new MatParamProperty<Integer>(param.getName(), param.getType(), Integer.class, lookup); |
||||
case Matrix3: |
||||
return new MatParamProperty<Matrix3f>(param.getName(), param.getType(), Matrix3f.class, lookup); |
||||
case Matrix3Array: |
||||
return new MatParamProperty<Object>(param.getName(), param.getType(), Object.class, lookup); |
||||
case Matrix4: |
||||
return new MatParamProperty<Matrix4f>(param.getName(), param.getType(), Matrix4f.class, lookup); |
||||
case Matrix4Array: |
||||
return new MatParamProperty<Object>(param.getName(), param.getType(), Object.class, lookup); |
||||
case Texture2D: |
||||
case Texture3D: |
||||
case TextureArray: |
||||
case TextureBuffer: |
||||
case TextureCubeMap: |
||||
return new MatParamProperty<Texture>(param.getName(), param.getType(), Texture.class, lookup); |
||||
case Vector2: |
||||
return new MatParamProperty<Vector2f>(param.getName(), param.getType(), Vector2f.class, lookup); |
||||
case Vector2Array: |
||||
return new MatParamProperty<Object>(param.getName(), param.getType(), Object.class, lookup); |
||||
case Vector3: |
||||
return new MatParamProperty<Vector3f>(param.getName(), param.getType(), Vector3f.class, lookup); |
||||
case Vector3Array: |
||||
return new MatParamProperty<Object>(param.getName(), param.getType(), Object.class, lookup); |
||||
case Vector4: |
||||
if (param.getType().equals("Color")) { |
||||
return new MatParamProperty<ColorRGBA>(param.getName(), param.getType(), ColorRGBA.class, lookup); |
||||
} |
||||
return new MatParamProperty<Vector4f>(param.getName(), param.getType(), Vector4f.class, lookup); |
||||
case Vector4Array: |
||||
return new MatParamProperty<Object>(param.getName(), param.getType(), Object.class, lookup); |
||||
default: |
||||
return null; |
||||
} |
||||
} |
||||
|
||||
private static VarType getVarType(String type) { |
||||
VarType vType = null; |
||||
if (type.equals("Color")) { |
||||
vType = VarType.Vector4; |
||||
} else { |
||||
vType = VarType.valueOf(type); |
||||
} |
||||
return vType; |
||||
} |
||||
|
||||
|
||||
} |
@ -0,0 +1,94 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.navigator.node.properties; |
||||
|
||||
import com.jme3.math.Vector2f; |
||||
import java.awt.Component; |
||||
import java.awt.event.ActionListener; |
||||
import java.beans.PropertyEditor; |
||||
import java.util.logging.Level; |
||||
import java.util.logging.Logger; |
||||
import javax.swing.JComponent; |
||||
import javax.swing.KeyStroke; |
||||
import org.openide.explorer.propertysheet.InplaceEditor; |
||||
import org.openide.explorer.propertysheet.PropertyEnv; |
||||
import org.openide.explorer.propertysheet.PropertyModel; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public class VectorInplaceEditor implements InplaceEditor { |
||||
|
||||
private VectorTextField field; |
||||
private PropertyEditor editor = null; |
||||
private PropertyModel model; |
||||
private PropertyEnv env; |
||||
|
||||
public VectorInplaceEditor(int capacity) { |
||||
field = new VectorTextField(capacity); |
||||
} |
||||
|
||||
public void connect(PropertyEditor pe, PropertyEnv env) { |
||||
editor = pe; |
||||
this.env = env; |
||||
reset(); |
||||
} |
||||
|
||||
public JComponent getComponent() { |
||||
return field; |
||||
} |
||||
|
||||
public void clear() { |
||||
editor = null; |
||||
model = null; |
||||
} |
||||
|
||||
public Object getValue() { |
||||
return field.getText(); |
||||
} |
||||
|
||||
public void setValue(Object o) { |
||||
field.setText((String) o); |
||||
} |
||||
|
||||
public boolean supportsTextEntry() { |
||||
return true; |
||||
} |
||||
|
||||
public void reset() { |
||||
if (editor.getValue() != null) { |
||||
field.setText((String) editor.getValue()); |
||||
} |
||||
} |
||||
|
||||
public void addActionListener(ActionListener al) { |
||||
field.addActionListener(al); |
||||
} |
||||
|
||||
public void removeActionListener(ActionListener al) { |
||||
field.removeActionListener(al); |
||||
} |
||||
|
||||
public KeyStroke[] getKeyStrokes() { |
||||
return new KeyStroke[0]; |
||||
} |
||||
|
||||
public PropertyEditor getPropertyEditor() { |
||||
return editor; |
||||
} |
||||
|
||||
public PropertyModel getPropertyModel() { |
||||
return model; |
||||
} |
||||
|
||||
public void setPropertyModel(PropertyModel pm) { |
||||
model = pm; |
||||
} |
||||
|
||||
public boolean isKnownComponent(Component cmpnt) { |
||||
return cmpnt == field || field.isAncestorOf(cmpnt); |
||||
} |
||||
} |
@ -0,0 +1,47 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.navigator.node.properties; |
||||
|
||||
import java.beans.PropertyEditorSupport; |
||||
import org.openide.explorer.propertysheet.ExPropertyEditor; |
||||
import org.openide.explorer.propertysheet.InplaceEditor; |
||||
import org.openide.explorer.propertysheet.PropertyEnv; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public class VectorPropertyEditor extends PropertyEditorSupport implements ExPropertyEditor, InplaceEditor.Factory { |
||||
|
||||
private PropertyEnv env; |
||||
private VectorInplaceEditor editor; |
||||
|
||||
public VectorPropertyEditor(int capacity) { |
||||
editor = new VectorInplaceEditor(capacity); |
||||
} |
||||
|
||||
public void attachEnv(PropertyEnv env) { |
||||
this.env = env; |
||||
env.registerInplaceEditorFactory(this); |
||||
} |
||||
|
||||
public InplaceEditor getInplaceEditor() { |
||||
return editor; |
||||
} |
||||
|
||||
@Override |
||||
public String getAsText() { |
||||
return (String) editor.getValue(); |
||||
} |
||||
|
||||
|
||||
|
||||
@Override |
||||
public void setAsText(String text) throws IllegalArgumentException { |
||||
editor.setValue(text); |
||||
} |
||||
|
||||
|
||||
} |
@ -0,0 +1,170 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.navigator.node.properties; |
||||
|
||||
import java.awt.KeyboardFocusManager; |
||||
import java.awt.event.FocusEvent; |
||||
import java.awt.event.FocusListener; |
||||
import java.awt.event.KeyEvent; |
||||
import java.awt.event.KeyListener; |
||||
import java.awt.event.MouseEvent; |
||||
import java.awt.event.MouseListener; |
||||
import java.util.logging.Level; |
||||
import java.util.logging.Logger; |
||||
import javax.swing.JTextField; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public class VectorTextField extends JTextField implements KeyListener, MouseListener, FocusListener { |
||||
|
||||
private int index = 0; |
||||
private int capacity = 4; |
||||
private boolean pressed = false; |
||||
private String backup; |
||||
|
||||
public VectorTextField(int capacity) { |
||||
setFocusTraversalKeysEnabled(false); |
||||
addKeyListener(this); |
||||
addFocusListener(this); |
||||
addMouseListener(this); |
||||
setFocusTraversalKeysEnabled(false); |
||||
this.capacity = capacity; |
||||
backup = "["; |
||||
for (int i = 0; i < capacity; i++) { |
||||
backup += "0"; |
||||
if (i != capacity - 1) { |
||||
backup += ","; |
||||
} |
||||
} |
||||
backup += "]"; |
||||
} |
||||
|
||||
@Override |
||||
public void keyTyped(KeyEvent e) { |
||||
} |
||||
|
||||
@Override |
||||
public void keyPressed(KeyEvent e) { |
||||
//
|
||||
if (e.getKeyCode() == KeyEvent.VK_TAB) { |
||||
if (checkValidity()) { |
||||
backup = getText(); |
||||
if (e.getModifiersEx() == KeyEvent.SHIFT_DOWN_MASK) { |
||||
index = index - 1; |
||||
|
||||
} else { |
||||
index = index + 1; |
||||
} |
||||
if (index == capacity) { |
||||
KeyboardFocusManager.getCurrentKeyboardFocusManager().focusNextComponent(); |
||||
return; |
||||
} |
||||
if (index == -1) { |
||||
KeyboardFocusManager.getCurrentKeyboardFocusManager().focusPreviousComponent(); |
||||
return; |
||||
} |
||||
|
||||
} else { |
||||
setText(backup); |
||||
Logger.getLogger(VectorTextField.class.getName()).log(Level.WARNING, "Invalid format"); |
||||
} |
||||
findSelection(0); |
||||
} |
||||
} |
||||
|
||||
private boolean checkValidity() { |
||||
String[] values = extractValues(); |
||||
return values.length == capacity; |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void keyReleased(KeyEvent e) { |
||||
} |
||||
|
||||
@Override |
||||
public void mouseClicked(MouseEvent e) { |
||||
} |
||||
|
||||
@Override |
||||
public void mousePressed(MouseEvent e) { |
||||
init(); |
||||
pressed = true; |
||||
} |
||||
|
||||
@Override |
||||
public void mouseReleased(MouseEvent e) { |
||||
init(); |
||||
index = findSelection(getCaretPosition()); |
||||
pressed = false; |
||||
} |
||||
|
||||
@Override |
||||
public void mouseEntered(MouseEvent e) { |
||||
} |
||||
|
||||
@Override |
||||
public void mouseExited(MouseEvent e) { |
||||
} |
||||
|
||||
@Override |
||||
public void focusGained(FocusEvent e) { |
||||
if (!pressed) { |
||||
init(); |
||||
findSelection(0); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void focusLost(FocusEvent e) { |
||||
} |
||||
|
||||
private void init() { |
||||
index = 0; |
||||
if (getText().trim().equals("")) { |
||||
setText(backup); |
||||
setCaretPosition(1); |
||||
} |
||||
|
||||
} |
||||
|
||||
|
||||
|
||||
public void clear() { |
||||
setText(""); |
||||
} |
||||
|
||||
private int findSelection(int caretPosition) { |
||||
String[] values = extractValues(); |
||||
int start = 0;// = 1;
|
||||
int end = 0;// = values[0].length() + start;
|
||||
if (caretPosition == getText().length()) { |
||||
caretPosition--; |
||||
} |
||||
int i; |
||||
if (caretPosition != 0) { |
||||
for (i = 0; caretPosition > end; i++) { |
||||
start = end + 1; |
||||
end = values[i].length() + start; |
||||
} |
||||
i--; |
||||
} else { |
||||
for (i = 0; i <= index; i++) { |
||||
start = end + 1; |
||||
end = values[i].length() + start; |
||||
} |
||||
} |
||||
select(start, end); |
||||
return i; |
||||
} |
||||
|
||||
private String[] extractValues() { |
||||
String text = getText().replaceAll("[\\[\\]]", ""); |
||||
String[] values = text.split(","); |
||||
return values; |
||||
} |
||||
} |
@ -0,0 +1,4 @@ |
||||
ShaderVisualToolBar.jLabel1.text=Version : |
||||
ShaderVisualToolBar.vertButton.toolTipText=Vertex Shader |
||||
ShaderVisualToolBar.fragButton.actionCommand= |
||||
ShaderVisualToolBar.fragButton.toolTipText=Fragment Shader |
@ -0,0 +1,44 @@ |
||||
<?xml version="1.0" encoding="UTF-8" ?> |
||||
|
||||
<Form version="1.4" maxVersion="1.8" type="org.netbeans.modules.form.forminfo.JPanelFormInfo"> |
||||
<AuxValues> |
||||
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/> |
||||
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/> |
||||
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/> |
||||
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/> |
||||
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/> |
||||
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/> |
||||
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/> |
||||
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/> |
||||
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/> |
||||
</AuxValues> |
||||
|
||||
<Layout> |
||||
<DimensionLayout dim="0"> |
||||
<Group type="103" groupAlignment="0" attributes="0"> |
||||
<Component id="jScrollPane1" alignment="0" max="32767" attributes="0"/> |
||||
</Group> |
||||
</DimensionLayout> |
||||
<DimensionLayout dim="1"> |
||||
<Group type="103" groupAlignment="0" attributes="0"> |
||||
<Component id="jScrollPane1" alignment="0" pref="300" max="32767" attributes="0"/> |
||||
</Group> |
||||
</DimensionLayout> |
||||
</Layout> |
||||
<SubComponents> |
||||
<Container class="javax.swing.JScrollPane" name="jScrollPane1"> |
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/> |
||||
<SubComponents> |
||||
<Component class="javax.swing.JEditorPane" name="jEditorPane1"> |
||||
<Properties> |
||||
<Property name="editable" type="boolean" value="false"/> |
||||
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor"> |
||||
<Font name="Monospaced" size="13" style="0"/> |
||||
</Property> |
||||
</Properties> |
||||
</Component> |
||||
</SubComponents> |
||||
</Container> |
||||
</SubComponents> |
||||
</Form> |
@ -0,0 +1,169 @@ |
||||
/* |
||||
* 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.materialdefinition.shadervisual; |
||||
|
||||
import com.jme3.gde.core.assets.ProjectAssetManager; |
||||
import com.jme3.gde.materialdefinition.EditableMatDefFile; |
||||
import com.jme3.gde.materialdefinition.MatDefDataObject; |
||||
import javax.swing.Action; |
||||
import javax.swing.JComponent; |
||||
import javax.swing.JPanel; |
||||
import org.netbeans.core.spi.multiview.CloseOperationState; |
||||
import org.netbeans.core.spi.multiview.MultiViewElement; |
||||
import org.netbeans.core.spi.multiview.MultiViewElementCallback; |
||||
import org.openide.awt.UndoRedo; |
||||
import org.openide.util.Lookup; |
||||
import org.openide.util.NbBundle.Messages; |
||||
import org.openide.windows.TopComponent; |
||||
|
||||
@MultiViewElement.Registration( |
||||
displayName = "#LBL_MatDef_SHADER", |
||||
iconBase = "com/jme3/gde/materialdefinition/icons/matdef.png", |
||||
mimeType = "text/jme-materialdefinition", |
||||
persistenceType = TopComponent.PERSISTENCE_ONLY_OPENED, |
||||
preferredID = "MatDefVisual", |
||||
position = 3000) |
||||
@Messages("LBL_MatDef_SHADER=Shader") |
||||
public final class MatDefShaderElement extends JPanel implements MultiViewElement { |
||||
|
||||
private MatDefDataObject obj; |
||||
private ShaderVisualToolBar toolbar = new ShaderVisualToolBar(); |
||||
private transient MultiViewElementCallback callback; |
||||
|
||||
public MatDefShaderElement(Lookup lkp) { |
||||
obj = lkp.lookup(MatDefDataObject.class); |
||||
assert obj != null; |
||||
initComponents(); |
||||
toolbar.setParent(this); |
||||
refresh(); |
||||
} |
||||
|
||||
public final void refresh() { |
||||
jEditorPane1.setText(obj.getEditableFile().getShaderCode(toolbar.getVersion(), toolbar.getType())); |
||||
} |
||||
|
||||
@Override |
||||
public String getName() { |
||||
return "MatDefVisualElement"; |
||||
} |
||||
|
||||
/** |
||||
* This method is called from within the constructor to initialize the form. |
||||
* WARNING: Do NOT modify this code. The content of this method is always |
||||
* regenerated by the Form Editor. |
||||
*/ |
||||
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
||||
private void initComponents() { |
||||
|
||||
jScrollPane1 = new javax.swing.JScrollPane(); |
||||
jEditorPane1 = new javax.swing.JEditorPane(); |
||||
|
||||
jEditorPane1.setEditable(false); |
||||
jEditorPane1.setFont(new java.awt.Font("Monospaced", 0, 13)); // NOI18N
|
||||
jScrollPane1.setViewportView(jEditorPane1); |
||||
|
||||
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); |
||||
this.setLayout(layout); |
||||
layout.setHorizontalGroup( |
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) |
||||
.addComponent(jScrollPane1) |
||||
); |
||||
layout.setVerticalGroup( |
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) |
||||
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 300, Short.MAX_VALUE) |
||||
); |
||||
}// </editor-fold>//GEN-END:initComponents
|
||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||
private javax.swing.JEditorPane jEditorPane1; |
||||
private javax.swing.JScrollPane jScrollPane1; |
||||
// End of variables declaration//GEN-END:variables
|
||||
|
||||
@Override |
||||
public JComponent getVisualRepresentation() { |
||||
return this; |
||||
} |
||||
|
||||
@Override |
||||
public JComponent getToolbarRepresentation() { |
||||
return toolbar; |
||||
} |
||||
|
||||
@Override |
||||
public Action[] getActions() { |
||||
return new Action[0]; |
||||
} |
||||
|
||||
@Override |
||||
public Lookup getLookup() { |
||||
return obj.getLookup(); |
||||
} |
||||
|
||||
@Override |
||||
public void componentOpened() { |
||||
} |
||||
|
||||
@Override |
||||
public void componentClosed() { |
||||
} |
||||
|
||||
@Override |
||||
public void componentShowing() { |
||||
} |
||||
|
||||
@Override |
||||
public void componentHidden() { |
||||
} |
||||
|
||||
@Override |
||||
public void componentActivated() { |
||||
refresh(); |
||||
} |
||||
|
||||
@Override |
||||
public void componentDeactivated() { |
||||
} |
||||
|
||||
@Override |
||||
public UndoRedo getUndoRedo() { |
||||
return UndoRedo.NONE; |
||||
} |
||||
|
||||
@Override |
||||
public void setMultiViewCallback(MultiViewElementCallback callback) { |
||||
this.callback = callback; |
||||
} |
||||
|
||||
@Override |
||||
public CloseOperationState canCloseElement() { |
||||
return CloseOperationState.STATE_OK; |
||||
} |
||||
} |
@ -0,0 +1,105 @@ |
||||
<?xml version="1.0" encoding="UTF-8" ?> |
||||
|
||||
<Form version="1.5" maxVersion="1.8" type="org.netbeans.modules.form.forminfo.JPanelFormInfo"> |
||||
<NonVisualComponents> |
||||
<Component class="javax.swing.ButtonGroup" name="btnGroup"> |
||||
</Component> |
||||
</NonVisualComponents> |
||||
<AuxValues> |
||||
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="1"/> |
||||
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/> |
||||
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/> |
||||
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="true"/> |
||||
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="true"/> |
||||
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/> |
||||
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/> |
||||
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/> |
||||
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/> |
||||
</AuxValues> |
||||
|
||||
<Layout> |
||||
<DimensionLayout dim="0"> |
||||
<Group type="103" groupAlignment="0" attributes="0"> |
||||
<Group type="102" alignment="0" attributes="0"> |
||||
<Component id="vertButton" min="-2" pref="25" max="-2" attributes="0"/> |
||||
<EmptySpace max="-2" attributes="0"/> |
||||
<Component id="fragButton" min="-2" pref="25" max="-2" attributes="0"/> |
||||
<EmptySpace min="-2" pref="10" max="-2" attributes="0"/> |
||||
<Component id="jLabel1" min="-2" max="-2" attributes="0"/> |
||||
<EmptySpace max="-2" attributes="0"/> |
||||
<Component id="versionList" min="-2" pref="131" max="-2" attributes="0"/> |
||||
<EmptySpace pref="154" max="32767" attributes="0"/> |
||||
</Group> |
||||
</Group> |
||||
</DimensionLayout> |
||||
<DimensionLayout dim="1"> |
||||
<Group type="103" groupAlignment="0" attributes="0"> |
||||
<Component id="fragButton" alignment="1" min="-2" pref="25" max="-2" attributes="0"/> |
||||
<Group type="103" groupAlignment="3" attributes="0"> |
||||
<Component id="jLabel1" alignment="3" max="-2" attributes="0"/> |
||||
<Component id="versionList" alignment="3" min="-2" max="-2" attributes="0"/> |
||||
<Component id="vertButton" alignment="3" min="-2" pref="25" max="-2" attributes="0"/> |
||||
</Group> |
||||
</Group> |
||||
</DimensionLayout> |
||||
</Layout> |
||||
<SubComponents> |
||||
<Component class="javax.swing.JLabel" name="jLabel1"> |
||||
<Properties> |
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor"> |
||||
<ResourceString bundle="com/jme3/gde/materialdefinition/shadervisual/Bundle.properties" key="ShaderVisualToolBar.jLabel1.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/> |
||||
</Property> |
||||
</Properties> |
||||
</Component> |
||||
<Component class="javax.swing.JComboBox" name="versionList"> |
||||
<Properties> |
||||
<Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor"> |
||||
<StringArray count="2"> |
||||
<StringItem index="0" value="GLSL100"/> |
||||
<StringItem index="1" value="GLSL150"/> |
||||
</StringArray> |
||||
</Property> |
||||
</Properties> |
||||
<Events> |
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="versionListActionPerformed"/> |
||||
</Events> |
||||
</Component> |
||||
<Component class="javax.swing.JToggleButton" name="vertButton"> |
||||
<Properties> |
||||
<Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor"> |
||||
<ComponentRef name="btnGroup"/> |
||||
</Property> |
||||
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.RADConnectionPropertyEditor"> |
||||
<Connection code="Icons.vert" type="code"/> |
||||
</Property> |
||||
<Property name="selected" type="boolean" value="true"/> |
||||
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor"> |
||||
<ResourceString bundle="com/jme3/gde/materialdefinition/shadervisual/Bundle.properties" key="ShaderVisualToolBar.vertButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/> |
||||
</Property> |
||||
<Property name="iconTextGap" type="int" value="0"/> |
||||
</Properties> |
||||
<Events> |
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="vertButtonActionPerformed"/> |
||||
</Events> |
||||
</Component> |
||||
<Component class="javax.swing.JToggleButton" name="fragButton"> |
||||
<Properties> |
||||
<Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor"> |
||||
<ComponentRef name="btnGroup"/> |
||||
</Property> |
||||
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.RADConnectionPropertyEditor"> |
||||
<Connection code="Icons.frag" type="code"/> |
||||
</Property> |
||||
<Property name="toolTipText" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor"> |
||||
<ResourceString bundle="com/jme3/gde/materialdefinition/shadervisual/Bundle.properties" key="ShaderVisualToolBar.fragButton.toolTipText" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/> |
||||
</Property> |
||||
<Property name="actionCommand" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor"> |
||||
<ResourceString bundle="com/jme3/gde/materialdefinition/shadervisual/Bundle.properties" key="ShaderVisualToolBar.fragButton.actionCommand" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/> |
||||
</Property> |
||||
</Properties> |
||||
<Events> |
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="fragButtonActionPerformed"/> |
||||
</Events> |
||||
</Component> |
||||
</SubComponents> |
||||
</Form> |
@ -0,0 +1,128 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.shadervisual; |
||||
|
||||
import com.jme3.gde.materialdefinition.icons.Icons; |
||||
import com.jme3.shader.Shader; |
||||
|
||||
/** |
||||
* |
||||
* @author Nehon |
||||
*/ |
||||
public class ShaderVisualToolBar extends javax.swing.JPanel { |
||||
|
||||
private MatDefShaderElement parent; |
||||
|
||||
/** |
||||
* Creates new form ShaderVisualToolBar |
||||
*/ |
||||
public ShaderVisualToolBar() { |
||||
initComponents(); |
||||
} |
||||
|
||||
public void setParent(MatDefShaderElement parent) { |
||||
this.parent = parent; |
||||
} |
||||
|
||||
/** |
||||
* This method is called from within the constructor to initialize the form. |
||||
* WARNING: Do NOT modify this code. The content of this method is always |
||||
* regenerated by the Form Editor. |
||||
*/ |
||||
@SuppressWarnings("unchecked") |
||||
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
||||
private void initComponents() { |
||||
|
||||
btnGroup = new javax.swing.ButtonGroup(); |
||||
jLabel1 = new javax.swing.JLabel(); |
||||
versionList = new javax.swing.JComboBox(); |
||||
vertButton = new javax.swing.JToggleButton(); |
||||
fragButton = new javax.swing.JToggleButton(); |
||||
|
||||
org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(ShaderVisualToolBar.class, "ShaderVisualToolBar.jLabel1.text")); // NOI18N
|
||||
|
||||
versionList.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "GLSL100", "GLSL150" })); |
||||
versionList.addActionListener(new java.awt.event.ActionListener() { |
||||
public void actionPerformed(java.awt.event.ActionEvent evt) { |
||||
versionListActionPerformed(evt); |
||||
} |
||||
}); |
||||
|
||||
btnGroup.add(vertButton); |
||||
vertButton.setIcon(Icons.vert); |
||||
vertButton.setSelected(true); |
||||
vertButton.setToolTipText(org.openide.util.NbBundle.getMessage(ShaderVisualToolBar.class, "ShaderVisualToolBar.vertButton.toolTipText")); // NOI18N
|
||||
vertButton.setIconTextGap(0); |
||||
vertButton.addActionListener(new java.awt.event.ActionListener() { |
||||
public void actionPerformed(java.awt.event.ActionEvent evt) { |
||||
vertButtonActionPerformed(evt); |
||||
} |
||||
}); |
||||
|
||||
btnGroup.add(fragButton); |
||||
fragButton.setIcon(Icons.frag); |
||||
fragButton.setToolTipText(org.openide.util.NbBundle.getMessage(ShaderVisualToolBar.class, "ShaderVisualToolBar.fragButton.toolTipText")); // NOI18N
|
||||
fragButton.setActionCommand(org.openide.util.NbBundle.getMessage(ShaderVisualToolBar.class, "ShaderVisualToolBar.fragButton.actionCommand")); // NOI18N
|
||||
fragButton.addActionListener(new java.awt.event.ActionListener() { |
||||
public void actionPerformed(java.awt.event.ActionEvent evt) { |
||||
fragButtonActionPerformed(evt); |
||||
} |
||||
}); |
||||
|
||||
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); |
||||
this.setLayout(layout); |
||||
layout.setHorizontalGroup( |
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) |
||||
.addGroup(layout.createSequentialGroup() |
||||
.addComponent(vertButton, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE) |
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) |
||||
.addComponent(fragButton, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE) |
||||
.addGap(10, 10, 10) |
||||
.addComponent(jLabel1) |
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) |
||||
.addComponent(versionList, javax.swing.GroupLayout.PREFERRED_SIZE, 131, javax.swing.GroupLayout.PREFERRED_SIZE) |
||||
.addContainerGap(154, Short.MAX_VALUE)) |
||||
); |
||||
layout.setVerticalGroup( |
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) |
||||
.addComponent(fragButton, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE) |
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) |
||||
.addComponent(jLabel1) |
||||
.addComponent(versionList, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) |
||||
.addComponent(vertButton, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)) |
||||
); |
||||
}// </editor-fold>//GEN-END:initComponents
|
||||
|
||||
private void vertButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_vertButtonActionPerformed
|
||||
parent.refresh(); |
||||
}//GEN-LAST:event_vertButtonActionPerformed
|
||||
|
||||
private void fragButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_fragButtonActionPerformed
|
||||
parent.refresh(); |
||||
}//GEN-LAST:event_fragButtonActionPerformed
|
||||
|
||||
private void versionListActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_versionListActionPerformed
|
||||
parent.refresh(); |
||||
}//GEN-LAST:event_versionListActionPerformed
|
||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||
private javax.swing.ButtonGroup btnGroup; |
||||
private javax.swing.JToggleButton fragButton; |
||||
private javax.swing.JLabel jLabel1; |
||||
private javax.swing.JComboBox versionList; |
||||
private javax.swing.JToggleButton vertButton; |
||||
// End of variables declaration//GEN-END:variables
|
||||
|
||||
public String getVersion() { |
||||
return versionList.getSelectedItem().toString(); |
||||
} |
||||
|
||||
public Shader.ShaderType getType() { |
||||
if (btnGroup.isSelected(vertButton.getModel())) { |
||||
return Shader.ShaderType.Vertex; |
||||
} else { |
||||
return Shader.ShaderType.Fragment; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,97 @@ |
||||
/* |
||||
* To change this template, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package com.jme3.gde.materialdefinition.utils; |
||||
|
||||
import com.jme3.gde.materialdefinition.dialog.AddNodeDialog; |
||||
import com.jme3.gde.materialdefinition.icons.Icons; |
||||
import com.jme3.shader.ShaderNodeDefinition; |
||||
import java.util.logging.Level; |
||||
import java.util.logging.Logger; |
||||
import javax.swing.text.BadLocationException; |
||||
import javax.swing.text.Style; |
||||
import javax.swing.text.StyleConstants; |
||||
import javax.swing.text.StyleContext; |
||||
import javax.swing.text.StyledDocument; |
||||
|
||||
/** |
||||
* |
||||
* @author m327836 |
||||
*/ |
||||
public class DocFormatter { |
||||
|
||||
private static DocFormatter instance; |
||||
private Style regStyle = StyleContext.getDefaultStyleContext(). |
||||
getStyle(StyleContext.DEFAULT_STYLE); |
||||
|
||||
private DocFormatter() { |
||||
} |
||||
|
||||
public static DocFormatter getInstance() { |
||||
if (instance == null) { |
||||
instance = new DocFormatter(); |
||||
} |
||||
return instance; |
||||
} |
||||
|
||||
private void makeStyles(StyledDocument doc) { |
||||
Style s1 = doc.addStyle("regular", regStyle); |
||||
StyleConstants.setFontFamily(s1, "SansSerif"); |
||||
Style s2 = doc.addStyle("bold", s1); |
||||
StyleConstants.setBold(s2, true); |
||||
Style icon = doc.addStyle("input", s1); |
||||
StyleConstants.setAlignment(icon, StyleConstants.ALIGN_CENTER); |
||||
StyleConstants.setSpaceAbove(icon, 8); |
||||
StyleConstants.setIcon(icon, Icons.in); |
||||
Style icon2 = doc.addStyle("output", s1); |
||||
StyleConstants.setAlignment(icon2, StyleConstants.ALIGN_CENTER); |
||||
StyleConstants.setSpaceAbove(icon2, 8); |
||||
StyleConstants.setIcon(icon2, Icons.out); |
||||
|
||||
|
||||
} |
||||
|
||||
public static void addDoc(ShaderNodeDefinition def, StyledDocument doc) { |
||||
|
||||
if (doc.getStyle("regular") == null) { |
||||
getInstance().makeStyles(doc); |
||||
} |
||||
|
||||
try { |
||||
String[] lines = def.getDocumentation().split("\\n"); |
||||
doc.insertString(doc.getLength(), "Shader type : " + def.getType().toString() + "\n", doc.getStyle("regular")); |
||||
|
||||
for (int i = 0; i < def.getShadersLanguage().size(); i++) { |
||||
doc.insertString(doc.getLength(), "Shader : " + def.getShadersLanguage().get(i) + " " + def.getShadersPath().get(i) + "\n", doc.getStyle("regular")); |
||||
} |
||||
// doc.insertString(doc.getLength(), "\n", doc.getStyle("regular"));
|
||||
|
||||
for (String string : lines) { |
||||
String l = string.trim() + "\n"; |
||||
if (l.startsWith("@input")) { |
||||
l = l.substring(6).trim(); |
||||
int spaceIdx = l.indexOf(' '); |
||||
doc.insertString(doc.getLength(), "\n", doc.getStyle("regular")); |
||||
doc.insertString(doc.getLength(), " ", doc.getStyle("input")); |
||||
doc.insertString(doc.getLength(), l.substring(0, spaceIdx), doc.getStyle("bold")); |
||||
doc.insertString(doc.getLength(), l.substring(spaceIdx), doc.getStyle("regular")); |
||||
|
||||
} else if (l.startsWith("@output")) { |
||||
l = l.substring(7).trim(); |
||||
int spaceIdx = l.indexOf(' '); |
||||
doc.insertString(doc.getLength(), "\n", doc.getStyle("regular")); |
||||
doc.insertString(doc.getLength(), " ", doc.getStyle("output")); |
||||
doc.insertString(doc.getLength(), l.substring(0, spaceIdx), doc.getStyle("bold")); |
||||
doc.insertString(doc.getLength(), l.substring(spaceIdx), doc.getStyle("regular")); |
||||
|
||||
} else { |
||||
doc.insertString(doc.getLength(), l, doc.getStyle("regular")); |
||||
} |
||||
|
||||
} |
||||
} catch (BadLocationException ex) { |
||||
Logger.getLogger(AddNodeDialog.class.getName()).log(Level.SEVERE, null, ex); |
||||
} |
||||
} |
||||
} |