x_ite 8.3.2 → 8.4.0

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.
Files changed (117) hide show
  1. package/.github/workflows/pages-deploy.yml +1 -1
  2. package/.vscode/settings.json +2 -1
  3. package/dist/LICENSE.md +4 -4
  4. package/dist/assets/components/Annotation.js +13 -13
  5. package/dist/assets/components/Annotation.min.js +1 -1
  6. package/dist/assets/components/CADGeometry.js +13 -13
  7. package/dist/assets/components/CADGeometry.min.js +1 -1
  8. package/dist/assets/components/CubeMapTexturing.js +25 -25
  9. package/dist/assets/components/CubeMapTexturing.min.js +1 -1
  10. package/dist/assets/components/DIS.js +13 -13
  11. package/dist/assets/components/DIS.min.js +1 -1
  12. package/dist/assets/components/EventUtilities.js +9 -9
  13. package/dist/assets/components/EventUtilities.min.js +1 -1
  14. package/dist/assets/components/Geometry2D.js +19 -19
  15. package/dist/assets/components/Geometry2D.min.js +1 -1
  16. package/dist/assets/components/Geospatial.js +33 -33
  17. package/dist/assets/components/Geospatial.min.js +1 -1
  18. package/dist/assets/components/HAnim.js +64 -75
  19. package/dist/assets/components/HAnim.min.js +1 -1
  20. package/dist/assets/components/KeyDeviceSensor.js +8 -8
  21. package/dist/assets/components/KeyDeviceSensor.min.js +1 -1
  22. package/dist/assets/components/Layout.js +27 -27
  23. package/dist/assets/components/Layout.min.js +1 -1
  24. package/dist/assets/components/NURBS.js +24 -24
  25. package/dist/assets/components/NURBS.min.js +1 -1
  26. package/dist/assets/components/ParticleSystems.js +23 -23
  27. package/dist/assets/components/ParticleSystems.min.js +1 -1
  28. package/dist/assets/components/Picking.js +19 -19
  29. package/dist/assets/components/Picking.min.js +1 -1
  30. package/dist/assets/components/RigidBodyPhysics.js +17 -17
  31. package/dist/assets/components/RigidBodyPhysics.min.js +1 -1
  32. package/dist/assets/components/Scripting.js +28 -28
  33. package/dist/assets/components/Scripting.min.js +1 -1
  34. package/dist/assets/components/Text.js +24 -24
  35. package/dist/assets/components/Text.min.js +1 -1
  36. package/dist/assets/components/{ProjectiveTextureMapping.js → TextureProjector.js} +39 -39
  37. package/dist/assets/components/TextureProjector.min.js +1 -0
  38. package/dist/assets/components/Texturing3D.js +27 -27
  39. package/dist/assets/components/Texturing3D.min.js +1 -1
  40. package/dist/assets/components/VolumeRendering.js +19 -19
  41. package/dist/assets/components/VolumeRendering.min.js +1 -1
  42. package/dist/assets/components/X_ITE.js +9 -9
  43. package/dist/assets/components/X_ITE.min.js +1 -1
  44. package/dist/x_ite.css +1 -1
  45. package/dist/x_ite.js +3986 -1366
  46. package/dist/x_ite.min.js +1 -1
  47. package/dist/x_ite.zip +0 -0
  48. package/docs/Gemfile +1 -4
  49. package/docs/_config.yml +3 -3
  50. package/docs/_posts/getting-started.md +147 -441
  51. package/docs/_posts/reference/field-services-and-objects.md +24 -4
  52. package/docs/_posts/reference/prototype-services.md +24 -4
  53. package/docs/_posts/reference/scene-services.md +18 -2
  54. package/docs/_posts/what's-new.md +32 -4
  55. package/docs/_tabs/playground.html +36 -40
  56. package/docs/assets/css/style.scss +18 -0
  57. package/package.json +1 -1
  58. package/src/assets/components/{ProjectiveTextureMapping.js → TextureProjector.js} +5 -5
  59. package/src/examples.js +1 -1
  60. package/src/tests.js +5 -5
  61. package/src/x_ite/Base/X3DInfoArray.js +45 -19
  62. package/src/x_ite/Base/X3DObject.js +29 -20
  63. package/src/x_ite/Base/X3DObjectArrayField.js +71 -26
  64. package/src/x_ite/Base/X3DTypedArrayField.js +108 -32
  65. package/src/x_ite/Browser/DOMIntegration.js +4 -3
  66. package/src/x_ite/Browser/VERSION.js +1 -1
  67. package/src/x_ite/Browser/X3DBrowser.js +43 -28
  68. package/src/x_ite/Components/Core/X3DNode.js +682 -210
  69. package/src/x_ite/Components/Core/X3DPrototypeInstance.js +484 -100
  70. package/src/x_ite/Components/Grouping/X3DTransformMatrix3DNode.js +18 -43
  71. package/src/x_ite/Components/HAnim/HAnimHumanoid.js +27 -26
  72. package/src/x_ite/Components/HAnim/HAnimJoint.js +19 -31
  73. package/src/x_ite/Components/Rendering/X3DGeometryNode.js +6 -3
  74. package/src/x_ite/Components/Sound/X3DSoundProcessingNode.js +14 -1
  75. package/src/x_ite/Components/Sound/X3DSoundSourceNode.js +0 -1
  76. package/src/x_ite/Components/{ProjectiveTextureMapping → TextureProjector}/TextureProjector.js +1 -1
  77. package/src/x_ite/Components/{ProjectiveTextureMapping → TextureProjector}/TextureProjectorParallel.js +1 -1
  78. package/src/x_ite/Components/{ProjectiveTextureMapping → TextureProjector}/X3DTextureProjectorNode.js +0 -0
  79. package/src/x_ite/Components/Time/TimeSensor.js +5 -0
  80. package/src/x_ite/Components/Time/X3DTimeDependentNode.js +1 -0
  81. package/src/x_ite/Configuration/ComponentInfo.js +51 -22
  82. package/src/x_ite/Configuration/ProfileInfo.js +10 -6
  83. package/src/x_ite/Configuration/SupportedComponents.js +22 -20
  84. package/src/x_ite/Configuration/SupportedProfiles.js +1 -1
  85. package/src/x_ite/Configuration/UnitInfo.js +69 -26
  86. package/src/x_ite/Execution/X3DExecutionContext.js +78 -55
  87. package/src/x_ite/Execution/X3DExportedNode.js +75 -28
  88. package/src/x_ite/Execution/X3DImportedNode.js +227 -67
  89. package/src/x_ite/Execution/X3DScene.js +437 -117
  90. package/src/x_ite/Fields/ArrayFields.js +105 -55
  91. package/src/x_ite/Fields/SFBool.js +14 -6
  92. package/src/x_ite/Fields/SFColor.js +35 -12
  93. package/src/x_ite/Fields/SFColorRGBA.js +2 -0
  94. package/src/x_ite/Fields/SFDouble.js +17 -10
  95. package/src/x_ite/Fields/SFFloat.js +17 -10
  96. package/src/x_ite/Fields/SFImage.js +93 -8
  97. package/src/x_ite/Fields/SFInt32.js +14 -6
  98. package/src/x_ite/Fields/SFMatrixPrototypeTemplate.js +38 -13
  99. package/src/x_ite/Fields/SFNode.js +59 -21
  100. package/src/x_ite/Fields/SFRotation.js +38 -13
  101. package/src/x_ite/Fields/SFString.js +14 -7
  102. package/src/x_ite/Fields/SFTime.js +14 -6
  103. package/src/x_ite/Fields/SFVecPrototypeTemplate.js +39 -13
  104. package/src/x_ite/InputOutput/FileLoader.js +1 -1
  105. package/src/x_ite/InputOutput/Generator.js +178 -17
  106. package/src/x_ite/Parser/JSONParser.js +1 -1
  107. package/src/x_ite/Parser/VRMLParser.js +24 -27
  108. package/src/x_ite/Parser/X3DParser.js +0 -4
  109. package/src/x_ite/Parser/XMLParser.js +2 -2
  110. package/src/x_ite/Prototype/X3DExternProtoDeclaration.js +182 -64
  111. package/src/x_ite/Prototype/X3DProtoDeclaration.js +314 -93
  112. package/src/x_ite/Rendering/X3DRenderObject.js +6 -1
  113. package/src/x_ite/Routing/X3DRoute.js +104 -40
  114. package/src/x_ite.html +1 -1
  115. package/x_ite.min.html +1 -1
  116. package/dist/assets/components/ProjectiveTextureMapping.min.js +0 -1
  117. package/docs/Gemfile.lock +0 -116
