x_ite 8.6.0 → 8.6.2

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/.vscode/settings.json +7 -7
  2. package/dist/assets/components/Annotation.js +13 -13
  3. package/dist/assets/components/Annotation.min.js +1 -1
  4. package/dist/assets/components/CADGeometry.js +13 -13
  5. package/dist/assets/components/CADGeometry.min.js +1 -1
  6. package/dist/assets/components/CubeMapTexturing.js +25 -25
  7. package/dist/assets/components/CubeMapTexturing.min.js +1 -1
  8. package/dist/assets/components/DIS.js +13 -13
  9. package/dist/assets/components/DIS.min.js +1 -1
  10. package/dist/assets/components/EventUtilities.js +9 -9
  11. package/dist/assets/components/EventUtilities.min.js +1 -1
  12. package/dist/assets/components/Geometry2D.js +19 -19
  13. package/dist/assets/components/Geometry2D.min.js +1 -1
  14. package/dist/assets/components/Geospatial.js +33 -33
  15. package/dist/assets/components/Geospatial.min.js +1 -1
  16. package/dist/assets/components/HAnim.js +18 -18
  17. package/dist/assets/components/HAnim.min.js +1 -1
  18. package/dist/assets/components/KeyDeviceSensor.js +8 -8
  19. package/dist/assets/components/KeyDeviceSensor.min.js +1 -1
  20. package/dist/assets/components/Layout.js +27 -27
  21. package/dist/assets/components/Layout.min.js +1 -1
  22. package/dist/assets/components/NURBS.js +24 -24
  23. package/dist/assets/components/NURBS.min.js +1 -1
  24. package/dist/assets/components/ParticleSystems.js +23 -23
  25. package/dist/assets/components/ParticleSystems.min.js +1 -1
  26. package/dist/assets/components/Picking.js +19 -19
  27. package/dist/assets/components/Picking.min.js +1 -1
  28. package/dist/assets/components/RigidBodyPhysics.js +18 -18
  29. package/dist/assets/components/RigidBodyPhysics.min.js +1 -1
  30. package/dist/assets/components/Scripting.js +28 -28
  31. package/dist/assets/components/Scripting.min.js +1 -1
  32. package/dist/assets/components/Text.js +39 -48
  33. package/dist/assets/components/Text.min.js +1 -1
  34. package/dist/assets/components/TextureProjector.js +14 -14
  35. package/dist/assets/components/TextureProjector.min.js +1 -1
  36. package/dist/assets/components/Texturing3D.js +32 -32
  37. package/dist/assets/components/Texturing3D.min.js +1 -1
  38. package/dist/assets/components/VolumeRendering.js +19 -19
  39. package/dist/assets/components/VolumeRendering.min.js +1 -1
  40. package/dist/assets/components/X_ITE.js +9 -9
  41. package/dist/assets/components/X_ITE.min.js +1 -1
  42. package/dist/x_ite.css +1 -1
  43. package/dist/x_ite.js +690 -936
  44. package/dist/x_ite.min.js +1 -1
  45. package/dist/x_ite.zip +0 -0
  46. package/docs/_config.yml +2 -2
  47. package/docs/_includes/scripts.html +2 -2
  48. package/docs/_posts/components/CADGeometry/IndexedQuadSet.md +1 -1
  49. package/docs/_posts/components/CADGeometry/QuadSet.md +1 -1
  50. package/docs/_posts/components/Geometry3D/ElevationGrid.md +1 -1
  51. package/docs/_posts/components/Geometry3D/Extrusion.md +1 -1
  52. package/docs/_posts/components/Geometry3D/IndexedFaceSet.md +1 -1
  53. package/docs/_posts/components/Geospatial/GeoElevationGrid.md +1 -1
  54. package/docs/_posts/components/NURBS/NurbsSweptSurface.md +1 -1
  55. package/docs/_posts/components/NURBS/NurbsSwungSurface.md +1 -1
  56. package/docs/_posts/components/Rendering/IndexedTriangleFanSet.md +1 -1
  57. package/docs/_posts/components/Rendering/IndexedTriangleSet.md +1 -1
  58. package/docs/_posts/components/Rendering/IndexedTriangleStripSet.md +1 -1
  59. package/docs/_posts/components/Rendering/TriangleFanSet.md +1 -1
  60. package/docs/_posts/components/Rendering/TriangleSet.md +1 -1
  61. package/docs/_posts/components/Rendering/TriangleStripSet.md +1 -1
  62. package/docs/_posts/components/Shape/Material.md +1 -1
  63. package/docs/_posts/getting-started.md +1 -1
  64. package/docs/_posts/laboratory/x3d-file-converter.md +178 -0
  65. package/docs/_tabs/playground.html +80 -133
  66. package/docs/assets/css/style.scss +2 -42
  67. package/docs/laboratory/3d-l-system-generator.html +1 -1
  68. package/docs/laboratory/gltf-sample-viewer.html +1 -1
  69. package/docs/laboratory/online-dicom-and-nrrd-file-viewer.html +1 -1
  70. package/docs/laboratory/real-time-earth-quake-information.html +1 -1
  71. package/docs/laboratory/x3d-visual-blend-mode-editor.html +1 -1
  72. package/package.json +1 -1
  73. package/src/standard/Math/Algorithms/Bezier.js +133 -182
  74. package/src/standard/Math/Geometry/Box2.js +0 -1
  75. package/src/standard/Math/Geometry/Box3.js +0 -1
  76. package/src/standard/Math/Geometry/Cylinder3.js +1 -1
  77. package/src/standard/Math/Geometry/Line2.js +2 -4
  78. package/src/standard/Math/Geometry/Line3.js +2 -4
  79. package/src/standard/Math/Geometry/Plane3.js +1 -3
  80. package/src/standard/Math/Geometry/Sphere3.js +8 -12
  81. package/src/standard/Math/Geometry/Triangle3.js +8 -0
  82. package/src/standard/Math/Geometry/ViewVolume.js +17 -27
  83. package/src/standard/Math/Numbers/Color3.js +4 -7
  84. package/src/standard/Math/Numbers/Complex.js +8 -9
  85. package/src/standard/Math/Numbers/Matrix2.js +31 -42
  86. package/src/standard/Math/Numbers/Matrix3.js +54 -97
  87. package/src/standard/Math/Numbers/Matrix4.js +49 -160
  88. package/src/standard/Math/Numbers/Quaternion.js +20 -24
  89. package/src/standard/Math/Numbers/Rotation4.js +1 -2
  90. package/src/standard/Math/Numbers/Vector2.js +4 -12
  91. package/src/standard/Math/Numbers/Vector3.js +6 -18
  92. package/src/standard/Math/Numbers/Vector4.js +4 -20
  93. package/src/standard/Time/StopWatch.js +9 -14
  94. package/src/tests.js +11 -0
  95. package/src/x_ite/Browser/Core/BrowserTimings.js +10 -10
  96. package/src/x_ite/Browser/Core/X3DCoreContext.js +4 -6
  97. package/src/x_ite/Browser/Interpolation/CatmullRomSplineInterpolator.js +94 -88
  98. package/src/x_ite/Browser/Interpolation/CatmullRomSplineInterpolator1.js +2 -3
  99. package/src/x_ite/Browser/Interpolation/CatmullRomSplineInterpolatorTemplate.js +17 -14
  100. package/src/x_ite/Browser/Text/PolygonText.js +15 -24
  101. package/src/x_ite/Browser/VERSION.js +1 -1
  102. package/src/x_ite/Components/Core/X3DNode.js +12 -0
  103. package/src/x_ite/Components/Core/X3DPrototypeInstance.js +18 -0
  104. package/src/x_ite/Components/Interpolation/SquadOrientationInterpolator.js +8 -7
  105. package/src/x_ite/Configuration/UnitInfo.js +2 -0
  106. package/src/x_ite/Execution/X3DExportedNode.js +4 -0
  107. package/src/x_ite/Execution/X3DImportedNode.js +14 -0
  108. package/src/x_ite/Execution/X3DScene.js +4 -0
  109. package/src/x_ite/Fields/SFString.js +4 -6
  110. package/src/x_ite/InputOutput/FileLoader.js +1 -1
  111. package/src/x_ite/InputOutput/Generator.js +35 -55
  112. package/src/x_ite/Parser/GLTF2Parser.js +4 -4
  113. package/src/x_ite/Parser/SVGParser.js +24 -47
  114. package/src/x_ite/Parser/X3DParser.js +1 -1
  115. package/src/x_ite/Prototype/X3DExternProtoDeclaration.js +4 -0
  116. package/src/x_ite/Prototype/X3DProtoDeclaration.js +4 -0
  117. package/src/x_ite/Routing/X3DRoute.js +8 -0
