x_ite 8.3.3 → 8.4.1

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 (85) hide show
  1. package/dist/assets/components/Annotation.js +13 -13
  2. package/dist/assets/components/Annotation.min.js +1 -1
  3. package/dist/assets/components/CADGeometry.js +13 -13
  4. package/dist/assets/components/CADGeometry.min.js +1 -1
  5. package/dist/assets/components/CubeMapTexturing.js +25 -25
  6. package/dist/assets/components/CubeMapTexturing.min.js +1 -1
  7. package/dist/assets/components/DIS.js +13 -13
  8. package/dist/assets/components/DIS.min.js +1 -1
  9. package/dist/assets/components/EventUtilities.js +9 -9
  10. package/dist/assets/components/EventUtilities.min.js +1 -1
  11. package/dist/assets/components/Geometry2D.js +19 -19
  12. package/dist/assets/components/Geometry2D.min.js +1 -1
  13. package/dist/assets/components/Geospatial.js +33 -33
  14. package/dist/assets/components/Geospatial.min.js +1 -1
  15. package/dist/assets/components/HAnim.js +21 -19
  16. package/dist/assets/components/HAnim.min.js +1 -1
  17. package/dist/assets/components/KeyDeviceSensor.js +8 -8
  18. package/dist/assets/components/KeyDeviceSensor.min.js +1 -1
  19. package/dist/assets/components/Layout.js +27 -27
  20. package/dist/assets/components/Layout.min.js +1 -1
  21. package/dist/assets/components/NURBS.js +24 -24
  22. package/dist/assets/components/NURBS.min.js +1 -1
  23. package/dist/assets/components/ParticleSystems.js +23 -23
  24. package/dist/assets/components/ParticleSystems.min.js +1 -1
  25. package/dist/assets/components/Picking.js +19 -19
  26. package/dist/assets/components/Picking.min.js +1 -1
  27. package/dist/assets/components/RigidBodyPhysics.js +17 -17
  28. package/dist/assets/components/RigidBodyPhysics.min.js +1 -1
  29. package/dist/assets/components/Scripting.js +28 -28
  30. package/dist/assets/components/Scripting.min.js +1 -1
  31. package/dist/assets/components/Text.js +24 -24
  32. package/dist/assets/components/Text.min.js +1 -1
  33. package/dist/assets/components/TextureProjector.js +14 -14
  34. package/dist/assets/components/TextureProjector.min.js +1 -1
  35. package/dist/assets/components/Texturing3D.js +27 -27
  36. package/dist/assets/components/Texturing3D.min.js +1 -1
  37. package/dist/assets/components/VolumeRendering.js +19 -19
  38. package/dist/assets/components/VolumeRendering.min.js +1 -1
  39. package/dist/assets/components/X_ITE.js +9 -9
  40. package/dist/assets/components/X_ITE.min.js +1 -1
  41. package/dist/x_ite.css +1 -1
  42. package/dist/x_ite.js +2711 -292
  43. package/dist/x_ite.min.js +1 -1
  44. package/dist/x_ite.zip +0 -0
  45. package/docs/_config.yml +2 -2
  46. package/docs/_posts/reference/field-services-and-objects.md +24 -4
  47. package/docs/_posts/reference/prototype-services.md +24 -4
  48. package/docs/_posts/reference/scene-services.md +9 -4
  49. package/docs/_posts/what's-new.md +11 -1
  50. package/package.json +1 -1
  51. package/src/x_ite/Base/X3DInfoArray.js +26 -0
  52. package/src/x_ite/Base/X3DObject.js +1 -1
  53. package/src/x_ite/Base/X3DObjectArrayField.js +44 -0
  54. package/src/x_ite/Base/X3DTypedArrayField.js +74 -0
  55. package/src/x_ite/Browser/VERSION.js +1 -1
  56. package/src/x_ite/Components/Core/X3DNode.js +486 -23
  57. package/src/x_ite/Components/Core/X3DPrototypeInstance.js +371 -10
  58. package/src/x_ite/Components/HAnim/HAnimHumanoid.js +3 -1
  59. package/src/x_ite/Components/Rendering/X3DGeometryNode.js +6 -3
  60. package/src/x_ite/Configuration/ComponentInfo.js +32 -0
  61. package/src/x_ite/Configuration/ProfileInfo.js +4 -0
  62. package/src/x_ite/Configuration/UnitInfo.js +46 -0
  63. package/src/x_ite/Execution/X3DExecutionContext.js +54 -0
  64. package/src/x_ite/Execution/X3DExportedNode.js +52 -0
  65. package/src/x_ite/Execution/X3DImportedNode.js +164 -0
  66. package/src/x_ite/Execution/X3DScene.js +339 -0
  67. package/src/x_ite/Fields/ArrayFields.js +48 -0
  68. package/src/x_ite/Fields/SFBool.js +8 -0
  69. package/src/x_ite/Fields/SFColor.js +26 -1
  70. package/src/x_ite/Fields/SFColorRGBA.js +2 -0
  71. package/src/x_ite/Fields/SFDouble.js +10 -0
  72. package/src/x_ite/Fields/SFFloat.js +10 -0
  73. package/src/x_ite/Fields/SFImage.js +61 -1
  74. package/src/x_ite/Fields/SFInt32.js +11 -3
  75. package/src/x_ite/Fields/SFMatrixPrototypeTemplate.js +26 -1
  76. package/src/x_ite/Fields/SFNode.js +40 -25
  77. package/src/x_ite/Fields/SFRotation.js +28 -3
  78. package/src/x_ite/Fields/SFString.js +8 -0
  79. package/src/x_ite/Fields/SFTime.js +8 -0
  80. package/src/x_ite/Fields/SFVecPrototypeTemplate.js +30 -4
  81. package/src/x_ite/InputOutput/Generator.js +63 -2
  82. package/src/x_ite/Parser/JSONParser.js +1 -1
  83. package/src/x_ite/Prototype/X3DExternProtoDeclaration.js +123 -0
  84. package/src/x_ite/Prototype/X3DProtoDeclaration.js +228 -0
  85. package/src/x_ite/Routing/X3DRoute.js +67 -0
