소스 검색

Basic Shadow Filter Implementations, however the Properties are broken, so you cannot assign a light which is necessary for some filters.

MeFisto94 8 년 전
부모
커밋
4f1e407f7d
21개의 변경된 파일1654개의 추가작업 그리고 12개의 파일을 삭제
  1. 3 0
      jme3-core/src/com/jme3/gde/core/filters/AbstractFilterNode.java
  2. 29 10
      jme3-core/src/com/jme3/gde/core/filters/impl/JmeFilter.java
  3. 120 0
      jme3-core/src/com/jme3/gde/core/filters/impl/NewDirectionalLightShadowFilterAction.java
  4. 119 0
      jme3-core/src/com/jme3/gde/core/filters/impl/NewPointLightShadowFilterAction.java
  5. 120 0
      jme3-core/src/com/jme3/gde/core/filters/impl/NewSpotLightShadowFilterAction.java
  6. 2 2
      jme3-core/src/com/jme3/gde/core/filters/impl/bloom/Bundle.properties
  7. 7 0
      jme3-core/src/com/jme3/gde/core/filters/impl/dlsf/Bundle.properties
  8. 160 0
      jme3-core/src/com/jme3/gde/core/filters/impl/dlsf/DLSFVisualPanel1.form
  9. 147 0
      jme3-core/src/com/jme3/gde/core/filters/impl/dlsf/DLSFVisualPanel1.java
  10. 73 0
      jme3-core/src/com/jme3/gde/core/filters/impl/dlsf/DLSFWizardAction.java
  11. 106 0
      jme3-core/src/com/jme3/gde/core/filters/impl/dlsf/DLSFWizardPanel1.java
  12. 4 0
      jme3-core/src/com/jme3/gde/core/filters/impl/plsf/Bundle.properties
  13. 108 0
      jme3-core/src/com/jme3/gde/core/filters/impl/plsf/PLSFVisualPanel1.form
  14. 107 0
      jme3-core/src/com/jme3/gde/core/filters/impl/plsf/PLSFVisualPanel1.java
  15. 71 0
      jme3-core/src/com/jme3/gde/core/filters/impl/plsf/PLSFWizardAction.java
  16. 94 0
      jme3-core/src/com/jme3/gde/core/filters/impl/plsf/PLSFWizardPanel1.java
  17. 4 0
      jme3-core/src/com/jme3/gde/core/filters/impl/slsf/Bundle.properties
  18. 108 0
      jme3-core/src/com/jme3/gde/core/filters/impl/slsf/SLSFVisualPanel1.form
  19. 107 0
      jme3-core/src/com/jme3/gde/core/filters/impl/slsf/SLSFVisualPanel1.java
  20. 71 0
      jme3-core/src/com/jme3/gde/core/filters/impl/slsf/SLSFWizardAction.java
  21. 94 0
      jme3-core/src/com/jme3/gde/core/filters/impl/slsf/SLSFWizardPanel1.java

+ 3 - 0
jme3-core/src/com/jme3/gde/core/filters/AbstractFilterNode.java

@@ -228,6 +228,7 @@ public abstract class AbstractFilterNode extends AbstractNode implements FilterN
         }
     }
 
+    @Override
     public void propertyChange(final String type, final String name, final Object before, final Object after) {
         if (name.equals("Enabled")) {
             toggleIcon((Boolean) after);
@@ -245,7 +246,9 @@ public abstract class AbstractFilterNode extends AbstractNode implements FilterN
         return filter;
     }
 
+    @Override
     public abstract Class<?> getExplorerObjectClass();
 
+    @Override
     public abstract Node[] createNodes(Object key, DataObject dataObject, boolean readOnly);
 }

+ 29 - 10
jme3-core/src/com/jme3/gde/core/filters/impl/JmeFilter.java

