x_ite 8.3.1 → 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 (130) hide show
  1. package/.github/workflows/pages-deploy.yml +1 -1
  2. package/.vscode/settings.json +2 -1
  3. package/build/bin/tests.pl +2 -0
  4. package/dist/LICENSE.md +4 -4
  5. package/dist/assets/components/Annotation.js +13 -13
  6. package/dist/assets/components/Annotation.min.js +1 -1
  7. package/dist/assets/components/CADGeometry.js +13 -13
  8. package/dist/assets/components/CADGeometry.min.js +1 -1
  9. package/dist/assets/components/CubeMapTexturing.js +25 -25
  10. package/dist/assets/components/CubeMapTexturing.min.js +1 -1
  11. package/dist/assets/components/DIS.js +13 -13
  12. package/dist/assets/components/DIS.min.js +1 -1
  13. package/dist/assets/components/EventUtilities.js +9 -9
  14. package/dist/assets/components/EventUtilities.min.js +1 -1
  15. package/dist/assets/components/Geometry2D.js +19 -19
  16. package/dist/assets/components/Geometry2D.min.js +1 -1
  17. package/dist/assets/components/Geospatial.js +33 -33
  18. package/dist/assets/components/Geospatial.min.js +1 -1
  19. package/dist/assets/components/HAnim.js +61 -74
  20. package/dist/assets/components/HAnim.min.js +1 -1
  21. package/dist/assets/components/KeyDeviceSensor.js +8 -8
  22. package/dist/assets/components/KeyDeviceSensor.min.js +1 -1
  23. package/dist/assets/components/Layout.js +27 -27
  24. package/dist/assets/components/Layout.min.js +1 -1
  25. package/dist/assets/components/NURBS.js +24 -24
  26. package/dist/assets/components/NURBS.min.js +1 -1
  27. package/dist/assets/components/ParticleSystems.js +23 -23
  28. package/dist/assets/components/ParticleSystems.min.js +1 -1
  29. package/dist/assets/components/Picking.js +19 -19
  30. package/dist/assets/components/Picking.min.js +1 -1
  31. package/dist/assets/components/RigidBodyPhysics.js +17 -17
  32. package/dist/assets/components/RigidBodyPhysics.min.js +1 -1
  33. package/dist/assets/components/Scripting.js +28 -28
  34. package/dist/assets/components/Scripting.min.js +1 -1
  35. package/dist/assets/components/Text.js +24 -24
  36. package/dist/assets/components/Text.min.js +1 -1
  37. package/dist/assets/components/{ProjectiveTextureMapping.js → TextureProjector.js} +39 -39
  38. package/dist/assets/components/TextureProjector.min.js +1 -0
  39. package/dist/assets/components/Texturing3D.js +46 -46
  40. package/dist/assets/components/Texturing3D.min.js +1 -1
  41. package/dist/assets/components/VolumeRendering.js +19 -19
  42. package/dist/assets/components/VolumeRendering.min.js +1 -1
  43. package/dist/assets/components/X_ITE.js +9 -9
  44. package/dist/assets/components/X_ITE.min.js +1 -1
  45. package/dist/x_ite.css +1 -1
  46. package/dist/x_ite.js +1904 -1570
  47. package/dist/x_ite.min.js +1 -1
  48. package/dist/x_ite.zip +0 -0
  49. package/docs/Gemfile +1 -4
  50. package/docs/_config.yml +3 -2
  51. package/docs/_posts/custom-shaders.md +1 -1
  52. package/docs/_posts/dom-integration.md +52 -25
  53. package/docs/_posts/getting-started.md +148 -442
  54. package/docs/_posts/reference/field-services-and-objects.md +2 -34
  55. package/docs/_posts/reference/scene-services.md +13 -2
  56. package/docs/_posts/tutorials/basic-nodes.md +2 -2
  57. package/docs/_posts/tutorials/building-a-x3d-world.md +20 -4
  58. package/docs/_posts/tutorials/building-primitive-shapes.md +4 -4
  59. package/docs/_posts/tutorials/creating-new-node-types.md +22 -0
  60. package/docs/_posts/tutorials/hello-world.md +6 -6
  61. package/docs/_posts/tutorials/improving-performance.md +2 -2
  62. package/docs/_posts/tutorials/writing-program-scripts-with-ecmascript.md +2 -2
  63. package/docs/_posts/what's-new.md +21 -3
  64. package/docs/_tabs/playground.html +110 -57
  65. package/docs/assets/css/style.scss +25 -1
  66. package/package.json +2 -2
  67. package/src/assets/components/{ProjectiveTextureMapping.js → TextureProjector.js} +5 -5
  68. package/src/examples.js +1 -1
  69. package/src/tests.js +5 -5
  70. package/src/x_ite/Base/X3DArrayField.js +3 -0
  71. package/src/x_ite/Base/X3DBaseNode.js +4 -0
  72. package/src/x_ite/Base/X3DInfoArray.js +28 -24
  73. package/src/x_ite/Base/X3DObject.js +29 -20
  74. package/src/x_ite/Base/X3DObjectArrayField.js +27 -26
  75. package/src/x_ite/Base/X3DTypedArrayField.js +34 -32
  76. package/src/x_ite/Browser/Core/ContextMenu.js +5 -7
  77. package/src/x_ite/Browser/DOMIntegration.js +62 -54
  78. package/src/x_ite/Browser/VERSION.js +1 -1
  79. package/src/x_ite/Browser/X3DBrowser.js +44 -29
  80. package/src/x_ite/Browser/X3DBrowserContext.js +3 -0
  81. package/src/x_ite/Components/Core/X3DNode.js +196 -187
  82. package/src/x_ite/Components/Core/X3DPrototypeInstance.js +114 -91
  83. package/src/x_ite/Components/Grouping/X3DTransformMatrix3DNode.js +18 -43
  84. package/src/x_ite/Components/HAnim/HAnimHumanoid.js +24 -25
  85. package/src/x_ite/Components/HAnim/HAnimJoint.js +19 -31
  86. package/src/x_ite/Components/Networking/Inline.js +21 -2
  87. package/src/x_ite/Components/Sound/X3DSoundProcessingNode.js +14 -1
  88. package/src/x_ite/Components/Sound/X3DSoundSourceNode.js +0 -1
  89. package/src/x_ite/Components/{ProjectiveTextureMapping → TextureProjector}/TextureProjector.js +1 -1
  90. package/src/x_ite/Components/{ProjectiveTextureMapping → TextureProjector}/TextureProjectorParallel.js +1 -1
  91. package/src/x_ite/Components/{ProjectiveTextureMapping → TextureProjector}/X3DTextureProjectorNode.js +0 -0
  92. package/src/x_ite/Components/Time/TimeSensor.js +5 -0
  93. package/src/x_ite/Components/Time/X3DTimeDependentNode.js +1 -0
  94. package/src/x_ite/Configuration/ComponentInfo.js +20 -23
  95. package/src/x_ite/Configuration/ProfileInfo.js +6 -6
  96. package/src/x_ite/Configuration/SupportedComponents.js +22 -20
  97. package/src/x_ite/Configuration/SupportedNodes.js +1 -5
  98. package/src/x_ite/Configuration/SupportedProfiles.js +1 -1
  99. package/src/x_ite/Configuration/UnitInfo.js +24 -27
  100. package/src/x_ite/Execution/X3DExecutionContext.js +28 -59
  101. package/src/x_ite/Execution/X3DExportedNode.js +23 -28
  102. package/src/x_ite/Execution/X3DImportedNode.js +63 -67
  103. package/src/x_ite/Execution/X3DScene.js +98 -117
  104. package/src/x_ite/Fields/ArrayFields.js +57 -55
  105. package/src/x_ite/Fields/SFBool.js +6 -6
  106. package/src/x_ite/Fields/SFColor.js +10 -12
  107. package/src/x_ite/Fields/SFDouble.js +7 -10
  108. package/src/x_ite/Fields/SFFloat.js +7 -10
  109. package/src/x_ite/Fields/SFImage.js +33 -8
  110. package/src/x_ite/Fields/SFInt32.js +6 -6
  111. package/src/x_ite/Fields/SFMatrixPrototypeTemplate.js +13 -13
  112. package/src/x_ite/Fields/SFNode.js +42 -19
  113. package/src/x_ite/Fields/SFRotation.js +13 -13
  114. package/src/x_ite/Fields/SFString.js +6 -7
  115. package/src/x_ite/Fields/SFTime.js +6 -6
  116. package/src/x_ite/Fields/SFVecPrototypeTemplate.js +10 -10
  117. package/src/x_ite/InputOutput/FileLoader.js +1 -1
  118. package/src/x_ite/InputOutput/Generator.js +117 -17
  119. package/src/x_ite/Parser/VRMLParser.js +24 -27
  120. package/src/x_ite/Parser/X3DParser.js +0 -4
  121. package/src/x_ite/Parser/XMLParser.js +152 -50
  122. package/src/x_ite/Prototype/X3DExternProtoDeclaration.js +59 -64
  123. package/src/x_ite/Prototype/X3DProtoDeclaration.js +86 -93
  124. package/src/x_ite/Rendering/X3DRenderObject.js +6 -1
  125. package/src/x_ite/Routing/X3DRoute.js +37 -40
  126. package/src/x_ite.html +3 -3
  127. package/webpack.config.js +2 -2
  128. package/x_ite.min.html +1 -1
  129. package/dist/assets/components/ProjectiveTextureMapping.min.js +0 -1
  130. package/docs/Gemfile.lock +0 -116