@@ -240,7 +240,9 @@ X3DImportedNode .prototype = Object .assign (Object .create (X3DNode .prototype)
240
240
  }
241
241
  }
242
242
  else
243
+ {
243
244
  throw new Error ("X3DImportedNode.toXMLStream: Inline node does not exist.");
245
+ }
244
246
  },
245
247
  toXMLStream: function (generator)
246
248
  {
@@ -320,7 +322,169 @@ X3DImportedNode .prototype = Object .assign (Object .create (X3DNode .prototype)
320
322
  }
321
323
  }
322
324
  else
325
+ {
323
326
  throw new Error ("X3DImportedNode.toXMLStream: Inline node does not exist.");
327
+ }
328
+ },
329
+ toJSONStream: function (generator)
330
+ {
331
+ if (generator .ExistsNode (this .getInlineNode ()))
332
+ {
333
+ generator .string += generator .Indent ();
334
+ generator .string += '{';
335
+ generator .string += generator .TidySpace ();
336
+ generator .string += '"';
337
+ generator .string += "IMPORT";
338
+ generator .string += '"';
339
+ generator .string += ':';
340
+ generator .string += generator .TidyBreak ();
341
+ generator .string += generator .IncIndent ();
342
+ generator .string += generator .Indent ();
343
+ generator .string += '{';
344
+ generator .string += generator .TidyBreak ();
345
+ generator .string += generator .IncIndent ();
346
+
347
+ generator .string += generator .Indent ();
348
+ generator .string += '"';
349
+ generator .string += "@inlineDEF";
350
+ generator .string += '"';
351
+ generator .string += ':';
352
+ generator .string += generator .TidySpace ();
353
+ generator .string += generator .JSONEncode (generator .Name (this .getInlineNode ()));
354
+ generator .string += ',';
355
+ generator .string += generator .TidyBreak ();
356
+
357
+ generator .string += generator .Indent ();
358
+ generator .string += '"';
359
+ generator .string += "@importedDEF";
360
+ generator .string += '"';
361
+ generator .string += ':';
362
+ generator .string += generator .TidySpace ();
363
+ generator .string += generator .JSONEncode (this .getExportedName ());
364
+
365
+ if (this .getImportedName () !== this .getExportedName ())
366
+ {
367
+ generator .string += ',';
368
+ generator .string += generator .TidyBreak ();
369
+ generator .string += generator .Indent ();
370
+ generator .string += '"';
371
+ generator .string += "@AS";
372
+ generator .string += '"';
373
+ generator .string += ':';
374
+ generator .string += generator .TidySpace ();
375
+ generator .string += generator .JSONEncode (this .getImportedName ());
376
+ generator .string += generator .TidyBreak ();
377
+ }
378
+ else
379
+ {
380
+ generator .string += generator .TidyBreak ();
381
+ }
382
+
383
+ generator .string += generator .DecIndent ();
384
+ generator .string += generator .Indent ();
385
+ generator .string += '}';
386
+ generator .string += generator .TidyBreak ();
387
+ generator .string += generator .DecIndent ();
388
+ generator .string += generator .Indent ();
389
+ generator .string += '}';
390
+
391
+ try
392
+ {
393
+ generator .AddRouteNode (this);
394
+ generator .AddImportedNode (this .getExportedNode (), this .getImportedName ());
395
+ }
396
+ catch (error)
397
+ {
398
+ // Output unresolved routes.
399
+
400
+ for (const route of this [_routes])
401
+ {
402
+ const
403
+ sourceNode = route .sourceNode,
404
+ sourceField = route .sourceField,
405
+ destinationNode = route .destinationNode,
406
+ destinationField = route .destinationField;
407
+
408
+ if (generator .ExistsRouteNode (sourceNode) && generator .ExistsRouteNode (destinationNode))
409
+ {
410
+ const sourceNodeName = sourceNode instanceof X3DImportedNode
411
+ ? sourceNode .getImportedName ()
412
+ : generator .Name (sourceNode);
413
+
414
+ const destinationNodeName = destinationNode instanceof X3DImportedNode
415
+ ? destinationNode .getImportedName ()
416
+ : generator .Name (destinationNode);
417
+
418
+ generator .string += ',';
419
+ generator .string += generator .TidyBreak ();
420
+ generator .string += generator .Indent ();
421
+ generator .string += '{';
422
+ generator .string += generator .TidySpace ();
423
+ generator .string += '"';
424
+ generator .string += "ROUTE";
425
+ generator .string += '"';
426
+ generator .string += ':';
427
+ generator .string += generator .TidyBreak ();
428
+ generator .string += generator .IncIndent ();
429
+ generator .string += generator .Indent ();
430
+ generator .string += '{';
431
+ generator .string += generator .TidyBreak ();
432
+ generator .string += generator .IncIndent ();
433
+
434
+ generator .string += generator .Indent ();
435
+ generator .string += '"';
436
+ generator .string += "@fromNode";
437
+ generator .string += '"';
438
+ generator .string += ':';
439
+ generator .string += generator .TidySpace ();
440
+ generator .string += generator .JSONEncode (sourceNodeName);
441
+ generator .string += ',';
442
+ generator .string += generator .TidyBreak ();
443
+
444
+ generator .string += generator .Indent ();
445
+ generator .string += '"';
446
+ generator .string += "@fromField";
447
+ generator .string += '"';
448
+ generator .string += ':';
449
+ generator .string += generator .TidySpace ();
450
+ generator .string += generator .JSONEncode (sourceField);
451
+ generator .string += ',';
452
+ generator .string += generator .TidyBreak ();
453
+
454
+ generator .string += generator .Indent ();
455
+ generator .string += '"';
456
+ generator .string += "@toNode";
457
+ generator .string += '"';
458
+ generator .string += ':';
459
+ generator .string += generator .TidySpace ();
460
+ generator .string += generator .JSONEncode (destinationNodeName);
461
+ generator .string += ',';
462
+ generator .string += generator .TidyBreak ();
463
+
464
+ generator .string += generator .Indent ();
465
+ generator .string += '"';
466
+ generator .string += "@toField";
467
+ generator .string += '"';
468
+ generator .string += ':';
469
+ generator .string += generator .TidySpace ();
470
+ generator .string += generator .JSONEncode (destinationField);
471
+ generator .string += generator .TidyBreak ();
472
+
473
+ generator .string += generator .DecIndent ();
474
+ generator .string += generator .Indent ();
475
+ generator .string += '}';
476
+ generator .string += generator .TidyBreak ();
477
+ generator .string += generator .DecIndent ();
478
+ generator .string += generator .Indent ();
479
+ generator .string += '}';
480
+ }
481
+ }
482
+ }
483
+ }
484
+ else
485
+ {
486
+ throw new Error ("X3DImportedNode.toJSONStream: Inline node does not exist.");
487
+ }
324
488
  },
