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
@@ -49,7 +49,6 @@ import X3DChildObject from "../../Base/X3DChildObject.js";
49
49
  import X3DNode from "./X3DNode.js";
50
50
  import X3DExecutionContext from "../../Execution/X3DExecutionContext.js";
51
51
  import X3DConstants from "../../Base/X3DConstants.js";
52
- import Generator from "../../InputOutput/Generator.js";
53
52
 
54
53
  const
55
54
  _protoNode = Symbol (),
@@ -86,6 +85,23 @@ X3DPrototypeInstance .prototype = Object .assign (Object .create (X3DNode .proto
86
85
  },
87
86
  getContainerField: function ()
88
87
  {
88
+ // Determine container field from proto.
89
+
90
+ // const proto = this [_protoNode];
91
+
92
+ // if (! proto .isExternProto)
93
+ // {
94
+ // const rootNodes = proto .getBody () .getRootNodes ();
95
+
96
+ // if (rootNodes .length)
97
+ // {
98
+ // const rootNode = rootNodes [0];
99
+
100
+ // if (rootNode)
101
+ // return rootNode .getValue () .getContainerField ();
102
+ // }
103
+ // }
104
+
89
105
  return "children";
90
106
  },
91
107
  initialize: function ()
@@ -361,11 +377,9 @@ X3DPrototypeInstance .prototype = Object .assign (Object .create (X3DNode .proto
361
377
  }
362
378
  }
363
379
  },
