From 3e8f6250e5fe21a275249beb122158059524ebfb Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 13 Sep 2025 05:10:59 +0000 Subject: [PATCH 1/6] Initial plan From 46f36014474e079e91655094d35505934f74709a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 13 Sep 2025 05:18:07 +0000 Subject: [PATCH 2/6] Add code-based J3MD template and shader templates Co-authored-by: neph1 <7988802+neph1@users.noreply.github.com> --- gradlew | 0 .../jme3/gde/materialdefinition/BasicShader.frag | 7 +++++++ .../jme3/gde/materialdefinition/BasicShader.vert | 9 +++++++++ .../gde/materialdefinition/CodeBasedMatDef.j3md | 16 ++++++++++++++++ .../gde/materialdefinition/package-info.java | 8 +++++++- 5 files changed, 39 insertions(+), 1 deletion(-) mode change 100644 => 100755 gradlew create mode 100644 jme3-materialeditor/src/com/jme3/gde/materialdefinition/BasicShader.frag create mode 100644 jme3-materialeditor/src/com/jme3/gde/materialdefinition/BasicShader.vert create mode 100644 jme3-materialeditor/src/com/jme3/gde/materialdefinition/CodeBasedMatDef.j3md diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 diff --git a/jme3-materialeditor/src/com/jme3/gde/materialdefinition/BasicShader.frag b/jme3-materialeditor/src/com/jme3/gde/materialdefinition/BasicShader.frag new file mode 100644 index 000000000..e35999b29 --- /dev/null +++ b/jme3-materialeditor/src/com/jme3/gde/materialdefinition/BasicShader.frag @@ -0,0 +1,7 @@ +#import "Common/ShaderLib/GLSLCompat.glsllib" + +uniform vec4 m_Color; + +void main(){ + gl_FragColor = m_Color; +} \ No newline at end of file diff --git a/jme3-materialeditor/src/com/jme3/gde/materialdefinition/BasicShader.vert b/jme3-materialeditor/src/com/jme3/gde/materialdefinition/BasicShader.vert new file mode 100644 index 000000000..e5b86c68f --- /dev/null +++ b/jme3-materialeditor/src/com/jme3/gde/materialdefinition/BasicShader.vert @@ -0,0 +1,9 @@ +#import "Common/ShaderLib/GLSLCompat.glsllib" + +attribute vec3 inPosition; + +uniform mat4 g_WorldViewProjectionMatrix; + +void main(){ + gl_Position = g_WorldViewProjectionMatrix * vec4(inPosition, 1.0); +} \ No newline at end of file diff --git a/jme3-materialeditor/src/com/jme3/gde/materialdefinition/CodeBasedMatDef.j3md b/jme3-materialeditor/src/com/jme3/gde/materialdefinition/CodeBasedMatDef.j3md new file mode 100644 index 000000000..6865dc954 --- /dev/null +++ b/jme3-materialeditor/src/com/jme3/gde/materialdefinition/CodeBasedMatDef.j3md @@ -0,0 +1,16 @@ +MaterialDef ${name} { + + MaterialParameters { + Vector4 Color + } + + Technique { + VertexShader GLSL100: ${name}.vert + FragmentShader GLSL100: ${name}.frag + + WorldParameters { + WorldViewProjectionMatrix + } + } + +} \ No newline at end of file diff --git a/jme3-materialeditor/src/com/jme3/gde/materialdefinition/package-info.java b/jme3-materialeditor/src/com/jme3/gde/materialdefinition/package-info.java index 9320762d5..486eee34d 100644 --- a/jme3-materialeditor/src/com/jme3/gde/materialdefinition/package-info.java +++ b/jme3-materialeditor/src/com/jme3/gde/materialdefinition/package-info.java @@ -29,7 +29,13 @@ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -@TemplateRegistration(folder = "Material", content = "MatDef.j3md", displayName="Material Definition Template") +@TemplateRegistrations({ + @TemplateRegistration(folder = "Material", content = "MatDef.j3md", displayName="Material Definition Template (Shader Nodes)"), + @TemplateRegistration(folder = "Material", content = "CodeBasedMatDef.j3md", displayName="Material Definition Template (Code Based)", position = 100), + @TemplateRegistration(folder = "GLSL", content = "BasicShader.vert", displayName="Vertex Shader Template", position = 200), + @TemplateRegistration(folder = "GLSL", content = "BasicShader.frag", displayName="Fragment Shader Template", position = 300) +}) package com.jme3.gde.materialdefinition; import org.netbeans.api.templates.TemplateRegistration; +import org.netbeans.api.templates.TemplateRegistrations; From 4723cb111e911eb5561d33ffcbffcb0d2b85dca1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 13 Sep 2025 05:19:51 +0000 Subject: [PATCH 3/6] Refine shader templates to match JME conventions Co-authored-by: neph1 <7988802+neph1@users.noreply.github.com> --- .../src/com/jme3/gde/materialdefinition/BasicShader.frag | 2 -- .../src/com/jme3/gde/materialdefinition/BasicShader.vert | 4 +--- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/jme3-materialeditor/src/com/jme3/gde/materialdefinition/BasicShader.frag b/jme3-materialeditor/src/com/jme3/gde/materialdefinition/BasicShader.frag index e35999b29..564f13bb8 100644 --- a/jme3-materialeditor/src/com/jme3/gde/materialdefinition/BasicShader.frag +++ b/jme3-materialeditor/src/com/jme3/gde/materialdefinition/BasicShader.frag @@ -1,5 +1,3 @@ -#import "Common/ShaderLib/GLSLCompat.glsllib" - uniform vec4 m_Color; void main(){ diff --git a/jme3-materialeditor/src/com/jme3/gde/materialdefinition/BasicShader.vert b/jme3-materialeditor/src/com/jme3/gde/materialdefinition/BasicShader.vert index e5b86c68f..06b352f7a 100644 --- a/jme3-materialeditor/src/com/jme3/gde/materialdefinition/BasicShader.vert +++ b/jme3-materialeditor/src/com/jme3/gde/materialdefinition/BasicShader.vert @@ -1,9 +1,7 @@ -#import "Common/ShaderLib/GLSLCompat.glsllib" +uniform mat4 g_WorldViewProjectionMatrix; attribute vec3 inPosition; -uniform mat4 g_WorldViewProjectionMatrix; - void main(){ gl_Position = g_WorldViewProjectionMatrix * vec4(inPosition, 1.0); } \ No newline at end of file From b158aafe1249b5defed8be857241d4ef0c6b7dfb Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 13 Sep 2025 06:36:34 +0000 Subject: [PATCH 4/6] Fix template registration and enable FreeMarker variable substitution Co-authored-by: neph1 <7988802+neph1@users.noreply.github.com> --- .../com/jme3/gde/materialdefinition/package-info.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/jme3-materialeditor/src/com/jme3/gde/materialdefinition/package-info.java b/jme3-materialeditor/src/com/jme3/gde/materialdefinition/package-info.java index 486eee34d..e1eb41247 100644 --- a/jme3-materialeditor/src/com/jme3/gde/materialdefinition/package-info.java +++ b/jme3-materialeditor/src/com/jme3/gde/materialdefinition/package-info.java @@ -31,9 +31,12 @@ */ @TemplateRegistrations({ @TemplateRegistration(folder = "Material", content = "MatDef.j3md", displayName="Material Definition Template (Shader Nodes)"), - @TemplateRegistration(folder = "Material", content = "CodeBasedMatDef.j3md", displayName="Material Definition Template (Code Based)", position = 100), - @TemplateRegistration(folder = "GLSL", content = "BasicShader.vert", displayName="Vertex Shader Template", position = 200), - @TemplateRegistration(folder = "GLSL", content = "BasicShader.frag", displayName="Fragment Shader Template", position = 300) + @TemplateRegistration(folder = "Material", content = "CodeBasedMatDef.j3md", displayName="Material Definition Template (Code Based)", + position = 100, scriptEngine = "freemarker"), + @TemplateRegistration(folder = "GLSL", content = "BasicShader.vert", displayName="Vertex Shader Template", + position = 200, scriptEngine = "freemarker"), + @TemplateRegistration(folder = "GLSL", content = "BasicShader.frag", displayName="Fragment Shader Template", + position = 300, scriptEngine = "freemarker") }) package com.jme3.gde.materialdefinition; From 78d2ed71d3edd5db4e6984b25d8886b5146acf11 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 13 Sep 2025 06:37:56 +0000 Subject: [PATCH 5/6] Add name substitution to shader templates and improve template structure Co-authored-by: neph1 <7988802+neph1@users.noreply.github.com> --- .../src/com/jme3/gde/materialdefinition/BasicShader.frag | 1 + .../src/com/jme3/gde/materialdefinition/BasicShader.vert | 1 + 2 files changed, 2 insertions(+) diff --git a/jme3-materialeditor/src/com/jme3/gde/materialdefinition/BasicShader.frag b/jme3-materialeditor/src/com/jme3/gde/materialdefinition/BasicShader.frag index 564f13bb8..a05a2a6c5 100644 --- a/jme3-materialeditor/src/com/jme3/gde/materialdefinition/BasicShader.frag +++ b/jme3-materialeditor/src/com/jme3/gde/materialdefinition/BasicShader.frag @@ -1,3 +1,4 @@ +// Fragment shader for ${name} uniform vec4 m_Color; void main(){ diff --git a/jme3-materialeditor/src/com/jme3/gde/materialdefinition/BasicShader.vert b/jme3-materialeditor/src/com/jme3/gde/materialdefinition/BasicShader.vert index 06b352f7a..321df7577 100644 --- a/jme3-materialeditor/src/com/jme3/gde/materialdefinition/BasicShader.vert +++ b/jme3-materialeditor/src/com/jme3/gde/materialdefinition/BasicShader.vert @@ -1,3 +1,4 @@ +// Vertex shader for ${name} uniform mat4 g_WorldViewProjectionMatrix; attribute vec3 inPosition; From 8d5b12719114d146789b10504687358f9d1a8cc5 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 15 Sep 2025 19:53:38 +0000 Subject: [PATCH 6/6] Implement multi-file template wizard for code-based material definitions Co-authored-by: neph1 <7988802+neph1@users.noreply.github.com> --- .../gde/materialdefinition/package-info.java | 2 - .../wizard/CodeBasedMatDefWizardIterator.java | 199 ++++++++++++++++++ 2 files changed, 199 insertions(+), 2 deletions(-) create mode 100644 jme3-materialeditor/src/com/jme3/gde/materialdefinition/wizard/CodeBasedMatDefWizardIterator.java diff --git a/jme3-materialeditor/src/com/jme3/gde/materialdefinition/package-info.java b/jme3-materialeditor/src/com/jme3/gde/materialdefinition/package-info.java index e1eb41247..ff09738f0 100644 --- a/jme3-materialeditor/src/com/jme3/gde/materialdefinition/package-info.java +++ b/jme3-materialeditor/src/com/jme3/gde/materialdefinition/package-info.java @@ -31,8 +31,6 @@ */ @TemplateRegistrations({ @TemplateRegistration(folder = "Material", content = "MatDef.j3md", displayName="Material Definition Template (Shader Nodes)"), - @TemplateRegistration(folder = "Material", content = "CodeBasedMatDef.j3md", displayName="Material Definition Template (Code Based)", - position = 100, scriptEngine = "freemarker"), @TemplateRegistration(folder = "GLSL", content = "BasicShader.vert", displayName="Vertex Shader Template", position = 200, scriptEngine = "freemarker"), @TemplateRegistration(folder = "GLSL", content = "BasicShader.frag", displayName="Fragment Shader Template", diff --git a/jme3-materialeditor/src/com/jme3/gde/materialdefinition/wizard/CodeBasedMatDefWizardIterator.java b/jme3-materialeditor/src/com/jme3/gde/materialdefinition/wizard/CodeBasedMatDefWizardIterator.java new file mode 100644 index 000000000..ad2149057 --- /dev/null +++ b/jme3-materialeditor/src/com/jme3/gde/materialdefinition/wizard/CodeBasedMatDefWizardIterator.java @@ -0,0 +1,199 @@ +/* + * 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.wizard; + +import java.awt.Component; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.NoSuchElementException; +import java.util.Set; +import javax.swing.JComponent; +import javax.swing.event.ChangeListener; +import org.netbeans.api.project.Project; +import org.netbeans.api.project.ProjectUtils; +import org.netbeans.api.project.SourceGroup; +import org.netbeans.api.project.Sources; +import org.netbeans.api.templates.TemplateRegistration; +import org.netbeans.spi.project.ui.templates.support.Templates; +import org.openide.WizardDescriptor; +import org.openide.filesystems.FileObject; +import org.openide.loaders.DataFolder; +import org.openide.loaders.DataObject; +import org.openide.util.NbBundle.Messages; + +@TemplateRegistration( + folder = "Material", + content = "../CodeBasedMatDef.j3md", + displayName = "Material Definition Template (Code Based with Shaders)", + description = "Creates a material definition file with corresponding vertex and fragment shader files", + position = 100, + scriptEngine = "freemarker" +) +@Messages("CodeBasedMatDefWizardIterator_displayName=Code Based Material Definition with Shaders") +public final class CodeBasedMatDefWizardIterator implements WizardDescriptor.InstantiatingIterator { + + private int index; + private WizardDescriptor wizard; + private List> panels; + + @Override + public Set instantiate() throws IOException { + // Get the target name and directory + String targetName = Templates.getTargetName(wizard); + FileObject dir = Templates.getTargetFolder(wizard); + DataFolder df = DataFolder.findFolder(dir); + + // Prepare template variables + Map args = new HashMap<>(); + args.put("name", targetName); + + // Get template files + FileObject j3mdTemplate = Templates.getTemplate(wizard); + FileObject templateDir = j3mdTemplate.getParent(); + FileObject vertTemplate = templateDir.getFileObject("BasicShader.vert"); + FileObject fragTemplate = templateDir.getFileObject("BasicShader.frag"); + + // Create DataObjects for templates + DataObject j3mdTemplateData = DataObject.find(j3mdTemplate); + DataObject vertTemplateData = DataObject.find(vertTemplate); + DataObject fragTemplateData = DataObject.find(fragTemplate); + + // Create the files + DataObject j3mdFile = j3mdTemplateData.createFromTemplate(df, targetName, args); + vertTemplateData.createFromTemplate(df, targetName + ".vert", args); + fragTemplateData.createFromTemplate(df, targetName + ".frag", args); + + // Return the main j3md file as the primary created file + return Collections.singleton(j3mdFile.getPrimaryFile()); + } + + @Override + public void initialize(WizardDescriptor wizard) { + this.wizard = wizard; + } + + @Override + public void uninitialize(WizardDescriptor wizard) { + panels = null; + } + + @Override + public WizardDescriptor.Panel current() { + return getPanels().get(index); + } + + @Override + public String name() { + return index + 1 + ". from " + getPanels().size(); + } + + @Override + public boolean hasNext() { + return index < getPanels().size() - 1; + } + + @Override + public boolean hasPrevious() { + return index > 0; + } + + @Override + public void nextPanel() { + if (!hasNext()) { + throw new NoSuchElementException(); + } + index++; + } + + @Override + public void previousPanel() { + if (!hasPrevious()) { + throw new NoSuchElementException(); + } + index--; + } + + @Override + public void addChangeListener(ChangeListener l) { + } + + @Override + public void removeChangeListener(ChangeListener l) { + } + + private List> getPanels() { + if (panels == null) { + panels = new ArrayList<>(); + // Use the standard target chooser + Project p = Templates.getProject(wizard); + SourceGroup[] groups = ProjectUtils.getSources(p).getSourceGroups(Sources.TYPE_GENERIC); + WizardDescriptor.Panel targetChooser = Templates.buildSimpleTargetChooser(p, groups).create(); + panels.add(targetChooser); + + String[] steps = createSteps(); + for (int i = 0; i < panels.size(); i++) { + Component c = panels.get(i).getComponent(); + if (steps[i] == null) { + // Default step name to component name of panel. + steps[i] = c.getName(); + } + if (c instanceof JComponent) { // assume Swing components + JComponent jc = (JComponent) c; + jc.putClientProperty(WizardDescriptor.PROP_CONTENT_SELECTED_INDEX, i); + jc.putClientProperty(WizardDescriptor.PROP_CONTENT_DATA, steps); + jc.putClientProperty(WizardDescriptor.PROP_AUTO_WIZARD_STYLE, true); + jc.putClientProperty(WizardDescriptor.PROP_CONTENT_DISPLAYED, true); + jc.putClientProperty(WizardDescriptor.PROP_CONTENT_NUMBERED, true); + } + } + } + return panels; + } + + private String[] createSteps() { + String[] beforeSteps = (String[]) wizard.getProperty(WizardDescriptor.PROP_CONTENT_DATA); + assert beforeSteps != null : "This wizard may only be used embedded in the template wizard"; + String[] res = new String[(beforeSteps.length - 1) + panels.size()]; + for (int i = 0; i < res.length; i++) { + if (i < (beforeSteps.length - 1)) { + res[i] = beforeSteps[i]; + } else { + res[i] = panels.get(i - beforeSteps.length + 1).getComponent().getName(); + } + } + return res; + } +} \ No newline at end of file