@@ -45,7 +45,6 @@ import org.openide.nodes.Sheet;
  */
 @org.openide.util.lookup.ServiceProvider(service = FilterNode.class)
 public class JmeFilter extends AbstractFilterNode {
-
     
     public JmeFilter() {
     }
@@ -59,19 +58,39 @@ public class JmeFilter extends AbstractFilterNode {
     @Override
     protected Sheet createSheet() {
         Sheet sheet = super.createSheet();
-        Sheet.Set set = Sheet.createPropertiesSet();
-        set.setDisplayName(filter.getName());
-        set.setName(Node.class.getName());
         
-        Filter obj = filter;
-        if (obj == null) {
+        if (filter == null) {
+            Sheet.Set set = Sheet.createPropertiesSet();
             return sheet;
         }
-
-        createFields(filter.getClass(), set, obj);
-        sheet.put(set);
+        
+        filter.setName(filter.getClass().getSimpleName());
+        Class<?> c = filter.getClass();
+        
+        do {
+            // The Filter class is already processed in AbstractFilterNode#createSheet
+            if (c.equals(Filter.class)) {
+                c = c.getSuperclass();
+                continue;
+            }
+            
+            Sheet.Set set = Sheet.createPropertiesSet();
+            
+            if (filter.getClass().equals(c)) { // is level of current filter.
+                set.setDisplayName(filter.getName());
+                set.setName(Node.class.getName());
+            } else {
+                set.setName(Node.class.getName());
+                set.setDisplayName(c.getName());
+            }
+            
+            createFields(c, set, filter);
+            sheet.put(set);
+            
+            c = c.getSuperclass();
+        } while (c != null);
+        
         return sheet;
-
     }
 
     @Override

+ 120 - 0
jme3-core/src/com/jme3/gde/core/filters/impl/NewDirectionalLightShadowFilterAction.java

@@ -0,0 +1,120 @@
+/*
+ * Copyright (c) 2009-2017 jMonkeyEngine All rights reserved.
+ * <p/>
+ * 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.
+ * <p/>
+ *  * 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.
+ * <p/>
+ *  * 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.
+ * <p/>
+ * 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.core.filters.impl;
+
+import com.jme3.gde.core.filters.actions.AbstractNewFilterWizardAction;
+import com.jme3.gde.core.filters.actions.NewFilterAction;
+import com.jme3.gde.core.filters.impl.dlsf.DLSFWizardPanel1;
+import com.jme3.gde.core.scene.SceneApplication;
+import com.jme3.post.Filter;
+import com.jme3.post.FilterPostProcessor;
+import com.jme3.shadow.DirectionalLightShadowFilter;
+import java.awt.Component;
+import java.awt.Dialog;
+import java.text.MessageFormat;
+import javax.swing.JComponent;
+import org.openide.DialogDisplayer;
+import org.openide.WizardDescriptor;
+import org.openide.nodes.Node;
+
+/**
+ *
+ * @author MeFisto94
+ */
[email protected](service = NewFilterAction.class)
+@SuppressWarnings({"unchecked", "rawtypes"})
+public class NewDirectionalLightShadowFilterAction extends AbstractNewFilterWizardAction {
+
+    private WizardDescriptor.Panel[] panels;
+
+    public NewDirectionalLightShadowFilterAction() {
+        name = "DirectionalLight ShadowFilter";
+    }
+
+    @Override
+    protected Object showWizard(Node node) {
+        WizardDescriptor wizardDescriptor = new WizardDescriptor(getPanels());
+        // {0} will be replaced by WizardDesriptor.Panel.getComponent().getName()
+        wizardDescriptor.setTitleFormat(new MessageFormat("{0}"));
+        wizardDescriptor.setTitle("New DirectionalLightShadowFilter");
+        Dialog dialog = DialogDisplayer.getDefault().createDialog(wizardDescriptor);
+        dialog.setVisible(true);
+        dialog.toFront();
+        boolean cancelled = wizardDescriptor.getValue() != WizardDescriptor.FINISH_OPTION;
+        if (!cancelled) {
+            return wizardDescriptor;
+        }
+        return null;
+    }
+
+    @Override
+    protected Filter doCreateFilter(FilterPostProcessor parent, Object configuration) {
+        if (configuration != null) {
+            WizardDescriptor wiz = (WizardDescriptor) configuration;
+            return new DirectionalLightShadowFilter(SceneApplication.getApplication().getAssetManager(), (Integer)wiz.getProperty("shadowMapSize"), (Integer)wiz.getProperty("nbSplits"));
+        }
+        return null;
+    }
+
+    /**
+     * Initialize panels representing individual wizard's steps and sets
+     * various properties for them influencing wizard appearance.
+     */
+    private WizardDescriptor.Panel[] getPanels() {
+        if (panels == null) {
+            panels = new WizardDescriptor.Panel[]{
+                new DLSFWizardPanel1()
+            };
+            String[] steps = new String[panels.length];
+            for (int i = 0; i < panels.length; i++) {
+                Component c = panels[i].getComponent();
+                // Default step name to component name of panel. Mainly useful
+                // for getting the name of the target chooser to appear in the
+                // list of steps.
+                steps[i] = c.getName();
+                if (c instanceof JComponent) { // assume Swing components
+                    JComponent jc = (JComponent) c;
+                    // Sets step number of a component
+                    // TODO if using org.openide.dialogs >= 7.8, can use WizardDescriptor.PROP_*:
+                    jc.putClientProperty("WizardPanel_contentSelectedIndex", new Integer(i));
+                    // Sets steps names for a panel
+                    jc.putClientProperty("WizardPanel_contentData", steps);
+                    // Turn on subtitle creation on each step
+                    jc.putClientProperty("WizardPanel_autoWizardStyle", Boolean.TRUE);
+                    // Show steps on the left side with the image on the background
+                    jc.putClientProperty("WizardPanel_contentDisplayed", Boolean.TRUE);
+                    // Turn on numbering of all steps
+                    jc.putClientProperty("WizardPanel_contentNumbered", Boolean.TRUE);
+                }
+            }
+        }
+        return panels;
+    }
+}

+ 119 - 0
jme3-core/src/com/jme3/gde/core/filters/impl/NewPointLightShadowFilterAction.java

@@ -0,0 +1,119 @@
+/*
+ * Copyright (c) 2009-2017 jMonkeyEngine All rights reserved.
+ * <p/>
+ * 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.
+ * <p/>
+ *  * 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.
+ * <p/>
+ *  * 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.
+ * <p/>
+ * 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.core.filters.impl;
+
+import com.jme3.gde.core.filters.actions.AbstractNewFilterWizardAction;
+import com.jme3.gde.core.filters.actions.NewFilterAction;
+import com.jme3.gde.core.filters.impl.plsf.PLSFWizardPanel1;
+import com.jme3.gde.core.scene.SceneApplication;
+import com.jme3.post.Filter;
+import com.jme3.post.FilterPostProcessor;
+import com.jme3.shadow.PointLightShadowFilter;
+import java.awt.Component;
+import java.awt.Dialog;
+import java.text.MessageFormat;
+import javax.swing.JComponent;
+import org.openide.DialogDisplayer;
+import org.openide.WizardDescriptor;
+import org.openide.nodes.Node;
+
+/**
+ *
+ * @author MeFisto94
+ */
[email protected](service = NewFilterAction.class)
+@SuppressWarnings({"unchecked", "rawtypes"})
+public class NewPointLightShadowFilterAction extends AbstractNewFilterWizardAction {
+    private WizardDescriptor.Panel[] panels;
+
+    public NewPointLightShadowFilterAction() {
+        name = "PointLight ShadowFilter";
+    }
+
+    @Override
+    protected Object showWizard(Node node) {
+        WizardDescriptor wizardDescriptor = new WizardDescriptor(getPanels());
+        // {0} will be replaced by WizardDesriptor.Panel.getComponent().getName()
+        wizardDescriptor.setTitleFormat(new MessageFormat("{0}"));
+        wizardDescriptor.setTitle("New PointLightShadowFilter");
+        Dialog dialog = DialogDisplayer.getDefault().createDialog(wizardDescriptor);
+        dialog.setVisible(true);
+        dialog.toFront();
+        boolean cancelled = wizardDescriptor.getValue() != WizardDescriptor.FINISH_OPTION;
+        if (!cancelled) {
+            return wizardDescriptor;
+        }
+        return null;
+    }
+
+    @Override
+    protected Filter doCreateFilter(FilterPostProcessor parent, Object configuration) {
+        if (configuration != null) {
+            WizardDescriptor wiz = (WizardDescriptor) configuration;
+            return new PointLightShadowFilter(SceneApplication.getApplication().getAssetManager(), (Integer)wiz.getProperty("shadowMapSize"));
+        }
+        return null;
+    }
+
+    /**
+     * Initialize panels representing individual wizard's steps and sets
+     * various properties for them influencing wizard appearance.
+     */
+    private WizardDescriptor.Panel[] getPanels() {
+        if (panels == null) {
+            panels = new WizardDescriptor.Panel[]{
+                new PLSFWizardPanel1()
+            };
+            String[] steps = new String[panels.length];
+            for (int i = 0; i < panels.length; i++) {
+                Component c = panels[i].getComponent();
+                // Default step name to component name of panel. Mainly useful
+                // for getting the name of the target chooser to appear in the
+                // list of steps.
+                steps[i] = c.getName();
+                if (c instanceof JComponent) { // assume Swing components
+                    JComponent jc = (JComponent) c;
+                    // Sets step number of a component
+                    // TODO if using org.openide.dialogs >= 7.8, can use WizardDescriptor.PROP_*:
+                    jc.putClientProperty("WizardPanel_contentSelectedIndex", new Integer(i));
+                    // Sets steps names for a panel
+                    jc.putClientProperty("WizardPanel_contentData", steps);
+                    // Turn on subtitle creation on each step
+                    jc.putClientProperty("WizardPanel_autoWizardStyle", Boolean.TRUE);
+                    // Show steps on the left side with the image on the background
+                    jc.putClientProperty("WizardPanel_contentDisplayed", Boolean.TRUE);
+                    // Turn on numbering of all steps
+                    jc.putClientProperty("WizardPanel_contentNumbered", Boolean.TRUE);
+                }
+            }
+        }
+        return panels;
+    }
+}

+ 120 - 0
jme3-core/src/com/jme3/gde/core/filters/impl/NewSpotLightShadowFilterAction.java

@@ -0,0 +1,120 @@
+/*
+ * Copyright (c) 2009-2017 jMonkeyEngine All rights reserved.
+ * <p/>
+ * 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.
+ * <p/>
+ *  * 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.
+ * <p/>
+ *  * 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.
+ * <p/>
+ * 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.core.filters.impl;
+
+import com.jme3.gde.core.filters.actions.AbstractNewFilterWizardAction;
+import com.jme3.gde.core.filters.actions.NewFilterAction;
+import com.jme3.gde.core.filters.impl.slsf.SLSFWizardPanel1;
+import com.jme3.gde.core.scene.SceneApplication;
+import com.jme3.post.Filter;
+import com.jme3.post.FilterPostProcessor;
+import com.jme3.shadow.SpotLightShadowFilter;
+import java.awt.Component;
+import java.awt.Dialog;
+import java.text.MessageFormat;
+import javax.swing.JComponent;
+import org.openide.DialogDisplayer;
+import org.openide.WizardDescriptor;
+import org.openide.nodes.Node;
+
+/**
+ *
+ * @author MeFisto94
+ */
[email protected](service = NewFilterAction.class)
+@SuppressWarnings({"unchecked", "rawtypes"})
+public class NewSpotLightShadowFilterAction extends AbstractNewFilterWizardAction {
+
+    private WizardDescriptor.Panel[] panels;
+
+    public NewSpotLightShadowFilterAction() {
+        name = "SpotLight ShadowFilter";
+    }
+
+    @Override
+    protected Object showWizard(Node node) {
+        WizardDescriptor wizardDescriptor = new WizardDescriptor(getPanels());
+        // {0} will be replaced by WizardDesriptor.Panel.getComponent().getName()
+        wizardDescriptor.setTitleFormat(new MessageFormat("{0}"));
+        wizardDescriptor.setTitle("New SpotLightShadowFilter");
+        Dialog dialog = DialogDisplayer.getDefault().createDialog(wizardDescriptor);
+        dialog.setVisible(true);
+        dialog.toFront();
+        boolean cancelled = wizardDescriptor.getValue() != WizardDescriptor.FINISH_OPTION;
+        if (!cancelled) {
+            return wizardDescriptor;
+        }
+        return null;
+    }
+
+    @Override
+    protected Filter doCreateFilter(FilterPostProcessor parent, Object configuration) {
+        if (configuration != null) {
+            WizardDescriptor wiz = (WizardDescriptor) configuration;
+            return new SpotLightShadowFilter(SceneApplication.getApplication().getAssetManager(), (Integer)wiz.getProperty("shadowMapSize"));
+        }
+        return null;
+    }
+
+    /**
+     * Initialize panels representing individual wizard's steps and sets
+     * various properties for them influencing wizard appearance.
+     */
+    private WizardDescriptor.Panel[] getPanels() {
+        if (panels == null) {
+            panels = new WizardDescriptor.Panel[]{
+                new SLSFWizardPanel1()
+            };
+            String[] steps = new String[panels.length];
+            for (int i = 0; i < panels.length; i++) {
+                Component c = panels[i].getComponent();
+                // Default step name to component name of panel. Mainly useful
+                // for getting the name of the target chooser to appear in the
+                // list of steps.
+                steps[i] = c.getName();
+                if (c instanceof JComponent) { // assume Swing components
+                    JComponent jc = (JComponent) c;
+                    // Sets step number of a component
+                    // TODO if using org.openide.dialogs >= 7.8, can use WizardDescriptor.PROP_*:
+                    jc.putClientProperty("WizardPanel_contentSelectedIndex", new Integer(i));
+                    // Sets steps names for a panel
+                    jc.putClientProperty("WizardPanel_contentData", steps);
+                    // Turn on subtitle creation on each step
+                    jc.putClientProperty("WizardPanel_autoWizardStyle", Boolean.TRUE);
+                    // Show steps on the left side with the image on the background
+                    jc.putClientProperty("WizardPanel_contentDisplayed", Boolean.TRUE);
+                    // Turn on numbering of all steps
+                    jc.putClientProperty("WizardPanel_contentNumbered", Boolean.TRUE);
+                }
+            }
+        }
+        return panels;
+    }
+}

+ 2 - 2
jme3-core/src/com/jme3/gde/core/filters/impl/bloom/Bundle.properties

@@ -1,4 +1,4 @@
 Error reading included file Templates/Other/../Licenses/license-jme.txt
-BloomVisualPanel1.jLabel1.text=Scene : extract bright areas of the rendered scene and make them glow
+BloomVisualPanel1.jLabel1.text=Scene: extract bright areas of the rendered scene and make them glow
 BloomVisualPanel1.jLabel2.text=Bloom mode
-BloomVisualPanel1.jLabel3.text=Objects : use Glow_Map or Glow_Color of scene's geometries' material to use for the glow source
+BloomVisualPanel1.jLabel3.text=Objects: use Glow_Map or Glow_Color of scene's geometries' material to use for the glow source

+ 7 - 0
jme3-core/src/com/jme3/gde/core/filters/impl/dlsf/Bundle.properties

@@ -0,0 +1,7 @@
+Error reading included file Templates/Other/Templates/Licenses/license-jme.txt
+shadowMapSize=Shadow Map Size
+nbSplits=Number of Splits
+DLSFVisualPanel1.jNbSplitsField.text=2
+lblDescription=ShadowMap Size: "the size of the rendered shadowmaps (512,1024,2048, etc...)"\n\n
+lblDescription2=Number of Splits: "the number of shadow maps rendered (the more shadow maps the more quality, the less fps)."\n\n
+DLSFVisualPanel1.jShadowMapField.text=1024

+ 160 - 0
jme3-core/src/com/jme3/gde/core/filters/impl/dlsf/DLSFVisualPanel1.form

@@ -0,0 +1,160 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.5" maxVersion="1.8" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
+  <NonVisualComponents>
+    <Container class="javax.swing.JFrame" name="jFrame1">
+
+      <Layout>
+        <DimensionLayout dim="0">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <EmptySpace min="0" pref="400" max="32767" attributes="0"/>
+          </Group>
+        </DimensionLayout>
+        <DimensionLayout dim="1">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <EmptySpace min="0" pref="300" max="32767" attributes="0"/>
+          </Group>
+        </DimensionLayout>
+      </Layout>
+    </Container>
+    <Component class="javax.swing.ButtonGroup" name="buttonGroup1">
+    </Component>
+    <Component class="javax.swing.ButtonGroup" name="buttonGroup2">
+    </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" attributes="0">
+              <EmptySpace max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="0" attributes="0">
+                  <Group type="103" groupAlignment="0" max="-2" attributes="0">
+                      <Group type="102" attributes="0">
+                          <Component id="jLabel2" min="-2" max="-2" attributes="0"/>
+                          <EmptySpace type="unrelated" max="-2" attributes="0"/>
+                          <Component id="jShadowMapField" min="-2" pref="97" max="-2" attributes="0"/>
+                      </Group>
+                      <Group type="102" attributes="0">
+                          <Component id="jLabel4" min="-2" max="-2" attributes="0"/>
+                          <EmptySpace max="32767" attributes="0"/>
+                          <Component id="jNbSplitsField" min="-2" pref="97" max="-2" attributes="0"/>
+                      </Group>
+                  </Group>
+                  <Component id="jLabel3" alignment="0" min="-2" max="-2" attributes="0"/>
+                  <Component id="jLabel5" alignment="0" min="-2" max="-2" attributes="0"/>
+              </Group>
+              <EmptySpace max="32767" attributes="0"/>
+          </Group>
+      </Group>
+    </DimensionLayout>
+    <DimensionLayout dim="1">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Group type="102" attributes="0">
+              <EmptySpace min="-2" pref="5" max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="3" attributes="0">
+                  <Component id="jLabel2" alignment="3" min="-2" max="-2" attributes="0"/>
+                  <Component id="jShadowMapField" 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="jLabel4" alignment="3" min="-2" max="-2" attributes="0"/>
+                  <Component id="jNbSplitsField" alignment="3" min="-2" max="-2" attributes="0"/>
+              </Group>
+              <EmptySpace min="-2" pref="35" max="-2" attributes="0"/>
+              <Component id="jLabel3" min="-2" pref="28" max="-2" attributes="0"/>
+              <EmptySpace max="-2" attributes="0"/>
+              <Component id="jLabel5" min="-2" pref="30" max="-2" attributes="0"/>
+              <EmptySpace pref="109" max="32767" attributes="0"/>
+          </Group>
+      </Group>
+    </DimensionLayout>
+  </Layout>
+  <SubComponents>
+    <Component class="javax.swing.JLabel" name="jLabel2">
+      <Properties>
+        <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
+          <Font name="Tahoma" size="14" style="1"/>
+        </Property>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="com/jme3/gde/core/filters/impl/dlsf/Bundle.properties" key="shadowMapSize" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+      <AccessibilityProperties>
+        <Property name="AccessibleContext.accessibleName" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="com/jme3/gde/core/filters/impl/dlsf/Bundle.properties" key="shadowMapSize" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </AccessibilityProperties>
+    </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/core/filters/impl/dlsf/Bundle.properties" key="lblDescription" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+      <AccessibilityProperties>
+        <Property name="AccessibleContext.accessibleName" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="com/jme3/gde/core/filters/impl/dlsf/Bundle.properties" key="lblDescription" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </AccessibilityProperties>
+    </Component>
+    <Component class="javax.swing.JTextField" name="jShadowMapField">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="com/jme3/gde/core/filters/impl/dlsf/Bundle.properties" key="DLSFVisualPanel1.jShadowMapField.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jShadowMapFieldActionPerformed"/>
+      </Events>
+    </Component>
+    <Component class="javax.swing.JLabel" name="jLabel4">
+      <Properties>
+        <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
+          <Font name="Tahoma" size="14" style="1"/>
+        </Property>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="com/jme3/gde/core/filters/impl/dlsf/Bundle.properties" key="nbSplits" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+      <AccessibilityProperties>
+        <Property name="AccessibleContext.accessibleName" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="com/jme3/gde/core/filters/impl/dlsf/Bundle.properties" key="nbSplits" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </AccessibilityProperties>
+    </Component>
+    <Component class="javax.swing.JTextField" name="jNbSplitsField">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="com/jme3/gde/core/filters/impl/dlsf/Bundle.properties" key="DLSFVisualPanel1.jNbSplitsField.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jNbSplitsFieldActionPerformed"/>
+      </Events>
+    </Component>
+    <Component class="javax.swing.JLabel" name="jLabel5">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="com/jme3/gde/core/filters/impl/dlsf/Bundle.properties" key="lblDescription2" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+      <AccessibilityProperties>
+        <Property name="AccessibleContext.accessibleName" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="com/jme3/gde/core/filters/impl/dlsf/Bundle.properties" key="lblDescription2" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </AccessibilityProperties>
+    </Component>
+  </SubComponents>
+</Form>

+ 147 - 0
jme3-core/src/com/jme3/gde/core/filters/impl/dlsf/DLSFVisualPanel1.java

@@ -0,0 +1,147 @@
+
+package com.jme3.gde.core.filters.impl.dlsf;
+
+import javax.swing.JPanel;
+import javax.swing.JTextField;
+
+@SuppressWarnings({"unchecked", "rawtypes"})
+public final class DLSFVisualPanel1 extends JPanel {
+
+    /**
+     * Creates new form BloomVisualPanel1
+     */
+    public DLSFVisualPanel1() {
+        initComponents();
+    }
+
+    @Override
+    public String getName() {
+        return "DirectionalLightShadowFilter settings";
+    }
+    
+    /** 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.
+     */
+
+    public JTextField getjNbSplitsField() {
+        return jNbSplitsField;
+    }
+
+    public JTextField getjShadowMapField() {
+        return jShadowMapField;
+    }
+
+    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
+    private void initComponents() {
+
+        jFrame1 = new javax.swing.JFrame();
+        buttonGroup1 = new javax.swing.ButtonGroup();
+        buttonGroup2 = new javax.swing.ButtonGroup();
+        jLabel2 = new javax.swing.JLabel();
+        jLabel3 = new javax.swing.JLabel();
+        jShadowMapField = new javax.swing.JTextField();
+        jLabel4 = new javax.swing.JLabel();
+        jNbSplitsField = new javax.swing.JTextField();
+        jLabel5 = new javax.swing.JLabel();
+
+        javax.swing.GroupLayout jFrame1Layout = new javax.swing.GroupLayout(jFrame1.getContentPane());
+        jFrame1.getContentPane().setLayout(jFrame1Layout);
+        jFrame1Layout.setHorizontalGroup(
+            jFrame1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGap(0, 400, Short.MAX_VALUE)
+        );
+        jFrame1Layout.setVerticalGroup(
+            jFrame1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGap(0, 300, Short.MAX_VALUE)
+        );
+
+        jLabel2.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N
+        org.openide.awt.Mnemonics.setLocalizedText(jLabel2, org.openide.util.NbBundle.getMessage(DLSFVisualPanel1.class, "shadowMapSize")); // NOI18N
+
+        org.openide.awt.Mnemonics.setLocalizedText(jLabel3, org.openide.util.NbBundle.getMessage(DLSFVisualPanel1.class, "lblDescription")); // NOI18N
+
+        jShadowMapField.setText(org.openide.util.NbBundle.getMessage(DLSFVisualPanel1.class, "DLSFVisualPanel1.jShadowMapField.text")); // NOI18N
+        jShadowMapField.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jShadowMapFieldActionPerformed(evt);
+            }
+        });
+
+        jLabel4.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N
+        org.openide.awt.Mnemonics.setLocalizedText(jLabel4, org.openide.util.NbBundle.getMessage(DLSFVisualPanel1.class, "nbSplits")); // NOI18N
+
+        jNbSplitsField.setText(org.openide.util.NbBundle.getMessage(DLSFVisualPanel1.class, "DLSFVisualPanel1.jNbSplitsField.text")); // NOI18N
+        jNbSplitsField.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jNbSplitsFieldActionPerformed(evt);
+            }
+        });
+
+        org.openide.awt.Mnemonics.setLocalizedText(jLabel5, org.openide.util.NbBundle.getMessage(DLSFVisualPanel1.class, "lblDescription2")); // NOI18N
+
+        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
+        this.setLayout(layout);
+        layout.setHorizontalGroup(
+            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(layout.createSequentialGroup()
+                .addContainerGap()
+                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
+                        .addGroup(layout.createSequentialGroup()
+                            .addComponent(jLabel2)
+                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+                            .addComponent(jShadowMapField, javax.swing.GroupLayout.PREFERRED_SIZE, 97, javax.swing.GroupLayout.PREFERRED_SIZE))
+                        .addGroup(layout.createSequentialGroup()
+                            .addComponent(jLabel4)
+                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+                            .addComponent(jNbSplitsField, javax.swing.GroupLayout.PREFERRED_SIZE, 97, javax.swing.GroupLayout.PREFERRED_SIZE)))
+                    .addComponent(jLabel3)
+                    .addComponent(jLabel5))
+                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
+        );
+        layout.setVerticalGroup(
+            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(layout.createSequentialGroup()
+                .addGap(5, 5, 5)
+                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                    .addComponent(jLabel2)
+                    .addComponent(jShadowMapField, 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(jLabel4)
+                    .addComponent(jNbSplitsField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+                .addGap(35, 35, 35)
+                .addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE)
+                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+                .addComponent(jLabel5, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)
+                .addContainerGap(109, Short.MAX_VALUE))
+        );
+
+        jLabel2.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(DLSFVisualPanel1.class, "shadowMapSize")); // NOI18N
+        jLabel3.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(DLSFVisualPanel1.class, "lblDescription")); // NOI18N
+        jLabel4.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(DLSFVisualPanel1.class, "nbSplits")); // NOI18N
+        jLabel5.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(DLSFVisualPanel1.class, "lblDescription2")); // NOI18N
+    }// </editor-fold>//GEN-END:initComponents
+
+    private void jNbSplitsFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jNbSplitsFieldActionPerformed
+
+    }//GEN-LAST:event_jNbSplitsFieldActionPerformed
+
+    private void jShadowMapFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jShadowMapFieldActionPerformed
+        
+    }//GEN-LAST:event_jShadowMapFieldActionPerformed
+
+    // Variables declaration - do not modify//GEN-BEGIN:variables
+    private javax.swing.ButtonGroup buttonGroup1;
+    private javax.swing.ButtonGroup buttonGroup2;
+    private javax.swing.JFrame jFrame1;
+    private javax.swing.JLabel jLabel2;
+    private javax.swing.JLabel jLabel3;
+    private javax.swing.JLabel jLabel4;
+    private javax.swing.JLabel jLabel5;
+    private javax.swing.JTextField jNbSplitsField;
+    private javax.swing.JTextField jShadowMapField;
+    // End of variables declaration//GEN-END:variables
+}

