sunrize 1.7.30 → 1.7.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "sunrize",
3
3
  "productName": "Sunrize X3D Editor",
4
- "version": "1.7.30",
4
+ "version": "1.7.31",
5
5
  "description": "A Multi-Platform X3D Editor",
6
6
  "main": "src/main.js",
7
7
  "bin": {
@@ -25,7 +25,7 @@
25
25
  "postgithub": "npm i -P electron",
26
26
  "predocs": "rm -f -r docs/_site/",
27
27
  "docs": "cd docs && bundle exec jekyll serve --ssl-key ssl/server.key --ssl-cert ssl/server.crt --incremental --host=`ipconfig getifaddr en0`",
28
- "docs-install": "cd docs && bundle install",
28
+ "docs-install": "cd docs && gem install bundler && bundle install",
29
29
  "docs-update": "cd docs && bundle update",
30
30
  "merge-development": "sh build/merge-development.sh",
31
31
  "make-x_ite-for-sunrize": "sh build/make-x_ite-for-sunrize.sh"
@@ -90,7 +90,7 @@
90
90
  "dependencies": {
91
91
  "capitalize": "^2.0.4",
92
92
  "console": "^0.7.2",
93
- "electron": "^33.0.2",
93
+ "electron": "^33.2.0",
94
94
  "electron-prompt": "^1.7.0",
95
95
  "electron-squirrel-startup": "^1.0.1",
96
96
  "electron-tabs": "^1.0.4",
@@ -99,7 +99,7 @@
99
99
  "jquery-ui-dist": "^1.13.3",
100
100
  "jstree": "^3.3.17",
101
101
  "material-icons": "^1.13.12",
102
- "material-symbols": "^0.26.0",
102
+ "material-symbols": "^0.27.0",
103
103
  "md5": "^2.3.0",
104
104
  "mime-types": "^2.1.35",
105
105
  "monaco-editor": "^0.50.0",
@@ -109,6 +109,7 @@
109
109
  "string-similarity": "^4.0.4",
110
110
  "tweakpane": "^3.1.10",
111
111
  "update-electron-app": "^3.0.0",
112
- "x_ite": "^10.5.10"
112
+ "x_ite": "^10.5.11",
113
+ "x3d-traverse": "^1.0.2"
113
114
  }
114
115
  }
@@ -7,7 +7,7 @@ const
7
7
  Dialog = require ("../Controls/Dialog"),
8
8
  Editor = require ("../Undo/Editor"),
9
9
  UndoManager = require ("../Undo/UndoManager"),
10
- Traverse = require ("../Application/Traverse"),
10
+ Traverse = require ("x3d-traverse") (X3D),
11
11
  _ = require ("../Application/GetText");
12
12
 
13
13
  module .exports = new class Library extends Dialog
@@ -209,8 +209,10 @@ module .exports = new class Library extends Dialog
209
209
 
210
210
  if (this .browser .getBrowserOption ("ColorSpace") === "LINEAR")
211
211
  {
212
- Traverse .traverse (node, Traverse .ROOT_NODES, node =>
212
+ for (const object of Traverse .traverse (node, Traverse .ROOT_NODES))
213
213
  {
214
+ const node = object .getValue ();
215
+
214
216
  for (const field of node .getFields ())
215
217
  {
216
218
  switch (field .getType ())
@@ -225,7 +227,7 @@ module .exports = new class Library extends Dialog
225
227
  break;
226
228
  }
227
229
  }
228
- });
230
+ }
229
231
  }
230
232
 
231
233
  switch (field ?.getType ())
@@ -4,7 +4,7 @@ const
4
4
  $ = require ("jquery"),
5
5
  X3D = require ("../X3D"),
6
6
  Interface = require ("../Application/Interface"),
7
- Traverse = require ("../Application/Traverse"),
7
+ Traverse = require ("x3d-traverse") (X3D),
8
8
  _ = require ("../Application/GetText");
9
9
 
10
10
  module .exports = class NodeList extends Interface
@@ -92,11 +92,7 @@ module .exports = class NodeList extends Interface
92
92
 
93
93
  getNodes ()
94
94
  {
95
- const nodes = [ ];
96
-
97
- Traverse .traverse (this .executionContext, Traverse .PROTO_DECLARATIONS | Traverse .PROTO_DECLARATION_BODY | Traverse .ROOT_NODES, node => nodes .push (node));
98
-
99
- return nodes;
95
+ return Array .from (this .executionContext .traverse (Traverse .PROTO_DECLARATIONS | Traverse .PROTO_DECLARATION_BODY | Traverse .ROOT_NODES), node => node instanceof X3D .SFNode ? node .getValue () : node);
100
96
  }
101
97
 
102
98
  getName (node)
@@ -8,7 +8,7 @@ const
8
8
  X3D = require ("../X3D"),
9
9
  Interface = require ("../Application/Interface"),
10
10
  ActionKeys = require ("../Application/ActionKeys"),
11
- Traverse = require ("../Application/Traverse"),
11
+ Traverse = require ("x3d-traverse") (X3D),
12
12
  X3DUOM = require ("../Bits/X3DUOM"),
13
13
  _ = require ("../Application/GetText");
14
14
 
@@ -3144,76 +3144,96 @@ module .exports = class OutlineView extends Interface
3144
3144
  {
3145
3145
  // Hide all X3DShapeNode nodes and show all other nodes.
3146
3146
 
3147
- Traverse .traverse (this .executionContext, Traverse .INLINE_SCENE | Traverse .PROTOTYPE_INSTANCES | Traverse .PROTO_DECLARATIONS | Traverse .PROTO_DECLARATION_BODY | Traverse .ROOT_NODES, node =>
3147
+ for (const object of this .executionContext .traverse (Traverse .INLINE_SCENE | Traverse .PROTOTYPE_INSTANCES | Traverse .PROTO_DECLARATIONS | Traverse .PROTO_DECLARATION_BODY | Traverse .ROOT_NODES))
3148
3148
  {
3149
+ if (!(object instanceof X3D .SFNode))
3150
+ continue;
3151
+
3152
+ const node = object .getValue ();
3153
+
3149
3154
  if (!node .setHidden)
3150
- return
3155
+ continue;
3151
3156
 
3152
- node .setHidden (node .getType () .includes (X3D .X3DConstants .X3DShapeNode))
3157
+ node .setHidden (node .getType () .includes (X3D .X3DConstants .X3DShapeNode));
3153
3158
 
3154
3159
  this .sceneGraph .find (`.node[node-id=${node .getId ()}]`)
3155
3160
  .find ("> .item .toggle-visibility")
3156
3161
  .removeClass (["on", "off"])
3157
3162
  .addClass (node .isHidden () ? "off" : "on")
3158
- .text (node .isHidden () ? "visibility_off" : "visibility")
3159
- })
3163
+ .text (node .isHidden () ? "visibility_off" : "visibility");
3164
+ }
3160
3165
 
3161
3166
  // Show all nodes in selection.
3162
3167
 
3163
3168
  const selection = require ("../Application/Selection");
3164
3169
 