325
489
  dispose: function ()
326
490
  {
@@ -574,6 +574,345 @@ X3DScene .prototype = Object .assign (Object .create (X3DExecutionContext .proto
574
574
  generator .string += "</X3D>";
575
575
  generator .string += generator .TidyBreak ();
576
576
  },
577
+ toJSONStream: function (generator)
578
+ {
579
+ // X3D
580
+
581
+ generator .string += '{';
582
+ generator .string += generator .TidySpace ();
583
+ generator .string += '"';
584
+ generator .string += "X3D";
585
+ generator .string += '"';
586
+ generator .string += ':';
587
+ generator .string += generator .TidySpace ();
588
+ generator .string += '{';
589
+ generator .string += generator .TidyBreak ();
590
+ generator .string += generator .IncIndent ();
591
+ generator .string += generator .IncIndent ();
592
+
593
+
594
+ // Encoding
595
+
596
+ generator .string += generator .Indent ();
597
+ generator .string += '"';
598
+ generator .string += "encoding";
599
+ generator .string += '"';
600
+ generator .string += ':';
601
+ generator .string += generator .TidySpace ();
602
+ generator .string += '"';
603
+ generator .string += "UTF-8";
604
+ generator .string += '"';
605
+ generator .string += ',';
606
+ generator .string += generator .TidyBreak ();
607
+
608
+
609
+ // Profile
610
+
611
+ generator .string += generator .Indent ();
612
+ generator .string += '"';
613
+ generator .string += "@profile";
614
+ generator .string += '"';
615
+ generator .string += ':';
616
+ generator .string += generator .TidySpace ();
617
+ generator .string += '"';
618
+ generator .string += this .getProfile () ? this .getProfile () .name : "Full";
619
+ generator .string += '"';
620
+ generator .string += ',';
621
+ generator .string += generator .TidyBreak ();
622
+
623
+
624
+ // Version
625
+
626
+ generator .string += generator .Indent ();
627
+ generator .string += '"';
628
+ generator .string += "@version";
629
+ generator .string += '"';
630
+ generator .string += ':';
631
+ generator .string += generator .TidySpace ();
632
+ generator .string += '"';
633
+ generator .string += this .getSpecificationVersion ();
634
+ generator .string += '"';
635
+ generator .string += ',';
636
+ generator .string += generator .TidyBreak ();
637
+
638
+
639
+ // XSD noNamespaceSchemaLocation
640
+
641
+ generator .string += generator .Indent ();
642
+ generator .string += '"';
643
+ generator .string += "@xsd:noNamespaceSchemaLocation";
644
+ generator .string += '"';
645
+ generator .string += ':';
646
+ generator .string += generator .TidySpace ();
647
+ generator .string += '"';
648
+ generator .string += "http://www.web3d.org/specifications/x3d-";
649
+ generator .string += LATEST_VERSION;
650
+ generator .string += ".xsd";
651
+ generator .string += '"';
652
+ generator .string += ',';
653
+ generator .string += generator .TidyBreak ();
654
+
655
+
656
+ // JSON schema
657
+
658
+ generator .string += generator .Indent ();
659
+ generator .string += '"';
660
+ generator .string += "JSON schema";
661
+ generator .string += '"';
662
+ generator .string += ':';
663
+ generator .string += generator .TidySpace ();
664
+ generator .string += '"';
665
+ generator .string += "http://www.web3d.org/specifications/x3d-";
666
+ generator .string += LATEST_VERSION;
667
+ generator .string += "-JSONSchema.json";
668
+ generator .string += '"';
669
+ generator .string += ',';
670
+ generator .string += generator .TidyBreak ();
671
+
672
+
673
+ // Head
674
+
675
+ const outputUnits = this .getUnits () .some (unit => unit .conversionFactor !== 1);
676
+
677
+ if (this .getComponents () .length || outputUnits || this .getMetaDatas () .size)
678
+ {
679
+ let headLastProperty = false;
680
+
681
+ generator .string += generator .Indent ();
682
+ generator .string += '"';
683
+ generator .string += "head";
684
+ generator .string += '"';
685
+ generator .string += ':';
686
+ generator .string += generator .TidySpace ();
687
+ generator .string += '{';
688
+ generator .string += generator .TidyBreak ();
689
+ generator .string += generator .IncIndent ();
690
+
691
+
692
+ // Meta data
693
+
694
+ if (this .getMetaDatas () .size)
695
+ {
696
+ if (headLastProperty)
697
+ {
698
+ generator .string += ',';
699
+ generator .string += generator .TidyBreak ();
700
+ }
701
+
702
+
703
+ // Meta data begin
704
+
705
+ generator .string += generator .Indent ();
706
+ generator .string += '"';
707
+ generator .string += "meta";
708
+ generator .string += '"';
709
+ generator .string += ':';
710
+ generator .string += generator .TidySpace ();
711
+ generator .string += '[';
712
+ generator .string += generator .TidyBreak ();
713
+ generator .string += generator .IncIndent ();
714
+
715
+
716
+ // Meta data
717
+
718
+ let i = 0;
719
+
720
+ for (const [key, value] of this .getMetaDatas ())
721
+ {
722
+ generator .string += generator .Indent ();
723
+ generator .string += '{';
724
+ generator .string += generator .TidyBreak ();
725
+ generator .string += generator .IncIndent ();
726
+
727
+ generator .string += generator .Indent ();
728
+ generator .string += '"';
729
+ generator .string += "@name";
730
+ generator .string += '"';
731
+ generator .string += ':';
732
+ generator .string += generator .TidySpace ();
733
+ generator .string += generator .JSONEncode (key);
734
+ generator .string += ',';
735
+ generator .string += generator .TidyBreak ();
736
+
737
+ generator .string += generator .Indent ();
738
+ generator .string += '"';
739
+ generator .string += "@content";
740
+ generator .string += '"';
741
+ generator .string += ':';
742
+ generator .string += generator .TidySpace ();
743
+ generator .string += generator .JSONEncode (value);
744
+ generator .string += generator .TidyBreak ();
745
+
746
+ generator .string += generator .DecIndent ();
747
+ generator .string += generator .Indent ();
748
+ generator .string += '}';
749
+
750
+ if (++ i !== this .getMetaDatas () .size)
751
+ generator .string += ',';
752
+
753
+ generator .string += generator .TidyBreak ();
754
+ }
755
+
756
+
757
+ // Meta data end
758
+
759
+ generator .string += generator .DecIndent ();
760
+ generator .string += generator .Indent ();
761
+ generator .string += ']';
762
+
763
+ headLastProperty = true;
764
+ }
765
+
766
+
767
+ // Components
768
+
769
+ if (this .getComponents () .length)
770
+ {
771
+ if (headLastProperty)
772
+ {
773
+ generator .string += ',';
774
+ generator .string += generator .TidyBreak ();
775
+ }
776
+
777
+
778
+ // Components begin
779
+
780
+ generator .string += generator .Indent ();
781
+ generator .string += '"';
782
+ generator .string += "component";
783
+ generator .string += '"';
784
+ generator .string += ':';
785
+ generator .string += generator .TidySpace ();
786
+ generator .string += '[';
787
+ generator .string += generator .TidyBreak ();
788
+ generator .string += generator .IncIndent ();
789
+
790
+
791
+ // Components
792
+
793
+ this .getComponents () .toJSONStream (generator);
794
+
795
+
796
+ // Components end
797
+
798
+ generator .string += generator .DecIndent ();
799
+ generator .string += generator .Indent ();
800
+ generator .string += ']';
801
+
802
+ headLastProperty = true;
803
+ }
804
+
805
+
806
+ // Units
807
+
808
+ if (outputUnits)
809
+ {
810
+ if (headLastProperty)
811
+ {
812
+ generator .string += ',';
813
+ generator .string += generator .TidyBreak ();
814
+ }
815
+
816
+
817
+ // Units begin
818
+
819
+ generator .string += generator .Indent ();
820
+ generator .string += '"';
821
+ generator .string += "unit";
822
+ generator .string += '"';
823
+ generator .string += ':';
824
+ generator .string += generator .TidySpace ();
825
+ generator .string += '[';
826
+ generator .string += generator .TidyBreak ();
827
+ generator .string += generator .IncIndent ();
828
+
829
+
830
+ // Units
831
+
832
+ this .getUnits () .toJSONStream (generator);
833
+
834
+
835
+ // Unit end
836
+
837
+ generator .string += generator .DecIndent ();
838
+ generator .string += generator .Indent ();
839
+ generator .string += ']';
840
+
841
+ headLastProperty = true;
842
+ }
843
+
844
+
845
+ // Head end
846
+
847
+ generator .string += generator .TidyBreak ();
848
+ generator .string += generator .DecIndent ();
849
+ generator .string += generator .Indent ();
850
+ generator .string += '}';
851
+ generator .string += ',';
852
+ generator .string += generator .TidyBreak ();
853
+ }
854
+
855
+ // Scene
856
+
857
+ generator .string += generator .Indent ();
858
+ generator .string += '"';
859
+ generator .string += "Scene";
860
+ generator .string += '"';
861
+ generator .string += ':';
862
+ generator .string += generator .TidySpace ();
863
+ generator .string += '{';
864
+ generator .string += generator .TidyBreak ();
865
+ generator .string += generator .IncIndent ();
866
+ generator .string += generator .Indent ();
867
+ generator .string += '"';
868
+ generator .string += "-children";
869
+ generator .string += '"';
870
+ generator .string += ':';
871
+ generator .string += generator .TidySpace ();
872
+ generator .string += '[';
873
+ generator .string += generator .TidyBreak ();
874
+ generator .string += generator .IncIndent ();
875
+
876
+ const exportedNodes = this .getExportedNodes ();
877
+
878
+ generator .PushExecutionContext (this);
879
+ generator .EnterScope ();
880
+ generator .ExportedNodes (exportedNodes);
881
+
882
+ X3DExecutionContext .prototype .toJSONStream .call (this, generator);
883
+
884
+ // Exported nodes
885
+
886
+ this .getExportedNodes () .toJSONStream (generator, true);
887
+
888
+ generator .string = generator .string .replace (/,(\s*)$/s, "$1");
889
+
890
+ generator .LeaveScope ();
891
+ generator .PopExecutionContext ();
892
+
893
+ // Scene end
894
+
895
+ generator .string += generator .DecIndent ();
896
+ generator .string += generator .Indent ();
897
+ generator .string += ']';
898
+ generator .string += generator .TidyBreak ();
899
+ generator .string += generator .DecIndent ();
900
+ generator .string += generator .Indent ();
901
+ generator .string += '}';
902
+
903
+
904
+ // X3D end
905
+
906
+ generator .string += generator .TidyBreak ();
907
+ generator .string += generator .DecIndent ();
908
+ generator .string += generator .Indent ();
909
+ generator .string += '}';
910
+ generator .string += generator .TidyBreak ();
911
+ generator .string += generator .DecIndent ();
912
+ generator .string += generator .Indent ();
913
+ generator .string += '}';
914
+ generator .string += generator .TidyBreak ();
915
+ },
577
916
  });
