x_ite 8.3.2 → 8.3.3

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 (112) 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 +61 -74
  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 +1492 -1291
  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/scene-services.md +13 -2
  52. package/docs/_posts/what's-new.md +21 -3
  53. package/docs/_tabs/playground.html +36 -40
  54. package/docs/assets/css/style.scss +18 -0
  55. package/package.json +1 -1
  56. package/src/assets/components/{ProjectiveTextureMapping.js → TextureProjector.js} +5 -5
  57. package/src/examples.js +1 -1
  58. package/src/tests.js +5 -5
  59. package/src/x_ite/Base/X3DInfoArray.js +21 -21
  60. package/src/x_ite/Base/X3DObject.js +29 -20
  61. package/src/x_ite/Base/X3DObjectArrayField.js +27 -26
  62. package/src/x_ite/Base/X3DTypedArrayField.js +34 -32
  63. package/src/x_ite/Browser/DOMIntegration.js +4 -3
  64. package/src/x_ite/Browser/VERSION.js +1 -1
  65. package/src/x_ite/Browser/X3DBrowser.js +43 -28
  66. package/src/x_ite/Components/Core/X3DNode.js +196 -187
  67. package/src/x_ite/Components/Core/X3DPrototypeInstance.js +113 -90
  68. package/src/x_ite/Components/Grouping/X3DTransformMatrix3DNode.js +18 -43
  69. package/src/x_ite/Components/HAnim/HAnimHumanoid.js +24 -25
  70. package/src/x_ite/Components/HAnim/HAnimJoint.js +19 -31
  71. package/src/x_ite/Components/Sound/X3DSoundProcessingNode.js +14 -1
  72. package/src/x_ite/Components/Sound/X3DSoundSourceNode.js +0 -1
  73. package/src/x_ite/Components/{ProjectiveTextureMapping → TextureProjector}/TextureProjector.js +1 -1
  74. package/src/x_ite/Components/{ProjectiveTextureMapping → TextureProjector}/TextureProjectorParallel.js +1 -1
  75. package/src/x_ite/Components/{ProjectiveTextureMapping → TextureProjector}/X3DTextureProjectorNode.js +0 -0
  76. package/src/x_ite/Components/Time/TimeSensor.js +5 -0
  77. package/src/x_ite/Components/Time/X3DTimeDependentNode.js +1 -0
  78. package/src/x_ite/Configuration/ComponentInfo.js +20 -23
  79. package/src/x_ite/Configuration/ProfileInfo.js +6 -6
  80. package/src/x_ite/Configuration/SupportedComponents.js +22 -20
  81. package/src/x_ite/Configuration/SupportedProfiles.js +1 -1
  82. package/src/x_ite/Configuration/UnitInfo.js +24 -27
  83. package/src/x_ite/Execution/X3DExecutionContext.js +28 -59
  84. package/src/x_ite/Execution/X3DExportedNode.js +23 -28
  85. package/src/x_ite/Execution/X3DImportedNode.js +63 -67
  86. package/src/x_ite/Execution/X3DScene.js +98 -117
  87. package/src/x_ite/Fields/ArrayFields.js +57 -55
  88. package/src/x_ite/Fields/SFBool.js +6 -6
  89. package/src/x_ite/Fields/SFColor.js +10 -12
  90. package/src/x_ite/Fields/SFDouble.js +7 -10
  91. package/src/x_ite/Fields/SFFloat.js +7 -10
  92. package/src/x_ite/Fields/SFImage.js +33 -8
  93. package/src/x_ite/Fields/SFInt32.js +6 -6
  94. package/src/x_ite/Fields/SFMatrixPrototypeTemplate.js +13 -13
  95. package/src/x_ite/Fields/SFNode.js +42 -19
  96. package/src/x_ite/Fields/SFRotation.js +13 -13
  97. package/src/x_ite/Fields/SFString.js +6 -7
  98. package/src/x_ite/Fields/SFTime.js +6 -6
  99. package/src/x_ite/Fields/SFVecPrototypeTemplate.js +10 -10
  100. package/src/x_ite/InputOutput/FileLoader.js +1 -1
  101. package/src/x_ite/InputOutput/Generator.js +117 -17
  102. package/src/x_ite/Parser/VRMLParser.js +24 -27
  103. package/src/x_ite/Parser/X3DParser.js +0 -4
  104. package/src/x_ite/Parser/XMLParser.js +2 -2
  105. package/src/x_ite/Prototype/X3DExternProtoDeclaration.js +59 -64
  106. package/src/x_ite/Prototype/X3DProtoDeclaration.js +86 -93
  107. package/src/x_ite/Rendering/X3DRenderObject.js +6 -1
  108. package/src/x_ite/Routing/X3DRoute.js +37 -40
  109. package/src/x_ite.html +1 -1
  110. package/x_ite.min.html +1 -1
  111. package/dist/assets/components/ProjectiveTextureMapping.min.js +0 -1
  112. package/docs/Gemfile.lock +0 -116