3165
- Traverse .traverse (selection .nodes, Traverse .INLINE_SCENE | Traverse .PROTOTYPE_INSTANCES | Traverse .PROTO_DECLARATIONS | Traverse .PROTO_DECLARATION_BODY | Traverse .ROOT_NODES, node =>
3170
+ for (const object of Traverse .traverse (selection .nodes, Traverse .INLINE_SCENE | Traverse .PROTOTYPE_INSTANCES | Traverse .PROTO_DECLARATIONS | Traverse .PROTO_DECLARATION_BODY | Traverse .ROOT_NODES))
3166
3171
  {
3172
+ if (!(object instanceof X3D .SFNode))
3173
+ continue;
3174
+
3175
+ const node = object .getValue ();
3176
+
3167
3177
  if (!node .setHidden)
3168
- return
3178
+ continue;
3169
3179
 
3170
3180
  if (!node .getType () .includes (X3D .X3DConstants .X3DShapeNode))
3171
- return
3181
+ continue;
3172
3182
 
3173
- node .setHidden (false)
3183
+ node .setHidden (false);
3174
3184
 
3175
3185
  this .sceneGraph .find (`.node[node-id=${node .getId ()}]`)
3176
3186
  .find ("> .item .toggle-visibility")
3177
3187
  .removeClass ("off")
3178
3188
  .addClass ("on")
3179
- .text ("visibility")
3180
- })
3189
+ .text ("visibility");
3190
+ }
3181
3191
  }
3182
3192
 
3183
3193
  showSelectedObjects ()
3184
3194
  {
3185
3195
  const selection = require ("../Application/Selection")
3186
3196
 
3187
- Traverse .traverse (selection .nodes .length ? selection .nodes : this .executionContext, Traverse .INLINE_SCENE | Traverse .PROTOTYPE_INSTANCES | Traverse .PROTO_DECLARATIONS | Traverse .PROTO_DECLARATION_BODY | Traverse .ROOT_NODES, node =>
3197
+ for (const object of Traverse .traverse (selection .nodes .length ? selection .nodes : this .executionContext, Traverse .INLINE_SCENE | Traverse .PROTOTYPE_INSTANCES | Traverse .PROTO_DECLARATIONS | Traverse .PROTO_DECLARATION_BODY | Traverse .ROOT_NODES))
3188
3198
  {
3199
+ if (!(object instanceof X3D .SFNode))
3200
+ continue;
3201
+
3202
+ const node = object .getValue ();
3203
+
3189
3204
  if (!node .setHidden)
3190
- return
3205
+ continue;
3191
3206
 
3192
- node .setHidden (false)
3207
+ node .setHidden (false);
3193
3208
 
3194
3209
  this .sceneGraph .find (`.node[node-id=${node .getId ()}]`)
3195
3210
  .find ("> .item .toggle-visibility")
3196
3211
  .removeClass ("off")
3197
3212
  .addClass ("on")
3198
- .text ("visibility")
3199
- })
3213
+ .text ("visibility");
3214
+ }
3200
3215
  }
3201
3216
 
3202
3217
  showAllObjects ()
3203
3218
  {
3204
- Traverse .traverse (this .executionContext, Traverse .INLINE_SCENE | Traverse .PROTOTYPE_INSTANCES | Traverse .PROTO_DECLARATIONS | Traverse .PROTO_DECLARATION_BODY | Traverse .ROOT_NODES, node =>
3219
+ for (const object of this .executionContext .traverse (Traverse .INLINE_SCENE | Traverse .PROTOTYPE_INSTANCES | Traverse .PROTO_DECLARATIONS | Traverse .PROTO_DECLARATION_BODY | Traverse .ROOT_NODES))
3205
3220
  {
3221
+ if (!(object instanceof X3D .SFNode))
3222
+ continue;
3223
+
3224
+ const node = object .getValue ();
3225
+
3206
3226
  if (!node .setHidden)
3207
- return
3227
+ continue;
3208
3228
 
3209
- node .setHidden (false)
3229
+ node .setHidden (false);
3210
3230
 
3211
3231
  this .sceneGraph .find (`.node[node-id=${node .getId ()}]`)
3212
3232
  .find ("> .item .toggle-visibility")
3213
3233
  .removeClass ("off")
3214
3234
  .addClass ("on")
3215
- .text ("visibility")
3216
- })
3235
+ .text ("visibility");
3236
+ }
3217
3237
  }
3218
3238
 
3219
3239
  selectNone (event)
@@ -3637,16 +3657,15 @@ module .exports = class OutlineView extends Interface
3637
3657
 
3638
3658
  flags |= Traverse .IMPORTED_NODES;
3639
3659
 
3640
- const hierarchies = Traverse .find (this .executionContext, object, flags);
3641
-
3642
- for (const hierarchy of hierarchies)
3660
+ for (const hierarchy of this .executionContext .find (object, flags))
3643
3661
  {
3644
3662
  hierarchy .shift (); // execution context
3663
+ hierarchy .shift (); // rootNode | protos ...
3645
3664
 
3646
3665
  if (!expandObject)
3647
3666
  hierarchy .pop ();
3648
3667
 
3649
- this .expandHierarchy (hierarchy, this .sceneGraph);
3668
+ this .expandHierarchy (hierarchy, this .sceneGraph, this .executionContext);
3650
3669
  break;
3651
3670
  }
3652
3671
  }
@@ -3658,46 +3677,67 @@ module .exports = class OutlineView extends Interface
3658
3677
  "X3DExecutionContext": "scene",
3659
3678
  };
3660
3679
 
3661
- expandHierarchy (hierarchy, parent)
3680
+ expandHierarchy (hierarchy, parent, parentObject)
3662
3681
  {
3663
- const object = hierarchy .shift ();
3682
+ let object = hierarchy .shift ();
3664
3683
 
3665
- if (!object)
3684
+ if (object === undefined)
3666
3685
  return;
3667
3686
 
3668
- if (object instanceof X3D .X3DField)
3687
+ switch (true)
3669
3688
  {
3670
- let element = parent .find (`.field[field-id=${object .getId ()}]`);
3671
-
3672
- if (element .length === 0)
3689
+ case typeof object === "string":
3673
3690
  {
3674
- parent .jstree ("close_node", parent);
3675
- parent .jstree ("open_node", parent);
3691
+ object = parentObject .getField (object);
3676
3692
 
3677
- element = parent .find (`.field[field-id=${object .getId ()}]`);
3678
- }
3693
+ let element = parent .find (`.field[field-id=${object .getId ()}]`);
3679
3694
 
3680
- element .jstree ("open_node", element);
3695
+ if (element .length === 0)
3696
+ {
3697
+ parent .jstree ("close_node", parent);
3698
+ parent .jstree ("open_node", parent);
3681
3699
 
3682
- this .expandHierarchy (hierarchy, element);
3683
- }
3684
- else if (object instanceof X3D .X3DImportedNode)
3685
- {
3686
- const element = parent .find (`.imported-node[imported-node-id=${object .getId ()}]`);
3700
+ element = parent .find (`.field[field-id=${object .getId ()}]`);
3701
+ }
3687
3702
 
3688
- element .jstree ("open_node", element);
3703
+ element .jstree ("open_node", element);
3689
3704
 
3690
- this .expandHierarchy (hierarchy, element);
3691
- }
3692
- else
3693
- {
3694
- const
3695
- objectClass = OutlineView .objectClasses [object .getTypeName ()] || "node",
3696
- element = parent .find (`.${objectClass}[node-id=${object .getId ()}]`);
3705
+ this .expandHierarchy (hierarchy, element);
3706
+ break;
3707
+ }
3708
+ case typeof object === "number":
3709
+ {
3710
+ this .expandHierarchy (hierarchy, parent);
3711
+ break;
3712
+ }
3713
+ case object instanceof X3D .X3DImportedNode:
3714
+ {
3715
+ const element = parent .find (`.imported-node[imported-node-id=${object .getId ()}]`);
3697
3716
 
3698
- element .jstree ("open_node", element);
3717
+ element .jstree ("open_node", element);
3718
+
3719
+ this .expandHierarchy (hierarchy, element);
3720
+ break;
3721
+ }
3722
+ case object instanceof X3D .SFNode:
3723
+ {
3724
+ object = object .getValue ();
3725
+ // Proceed with next case:
3726
+ }
3727
+ default: // X3DBaseNode
3728
+ {
3729
+ const
3730
+ objectClass = OutlineView .objectClasses [object .getTypeName ()] || "node",
3731
+ element = parent .find (`.${objectClass}[node-id=${object .getId ()}]`);
3732
+
3733
+ element .jstree ("open_node", element);
3734
+
3735
+ if (object instanceof X3D .X3DExecutionContext)
3736
+ hierarchy .shift (); // rootNode | protos ...
3699
3737
 
3700
- this .expandHierarchy (hierarchy, element);
3738
+ this .expandHierarchy (hierarchy, element, object);
3739
+ break;
3740
+ }
3701
3741
  }