364
- toXMLStream: function (stream)
380
+ toXMLStream: function (generator)
365
381
  {
366
- const
367
- generator = Generator .Get (stream),
368
- sharedNode = generator .IsSharedNode (this);
382
+ const sharedNode = generator .IsSharedNode (this);
369
383
 
370
384
  generator .EnterScope ();
371
385
 
@@ -375,16 +389,16 @@ X3DPrototypeInstance .prototype = Object .assign (Object .create (X3DNode .proto
375
389
  {
376
390
  if (generator .ExistsNode (this))
377
391
  {
378
- stream .string += generator .Indent ();
379
- stream .string += "<ProtoInstance";
380
- stream .string += " ";
381
- stream .string += "name='";
382
- stream .string += generator .XMLEncode (this .getTypeName ());
383
- stream .string += "'";
384
- stream .string += " ";
385
- stream .string += "USE='";
386
- stream .string += generator .XMLEncode (name);
387
- stream .string += "'";
392
+ generator .string += generator .Indent ();
393
+ generator .string += "<ProtoInstance";
394
+ generator .string += generator .Space ();
395
+ generator .string += "name='";
396
+ generator .string += generator .XMLEncode (this .getTypeName ());
397
+ generator .string += "'";
398
+ generator .string += generator .Space ();
399
+ generator .string += "USE='";
400
+ generator .string += generator .XMLEncode (name);
401
+ generator .string += "'";
388
402
 
389
403
  const containerField = generator .ContainerField ();
390
404
 
@@ -392,35 +406,35 @@ X3DPrototypeInstance .prototype = Object .assign (Object .create (X3DNode .proto
392
406
  {
393
407
  if (containerField .getName () !== this .getContainerField ())
394
408
  {
395
- stream .string += " ";
396
- stream .string += "containerField='";
397
- stream .string += generator .XMLEncode (containerField .getName ());
398
- stream .string += "'";
409
+ generator .string += generator .Space ();
410
+ generator .string += "containerField='";
411
+ generator .string += generator .XMLEncode (containerField .getName ());
412
+ generator .string += "'";
399
413
  }
400
414
  }
401
415
 
402
- stream .string += "/>";
416
+ generator .string += "/>";
403
417
 
404
418
  generator .LeaveScope ();
405
419
  return;
406
420
  }
407
421
  }
408
422
 
409
- stream .string += generator .Indent ();
410
- stream .string += "<ProtoInstance";
411
- stream .string += " ";
412
- stream .string += "name='";
413
- stream .string += generator .XMLEncode (this .getTypeName ());
414
- stream .string += "'";
423
+ generator .string += generator .Indent ();
424
+ generator .string += "<ProtoInstance";
425
+ generator .string += generator .Space ();
426
+ generator .string += "name='";
427
+ generator .string += generator .XMLEncode (this .getTypeName ());
428
+ generator .string += "'";
415
429
 
416
430
  if (name .length)
417
431
  {
418
432
  generator .AddNode (this);
419
433
 
420
- stream .string += " ";
421
- stream .string += "DEF='";
422
- stream .string += generator .XMLEncode (name);
423
- stream .string += "'";
434
+ generator .string += generator .Space ();
435
+ generator .string += "DEF='";
436
+ generator .string += generator .XMLEncode (name);
437
+ generator .string += "'";
424
438
  }
425
439
 
426
440
  const containerField = generator .ContainerField ();
@@ -429,10 +443,10 @@ X3DPrototypeInstance .prototype = Object .assign (Object .create (X3DNode .proto
429
443
  {
430
444
  if (containerField .getName () !== this .getContainerField ())
431
445
  {
432
- stream .string += " ";
433
- stream .string += "containerField='";
434
- stream .string += generator .XMLEncode (containerField .getName ());
435
- stream .string += "'";
446
+ generator .string += generator .Space ();
447
+ generator .string += "containerField='";
448
+ generator .string += generator .XMLEncode (containerField .getName ());
449
+ generator .string += "'";
436
450
  }
437
451
  }
438
452
 
@@ -440,11 +454,12 @@ X3DPrototypeInstance .prototype = Object .assign (Object .create (X3DNode .proto
440
454
 
441
455
  if (fields .length === 0)
442
456
  {
443
- stream .string += "/>";
457
+ generator .string += "/>";
444
458
  }
445
459
  else
446
460
  {
447
- stream .string += ">\n";
461
+ generator .string += ">";
462
+ generator .string += generator .TidyBreak ();
448
463
 
449
464
  generator .IncIndent ();
450
465
 
@@ -461,14 +476,7 @@ X3DPrototypeInstance .prototype = Object .assign (Object .create (X3DNode .proto
461
476
  {
462
477
  if (field .getAccessType () === X3DConstants .inputOutput && field .getReferences () .size !== 0)
463
478
  {
464
- let initializableReference = false;
465
-
466
- field .getReferences () .forEach (function (fieldReference)
467
- {
468
- initializableReference = initializableReference || fieldReference .isInitializable ();
469
- });
470
-
471
- if (!initializableReference)
479
+ if (![... field .getReferences ()] .some (reference => reference .isInitializable ()))
472
480
  mustOutputValue = !this .isDefaultValue (field);
473
481
  }
474
482
  }
@@ -485,33 +493,36 @@ X3DPrototypeInstance .prototype = Object .assign (Object .create (X3DNode .proto
485
493
  {
486
494
  case X3DConstants .MFNode:
487
495
  {
488
- stream .string += generator .Indent ();
489
- stream .string += "<fieldValue";
490
- stream .string += " ";
491
- stream .string += "name='";
492
- stream .string += generator .XMLEncode (field .getName ());
493
- stream .string += "'";
496
+ generator .string += generator .Indent ();
497
+ generator .string += "<fieldValue";
498
+ generator .string += generator .Space ();
499
+ generator .string += "name='";
500
+ generator .string += generator .XMLEncode (field .getName ());
501
+ generator .string += "'";
494
502
 
495
503
  if (field .length === 0)
496
504
  {
497
- stream .string += "/>\n";
505
+ generator .string += "/>";
506
+ generator .string += generator .TidyBreak ();
498
507
  }
499
508
  else
500
509
  {
501
510
  generator .PushContainerField (field);
502
511
 
503
- stream .string += ">\n";
512
+ generator .string += ">";
513
+ generator .string += generator .TidyBreak ();
504
514
 
505
515
  generator .IncIndent ();
506
516
 
507
- field .toXMLStream (stream);
517
+ field .toXMLStream (generator);
508
518
 
509
- stream .string += "\n";
519
+ generator .string += generator .TidyBreak ();
510
520
 
511
521
  generator .DecIndent ();
512
522
 
513
- stream .string += generator .Indent ();
514
- stream .string += "</fieldValue>\n";
523
+ generator .string += generator .Indent ();
524
+ generator .string += "</fieldValue>";
525
+ generator .string += generator .TidyBreak ();
515
526
 
516
527
  generator .PopContainerField ();
517
528
  }
@@ -524,24 +535,26 @@ X3DPrototypeInstance .prototype = Object .assign (Object .create (X3DNode .proto
524
535
  {
525
536
  generator .PushContainerField (field);
526
537
 
527
- stream .string += generator .Indent ();
528
- stream .string += "<fieldValue";
529
- stream .string += " ";
530
- stream .string += "name='";
531
- stream .string += generator .XMLEncode (field .getName ());
532
- stream .string += "'";
533
- stream .string += ">\n";
538
+ generator .string += generator .Indent ();
539
+ generator .string += "<fieldValue";
540
+ generator .string += generator .Space ();
541
+ generator .string += "name='";
542
+ generator .string += generator .XMLEncode (field .getName ());
543
+ generator .string += "'";
544
+ generator .string += ">";
545
+ generator .string += generator .TidyBreak ();
534
546
 
535
547
  generator .IncIndent ();
536
548
 
537
- field .toXMLStream (stream);
549
+ field .toXMLStream (generator);
538
550
 
539
- stream .string += "\n";
551
+ generator .string += generator .TidyBreak ();
540
552
 
541
553
  generator .DecIndent ();
542
554
 
543
- stream .string += generator .Indent ();
544
- stream .string += "</fieldValue>\n";
555
+ generator .string += generator .Indent ();
556
+ generator .string += "</fieldValue>";
557
+ generator .string += generator .TidyBreak ();
545
558
 
546
559
  generator .PopContainerField ();
547
560
  break;
@@ -551,19 +564,20 @@ X3DPrototypeInstance .prototype = Object .assign (Object .create (X3DNode .proto
551
564
  }
552
565
  default:
553
566
  {
554
- stream .string += generator .Indent ();
555
- stream .string += "<fieldValue";
556
- stream .string += " ";
557
- stream .string += "name='";
558
- stream .string += generator .XMLEncode (field .getName ());
559
- stream .string += "'";
560
- stream .string += " ";
561
- stream .string += "value='";
562
-
563
- field .toXMLStream (stream);
564
-
565
- stream .string += "'";
566
- stream .string += "/>\n";
567
+ generator .string += generator .Indent ();
568
+ generator .string += "<fieldValue";
569
+ generator .string += generator .Space ();
570
+ generator .string += "name='";
571
+ generator .string += generator .XMLEncode (field .getName ());
572
+ generator .string += "'";
573
+ generator .string += generator .Space ();
574
+ generator .string += "value='";
575
+
576
+ field .toXMLStream (generator);
577
+
578
+ generator .string += "'";
579
+ generator .string += "/>";
580
+ generator .string += generator .TidyBreak ();
567
581
  break;
568
582
  }
569
583
  }
@@ -576,9 +590,9 @@ X3DPrototypeInstance .prototype = Object .assign (Object .create (X3DNode .proto
576
590
 
577
591
  if (references .length && ! sharedNode)
578
592
  {
579
- stream .string += generator .Indent ();
580
- stream .string += "<IS>";
581
- stream .string += "\n";
593
+ generator .string += generator .Indent ();
594
+ generator .string += "<IS>";
595
+ generator .string += generator .TidyBreak ();
582
596
 
583
597
  generator .IncIndent ();
584
598
 
@@ -586,36 +600,406 @@ X3DPrototypeInstance .prototype = Object .assign (Object .create (X3DNode .proto
586
600
  {
587
601
  const protoFields = field .getReferences ();
588
602
 
589
- protoFields .forEach (function (protoField)
603
+ for (const protoField of protoFields)
590
604
  {
591
- stream .string += generator .Indent ();
592
- stream .string += "<connect";
593
- stream .string += " ";
594
- stream .string += "nodeField='";
595
- stream .string += generator .XMLEncode (field .getName ());
596
- stream .string += "'";
597
- stream .string += " ";
598
- stream .string += "protoField='";
599
- stream .string += generator .XMLEncode (protoField .getName ());
600
- stream .string += "'";
601
- stream .string += "/>\n";
602
- });
605
+ generator .string += generator .Indent ();
606
+ generator .string += "<connect";
607
+ generator .string += generator .Space ();
608
+ generator .string += "nodeField='";
609
+ generator .string += generator .XMLEncode (field .getName ());
610
+ generator .string += "'";
611
+ generator .string += generator .Space ();
612
+ generator .string += "protoField='";
613
+ generator .string += generator .XMLEncode (protoField .getName ());
614
+ generator .string += "'";
615
+ generator .string += "/>";
616
+ generator .string += generator .TidyBreak ();
617
+ }
603
618
  }
604
619
 
605
620
  generator .DecIndent ();
606
621
 
607
- stream .string += generator .Indent ();
608
- stream .string += "</IS>\n";
622
+ generator .string += generator .Indent ();
623
+ generator .string += "</IS>";
624
+ generator .string += generator .TidyBreak ();
609
625
  }
610
626
 
611
627
  generator .DecIndent ();
612
628
 
613
- stream .string += generator .Indent ();
614
- stream .string += "</ProtoInstance>";
629
+ generator .string += generator .Indent ();
630
+ generator .string += "</ProtoInstance>";
615
631
  }
616
632
 
617
633
  generator .LeaveScope ();
618
634
  },
635
+ toJSONStream: function (generator)
636
+ {
637
+ const sharedNode = generator .IsSharedNode (this);
638
+
639
+ generator .EnterScope ();
640
+
641
+ const name = generator .Name (this);
642
+
643
+ if (name .length)
644
+ {
645
+ if (generator .ExistsNode (this))
646
+ {
647
+ generator .string += '{';
648
+ generator .string += generator .TidySpace ();
649
+ generator .string += '"';
650
+ generator .string += "ProtoInstance";
651
+ generator .string += '"';
652
+ generator .string += ':';
653
+ generator .string += generator .TidyBreak ();
654
+ generator .string += generator .IncIndent ();
655
+ generator .string += generator .Indent ();
656
+ generator .string += '{';
657
+ generator .string += generator .TidyBreak ();
658
+ generator .string += generator .IncIndent ();
659
+
660
+ generator .string += generator .Indent ();
661
+ generator .string += '"';
662
+ generator .string += "@name";
663
+ generator .string += '"';
664
+ generator .string += ':';
665
+ generator .string += generator .TidySpace ();
666
+ generator .string += generator .JSONEncode (this .getTypeName ());
667
+ generator .string += ',';
668
+ generator .string += generator .TidyBreak ();
669
+
670
+ generator .string += generator .Indent ();
671
+ generator .string += '"';
672
+ generator .string += "@USE";
673
+ generator .string += '"';
674
+ generator .string += ':';
675
+ generator .string += generator .TidySpace ();
676
+ generator .string += generator .JSONEncode (name);
677
+ generator .string += generator .TidyBreak ();
678
+
679
+ generator .string += generator .DecIndent ();
680
+ generator .string += generator .Indent ();
681
+ generator .string += '}';
682
+ generator .string += generator .TidyBreak ();
683
+ generator .string += generator .DecIndent ();
684
+ generator .string += generator .Indent ();
685
+ generator .string += '}';
686
+
687
+ generator .LeaveScope ();
688
+ return;
689
+ }
690
+ }
691
+
692
+ // Type name
693
+
694
+ generator .string += '{';
695
+ generator .string += generator .TidySpace ();
696
+ generator .string += '"';
697
+ generator .string += "ProtoInstance";
698
+ generator .string += '"';
699
+ generator .string += ':';
700
+ generator .string += generator .TidyBreak ();
701
+ generator .string += generator .IncIndent ();
702
+ generator .string += generator .Indent ();
703
+ generator .string += '{';
704
+ generator .string += generator .TidyBreak ();
705
+ generator .string += generator .IncIndent ();
706
+
707
+
708
+ // DEF name
709
+
710
+ if (name .length)
711
+ {
712
+ generator .AddNode (this);
713
+
714
+ generator .string += generator .Indent ();
715
+ generator .string += '"';
716
+ generator .string += "@DEF";
717
+ generator .string += '"';
718
+ generator .string += ':';
719
+ generator .string += generator .TidySpace ();
720
+ generator .string += generator .JSONEncode (name);
721
+ generator .string += ',';
722
+ generator .string += generator .TidyBreak ();
723
+ }
724
+
725
+
726
+ // Type name
727
+
728
+ generator .string += generator .Indent ();
729
+ generator .string += '"';
730
+ generator .string += "@name";
731
+ generator .string += '"';
732
+ generator .string += ':';
733
+ generator .string += generator .TidySpace ();
734
+ generator .string += generator .JSONEncode (this .getTypeName ());
735
+ generator .string += ',';
736
+ generator .string += generator .TidyBreak ();
737
+
738
+
739
+ // Fields
740
+
741
+ const
742
+ fields = this .getChangedFields (),
743
+ references = [ ];
744
+
745
+ if (fields .length)
746
+ {
747
+ generator .string += generator .Indent ();
748
+ generator .string += '"';
749
+ generator .string += "fieldValue";
750
+ generator .string += '"';
751
+ generator .string += ':';
752
+ generator .string += generator .TidySpace ();
753
+ generator .string += '[';
754
+ generator .string += generator .TidyBreak ();
755
+ generator .string += generator .IncIndent ();
756
+
757
+ const outputFields = [ ];
758
+
759
+ for (const field of fields)
760
+ {
761
+ // If the field is a inputOutput and we have as reference only inputOnly or outputOnly we must output the value
762
+ // for this field.
763
+
764
+ let mustOutputValue = false;
765
+
766
+ if (generator .ExecutionContext ())
767
+ {
768
+ if (field .getAccessType () === X3DConstants .inputOutput && field .getReferences () .size !== 0)
769
+ {
770
+ if (![... field .getReferences ()] .some (reference => reference .isInitializable ()))
771
+ mustOutputValue = !this .isDefaultValue (field);
772
+ }
773
+ }
774
+
775
+ // If we have no execution context we are not in a proto and must not generate IS references the same is true
776
+ // if the node is a shared node as the node does not belong to the execution context.
777
+
778
+ if (field .getReferences () .size === 0 || !generator .ExecutionContext () || sharedNode || mustOutputValue)
779
+ {
780
+ if (mustOutputValue)
781
+ references .push (field);
782
+
783
+ outputFields .push (field);
784
+ }
785
+ else
786
+ {
787
+ references .push (field);
788
+ }
789
+ }
790
+
791
+ for (const field of outputFields)
792
+ {
793
+ switch (field .getType ())
794
+ {
795
+ case X3DConstants .SFNode:
796
+ {
797
+ generator .string += generator .Indent ();
798
+ generator .string += '{';
799
+ generator .string += generator .TidyBreak ();
800
+ generator .string += generator .IncIndent ();
801
+ generator .string += generator .Indent ();
802
+ generator .string += '"';
803
+ generator .string += "@name";
804
+ generator .string += '"';
805
+ generator .string += ':';
806
+ generator .string += generator .TidySpace ();
807
+ generator .string += generator .JSONEncode (field .getName ());
808
+ generator .string += ',';
809
+ generator .string += generator .TidyBreak ();
810
+ generator .string += generator .Indent ();
811
+ generator .string += '"';
812
+ generator .string += "-children";
813
+ generator .string += '"';
814
+ generator .string += ':';
815
+ generator .string += generator .TidySpace ();
816
+ generator .string += '[';
817
+ generator .string += generator .TidyBreak ();
818
+ generator .string += generator .IncIndent ();
819
+ generator .string += generator .Indent ();
820
+
821
+ field .toJSONStream (generator);
822
+
823
+ generator .string += generator .TidyBreak ();
824
+ generator .string += generator .DecIndent ();
825
+ generator .string += generator .Indent ();
826
+ generator .string += ']';
827
+ generator .string += generator .TidyBreak ();
828
+ generator .string += generator .DecIndent ();
829
+ generator .string += generator .Indent ();
830
+ generator .string += '}';
831
+ break;
832
+ }
833
+ case X3DConstants .MFNode:
834
+ {
835
+ generator .string += generator .Indent ();
836
+ generator .string += '{';
837
+ generator .string += generator .TidyBreak ();
838
+ generator .string += generator .IncIndent ();
839
+ generator .string += generator .Indent ();
840
+ generator .string += '"';
841
+ generator .string += "@name";
842
+ generator .string += '"';
843
+ generator .string += ':';
844
+ generator .string += generator .TidySpace ();
845
+ generator .string += generator .JSONEncode (field .getName ());
846
+ generator .string += ',';
847
+ generator .string += generator .TidyBreak ();
848
+ generator .string += generator .Indent ();
849
+ generator .string += '"';
850
+ generator .string += "-children";
851
+ generator .string += '"';
852
+ generator .string += ':';
853
+ generator .string += generator .TidySpace ();
854
+
855
+ field .toJSONStream (generator);
856
+
857
+ generator .string += generator .TidyBreak ();
858
+ generator .string += generator .DecIndent ();
859
+ generator .string += generator .Indent ();
860
+ generator .string += '}';
861
+ break;
862
+ }
863
+ default:
864
+ {
865
+ generator .string += generator .Indent ();
866
+ generator .string += '{';
867
+ generator .string += generator .TidyBreak ();
868
+ generator .string += generator .IncIndent ();
869
+ generator .string += generator .Indent ();
870
+ generator .string += '"';
871
+ generator .string += "@name";
872
+ generator .string += '"';
873
+ generator .string += ':';
874
+ generator .string += generator .TidySpace ();
875
+ generator .string += generator .JSONEncode (field .getName ());
876
+ generator .string += ',';
877
+ generator .string += generator .TidyBreak ();
878
+ generator .string += generator .Indent ();
879
+ generator .string += '"';
880
+ generator .string += "@value";
881
+ generator .string += '"';
882
+ generator .string += ':';
883
+ generator .string += generator .TidySpace ();
884
+
885
+ field .toJSONStream (generator);
886
+
887
+ generator .string += generator .TidyBreak ();
888
+ generator .string += generator .DecIndent ();
889
+ generator .string += generator .Indent ();
890
+ generator .string += '}';
891
+ break;
892
+ }
893
+ }
894
+
895
+ if (field !== outputFields .at (-1))
896
+ generator .string += ',';
897
+
898
+ generator .string += generator .TidyBreak ();
899
+ }
900
+
901
+ generator .string += generator .DecIndent ();
902
+ generator .string += generator .Indent ();
903
+ generator .string += ']';
904
+ generator .string += ',';
905
+ generator .string += generator .TidyBreak ();
906
+
907
+
908
+ // IS references
909
+
910
+ if (references .length && ! sharedNode)
911
+ {
912
+ generator .string += generator .Indent ();
913
+ generator .string += '"';
914
+ generator .string += "IS";
915
+ generator .string += '"';
916
+ generator .string += ':';
917
+ generator .string += generator .TidySpace ();
918
+ generator .string += '{';
919
+ generator .string += generator .TidyBreak ();
920
+ generator .string += generator .IncIndent ();
921
+ generator .string += generator .Indent ();
922
+ generator .string += '"';
923
+ generator .string += "connect";
924
+ generator .string += '"';
925
+ generator .string += ':';
926
+ generator .string += generator .TidySpace ();
927
+ generator .string += '[';
928
+ generator .string += generator .TidyBreak ();
929
+ generator .string += generator .IncIndent ();
930
+
931
+ for (const field of references)
932
+ {
933
+ const protoFields = [... field .getReferences ()];
934
+
935
+ for (const protoField of protoFields)
936
+ {
937
+ generator .string += generator .Indent ();
938
+ generator .string += '{';
939
+ generator .string += generator .TidyBreak ();
940
+ generator .string += generator .IncIndent ();
941
+
942
+ generator .string += generator .Indent ();
943
+ generator .string += '"';
944
+ generator .string += "@nodeField";
945
+ generator .string += '"';
946
+ generator .string += ':';
947
+ generator .string += generator .TidySpace ();
948
+ generator .string += generator .JSONEncode (field .getName ());
949
+ generator .string += ',';
950
+ generator .string += generator .TidyBreak ();
951
+
952
+ generator .string += generator .Indent ();
953
+ generator .string += '"';
954
+ generator .string += "@protoField";
955
+ generator .string += '"';
956
+ generator .string += ':';
957
+ generator .string += generator .TidySpace ();
958
+ generator .string += generator .JSONEncode (protoField .getName ());
959
+ generator .string += generator .TidyBreak ();
960
+
961
+ generator .string += generator .DecIndent ();
962
+ generator .string += generator .Indent ();
963
+ generator .string += '}';
964
+
965
+ if (field === references .at (-1) && protoField === protoFields .at (-1))
966
+ ;
967
+ else
968
+ {
969
+ generator .string += ',';
970
+ }
971
+
972
+ generator .string += generator .TidyBreak ();
973
+ }
974
+ }
975
+
976
+ generator .string += generator .DecIndent ();
977
+ generator .string += generator .Indent ();
978
+ generator .string += ']';
979
+ generator .string += generator .TidyBreak ();
980
+ generator .string += generator .DecIndent ();
981
+ generator .string += generator .Indent ();
982
+ generator .string += '}';
983
+ generator .string += ',';
984
+ generator .string += generator .TidyBreak ();
985
+ }
986
+ }
987
+
988
+ generator .string = generator .string .replace (/,(\s*)$/s, "$1");
989
+
990
+
991
+ // End
992
+
993
+ generator .string += generator .DecIndent ();
994
+ generator .string += generator .Indent ();
995
+ generator .string += '}';
996
+ generator .string += generator .TidyBreak ();
997
+ generator .string += generator .DecIndent ();
998
+ generator .string += generator .Indent ();
999
+ generator .string += '}';
1000
+
1001
+ generator .LeaveScope ();
1002
+ },
619
1003
  dispose: function ()
620
1004
  {
621
1005
  this [_protoNode] ._updateInstances .removeInterest ("construct", this);