Editor: jMonkeyBuilder

That was damn fast. Now it works. Thank you @nehon!

It’s time to figure out some new features. How do I use this custom API?

Is this feature about adding AppStates from my game directly to the scene thread or do I need special AppStates?
Is it possible to write an AppState with access to Java FX?

And I have some question about this new j3s file format. How can I load a j3s scene in my game? Is it possible to export it somehow to j3o with and without layer information? Or do I need a custom asset loader? And only out of interest why did you invent a new format rather then using j3o and saving layer information as user data in the j3o?
Or can we exspect some other features which need this custom format?

https://bitbucket.org/JavaSabr/jme3-spaceshift-editor/wiki/J3S%20format%20in%20your%20game

1 Like

About layers… I’m going to reimplement it :slight_smile: I think my interpretation of layers is wrong.

Now I created this class like described in the documentation. But how do I get it to load in the editor?
The file is directly located at the root of my source in src/main/java . I can build the project and create a jar from it (in build/libs). What is the classpathfolder and the environment folder? And what is the full class name? Do I need a file ending like .java or .class there?

You need to set your folder with your jars to classpath folder setting in the settings dialog, then the editor will get access to your classes and you can create your custom state using a full name of your class.

By the way, the classpath folder can be outside asset folder, the editor uses an absolute path to it. :wink:

That was too simple :chimpanzee_facepalm: Thank you very much!

Does it work? :slight_smile: can you make a screenshot with your custom state? :slight_smile:

Nothing special to see:


I noticed it does only load if StarHunter is my asset folder. If I select assets as my asset folder it fails to load. My classpath path is path/to/StarHunter/build/libs.

This is the class:

import com.jme3.export.JmeExporter;
import com.jme3.export.JmeImporter;
import com.jme3.util.clone.Cloner;
import com.simsilica.fx.LightingState;
import com.ss.extension.scene.app.state.EditableSceneAppState;
import com.ss.extension.scene.app.state.property.EditableProperty;
import com.ss.extension.scene.app.state.property.EditablePropertyType;
import com.ss.extension.scene.app.state.property.SimpleProperty;
import org.jetbrains.annotations.NotNull;
import rlib.util.array.Array;
import rlib.util.array.ArrayFactory;

import java.io.IOException;

public class EditableLightingSceneAppState2 extends LightingState implements EditableSceneAppState {

    public EditableLightingSceneAppState2() {
    }

    @NotNull
    @Override
    public String getName() {
        return "Lighting State 2";
    }