3702
3742
  }
3703
3743
 
@@ -5,7 +5,7 @@ const
5
5
  X3D = require ("../../X3D"),
6
6
  Editor = require ("../../Undo/Editor"),
7
7
  UndoManager = require ("../../Undo/UndoManager"),
8
- Traverse = require ("../../Application/Traverse"),
8
+ Traverse = require ("x3d-traverse") (X3D),
9
9
  path = require ("path"),
10
10
  url = require ("url"),
11
11
  _ = require ("../../Application/GetText");
@@ -218,7 +218,10 @@ class X3DNodeTool extends X3DBaseTool
218
218
 
219
219
  for (const tool of this .#tools)
220
220
  {
221
- Traverse .traverse (this [tool], Traverse .ROOT_NODES | Traverse .INLINE_SCENE | Traverse .PROTOTYPE_INSTANCES, node => nodesToDispose .push (node));
221
+ for (const node of Traverse .traverse (this [tool], Traverse .ROOT_NODES | Traverse .INLINE_SCENE | Traverse .PROTOTYPE_INSTANCES))
222
+ {
223
+ nodesToDispose .push (node instanceof X3D .SFNode ? node .getValue () : node);
224
+ }
222
225
  }
223
226
 
224
227
  for (const node of nodesToDispose .filter (node => !this .#externalNodes .has (node)))
@@ -7,7 +7,7 @@ const
7
7
  fs = require ("fs"),
8
8
  zlib = require ("zlib"),
9
9
  X3D = require ("../X3D"),
10
- Traverse = require ("../Application/Traverse"),
10
+ Traverse = require ("x3d-traverse") (X3D),
11
11
  UndoManager = require ("./UndoManager"),
12
12
  _ = require ("../Application/GetText")
13
13
 
@@ -90,13 +90,20 @@ module .exports = class Editor
90
90
 
91
91
  const protoNodes = new Set ()
92
92
 
93
- Traverse .traverse (objects, Traverse .PROTO_DECLARATIONS | Traverse .PROTO_DECLARATION_BODY | Traverse .ROOT_NODES | Traverse .PROTOTYPE_INSTANCES, (node) =>
93
+ for (const object of Traverse .traverse (objects, Traverse .PROTO_DECLARATIONS | Traverse .PROTO_DECLARATION_BODY | Traverse .ROOT_NODES | Traverse .PROTOTYPE_INSTANCES))
94
94
  {
95
- if (node instanceof X3D .X3DProtoDeclarationNode)
96
- protoNodes .add (node);
97
- else if (node .getType () .includes (X3D .X3DConstants .X3DPrototypeInstance))
98
- protoNodes .add (node .getProtoNode ());
99
- });
95
+ if (object instanceof X3D .X3DProtoDeclarationNode)
96
+ {
97
+ protoNodes .add (object);
98
+ }
99
+ else if (object instanceof X3D .SFNode)
100
+ {
101
+ const node = object .getValue ();
102
+
103
+ if (node .getType () .includes (X3D .X3DConstants .X3DPrototypeInstance))
104
+ protoNodes .add (node .getProtoNode ());
105
+ }
106
+ }
100
107
 
101
108
  for (const protoNode of protoNodes)
102
109
  {
@@ -125,8 +132,10 @@ module .exports = class Editor
125
132
  childRoutes = new Set (),
126
133
  inlineNodes = new Set ();
127
134
 
128
- Traverse .traverse (nodes, Traverse .ROOT_NODES, node =>
135
+ for (const object of nodes .traverse (Traverse .ROOT_NODES))
129
136
  {
137
+ const node = object .getValue ();
138
+
130
139
  componentNames .add (node .getComponentInfo () .name);
131
140
  children .add (node .valueOf ());
132
141
 
@@ -141,7 +150,7 @@ module .exports = class Editor
141
150
 
142
151
  if (node .getType () .includes (X3D .X3DConstants .Inline))
143
152
  inlineNodes .add (node .valueOf ());
144
- });
153
+ }
145
154
 
146
155
  // Add exported nodes.
147
156
 
@@ -295,13 +304,18 @@ module .exports = class Editor
295
304
  updatedProtos = new Map (),
296
305
  removedProtoNodes = new Set ();
297
306
 
298
- Traverse .traverse ([... newProtos, ... nodes], Traverse .PROTO_DECLARATIONS | Traverse .PROTO_DECLARATION_BODY | Traverse .ROOT_NODES, (node) =>
307
+ for (const object of Traverse .traverse ([... newProtos, ... nodes], Traverse .PROTO_DECLARATIONS | Traverse .PROTO_DECLARATION_BODY | Traverse .ROOT_NODES))
299
308
  {
309
+ if (!(object instanceof X3D .SFNode))
310
+ continue;
311
+
312
+ const node = object .getValue ();
313
+
300
314
  if (!node .getType () .includes (X3D .X3DConstants .X3DPrototypeInstance))
301
- return;
315
+ continue;
302
316
 
303
317
  if (node .getProtoNode () .getExecutionContext () !== executionContext)
304
- return;
318
+ continue;
305
319
 
306
320
  const proto = protos .get (node .getTypeName ());
307
321
 
@@ -309,7 +323,7 @@ module .exports = class Editor
309
323
  {
310
324
  updatedProtos .set (node .getTypeName (), proto);
311
325
  this .setProtoNode (executionContext, node, proto, undoManager);
312
- return;
326
+ continue;
313
327
  }
314
328
 
315
329
  const externproto = externprotos .get (node .getTypeName ());
@@ -318,7 +332,7 @@ module .exports = class Editor
318
332
  {
319
333
  updatedExternProtos .set (node .getTypeName (), externproto);
320
334
  this .setProtoNode (executionContext, node, externproto, undoManager);
321
- return;
335
+ continue;
322
336
  }
323
337
 
324
338
  const available = this .getNextAvailableProtoNode (executionContext, node .getTypeName ());
@@ -327,9 +341,9 @@ module .exports = class Editor
327
341
  {
328
342
  removedProtoNodes .add (node .getProtoNode ());
329
343
  this .setProtoNode (executionContext, node, available, undoManager);
330
- return;
344
+ continue;
331
345
  }
332
- });
346
+ }
333
347
 
334
348
  for (const [name, externproto] of updatedExternProtos)
335
349
  this .updateExternProtoDeclaration (executionContext, name, externproto, undoManager);
@@ -398,9 +412,8 @@ module .exports = class Editor
398
412
 
399
413
  fs .writeFileSync (filePath, this .getContents (scene, path .extname (filePath)));
400
414
 
401
- Traverse .traverse (scene, Traverse .ROOT_NODES | Traverse .PROTOTYPE_INSTANCES, node => node .dispose ());
402
-
403
- scene .dispose ();
415
+ for (const object of scene .traverse (Traverse .ROOT_NODES | Traverse .PROTOTYPE_INSTANCES))
416
+ object .dispose ();
404
417
 
405
418
  browser .setBrowserOption ("LoadUrlObjects", loadUrlObjects);
406
419
  }