+ 73 - 0
jme3-core/src/com/jme3/gde/core/filters/impl/dlsf/DLSFWizardAction.java

@@ -0,0 +1,73 @@
+
+package com.jme3.gde.core.filters.impl.dlsf;
+
+import com.jme3.gde.core.filters.impl.bloom.BloomWizardPanel1;
+import java.awt.Component;
+import java.awt.Dialog;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.text.MessageFormat;
+import javax.swing.JComponent;
+import org.openide.DialogDisplayer;
+import org.openide.WizardDescriptor;
+
+// An example action demonstrating how the wizard could be called from within
+// your code. You can move the code below wherever you need, or register an action:
+// @ActionID(category="...", id="com.jme3.gde.core.filters.impl.bloom.BloomWizardAction")
+// @ActionRegistration(displayName="Open Bloom Wizard")
+// @ActionReference(path="Menu/Tools", position=...)
+@SuppressWarnings({"unchecked", "rawtypes"})
+public final class DLSFWizardAction implements ActionListener {
+
+    private WizardDescriptor.Panel[] panels;
+
+    public @Override
+    void actionPerformed(ActionEvent e) {
+        WizardDescriptor wizardDescriptor = new WizardDescriptor(getPanels());
+        // {0} will be replaced by WizardDesriptor.Panel.getComponent().getName()
+        wizardDescriptor.setTitleFormat(new MessageFormat("{0}"));
+        wizardDescriptor.setTitle("New DirectionalLightShadowFilter");
+        Dialog dialog = DialogDisplayer.getDefault().createDialog(wizardDescriptor);
+        dialog.setVisible(true);
+        dialog.toFront();
+        boolean cancelled = wizardDescriptor.getValue() != WizardDescriptor.FINISH_OPTION;
+        if (!cancelled) {
+            // do something
+        }
+    }
+
+    /**
+     * Initialize panels representing individual wizard's steps and sets
+     * various properties for them influencing wizard appearance.
+     */
+    private WizardDescriptor.Panel[] getPanels() {
+        if (panels == null) {
+            panels = new WizardDescriptor.Panel[]{
+                new DLSFWizardPanel1()
+            };
+            String[] steps = new String[panels.length];
+            for (int i = 0; i < panels.length; i++) {
+                Component c = panels[i].getComponent();
+                // Default step name to component name of panel. Mainly useful
+                // for getting the name of the target chooser to appear in the
+                // list of steps.
+                steps[i] = c.getName();
+                if (c instanceof JComponent) { // assume Swing components
+                    JComponent jc = (JComponent) c;
+                    // Sets step number of a component
+                    // TODO if using org.openide.dialogs >= 7.8, can use WizardDescriptor.PROP_*:
+                    jc.putClientProperty("WizardPanel_contentSelectedIndex", new Integer(i));
+                    // Sets steps names for a panel
+                    jc.putClientProperty("WizardPanel_contentData", steps);
+                    // Turn on subtitle creation on each step
+                    jc.putClientProperty("WizardPanel_autoWizardStyle", Boolean.TRUE);
+                    // Show steps on the left side with the image on the background
+                    jc.putClientProperty("WizardPanel_contentDisplayed", Boolean.TRUE);
+                    // Turn on numbering of all steps
+                    jc.putClientProperty("WizardPanel_contentNumbered", Boolean.TRUE);
+                }
+            }
+        }
+        return panels;
+    }
+}