@@ -48,7 +48,6 @@
48
48
  import X3DNode from "../Components/Core/X3DNode.js";
49
49
  import X3DConstants from "../Base/X3DConstants.js";
50
50
  import SFNodeCache from "../Fields/SFNodeCache.js";
51
- import Generator from "../InputOutput/Generator.js";
52
51
 
53
52
  const
54
53
  _inlineNode = Symbol (),
@@ -68,6 +67,7 @@ function X3DImportedNode (executionContext, inlineNode, exportedName, importedNa
68
67
  this [_inlineNode] ._loadState .addInterest ("set_loadState__", this);
69
68
  }
70
69
 
70
+ // Must be of type X3DNode, to get routes work.
71
71
  X3DImportedNode .prototype = Object .assign (Object .create (X3DNode .prototype),
72
72
  {
73
73
  constructor: X3DImportedNode,
@@ -175,25 +175,23 @@ X3DImportedNode .prototype = Object .assign (Object .create (X3DNode .prototype)
175
175
  }
176
176
  }
177
177
  },
178
- toVRMLStream: function (stream)
178
+ toVRMLStream: function (generator)
179
179
  {
180
- const generator = Generator .Get (stream);
181
-
182
180
  if (generator .ExistsNode (this .getInlineNode ()))
183
181
  {
184
- stream .string += generator .Indent ();
185
- stream .string += "IMPORT";
186
- stream .string += " ";
187
- stream .string += generator .Name (this .getInlineNode ());
188
- stream .string += ".";
189
- stream .string += this .getExportedName ();
182
+ generator .string += generator .Indent ();
183
+ generator .string += "IMPORT";
184
+ generator .string += generator .Space ();
185
+ generator .string += generator .Name (this .getInlineNode ());
186
+ generator .string += ".";
187
+ generator .string += this .getExportedName ();
190
188
 
191
189
  if (this .getImportedName () !== this .getExportedName ())
192
190
  {
193
- stream .string += " ";
194
- stream .string += "AS";
195
- stream .string += " ";
196
- stream .string += this .getImportedName ();
191
+ generator .string += generator .Space ();
192
+ generator .string += "AS";
193
+ generator .string += generator .Space ();
194
+ generator .string += this .getImportedName ();
197
195
  }
198
196
 
199
197
  try
@@ -223,20 +221,20 @@ X3DImportedNode .prototype = Object .assign (Object .create (X3DNode .prototype)
223
221
  ? destinationNode .getImportedName ()
224
222
  : generator .Name (destinationNode);
225
223
 
226
- stream .string += "\n";
227
- stream .string += "\n";
228
- stream .string += generator .Indent ();
229
- stream .string += "ROUTE";
230
- stream .string += " ";
231
- stream .string += sourceNodeName;
232
- stream .string += ".";
233
- stream .string += sourceField;
234
- stream .string += " ";
235
- stream .string += "TO";
236
- stream .string += " ";
237
- stream .string += destinationNodeName;
238
- stream .string += ".";
239
- stream .string += destinationField;
224
+ generator .string += generator .Break ();
225
+ generator .string += generator .TidyBreak ();
226
+ generator .string += generator .Indent ();
227
+ generator .string += "ROUTE";
228
+ generator .string += generator .Space ();
229
+ generator .string += sourceNodeName;
230
+ generator .string += ".";
231
+ generator .string += sourceField;
232
+ generator .string += generator .Space ();
233
+ generator .string += "TO";
234
+ generator .string += generator .Space ();
235
+ generator .string += destinationNodeName;
236
+ generator .string += ".";
237
+ generator .string += destinationField;
240
238
  }
241
239
  }
242
240
  }
@@ -244,32 +242,30 @@ X3DImportedNode .prototype = Object .assign (Object .create (X3DNode .prototype)
244
242
  else
245
243
  throw new Error ("X3DImportedNode.toXMLStream: Inline node does not exist.");
246
244
  },