@@ -486,14 +499,18 @@ ${scene .toXMLString ({ html: true, indent: " " .repeat (6) }) .trimEnd () }
486
499
  {
487
500
  undoManager .beginUndo (_("Rewrite URLs"))
488
501
 
489
- Traverse .traverse (objects, Traverse .EXTERNPROTO_DECLARATIONS | Traverse .PROTO_DECLARATIONS | Traverse .PROTO_DECLARATION_BODY | Traverse .ROOT_NODES, (node) =>
502
+ for (const object of Traverse .traverse (objects, Traverse .EXTERNPROTO_DECLARATIONS | Traverse .PROTO_DECLARATIONS | Traverse .PROTO_DECLARATION_BODY | Traverse .ROOT_NODES))
490
503
  {
504
+ if (!(object instanceof X3D .SFNode))
505
+ continue;
506
+
491
507
  const
508
+ node = object .getValue (),
492
509
  urlObject = node .getType () .includes (X3D .X3DConstants .X3DUrlObject),
493
510
  fontStyleNode = node .getType () .includes (X3D .X3DConstants .X3DFontStyleNode);
494
511
 
495
512
  if (!(urlObject || fontStyleNode))
496
- return;
513
+ continue;
497
514
 
498
515
  const newURL = new X3D .MFString ();
499
516
 
@@ -557,7 +574,7 @@ ${scene .toXMLString ({ html: true, indent: " " .repeat (6) }) .trimEnd () }
557
574
  const uniqueURL = new X3D .MFString (... new Set (newURL));
558
575
 
559
576
  this .setFieldValue (executionContext, node, node ._url, uniqueURL, undoManager);
560
- });
577
+ }
561
578
 
562
579
  undoManager .endUndo ();
563
580
  }
@@ -616,13 +633,17 @@ ${scene .toXMLString ({ html: true, indent: " " .repeat (6) }) .trimEnd () }
616
633
  {
617
634
  // Add nodes and child nodes.
618
635
 
619
- const children = new Set ()
636
+ const children = new Set ();
620
637
 
621
- Traverse .traverse (nodesToRemove, Traverse .ROOT_NODES | Traverse .PROTO_DECLARATIONS | Traverse .PROTO_DECLARATION_BODY, node => { children .add (node .valueOf ()) });
638
+ Array .from (Traverse .traverse (nodesToRemove, Traverse .ROOT_NODES | Traverse .PROTO_DECLARATIONS | Traverse .PROTO_DECLARATION_BODY))
639
+ .filter (object => object instanceof X3D .SFNode)
640
+ .forEach (node => children .add (node .getValue () .valueOf ()));
622
641
 
623
642
  // Remove nodes still in scene graph.
624
643
 
625
- Traverse .traverse (executionContext, Traverse .ROOT_NODES | Traverse .PROTO_DECLARATIONS | Traverse .PROTO_DECLARATION_BODY, node => { children .delete (node .valueOf ()) });
644
+ Array .from (Traverse .traverse (executionContext, Traverse .ROOT_NODES | Traverse .PROTO_DECLARATIONS | Traverse .PROTO_DECLARATION_BODY))
645
+ .filter (object => object instanceof X3D .SFNode)
646
+ .forEach (node => children .delete (node .getValue () .valueOf ()));
626
647
 
627
648
  if (children .size === 0)
628
649
  continue;
@@ -755,16 +776,18 @@ ${scene .toXMLString ({ html: true, indent: " " .repeat (6) }) .trimEnd () }
755
776
  {
756
777
  const components = new Set ();
757
778
 
758
- Traverse .traverse (scene, Traverse .PROTO_DECLARATIONS | Traverse .PROTO_DECLARATION_BODY | Traverse .ROOT_NODES | Traverse .PROTOTYPE_INSTANCES, (node) =>
779
+ for (const object of scene .traverse (Traverse .PROTO_DECLARATIONS | Traverse .PROTO_DECLARATION_BODY | Traverse .ROOT_NODES | Traverse .PROTOTYPE_INSTANCES))
759
780
  {
760
- if (!node .getType () .includes (X3D .X3DConstants .X3DNode))
761
- return;
781
+ if (!(object instanceof X3D .SFNode))
782
+ continue;
783
+
784
+ const node = object .getValue ();
762
785
 
763
786
  if (node .getScene () !== scene)
764
- return;
787
+ continue;
765
788
 
766
789
  components .add (node .getComponentInfo () .name);
767
- });
790
+ }
768
791
 
769
792
  return components;
770
793
  }
@@ -1361,11 +1384,21 @@ ${scene .toXMLString ({ html: true, indent: " " .repeat (6) }) .trimEnd () }
1361
1384
  */
1362
1385
  static protoIsUsedInProto (proto, parent)
1363
1386
  {
1364
- return ! Traverse .traverse (parent, Traverse .PROTO_DECLARATIONS | Traverse .PROTO_DECLARATION_BODY | Traverse .ROOT_NODES, (node) =>
1387
+ for (const object of parent .traverse (Traverse .PROTO_DECLARATIONS | Traverse .PROTO_DECLARATION_BODY | Traverse .ROOT_NODE))
1365
1388
  {
1366
- if (node .getType () .includes (X3D .X3DConstants .X3DPrototypeInstance))
1367
- return node .getProtoNode () !== proto
1368
- });
1389
+ if (!(object instanceof X3D .SFNode))
1390
+ continue;
1391
+
1392
+ const node = object .getValue ();
1393
+
1394
+ if (!node .getType () .includes (X3D .X3DConstants .X3DPrototypeInstance))
1395
+ continue;
1396
+
1397
+ if (node .getProtoNode () === proto)
1398
+ return true;
1399
+ }
1400
+
1401
+ return false;
1369
1402
  }
1370
1403
 
1371
1404
  /**
@@ -1529,11 +1562,21 @@ ${scene .toXMLString ({ html: true, indent: " " .repeat (6) }) .trimEnd () }
1529
1562
  */
1530
1563
  static isProtoNodeUsed (executionContext, protoNode)
