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 Fields from "../../Fields.js";
49
49
  import X3DBaseNode from "../../Base/X3DBaseNode.js";
50
50
  import X3DConstants from "../../Base/X3DConstants.js";
51
- import Generator from "../../InputOutput/Generator.js";
52
51
 
53
52
  function X3DNode (executionContext)
54
53
  {
@@ -218,14 +217,12 @@ X3DNode .prototype = Object .assign (Object .create (X3DBaseNode .prototype),
218
217
  return true;
219
218
  },
220
219
  traverse: function () { },
221
- toStream: function (stream)
220
+ toStream: function (generator)
222
221
  {
223
- stream .string += this .getTypeName () + " { }";
222
+ generator .string += this .getTypeName () + " { }";
224
223
  },
225
- toVRMLStream: function (stream)
224
+ toVRMLStream: function (generator)
226
225
  {
227
- const generator = Generator .Get (stream);
228
-
229
226
  generator .EnterScope ();
230
227
 
231
228
  const name = generator .Name (this);
@@ -234,9 +231,9 @@ X3DNode .prototype = Object .assign (Object .create (X3DBaseNode .prototype),
234
231
  {
235
232
  if (generator .ExistsNode (this))
236
233
  {
237
- stream .string += "USE";
238
- stream .string += " ";
239
- stream .string += name;
234
+ generator .string += "USE";
235
+ generator .string += generator .Space ();
236
+ generator .string += name;
240
237
 
241
238
  generator .LeaveScope ();
242
239
  return;
@@ -247,96 +244,108 @@ X3DNode .prototype = Object .assign (Object .create (X3DBaseNode .prototype),
247
244
  {
248
245
  generator .AddNode (this);
249
246
 
250
- stream .string += "DEF";
251
- stream .string += " ";
252
- stream .string += name;
253
- stream .string += " ";
247
+ generator .string += "DEF";
248
+ generator .string += generator .Space ();
249
+ generator .string += name;
250
+ generator .string += generator .Space ();
254
251
  }
255
252
 
256
- stream .string += this .getTypeName ();
257
- stream .string += " ";
258
- stream .string += "{";
253
+ generator .string += this .getTypeName ();
254
+ generator .string += generator .TidySpace ();
255
+ generator .string += "{";
259
256
 
260
257
  const
261
258
  fields = this .getChangedFields (),
262
259
  userDefinedFields = this .getUserDefinedFields ();
263
260
 
264
- let
265
- fieldTypeLength = 0,
266
- accessTypeLength = 0;
267
-
268
261
  if (this .canUserDefinedFields ())
269
262
  {
270
- for (const field of userDefinedFields)
271
- {
272
- fieldTypeLength = Math .max (fieldTypeLength, field .getTypeName () .length);
273
- accessTypeLength = Math .max (accessTypeLength, generator .AccessType (field .getAccessType ()) .length);
274
- }
275
-
276
263
  if (userDefinedFields .length)
277
264
  {
278
- stream .string += "\n";
265
+ let
266
+ fieldTypeLength = 0,
267
+ accessTypeLength = 0;
268
+
269
+ for (const field of userDefinedFields)
270
+ {
271
+ fieldTypeLength = Math .max (fieldTypeLength, field .getTypeName () .length);
272
+ accessTypeLength = Math .max (accessTypeLength, generator .AccessType (field .getAccessType ()) .length);
273
+ }
274
+
275
+ const last = userDefinedFields .at (-1);
276
+
277
+ generator .string += generator .TidyBreak ();
279
278
  generator .IncIndent ();
280
279
 
281
280
  for (const field of userDefinedFields)
282
281
  {
283
- this .toVRMLStreamUserDefinedField (stream, field, fieldTypeLength, accessTypeLength);
282
+ this .toVRMLStreamUserDefinedField (generator, field, fieldTypeLength, accessTypeLength);
284
283
 
285
- stream .string += "\n";
284
+ if (field === last)
285
+ generator .string += generator .TidyBreak ();
286
+ else
287
+ generator .string += generator .Break ();
286
288
  }
287
289
 
288
290
  generator .DecIndent ();
289
291
 
290
292
  if (fields .length !== 0)
291
- stream .string += "\n";
293
+ generator .string += generator .TidyBreak ();
292
294
  }
293
295
  }
294
296
 
295
297
  if (fields .length === 0)
296
298
  {
297
299
  if (userDefinedFields .length)
298
- stream .string += generator .Indent ();
300
+ generator .string += generator .Indent ();
299
301
  else
300
- stream .string += " ";
302
+ generator .string += generator .TidySpace ();
301
303
  }
302
304
  else
303
305
  {
306
+ const last = fields .at (-1);
307
+
304
308
  if (userDefinedFields .length === 0)
305
- stream .string += "\n";
309
+ generator .string += generator .TidyBreak ();
306
310
 
307
311
  generator .IncIndent ();
308
312
 
309
- fields .forEach (function (field)
313
+ for (const field of fields)
310
314
  {
311
- this .toVRMLStreamField (stream, field, fieldTypeLength, accessTypeLength);
315
+ this .toVRMLStreamField (generator, field);
312
316
 
313
- stream .string += "\n";
314
- },
315
- this);
317
+ if (field === last)
318
+ generator .string += generator .TidyBreak ();
319
+ else
320
+ generator .string += generator .Break ();
321
+ }
316
322
 
317
323
  generator .DecIndent ();
318
- stream .string += generator .Indent ();
324
+ generator .string += generator .Indent ();
319
325
  }
320
326
 
321
- stream .string += "}";
327
+ generator .string += "}";
322
328
 
323
329
  generator .LeaveScope ();
324
330
  },
325
- toVRMLStreamField: function (stream, field, fieldTypeLength, accessTypeLength)
331
+ toVRMLStreamUserDefinedField: function (generator, field, fieldTypeLength, accessTypeLength)
326
332
  {
327
- const
328
- generator = Generator .Get (stream),
329
- sharedNode = generator .IsSharedNode (this);
333
+ const sharedNode = generator .IsSharedNode (this);
330
334
 
331
335
  if (field .getReferences () .size === 0 || !generator .ExecutionContext () || sharedNode)
332
336
  {
337
+ generator .string += generator .Indent ();
338
+ generator .string += generator .PadRight (generator .AccessType (field .getAccessType ()), accessTypeLength);
339
+ generator .string += generator .Space ();
340
+ generator .string += generator .PadRight (field .getTypeName (), fieldTypeLength);
341
+ generator .string += generator .Space ();
342
+ generator .string += field .getName ();
343
+
333
344
  if (field .isInitializable ())
334
345
  {
335
- stream .string += generator .Indent ();
336
- stream .string += field .getName ();
337
- stream .string += " ";
346
+ generator .string += generator .Space ();
338
347
 
339
- field .toVRMLStream (stream);
348
+ field .toVRMLStream (generator);
340
349
  }
341
350
  }
342
351
  else
@@ -349,54 +358,57 @@ X3DNode .prototype = Object .assign (Object .create (X3DBaseNode .prototype),
349
358
  {
350
359
  initializableReference = initializableReference || reference .isInitializable ();
351
360
 
352
- // Output build in reference field
361
+ // Output user defined reference field
353
362
 
354
- stream .string += generator .Indent ();
355
- stream .string += field .getName ();
356
- stream .string += " ";
357
- stream .string += "IS";
358
- stream .string += " ";
359
- stream .string += reference .getName ();
363
+ generator .string += generator .Indent ();
364
+ generator .string += generator .PadRight (generator .AccessType (field .getAccessType ()), accessTypeLength);
365
+ generator .string += generator .Space ();
366
+ generator .string += generator .PadRight (field .getTypeName (), fieldTypeLength);
367
+ generator .string += generator .Space ();
368
+ generator .string += field .getName ();
369
+ generator .string += generator .Space ();
370
+ generator .string += "IS";
371
+ generator .string += generator .Space ();
372
+ generator .string += reference .getName ();
360
373
 
361
374
  ++ index;
362
375
 
363
376
  if (index !== field .getReferences () .size)
364
- stream .string += "\n";
377
+ generator .string += generator .Break ();
365
378
  });
366
379
 
367
- if (field .getAccessType () === X3DConstants .inputOutput && !initializableReference && !this .isDefaultValue (field))
380
+ if (field .getAccessType () === X3DConstants .inputOutput && !initializableReference && !field .isDefaultValue ())
368
381
  {
369
- // Output build in field
382
+ generator .string += generator .Break ();
383
+ generator .string += generator .Indent ();
384
+ generator .string += generator .PadRight (generator .AccessType (field .getAccessType ()), accessTypeLength);
385
+ generator .string += generator .Space ();
386
+ generator .string += generator .PadRight (field .getTypeName (), fieldTypeLength);
387
+ generator .string += generator .Space ();
388
+ generator .string += field .getName ();
370
389
 
371
- stream .string += "\n";
372
- stream .string += generator .Indent ();
373
- stream .string += field .getName ();
374
- stream .string += " ";
390
+ if (field .isInitializable ())
391
+ {
392
+ generator .string += generator .Space ();
375
393
 
376
- field .toVRMLStream (stream);
394
+ field .toVRMLStream (generator);
395
+ }
377
396
  }
378
397
  }
379
398
  },
380
- toVRMLStreamUserDefinedField: function (stream, field, fieldTypeLength, accessTypeLength)
399
+ toVRMLStreamField: function (generator, field)
381
400
  {
382
- const
383
- generator = Generator .Get (stream),
384
- sharedNode = generator .IsSharedNode (this);
401
+ const sharedNode = generator .IsSharedNode (this);
385
402
 
386
403
  if (field .getReferences () .size === 0 || !generator .ExecutionContext () || sharedNode)
387
404
  {
388
- stream .string += generator .Indent ();
389
- stream .string += generator .PadRight (generator .AccessType (field .getAccessType ()), accessTypeLength);
390
- stream .string += " ";
391
- stream .string += generator .PadRight (field .getTypeName (), fieldTypeLength);
392
- stream .string += " ";
393
- stream .string += field .getName ();
394
-
395
405
  if (field .isInitializable ())
396
406
  {
397
- stream .string += " ";
407
+ generator .string += generator .Indent ();
408
+ generator .string += field .getName ();
409
+ generator .string += generator .Space ();
398
410
 
399
- field .toVRMLStream (stream);
411
+ field .toVRMLStream (generator);
400
412
  }
401
413
  }
402
414
  else
@@ -409,49 +421,37 @@ X3DNode .prototype = Object .assign (Object .create (X3DBaseNode .prototype),
409
421
  {
410
422
  initializableReference = initializableReference || reference .isInitializable ();
411
423
 
412
- // Output user defined reference field
424
+ // Output build in reference field
413
425
 
414
- stream .string += generator .Indent ();
415
- stream .string += generator .PadRight (generator .AccessType (field .getAccessType ()), accessTypeLength);
416
- stream .string += " ";
417
- stream .string += generator .PadRight (field .getTypeName (), fieldTypeLength);
418
- stream .string += " ";
419
- stream .string += field .getName ();
420
- stream .string += " ";
421
- stream .string += "IS";
422
- stream .string += " ";
423
- stream .string += reference .getName ();
426
+ generator .string += generator .Indent ();
427
+ generator .string += field .getName ();
428
+ generator .string += generator .Space ();
429
+ generator .string += "IS";
430
+ generator .string += generator .Space ();
431
+ generator .string += reference .getName ();
424
432
 
425
433
  ++ index;
426
434
 
427
435
  if (index !== field .getReferences () .size)
428
- stream .string += "\n";
436
+ generator .string += generator .Break ();
429
437
  });
430
438
 
431
- if (field .getAccessType () === X3DConstants .inputOutput && !initializableReference && !field .isDefaultValue ())
439
+ if (field .getAccessType () === X3DConstants .inputOutput && !initializableReference && !this .isDefaultValue (field))
432
440
  {
433
- stream .string += "\n";
434
- stream .string += generator .Indent ();
435
- stream .string += generator .PadRight (generator .AccessType (field .getAccessType ()), accessTypeLength);
436
- stream .string += " ";
437
- stream .string += generator .PadRight (field .getTypeName (), fieldTypeLength);
438
- stream .string += " ";
439
- stream .string += field .getName ();
441
+ // Output build in field
440
442
 
441
- if (field .isInitializable ())
442
- {
443
- stream .string += " ";
443
+ generator .string += generator .Break ();
444
+ generator .string += generator .Indent ();
445
+ generator .string += field .getName ();
446
+ generator .string += generator .Space ();
444
447
 
445
- field .toVRMLStream (stream);
446
- }
448
+ field .toVRMLStream (generator);
447
449
  }
448
450
  }
449
451
  },
450
- toXMLStream: function (stream)
452
+ toXMLStream: function (generator)
451
453
  {
452
- const
453
- generator = Generator .Get (stream),
454
- sharedNode = generator .IsSharedNode (this);
454
+ const sharedNode = generator .IsSharedNode (this);
455
455
 
456
456
  generator .EnterScope ();
457
457
 
@@ -461,13 +461,13 @@ X3DNode .prototype = Object .assign (Object .create (X3DBaseNode .prototype),
461
461
  {
462
462
  if (generator .ExistsNode (this))
463
463
  {
464
- stream .string += generator .Indent ();
465
- stream .string += "<";
466
- stream .string += this .getTypeName ();
467
- stream .string += " ";
468
- stream .string += "USE='";
469
- stream .string += generator .XMLEncode (name);
470
- stream .string += "'";
464
+ generator .string += generator .Indent ();
465
+ generator .string += "<";
466
+ generator .string += this .getTypeName ();
467
+ generator .string += generator .Space ();
468
+ generator .string += "USE='";
469
+ generator .string += generator .XMLEncode (name);
470
+ generator .string += "'";
471
471
 
472
472
  const containerField = generator .ContainerField ();
473
473
 
@@ -475,32 +475,32 @@ X3DNode .prototype = Object .assign (Object .create (X3DBaseNode .prototype),
475
475
  {
476
476
  if (containerField .getName () !== this .getContainerField ())
477
477
  {
478
- stream .string += " ";
479
- stream .string += "containerField='";
480
- stream .string += generator .XMLEncode (containerField .getName ());
481
- stream .string += "'";
478
+ generator .string += generator .Space ();
479
+ generator .string += "containerField='";
480
+ generator .string += generator .XMLEncode (containerField .getName ());
481
+ generator .string += "'";
482
482
  }
483
483
  }
484
484
 
485
- stream .string += "/>";
485
+ generator .string += "/>";
486
486
 
487
487
  generator .LeaveScope ();
488
488
  return;
489
489
  }
490
490
  }
491
491
 
492
- stream .string += generator .Indent ();
493
- stream .string += "<";
494
- stream .string += this .getTypeName ();
492
+ generator .string += generator .Indent ();
493
+ generator .string += "<";
494
+ generator .string += this .getTypeName ();
495
495
 
496
496
  if (name .length)
497
497
  {
498
498
  generator .AddNode (this);
499
499
 
500
- stream .string += " ";
501
- stream .string += "DEF='";
502
- stream .string += generator .XMLEncode (name);
503
- stream .string += "'";
500
+ generator .string += generator .Space ();
501
+ generator .string += "DEF='";
502
+ generator .string += generator .XMLEncode (name);
503
+ generator .string += "'";
504
504
  }
505
505
 
506
506
  const containerField = generator .ContainerField ();
@@ -509,10 +509,10 @@ X3DNode .prototype = Object .assign (Object .create (X3DBaseNode .prototype),
509
509
  {
510
510
  if (containerField .getName () !== this .getContainerField ())
511
511
  {
512
- stream .string += " ";
513
- stream .string += "containerField='";
514
- stream .string += generator .XMLEncode (containerField .getName ());
515
- stream .string += "'";
512
+ generator .string += generator .Space ();
513
+ generator .string += "containerField='";
514
+ generator .string += generator .XMLEncode (containerField .getName ());
515
+ generator .string += "'";
516
516
  }
517
517
  }
518
518
 
@@ -578,14 +578,14 @@ X3DNode .prototype = Object .assign (Object .create (X3DBaseNode .prototype),
578
578
  if (field === cdata)
579
579
  break;
580
580
 
581
- stream .string += "\n";
582
- stream .string += generator .Indent ();
583
- stream .string += field .getName ();
584
- stream .string += "='";
581
+ generator .string += generator .AttribBreak ();
582
+ generator .string += generator .ListIndent ();
583
+ generator .string += field .getName ();
584
+ generator .string += "='";
585
585
 
586
- field .toXMLStream (stream);
586
+ field .toXMLStream (generator);
587
587
 
588
- stream .string += "'";
588
+ generator .string += "'";
589
589
  break;
590
590
  }
591
591
  }
@@ -602,11 +602,12 @@ X3DNode .prototype = Object .assign (Object .create (X3DBaseNode .prototype),
602
602
 
603
603
  if ((!this .canUserDefinedFields () || !userDefinedFields .length) && (!references .length || sharedNode) && !childNodes .length && !cdata)
604
604
  {
605
- stream .string += "/>";
605
+ generator .string += "/>";
606
606
  }
607
607
  else
608
608
  {
609
- stream .string += ">\n";
609
+ generator .string += ">";
610
+ generator .string += generator .TidyBreak ();
610
611
 
611
612
  generator .IncIndent ();
612
613
 
@@ -614,20 +615,20 @@ X3DNode .prototype = Object .assign (Object .create (X3DBaseNode .prototype),
614
615
  {
615
616
  for (const field of userDefinedFields)
616
617
  {
617
- stream .string += generator .Indent ();
618
- stream .string += "<field";
619
- stream .string += " ";
620
- stream .string += "accessType='";
621
- stream .string += generator .AccessType (field .getAccessType ());
622
- stream .string += "'";
623
- stream .string += " ";
624
- stream .string += "type='";
625
- stream .string += field .getTypeName ();
626
- stream .string += "'";
627
- stream .string += " ";
628
- stream .string += "name='";
629
- stream .string += generator .XMLEncode (field .getName ());
630
- stream .string += "'";
618
+ generator .string += generator .Indent ();
619
+ generator .string += "<field";
620
+ generator .string += generator .Space ();
621
+ generator .string += "accessType='";
622
+ generator .string += generator .AccessType (field .getAccessType ());
623
+ generator .string += "'";
624
+ generator .string += generator .Space ();
625
+ generator .string += "type='";
626
+ generator .string += field .getTypeName ();
627
+ generator .string += "'";
628
+ generator .string += generator .Space ();
629
+ generator .string += "name='";
630
+ generator .string += generator .XMLEncode (field .getName ());
631
+ generator .string += "'";
631
632
 
632
633
  // If the field is a inputOutput and we have as reference only inputOnly or outputOnly we must output the value
633
634
  // for this field.
@@ -654,7 +655,8 @@ X3DNode .prototype = Object .assign (Object .create (X3DBaseNode .prototype),
654
655
 
655
656
  if (!field .isInitializable () || field .isDefaultValue ())
656
657
  {
657
- stream .string += "/>\n";
658
+ generator .string += "/>";
659
+ generator .string += generator .TidyBreak ();
658
660
  }
659
661
  else
660
662
  {
@@ -667,31 +669,34 @@ X3DNode .prototype = Object .assign (Object .create (X3DBaseNode .prototype),
667
669
  {
668
670
  generator .PushContainerField (field);
669
671
 
670
- stream .string += ">\n";
672
+ generator .string += ">";
673
+ generator .string += generator .TidyBreak ();
671
674
 
672
675
  generator .IncIndent ();
673
676
 
674
- field .toXMLStream (stream);
677
+ field .toXMLStream (generator);
675
678
 
676
- stream .string += "\n";
679
+ generator .string += generator .TidyBreak ();
677
680
 
678
681
  generator .DecIndent ();
679
682
 
680
- stream .string += generator .Indent ();
681
- stream .string += "</field>\n";
683
+ generator .string += generator .Indent ();
684
+ generator .string += "</field>";
685
+ generator .string += generator .TidyBreak ();
682
686
 
683
687
  generator .PopContainerField ();
684
688
  break;
685
689
  }
686
690
  default:
687
691
  {
688
- stream .string += " ";
689
- stream .string += "value='";
692
+ generator .string += generator .Space ();
693
+ generator .string += "value='";
690
694
 
691
- field .toXMLStream (stream);
695
+ field .toXMLStream (generator);
692
696
 
693
- stream .string += "'";
694
- stream .string += "/>\n";
697
+ generator .string += "'";
698
+ generator .string += "/>";
699
+ generator .string += generator .TidyBreak ();
695
700
  break;
696
701
  }
697
702
  }
@@ -702,16 +707,17 @@ X3DNode .prototype = Object .assign (Object .create (X3DBaseNode .prototype),
702
707
  if (generator .ExecutionContext ())
703
708
  references .push (field);
704
709
 
705
- stream .string += "/>\n";
710
+ generator .string += "/>";
711
+ generator .string += generator .TidyBreak ();
706
712
  }
707
713
  }
708
714
  }
709
715
 
710
716
  if (references .length && !sharedNode)
711
717
  {
712
- stream .string += generator .Indent ();
713
- stream .string += "<IS>";
714
- stream .string += "\n";
718
+ generator .string += generator .Indent ();
719
+ generator .string += "<IS>";
720
+ generator .string += generator .TidyBreak ();
715
721
 
716
722
  generator .IncIndent ();
717
723
 
@@ -721,33 +727,35 @@ X3DNode .prototype = Object .assign (Object .create (X3DBaseNode .prototype),
721
727
 
722
728
  protoFields .forEach (function (protoField)
723
729
  {
724
- stream .string += generator .Indent ();
725
- stream .string += "<connect";
726
- stream .string += " ";
727
- stream .string += "nodeField='";
728
- stream .string += generator .XMLEncode (field .getName ());
729
- stream .string += "'";
730
- stream .string += " ";
731
- stream .string += "protoField='";
732
- stream .string += generator .XMLEncode (protoField .getName ());
733
- stream .string += "'";
734
- stream .string += "/>\n";
730
+ generator .string += generator .Indent ();
731
+ generator .string += "<connect";
732
+ generator .string += generator .Space ();
733
+ generator .string += "nodeField='";
734
+ generator .string += generator .XMLEncode (field .getName ());
735
+ generator .string += "'";
736
+ generator .string += generator .Space ();
737
+ generator .string += "protoField='";
738
+ generator .string += generator .XMLEncode (protoField .getName ());
739
+ generator .string += "'";
740
+ generator .string += "/>";
741
+ generator .string += generator .TidyBreak ();
735
742
  });
736
743
  }
737
744
 
738
745
  generator .DecIndent ();
739
746
 
740
- stream .string += generator .Indent ();
741
- stream .string += "</IS>\n";
747
+ generator .string += generator .Indent ();
748
+ generator .string += "</IS>";
749
+ generator .string += generator .TidyBreak ();
742
750
  }
743
751
 
744
752
  for (const field of childNodes)
745
753
  {
746
754
  generator .PushContainerField (field);
747
755
 
748
- field .toXMLStream (stream);
756
+ field .toXMLStream (generator);
749
757
 
750
- stream .string += "\n";
758
+ generator .string += generator .TidyBreak ();
751
759
 
752
760
  generator .PopContainerField ();
753
761
  }
@@ -756,18 +764,19 @@ X3DNode .prototype = Object .assign (Object .create (X3DBaseNode .prototype),
756
764
  {
757
765
  for (const value of cdata)
758
766
  {
759
- stream .string += "<![CDATA[";
760
- stream .string += generator .escapeCDATA (value);
761
- stream .string += "]]>\n";
767
+ generator .string += "<![CDATA[";
768
+ generator .string += generator .escapeCDATA (value);
769
+ generator .string += "]]>";
770
+ generator .string += generator .TidyBreak ();
762
771
  }
763
772
  }
764
773
 
765
774
  generator .DecIndent ();
766
775
 
767
- stream .string += generator .Indent ();
768
- stream .string += "</";
769
- stream .string += this .getTypeName ();
770
- stream .string += ">";
776
+ generator .string += generator .Indent ();
777
+ generator .string += "</";
778
+ generator .string += this .getTypeName ();
779
+ generator .string += ">";
771
780
  }
772
781
 
773
782
  generator .LeaveScope ();