247
- toXMLStream: function (stream)
245
+ toXMLStream: function (generator)
248
246
  {
249
- const generator = Generator .Get (stream);
250
-
251
247
  if (generator .ExistsNode (this .getInlineNode ()))
252
248
  {
253
- stream .string += generator .Indent ();
254
- stream .string += "<IMPORT";
255
- stream .string += " ";
256
- stream .string += "inlineDEF='";
257
- stream .string += generator .XMLEncode (generator .Name (this .getInlineNode ()));
258
- stream .string += "'";
259
- stream .string += " ";
260
- stream .string += "importedDEF='";
261
- stream .string += generator .XMLEncode (this .getExportedName ());
262
- stream .string += "'";
249
+ generator .string += generator .Indent ();
250
+ generator .string += "<IMPORT";
251
+ generator .string += generator .Space ();
252
+ generator .string += "inlineDEF='";
253
+ generator .string += generator .XMLEncode (generator .Name (this .getInlineNode ()));
254
+ generator .string += "'";
255
+ generator .string += generator .Space ();
256
+ generator .string += "importedDEF='";
257
+ generator .string += generator .XMLEncode (this .getExportedName ());
258
+ generator .string += "'";
263
259
 
264
260
  if (this .getImportedName () !== this .getExportedName ())
265
261
  {
266
- stream .string += " ";
267
- stream .string += "AS='";
268
- stream .string += generator .XMLEncode (this .getImportedName ());
269
- stream .string += "'";
262
+ generator .string += generator .Space ();
263
+ generator .string += "AS='";
264
+ generator .string += generator .XMLEncode (this .getImportedName ());
265
+ generator .string += "'";
270
266
  }
271
267
 
272
- stream .string += "/>";
268
+ generator .string += "/>";
273
269
 
274
270
  try
275
271
  {
@@ -298,27 +294,27 @@ X3DImportedNode .prototype = Object .assign (Object .create (X3DNode .prototype)
298
294
  ? destinationNode .getImportedName ()
299
295
  : generator .Name (destinationNode);
300
296
 
301
- stream .string += "\n";
302
- stream .string += "\n";
303
- stream .string += generator .Indent ();
304
- stream .string += "<ROUTE";
305
- stream .string += " ";
306
- stream .string += "fromNode='";
307
- stream .string += generator .XMLEncode (sourceNodeName);
308
- stream .string += "'";
309
- stream .string += " ";
310
- stream .string += "fromField='";
311
- stream .string += generator .XMLEncode (sourceField);
312
- stream .string += "'";
313
- stream .string += " ";
314
- stream .string += "toNode='";
315
- stream .string += generator .XMLEncode (destinationNodeName);
316
- stream .string += "'";
317
- stream .string += " ";
318
- stream .string += "toField='";
319
- stream .string += generator .XMLEncode (destinationField);
320
- stream .string += "'";
321
- stream .string += "/>";
297
+ generator .string += generator .Break ();
298
+ generator .string += generator .TidyBreak ();
299
+ generator .string += generator .Indent ();
300
+ generator .string += "<ROUTE";
301
+ generator .string += generator .Space ();
302
+ generator .string += "fromNode='";
303
+ generator .string += generator .XMLEncode (sourceNodeName);
304
+ generator .string += "'";
305
+ generator .string += generator .Space ();
306
+ generator .string += "fromField='";
307
+ generator .string += generator .XMLEncode (sourceField);
308
+ generator .string += "'";
309
+ generator .string += generator .Space ();
310
+ generator .string += "toNode='";
311
+ generator .string += generator .XMLEncode (destinationNodeName);
312
+ generator .string += "'";
313
+ generator .string += generator .Space ();
314
+ generator .string += "toField='";
315
+ generator .string += generator .XMLEncode (destinationField);
316
+ generator .string += "'";
317
+ generator .string += "/>";
322
318
  }
323
319
  }
324
320
  }
@@ -55,7 +55,6 @@ import X3DExportedNode from "./X3DExportedNode.js";
55
55
  import ExportedNodesArray from "./ExportedNodesArray.js";
56
56
  import X3DCast from "../Base/X3DCast.js";
57
57
  import X3DConstants from "../Base/X3DConstants.js";
58
- import Generator from "../InputOutput/Generator.js";
59
58
  import SFNodeCache from "../Fields/SFNodeCache.js";
60
59
 
61
60
  SupportedNodes .addAbstractType ("X3DScene", X3DScene);
@@ -78,6 +77,12 @@ function X3DScene (executionContext)
78
77
 
79
78
  this .addType (X3DConstants .X3DScene)
80
79
 
80
+ this .addChildObjects ("profile_changed", new Fields .SFTime (),
81
+ "components_changed", new Fields .SFTime (),
82
+ "units_changed", new Fields .SFTime (),
83
+ "metadata_changed", new Fields .SFTime (),
84
+ "exportedNodes_changed", new Fields .SFTime ())
85
+
81
86
  this [_specificationVersion] = LATEST_VERSION;
82
87
  this [_encoding] = "SCRIPTED";
83
88
  this [_profile] = null;
@@ -93,12 +98,6 @@ function X3DScene (executionContext)
93
98
  this [_metadata] = new Map ();
94
99
  this [_exportedNodes] = new ExportedNodesArray ();
95
100
 
96
- this .addChildObjects ("profile_changed", new Fields .SFTime (),
97
- "components_changed", new Fields .SFTime (),
98
- "units_changed", new Fields .SFTime (),
99
- "metadata_changed", new Fields .SFTime (),
100
- "exportedNodes_changed", new Fields .SFTime ())
101
-
102
101
  this .getRootNodes () .setAccessType (X3DConstants .inputOutput);
103
102
 
104
103
  this .setLive (false);
@@ -363,39 +362,37 @@ X3DScene .prototype = Object .assign (Object .create (X3DExecutionContext .proto
363
362
 
364
363
  this .getRootNodes () .assign (value);
365
364
  },
366
- toVRMLStream: function (stream)
365
+ toVRMLStream: function (generator)
367
366
  {
368
- const generator = Generator .Get (stream);
369
-
370
- stream .string += "#X3D V";
371
- stream .string += LATEST_VERSION;
372
- stream .string += " ";
373
- stream .string += "utf8";
374
- stream .string += " ";
375
- stream .string += this .getBrowser () .name;
376
- stream .string += " ";
377
- stream .string += "V";
378
- stream .string += this .getBrowser () .version;
379
- stream .string += "\n";
380
- stream .string += "\n";
367
+ generator .string += "#X3D V";
368
+ generator .string += LATEST_VERSION;
369
+ generator .string += generator .Space ();
370
+ generator .string += "utf8";
371
+ generator .string += generator .Space ();
372
+ generator .string += this .getBrowser () .name;
373
+ generator .string += generator .Space ();
374
+ generator .string += "V";
375
+ generator .string += this .getBrowser () .version;
376
+ generator .string += generator .ForceBreak ();
377
+ generator .string += generator .ForceBreak ();
381
378
 
382
379
  const profile = this .getProfile ();
383
380
 
384
381
  if (profile)
385
382
  {
386
- profile .toVRMLStream (stream);
383
+ profile .toVRMLStream (generator);
387
384
 
388
- stream .string += "\n";
389
- stream .string += "\n";
385
+ generator .string += generator .Break ();
386
+ generator .string += generator .TidyBreak ();
390
387
  }
391
388
 
392
389
  const components = this .getComponents ();
393
390
 
394
391
  if (components .length)
395
392
  {
396
- components .toVRMLStream (stream);
393
+ components .toVRMLStream (generator);
397
394
 
398
- stream .string += "\n";
395
+ generator .string += generator .TidyBreak ();
399
396
  }
400
397
 
401
398
  // Units
@@ -408,14 +405,14 @@ X3DScene .prototype = Object .assign (Object .create (X3DExecutionContext .proto
408
405
  {
409
406
  empty = false;
410
407
 
411
- unit .toVRMLStream (stream);
408
+ unit .toVRMLStream (generator);
412
409
 
413
- stream .string += "\n";
410
+ generator .string += generator .Break ();
414
411
  }
415
412
  }
416
413
 
417
414
  if (!empty)
418
- stream .string += "\n";
415
+ generator .string += generator .TidyBreak ();
419
416
  }
420
417
 
421
418
  const metadata = this .getMetaDatas ();
@@ -424,15 +421,15 @@ X3DScene .prototype = Object .assign (Object .create (X3DExecutionContext .proto
424
421
  {
425
422
  metadata .forEach (function (value, key)
426
423
  {
427
- stream .string += "META";
428
- stream .string += " ";
429
- stream .string += new Fields .SFString (key) .toString ();
430
- stream .string += " ";
431
- stream .string += new Fields .SFString (value) .toString ();
432
- stream .string += "\n";
424
+ generator .string += "META";
425
+ generator .string += generator .Space ();
426
+ generator .string += new Fields .SFString (key) .toString ();
427
+ generator .string += generator .Space ();
428
+ generator .string += new Fields .SFString (value) .toString ();
429
+ generator .string += generator .Break ();
433
430
  });
434
431
 
435
- stream .string += "\n";
432
+ generator .string += generator .TidyBreak ();
436
433
  }
437
434
 
438
435
  const exportedNodes = this .getExportedNodes ();
@@ -441,56 +438,45 @@ X3DScene .prototype = Object .assign (Object .create (X3DExecutionContext .proto
441
438
  generator .EnterScope ();
442
439
  generator .ExportedNodes (exportedNodes);
443
440
 
444
- X3DExecutionContext .prototype .toVRMLStream .call (this, stream);
441
+ X3DExecutionContext .prototype .toVRMLStream .call (this, generator);
445
442
 
446
- if (exportedNodes .size)
443
+ if (exportedNodes .length)
447
444
  {
448
- stream .string += "\n";
445
+ generator .string += generator .TidyBreak ();
449
446
 
450
- exportedNodes .forEach (function (exportedNode)
451
- {
452
- try
453
- {
454
- exportedNode .toVRMLStream (stream);
455
-
456
- stream .string += "\n";
457
- }
458
- catch (error)
459
- {
460
- console .error (error);
461
- }
462
- });
447
+ exportedNodes .toVRMLStream (generator);
463
448
  }
464
449
 
465
450
  generator .LeaveScope ();
466
451
  generator .PopExecutionContext ();
467
452
  },
468
- toXMLStream: function (stream)
469
- {
470
- const generator = Generator .Get (stream);
471
-
472
- stream .string += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
473
- stream .string += "<!DOCTYPE X3D PUBLIC \"ISO//Web3D//DTD X3D ";
474
- stream .string += LATEST_VERSION;
475
- stream .string += "//EN\" \"http://www.web3d.org/specifications/x3d-";
476
- stream .string += LATEST_VERSION;
477
- stream .string += ".dtd\">\n";
478
-
479
- stream .string += "<X3D";
480
- stream .string += " ";
481
- stream .string += "profile='";
482
- stream .string += this .getProfile () ? this .getProfile () .name : "Full";
483
- stream .string += "'";
484
- stream .string += " ";
485
- stream .string += "version='";
486
- stream .string += LATEST_VERSION;
487
- stream .string += "'";
488
- stream .string += " ";
489
- stream .string += "xmlns:xsd='http://www.w3.org/2001/XMLSchema-instance'";
490
- stream .string += " ";
491
- stream .string += "xsd:noNamespaceSchemaLocation='http://www.web3d.org/specifications/x3d-";
492
- stream .string += LATEST_VERSION;
493
- stream .string += ".xsd'>\n";
453
+ toXMLStream: function (generator)
454
+ {
455
+ generator .string += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
456
+ generator .string += generator .TidyBreak ();
457
+ generator .string += "<!DOCTYPE X3D PUBLIC \"ISO//Web3D//DTD X3D ";
458
+ generator .string += LATEST_VERSION;
459
+ generator .string += "//EN\" \"http://www.web3d.org/specifications/x3d-";
460
+ generator .string += LATEST_VERSION;
461
+ generator .string += ".dtd\">";
462
+ generator .string += generator .TidyBreak ();
463
+
464
+ generator .string += "<X3D";
465
+ generator .string += generator .Space ();
466
+ generator .string += "profile='";
467
+ generator .string += this .getProfile () ? this .getProfile () .name : "Full";
468
+ generator .string += "'";
469
+ generator .string += generator .Space ();
470
+ generator .string += "version='";
471
+ generator .string += LATEST_VERSION;
472
+ generator .string += "'";
473
+ generator .string += generator .Space ();
474
+ generator .string += "xmlns:xsd='http://www.w3.org/2001/XMLSchema-instance'";
475
+ generator .string += generator .Space ();
476
+ generator .string += "xsd:noNamespaceSchemaLocation='http://www.web3d.org/specifications/x3d-";
477
+ generator .string += LATEST_VERSION;
478
+ generator .string += ".xsd'>";
479
+ generator .string += generator .TidyBreak ();
494
480
 
495
481
  generator .IncIndent ();
496
482
 
@@ -498,54 +484,58 @@ X3DScene .prototype = Object .assign (Object .create (X3DExecutionContext .proto
498
484
  this .getUnits () .some (unit => unit .conversionFactor !== 1) ||
499
485
  this .getMetaDatas () .size)
500
486
  {
501
- stream .string += generator .Indent ();
502
- stream .string += "<head>\n";
487
+ generator .string += generator .Indent ();
488
+ generator .string += "<head>";
489
+ generator .string += generator .TidyBreak ();
503
490
 
504
491
  generator .IncIndent ();
505
492
 
506
493
  // <head>
507
494
 
508
- this .getComponents () .toXMLStream (stream);
495
+ this .getComponents () .toXMLStream (generator);
509
496
 
510
497
  for (const unit of this .getUnits ())
511
498
  {
512
499
  if (unit .conversionFactor !== 1)
513
500
  {
514
- unit .toXMLStream (stream);
501
+ unit .toXMLStream (generator);
515
502
 
516
- stream .string += "\n";
503
+ generator .string += generator .TidyBreak ();
517
504
  }
518
505
  }
519
506
 
520
507
  this .getMetaDatas () .forEach (function (value, key)
521
508
  {
522
- stream .string += generator .Indent ();
523
- stream .string += "<meta";
524
- stream .string += " ";
525
- stream .string += "name='";
526
- stream .string += generator .XMLEncode (key);
527
- stream .string += "'";
528
- stream .string += " ";
529
- stream .string += "content='";
530
- stream .string += generator .XMLEncode (value);
531
- stream .string += "'";
532
- stream .string += "/>\n";
509
+ generator .string += generator .Indent ();
510
+ generator .string += "<meta";
511
+ generator .string += generator .Space ();
512
+ generator .string += "name='";
513
+ generator .string += generator .XMLEncode (key);
514
+ generator .string += "'";
515
+ generator .string += generator .Space ();
516
+ generator .string += "content='";
517
+ generator .string += generator .XMLEncode (value);
518
+ generator .string += "'";
519
+ generator .string += "/>";
520
+ generator .string += generator .TidyBreak ();
533
521
  });
534
522
 
535
523
  // </head>
536
524
 
537
525
  generator .DecIndent ();
538
526
 
539
- stream .string += generator .Indent ();
540
- stream .string += "</head>\n";
527
+ generator .string += generator .Indent ();
528
+ generator .string += "</head>";
529
+ generator .string += generator .TidyBreak ();
541
530
  }
542
531
 
543
532
  if (this .getExternProtoDeclarations () .length ||
544
533
  this .getProtoDeclarations () .length ||
545
534
  this .getRootNodes () .length)
546
535
  {
547
- stream .string += generator .Indent ();
548
- stream .string += "<Scene>\n";
536
+ generator .string += generator .Indent ();
537
+ generator .string += "<Scene>";
538
+ generator .string += generator .TidyBreak ();
549
539
 
550
540
  generator .IncIndent ();
551
541
 
@@ -557,21 +547,9 @@ X3DScene .prototype = Object .assign (Object .create (X3DExecutionContext .proto
557
547
  generator .EnterScope ();
558
548
  generator .ExportedNodes (exportedNodes);
559
549
 
560
- X3DExecutionContext .prototype .toXMLStream .call (this, stream);
550
+ X3DExecutionContext .prototype .toXMLStream .call (this, generator);
561
551
 
562
- for (const exportedNode of exportedNodes)
563
- {
564
- try
565
- {
566
- exportedNode .toXMLStream (stream);
567
-
568
- stream .string += "\n";
569
- }
570
- catch (error)
571
- {
572
- console .error (error);
573
- }
574
- }
552
+ exportedNodes .toXMLStream (generator);
575
553
 
576
554
  generator .LeaveScope ();
577
555
  generator .PopExecutionContext ();
@@ -580,18 +558,21 @@ X3DScene .prototype = Object .assign (Object .create (X3DExecutionContext .proto
580
558
 
581
559
  generator .DecIndent ();
582
560
 
583
- stream .string += generator .Indent ();
584
- stream .string += "</Scene>\n";
561
+ generator .string += generator .Indent ();
562
+ generator .string += "</Scene>";
563
+ generator .string += generator .TidyBreak ();
585
564
  }
586
565
  else
587
566
  {
588
- stream .string += generator .Indent ();
589
- stream .string += "<Scene/>\n";
567
+ generator .string += generator .Indent ();
568
+ generator .string += "<Scene/>";
569
+ generator .string += generator .TidyBreak ();
590
570
  }
591
571
 
592
572
  generator .DecIndent ();
593
573
 
594
- stream .string += "</X3D>\n";
574
+ generator .string += "</X3D>";
575
+ generator .string += generator .TidyBreak ();
595
576
  },
596
577
  });
597
578