1531
1564
  {
1532
- return ! Traverse .traverse (executionContext, Traverse .ROOT_NODES | Traverse .PROTO_DECLARATIONS | Traverse .PROTO_DECLARATION_BODY, (node) =>
1533
- {
1534
- if (node .getType () .includes (X3D .X3DConstants .X3DPrototypeInstance))
1535
- return node .getProtoNode () !== protoNode
1536
- });
1565
+ for (const object of executionContext .traverse (Traverse .ROOT_NODES | Traverse .PROTO_DECLARATIONS | Traverse .PROTO_DECLARATION_BODY))
1566
+ {
1567
+ if (!(object instanceof X3D .SFNode))
1568
+ continue;
1569
+
1570
+ const node = object .getValue ();
1571
+
1572
+ if (!node .getType () .includes (X3D .X3DConstants .X3DPrototypeInstance))
1573
+ continue;
1574
+
1575
+ if (node .getProtoNode () === protoNode)
1576
+ return true;
1577
+ }
1578
+
1579
+ return false;
1537
1580
  }
1538
1581
 
1539
1582
  /**
@@ -1707,14 +1750,19 @@ ${scene .toXMLString ({ html: true, indent: " " .repeat (6) }) .trimEnd () }
1707
1750
  {
1708
1751
  undoManager .beginUndo (_("Replace Proto Node %s"), protoNode .getName ());
1709
1752
 
1710
- Traverse .traverse (executionContext, Traverse .ROOT_NODES | Traverse .PROTO_DECLARATIONS | Traverse .PROTO_DECLARATION_BODY, (node) =>
1753
+ for (const object of executionContext .traverse (Traverse .ROOT_NODES | Traverse .PROTO_DECLARATIONS | Traverse .PROTO_DECLARATION_BODY))
1711
1754
  {
1755
+ if (!(object instanceof X3D .SFNode))
1756
+ continue;
1757
+
1758
+ const node = object .getValue ();
1759
+
1712
1760
  if (node .getType () .includes (X3D .X3DConstants .X3DPrototypeInstance))
1713
1761
  {
1714
1762
  if (node .getProtoNode () === protoNode)
1715
1763
  this .setProtoNode (node .getExecutionContext (), node, by, undoManager);
1716
1764
  }
1717
- });
1765
+ }
1718
1766
 
1719
1767
  this .requestUpdateInstances (executionContext, undoManager);
1720
1768
 
@@ -1953,8 +2001,10 @@ ${scene .toXMLString ({ html: true, indent: " " .repeat (6) }) .trimEnd () }
1953
2001
 
1954
2002
  undoManager .beginUndo (_("Remove Node"));
1955
2003
 
1956
- Traverse .traverse (executionContext, Traverse .PROTO_DECLARATIONS | Traverse .PROTO_DECLARATION_BODY | Traverse .ROOT_NODES, (node) =>
2004
+ for (const object of executionContext .traverse (Traverse .PROTO_DECLARATIONS | Traverse .PROTO_DECLARATION_BODY | Traverse .ROOT_NODES))
1957
2005
  {
2006
+ const node = object instanceof X3D .SFNode ? object .getValue () : object;
2007
+
1958
2008
  if (node instanceof X3D .X3DExecutionContext)
1959
2009
  {
1960
2010
  for (let i = node .rootNodes .length - 1; i >= 0; -- i)
@@ -1989,7 +2039,7 @@ ${scene .toXMLString ({ html: true, indent: " " .repeat (6) }) .trimEnd () }
1989
2039
  }
1990
2040
  }
1991
2041
  }
1992
- });
2042
+ }
1993
2043
 
1994
2044
  undoManager .endUndo ();
1995
2045
  }
@@ -2051,8 +2101,13 @@ ${scene .toXMLString ({ html: true, indent: " " .repeat (6) }) .trimEnd () }
2051
2101
  proto = node,
2052
2102
  updatedField = field;
2053
2103
 
2054
- Traverse .traverse (proto, Traverse .PROTO_DECLARATION | Traverse .PROTO_DECLARATION_BODY | Traverse .ROOT_NODES, (node) =>
2104
+ for (const object of proto .traverse (Traverse .PROTO_DECLARATIONS | Traverse .PROTO_DECLARATION_BODY | Traverse .ROOT_NODES))
2055
2105
  {
2106
+ if (!(object instanceof X3D .SFNode))
2107
+ continue;
2108
+
2109
+ const node = object .getValue ();
2110
+
2056
2111
  for (const field of node .getFields ())
2057
2112
  {
2058
2113
  // Remove references.
@@ -2063,33 +2118,41 @@ ${scene .toXMLString ({ html: true, indent: " " .repeat (6) }) .trimEnd () }
2063
2118
  this .removeReference (proto, updatedField, node, field, undoManager);
2064
2119
  }
2065
2120
  }
2066
- });
2121
+ }
2067
2122
 
2068
2123
  // Remove routes.
2069
2124
 
2070
- Traverse .traverse (executionContext, Traverse .PROTO_DECLARATION | Traverse .PROTO_DECLARATION_BODY | Traverse .ROOT_NODES, (node) =>
2125
+ for (const object of executionContext .traverse (Traverse .PROTO_DECLARATIONS | Traverse .PROTO_DECLARATION_BODY | Traverse .ROOT_NODES))
2071
2126
  {
2072
- if (node .getType () .includes (X3D .X3DConstants .X3DPrototypeInstance) && node .getProtoNode () === proto)
2073
- {
2074
- const field = node .getField (oldName);
2127
+ if (!(object instanceof X3D .SFNode))
2128
+ continue;
2129
+
2130
+ const node = object .getValue ();
2131
+
2132
+ if (!node .getType () .includes (X3D .X3DConstants .X3DPrototypeInstance))
2133
+ continue;
2134
+
2135
+ if (node .getProtoNode () !== proto)
2136
+ continue;
2137
+
2138
+ const field = node .getField (oldName);
2075
2139
 
2076
- if (! updatedField .isInput ())
2140
+ if (!updatedField .isInput ())
2141
+ {
2142
+ for (const route of field .getInputRoutes ())
2077
2143
  {
2078
- for (const route of field .getInputRoutes ())
2079
- {
2080
- this .deleteRoute (route .getExecutionContext (), route .sourceNode, route .sourceField, route .destinationNode, route .destinationField, undoManager);
2081
- }
2144
+ this .deleteRoute (route .getExecutionContext (), route .sourceNode, route .sourceField, route .destinationNode, route .destinationField, undoManager);
2082
2145
  }
2146
+ }
2083
2147
 
2084
- if (! updatedField .isOutput ())
2148
+ if (!updatedField .isOutput ())
2149
+ {
2150
+ for (const route of field .getOutputRoutes ())
2085
2151
  {
2086
- for (const route of field .getOutputRoutes ())
2087
- {
2088
- this .deleteRoute (route .getExecutionContext (), route .sourceNode, route .sourceField, route .destinationNode, route .destinationField, undoManager);
2089
- }
2152
+ this .deleteRoute (route .getExecutionContext (), route .sourceNode, route .sourceField, route .destinationNode, route .destinationField, undoManager);
2090
2153
  }
2091
2154
  }
2092
- });
2155
+ }
2093
2156
 
2094
2157
  this .updateInstances (proto, undoManager);
2095
2158
  }
@@ -2176,8 +2239,13 @@ ${scene .toXMLString ({ html: true, indent: " " .repeat (6) }) .trimEnd () }
2176
2239
 
2177
2240
  // Remove references.
2178
2241
 
2179
- Traverse .traverse (proto, Traverse .PROTO_DECLARATION | Traverse .PROTO_DECLARATION_BODY | Traverse .ROOT_NODES, (node) =>
2242
+ for (const object of proto .traverse (Traverse .PROTO_DECLARATIONS | Traverse .PROTO_DECLARATION_BODY | Traverse .ROOT_NODES))
2180
2243
  {
2244
+ if (!(object instanceof X3D .SFNode))
2245
+ continue;
2246
+
2247
+ const node = object .getValue ();
2248
+
2181
2249
  for (const field of node .getFields ())
2182
2250
  {
2183
2251
  for (const removedField of removedFields)
@@ -2192,42 +2260,50 @@ ${scene .toXMLString ({ html: true, indent: " " .repeat (6) }) .trimEnd () }
2192
2260
  this .removeReference (proto, reference, node, field, undoManager);
2193
2261
  }
2194
2262
  }
2195
- });
2263
+ }
2196
2264
 
2197
2265
  // Remove routes, and undo set value.
2198
2266
 
2199
- Traverse .traverse (executionContext, Traverse .PROTO_DECLARATION | Traverse .PROTO_DECLARATION_BODY | Traverse .ROOT_NODES, (node) =>
2267
+ for (const object of executionContext .traverse (Traverse .PROTO_DECLARATIONS | Traverse .PROTO_DECLARATION_BODY | Traverse .ROOT_NODES))
2200
2268
  {
2201
- if (node .getType () .includes (X3D .X3DConstants .X3DPrototypeInstance) && node .getProtoNode () === proto)
2269
+ if (!(object instanceof X3D .SFNode))
2270
+ continue;
2271
+
2272
+ const node = object .getValue ();
2273
+
2274
+ if (!node .getType () .includes (X3D .X3DConstants .X3DPrototypeInstance))
2275
+ continue;
2276
+
2277
+ if (node .getProtoNode () !== proto)
2278
+ continue;
2279
+
2280
+ for (const removedField of removedFields)
2202
2281
  {
2203
- for (const removedField of removedFields)
2282
+ const field = node .getField (removedField .getName ());
2283
+
2284
+ if (field .isInitializable ())
2204
2285
  {
2205
- const field = node .getField (removedField .getName ());
2286
+ const
2287
+ name = field .getName (),
2288
+ oldValue = field .copy ();
2206
2289
 
2207
- if (field .isInitializable ())
2290
+ undoManager .registerUndo (() =>
2208
2291
  {
2209
- const
2210
- name = field .getName (),
2211
- oldValue = field .copy ();
2212
-
2213
- undoManager .registerUndo (() =>
2214
- {
2215
- this .setFieldValue (node .getExecutionContext (), node, name, oldValue, undoManager);
2216
- });
2217
- }
2292
+ this .setFieldValue (node .getExecutionContext (), node, name, oldValue, undoManager);
2293
+ });
2294
+ }
2218
2295
 
2219
- for (const route of field .getInputRoutes ())
2220
- {
2221
- this .deleteRoute (route .getExecutionContext (), route .sourceNode, route .sourceField, route .destinationNode, route .destinationField, undoManager);
2222
- }
2296
+ for (const route of field .getInputRoutes ())
2297
+ {
2298
+ this .deleteRoute (route .getExecutionContext (), route .sourceNode, route .sourceField, route .destinationNode, route .destinationField, undoManager);
2299
+ }
2223
2300
 
2224
- for (const route of field .getOutputRoutes ())
2225
- {
2226
- this .deleteRoute (route .getExecutionContext (), route .sourceNode, route .sourceField, route .destinationNode, route .destinationField, undoManager);
2227
- }
2301
+ for (const route of field .getOutputRoutes ())
2302
+ {
2303
+ this .deleteRoute (route .getExecutionContext (), route .sourceNode, route .sourceField, route .destinationNode, route .destinationField, undoManager);
2228
2304
  }
2229
2305
  }
2230
- });
2306
+ }
2231
2307
 
2232
2308
  this .updateInstances (proto, undoManager);
2233
2309
  }
@@ -2843,9 +2919,11 @@ ${scene .toXMLString ({ html: true, indent: " " .repeat (6) }) .trimEnd () }
2843
2919
 
2844
2920
  undoManager .beginUndo (_("Replace All Occurrences of %s by %s"), original .getTypeName (), replacement .getTypeName ());
2845
2921
 
2846
- Traverse .traverse (executionContext, Traverse .PROTO_DECLARATIONS | Traverse .PROTO_DECLARATION_BODY | Traverse .ROOT_NODES, node =>
2922
+ for (const object of executionContext .traverse (Traverse .PROTO_DECLARATIONS | Traverse .PROTO_DECLARATION_BODY | Traverse .ROOT_NODES))
2847
2923
  {
2848
- const fields = node instanceof X3D .X3DExecutionContext ? [node .getRootNodes ()] : node .getFields ()
2924
+ const
2925
+ node = object instanceof X3D .SFNode ? object .getValue () : object,
2926
+ fields = node instanceof X3D .X3DExecutionContext ? [node .getRootNodes ()] : node .getFields ()
2849
2927
 
2850
2928
  for (const field of fields)
2851
2929
  {
@@ -2870,7 +2948,7 @@ ${scene .toXMLString ({ html: true, indent: " " .repeat (6) }) .trimEnd () }
2870
2948
  }
2871
2949
  }
2872
2950
  }
2873
- });
2951
+ }
2874
2952
 
2875
2953
  undoManager .endUndo ();
2876
2954
  }
@@ -24,7 +24,7 @@
24
24
  <string>Owner</string>
25
25
  <key>LSIsAppleDefaultForType</key>
26
26
  <true/>
27
- <key>LSItemContentTypes</key>
27
+ <key>UTTypeConformsTo</key>
28
28
  <array>
29
29
  <string>io.github.create3000.x3d</string>
30
30
  <string>io.castleengine.view3dscene.x3d</string>
@@ -54,7 +54,7 @@
54
54
  <string>Owner</string>
55
55
  <key>LSIsAppleDefaultForType</key>
56
56
  <true/>
57
- <key>LSItemContentTypes</key>
57
+ <key>UTTypeConformsTo</key>
58
58
  <array>
59
59
  <string>io.github.create3000.x3d</string>
60
60
  <string>io.castleengine.view3dscene.x3d</string>
@@ -81,7 +81,7 @@
81
81
  <string>Owner</string>
82
82
  <key>LSIsAppleDefaultForType</key>
83
83
  <true/>
84
- <key>LSItemContentTypes</key>
84
+ <key>UTTypeConformsTo</key>
85
85
  <array>
86
86
  <string>io.github.create3000.x3dv</string>
87
87
  <string>io.castleengine.view3dscene.x3dv</string>
@@ -111,7 +111,7 @@
111
111
  <string>Owner</string>
112
112
  <key>LSIsAppleDefaultForType</key>
113
113
  <true/>
114
- <key>LSItemContentTypes</key>
114
+ <key>UTTypeConformsTo</key>
115
115
  <array>
116
116
  <string>io.github.create3000.x3dv</string>
117
117
  <string>io.castleengine.view3dscene.x3dv</string>
@@ -138,7 +138,7 @@
138
138
  <string>Owner</string>
139
139
  <key>LSIsAppleDefaultForType</key>
140
140
  <true/>
141
- <key>LSItemContentTypes</key>
141
+ <key>UTTypeConformsTo</key>
142
142
  <array>
143
143
  <string>io.github.create3000.x3dj</string>
144
144
  <string>io.castleengine.view3dscene.x3dj</string>
@@ -168,7 +168,7 @@
168
168
  <string>Owner</string>
169
169
  <key>LSIsAppleDefaultForType</key>
170
170
  <true/>
171
- <key>LSItemContentTypes</key>
171
+ <key>UTTypeConformsTo</key>
172
172
  <array>
173
173
  <string>io.github.create3000.x3dj</string>
174
174
  <string>io.castleengine.view3dscene.x3dj</string>
@@ -198,7 +198,7 @@
198
198
  <string>Owner</string>
199
199
  <key>LSIsAppleDefaultForType</key>
200
200
  <true/>
201
- <key>LSItemContentTypes</key>
201
+ <key>UTTypeConformsTo</key>
202
202
  <array>
203
203
  <string>io.github.create3000.vrml</string>
204
204
  <string>io.castleengine.view3dscene.vrml</string>
@@ -229,7 +229,7 @@
229
229
  <string>Owner</string>
230
230
  <key>LSIsAppleDefaultForType</key>
231
231
  <true/>
232
- <key>LSItemContentTypes</key>
232
+ <key>UTTypeConformsTo</key>
233
233
  <array>
234
234
  <string>io.github.create3000.vrml</string>
235
235
  <string>io.castleengine.view3dscene.vrml</string>
@@ -1057,7 +1057,7 @@ body.dark .ui-widget .library-list .component {
1057
1057
  display: none;
1058
1058
  }
1059
1059
 
1060
- .scene-graph .description {
1060
+ .scene-graph .description .jstree-anchor {
1061
1061
  padding: 2px 0;
1062
1062
  font-size: smaller;
1063
1063
  }
@@ -1078,11 +1078,12 @@ body.dark .ui-widget .library-list .component {
1078
1078
  color: var(--system-red);
1079
1079
  }
1080
1080
 
1081
+ /* make drag & drop work */
1081
1082
  .scene-graph .last {
1082
- height: 1px;
1083
+ height: 2px;
1083
1084
  }