@@ -52,7 +52,6 @@ import FieldDefinitionArray from "../Base/FieldDefinitionArray.js";
52
52
  import X3DExecutionContext from "../Execution/X3DExecutionContext.js";
53
53
  import X3DProtoDeclarationNode from "./X3DProtoDeclarationNode.js";
54
54
  import X3DConstants from "../Base/X3DConstants.js";
55
- import Generator from "../InputOutput/Generator.js";
56
55
 
57
56
  SupportedNodes .addAbstractType ("X3DProtoDeclaration", X3DProtoDeclaration);
58
57
 
@@ -65,8 +64,6 @@ function X3DProtoDeclaration (executionContext)
65
64
 
66
65
  this .addType (X3DConstants .X3DProtoDeclaration)
67
66
 
68
- this .addChildObjects ("loadState", new Fields .SFInt32 (X3DConstants .NOT_STARTED_STATE));
69
-
70
67
  this [_body] = new X3DExecutionContext (executionContext);
71
68
  this [_body] .setOuterNode (this);
72
69
  this [_body] .setLive (false);
@@ -88,8 +85,6 @@ X3DProtoDeclaration .prototype = Object .assign (Object .create (X3DProtoDeclara
88
85
  X3DProtoDeclarationNode .prototype .initialize .call (this);
89
86
 
90
87
  this [_body] .setup ();
91
-
92
- this ._loadState = X3DConstants .COMPLETE_STATE;
93
88
  },
94
89
  getProtoDeclaration: function ()
95
90
  {
@@ -99,108 +94,99 @@ X3DProtoDeclaration .prototype = Object .assign (Object .create (X3DProtoDeclara
99
94
  {
100
95
  return this [_body];
101
96
  },
102
- checkLoadState: function ()
103
- {
104
- return this ._loadState .getValue ();
105
- },
106
97
  canUserDefinedFields: function ()
107
98
  {
108
99
  return true;
109
100
  },
110
- toVRMLStream: function (stream)
101
+ toVRMLStream: function (generator)
111
102
  {
112
- const generator = Generator .Get (stream);
113
-
114
- stream .string += generator .Indent ();
115
- stream .string += "PROTO";
116
- stream .string += " ";
117
- stream .string += this .getName ();
118
- stream .string += " ";
119
- stream .string += "[";
103
+ generator .string += generator .Indent ();
104
+ generator .string += "PROTO";
105
+ generator .string += generator .Space ();
106
+ generator .string += this .getName ();
107
+ generator .string += generator .TidySpace ();
108
+ generator .string += "[";
120
109
 
121
110
  generator .EnterScope ();
122
111
 
123
112
  const userDefinedFields = this .getUserDefinedFields ();
124
113
 
125
- let
126
- fieldTypeLength = 0,
127
- accessTypeLength = 0;
128
-
129
114
  if (userDefinedFields .length === 0)
130
115
  {
131
- stream .string += " ";
116
+ generator .string += generator .TidySpace ();
132
117
  }
133
118
  else
134
119
  {
120
+ let
121
+ fieldTypeLength = 0,
122
+ accessTypeLength = 0;
123
+
135
124
  for (const field of userDefinedFields)
136
125
  {
137
126
  fieldTypeLength = Math .max (fieldTypeLength, field .getTypeName () .length);
138
127
  accessTypeLength = Math .max (accessTypeLength, generator .AccessType (field .getAccessType ()) .length);
139
128
  }
140
129
 
141
- stream .string += "\n";
130
+ generator .string += generator .TidyBreak ();
142
131
 
143
132
  generator .IncIndent ();
144
133
 
145
134
  for (const field of userDefinedFields)
146
135
  {
147
- this .toVRMLStreamUserDefinedField (stream, field, fieldTypeLength, accessTypeLength);
148
- stream .string += "\n";
136
+ this .toVRMLStreamUserDefinedField (generator, field, fieldTypeLength, accessTypeLength);
137
+
138
+ generator .string += generator .Break ();
149
139
  }
150
140
 
151
141
  generator .DecIndent ();
152
142
 
153
- stream .string += generator .Indent ();
143
+ generator .string += generator .Indent ();
154
144
  }
155
145
 
156
146
  generator .LeaveScope ();
157
147
 
158
- stream .string += "]";
159
- stream .string += "\n";
148
+ generator .string += "]";
149
+ generator .string += generator .TidyBreak ();
160
150
 
161
- stream .string += generator .Indent ();
162
- stream .string += "{";
163
- stream .string += "\n";
151
+ generator .string += generator .Indent ();
152
+ generator .string += "{";
153
+ generator .string += generator .TidyBreak ();
164
154
 
165
155
  generator .IncIndent ();
166
156
 
167
- this [_body] .toVRMLStream (stream);
157
+ this [_body] .toVRMLStream (generator);
168
158
 
169
159
  generator .DecIndent ();
170
160
 
171
- stream .string += generator .Indent ();
172
- stream .string += "}";
161
+ generator .string += generator .Indent ();
162
+ generator .string += "}";
173
163
  },
174
- toVRMLStreamUserDefinedField: function (stream, field, fieldTypeLength, accessTypeLength)
164
+ toVRMLStreamUserDefinedField: function (generator, field, fieldTypeLength, accessTypeLength)
175
165
  {
176
- const generator = Generator .Get (stream);
177
-
178
- stream .string += generator .Indent ();
179
- stream .string += generator .PadRight (generator .AccessType (field .getAccessType ()), accessTypeLength);
180
- stream .string += " ";
181
- stream .string += generator .PadRight (field .getTypeName (), fieldTypeLength);
182
- stream .string += " ";
183
- stream .string += field .getName ();
166
+ generator .string += generator .Indent ();
167
+ generator .string += generator .PadRight (generator .AccessType (field .getAccessType ()), accessTypeLength);
168
+ generator .string += generator .Space ();
169
+ generator .string += generator .PadRight (field .getTypeName (), fieldTypeLength);
170
+ generator .string += generator .Space ();
171
+ generator .string += field .getName ();
184
172
 
185
173
  if (field .isInitializable ())
186
174
  {
187
- stream .string += " ";
175
+ generator .string += generator .Space ();
188
176
 
189
- field .toVRMLStream (stream);
177
+ field .toVRMLStream (generator);
190
178
  }
191
179
  },
192
- toXMLStream: function (stream)
180
+ toXMLStream: function (generator)
193
181
  {
194
- const generator = Generator .Get (stream);
195
-
196
- stream .string += generator .Indent ();
197
- stream .string += "<ProtoDeclare";
198
- stream .string += " ";
199
- stream .string += "name='";
200
- stream .string += generator .XMLEncode (this .getName ());
201
- stream .string += "'";
202
- stream .string += ">";
203
- stream .string += "\n";
182
+ generator .string += generator .Indent ();
183
+ generator .string += "<ProtoDeclare";
184
+ generator .string += generator .Space ();
185
+ generator .string += "name='";
186
+ generator .string += generator .XMLEncode (this .getName ());
187
+ generator .string += "'";
188
+ generator .string += ">";
189
+ generator .string += generator .TidyBreak ();
204
190
 
205
191
  // <ProtoInterface>
206
192
 
@@ -212,31 +198,33 @@ X3DProtoDeclaration .prototype = Object .assign (Object .create (X3DProtoDeclara
212
198
  {
213
199
  generator .IncIndent ();
214
200
 
215
- stream .string += generator .Indent ();
216
- stream .string += "<ProtoInterface>\n";
201
+ generator .string += generator .Indent ();
202
+ generator .string += "<ProtoInterface>";
203
+ generator .string += generator .TidyBreak ();
217
204
 
218
205
  generator .IncIndent ();
219
206
 
220
207
  for (const field of userDefinedFields)
221
208
  {
222
- stream .string += generator .Indent ();
223
- stream .string += "<field";
224
- stream .string += " ";
225
- stream .string += "accessType='";
226
- stream .string += generator .AccessType (field .getAccessType ());
227
- stream .string += "'";
228
- stream .string += " ";
229
- stream .string += "type='";
230
- stream .string += field .getTypeName ();
231
- stream .string += "'";
232
- stream .string += " ";
233
- stream .string += "name='";
234
- stream .string += generator .XMLEncode (field .getName ());
235
- stream .string += "'";
209
+ generator .string += generator .Indent ();
210
+ generator .string += "<field";
211
+ generator .string += generator .Space ();
212
+ generator .string += "accessType='";
213
+ generator .string += generator .AccessType (field .getAccessType ());
214
+ generator .string += "'";
215
+ generator .string += generator .Space ();
216
+ generator .string += "type='";
217
+ generator .string += field .getTypeName ();
218
+ generator .string += "'";
219
+ generator .string += generator .Space ();
220
+ generator .string += "name='";
221
+ generator .string += generator .XMLEncode (field .getName ());
222
+ generator .string += "'";
236
223
 
237
224
  if (field .isDefaultValue ())
238
225
  {
239
- stream .string += "/>\n";
226
+ generator .string += "/>";
227
+ generator .string += generator .TidyBreak ();
240
228
  }
241
229
  else
242
230
  {
@@ -247,31 +235,33 @@ X3DProtoDeclaration .prototype = Object .assign (Object .create (X3DProtoDeclara
247
235
  {
248
236
  generator .PushContainerField (field);
249
237
 
250
- stream .string += ">\n";
238
+ generator .string += generator .TidyBreak ();
251
239
 
252
240
  generator .IncIndent ();
253
241
 
254
- field .toXMLStream (stream);
242
+ field .toXMLStream (generator);
255
243
 
256
- stream .string += "\n";
244
+ generator .string += generator .TidyBreak ();
257
245
 
258
246
  generator .DecIndent ();
259
247
 
260
- stream .string += generator .Indent ();
261
- stream .string += "</field>\n";
248
+ generator .string += generator .Indent ();
249
+ generator .string += "</field>";
250
+ generator .string += generator .TidyBreak ();
262
251
 
263
252
  generator .PopContainerField ();
264
253
  break;
265
254
  }
266
255
  default:
267
256
  {
268
- stream .string += " ";
269
- stream .string += "value='";
257
+ generator .string += generator .Space ();
258
+ generator .string += "value='";
270
259
 
271
- field .toXMLStream (stream);
260
+ field .toXMLStream (generator);
272
261
 
273
- stream .string += "'";
274
- stream .string += "/>\n";
262
+ generator .string += "'";
263
+ generator .string += "/>";
264
+ generator .string += generator .TidyBreak ();
275
265
  break;
276
266
  }
277
267
  }
@@ -280,8 +270,9 @@ X3DProtoDeclaration .prototype = Object .assign (Object .create (X3DProtoDeclara
280
270
 
281
271
  generator .DecIndent ();
282
272
 
283
- stream .string += generator .Indent ();
284
- stream .string += "</ProtoInterface>\n";
273
+ generator .string += generator .Indent ();
274
+ generator .string += "</ProtoInterface>";
275
+ generator .string += generator .TidyBreak ();
285
276
 
286
277
  generator .DecIndent ();
287
278
  }
@@ -294,24 +285,254 @@ X3DProtoDeclaration .prototype = Object .assign (Object .create (X3DProtoDeclara
294
285
 
295
286
  generator .IncIndent ();
296
287
 
297
- stream .string += generator .Indent ();
298
- stream .string += "<ProtoBody>\n";
288
+ generator .string += generator .Indent ();
289
+ generator .string += "<ProtoBody>";
290
+ generator .string += generator .TidyBreak ();
299
291
 
300
292
  generator .IncIndent ();
301
293
 
302
- this [_body] .toXMLStream (stream);
294
+ this [_body] .toXMLStream (generator);
303
295
 
304
296
  generator .DecIndent ();
305
297
 
306
- stream .string += generator .Indent ();
307
- stream .string += "</ProtoBody>\n";
298
+ generator .string += generator .Indent ();
299
+ generator .string += "</ProtoBody>";
300
+ generator .string += generator .TidyBreak ();
308
301
 
309
302
  generator .DecIndent ();
310
303
 
311
304
  // </ProtoBody>
312
305
 
313
- stream .string += generator .Indent ();
314
- stream .string += "</ProtoDeclare>";
306
+ generator .string += generator .Indent ();
307
+ generator .string += "</ProtoDeclare>";
308
+ },
309
+ toJSONStream: function (generator)
310
+ {
311
+ generator .string += generator .Indent ();
312
+ generator .string += '{';
313
+ generator .string += generator .TidySpace ();
314
+ generator .string += '"';
315
+ generator .string += "ProtoDeclare";
316
+ generator .string += '"';
317
+ generator .string += ':';
318
+ generator .string += generator .TidyBreak ();
319
+ generator .string += generator .IncIndent ();
320
+ generator .string += generator .Indent ();
321
+ generator .string += '{';
322
+ generator .string += generator .TidyBreak ();
323
+ generator .string += generator .IncIndent ();
324
+ generator .string += generator .Indent ();
325
+ generator .string += '"';
326
+ generator .string += "@name";
327
+ generator .string += '"';
328
+ generator .string += ':';
329
+ generator .string += generator .JSONEncode (this .getName ());
330
+ generator .string += ',';
331
+ generator .string += generator .TidyBreak ();
332
+
333
+ generator .string += generator .Indent ();
334
+ generator .string += '"';
335
+ generator .string += "ProtoInterface";
336
+ generator .string += '"';
337
+ generator .string += ':';
338
+ generator .string += generator .TidySpace ();
339
+ generator .string += '{';
340
+ generator .string += generator .TidyBreak ();
341
+ generator .string += generator .IncIndent ();
342
+
343
+
344
+ // Fields
345
+
346
+ generator .EnterScope ();
347
+
348
+ const userDefinedFields = this .getUserDefinedFields ();
349
+
350
+ if (userDefinedFields .length)
351
+ {
352
+ generator .string += generator .Indent ();
353
+ generator .string += '"';
354
+ generator .string += "field";
355
+ generator .string += '"';
356
+ generator .string += ':';
357
+ generator .string += generator .TidySpace ();
358
+ generator .string += '[';
359
+ generator .string += generator .TidyBreak ();
360
+ generator .string += generator .IncIndent ();
361
+
362
+ for (const field of userDefinedFields)
363
+ {
364
+ generator .string += generator .Indent ();
365
+ generator .string += '{';
366
+ generator .string += generator .TidyBreak ();
367
+ generator .string += generator .IncIndent ();
368
+
369
+ generator .string += generator .Indent ();
370
+ generator .string += '"';
371
+ generator .string += "@accessType";
372
+ generator .string += '"';
373
+ generator .string += ':';
374
+ generator .string += generator .TidySpace ();
375
+ generator .string += '"';
376
+ generator .string += generator .AccessType (field .getAccessType ());
377
+ generator .string += '"';
378
+ generator .string += ',';
379
+ generator .string += generator .TidyBreak ();
380
+
381
+ generator .string += generator .Indent ();
382
+ generator .string += '"';
383
+ generator .string += "@type";
384
+ generator .string += '"';
385
+ generator .string += ':';
386
+ generator .string += generator .TidySpace ();
387
+ generator .string += '"';
388
+ generator .string += field .getTypeName ();
389
+ generator .string += '"';
390
+ generator .string += ',';
391
+ generator .string += generator .TidyBreak ();
392
+
393
+ generator .string += generator .Indent ();
394
+ generator .string += '"';
395
+ generator .string += "@name";
396
+ generator .string += '"';
397
+ generator .string += ':';
398
+ generator .string += generator .TidySpace ();
399
+ generator .string += generator .JSONEncode (field .getName ());
400
+
401
+ if (field .isDefaultValue ())
402
+ {
403
+ generator .string += generator .TidyBreak ();
404
+ }
405
+ else
406
+ {
407
+ generator .string += ',';
408
+ generator .string += generator .TidyBreak ();
409
+
410
+ // Output value
411
+
412
+ switch (field .getType ())
413
+ {
414
+ case X3DConstants .SFNode:
415
+ {
416
+ generator .string += generator .Indent ();
417
+ generator .string += '"';
418
+ generator .string += "-children";
419
+ generator .string += '"';
420
+ generator .string += ':';
421
+ generator .string += generator .TidySpace ();
422
+ generator .string += '[';
423
+ generator .string += generator .TidyBreak ();
424
+ generator .string += generator .IncIndent ();
425
+ generator .string += generator .Indent ();
426
+
427
+ field .toJSONStream (generator);
428
+
429
+ generator .string += generator .TidyBreak ();
430
+ generator .string += generator .DecIndent ();
431
+ generator .string += generator .Indent ();
432
+ generator .string += ']';
433
+ generator .string += generator .TidyBreak ();
434
+ break;
435
+ }
436
+ case X3DConstants .MFNode:
437
+ {
438
+ generator .string += generator .Indent ();
439
+ generator .string += '"';
440
+ generator .string += "-children";
441
+ generator .string += '"';
442
+ generator .string += ':';
443
+ generator .string += generator .TidySpace ();
444
+
445
+ field .toJSONStream (generator);
446
+
447
+ generator .string += generator .TidyBreak ();
448
+ break;
449
+ }
450
+ default:
451
+ {
452
+ generator .string += generator .Indent ();
453
+ generator .string += '"';
454
+ generator .string += "@value";
455
+ generator .string += '"';
456
+ generator .string += ':';
457
+ generator .string += generator .TidySpace ();
458
+
459
+ field .toJSONStream (generator);
460
+
461
+ generator .string += generator .TidyBreak ();
462
+ break;
463
+ }
464
+ }
465
+ }
466
+
467
+ generator .string += generator .DecIndent ();
468
+ generator .string += generator .Indent ();
469
+ generator .string += '}';
470
+
471
+ if (field !== userDefinedFields .at (-1))
472
+ generator .string += ',';
473
+
474
+ generator .string += generator .TidyBreak ();
475
+ }
476
+
477
+ generator .string += generator .DecIndent ();
478
+ generator .string += generator .Indent ();
479
+ generator .string += ']';
480
+ }
481
+
482
+ generator .string += generator .DecIndent ();
483
+ generator .string += generator .TidyBreak ();
484
+ generator .string += generator .Indent ();
485
+ generator .string += '}';
486
+ generator .string += ',';
487
+ generator .string += generator .TidyBreak ();
488
+
489
+ generator .LeaveScope ();
490
+
491
+
492
+ // ProtoBody
493
+
494
+ generator .string += generator .Indent ();
495
+ generator .string += '"';
496
+ generator .string += "ProtoBody";
497
+ generator .string += '"';
498
+ generator .string += ':';
499
+ generator .string += generator .TidySpace ();
500
+ generator .string += '{';
501
+ generator .string += generator .TidyBreak ();
502
+ generator .string += generator .IncIndent ();
503
+
504
+ generator .string += generator .Indent ();
505
+ generator .string += '"';
506
+ generator .string += "-children";
507
+ generator .string += '"';
508
+ generator .string += ':';
509
+ generator .string += generator .TidySpace ();
510
+ generator .string += '[';
511
+ generator .string += generator .TidyBreak ();
512
+ generator .string += generator .IncIndent ();
513
+
514
+ this [_body] .toJSONStream (generator);
515
+
516
+ generator .string = generator .string .replace (/,(\s*)$/s, "$1");
517
+
518
+ generator .string += generator .DecIndent ();
519
+ generator .string += generator .Indent ();
520
+ generator .string += ']';
521
+ generator .string += generator .TidyBreak ();
522
+
523
+ // End
524
+
525
+ generator .string += generator .DecIndent ();
526
+ generator .string += generator .Indent ();
527
+ generator .string += '}';
528
+ generator .string += generator .TidyBreak ();
529
+ generator .string += generator .DecIndent ();
530
+ generator .string += generator .Indent ();
531
+ generator .string += '}';
532
+ generator .string += generator .TidyBreak ();
533
+ generator .string += generator .DecIndent ();
534
+ generator .string += generator .Indent ();
535
+ generator .string += '}';
315
536
  },
316
537
  });
317
538
 
@@ -82,6 +82,7 @@ function X3DRenderObject (executionContext)
82
82
  this .localShadows = [ false ];
83
83
  this .localFogs = [ null ];
84
84
  this .layouts = [ ];
85
+ this .jointNodes = [ ];
85
86
  this .textureProjectors = [ ];
86
87
  this .generatedCubeMapTextures = [ ];
87
88
  this .collisions = [ ];
@@ -219,6 +220,10 @@ X3DRenderObject .prototype =
219
220
  {
220
221
  return this .layouts;
221
222
  },
223
+ getJoints: function ()
224
+ {
225
+ return this .jointNodes;
226
+ },
222
227
  getParentLayout: function ()
223
228
  {
224
229
  return this .layouts .at (-1);
@@ -837,7 +842,7 @@ X3DRenderObject .prototype =
837
842
  globalShadows = this .globalShadows,
838
843
  shadows = globalShadows .at (-1),
839
844
  headlight = this .getNavigationInfo () ._headlight .getValue (),
840
- numGlobalLights = globalObjects .reduce ((v, c) => v + !!c .lightNode, +headlight),
845
+ numGlobalLights = globalObjects .reduce ((v, c) => v + !!c .lightNode, 0),
841
846
  numGlobalTextureProjectors = globalObjects .reduce ((v, c) => v + !!c .textureProjectorNode, 0);
842
847
 
843
848