578
917
 
579
918
  for (const key of Reflect .ownKeys (X3DScene .prototype))
@@ -341,6 +341,54 @@ MFNode .prototype = Object .assign (Object .create (X3DObjectArrayField .prototy
341
341
  generator .LeaveScope ();
342
342
  }
343
343
  },
344
+ toJSONStream: function (generator)
345
+ {
346
+ const length = this .length;
347
+
348
+ if (length)
349
+ {
350
+ const array = this .getValue ();
351
+
352
+ generator .EnterScope ();
353
+
354
+ generator .string += '[';
355
+ generator .string += generator .TidyBreak ();
356
+ generator .string += generator .IncIndent ();
357
+
358
+ for (let i = 0, n = length - 1; i < n; ++ i)
359
+ {
360
+ generator .string += generator .Indent ();
361
+
362
+ if (array [i])
363
+ array [i] .toJSONStreamValue (generator);
364
+ else
365
+ generator .string += 'null';
366
+
367
+ generator .string += ',';
368
+ generator .string += generator .TidyBreak ();
369
+ }
370
+
371
+ generator .string += generator .Indent ();
372
+
373
+ if (array .at (-1))
374
+ array .at (-1) .toJSONStreamValue (generator);
375
+ else
376
+ generator .string += 'null';
377
+
378
+ generator .string += generator .TidyBreak ();
379
+ generator .string += generator .DecIndent ();
380
+ generator .string += generator .Indent ();
381
+ generator .string += ']';
382
+
383
+ generator .LeaveScope ();
384
+ }
385
+ else
386
+ {
387
+ generator .string += '[';
388
+ generator .string += generator .TidySpace ();
389
+ generator .string += ']';
390
+ }
391
+ },
344
392
  dispose: function ()