1084
1085
 
1085
- .scene-graph .last * {
1086
+ .scene-graph .last .item *:not(.route-curves-wrapper, .route-curves) {
1086
1087
  visibility: hidden;
1087
1088
  }
1088
1089
 
@@ -1057,7 +1057,7 @@ body.dark .ui-widget .library-list .component {
1057
1057
  display: none;
1058
1058
  }
1059
1059
 
1060
- .scene-graph .description {
1060
+ .scene-graph .description .jstree-anchor {
1061
1061
  padding: 2px 0;
1062
1062
  font-size: smaller;
1063
1063
  }
@@ -1079,10 +1079,11 @@ body.dark .ui-widget .library-list .component {
1079
1079
  }
1080
1080
 
1081
1081
  .scene-graph .last {
1082
- height: 1px;
1082
+ /* make drag & drop work */
1083
+ height: 2px;
1083
1084
  }
1084
1085
 
1085
- .scene-graph .last * {
1086
+ .scene-graph .last .item *:not(.route-curves-wrapper, .route-curves) {
1086
1087
  visibility: hidden;
1087
1088
  }
1088
1089
 
@@ -1,368 +0,0 @@
1
- "use strict";
2
-
3
- const X3D = require ("../X3D");
4
-
5
- let flags = 1;
6
-
7
- module .exports = class Traverse
8
- {
9
- static NONE = 0;
10
- static EXTERNPROTO_DECLARATIONS = flags;
11
- static PROTO_DECLARATIONS = flags <<= 1;
12
- static ROOT_NODES = flags <<= 1;
13
- static IMPORTED_NODES = flags <<= 1;
14
- static EXTERNPROTO_DECLARATION_SCENE = flags <<= 1;
15
- static PROTO_DECLARATION_BODY = flags <<= 1;
16
- static PROTOTYPE_INSTANCES = flags <<= 1;
17
- static INLINE_SCENE = flags <<= 1;
18
- static ALL = (flags << 1) - 1;
19
-
20
- /**
21
- *
22
- * @param {X3DScene|X3DExecutionContext|MFNode|Array<SFNode>|SFNode} object
23
- * @param {number} flags
24
- * @param {Function} callback
25
- * @returns boolean
26
- */
27
- static traverse (object, flags, callback)
28
- {
29
- const seen = new Set ()
30
-
31
- if (object instanceof X3D .X3DExecutionContext)
32
- return this .traverseScene (object, flags, callback, seen);
33
-
34
- if (object instanceof X3D .MFNode || Array .isArray (object))
35
- return this .traverseNodes (object, flags, callback, seen);
36
-
37
- if (object instanceof X3D .SFNode)
38
- return this .traverseNode (object .getValue (), flags, callback, seen);
39
-
40
- if (object instanceof X3D .X3DBaseNode)
41
- return this .traverseNode (object, flags, callback, seen);
42
-
43
- return false;
44
- }
45
-
46
- static traverseScene (executionContext, flags, callback, seen)
47
- {
48
- if (!executionContext)
49
- return true;
50
-
51
- if (flags & Traverse .PROTO_DECLARATIONS)
52
- {
53
- for (const proto of executionContext .protos)
54
- {
55
- if (this .traverseNode (proto, flags, callback, seen) === false)
56
- return false;
57
- }
58
- }
59
-
60
- if (flags & Traverse .ROOT_NODES)
61
- {
62
- if (this .traverseNodes (executionContext .rootNodes, flags, callback, seen) === false)
63
- return false;
64
- }
65
-
66
- return callback (executionContext) !== false;
67
- }
68
-
69
- static traverseNodes (nodes, flags, callback, seen)
70
- {
71
- for (const node of nodes)
72
- {
73
- if (this .traverseNode (node instanceof X3D .SFNode ? node .getValue () : node, flags, callback, seen) === false)
74
- return false;
75
- }
76
-
77
- return true;
78
- }
79
-
80
- static traverseNode (node, flags, callback, seen)
81
- {
82
- if (!node)
83
- return true;
84
-
85
- if (seen .has (node))
86
- return true;
87
-
88
- seen .add (node);
89
-
90
- if (this .traverseFields (node .getUserDefinedFields (), flags, callback, seen) === false)
91
- return false;
92
-
93
- if (this .traverseFields (node .getPredefinedFields (), flags, callback, seen) === false)
94
- return false;
95
-
96
- const type = node .getType ();
97
-
98
- for (let t = type .length - 1; t >= 0; -- t)
99
- {
100
- switch (type [t])
101
- {
102
- case X3D .X3DConstants .X3DExternProtoDeclaration:
103
- {
104
- if (flags & this .EXTERNPROTO_DECLARATION_SCENE)
105
- {
106
- if (this .traverseScene (node .getInternalScene (), flags, callback, seen) === false)
107
- return false;
108
- }
109
-
110
- break;
111
- }
112
- case X3D .X3DConstants .X3DProtoDeclaration:
113
- {
114
- if (flags & Traverse .PROTO_DECLARATION_BODY)
115
- {
116
- if (this .traverseScene (node .getBody (), flags, callback, seen) === false)
117
- return false;
118
- }
119
-
120
- break;
121
- }
122
- case X3D .X3DConstants .X3DPrototypeInstance:
123
- {
124
- if (flags & Traverse .PROTOTYPE_INSTANCES)
125
- {
126
- if (this .traverseScene (node .getBody (), flags, callback, seen) === false)
127
- return false;
128
- }
129
-
130
- break;
131
- }
132
- case X3D .X3DConstants .Inline:
133
- {
134
- if (flags & this .INLINE_SCENE)
135
- {
136
- if (this .traverseScene (node .getInternalScene (), flags, callback, seen) === false)
137
- return false;
138
- }
139
-
140
- break;
141
- }
142
- default:
143
- {
144
- continue;
145
- }
146
- }
147
-
148
- break;
149
- }
150
-
151
- return callback (node) !== false;
152
- }
153
-
154
- static traverseFields (fields, flags, callback, seen)
155
- {
156
- for (const field of fields)
157
- {
158
- switch (field .getType ())
159
- {
160
- case X3D .X3DConstants .SFNode:
161
- {
162
- if (this .traverseNode (field .getValue (), flags, callback, seen) === false)
163
- return false;
164
-
165
- break;
166
- }
167
- case X3D .X3DConstants .MFNode:
168
- {
169
- if (this .traverseNodes (field, flags, callback, seen) === false)
170
- return false;
171
-
172
- break;
173
- }
174
- }
175
- }
176
-
177
- return true;
178
- }
179
-
180
- static find (scene, object, flags)
181
- {
182
- const
183
- hierarchies = [ ],
184
- hierarchy = [ ],
185
- seen = new Set ();
186
-
187
- this .findInScene (scene, object, flags, hierarchies, hierarchy, seen);
188
-
189
- return hierarchies;
190
- }
191
-
192
- static findInScene (executionContext, object, flags, hierarchies, hierarchy, seen)
193
- {
194
- if (!executionContext)
195
- return;
196
-
197
- hierarchy .push (executionContext);
198
-
199
- if (executionContext === object)
200
- {
201
- hierarchies .push (hierarchy .slice ());
202
- }
203
- else
204
- {
205
- if (flags & this .EXTERNPROTO_DECLARATIONS)
206
- {
207
- const externprotos = executionContext .getExternProtoDeclarations ();
208
-
209
- for (const externproto of externprotos)
210
- {
211
- this .findInNode (externproto, object, flags, hierarchies, hierarchy, seen);
212
- }
213
- }
214
-
215
- if (flags & this .PROTO_DECLARATIONS)
216
- {
217
- const prototypes = executionContext .getProtoDeclarations ();
218
-
219
- for (const prototype of prototypes)
220
- {
221
- this .findInNode (prototype, object, flags, hierarchies, hierarchy, seen);
222
- }
223
- }
224
-
225
- if (flags & this .ROOT_NODES)
226
- {
227
- const rootNodes = executionContext .getRootNodes ();
228
-
229
- for (const rootNode of rootNodes)
230
- {
231
- this .findInNode (rootNode .getValue (), object, flags, hierarchies, hierarchy, seen);
232
- }
233
- }
234
-
235
- if (flags & this .IMPORTED_NODES)
236
- {
237
- for (const importedNode of executionContext .getImportedNodes ())
238
- {
239
- hierarchy .push (importedNode);
240
-
241
- if (importedNode === object)
242
- {
243
- hierarchies .push (hierarchy .slice ());
244
- }
245
- else
246
- {
247
- try
248
- {
249
- const exportedNode = importedNode .getExportedNode ();
250
-
251
- this .findInNode (exportedNode, object, flags, hierarchies, hierarchy, seen);
252
- }
253
- catch (error)
254
- {
255
- //console .log (error .message)
256
- }
257
- }
258
-
259
- hierarchy .pop ();
260
- }
261
- }
262
- }
263
-
264
- hierarchy .pop ();
265
- }
266
-
267
- static findInNode (node, object, flags, hierarchies, hierarchy, seen)
268
- {
269
- if (!node)
270
- return;
271
-
272
- if (seen .has (node))
273
- return;
274
-
275
- seen .add (node);
276
- hierarchy .push (node);
277
-
278
- if (node .valueOf () === object .valueOf ())
279
- {
280
- hierarchies .push (hierarchy .slice ());
281
- }
282
- else
283
- {
284
- if (!node .getType () .includes (X3D .X3DConstants .X3DExternProtoDeclaration))
285
- {
286
- this .findInFields (node .getUserDefinedFields (), object, flags, hierarchies, hierarchy, seen);
287
- this .findInFields (node .getPredefinedFields (), object, flags, hierarchies, hierarchy, seen);
288
- }
289
-
290
- const type = node .getType ();
291
-
292
- for (let t = type .length - 1; t >= 0; -- t)
293
- {
294
- switch (type [t])
295
- {
296
- case X3D .X3DConstants .X3DExternProtoDeclaration:
297
- {
298
- if (flags & this .EXTERNPROTO_DECLARATION_SCENE)
299
- this .findInScene (node .getInternalScene (), object, flags, hierarchies, hierarchy, seen);
300
-
301
- break;
302
- }
303
- case X3D .X3DConstants .X3DProtoDeclaration:
304
- {
305
- if (flags & this .PROTO_DECLARATION_BODY)
306
- this .findInScene (node .getBody (), object, flags, hierarchies, hierarchy, seen);
307
-
308
- break;
309
- }
310
- case X3D .X3DConstants .X3DPrototypeInstance:
311
- {
312
- if (flags & this .PROTOTYPE_INSTANCES)
313
- this .findInScene (node .getBody (), object, flags, hierarchies, hierarchy, seen);
314
-
315
- break;
316
- }
317
- case X3D .X3DConstants .Inline:
318
- {
319
- if (flags & this .INLINE_SCENE)
320
- this .findInScene (node .getInternalScene (), object, flags, hierarchies, hierarchy, seen);
321
-
322
- break
323
- }
324
- default:
325
- break;
326
- }
327
- }
328
- }
329
-
330
- hierarchy .pop ();
331
- seen .delete (node);
332
- }
333
-
334
- static findInFields (fields, object, flags, hierarchies, hierarchy, seen)
335
- {
336
- for (const field of fields)
337
- {
338
- hierarchy .push (field);
339
-
340
- if (field === object)
341
- {
342
- hierarchies .push (hierarchy .slice ());
343
- }
344
- else
345
- {
346
- switch (field .getType ())
347
- {
348
- case X3D .X3DConstants .SFNode:
349
- {
350
- this .findInNode (field .getValue (), object, flags, hierarchies, hierarchy, seen);
351
- break;
352
- }
353
- case X3D .X3DConstants .MFNode:
354
- {
355
- for (const node of field)
356
- this .findInNode (node ?.getValue (), object, flags, hierarchies, hierarchy, seen);
357
-
358
- break;
359
- }
360
- default:
361
- break;
362
- }
363
- }
364
-
365
- hierarchy .pop ();
366
- }
367
- }
368
- };