+ 106 - 0
jme3-core/src/com/jme3/gde/core/filters/impl/dlsf/DLSFWizardPanel1.java

@@ -0,0 +1,106 @@
+package com.jme3.gde.core.filters.impl.dlsf;
+
+import com.jme3.math.FastMath;
+import java.awt.Component;
+import java.util.logging.Logger;
+import javax.swing.event.ChangeListener;
+import org.openide.WizardDescriptor;
+import org.openide.WizardValidationException;
+import org.openide.util.HelpCtx;
+
+@SuppressWarnings({"unchecked", "rawtypes"})
+public class DLSFWizardPanel1 implements WizardDescriptor.ValidatingPanel<WizardDescriptor> {
+
+    /**
+     * The visual component that displays this panel. If you need to access the
+     * component from this class, just use getComponent().
+     */
+    private Component component;
+    private static final Logger LOG = Logger.getLogger(DLSFWizardPanel1.class.getName());    
+    private int shadowMapSize;
+    private int nbSplits;
+
+    // Get the visual component for the panel. In this template, the component
+    // is kept separate. This can be more efficient: if the wizard is created
+    // but never displayed, or not all panels are displayed, it is better to
+    // create only those which really need to be visible.
+    @Override
+    public Component getComponent() {
+        if (component == null) {
+            component = new DLSFVisualPanel1();
+        }
+        return component;
+    }
+
+    @Override
+    public HelpCtx getHelp() {
+        // Show no Help button for this panel:
+        return HelpCtx.DEFAULT_HELP;
+        // If you have context help:
+        // return new HelpCtx(SampleWizardPanel1.class);
+    }
+
+    @Override
+    public boolean isValid() {
+        // If it is always OK to press Next or Finish, then:
+        return true;
+        // If it depends on some condition (form filled out...), then:
+        // return someCondition();
+        // and when this condition changes (last form field filled in...) then:
+        // fireChangeEvent();
+        // and uncomment the complicated stuff below.
+    }
+
+    @Override
+    public final void addChangeListener(ChangeListener l) {
+    }
+
+    @Override
+    public final void removeChangeListener(ChangeListener l) {
+    }
+    
+    void tryParseShadowMapSize(DLSFVisualPanel1 comp) throws WizardValidationException {
+        try {
+            shadowMapSize = Integer.parseInt(comp.getjShadowMapField().getText());
+        } catch (NumberFormatException nfe) {
+            throw new WizardValidationException(comp, "NumberFormatException when trying to parse the ShadowMapSize!", null);
+        }
+        
+        double log2 = Math.log(shadowMapSize) / Math.log(2);
+
+        if (!FastMath.approximateEquals((float)(Math.floor(log2) - log2), 0f)) {
+            LOG.warning("The Shadow Map Size is not power of two!");
+        }
+    }
+    
+    void tryParseNbSplits(DLSFVisualPanel1 comp) throws WizardValidationException {
+        try {
+            nbSplits = Integer.parseInt(comp.getjNbSplitsField().getText());
+        } catch (NumberFormatException nfe) {
+            throw new WizardValidationException(comp, "NumberFormatException when trying to parse the Number of Splits!", null);
+        }
+    }
+
+    @Override
+    public void validate() throws WizardValidationException {
+        DLSFVisualPanel1 comp = (DLSFVisualPanel1) getComponent();
+        tryParseNbSplits(comp);
+        tryParseShadowMapSize(comp);
+    }  
+    
+    // You can use a settings object to keep track of state. Normally the
+    // settings object will be the WizardDescriptor, so you can use
+    // WizardDescriptor.getProperty & putProperty to store information entered
+    // by the user.
+    @Override
+    public void readSettings(WizardDescriptor settings) {
+    }
+
+    @Override
+    public void storeSettings(WizardDescriptor settings) {
+        WizardDescriptor wiz = settings;
+        
+        wiz.putProperty("shadowMapSize", shadowMapSize);
+        wiz.putProperty("nbSplits", nbSplits);
+    }
+}

