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
@@ -64,7 +64,6 @@ import SFVec4 from "./SFVec4.js";
64
64
  import X3DObjectArrayField from "../Base/X3DObjectArrayField.js";
65
65
  import X3DTypedArrayField from "../Base/X3DTypedArrayField.js";
66
66
  import X3DConstants from "../Base/X3DConstants.js";
67
- import Generator from "../InputOutput/Generator.js";
68
67
 
69
68
  const
70
69
  SFMatrix3d = SFMatrix3 .SFMatrix3d,
@@ -161,25 +160,26 @@ MFNode .prototype = Object .assign (Object .create (X3DObjectArrayField .prototy
161
160
 
162
161
  value .removeCloneCount (this [_cloneCount]);
163
162
  },
164
- toStream: function (stream)
163
+ toStream: function (generator)
165
164
  {
166
165
  const
167
- target = this .getTarget (),
168
- array = target .getValue (),
169
- generator = Generator .Get (stream);
166
+ target = this .getTarget (),
167
+ array = target .getValue ();
170
168
 
171
169
  switch (array .length)
172
170
  {
173
171
  case 0:
174
172
  {
175
- stream .string += "[ ]";
173
+ generator .string += "[";
174
+ generator .string += generator .TidySpace ();
175
+ generator .string += "]";
176
176
  break;
177
177
  }
178
178
  case 1:
179
179
  {
180
180
  generator .PushUnitCategory (target .getUnit ());
181
181
 
182
- array [0] .toStream (stream);
182
+ array [0] .toStream (generator);
183
183
 
184
184
  generator .PopUnitCategory ();
185
185
  break;
@@ -188,19 +188,20 @@ MFNode .prototype = Object .assign (Object .create (X3DObjectArrayField .prototy
188
188
  {
189
189
  generator .PushUnitCategory (target .getUnit ());
190
190
 
191
- stream .string += "[\n";
191
+ generator .string += "[";
192
+ generator .string += generator .TidyBreak ();
192
193
  generator .IncIndent ();
193
194
 
194
195
  for (let i = 0, length = array .length; i < length; ++ i)
195
196
  {
196
- stream .string += generator .Indent ();
197
- array [i] .toStream (stream);
198
- stream .string += "\n";
197
+ generator .string += generator .Indent ();
198
+ array [i] .toStream (generator);
199
+ generator .string += generator .TidyBreak ();
199
200
  }
200
201
 
201
202
  generator .DecIndent ();
202
- stream .string += generator .Indent ();
203
- stream .string += "]";
203
+ generator .string += generator .Indent ();
204
+ generator .string += "]";
204
205
 
205
206
  generator .PopUnitCategory ();
206
207
  break;
@@ -217,25 +218,26 @@ MFNode .prototype = Object .assign (Object .create (X3DObjectArrayField .prototy
217
218
 
218
219
  return string;
219
220
  },
220
- toVRMLStream: function (stream)
221
+ toVRMLStream: function (generator)
221
222
  {
222
223
  const
223
- target = this .getTarget (),
224
- array = target .getValue (),
225
- generator = Generator .Get (stream);
224
+ target = this .getTarget (),
225
+ array = target .getValue ();
226
226
 
227
227
  switch (array .length)
228
228
  {
229
229
  case 0:
230
230
  {
231
- stream .string += "[ ]";
231
+ generator .string += "[";
232
+ generator .string += generator .TidySpace ();
233
+ generator .string += "]";
232
234
  break;
233
235
  }
234
236
  case 1:
235
237
  {
236
238
  generator .EnterScope ();
237
239
 
238
- array [0] .toVRMLStream (stream);
240
+ array [0] .toVRMLStream (generator);
239
241
 
240
242
  generator .LeaveScope ();
241
243
  break;
@@ -244,19 +246,20 @@ MFNode .prototype = Object .assign (Object .create (X3DObjectArrayField .prototy
244
246
  {
245
247
  generator .EnterScope ();
246
248
 
247
- stream .string += "[\n";
249
+ generator .string += "[";
250
+ generator .string += generator .TidyBreak ();
248
251
  generator .IncIndent ();
249
252
 
250
253
  for (const element of array)
251
254
  {
252
- stream .string += generator .Indent ();
253
- element .toVRMLStream (stream);
254
- stream .string += "\n";
255
+ generator .string += generator .Indent ();
256
+ element .toVRMLStream (generator);
257
+ generator .string += generator .TidyBreak ();
255
258
  }
256
259
 
257
260
  generator .DecIndent ();
258
- stream .string += generator .Indent ();
259
- stream .string += "]";
261
+ generator .string += generator .Indent ();
262
+ generator .string += "]";
260
263
 
261
264
  generator .LeaveScope ();
262
265
  break;
@@ -273,11 +276,9 @@ MFNode .prototype = Object .assign (Object .create (X3DObjectArrayField .prototy
273
276
 
274
277
  return string;
275
278
  },
276
- toXMLStream: function (stream)
279
+ toXMLStream: function (generator)
277
280
  {
278
- const
279
- generator = Generator .Get (stream),
280
- length = this .length;
281
+ const length = this .length;
281
282
 
282
283
  if (length)
283
284
  {
@@ -291,26 +292,26 @@ MFNode .prototype = Object .assign (Object .create (X3DObjectArrayField .prototy
291
292
 
292
293
  if (node)
293
294
  {
294
- node .toXMLStream (stream);
295
- stream .string += "\n";
295
+ node .toXMLStream (generator);
296
+ generator .string += generator .TidyBreak ();
296
297
  }
297
298
  else
298
299
  {
299
- stream .string += generator .Indent ();
300
- stream .string += "<";
301
- stream .string += "NULL";
300
+ generator .string += generator .Indent ();
301
+ generator .string += "<";
302
+ generator .string += "NULL";
302
303
 
303
304
  const containerField = generator .ContainerField ();
304
305
 
305
306
  if (containerField)
306
307
  {
307
- stream .string += " ";
308
- stream .string += "containerField='";
309
- stream .string += generator .XMLEncode (containerField .getName ());
310
- stream .string += "'";
308
+ generator .string += generator .Space ();
309
+ generator .string += "containerField='";
310
+ generator .string += generator .XMLEncode (containerField .getName ());
311
+ generator .string += "'";
311
312
  }
312
313
 
313
- stream .string += "/>";
314
+ generator .string += "/>";
314
315
  }
315
316
  }
316
317
 
@@ -318,28 +319,76 @@ MFNode .prototype = Object .assign (Object .create (X3DObjectArrayField .prototy
318
319
 
319
320
  if (node)
320
321
  {
321
- node .toXMLStream (stream);
322
+ node .toXMLStream (generator);
322
323
  }
323
324
  else
324
325
  {
325
- stream .string += generator .Indent ();
326
- stream .string += "<";
327
- stream .string += "NULL";
326
+ generator .string += generator .Indent ();
327
+ generator .string += "<";
328
+ generator .string += "NULL";
328
329
 
329
330
  const containerField = generator .ContainerField ();
330
331
 
331
332
  if (containerField)
332
333
  {
333
- stream .string += " ";
334
- stream .string += "containerField='";
335
- stream .string += generator .XMLEncode (containerField .getName ());
336
- stream .string += "'";
334
+ generator .string += generator .Space ();
335
+ generator .string += "containerField='";
336
+ generator .string += generator .XMLEncode (containerField .getName ());
337
+ generator .string += "'";
337
338
  }
338
339
  }
339
340
 
340
341
  generator .LeaveScope ();
341
342
  }
342
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
+ },
343
392
  dispose: function ()
344
393
  {
345
394
  this .resize (0);
@@ -383,7 +432,7 @@ MFString .prototype = Object .assign (Object .create (X3DObjectArrayField .proto
383
432
  {
384
433
  return X3DConstants .MFString;
385
434
  },
386
- toXMLStream: function (stream)
435
+ toXMLStream: function (generator)
387
436
  {
388
437
  const length = this .length;
389
438
 
@@ -393,15 +442,16 @@ MFString .prototype = Object .assign (Object .create (X3DObjectArrayField .proto
393
442
 
394
443
  for (let i = 0, n = length - 1; i < n; ++ i)
395
444
  {
396
- stream .string += "\"";
397
- value [i] .toXMLStream (stream);
398
- stream .string += "\"";
399
- stream .string += ", ";
445
+ generator .string += "\"";
446
+ value [i] .toXMLStream (generator);
447
+ generator .string += "\"";
448
+ generator .string += generator .Comma ();
449
+ generator .string += generator .TidySpace ();
400
450
  }
401
451
 
402
- stream .string += "\"";
403
- value .at (-1) .toXMLStream (stream);
404
- stream .string += "\"";
452
+ generator .string += "\"";
453
+ value .at (-1) .toXMLStream (generator);
454
+ generator .string += "\"";
405
455
  }
406
456
  },
407
457
  });
@@ -80,17 +80,25 @@ SFBool .prototype = Object .assign (Object .create (X3DField .prototype),
80
80
  {
81
81
  return this .getValue ();
82
82
  },
83
- toStream: function (stream)
83
+ toStream: function (generator)
84
84
  {
85
- stream .string += this .getValue () ? "TRUE" : "FALSE";
85
+ generator .string += this .getValue () ? "TRUE" : "FALSE";
86
86
  },
87
- toVRMLStream: function (stream)
87
+ toVRMLStream: function (generator)
88
88
  {
89
- this .toStream (stream);
89
+ this .toStream (generator);
90
90
  },
91
- toXMLStream: function (stream)
91
+ toXMLStream: function (generator)
92
92
  {
93
- stream .string += this .getValue () ? "true" : "false";
93
+ generator .string += this .getValue () ? "true" : "false";
94
+ },
95
+ toJSONStream: function (generator)
96
+ {
97
+ this .toJSONStreamValue (generator);
98
+ },
99
+ toJSONStreamValue: function (generator)
100
+ {
101
+ generator .string += this .getValue () ? "true" : "false";
94
102
  },
95
103
  });
96
104
 
@@ -48,7 +48,6 @@
48
48
  import Color3 from "../../standard/Math/Numbers/Color3.js";
49
49
  import X3DField from "../Base/X3DField.js";
50
50
  import X3DConstants from "../Base/X3DConstants.js";
51
- import Generator from "../InputOutput/Generator.js";
52
51
 
53
52
  function SFColor (r, g, b)
54
53
  {
@@ -127,28 +126,52 @@ SFColor .prototype = Object .assign (Object .create (X3DField .prototype),
127
126
  return result;
128
127
  };
129
128
  })(),
130
- toStream: function (stream)
129
+ toStream: function (generator)
131
130
  {
132
131
  const
133
- generator = Generator .Get (stream),
134
- value = this .getValue (),
135
- last = value .length - 1;
132
+ value = this .getValue (),
133
+ last = value .length - 1;
136
134
 
137
135
  for (let i = 0; i < last; ++ i)
138
136
  {
139
- stream .string += generator .Precision (value [i]);
140
- stream .string += " ";
137
+ generator .string += generator .Precision (value [i]);
138
+ generator .string += generator .TidySpace ();
141
139
  }
142
140
 
143
- stream .string += generator .Precision (value [last]);
141
+ generator .string += generator .Precision (value [last]);
144
142
  },
145
- toVRMLStream: function (stream)
143
+ toVRMLStream: function (generator)
146
144
  {
147
- this .toStream (stream);
145
+ this .toStream (generator);
148
146
  },
149
- toXMLStream: function (stream)
147
+ toXMLStream: function (generator)
150
148
  {
151
- this .toStream (stream);
149
+ this .toStream (generator);
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]));
152
175
  },
153
176
  });
154
177
 
@@ -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))
@@ -47,7 +47,6 @@
47
47
 
48
48
  import X3DField from "../Base/X3DField.js";
49
49
  import X3DConstants from "../Base/X3DConstants.js";
50
- import Generator from "../InputOutput/Generator.js";
51
50
 
52
51
  function SFDouble (value)
53
52
  {
@@ -78,21 +77,29 @@ SFDouble .prototype = Object .assign (Object .create (X3DField .prototype),
78
77
  X3DField .prototype .set .call (this, +value);
79
78
  },
80
79
  valueOf: X3DField .prototype .getValue,
81
- toStream: function (stream)
80
+ toStream: function (generator)
82
81
  {
83
- const
84
- generator = Generator .Get (stream),
85
- category = generator .Unit (this .getUnit ());
82
+ const category = generator .Unit (this .getUnit ());
86
83
 
87
- stream .string += generator .DoublePrecision (generator .ToUnit (category, this .getValue ()));
84
+ generator .string += generator .DoublePrecision (generator .ToUnit (category, this .getValue ()));
88
85
  },
89
- toVRMLStream: function (stream)
86
+ toVRMLStream: function (generator)
90
87
  {
91
- this .toStream (stream);
88
+ this .toStream (generator);
92
89
  },
93
- toXMLStream: function (stream)
90
+ toXMLStream: function (generator)
94
91
  {
95
- this .toStream (stream);
92
+ this .toStream (generator);
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 ())));
96
103
  },
97
104
  });
98
105
 
@@ -47,7 +47,6 @@
47
47
 
48
48
  import X3DField from "../Base/X3DField.js";
49
49
  import X3DConstants from "../Base/X3DConstants.js";
50
- import Generator from "../InputOutput/Generator.js";
51
50
 
52
51
  function SFFloat (value)
53
52
  {
@@ -78,21 +77,29 @@ SFFloat .prototype = Object .assign (Object .create (X3DField .prototype),
78
77
  X3DField .prototype .set .call (this, +value);
79
78
  },
80
79
  valueOf: X3DField .prototype .getValue,
81
- toStream: function (stream)
80
+ toStream: function (generator)
82
81
  {
83
- const
84
- generator = Generator .Get (stream),
85
- category = generator .Unit (this .getUnit ());
82
+ const category = generator .Unit (this .getUnit ());
86
83
 
87
- stream .string += generator .Precision (generator .ToUnit (category, this .getValue ()));
84
+ generator .string += generator .Precision (generator .ToUnit (category, this .getValue ()));
88
85
  },
89
- toVRMLStream: function (stream)
86
+ toVRMLStream: function (generator)
90
87
  {
91
- this .toStream (stream);
88
+ this .toStream (generator);
92
89
  },
93
- toXMLStream: function (stream)
90
+ toXMLStream: function (generator)
94
91
  {
95
- this .toStream (stream);
92
+ this .toStream (generator);
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 ())));
96
103
  },
97
104
  });
98
105
 
@@ -184,20 +184,105 @@ SFImage .prototype = Object .assign (Object .create (X3DField .prototype),
184
184
  {
185
185
  return X3DConstants .SFImage;
186
186
  },
187
- toStream: function (stream)
187
+ toStream: function (generator)
188
188
  {
189
- stream .string += this .width + " " + this .height + " " + this .comp;
189
+ const array = this .array;
190
190
 
191
- for (const value of this .array)
192
- stream .string += " 0x" + value .toString (16);
191
+ generator .string += this .width;
192
+ generator .string += generator .Space ();
193
+ generator .string += this .height;
194
+ generator .string += generator .Space ();
195
+ generator .string += this .comp;
196
+ generator .string += generator .AttribBreak ();
197
+
198
+ generator .IncIndent ();
199
+
200
+ for (let y = 0, h = this .height; y < h; ++ y)
201
+ {
202
+ generator .string += generator .ListIndent ();
203
+
204
+ const s = y * this .width;
205
+
206
+ for (let x = 0, w = this .width; x < w; ++ x)
207
+ {
208
+ generator .string += "0x";
209
+ generator .string += array [x + s] .toString (16);
210
+
211
+ if (x !== w - 1)
212
+ generator .string += generator .Space ();
213
+ }
214
+
215
+ if (y !== h - 1)
216
+ generator .string += generator .AttribBreak ();
217
+ }
218
+
219
+ generator .DecIndent ();
220
+ },
221
+ toVRMLStream: function (generator)
222
+ {
223
+ this .toStream (generator);
224
+ },
225
+ toXMLStream: function (generator)
226
+ {
227
+ this .toStream (generator);
193
228
  },
194
- toVRMLStream: function (stream)
229
+ toJSONStream: function (generator)
195
230
  {
196
- this .toStream (stream);
231
+ generator .string += '[';
232
+ generator .string += generator .ListBreak ();
233
+ generator .string += generator .IncIndent ();
234
+ generator .string += generator .ListIndent ();
235
+
236
+ this .toJSONStreamValue (generator);
237
+
238
+ generator .string += generator .DecIndent ();
239
+ generator .string += generator .ListBreak ();
240
+ generator .string += generator .ListIndent ();
241
+ generator .string += ']';
197
242
  },
198
- toXMLStream: function (stream)
243
+ toJSONStreamValue: function (generator)
199
244
  {
200
- this .toStream (stream);
245
+ const
246
+ array = this .array,
247
+ length = array .length;
248
+
249
+ generator .string += this .width;
250
+ generator .string += ',';
251
+ generator .string += generator .TidySpace ();
252
+ generator .string += this .height;
253
+ generator .string += ',';
254
+ generator .string += generator .TidySpace ();
255
+ generator .string += this .comp;
256
+ generator .string += ',';
257
+
258
+ if (this .width && this .height)
259
+ {
260
+ generator .string += generator .ListBreak ();
261
+ generator .string += generator .IncIndent ();
262
+
263
+ for (let y = 0, h = this .height; y < h; ++ y)
264
+ {
265
+ generator .string += generator .ListIndent ();
266
+
267
+ const s = y * this .width;
268
+
269
+ for (let x = 0, w = this .width; x < w; ++ x)
270
+ {
271
+ generator .string += array [x + s];
272
+
273
+ if (x + s !== length - 1)
274
+ generator .string += ',';
275
+
276
+ if (x !== w - 1)
277
+ generator .string += generator .TidySpace ();
278
+ }
279
+
280
+ if (y !== h - 1)
281
+ generator .string += generator .ListBreak ();
282
+ }
283
+
284
+ generator .string += generator .DecIndent ();
285
+ }
201
286
  },
202
287
  });
203
288
 
@@ -77,17 +77,25 @@ SFInt32 .prototype = Object .assign (Object .create (X3DField .prototype),
77
77
  X3DField .prototype .set .call (this, ~~value);
78
78
  },
79
79
  valueOf: X3DField .prototype .getValue,
80
- toStream: function (stream, base)
80
+ toStream: function (generator)
81
81
  {
82
- stream .string += this .getValue () .toString (base);
82
+ generator .string += this .getValue () .toString ();
83
83
  },
84
- toVRMLStream: function (stream)
84
+ toVRMLStream: function (generator)
85
85
  {
86
- this .toStream (stream);
86
+ this .toStream (generator);
87
87
  },
88
- toXMLStream: function (stream)
88
+ toXMLStream: function (generator)
89
89
  {
90
- stream .string += this .getValue () .toString ();
90
+ this .toStream (generator);
91
+ },
92
+ toJSONStream: function (generator)
93
+ {
94
+ this .toStream (generator);
95
+ },
96
+ toJSONStreamValue: function (generator)
97
+ {
98
+ this .toStream (generator);
91
99
  },
92
100
  });
93
101