345
393
  {
346
394
  this .resize (0);
@@ -92,6 +92,14 @@ SFBool .prototype = Object .assign (Object .create (X3DField .prototype),
92
92
  {
93
93
  generator .string += this .getValue () ? "true" : "false";
94
94
  },
95
+ toJSONStream: function (generator)
96
+ {
97
+ this .toJSONStreamValue (generator);
98
+ },
99
+ toJSONStreamValue: function (generator)
100
+ {
101
+ generator .string += this .getValue () ? "true" : "false";
102
+ },
95
103
  });
96
104
 
97
105
  for (const key of Reflect .ownKeys (SFBool .prototype))
@@ -135,7 +135,7 @@ SFColor .prototype = Object .assign (Object .create (X3DField .prototype),
135
135
  for (let i = 0; i < last; ++ i)
136
136
  {
137
137
  generator .string += generator .Precision (value [i]);
138
- generator .string += generator .Space ();
138
+ generator .string += generator .TidySpace ();
139
139
  }
140
140
 
141
141
  generator .string += generator .Precision (value [last]);
@@ -148,6 +148,31 @@ SFColor .prototype = Object .assign (Object .create (X3DField .prototype),
148
148
  {
149
149
  this .toStream (generator);
150
150
  },
151
+ toJSONStream: function (generator)
152
+ {
153
+ generator .string += '[';
154
+ generator .string += generator .TidySpace ();
155
+
156
+ this .toJSONStreamValue (generator);
157
+
158
+ generator .string += generator .TidySpace ();
159
+ generator .string += ']';
160
+ },
161
+ toJSONStreamValue: function (generator)
162
+ {
163
+ const
164
+ value = this .getValue (),
165
+ last = value .length - 1;
166
+
167
+ for (let i = 0; i < last; ++ i)
168
+ {
169
+ generator .string += generator .JSONNumber (generator .Precision (value [i]));
170
+ generator .string += ',';
171
+ generator .string += generator .TidySpace ();
172
+ }
173
+
174
+ generator .string += generator .JSONNumber (generator .Precision (value [last]));
175
+ },
151
176
  });