+ 4 - 0
jme3-core/src/com/jme3/gde/core/filters/impl/plsf/Bundle.properties

@@ -0,0 +1,4 @@
+Error reading included file Templates/Other/Templates/Licenses/license-jme.txt
+PLSFVisualPanel1.jShadowMapField.text=1024
+shadowMapSize=Shadow Map Size
+lblDescription=ShadowMap Size: "the size of the rendered shadowmaps (512,1024,2048, etc...)"\n\n

+ 108 - 0
jme3-core/src/com/jme3/gde/core/filters/impl/plsf/PLSFVisualPanel1.form

@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.5" maxVersion="1.8" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
+  <NonVisualComponents>
+    <Container class="javax.swing.JFrame" name="jFrame1">
+
+      <Layout>
+        <DimensionLayout dim="0">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <EmptySpace min="0" pref="400" max="32767" attributes="0"/>
+          </Group>
+        </DimensionLayout>
+        <DimensionLayout dim="1">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <EmptySpace min="0" pref="300" max="32767" attributes="0"/>
+          </Group>
+        </DimensionLayout>
+      </Layout>
+    </Container>
+    <Component class="javax.swing.ButtonGroup" name="buttonGroup1">
+    </Component>
+    <Component class="javax.swing.ButtonGroup" name="buttonGroup2">
+    </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" attributes="0">
+              <EmptySpace max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="0" attributes="0">
+                  <Group type="102" attributes="0">
+                      <Component id="jLabel2" min="-2" max="-2" attributes="0"/>
+                      <EmptySpace type="unrelated" max="-2" attributes="0"/>
+                      <Component id="jShadowMapField" min="-2" pref="97" max="-2" attributes="0"/>
+                  </Group>
+                  <Component id="jLabel3" alignment="0" min="-2" max="-2" attributes="0"/>
+              </Group>
+              <EmptySpace pref="249" max="32767" attributes="0"/>
+          </Group>
+      </Group>
+    </DimensionLayout>
+    <DimensionLayout dim="1">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Group type="102" attributes="0">
+              <EmptySpace min="-2" pref="5" max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="3" attributes="0">
+                  <Component id="jLabel2" alignment="3" min="-2" max="-2" attributes="0"/>
+                  <Component id="jShadowMapField" alignment="3" min="-2" max="-2" attributes="0"/>
+              </Group>
+              <EmptySpace type="separate" max="-2" attributes="0"/>
+              <Component id="jLabel3" min="-2" pref="28" max="-2" attributes="0"/>
+              <EmptySpace pref="193" max="32767" attributes="0"/>
+          </Group>
+      </Group>
+    </DimensionLayout>
+  </Layout>
+  <SubComponents>
+    <Component class="javax.swing.JLabel" name="jLabel2">
+      <Properties>
+        <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
+          <Font name="Tahoma" size="14" style="1"/>
+        </Property>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="com/jme3/gde/core/filters/impl/plsf/Bundle.properties" key="shadowMapSize" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+      <AccessibilityProperties>
+        <Property name="AccessibleContext.accessibleName" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="com/jme3/gde/core/filters/impl/plsf/Bundle.properties" key="shadowMapSize" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </AccessibilityProperties>
+    </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/core/filters/impl/plsf/Bundle.properties" key="lblDescription" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+      <AccessibilityProperties>
+        <Property name="AccessibleContext.accessibleName" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="com/jme3/gde/core/filters/impl/plsf/Bundle.properties" key="lblDescription" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </AccessibilityProperties>
+    </Component>
+    <Component class="javax.swing.JTextField" name="jShadowMapField">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="com/jme3/gde/core/filters/impl/plsf/Bundle.properties" key="PLSFVisualPanel1.jShadowMapField.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jShadowMapFieldActionPerformed"/>
+      </Events>
+    </Component>
+  </SubComponents>
+</Form>

+ 107 - 0
jme3-core/src/com/jme3/gde/core/filters/impl/plsf/PLSFVisualPanel1.java