@@ -133,7 +133,9 @@ X3DExportedNode .prototype = Object .assign (Object .create (X3DObject .prototyp
133
133
  generator .string += '"';
134
134
  generator .string += ':';
135
135
  generator .string += generator .TidySpace ();
136
+ generator .string += '"';
136
137
  generator .string += generator .JSONEncode (localName);
138
+ generator .string += '"';
137
139
 
138
140
  if (this [_exportedName] !== localName)
139
141
  {
@@ -145,7 +147,9 @@ X3DExportedNode .prototype = Object .assign (Object .create (X3DObject .prototyp
145
147
  generator .string += '"';
146
148
  generator .string += ':';
147
149
  generator .string += generator .TidySpace ();
150
+ generator .string += '"';
148
151
  generator .string += generator .JSONEncode (this [_exportedName]);
152
+ generator .string += '"';
149
153
  generator .string += generator .TidyBreak ();
150
154
  }
151
155
  else
@@ -350,7 +350,9 @@ X3DImportedNode .prototype = Object .assign (Object .create (X3DNode .prototype)
350
350
  generator .string += '"';
351
351
  generator .string += ':';
352
352
  generator .string += generator .TidySpace ();
353
+ generator .string += '"';
353
354
  generator .string += generator .JSONEncode (generator .Name (this .getInlineNode ()));
355
+ generator .string += '"';
354
356
  generator .string += ',';
355
357
  generator .string += generator .TidyBreak ();
356
358
 
@@ -360,7 +362,9 @@ X3DImportedNode .prototype = Object .assign (Object .create (X3DNode .prototype)
360
362
  generator .string += '"';
361
363
  generator .string += ':';
362
364
  generator .string += generator .TidySpace ();
365
+ generator .string += '"';
363
366
  generator .string += generator .JSONEncode (this .getExportedName ());
367
+ generator .string += '"';
364
368
 
365
369
  if (this .getImportedName () !== this .getExportedName ())
366
370
  {
@@ -372,7 +376,9 @@ X3DImportedNode .prototype = Object .assign (Object .create (X3DNode .prototype)
372
376
  generator .string += '"';
373
377
  generator .string += ':';
374
378
  generator .string += generator .TidySpace ();
379
+ generator .string += '"';
375
380
  generator .string += generator .JSONEncode (this .getImportedName ());
381
+ generator .string += '"';
376
382
  generator .string += generator .TidyBreak ();
377
383
  }
378
384
  else
@@ -437,7 +443,9 @@ X3DImportedNode .prototype = Object .assign (Object .create (X3DNode .prototype)
437
443
  generator .string += '"';
438
444
  generator .string += ':';
439
445
  generator .string += generator .TidySpace ();
446
+ generator .string += '"';
440
447
  generator .string += generator .JSONEncode (sourceNodeName);
448
+ generator .string += '"';
441
449
  generator .string += ',';
442
450
  generator .string += generator .TidyBreak ();
443
451
 
@@ -447,7 +455,9 @@ X3DImportedNode .prototype = Object .assign (Object .create (X3DNode .prototype)
447
455
  generator .string += '"';
448
456
  generator .string += ':';
449
457
  generator .string += generator .TidySpace ();
458
+ generator .string += '"';
450
459
  generator .string += generator .JSONEncode (sourceField);
460
+ generator .string += '"';
451
461
  generator .string += ',';
452
462
  generator .string += generator .TidyBreak ();
453
463
 
@@ -457,7 +467,9 @@ X3DImportedNode .prototype = Object .assign (Object .create (X3DNode .prototype)
457
467
  generator .string += '"';
458
468
  generator .string += ':';
459
469
  generator .string += generator .TidySpace ();
470
+ generator .string += '"';
460
471
  generator .string += generator .JSONEncode (destinationNodeName);
472
+ generator .string += '"';
461
473
  generator .string += ',';
462
474
  generator .string += generator .TidyBreak ();
463
475
 
@@ -467,7 +479,9 @@ X3DImportedNode .prototype = Object .assign (Object .create (X3DNode .prototype)
467
479
  generator .string += '"';
468
480
  generator .string += ':';
469
481
  generator .string += generator .TidySpace ();
482
+ generator .string += '"';
470
483
  generator .string += generator .JSONEncode (destinationField);
484
+ generator .string += '"';
471
485
  generator .string += generator .TidyBreak ();
472
486
 
473
487
  generator .string += generator .DecIndent ();
@@ -762,7 +762,9 @@ X3DScene .prototype = Object .assign (Object .create (X3DExecutionContext .proto
762
762
  generator .string += '"';
763
763
  generator .string += ':';
764
764
  generator .string += generator .TidySpace ();
765
+ generator .string += '"';
765
766
  generator .string += generator .JSONEncode (key);
767
+ generator .string += '"';
766
768
  generator .string += ',';
767
769
  generator .string += generator .TidyBreak ();
768
770
 
@@ -772,7 +774,9 @@ X3DScene .prototype = Object .assign (Object .create (X3DExecutionContext .proto
772
774
  generator .string += '"';
773
775
  generator .string += ':';
774
776
  generator .string += generator .TidySpace ();
777
+ generator .string += '"';
775
778
  generator .string += generator .JSONEncode (value);
779
+ generator .string += '"';
776
780
  generator .string += generator .TidyBreak ();
777
781
 
778
782
  generator .string += generator .DecIndent ();
@@ -48,10 +48,6 @@
48
48
  import X3DField from "../Base/X3DField.js";
49
49
  import X3DConstants from "../Base/X3DConstants.js";
50
50
 
51
- const
52
- unescape = /\\([\\"])/g,
53
- escape = /([\\"])/g;
54
-
55
51
  function SFString (value)
56
52
  {
57
53
  return X3DField .call (this, arguments .length ? "" + value : "");
@@ -61,11 +57,11 @@ Object .assign (SFString,
61
57
  {
62
58
  unescape: function (string)
63
59
  {
64
- return string .replace (unescape, "$1");
60
+ return string .replace (/\\([\\"])/g, "$1");
65
61
  },
66
62
  escape: function (string)
67
63
  {
68
- return string .replace (escape, "\\$1");
64
+ return string .replace (/([\\"])/g, "\\$1");
69
65
  },
70
66
  });
71
67
 
@@ -115,7 +111,9 @@ SFString .prototype = Object .assign (Object .create (X3DField .prototype),
115
111
  },
116
112
  toJSONStreamValue: function (generator)
117
113
  {
114
+ generator .string += '"';
118
115
  generator .string += generator .JSONEncode (this .getValue ());
116
+ generator .string += '"';
119
117
  },
120
118
  });
121
119
 
@@ -282,7 +282,7 @@ FileLoader .prototype = Object .assign (Object .create (X3DObject .prototype),
282
282
 
283
283
  const
284
284
  options = { cache: this .node .getCache () ? "default" : "reload" },
285
- response = this .handleErrors (await fetch (decodeURI (this .URL .href), options)),
285
+ response = this .handleErrors (await fetch (this .URL .href, options)),
286
286
  contentType = response .headers .get ("content-type") .replace (/;.*$/, "");
287
287
 
288
288
  if (this .foreign)
@@ -499,68 +499,48 @@ Generator .prototype =
499
499
 
500
500
  return value;
501
501
  },
502
- XMLEncode: function (string)
503
- {
504
- return string
505
- .replace (/&/g, "&")
506
- .replace (/\\/g, "\\\\")
507
- .replace (/\t/g, "	")
508
- .replace (/\n/g, "
")
509
- .replace (/\r/g, "
")
510
- .replace (/</g, "&lt;")
511
- .replace (/>/g, "&gt;")
512
- .replace (/'/g, "&apos;")
513
- .replace (/"/g, "\\\"");
514
- },
502
+ XMLEncode: (function ()
503
+ {
504
+ const map = {
505
+ "\\": "\\\\",
506
+ "\r": "&#xD;",
507
+ "\n": "&#xA;",
508
+ "\t": "&#x9;",
509
+ "\"": "\\\"",
510
+ "'": "&apos;",
511
+ "<": "&lt;",
512
+ ">": "&gt;",
513
+ "&": "&amp;",
514
+ };
515
+
516
+ const regex = /([\\\r\n\t"'<>&])/g;
517
+
518
+ return function (string)
519
+ {
520
+ return string .replace (regex, char => map [char]);
521
+ };
522
+ })(),
515
523
  escapeCDATA: function (string)
516
524
  {
517
525
  return string .replace (/\]\]\>/g, "\\]\\]\\>");
518
526
  },
519
- JSONEncode: function (string)
527
+ JSONEncode: (function ()
520
528
  {
521
- let result = '"';
522
-
523
- for (const character of string)
524
- {
525
- switch (character)
526
- {
527
- case '\r':
528
- {
529
- result += "\\r";
530
- break;
531
- }
532
- case '\n':
533
- {
534
- result += "\\n";
535
- break;
536
- }
537
- case '\t':
538
- {
539
- result += "\\t";
540
- break;
541
- }
542
- case '"':
543
- {
544
- result += "\\\"";
545
- break;
546
- }
547
- case '\\':
548
- {
549
- result += "\\\\";
550
- break;
551
- }
552
- default:
553
- {
554
- result += character;
555
- break;
556
- }
557
- }
558
- }
529
+ const map = {
530
+ "\\": "\\\\",
531
+ "\r": "\\r",
532
+ "\n": "\\n",
533
+ "\t": "\\t",
534
+ "\"": "\\\"",
535
+ };
559
536
 
560
- result += '"';
537
+ const regex = /([\\\t\n\r"])/g;
561
538
 
562
- return result;
563
- },
539
+ return function (string)
540
+ {
541
+ return string .replace (regex, char => map [char]);
542
+ };
543
+ })(),
564
544
  JSONNumber: function (value)
565
545
  {
566
546
  switch (value)
@@ -2175,16 +2175,16 @@ GLTF2Parser .prototype = Object .assign (Object .create (X3DParser .prototype),
2175
2175
  index1 = Algorithm .clamp (Algorithm .upperBound (times, 0, times .length, time), 1, times .length - 1),
2176
2176
  index0 = index1 - 1,
2177
2177
  td = times [index1] - times [index0],
2178
- t = (time - times [index0]) / td,
2179
- t2 = Math .pow (t, 2),
2180
- t3 = Math .pow (t, 3),
2178
+ t1 = (time - times [index0]) / td,
2179
+ t2 = t1 * t1,
2180
+ t3 = t2 * t1,
2181
2181
  v0 = values [index0 * 3 + 1] .copy (),
2182
2182
  b0 = values [index0 * 3 + 2] .copy (),
2183
2183
  v1 = values [index1 * 3 + 1] .copy (),
2184
2184
  a1 = values [index1 * 3 + 0] .copy ();
2185
2185
 
2186
2186
  v0 .multiply (2 * t3 - 3 * t2 + 1);
2187
- b0 .multiply (td * (t3 - 2 * t2 + t));
2187
+ b0 .multiply (td * (t3 - 2 * t2 + t1));
2188
2188
  v1 .multiply (-2 * t3 + 3 * t2);
2189
2189
  a1 .multiply (td * (t3 - t2));
2190
2190
 
@@ -103,9 +103,9 @@ const
103
103
  PICA = INCH / 6, // One pica in meters.
104
104
  PIXEL = INCH / 90, // One pixel in meters.
105
105
  EM = 16, // One em in pixels,
106
- BEZIER_STEPS = 10,
107
- CIRCLE_STEPS = 64,
108
- GRADIENT_SIZE = 256; // In pixels.
106
+ BEZIER_STEPS = 10, // Subdivisions of a span.
107
+ CIRCLE_STEPS = 64, // Subdivisions of a circle, used for arc.
108
+ GRADIENT_SIZE = 256; // In pixels.
109
109
 
110
110
  /*
111
111
  * Parser
@@ -124,7 +124,7 @@ function SVGParser (scene)
124
124
 
125
125
  // Options
126
126
 
127
- this .solid = false;
127
+ this .solid = false; // Are 2D primitives solid.
128
128
 
129
129
  // Globals
130
130
 
@@ -727,8 +727,7 @@ SVGParser .prototype = Object .assign (Object .create (X3DParser .prototype),
727
727
 
728
728
  const coordinateNode = scene .createNode ("Coordinate");
729
729
 
730
- for (const point of points)
731
- coordinateNode .point .push (new Vector3 (point .x, point .y, 0));
730
+ coordinateNode .point .push (... points);
732
731
 
733
732
  if (this .style .fillType !== "NONE")
734
733
  {
@@ -800,10 +799,7 @@ SVGParser .prototype = Object .assign (Object .create (X3DParser .prototype),
800
799
  const coordinateNode = scene .createNode ("Coordinate");
801
800
 
802
801
  for (const points of contours)
803
- {
804
- for (const point of points)
805
- coordinateNode .point .push (new Vector3 (point .x, point .y, 0));
806
- }
802
+ coordinateNode .point .push (... points);
807
803
 
808
804
  if (this .style .fillType !== "NONE")
809
805
  {
@@ -1030,6 +1026,9 @@ SVGParser .prototype = Object .assign (Object .create (X3DParser .prototype),
1030
1026
  },
1031
1027
  hrefAttribute: function (attribute)
1032
1028
  {
1029
+ if (!attribute)
1030
+ return;
1031
+
1033
1032
  const
1034
1033
  scene = this .getExecutionContext (),
1035
1034
  hash = new URL (attribute, scene .getWorldURL ()) .hash .slice (1);
@@ -1124,7 +1123,7 @@ SVGParser .prototype = Object .assign (Object .create (X3DParser .prototype),
1124
1123
  {
1125
1124
  const y = this .value;
1126
1125
 
1127
- points .push (new Vector2 (x, y));
1126
+ points .push (new Vector3 (x, y, 0));
1128
1127
 
1129
1128
  if (this .comma ())
1130
1129
  continue;
@@ -1173,8 +1172,6 @@ SVGParser .prototype = Object .assign (Object .create (X3DParser .prototype),
1173
1172
  {
1174
1173
  // moveto
1175
1174
 
1176
- points = this .removeConsecutiveIdenticalPoints (points);
1177
-
1178
1175
  if (points .length > 2)
1179
1176
  {
1180
1177
  contours .push (Object .assign (points, { index: index, closed: false }));
@@ -1202,7 +1199,7 @@ SVGParser .prototype = Object .assign (Object .create (X3DParser .prototype),
1202
1199
  y += ay;
1203
1200
  }
1204
1201
 
1205
- points .push (new Vector2 (x, y));
1202
+ points .push (new Vector3 (x, y, 0));
1206
1203
 
1207
1204
  ax = x;
1208
1205
  ay = y;
@@ -1240,7 +1237,7 @@ SVGParser .prototype = Object .assign (Object .create (X3DParser .prototype),
1240
1237
  y += ay;
1241
1238
  }
1242
1239
 
1243
- points .push (new Vector2 (x, y));
1240
+ points .push (new Vector3 (x, y, 0));
1244
1241
 
1245
1242
  ax = x;
1246
1243
  ay = y;
@@ -1269,7 +1266,7 @@ SVGParser .prototype = Object .assign (Object .create (X3DParser .prototype),
1269
1266
  if (relative)
1270
1267
  x += ax;
1271
1268
 
1272
- points .push (new Vector2 (x, ay));
1269
+ points .push (new Vector3 (x, ay, 0));
1273
1270
 
1274
1271
  ax = x;
1275
1272
 
@@ -1296,7 +1293,7 @@ SVGParser .prototype = Object .assign (Object .create (X3DParser .prototype),
1296
1293
  if (relative)
1297
1294
  y += ay;
1298
1295
 
1299
- points .push (new Vector2 (ax, y));
1296
+ points .push (new Vector3 (ax, y, 0));
1300
1297
 
1301
1298
  ay = y;
1302
1299
 
@@ -1346,9 +1343,7 @@ SVGParser .prototype = Object .assign (Object .create (X3DParser .prototype),
1346
1343
  y += ay;
1347
1344
  }
1348
1345
 
1349
- const curve = new Bezier (ax, ay, x1, y1, x, y);
1350
-
1351
- points .push (... curve .getPoints ("quadric", BEZIER_STEPS));
1346
+ Bezier .quadric (ax, ay, 0, x1, y1, 0, x, y, 0, BEZIER_STEPS, points);
1352
1347
 
1353
1348
  ax = x;
1354
1349
  ay = y;
@@ -1409,9 +1404,7 @@ SVGParser .prototype = Object .assign (Object .create (X3DParser .prototype),
1409
1404
  }
1410
1405
  }
1411
1406
 
1412
- const curve = new Bezier (ax, ay, x1, y1, x, y);
1413
-
1414
- points .push (... curve .getPoints ("quadric", BEZIER_STEPS));
1407
+ Bezier .quadric (ax, ay, 0, x1, y1, 0, x, y, 0, BEZIER_STEPS, points);
1415
1408
 
1416
1409
  ax = x;
1417
1410
  ay = y;
@@ -1477,9 +1470,7 @@ SVGParser .prototype = Object .assign (Object .create (X3DParser .prototype),
1477
1470
  y += ay;
1478
1471
  }
1479
1472
 
1480
- const curve = new Bezier (ax, ay, x1, y1, x2, y2, x, y);
1481
-
1482
- points .push (... curve .getPoints ("cubic", BEZIER_STEPS));
1473
+ Bezier .cubic (ax, ay, 0, x1, y1, 0, x2, y2, 0, x, y, 0, BEZIER_STEPS, points);
1483
1474
 
1484
1475
  ax = x;
1485
1476
  ay = y;
@@ -1556,9 +1547,7 @@ SVGParser .prototype = Object .assign (Object .create (X3DParser .prototype),
1556
1547
  }
1557
1548
  }
1558
1549
 
1559
- const curve = new Bezier (ax, ay, x1, y1, x2, y2, x, y);
1560
-
1561
- points .push (... curve .getPoints ("cubic", BEZIER_STEPS));
1550
+ Bezier .cubic (ax, ay, 0, x1, y1, 0, x2, y2, 0, x, y, 0, BEZIER_STEPS, points);
1562
1551
 
1563
1552
  ax = x;
1564
1553
  ay = y;
@@ -1598,7 +1587,7 @@ SVGParser .prototype = Object .assign (Object .create (X3DParser .prototype),
1598
1587
 
1599
1588
  if (this .double ())
1600
1589
  {
1601
- let xAxisRotation = this .value;
1590
+ let xAxisRotation = Algorithm .radians (this .value);
1602
1591
 
1603
1592
  this .comma ();
1604
1593
 
@@ -1630,9 +1619,7 @@ SVGParser .prototype = Object .assign (Object .create (X3DParser .prototype),
1630
1619
  y += ay;
1631
1620
  }
1632
1621
 
1633
- const curve = new Bezier (ax, ay, rx, ry, Algorithm .radians (xAxisRotation), largeArcFlag, sweepFlag, x, y);
1634
-
1635
- points .push (... curve .getPoints ("arc", CIRCLE_STEPS));
1622
+ Bezier .arc (ax, ay, rx, ry, xAxisRotation, largeArcFlag, sweepFlag, x, y, CIRCLE_STEPS, points);
1636
1623
 
1637
1624
  ax = x;
1638
1625
  ay = y;
@@ -1657,8 +1644,6 @@ SVGParser .prototype = Object .assign (Object .create (X3DParser .prototype),
1657
1644
  {
1658
1645
  // closepath
1659
1646
 
1660
- points = this .removeConsecutiveIdenticalPoints (points);
1661
-
1662
1647
  if (points .length > 2)
1663
1648
  {
1664
1649
  ax = points [0] .x;
@@ -1679,17 +1664,11 @@ SVGParser .prototype = Object .assign (Object .create (X3DParser .prototype),
1679
1664
  break;
1680
1665
  }
1681
1666
 
1682
- points = this .removeConsecutiveIdenticalPoints (points);
1683
-
1684
1667
  if (points .length > 2)
1685
1668
  contours .push (Object .assign (points, { index: index, closed: false }));
1686
1669
 
1687
1670
  return !! contours .length;
1688
1671
  },
1689
- removeConsecutiveIdenticalPoints: function (points)
1690
- {
1691
- return points .filter ((p, i, a) => !p .equals (a [(i + 1) % a .length]));
1692
- },
1693
1672
  transformAttribute: function (attribute)
1694
1673
  {
1695
1674
  const matrix = new Matrix3 ();
@@ -2430,11 +2409,9 @@ SVGParser .prototype = Object .assign (Object .create (X3DParser .prototype),
2430
2409
 
2431
2410
  function combineCallback (coords, data, weight)
2432
2411
  {
2433
- const
2434
- point = new Vector3 (... coords),
2435
- index = coordinateNode .point .length;
2412
+ const index = coordinateNode .point .length;
2436
2413
 
2437
- coordinateNode .point .push (point);
2414
+ coordinateNode .point .push (new Vector3 (... coords));
2438
2415
 
2439
2416
  return index;
2440
2417
  }
@@ -2452,8 +2429,8 @@ SVGParser .prototype = Object .assign (Object .create (X3DParser .prototype),
2452
2429
  {
2453
2430
  tessy .gluTessBeginContour ();
2454
2431
 
2455
- for (const [i, p] of points .entries ())
2456
- tessy .gluTessVertex ([p .x, p .y, 0], points .index + i);
2432
+ for (const [i, point] of points .entries ())
2433
+ tessy .gluTessVertex (point, points .index + i);
2457
2434
 
2458
2435
  tessy .gluTessEndContour ();
2459
2436
  }
@@ -142,7 +142,7 @@ X3DParser .prototype = {
142
142
  convertColor: function (value)
143
143
  {
144
144
  const
145
- div = $("<div></div>") .css ("color", value) .appendTo (this .getBrowser () .getShadow ()),
145
+ div = $("<div></div>") .hide () .css ("color", value) .appendTo ($("body")),
146
146
  rgb = window .getComputedStyle (div [0]) .color,
147
147
  values = rgb .replace (/^rgba?\(|\)$/g, "") .split (/[\s,]+/) .map (s => parseFloat (s));
148
148
 
@@ -296,7 +296,9 @@ X3DExternProtoDeclaration .prototype = Object .assign (Object .create (X3DProtoD
296
296
  generator .string += "@name";
297
297
  generator .string += '"';
298
298
  generator .string += ':';
299
+ generator .string += '"';
299
300
  generator .string += generator .JSONEncode (this .getName ());
301
+ generator .string += '"';
300
302
  generator .string += ',';
301
303
  generator .string += generator .TidyBreak ();
302
304
 
@@ -354,7 +356,9 @@ X3DExternProtoDeclaration .prototype = Object .assign (Object .create (X3DProtoD
354
356
  generator .string += '"';
355
357
  generator .string += ':';
356
358
  generator .string += generator .TidySpace ();
359
+ generator .string += '"';
357
360
  generator .string += generator .JSONEncode (field .getName ());
361
+ generator .string += '"';
358
362
  generator .string += generator .TidyBreak ();
359
363
 
360
364
  generator .string += generator .DecIndent ();
@@ -326,7 +326,9 @@ X3DProtoDeclaration .prototype = Object .assign (Object .create (X3DProtoDeclara
326
326
  generator .string += "@name";
327
327
  generator .string += '"';
328
328
  generator .string += ':';
329
+ generator .string += '"';
329
330
  generator .string += generator .JSONEncode (this .getName ());
331
+ generator .string += '"';
330
332
  generator .string += ',';
331
333
  generator .string += generator .TidyBreak ();
332
334
 
@@ -396,7 +398,9 @@ X3DProtoDeclaration .prototype = Object .assign (Object .create (X3DProtoDeclara
396
398
  generator .string += '"';
397
399
  generator .string += ':';
398
400
  generator .string += generator .TidySpace ();
401
+ generator .string += '"';
399
402
  generator .string += generator .JSONEncode (field .getName ());
403
+ generator .string += '"';
400
404
 
401
405
  if (field .isDefaultValue ())
402
406
  {
@@ -198,7 +198,9 @@ X3DRoute .prototype = Object .assign (Object .create (X3DObject .prototype),
198
198
  generator .string += '"';
199
199
  generator .string += ':';
200
200
  generator .string += generator .TidySpace ();
201
+ generator .string += '"';
201
202
  generator .string += generator .JSONEncode (sourceNodeName);
203
+ generator .string += '"';
202
204
  generator .string += ',';
203
205
  generator .string += generator .TidyBreak ();
204
206
 
@@ -208,7 +210,9 @@ X3DRoute .prototype = Object .assign (Object .create (X3DObject .prototype),
208
210
  generator .string += '"';
209
211
  generator .string += ':';
210
212
  generator .string += generator .TidySpace ();
213
+ generator .string += '"';
211
214
  generator .string += generator .JSONEncode (this [_sourceField] .getName ());
215
+ generator .string += '"';
212
216
  generator .string += ',';
213
217
  generator .string += generator .TidyBreak ();
214
218
 
@@ -218,7 +222,9 @@ X3DRoute .prototype = Object .assign (Object .create (X3DObject .prototype),
218
222
  generator .string += '"';
219
223
  generator .string += ':';
220
224
  generator .string += generator .TidySpace ();
225
+ generator .string += '"';
221
226
  generator .string += generator .JSONEncode (destinationNodeName);
227
+ generator .string += '"';
222
228
  generator .string += ',';
223
229
  generator .string += generator .TidyBreak ();
224
230
 
@@ -228,7 +234,9 @@ X3DRoute .prototype = Object .assign (Object .create (X3DObject .prototype),
228
234
  generator .string += '"';
229
235
  generator .string += ':';
230
236
  generator .string += generator .TidySpace ();
237
+ generator .string += '"';
231
238
  generator .string += generator .JSONEncode (this [_destinationField] .getName ());
239
+ generator .string += '"';
232
240
  generator .string += generator .TidyBreak ();
233
241
 
234
242
  generator .string += generator .DecIndent ();