152
177
 
153
178
  for (const key of Reflect .ownKeys (SFColor .prototype))
@@ -124,6 +124,8 @@ SFColorRGBA .prototype = Object .assign (Object .create (X3DField .prototype),
124
124
  toStream: SFColor .prototype .toStream,
125
125
  toVRMLStream: SFColor .prototype .toVRMLStream,
126
126
  toXMLStream: SFColor .prototype .toXMLStream,
127
+ toJSONStream: SFColor .prototype .toJSONStream,
128
+ toJSONStreamValue: SFColor .prototype .toJSONStreamValue,
127
129
  });
128
130
 
129
131
  for (const key of Reflect .ownKeys (SFColorRGBA .prototype))
@@ -91,6 +91,16 @@ SFDouble .prototype = Object .assign (Object .create (X3DField .prototype),
91
91
  {
92
92
  this .toStream (generator);
93
93
  },
94
+ toJSONStream: function (generator)
95
+ {
96
+ this .toJSONStreamValue (generator);
97
+ },
98
+ toJSONStreamValue: function (generator)
99
+ {
100
+ const category = generator .Unit (this .getUnit ());
101
+
102
+ generator .string += generator .JSONNumber (generator .DoublePrecision (generator .ToUnit (category, this .getValue ())));
103
+ },
94
104
  });
95
105
 
96
106
  for (const key of Reflect .ownKeys (SFDouble .prototype))
@@ -91,6 +91,16 @@ SFFloat .prototype = Object .assign (Object .create (X3DField .prototype),
91
91
  {
92
92
  this .toStream (generator);
93
93
  },
94
+ toJSONStream: function (generator)
95
+ {
96
+ this .toJSONStreamValue (generator);
97
+ },
98
+ toJSONStreamValue: function (generator)
99
+ {
100
+ const category = generator .Unit (this .getUnit ());
101
+
102
+ generator .string += generator .JSONNumber (generator .Precision (generator .ToUnit (category, this .getValue ())));
103
+ },
94
104
  });
95
105
 
96
106
  for (const key of Reflect .ownKeys (SFFloat .prototype))