@@ -0,0 +1,107 @@
+
+package com.jme3.gde.core.filters.impl.plsf;
+
+import javax.swing.JPanel;
+import javax.swing.JTextField;
+
+@SuppressWarnings({"unchecked", "rawtypes"})
+public final class PLSFVisualPanel1 extends JPanel {
+
+    /**
+     * Creates new form BloomVisualPanel1
+     */
+    public PLSFVisualPanel1() {
+        initComponents();
+    }
+
+    @Override
+    public String getName() {
+        return "PointLightShadowFilter settings";
+    }
+    
+    /** 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.
+     */
+
+    public JTextField getjShadowMapField() {
+        return jShadowMapField;
+    }
+
+    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
+    private void initComponents() {
+
+        jFrame1 = new javax.swing.JFrame();
+        buttonGroup1 = new javax.swing.ButtonGroup();
+        buttonGroup2 = new javax.swing.ButtonGroup();
+        jLabel2 = new javax.swing.JLabel();
+        jLabel3 = new javax.swing.JLabel();
+        jShadowMapField = new javax.swing.JTextField();
+
+        javax.swing.GroupLayout jFrame1Layout = new javax.swing.GroupLayout(jFrame1.getContentPane());
+        jFrame1.getContentPane().setLayout(jFrame1Layout);
+        jFrame1Layout.setHorizontalGroup(
+            jFrame1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGap(0, 400, Short.MAX_VALUE)
+        );
+        jFrame1Layout.setVerticalGroup(
+            jFrame1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGap(0, 300, Short.MAX_VALUE)
+        );
+
+        jLabel2.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N
+        org.openide.awt.Mnemonics.setLocalizedText(jLabel2, org.openide.util.NbBundle.getMessage(PLSFVisualPanel1.class, "shadowMapSize")); // NOI18N
+
+        org.openide.awt.Mnemonics.setLocalizedText(jLabel3, org.openide.util.NbBundle.getMessage(PLSFVisualPanel1.class, "lblDescription")); // NOI18N
+
+        jShadowMapField.setText(org.openide.util.NbBundle.getMessage(PLSFVisualPanel1.class, "PLSFVisualPanel1.jShadowMapField.text")); // NOI18N
+        jShadowMapField.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jShadowMapFieldActionPerformed(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()
+                .addContainerGap()
+                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addGroup(layout.createSequentialGroup()
+                        .addComponent(jLabel2)
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+                        .addComponent(jShadowMapField, javax.swing.GroupLayout.PREFERRED_SIZE, 97, javax.swing.GroupLayout.PREFERRED_SIZE))
+                    .addComponent(jLabel3))
+                .addContainerGap(249, Short.MAX_VALUE))
+        );
+        layout.setVerticalGroup(
+            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(layout.createSequentialGroup()
+                .addGap(5, 5, 5)
+                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                    .addComponent(jLabel2)
+                    .addComponent(jShadowMapField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+                .addGap(18, 18, 18)
+                .addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE)
+                .addContainerGap(193, Short.MAX_VALUE))
+        );
+
+        jLabel2.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(PLSFVisualPanel1.class, "shadowMapSize")); // NOI18N
+        jLabel3.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(PLSFVisualPanel1.class, "lblDescription")); // NOI18N
+    }// </editor-fold>//GEN-END:initComponents
+
+    private void jShadowMapFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jShadowMapFieldActionPerformed
+        
+    }//GEN-LAST:event_jShadowMapFieldActionPerformed
+
+    // Variables declaration - do not modify//GEN-BEGIN:variables
+    private javax.swing.ButtonGroup buttonGroup1;
+    private javax.swing.ButtonGroup buttonGroup2;
+    private javax.swing.JFrame jFrame1;
+    private javax.swing.JLabel jLabel2;
+    private javax.swing.JLabel jLabel3;
+    private javax.swing.JTextField jShadowMapField;
+    // End of variables declaration//GEN-END:variables
+}

+ 71 - 0
jme3-core/src/com/jme3/gde/core/filters/impl/plsf/PLSFWizardAction.java

@@ -0,0 +1,71 @@
+package com.jme3.gde.core.filters.impl.plsf;
+
+import java.awt.Component;
+import java.awt.Dialog;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.text.MessageFormat;
+import javax.swing.JComponent;
+import org.openide.DialogDisplayer;
+import org.openide.WizardDescriptor;
+
+// An example action demonstrating how the wizard could be called from within
+// your code. You can move the code below wherever you need, or register an action:
+// @ActionID(category="...", id="com.jme3.gde.core.filters.impl.bloom.BloomWizardAction")
+// @ActionRegistration(displayName="Open Bloom Wizard")
+// @ActionReference(path="Menu/Tools", position=...)
+@SuppressWarnings({"unchecked", "rawtypes"})
+public final class PLSFWizardAction implements ActionListener {
+
+    private WizardDescriptor.Panel[] panels;
+
+    public @Override
+    void actionPerformed(ActionEvent e) {
+        WizardDescriptor wizardDescriptor = new WizardDescriptor(getPanels());
+        // {0} will be replaced by WizardDesriptor.Panel.getComponent().getName()
+        wizardDescriptor.setTitleFormat(new MessageFormat("{0}"));
+        wizardDescriptor.setTitle("New PointLightShadowFilter");
+        Dialog dialog = DialogDisplayer.getDefault().createDialog(wizardDescriptor);
+        dialog.setVisible(true);
+        dialog.toFront();
+        boolean cancelled = wizardDescriptor.getValue() != WizardDescriptor.FINISH_OPTION;
+        if (!cancelled) {
+            // do something
+        }
+    }
+
+    /**
+     * Initialize panels representing individual wizard's steps and sets
+     * various properties for them influencing wizard appearance.
+     */
+    private WizardDescriptor.Panel[] getPanels() {
+        if (panels == null) {
+            panels = new WizardDescriptor.Panel[]{
+                new PLSFWizardPanel1()
+            };
+            String[] steps = new String[panels.length];
+            for (int i = 0; i < panels.length; i++) {
+                Component c = panels[i].getComponent();
+                // Default step name to component name of panel. Mainly useful
+                // for getting the name of the target chooser to appear in the
+                // list of steps.
+                steps[i] = c.getName();
+                if (c instanceof JComponent) { // assume Swing components
+                    JComponent jc = (JComponent) c;
+                    // Sets step number of a component
+                    // TODO if using org.openide.dialogs >= 7.8, can use WizardDescriptor.PROP_*:
+                    jc.putClientProperty("WizardPanel_contentSelectedIndex", new Integer(i));
+                    // Sets steps names for a panel
+                    jc.putClientProperty("WizardPanel_contentData", steps);
+                    // Turn on subtitle creation on each step
+                    jc.putClientProperty("WizardPanel_autoWizardStyle", Boolean.TRUE);
+                    // Show steps on the left side with the image on the background
+                    jc.putClientProperty("WizardPanel_contentDisplayed", Boolean.TRUE);
+                    // Turn on numbering of all steps
+                    jc.putClientProperty("WizardPanel_contentNumbered", Boolean.TRUE);
+                }
+            }
+        }
+        return panels;
+    }
+}

+ 94 - 0
jme3-core/src/com/jme3/gde/core/filters/impl/plsf/PLSFWizardPanel1.java