    @NotNull
    @Override
    public Object jmeClone() {
        try {
            return super.clone();
        } catch (final CloneNotSupportedException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public void write(JmeExporter ex) throws IOException {

    }

    @Override
    public void read(JmeImporter im) throws IOException {

    }

    @Override
    public void cloneFields(Cloner cloner, Object original) {

    }

    @NotNull
    @Override
    public Array<EditableProperty<?, ?>> getEditableProperties() {

        final Array<EditableProperty<?, ?>> result = ArrayFactory.newArray(EditableProperty.class);

        //result.add(new SimpleProperty<>(EditablePropertyType.COLOR, "Ambient color", this,
        //       LightingState::getAmbientColor, LightingState::setAmbientColor));
        result.add(new SimpleProperty<>(EditablePropertyType.COLOR, "Sun color", this,
                LightingState::getSunColor, LightingState::setSunColor));
        result.add(new SimpleProperty<>(EditablePropertyType.FLOAT, "Time of day", 0.1F, -0.300F, 1.300F, this,
                LightingState::getTimeOfDay, LightingState::setTimeOfDay));
        result.add(new SimpleProperty<>(EditablePropertyType.FLOAT, "Orientation", 0.1F, 0F, 6.283F, this,
                LightingState::getOrientation, LightingState::setOrientation));

        return result;
    }
}

I just noticed that I use the latest jME3.1 release and not 3.2. I think its better to update my project first before making more tests. Then I will create a more fancy state where you can actually see something.

Can you provide me some *.jar to test this case?

@nehon Could you fix this shader, please? :slight_smile:

янв 22, 2017 10:12:32 AM com.jme3.renderer.opengl.GLRenderer updateShaderSourceData
WARNING: Bad compile of:
1	#version 150 core
2	#define SRGB 1
3	#define FRAGMENT_SHADER 1
4	#extension GL_ARB_texture_multisample : enable
5	// -- begin import Common/ShaderLib/MultiSample.glsllib --
6	// -- begin import Common/ShaderLib/GLSLCompat.glsllib --
7	#if defined GL_ES
8	#  define hfloat highp float
9	#  define hvec2  highp vec2
10	#  define hvec3  highp vec3
11	#  define hvec4  highp vec4
12	#  define lfloat lowp float
13	#  define lvec2 lowp vec2
14	#  define lvec3 lowp vec3
15	#  define lvec4 lowp vec4
16	#else
17	#  define hfloat float
18	#  define hvec2  vec2
19	#  define hvec3  vec3
20	#  define hvec4  vec4
21	#  define lfloat float
22	#  define lvec2  vec2
23	#  define lvec3  vec3
24	#  define lvec4  vec4
25	#endif
26	
27	#if __VERSION__ >= 130
28	out vec4 outFragColor;
29	#  define texture1D texture
30	#  define texture2D texture
31	#  define texture3D texture
32	#  define textureCube texture
33	#  define texture2DLod textureLod
34	#  define textureCubeLod textureLod
35	#  if defined VERTEX_SHADER
36	#    define varying out
37	#    define attribute in
38	#  elif defined FRAGMENT_SHADER
39	#    define varying in
40	#    define gl_FragColor outFragColor
41	#  endif
42	#endif
43	// -- end import Common/ShaderLib/GLSLCompat.glsllib --
44	
45	uniform int m_NumSamples;
46	uniform int m_NumSamplesDepth;
47	
48	#ifdef RESOLVE_MS
49	    #define COLORTEXTURE sampler2DMS
50	#else
51	    #define COLORTEXTURE sampler2D
52	#endif
53	
54	#ifdef RESOLVE_DEPTH_MS
55	    #define DEPTHTEXTURE sampler2DMS
56	#else
57	    #define DEPTHTEXTURE sampler2D
58	#endif
59	
60	// NOTE: Only define multisample functions if multisample is available
61	#if defined(GL_ARB_texture_multisample)
62	vec4 textureFetch(in sampler2DMS tex,in vec2 texC, in int numSamples){
63	      ivec2 iTexC = ivec2(texC * vec2(textureSize(tex)));
64	      vec4 color = vec4(0.0);
65	      for (int i = 0; i < numSamples; i++){
66	         color += texelFetch(tex, iTexC, i);
67	      }
68	      return color / float(numSamples);
69	}
70	
71	vec4 fetchTextureSample(in sampler2DMS tex,in vec2 texC,in int sampleId){
72	    ivec2 iTexC = ivec2(texC * vec2(textureSize(tex)));
73	    return texelFetch(tex, iTexC, sampleId);
74	}
75	
76	vec4 getColor(in sampler2DMS tex, in vec2 texC){
77	      return textureFetch(tex, texC, m_NumSamples);
78	}
79	
80	vec4 getColorSingle(in sampler2DMS tex, in vec2 texC){
81	    ivec2 iTexC = ivec2(texC * vec2(textureSize(tex)));
82	    return texelFetch(tex, iTexC, 0);
83	}
84	
85	vec4 getDepth(in sampler2DMS tex,in vec2 texC){
86	      return textureFetch(tex,texC,m_NumSamplesDepth);
87	}
88	
89	#endif
90	
91	vec4 fetchTextureSample(in sampler2D tex,in vec2 texC,in int sampleId){
92	    return texture2D(tex,texC);
93	}
94	
95	vec4 getColor(in sampler2D tex, in vec2 texC){
96	    return texture2D(tex,texC);
97	}
98	
99	vec4 getColorSingle(in sampler2D tex, in vec2 texC){
100	    return texture2D(tex, texC);
101	}
102	
103	vec4 getDepth(in sampler2D tex,in vec2 texC){
104	    return texture2D(tex,texC);
105	}
106	
107	// -- end import Common/ShaderLib/MultiSample.glsllib --
108	
109	uniform COLORTEXTURE m_Texture;
110	uniform DEPTHTEXTURE m_DepthTexture;
111	
112	uniform sampler2D m_NormalsTexture;
113	uniform vec2 g_ResolutionInverse;
114	
115	uniform vec4 m_EdgeColor;
116	
117	uniform float m_EdgeWidth;
118	uniform float m_EdgeIntensity;
119	
120	uniform float m_NormalThreshold;
121	uniform float m_DepthThreshold;
122	
123	uniform float m_NormalSensitivity;
124	uniform float m_DepthSensitivity;
125	
126	in vec2 texCoord;
127	out vec4 outFragColor;
128	
129	vec4 fetchNormalDepth(vec2 tc){
130	    vec4 nd;
131	    nd.xyz = texture2D(m_NormalsTexture, tc).rgb;
132	    nd.w   = fetchTextureSample(m_DepthTexture,   tc,0).r;
133	    return nd;
134	}
135	
136	void main(){
137	    vec3 color = getColor(m_Texture, texCoord).rgb;
138	
139	    vec2 edgeOffset = vec2(m_EdgeWidth) * g_ResolutionInverse;
140	    vec4 n1 = fetchNormalDepth(texCoord + vec2(-1.0, -1.0) * edgeOffset);
141	    vec4 n2 = fetchNormalDepth(texCoord + vec2( 1.0,  1.0) * edgeOffset);
142	    vec4 n3 = fetchNormalDepth(texCoord + vec2(-1.0,  1.0) * edgeOffset);
143	    vec4 n4 = fetchNormalDepth(texCoord + vec2( 1.0, -1.0) * edgeOffset);
144	
145	    // Work out how much the normal and depth values are changing.
146	    vec4 diagonalDelta = abs(n1 - n2) + abs(n3 - n4);
147	
148	    float normalDelta = dot(diagonalDelta.xyz, vec3(1.0));
149	    float depthDelta = diagonalDelta.w;
150	
151	    // Filter out very small changes, in order to produce nice clean results.
152	    normalDelta = clamp((normalDelta - m_NormalThreshold) * m_NormalSensitivity, 0.0, 1.0);
153	    depthDelta  = clamp((depthDelta - m_DepthThreshold) * m_DepthSensitivity,    0.0, 1.0);
154	
155	    // Does this pixel lie on an edge?
156	    float edgeAmount = clamp(normalDelta + depthDelta, 0.0, 1.0) * m_EdgeIntensity;
157	
158	    // Apply the edge detection result to the main scene color.
159	    //color *= (1.0 - edgeAmount);
160	    color = mix (color,m_EdgeColor.rgb,edgeAmount);
161	
162	    outFragColor = vec4(color, 1.0);
163	}

WARNING 10:12:32:983 Editor: com.jme3.renderer.RendererException: compile error in: ShaderSource[name=Common/MatDefs/Post/CartoonEdge15.frag, defines, type=Fragment, language=GLSL150]
0(127) : error C1038: declaration of "outFragColor" conflicts with previous declaration at 0(28)

	at com.jme3.renderer.opengl.GLRenderer.updateShaderSourceData(GLRenderer.java:1244)
	at com.jme3.renderer.opengl.GLRenderer.updateShaderData(GLRenderer.java:1271)
	at com.jme3.renderer.opengl.GLRenderer.setShader(GLRenderer.java:1335)
	at com.jme3.material.logic.DefaultTechniqueDefLogic.render(DefaultTechniqueDefLogic.java:94)
	at com.jme3.material.Technique.render(Technique.java:166)
	at com.jme3.material.Material.render(Material.java:970)
	at com.jme3.renderer.RenderManager.renderGeometry(RenderManager.java:616)
	at com.jme3.post.FilterPostProcessor.renderProcessing(FilterPostProcessor.java:218)
	at com.jme3.post.FilterPostProcessor.renderFilterChain(FilterPostProcessor.java:301)
	at com.jme3.post.FilterPostProcessor.postFrame(FilterPostProcessor.java:320)
	at com.jme3.renderer.RenderManager.renderViewPort(RenderManager.java:1111)
	at com.jme3.renderer.RenderManager.render(RenderManager.java:1154)
	at com.jme3.app.SimpleApplication.update(SimpleApplication.java:253)
	at com.jme3x.jfx.injfx.JmeToJFXApplication.update(JmeToJFXApplication.java:21)
	at com.ss.editor.Editor.update(Editor.java:379)
	at com.jme3.system.lwjgl.LwjglWindow.runLoop(LwjglWindow.java:524)
	at com.jme3.system.lwjgl.LwjglWindow.run(LwjglWindow.java:607)
	at com.jme3.system.lwjgl.LwjglWindow.create(LwjglWindow.java:445)
	at com.jme3x.jfx.injfx.JmeOffscreenSurfaceContext.create(JmeOffscreenSurfaceContext.java:202)
	at com.jme3.app.LegacyApplication.start(LegacyApplication.java:463)
	at com.jme3.app.LegacyApplication.start(LegacyApplication.java:424)
	at com.jme3.app.SimpleApplication.start(SimpleApplication.java:125)
	at com.ss.editor.Editor.start(Editor.java:232)
	at java.lang.Thread.run(Thread.java:745)

Also,

WARNING: Bad compile of:
1	#version 150 core
2	#define SRGB 1
3	#define FRAGMENT_SHADER 1
4	#define DO_EXTRACT 1
5	#extension GL_ARB_texture_multisample : enable
6	// -- begin import Common/ShaderLib/MultiSample.glsllib --
7	// -- begin import Common/ShaderLib/GLSLCompat.glsllib --
8	#if defined GL_ES
9	#  define hfloat highp float
10	#  define hvec2  highp vec2
11	#  define hvec3  highp vec3
12	#  define hvec4  highp vec4
13	#  define lfloat lowp float
14	#  define lvec2 lowp vec2
15	#  define lvec3 lowp vec3
16	#  define lvec4 lowp vec4
17	#else
18	#  define hfloat float
19	#  define hvec2  vec2
20	#  define hvec3  vec3
21	#  define hvec4  vec4
22	#  define lfloat float
23	#  define lvec2  vec2
24	#  define lvec3  vec3
25	#  define lvec4  vec4
26	#endif
27	
28	#if __VERSION__ >= 130
29	out vec4 outFragColor;
30	#  define texture1D texture
31	#  define texture2D texture
32	#  define texture3D texture
33	#  define textureCube texture
34	#  define texture2DLod textureLod
35	#  define textureCubeLod textureLod
36	#  if defined VERTEX_SHADER
37	#    define varying out
38	#    define attribute in
39	#  elif defined FRAGMENT_SHADER
40	#    define varying in
41	#    define gl_FragColor outFragColor
42	#  endif
43	#endif
44	// -- end import Common/ShaderLib/GLSLCompat.glsllib --
45	
46	uniform int m_NumSamples;
47	uniform int m_NumSamplesDepth;
48	
49	#ifdef RESOLVE_MS
50	    #define COLORTEXTURE sampler2DMS
51	#else
52	    #define COLORTEXTURE sampler2D
53	#endif
54	
55	#ifdef RESOLVE_DEPTH_MS
56	    #define DEPTHTEXTURE sampler2DMS
57	#else
58	    #define DEPTHTEXTURE sampler2D
59	#endif
60	
61	// NOTE: Only define multisample functions if multisample is available
62	#if defined(GL_ARB_texture_multisample)
63	vec4 textureFetch(in sampler2DMS tex,in vec2 texC, in int numSamples){
64	      ivec2 iTexC = ivec2(texC * vec2(textureSize(tex)));
65	      vec4 color = vec4(0.0);
66	      for (int i = 0; i < numSamples; i++){
67	         color += texelFetch(tex, iTexC, i);
68	      }
69	      return color / float(numSamples);
70	}
71	
72	vec4 fetchTextureSample(in sampler2DMS tex,in vec2 texC,in int sampleId){
73	    ivec2 iTexC = ivec2(texC * vec2(textureSize(tex)));
74	    return texelFetch(tex, iTexC, sampleId);
75	}
76	
77	vec4 getColor(in sampler2DMS tex, in vec2 texC){
78	      return textureFetch(tex, texC, m_NumSamples);
79	}
80	
81	vec4 getColorSingle(in sampler2DMS tex, in vec2 texC){
82	    ivec2 iTexC = ivec2(texC * vec2(textureSize(tex)));
83	    return texelFetch(tex, iTexC, 0);
84	}
85	
86	vec4 getDepth(in sampler2DMS tex,in vec2 texC){
87	      return textureFetch(tex,texC,m_NumSamplesDepth);
88	}
89	
90	#endif
91	
92	vec4 fetchTextureSample(in sampler2D tex,in vec2 texC,in int sampleId){
93	    return texture2D(tex,texC);
94	}
95	
96	vec4 getColor(in sampler2D tex, in vec2 texC){
97	    return texture2D(tex,texC);
98	}
99	
100	vec4 getColorSingle(in sampler2D tex, in vec2 texC){
101	    return texture2D(tex, texC);
102	}
103	
104	vec4 getDepth(in sampler2D tex,in vec2 texC){
105	    return texture2D(tex,texC);
106	}
107	
108	// -- end import Common/ShaderLib/MultiSample.glsllib --
109	
110	uniform COLORTEXTURE m_Texture;
111	
112	uniform float m_ExposurePow;
113	uniform float m_ExposureCutoff;
114	
115	in vec2 texCoord;
116	out vec4 outFragColor;
117	
118	#ifdef HAS_GLOWMAP
119	  uniform sampler2D m_GlowMap;
120	#endif
121	
122	void main(){
123	   vec4 color = vec4(0.0);
124	   #ifdef DO_EXTRACT
125	     color = getColorSingle(m_Texture, texCoord);
126	     if ( (color.r + color.g + color.b) / 3.0 >= m_ExposureCutoff ) {
127	         color = pow(color, vec4(m_ExposurePow));
128	     }else{
129	         color = vec4(0.0);
130	     }
131	   #endif
132	
133	   #ifdef HAS_GLOWMAP
134	        vec4 glowColor = texture( m_GlowMap, texCoord );
135	        glowColor = pow(glowColor, vec4(m_ExposurePow));
136	        color += glowColor;
137	   #endif
138	   
139	   outFragColor = color;
140	}

WARNING 11:12:46:675 Editor: com.jme3.renderer.RendererException: compile error in: ShaderSource[name=Common/MatDefs/Post/bloomExtract15.frag, defines, type=Fragment, language=GLSL150]
0(116) : error C1038: declaration of "outFragColor" conflicts with previous declaration at 0(29)

	at com.jme3.renderer.opengl.GLRenderer.updateShaderSourceData(GLRenderer.java:1244)
	at com.jme3.renderer.opengl.GLRenderer.updateShaderData(GLRenderer.java:1271)
	at com.jme3.renderer.opengl.GLRenderer.setShader(GLRenderer.java:1335)
	at com.jme3.material.logic.DefaultTechniqueDefLogic.render(DefaultTechniqueDefLogic.java:94)
	at com.jme3.material.Technique.render(Technique.java:166)
	at com.jme3.material.Material.render(Material.java:970)
	at com.jme3.renderer.RenderManager.renderGeometry(RenderManager.java:616)
	at com.jme3.post.FilterPostProcessor.renderProcessing(FilterPostProcessor.java:218)
	at com.jme3.post.FilterPostProcessor.renderFilterChain(FilterPostProcessor.java:269)
	at com.jme3.post.FilterPostProcessor.postFrame(FilterPostProcessor.java:320)
	at com.jme3.renderer.RenderManager.renderViewPort(RenderManager.java:1111)
	at com.jme3.renderer.RenderManager.render(RenderManager.java:1154)
	at com.jme3.app.SimpleApplication.update(SimpleApplication.java:253)
	at com.jme3x.jfx.injfx.JmeToJFXApplication.update(JmeToJFXApplication.java:21)
	at com.ss.editor.Editor.update(Editor.java:379)
	at com.jme3.system.lwjgl.LwjglWindow.runLoop(LwjglWindow.java:524)
	at com.jme3.system.lwjgl.LwjglWindow.run(LwjglWindow.java:607)
	at com.jme3.system.lwjgl.LwjglWindow.create(LwjglWindow.java:445)
	at com.jme3x.jfx.injfx.JmeOffscreenSurfaceContext.create(JmeOffscreenSurfaceContext.java:202)
	at com.jme3.app.LegacyApplication.start(LegacyApplication.java:463)
	at com.jme3.app.LegacyApplication.start(LegacyApplication.java:424)
	at com.jme3.app.SimpleApplication.start(SimpleApplication.java:125)
	at com.ss.editor.Editor.start(Editor.java:232)
	at java.lang.Thread.run(Thread.java:745)

yeah looks like my previous fix was not so good…

Alright this commit Removed all xxx15.frag shaders and used GLSLCompat to have the same s… · jMonkeyEngine/jmonkeyengine@f7181c3 · GitHub
should fix all shader disorders with glsl1.3+

2 Likes

Thanks :slight_smile:

I had some time to create a simple test case which shows some issues. I use the jME jars from the lib folder of your editor. This is the whole project:

My classpath points to build/libs.

This is the EditableBoxState:

If I select the root of my project as asset folder I can attach the EditableBoxState to the scene. I tried it multiple times and sometimes I have to wait some seconds until it shows up.

When I close the editor and reopen the scene again I get the following exception:

java.lang.IllegalArgumentException: Argument for @NotNull parameter 'object' of rlib/util/array/impl/FastArray.add must not be null
	at rlib.util.array.impl.FastArray.add(FastArray.java)
	at com.ss.extension.scene.SceneNode.read(SceneNode.java:145)
	at com.jme3.export.binary.BinaryImporter.readObject(BinaryImporter.java:342)
	at com.jme3.export.binary.BinaryImporter.load(BinaryImporter.java:242)
	at com.jme3.export.binary.BinaryImporter.load(BinaryImporter.java:125)
	at com.jme3.export.binary.BinaryImporter.load(BinaryImporter.java:109)
	at com.ss.extension.loader.SceneLoader.load(SceneLoader.java:69)
	at com.jme3.asset.DesktopAssetManager.loadLocatedAsset(DesktopAssetManager.java:259)
	at com.jme3.asset.DesktopAssetManager.loadAsset(DesktopAssetManager.java:373)
	at com.ss.editor.ui.component.editor.impl.scene.SceneFileEditor.openFile(Unknown Source)
	at com.ss.editor.ui.component.editor.area.EditorAreaComponent.processOpenFileImpl(Unknown Source)
	at com.ss.editor.ui.component.editor.area.EditorAreaComponent.lambda$processOpenFile$279(Unknown Source)
	at com.ss.editor.executor.impl.BackgroundEditorTaskExecutor.doExecute(Unknown Source)
	at com.ss.editor.executor.impl.AbstractEditorTaskExecutor.run(Unknown Source)

If I select the asset folder as root I can’t even attach SelectableBoxState to a scene. I get the following exception:

java.lang.RuntimeException: Can't create a state of the class EditableBoxState
	at com.ss.editor.ui.control.app.state.dialog.CreateSceneAppStateDialog.processOk(Unknown Source)
	at com.ss.editor.ui.dialog.AbstractSimpleEditorDialog.lambda$createActions$293(Unknown Source)
	at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
	at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
	at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
	at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
	at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
	at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
	at javafx.event.Event.fireEvent(Event.java:198)
	at javafx.scene.Node.fireEvent(Node.java:8411)
	at javafx.scene.control.Button.fire(Button.java:185)
	at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182)
	at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96)
	at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89)
	at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
	at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
	at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
	at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
	at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
	at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
	at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
	at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
	at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
	at javafx.event.Event.fireEvent(Event.java:198)
	at javafx.scene.Scene$MouseHandler.process(Scene.java:3757)
	at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
	at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
	at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
	at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:352)
	at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:275)
	at java.security.AccessController.doPrivileged(Native Method)
	at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$354(GlassViewEventHandler.java:388)
	at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
	at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:387)
	at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
	at com.sun.glass.ui.View.notifyMouse(View.java:937)
	at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
	at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
	at java.lang.Thread.run(Thread.java:745)

