88import com .jme3 .scene .Node ;
99import com .jme3 .util .clone .Cloner ;
1010import com .ss .extension .scene .app .state .SceneAppState ;
11+ import com .ss .extension .scene .filter .SceneFilter ;
1112
1213import org .jetbrains .annotations .NotNull ;
1314
@@ -25,6 +26,7 @@ public class SceneNode extends Node {
2526
2627 public static final SceneLayer [] EMPTY_LAYERS = new SceneLayer [0 ];
2728 public static final SceneAppState [] EMPTY_STATES = new SceneAppState [0 ];
29+ public static final SceneFilter <?>[] EMPTY_FILTERS = new SceneFilter [0 ];
2830
2931 /**
3032 * The scene layers.
@@ -38,10 +40,17 @@ public class SceneNode extends Node {
3840 @ NotNull
3941 private Array <SceneAppState > appStates ;
4042
43+ /**
44+ * The scene filters.
45+ */
46+ @ NotNull
47+ private Array <SceneFilter <?>> filters ;
48+
4149 public SceneNode () {
4250 super ("Empty scene" );
4351 this .layers = ArrayFactory .newArray (SceneLayer .class );
4452 this .appStates = ArrayFactory .newArray (SceneAppState .class );
53+ this .filters = ArrayFactory .newArray (SceneFilter .class );
4554 }
4655
4756 /**
@@ -50,7 +59,6 @@ public SceneNode() {
5059 * @param layer the layer.
5160 */
5261 public void addLayer (@ NotNull final SceneLayer layer ) {
53- layer .setSceneNode (this );
5462 layers .add (layer );
5563 }
5664
@@ -60,9 +68,6 @@ public void addLayer(@NotNull final SceneLayer layer) {
6068 * @param layer the layer.
6169 */
6270 public void removeLayer (@ NotNull final SceneLayer layer ) {
63- if (layer .getSceneNode () == this ) {
64- layer .setSceneNode (null );
65- }
6671 layers .slowRemove (layer );
6772 }
6873
@@ -81,6 +86,7 @@ public Array<SceneLayer> getLayers() {
8186 */
8287 public void addAppState (@ NotNull final SceneAppState appState ) {
8388 appStates .add (appState );
89+ appState .setSceneNode (this );
8490 }
8591
8692 /**
@@ -90,6 +96,7 @@ public void addAppState(@NotNull final SceneAppState appState) {
9096 */
9197 public void removeAppState (@ NotNull final SceneAppState appState ) {
9298 appStates .slowRemove (appState );
99+ appState .setSceneNode (null );
93100 }
94101
95102 /**
@@ -100,50 +107,74 @@ public Array<SceneAppState> getAppStates() {
100107 return appStates ;
101108 }
102109
110+ /**
111+ * Add a new filter.
112+ *
113+ * @param filter the scene filter.
114+ */
115+ public void addFilter (@ NotNull final SceneFilter filter ) {
116+ filters .add (filter );
117+ }
118+
119+ /**
120+ * Remove an old filter.
121+ *
122+ * @param filter the scene filter.
123+ */
124+ public void removeFilter (@ NotNull final SceneFilter filter ) {
125+ filters .slowRemove (filter );
126+ }
127+
128+ /**
129+ * Get a list of filters.
130+ *
131+ * @return the list of filters.
132+ */
133+ @ NotNull
134+ public Array <SceneFilter <?>> getFilters () {
135+ return filters ;
136+ }
137+
103138 @ Override
104139 public void write (@ NotNull final JmeExporter exporter ) throws IOException {
105140
106141 final OutputCapsule capsule = exporter .getCapsule (this );
107142 final SceneLayer [] layers = getLayers ().toArray (SceneLayer .class );
108143 final SceneAppState [] appStates = getAppStates ().toArray (SceneAppState .class );
144+ final SceneFilter <?>[] filters = getFilters ().toArray (SceneFilter .class );
109145
110- for (final SceneLayer layer : layers ) {
111- if (!layer .isShowed ()) continue ;
112- detachChild (layer );
113- }
146+ capsule .write (layers , "layers" , EMPTY_LAYERS );
114147
115148 super .write (exporter );
116149
117- for (final SceneLayer layer : layers ) {
118- if (!layer .isShowed ()) continue ;
119- attachChild (layer );
120- }
121-
122- capsule .write (layers , "layers" , EMPTY_LAYERS );
123150 capsule .write (appStates , "appStates" , EMPTY_STATES );
151+ capsule .write (filters , "filters" , EMPTY_FILTERS );
124152 }
125153
126154 @ Override
127155 public void read (@ NotNull final JmeImporter importer ) throws IOException {
128156
129157 final InputCapsule capsule = importer .getCapsule (this );
130158
131- super .read (importer );
132-
133159 final Savable [] importedLayers = capsule .readSavableArray ("layers" , EMPTY_LAYERS );
134160
135161 for (final Savable savable : importedLayers ) {
136- final SceneLayer layer = (SceneLayer ) savable ;
137- layer .setSceneNode (this );
138- layers .add (layer );
139- if (layer .isShowed ()) attachChild (layer );
162+ layers .add ((SceneLayer ) savable );
140163 }
141164
165+ super .read (importer );
166+
142167 final Savable [] importedAppStates = capsule .readSavableArray ("appStates" , EMPTY_STATES );
143168
144169 for (final Savable savable : importedAppStates ) {
145170 appStates .add ((SceneAppState ) savable );
146171 }
172+
173+ final Savable [] importedFilters = capsule .readSavableArray ("filters" , EMPTY_FILTERS );
174+
175+ for (final Savable savable : importedFilters ) {
176+ filters .add ((SceneFilter ) savable );
177+ }
147178 }
148179
149180 @ Override
@@ -161,5 +192,11 @@ public void cloneFields(final Cloner cloner, final Object original) {
161192 for (int i = 0 ; i < appStates .size (); i ++) {
162193 appStates .set (i , cloner .clone (appStates .get (i )));
163194 }
195+
196+ filters = cloner .clone (filters );
197+
198+ for (int i = 0 ; i < filters .size (); i ++) {
199+ filters .set (i , cloner .clone (filters .get (i )));
200+ }
164201 }
165202}
0 commit comments