@@ -0,0 +1,94 @@
+package com.jme3.gde.core.filters.impl.plsf;
+
+import com.jme3.math.FastMath;
+import java.awt.Component;
+import java.util.logging.Logger;
+import javax.swing.event.ChangeListener;
+import org.openide.WizardDescriptor;
+import org.openide.WizardValidationException;
+import org.openide.util.HelpCtx;
+
+@SuppressWarnings({"unchecked", "rawtypes"})
+public class PLSFWizardPanel1 implements WizardDescriptor.ValidatingPanel<WizardDescriptor> {
+
+    /**
+     * The visual component that displays this panel. If you need to access the
+     * component from this class, just use getComponent().
+     */
+    private Component component;
+    private static final Logger LOG = Logger.getLogger(PLSFWizardPanel1.class.getName());    
+    private int shadowMapSize;
+
+    // Get the visual component for the panel. In this template, the component
+    // is kept separate. This can be more efficient: if the wizard is created
+    // but never displayed, or not all panels are displayed, it is better to
+    // create only those which really need to be visible.
+    @Override
+    public Component getComponent() {
+        if (component == null) {
+            component = new PLSFVisualPanel1();
+        }
+        return component;
+    }
+
+    @Override
+    public HelpCtx getHelp() {
+        // Show no Help button for this panel:
+        return HelpCtx.DEFAULT_HELP;
+        // If you have context help:
+        // return new HelpCtx(SampleWizardPanel1.class);
+    }
+
+    @Override
+    public boolean isValid() {
+        // If it is always OK to press Next or Finish, then:
+        return true;
+        // If it depends on some condition (form filled out...), then:
+        // return someCondition();
+        // and when this condition changes (last form field filled in...) then:
+        // fireChangeEvent();
+        // and uncomment the complicated stuff below.
+    }
+
+    @Override
+    public final void addChangeListener(ChangeListener l) {
+    }
+
+    @Override
+    public final void removeChangeListener(ChangeListener l) {
+    }
+    
+    void tryParseShadowMapSize(PLSFVisualPanel1 comp) throws WizardValidationException {
+        try {
+            shadowMapSize = Integer.parseInt(comp.getjShadowMapField().getText());
+        } catch (NumberFormatException nfe) {
+            throw new WizardValidationException(comp, "NumberFormatException when trying to parse the ShadowMapSize!", null);
+        }
+        
+        double log2 = Math.log(shadowMapSize) / Math.log(2);
+
+        if (!FastMath.approximateEquals((float)(Math.floor(log2) - log2), 0f)) {
+            LOG.warning("The Shadow Map Size is not power of two!");
+        }
+    }
+
+    @Override
+    public void validate() throws WizardValidationException {
+        PLSFVisualPanel1 comp = (PLSFVisualPanel1) getComponent();
+        tryParseShadowMapSize(comp);
+    }  
+    
+    // You can use a settings object to keep track of state. Normally the
+    // settings object will be the WizardDescriptor, so you can use
+    // WizardDescriptor.getProperty & putProperty to store information entered
+    // by the user.
+    @Override
+    public void readSettings(WizardDescriptor settings) {
+    }
+
+    @Override
+    public void storeSettings(WizardDescriptor settings) {
+        WizardDescriptor wiz = settings;
+        wiz.putProperty("shadowMapSize", shadowMapSize);
+    }
+}

+ 4 - 0
jme3-core/src/com/jme3/gde/core/filters/impl/slsf/Bundle.properties

@@ -0,0 +1,4 @@
+Error reading included file Templates/Other/Templates/Licenses/license-jme.txt
+SLSFVisualPanel1.jShadowMapField.text=1024
+shadowMapSize=Shadow Map Size
+lblDescription=ShadowMap Size: "the size of the rendered shadowmaps (512,1024,2048, etc...)"\n\n

+ 108 - 0
jme3-core/src/com/jme3/gde/core/filters/impl/slsf/SLSFVisualPanel1.form

@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.5" maxVersion="1.8" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
+  <NonVisualComponents>
+    <Container class="javax.swing.JFrame" name="jFrame1">
+
+      <Layout>
+        <DimensionLayout dim="0">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <EmptySpace min="0" pref="400" max="32767" attributes="0"/>
+          </Group>
+        </DimensionLayout>
+        <DimensionLayout dim="1">
+          <Group type="103" groupAlignment="0" attributes="0">
+              <EmptySpace min="0" pref="300" max="32767" attributes="0"/>
+          </Group>
+        </DimensionLayout>
+      </Layout>
+    </Container>
+    <Component class="javax.swing.ButtonGroup" name="buttonGroup1">
+    </Component>
+    <Component class="javax.swing.ButtonGroup" name="buttonGroup2">
+    </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" attributes="0">
+              <EmptySpace max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="0" attributes="0">
+                  <Group type="102" attributes="0">
+                      <Component id="jLabel2" min="-2" max="-2" attributes="0"/>
+                      <EmptySpace type="unrelated" max="-2" attributes="0"/>
+                      <Component id="jShadowMapField" min="-2" pref="97" max="-2" attributes="0"/>
+                  </Group>
+                  <Component id="jLabel3" alignment="0" min="-2" max="-2" attributes="0"/>
+              </Group>
+              <EmptySpace pref="249" max="32767" attributes="0"/>
+          </Group>
+      </Group>
+    </DimensionLayout>
+    <DimensionLayout dim="1">
+      <Group type="103" groupAlignment="0" attributes="0">
+          <Group type="102" attributes="0">
+              <EmptySpace min="-2" pref="5" max="-2" attributes="0"/>
+              <Group type="103" groupAlignment="3" attributes="0">
+                  <Component id="jLabel2" alignment="3" min="-2" max="-2" attributes="0"/>
+                  <Component id="jShadowMapField" alignment="3" min="-2" max="-2" attributes="0"/>
+              </Group>
+              <EmptySpace type="separate" max="-2" attributes="0"/>
+              <Component id="jLabel3" min="-2" pref="28" max="-2" attributes="0"/>
+              <EmptySpace pref="193" max="32767" attributes="0"/>
+          </Group>
+      </Group>
+    </DimensionLayout>
+  </Layout>
+  <SubComponents>
+    <Component class="javax.swing.JLabel" name="jLabel2">
+      <Properties>
+        <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
+          <Font name="Tahoma" size="14" style="1"/>
+        </Property>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="com/jme3/gde/core/filters/impl/dlsf/Bundle.properties" key="shadowMapSize" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+      <AccessibilityProperties>
+        <Property name="AccessibleContext.accessibleName" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="com/jme3/gde/core/filters/impl/slsf/Bundle.properties" key="shadowMapSize" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </AccessibilityProperties>
+    </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/core/filters/impl/slsf/Bundle.properties" key="lblDescription" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+      <AccessibilityProperties>
+        <Property name="AccessibleContext.accessibleName" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="com/jme3/gde/core/filters/impl/dlsf/Bundle.properties" key="lblDescription" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </AccessibilityProperties>
+    </Component>
+    <Component class="javax.swing.JTextField" name="jShadowMapField">
+      <Properties>
+        <Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
+          <ResourceString bundle="com/jme3/gde/core/filters/impl/slsf/Bundle.properties" key="SLSFVisualPanel1.jShadowMapField.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, &quot;{key}&quot;)"/>
+        </Property>
+      </Properties>
+      <Events>
+        <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="jShadowMapFieldActionPerformed"/>
+      </Events>
+    </Component>
+  </SubComponents>
+</Form>

+ 107 - 0
jme3-core/src/com/jme3/gde/core/filters/impl/slsf/SLSFVisualPanel1.java

@@ -0,0 +1,107 @@
+
+package com.jme3.gde.core.filters.impl.slsf;
+
+import javax.swing.JPanel;
+import javax.swing.JTextField;
+
+@SuppressWarnings({"unchecked", "rawtypes"})
+public final class SLSFVisualPanel1 extends JPanel {
+
+    /**
+     * Creates new form BloomVisualPanel1
+     */
+    public SLSFVisualPanel1() {
+        initComponents();
+    }
+
+    @Override
+    public String getName() {
+        return "SpotLightShadowFilter settings";
+    }
+    
+    /** 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.
+     */
+
+    public JTextField getjShadowMapField() {
+        return jShadowMapField;
+    }
+
+    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
+    private void initComponents() {
+
+        jFrame1 = new javax.swing.JFrame();
+        buttonGroup1 = new javax.swing.ButtonGroup();
+        buttonGroup2 = new javax.swing.ButtonGroup();
+        jLabel2 = new javax.swing.JLabel();
+        jLabel3 = new javax.swing.JLabel();
+        jShadowMapField = new javax.swing.JTextField();
+
+        javax.swing.GroupLayout jFrame1Layout = new javax.swing.GroupLayout(jFrame1.getContentPane());
+        jFrame1.getContentPane().setLayout(jFrame1Layout);
+        jFrame1Layout.setHorizontalGroup(
+            jFrame1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGap(0, 400, Short.MAX_VALUE)
+        );
+        jFrame1Layout.setVerticalGroup(
+            jFrame1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGap(0, 300, Short.MAX_VALUE)
+        );
+
+        jLabel2.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N
+        org.openide.awt.Mnemonics.setLocalizedText(jLabel2, org.openide.util.NbBundle.getMessage(SLSFVisualPanel1.class, "shadowMapSize")); // NOI18N
+
+        org.openide.awt.Mnemonics.setLocalizedText(jLabel3, org.openide.util.NbBundle.getMessage(SLSFVisualPanel1.class, "lblDescription")); // NOI18N
+
+        jShadowMapField.setText(org.openide.util.NbBundle.getMessage(SLSFVisualPanel1.class, "SLSFVisualPanel1.jShadowMapField.text")); // NOI18N
+        jShadowMapField.addActionListener(new java.awt.event.ActionListener() {
+            public void actionPerformed(java.awt.event.ActionEvent evt) {
+                jShadowMapFieldActionPerformed(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()
+                .addContainerGap()
+                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+                    .addGroup(layout.createSequentialGroup()
+                        .addComponent(jLabel2)
+                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+                        .addComponent(jShadowMapField, javax.swing.GroupLayout.PREFERRED_SIZE, 97, javax.swing.GroupLayout.PREFERRED_SIZE))
+                    .addComponent(jLabel3))
+                .addContainerGap(249, Short.MAX_VALUE))
+        );
+        layout.setVerticalGroup(
+            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+            .addGroup(layout.createSequentialGroup()
+                .addGap(5, 5, 5)
+                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+                    .addComponent(jLabel2)
+                    .addComponent(jShadowMapField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
+                .addGap(18, 18, 18)
+                .addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE)
+                .addContainerGap(193, Short.MAX_VALUE))
+        );
+
+        jLabel2.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(SLSFVisualPanel1.class, "shadowMapSize")); // NOI18N
+        jLabel3.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(SLSFVisualPanel1.class, "lblDescription")); // NOI18N
+    }// </editor-fold>//GEN-END:initComponents
+
+    private void jShadowMapFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jShadowMapFieldActionPerformed
+        
+    }//GEN-LAST:event_jShadowMapFieldActionPerformed
+
+    // Variables declaration - do not modify//GEN-BEGIN:variables
+    private javax.swing.ButtonGroup buttonGroup1;
+    private javax.swing.ButtonGroup buttonGroup2;
+    private javax.swing.JFrame jFrame1;
+    private javax.swing.JLabel jLabel2;
+    private javax.swing.JLabel jLabel3;
+    private javax.swing.JTextField jShadowMapField;
+    // End of variables declaration//GEN-END:variables
+}