I will look at this, thx.

Yes, I have reproduced your problem, I have fixed it in the version 0.9.2. Thank you :slight_smile:
https://bitbucket.org/JavaSabr/jme3-spaceshift-editor/commits/1b9a070cafb114a8c0835047f9ceae64163e2cc4

Can you recheck it on the night build? By the way, the class EditableProperty was moved to an another package.
https://yadi.sk/d/JUmFW-5-3AaC6K

1 Like

Now it works fine, thank you for your fast support!

There is only one minor bug. If I select the project folder as my root attaching the state takes a lot of time compared to attaching a state with my asset folder as root. Also the log is full of these exceptions:

WARNING 08:08:16:530 CreateSceneAppStateDialog: java.lang.RuntimeException: java.lang.ClassNotFoundException: EditableBoxState
	at rlib.util.ClassUtils.newInstance(ClassUtils.java:113)
	at com.ss.editor.ui.control.app.state.dialog.CreateSceneAppStateDialog.processOk(Unknown Source)
	at com.ss.editor.ui.dialog.AbstractSimpleEditorDialog.lambda$createActions$0(Unknown Source)
	at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
[...]

This is no problem to me beause I nearly nerver use my project folder as root bu it maybe interests you. When I find some time I will clean the test and write some documentation. It could be a helpfull example…