@@ -73,6 +73,8 @@ function XMLParser (scene)
73
73
  this .parents = [ ];
74
74
  this .parser = new VRMLParser (scene);
75
75
  this .url = new Fields .MFString ();
76
+ this .protoNames = new Map ();
77
+ this .protoFields = new WeakMap ();
76
78
 
77
79
  try
78
80
  {
@@ -102,12 +104,23 @@ XMLParser .prototype = Object .assign (Object .create (X3DParser .prototype),
102
104
  xmlElement = $.parseXML (xmlElement);
103
105
 
104
106
  this .input = xmlElement;
107
+ this .xml = this .isXML (xmlElement);
108
+
109
+ if (! this .xml)
110
+ Object .assign (this, HTMLParser);
105
111
  }
106
112
  catch (error)
107
113
  {
108
114
  this .input = undefined;
109
115
  }
110
116
  },
117
+ isXML: function (element)
118
+ {
119
+ if (element instanceof HTMLElement)
120
+ return false;
121
+ else
122
+ return true;
123
+ },
111
124
  parseIntoScene: function (success, error)
112
125
  {
113
126
  this .success = success;
@@ -118,16 +131,6 @@ XMLParser .prototype = Object .assign (Object .create (X3DParser .prototype),
118
131
 
119
132
  this .xmlElement (this .input);
120
133
  },
121
- parseIntoNode: function (node, xmlElement)
122
- {
123
- this .pushExecutionContext (node .getExecutionContext ());
124
- this .pushParent (node);
125
-
126
- this .childElement (xmlElement);
127
-
128
- this .popParent ();
129
- this .popExecutionContext ();
130
- },
131
134
  xmlElement: function (xmlElement)
132
135
  {
133
136
  if (xmlElement === null)
@@ -480,8 +483,9 @@ XMLParser .prototype = Object .assign (Object .create (X3DParser .prototype),
480
483
  var externproto = new X3DExternProtoDeclaration (this .getExecutionContext (), this .url);
481
484
 
482
485
  this .pushParent (externproto);
483
- this .protoInterfaceElement (xmlElement); // parse fields
486
+ this .protoInterfaceElement (xmlElement);
484
487
  this .popParent ();
488
+ this .addProtoFieldNames (externproto);
485
489
 
486
490
  externproto .setup ();
487
491
 
@@ -495,6 +499,8 @@ XMLParser .prototype = Object .assign (Object .create (X3DParser .prototype),
495
499
  { }
496
500
 
497
501
  this .getExecutionContext () .updateExternProtoDeclaration (name, externproto);
502
+
503
+ this .addProtoName (name);
498
504
  }
499
505
  },
500
506
  protoDeclareElement: function (xmlElement)
@@ -519,6 +525,7 @@ XMLParser .prototype = Object .assign (Object .create (X3DParser .prototype),
519
525
  this .pushParent (proto);
520
526
  this .protoInterfaceElement (child);
521
527
  this .popParent ();
528
+ this .addProtoFieldNames (proto);
522
529
  break;
523
530
  }
524
531
  default:
@@ -565,6 +572,8 @@ XMLParser .prototype = Object .assign (Object .create (X3DParser .prototype),
565
572
  { }
566
573
 
567
574
  this .getExecutionContext () .updateProtoDeclaration (name, proto);
575
+
576
+ this .addProtoName (name);
568
577
  }
569
578
  },
570
579
  protoInterfaceElement: function (xmlElement)
@@ -715,7 +724,7 @@ XMLParser .prototype = Object .assign (Object .create (X3DParser .prototype),
715
724
  if (! node)
716
725
  throw new Error ("Unknown proto or externproto type '" + name + "'.");
717
726
 
718
- //AP: attach node to DOM xmlElement for access from DOM.
727
+ ///DOMIntegration: attach node to DOM xmlElement for access from DOM.
719
728
  $.data (xmlElement, "node", node);
720
729
 
721
730
  this .defAttribute (xmlElement, node);
@@ -784,14 +793,21 @@ XMLParser .prototype = Object .assign (Object .create (X3DParser .prototype),
784
793
  if (this .useAttribute (xmlElement))
785
794
  return;
786
795
 
787
- var node = this .getExecutionContext () .createNode (this .nodeNameToCamelCase (xmlElement .nodeName), false);
796
+ var node = this .getExecutionContext () .createProto (this .protoNameToCamelCase (xmlElement .nodeName), false);
797
+
798
+ if (! node)
799
+ node = this .getExecutionContext () .createNode (this .nodeNameToCamelCase (xmlElement .nodeName), false);
788
800
 
789
801
  if (! node)
790
802
  throw new Error ("Unknown node type '" + xmlElement .nodeName + "', you probably have insufficient component/profile statements.");
791
803
 
792
- //AP: attach node to DOM xmlElement for access from DOM.
804
+ ///DOMIntegration: attach node to DOM xmlElement for access from DOM.
793
805
  $.data (xmlElement, "node", node);
794
806
 
807
+ //DOMIntegration: Script node support for HTML.
808
+ if (xmlElement .nodeName === "SCRIPT")
809
+ this .scriptElement (xmlElement);
810
+
795
811
  this .defAttribute (xmlElement, node);
796
812
  this .addNode (xmlElement, node);
797
813
  this .pushParent (node);
@@ -819,6 +835,22 @@ XMLParser .prototype = Object .assign (Object .create (X3DParser .prototype),
819
835
  console .error (error);
820
836
  }
821
837
  },
838
+ scriptElement (element)
839
+ {
840
+ const
841
+ domParser = new DOMParser (),
842
+ scriptDocument = domParser .parseFromString (element .outerHTML, "application/xml"),
843
+ childNodes = scriptDocument .children [0] .childNodes;
844
+
845
+ element .textContent = "// Content moved into childNodes.";
846
+
847
+ for (const childNode of childNodes)
848
+ {
849
+ // Add elements and cdata.
850
+ if (childNode .nodeType === 1 || childNode .nodeType === 4)
851
+ element .appendChild (childNode);
852
+ }
853
+ },
822
854
  routeElement: function (xmlElement)
823
855
  {
824
856
  try
@@ -847,7 +879,7 @@ XMLParser .prototype = Object .assign (Object .create (X3DParser .prototype),
847
879
  destinationNode = executionContext .getLocalNode (destinationNodeName),
848
880
  route = executionContext .addRoute (sourceNode, sourceField, destinationNode, destinationField);
849
881
 
850
- //AP: attach node to DOM xmlElement for access from DOM.
882
+ ///DOMIntegration: attach node to DOM xmlElement for access from DOM.
851
883
  $.data (xmlElement, "node", route);
852
884
  }
853
885
  catch (error)
@@ -988,11 +1020,9 @@ XMLParser .prototype = Object .assign (Object .create (X3DParser .prototype),
988
1020
  {
989
1021
  try
990
1022
  {
991
- var
992
- field = node .getField (this .attributeToCamelCase (xmlAttribute .name)),
993
- accessType = field .getAccessType ();
1023
+ const field = node .getField (this .attributeToCamelCase (node, xmlAttribute .name));
994
1024
 
995
- if (accessType & X3DConstants .initializeOnly)
1025
+ if (field .isInitializable ())
996
1026
  this .fieldValue (field, xmlAttribute .value);
997
1027
  }
998
1028
  catch (error)
@@ -1012,6 +1042,32 @@ XMLParser .prototype = Object .assign (Object .create (X3DParser .prototype),
1012
1042
 
1013
1043
  this .parser .popExecutionContext ();
1014
1044
  },
1045
+ id: function (string)
1046
+ {
1047
+ if (string === null)
1048
+ return false;
1049
+
1050
+ if (string .length === 0)
1051
+ return false;
1052
+
1053
+ return true;
1054
+ },
1055
+ getParents: function ()
1056
+ {
1057
+ return this .parents;
1058
+ },
1059
+ getParent: function ()
1060
+ {
1061
+ return this .parents .at (-1);
1062
+ },
1063
+ pushParent: function (parent)
1064
+ {
1065
+ return this .parents .push (parent);
1066
+ },
1067
+ popParent: function ()
1068
+ {
1069
+ this .parents .pop ();
1070
+ },
1015
1071
  addNode: function (xmlElement, node)
1016
1072
  {
1017
1073
  if (this .parents .length === 0 || this .getParent () instanceof X3DProtoDeclaration)
@@ -1070,41 +1126,22 @@ XMLParser .prototype = Object .assign (Object .create (X3DParser .prototype),
1070
1126
  //console .warn (error .message);
1071
1127
  }
1072
1128
  },
1073
- getParents: function ()
1129
+ // Overloaded by HTMLParser.
1130
+ addProtoName: function (name)
1131
+ { },
1132
+ addProtoFieldNames: function (protoNode)
1133
+ { },
1134
+ protoNameToCamelCase: function (typeName)
1074
1135
  {
1075
- return this .parents;
1136
+ return typeName;
1076
1137
  },
1077
- getParent: function ()
1138
+ nodeNameToCamelCase: function (typeName)
1078
1139
  {
1079
- return this .parents .at (-1);
1140
+ return typeName;
1080
1141
  },
1081
- pushParent: function (parent)
1142
+ attributeToCamelCase: function (node, name)
1082
1143
  {
1083
- return this .parents .push (parent);
1084
- },
1085
- popParent: function ()
1086
- {
1087
- this .parents .pop ();
1088
- },
1089
- id: function (string)
1090
- {
1091
- if (string === null)
1092
- return false;
1093
-
1094
- if (string .length === 0)
1095
- return false;
1096
-
1097
- return true;
1098
- },
1099
- nodeNameToCamelCase: function (nodeName)
1100
- {
1101
- // Function also needed by X_ITE DOM.
1102
- return HTMLSupport .getNodeTypeName (nodeName);
1103
- },
1104
- attributeToCamelCase: function (name)
1105
- {
1106
- // Function also needed by X_ITE DOM.
1107
- return HTMLSupport .getFieldName (name);
1144
+ return name;
1108
1145
  },
1109
1146
  });
1110
1147
 
@@ -1157,7 +1194,7 @@ XMLParser .prototype .fieldTypes [X3DConstants .MFVec4f] = VRMLParser .proto
1157
1194
  * Lazy parse functions.
1158
1195
  */
1159
1196
 
1160
- var
1197
+ const
1161
1198
  infs = /\binf\b/g,
1162
1199
  nans = /\bnan\b/g,
1163
1200
  trimWhitespaces = /^[\x20\n,\t\r"]+|[\x20\n,\t\r"]+$/g,
@@ -1254,4 +1291,69 @@ XMLParser .prototype .fieldTypes [X3DConstants .MFString] = function (field)
1254
1291
  field .setValue (prepareStrings (this .getInput ()));
1255
1292
  };
1256
1293
 
1294
+ // HTML Support
1295
+
1296
+ const HTMLParser =
1297
+ {
1298
+ addProtoName: function (name)
1299
+ {
1300
+ //DOMIntegration: add uppercase versions of proto name.
1301
+
1302
+ this .protoNames .set (name, name);
1303
+ this .protoNames .set (name .toUpperCase (), name);
1304
+ },
1305
+ addProtoFieldNames: (function ()
1306
+ {
1307
+ const reservedAttributes = new Set ();
1308
+
1309
+ for (const reservedAttribute of [
1310
+ "DEF",
1311
+ "USE",
1312
+ "containerField",
1313
+ ])
1314
+ {
1315
+ reservedAttributes
1316
+ .add (reservedAttribute)
1317
+ .add (reservedAttribute .toLowerCase ());
1318
+ }
1319
+
1320
+ return function (protoNode)
1321
+ {
1322
+ //DOMIntegration: handle lowercase versions of field names.
1323
+
1324
+ const fields = new Map ();
1325
+
1326
+ this .protoFields .set (protoNode, fields);
1327
+
1328
+ for (const { name } of protoNode .getFieldDefinitions ())
1329
+ {
1330
+ if (reservedAttributes .has (name))
1331
+ continue;
1332
+
1333
+ fields .set (name, name);
1334
+ fields .set (name .toLowerCase (), name);
1335
+ }
1336
+ };
1337
+ })(),
1338
+ protoNameToCamelCase: function (typeName)
1339
+ {
1340
+ //DOMIntegration: handle uppercase versions of node names.
1341
+ return this .protoNames .get (typeName);
1342
+ },
1343
+ nodeNameToCamelCase: function (typeName)
1344
+ {
1345
+ //DOMIntegration: handle uppercase versions of node names.
1346
+ return HTMLSupport .getNodeTypeName (typeName);
1347
+ },
1348
+ attributeToCamelCase: function (node, name)
1349
+ {
1350
+ //DOMIntegration: handle lowercase versions of field names.
1351
+
1352
+ if (node instanceof X3DPrototypeInstance)
1353
+ return this .protoFields .get (node .getProtoNode ()) .get (name);
1354
+
1355
+ return HTMLSupport .getFieldName (name);
1356
+ },
1357
+ };
1358
+
1257
1359
  export default XMLParser;
@@ -53,7 +53,6 @@ import X3DUrlObject from "../Components/Networking/X3DUrlObject.js";
53
53
  import X3DProtoDeclarationNode from "./X3DProtoDeclarationNode.js";
54
54
  import X3DConstants from "../Base/X3DConstants.js";
55
55
  import FileLoader from "../InputOutput/FileLoader.js";
56
- import Generator from "../InputOutput/Generator.js";
57
56
 
58
57
  SupportedNodes .addAbstractType ("X3DExternProtoDeclaration", X3DExternProtoDeclaration);
59
58
 
@@ -173,85 +172,80 @@ X3DExternProtoDeclaration .prototype = Object .assign (Object .create (X3DProtoD
173
172
  this .setLoadState (X3DConstants .FAILED_STATE);
174
173
  this .setProtoDeclaration (null);
175
174
  },
176
- toVRMLStream: function (stream)
175
+ toVRMLStream: function (generator)
177
176
  {
178
- const generator = Generator .Get (stream);
179
-
180
- stream .string += generator .Indent ();
181
- stream .string += "EXTERNPROTO";
182
- stream .string += " ";
183
- stream .string += this .getName ();
184
- stream .string += " ";
185
- stream .string += "[";
177
+ generator .string += generator .Indent ();
178
+ generator .string += "EXTERNPROTO";
179
+ generator .string += generator .Space ();
180
+ generator .string += this .getName ();
181
+ generator .string += generator .TidySpace ();
182
+ generator .string += "[";
186
183
 
187
184
  const userDefinedFields = this .getUserDefinedFields ();
188
185
 
189
- let
190
- fieldTypeLength = 0,
191
- accessTypeLength = 0;
192
-
193
186
  if (userDefinedFields .length === 0)
194
187
  {
195
- stream .string += " ";
188
+ generator .string += generator .TidySpace ();
196
189
  }
197
190
  else
198
191
  {
192
+ let
193
+ fieldTypeLength = 0,
194
+ accessTypeLength = 0;
195
+
199
196
  for (const field of userDefinedFields)
200
197
  {
201
198
  fieldTypeLength = Math .max (fieldTypeLength, field .getTypeName () .length);
202
199
  accessTypeLength = Math .max (accessTypeLength, generator .AccessType (field .getAccessType ()) .length);
203
200
  }
204
201
 
205
- stream .string += "\n";
202
+ generator .string += generator .TidyBreak ();
206
203
 
207
204
  generator .IncIndent ();
208
205
 
209
206
  for (const field of userDefinedFields)
210
207
  {
211
- this .toVRMLStreamUserDefinedField (stream, field, fieldTypeLength, accessTypeLength);
212
- stream .string += "\n";
208
+ this .toVRMLStreamUserDefinedField (generator, field, fieldTypeLength, accessTypeLength);
209
+
210
+ generator .string += generator .Break ();
213
211
  }
214
212
 
215
213
  generator .DecIndent ();
216
214
 
217
- stream .string += generator .Indent ();
215
+ generator .string += generator .Indent ();
218
216
  }
219
217
 
220
- stream .string += "]";
221
- stream .string += "\n";
222
-
223
- stream .string += generator .Indent ();
218
+ generator .string += "]";
219
+ generator .string += generator .TidyBreak ();
220
+ generator .string += generator .Indent ();
224
221
 
225
- this ._url .toVRMLStream (stream);
222
+ this ._url .toVRMLStream (generator);
226
223
  },
227
- toVRMLStreamUserDefinedField: function (stream, field, fieldTypeLength, accessTypeLength)
224
+ toVRMLStreamUserDefinedField: function (generator, field, fieldTypeLength, accessTypeLength)
228
225
  {
229
- const generator = Generator .Get (stream);
230
-
231
- stream .string += generator .Indent ();
232
- stream .string += generator .PadRight (generator .AccessType (field .getAccessType ()), accessTypeLength);
233
- stream .string += " ";
234
- stream .string += generator .PadRight (field .getTypeName (), fieldTypeLength);
235
- stream .string += " ";
236
- stream .string += field .getName ();
226
+ generator .string += generator .Indent ();
227
+ generator .string += generator .PadRight (generator .AccessType (field .getAccessType ()), accessTypeLength);
228
+ generator .string += generator .Space ();
229
+ generator .string += generator .PadRight (field .getTypeName (), fieldTypeLength);
230
+ generator .string += generator .Space ();
231
+ generator .string += field .getName ();
237
232
  },
238
- toXMLStream: function (stream)
233
+ toXMLStream: function (generator)
239
234
  {
240
- const generator = Generator .Get (stream);
241
-
242
- stream .string += generator .Indent ();
243
- stream .string += "<ExternProtoDeclare";
244
- stream .string += " ";
245
- stream .string += "name='";
246
- stream .string += generator .XMLEncode (this .getName ());
247
- stream .string += "'";
248
- stream .string += " ";
249
- stream .string += "url='";
235
+ generator .string += generator .Indent ();
236
+ generator .string += "<ExternProtoDeclare";
237
+ generator .string += generator .Space ();
238
+ generator .string += "name='";
239
+ generator .string += generator .XMLEncode (this .getName ());
240
+ generator .string += "'";
241
+ generator .string += generator .Space ();
242
+ generator .string += "url='";
250
243
 
251
- this ._url .toXMLStream (stream);
244
+ this ._url .toXMLStream (generator);
252
245
 
253
- stream .string += "'";
254
- stream .string += ">\n";
246
+ generator .string += "'";
247
+ generator .string += ">";
248
+ generator .string += generator .TidyBreak ();
255
249
 
256
250
  generator .IncIndent ();
257
251
 
@@ -259,27 +253,28 @@ X3DExternProtoDeclaration .prototype = Object .assign (Object .create (X3DProtoD
259
253
 
260
254
  for (const field of userDefinedFields)
261
255
  {
262
- stream .string += generator .Indent ();
263
- stream .string += "<field";
264
- stream .string += " ";
265
- stream .string += "accessType='";
266
- stream .string += generator .AccessType (field .getAccessType ());
267
- stream .string += "'";
268
- stream .string += " ";
269
- stream .string += "type='";
270
- stream .string += field .getTypeName ();
271
- stream .string += "'";
272
- stream .string += " ";
273
- stream .string += "name='";
274
- stream .string += generator .XMLEncode (field .getName ());
275
- stream .string += "'";
276
- stream .string += "/>\n";
256
+ generator .string += generator .Indent ();
257
+ generator .string += "<field";
258
+ generator .string += generator .Space ();
259
+ generator .string += "accessType='";
260
+ generator .string += generator .AccessType (field .getAccessType ());
261
+ generator .string += "'";
262
+ generator .string += generator .Space ();
263
+ generator .string += "type='";
264
+ generator .string += field .getTypeName ();
265
+ generator .string += "'";
266
+ generator .string += generator .Space ();
267
+ generator .string += "name='";
268
+ generator .string += generator .XMLEncode (field .getName ());
269
+ generator .string += "'";
270
+ generator .string += "/>";
271
+ generator .string += generator .TidyBreak ();
277
272
  }
278
273
 
279
274
  generator .DecIndent ();
280
275
 
281
- stream .string += generator .Indent ();
282
- stream .string += "</ExternProtoDeclare>";
276
+ generator .string += generator .Indent ();
277
+ generator .string += "</ExternProtoDeclare>";
283
278
  },
284
279
  });
285
280