+ 71 - 0
jme3-core/src/com/jme3/gde/core/filters/impl/slsf/SLSFWizardAction.java

@@ -0,0 +1,71 @@
+package com.jme3.gde.core.filters.impl.slsf;
+
+import java.awt.Component;
+import java.awt.Dialog;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.text.MessageFormat;
+import javax.swing.JComponent;
+import org.openide.DialogDisplayer;
+import org.openide.WizardDescriptor;
+
+// An example action demonstrating how the wizard could be called from within
+// your code. You can move the code below wherever you need, or register an action:
+// @ActionID(category="...", id="com.jme3.gde.core.filters.impl.bloom.BloomWizardAction")
+// @ActionRegistration(displayName="Open Bloom Wizard")
+// @ActionReference(path="Menu/Tools", position=...)
+@SuppressWarnings({"unchecked", "rawtypes"})
+public final class SLSFWizardAction implements ActionListener {
+
+    private WizardDescriptor.Panel[] panels;
+
+    public @Override
+    void actionPerformed(ActionEvent e) {
+        WizardDescriptor wizardDescriptor = new WizardDescriptor(getPanels());
+        // {0} will be replaced by WizardDesriptor.Panel.getComponent().getName()
+        wizardDescriptor.setTitleFormat(new MessageFormat("{0}"));
+        wizardDescriptor.setTitle("New SpotLightShadowFilter");
+        Dialog dialog = DialogDisplayer.getDefault().createDialog(wizardDescriptor);
+        dialog.setVisible(true);
+        dialog.toFront();
+        boolean cancelled = wizardDescriptor.getValue() != WizardDescriptor.FINISH_OPTION;
+        if (!cancelled) {
+            // do something
+        }
+    }
+
+    /**
+     * Initialize panels representing individual wizard's steps and sets
+     * various properties for them influencing wizard appearance.
+     */
+    private WizardDescriptor.Panel[] getPanels() {
+        if (panels == null) {
+            panels = new WizardDescriptor.Panel[]{
+                new SLSFWizardPanel1()
+            };
+            String[] steps = new String[panels.length];
+            for (int i = 0; i < panels.length; i++) {
+                Component c = panels[i].getComponent();
+                // Default step name to component name of panel. Mainly useful
+                // for getting the name of the target chooser to appear in the
+                // list of steps.
+                steps[i] = c.getName();
+                if (c instanceof JComponent) { // assume Swing components
+                    JComponent jc = (JComponent) c;
+                    // Sets step number of a component
+                    // TODO if using org.openide.dialogs >= 7.8, can use WizardDescriptor.PROP_*:
+                    jc.putClientProperty("WizardPanel_contentSelectedIndex", new Integer(i));
+                    // Sets steps names for a panel
+                    jc.putClientProperty("WizardPanel_contentData", steps);
+                    // Turn on subtitle creation on each step
+                    jc.putClientProperty("WizardPanel_autoWizardStyle", Boolean.TRUE);
+                    // Show steps on the left side with the image on the background
+                    jc.putClientProperty("WizardPanel_contentDisplayed", Boolean.TRUE);
+                    // Turn on numbering of all steps
+                    jc.putClientProperty("WizardPanel_contentNumbered", Boolean.TRUE);
+                }
+            }
+        }
+        return panels;
+    }
+}

+ 94 - 0
jme3-core/src/com/jme3/gde/core/filters/impl/slsf/SLSFWizardPanel1.java

@@ -0,0 +1,94 @@
+package com.jme3.gde.core.filters.impl.slsf;
+
+import com.jme3.math.FastMath;
+import java.awt.Component;
+import java.util.logging.Logger;
+import javax.swing.event.ChangeListener;
+import org.openide.WizardDescriptor;
+import org.openide.WizardValidationException;
+import org.openide.util.HelpCtx;
+
+@SuppressWarnings({"unchecked", "rawtypes"})
+public class SLSFWizardPanel1 implements WizardDescriptor.ValidatingPanel<WizardDescriptor> {
+
+    /**
+     * The visual component that displays this panel. If you need to access the
+     * component from this class, just use getComponent().
+     */
+    private Component component;
+    private static final Logger LOG = Logger.getLogger(SLSFWizardPanel1.class.getName());    
+    private int shadowMapSize;
+
+    // Get the visual component for the panel. In this template, the component
+    // is kept separate. This can be more efficient: if the wizard is created
+    // but never displayed, or not all panels are displayed, it is better to
+    // create only those which really need to be visible.
+    @Override
+    public Component getComponent() {
+        if (component == null) {
+            component = new SLSFVisualPanel1();
+        }
+        return component;
+    }
+
+    @Override
+    public HelpCtx getHelp() {
+        // Show no Help button for this panel:
+        return HelpCtx.DEFAULT_HELP;
+        // If you have context help:
+        // return new HelpCtx(SampleWizardPanel1.class);
+    }
+
+    @Override
+    public boolean isValid() {
+        // If it is always OK to press Next or Finish, then:
+        return true;
+        // If it depends on some condition (form filled out...), then:
+        // return someCondition();
+        // and when this condition changes (last form field filled in...) then:
+        // fireChangeEvent();
+        // and uncomment the complicated stuff below.
+    }
+
+    @Override
+    public final void addChangeListener(ChangeListener l) {
+    }
+
+    @Override
+    public final void removeChangeListener(ChangeListener l) {
+    }
+    
+    void tryParseShadowMapSize(SLSFVisualPanel1 comp) throws WizardValidationException {
+        try {
+            shadowMapSize = Integer.parseInt(comp.getjShadowMapField().getText());
+        } catch (NumberFormatException nfe) {
+            throw new WizardValidationException(comp, "NumberFormatException when trying to parse the ShadowMapSize!", null);
+        }
+        
+        double log2 = Math.log(shadowMapSize) / Math.log(2);
+
+        if (!FastMath.approximateEquals((float)(Math.floor(log2) - log2), 0f)) {
+            LOG.warning("The Shadow Map Size is not power of two!");
+        }
+    }
+
+    @Override
+    public void validate() throws WizardValidationException {
+        SLSFVisualPanel1 comp = (SLSFVisualPanel1) getComponent();
+        tryParseShadowMapSize(comp);
+    }  
+    
+    // You can use a settings object to keep track of state. Normally the
+    // settings object will be the WizardDescriptor, so you can use
+    // WizardDescriptor.getProperty & putProperty to store information entered
+    // by the user.
+    @Override
+    public void readSettings(WizardDescriptor settings) {
+    }
+
+    @Override
+    public void storeSettings(WizardDescriptor settings) {
+        WizardDescriptor wiz = settings;
+        wiz.putProperty("shadowMapSize", shadowMapSize);
+    }
+}