x_ite 8.6.1 → 8.6.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 (73) 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 +18 -18
  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 +18 -18
  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 +33 -36
  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 +30 -30
  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 +221 -186
  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/getting-started.md +1 -1
  47. package/docs/_posts/laboratory/x3d-file-converter.md +183 -0
  48. package/docs/laboratory/3d-l-system-generator.html +1 -1
  49. package/docs/laboratory/gltf-sample-viewer.html +1 -1
  50. package/docs/laboratory/online-dicom-and-nrrd-file-viewer.html +1 -1
  51. package/docs/laboratory/real-time-earth-quake-information.html +1 -1
  52. package/docs/laboratory/x3d-visual-blend-mode-editor.html +1 -1
  53. package/package.json +1 -1
  54. package/src/standard/Math/Algorithms/Bezier.js +3 -15
  55. package/src/standard/Math/Numbers/Matrix2.js +5 -5
  56. package/src/tests.js +11 -0
  57. package/src/x_ite/Browser/Core/X3DCoreContext.js +4 -6
  58. package/src/x_ite/Browser/Text/PolygonText.js +9 -12
  59. package/src/x_ite/Browser/VERSION.js +1 -1
  60. package/src/x_ite/Components/Core/X3DNode.js +12 -0
  61. package/src/x_ite/Components/Core/X3DPrototypeInstance.js +18 -0
  62. package/src/x_ite/Configuration/UnitInfo.js +2 -0
  63. package/src/x_ite/Execution/X3DExportedNode.js +4 -0
  64. package/src/x_ite/Execution/X3DImportedNode.js +14 -0
  65. package/src/x_ite/Execution/X3DScene.js +4 -0
  66. package/src/x_ite/Fields/SFString.js +4 -6
  67. package/src/x_ite/InputOutput/FileLoader.js +1 -1
  68. package/src/x_ite/InputOutput/Generator.js +35 -55
  69. package/src/x_ite/Parser/SVGParser.js +41 -41
  70. package/src/x_ite/Parser/X3DParser.js +3 -2
  71. package/src/x_ite/Prototype/X3DExternProtoDeclaration.js +4 -0
  72. package/src/x_ite/Prototype/X3DProtoDeclaration.js +4 -0
  73. package/src/x_ite/Routing/X3DRoute.js +8 -0
@@ -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)
@@ -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
 
@@ -260,9 +260,12 @@ SVGParser .prototype = Object .assign (Object .create (X3DParser .prototype),
260
260
  // Get attributes of svg element.
261
261
 
262
262
  const
263
- viewBox = this .viewBoxAttribute (xmlElement .getAttribute ("viewBox"), new Vector4 (0, 0, 100, 100)),
264
- width = this .lengthAttribute (xmlElement .getAttribute ("width", viewBox [2])),
265
- height = this .lengthAttribute (xmlElement .getAttribute ("height", viewBox [3]));
263
+ defaultWidth = this .lengthAttribute (xmlElement .getAttribute ("width", 100)),
264
+ defaultHeight = this .lengthAttribute (xmlElement .getAttribute ("height", 100)),
265
+ defaultViewBox = new Vector4 (0, 0, defaultWidth, defaultHeight),
266
+ viewBox = this .viewBoxAttribute (xmlElement .getAttribute ("viewBox"), defaultViewBox),
267
+ width = this .lengthAttribute (xmlElement .getAttribute ("width", viewBox [2])),
268
+ height = this .lengthAttribute (xmlElement .getAttribute ("height", viewBox [3]));
266
269
 
267
270
  // Create viewpoint.
268
271
 
@@ -855,7 +858,7 @@ SVGParser .prototype = Object .assign (Object .create (X3DParser .prototype),
855
858
  for (const [o, c, a] of g .stops)
856
859
  gradient .addColorStop (o, `rgba(${c .r * 255},${c .g * 255},${c .b * 255},${a})`);
857
860
 
858
- return this .drawGradient (gradient, g .transform, bbox);
861
+ return this .drawGradient (gradient, g .transform, bbox, g .units);
859
862
  },
860
863
  linearGradientElement: function (xmlElement, gradient)
861
864
  {
@@ -873,9 +876,9 @@ SVGParser .prototype = Object .assign (Object .create (X3DParser .prototype),
873
876
 
874
877
  gradient .x1 = this .lengthAttribute (xmlElement .getAttribute ("x1"), gradient .x1 || 0);
875
878
  gradient .y1 = this .lengthAttribute (xmlElement .getAttribute ("y1"), gradient .y1 || 0);
876
- gradient .x2 = this .lengthAttribute (xmlElement .getAttribute ("x2"), gradient .x2 || 0);
879
+ gradient .x2 = this .lengthAttribute (xmlElement .getAttribute ("x2"), gradient .x2 || 1);
877
880
  gradient .y2 = this .lengthAttribute (xmlElement .getAttribute ("y2"), gradient .y2 || 0);
878
- gradient .units = xmlElement .getAttribute ("gradientUnits");
881
+ gradient .units = xmlElement .getAttribute ("gradientUnits") || "objectBoundingBox";
879
882
  gradient .transform = this .transformAttribute (xmlElement .getAttribute ("gradientTransform"));
880
883
 
881
884
  // Stops
@@ -889,12 +892,12 @@ SVGParser .prototype = Object .assign (Object .create (X3DParser .prototype),
889
892
  {
890
893
  const
891
894
  g = this .radialGradientElement (xmlElement, { stops: [ ] }),
892
- gradient = this .context .createRadialGradient (g .fx, g .fy, 0, g .cx, g .cy, g .r);
895
+ gradient = this .context .createRadialGradient (g .fx, g .fy, g. fr, g .cx, g .cy, g .r);
893
896
 
894
897
  for (const [o, c, a] of g .stops)
895
898
  gradient .addColorStop (o, `rgba(${c .r * 255},${c .g * 255},${c .b * 255},${a})`);
896
899
 
897
- return this .drawGradient (gradient, g .transform, bbox);
900
+ return this .drawGradient (gradient, g .transform, bbox, g .units);
898
901
  },
899
902
  radialGradientElement: function (xmlElement, gradient)
900
903
  {
@@ -907,14 +910,13 @@ SVGParser .prototype = Object .assign (Object .create (X3DParser .prototype),
907
910
 
908
911
  // Attributes
909
912
 
910
- gradient .cx = this .lengthAttribute (xmlElement .getAttribute ("cx"), gradient .cx || 0),
911
- gradient .cy = this .lengthAttribute (xmlElement .getAttribute ("cy"), gradient .cy || 0),
912
- gradient .x2 = this .lengthAttribute (xmlElement .getAttribute ("x2"), gradient .x2 || 0),
913
- gradient .y2 = this .lengthAttribute (xmlElement .getAttribute ("y2"), gradient .y2 || 0),
914
- gradient .r = this .lengthAttribute (xmlElement .getAttribute ("r"), gradient .cx),
915
- gradient .fx = this .lengthAttribute (xmlElement .getAttribute ("fx"), gradient .cx),
916
- gradient .fy = this .lengthAttribute (xmlElement .getAttribute ("fy"), gradient .cy),
917
- gradient .units = xmlElement .getAttribute ("gradientUnits");
913
+ gradient .cx = this .lengthAttribute (xmlElement .getAttribute ("cx"), gradient .cx || 0.5),
914
+ gradient .cy = this .lengthAttribute (xmlElement .getAttribute ("cy"), gradient .cy || 0.5),
915
+ gradient .r = this .lengthAttribute (xmlElement .getAttribute ("r"), gradient .r || 0.5),
916
+ gradient .fx = this .lengthAttribute (xmlElement .getAttribute ("fx"), gradient .fx || gradient .cx),
917
+ gradient .fy = this .lengthAttribute (xmlElement .getAttribute ("fy"), gradient .fy || gradient .cy),
918
+ gradient .fr = this .lengthAttribute (xmlElement .getAttribute ("fr"), gradient .fr || 0),
919
+ gradient .units = xmlElement .getAttribute ("gradientUnits") || "objectBoundingBox";
918
920
  gradient .spreadMethod = xmlElement .getAttribute ("spreadMethod");
919
921
  gradient .transform = this .transformAttribute (xmlElement .getAttribute ("gradientTransform"));
920
922
 
@@ -956,14 +958,19 @@ SVGParser .prototype = Object .assign (Object .create (X3DParser .prototype),
956
958
 
957
959
  this .styles .pop ();
958
960
  },
959
- drawGradient: function (gradient, transform, bbox)
961
+ drawGradient: function (gradient, transform, bbox, units)
960
962
  {
961
963
  const m = new Matrix3 ();
962
964
 
963
965
  m .scale (new Vector2 (GRADIENT_SIZE / 2, GRADIENT_SIZE / 2));
964
966
  m .translate (Vector2 .One);
965
967
  m .scale (new Vector2 (1, -1));
966
- m .multLeft (Matrix3 .inverse (bbox .matrix));
968
+
969
+ if (units === "userSpaceOnUse")
970
+ m .multLeft (Matrix3 .inverse (bbox .matrix));
971
+ else
972
+ m .multLeft (new Matrix3 (2, 0, 0, 0, 2, 0, -1, -1, 1));
973
+
967
974
  m .multLeft (transform);
968
975
 
969
976
  // Paint.
@@ -1026,6 +1033,9 @@ SVGParser .prototype = Object .assign (Object .create (X3DParser .prototype),
1026
1033
  },
1027
1034
  hrefAttribute: function (attribute)
1028
1035
  {
1036
+ if (!attribute)
1037
+ return;
1038
+
1029
1039
  const
1030
1040
  scene = this .getExecutionContext (),
1031
1041
  hash = new URL (attribute, scene .getWorldURL ()) .hash .slice (1);
@@ -1169,8 +1179,6 @@ SVGParser .prototype = Object .assign (Object .create (X3DParser .prototype),
1169
1179
  {
1170
1180
  // moveto
1171
1181
 
1172
- points = this .removeConsecutiveIdenticalPoints (points);
1173
-
1174
1182
  if (points .length > 2)
1175
1183
  {
1176
1184
  contours .push (Object .assign (points, { index: index, closed: false }));
@@ -1342,7 +1350,7 @@ SVGParser .prototype = Object .assign (Object .create (X3DParser .prototype),
1342
1350
  y += ay;
1343
1351
  }
1344
1352
 
1345
- points .push (... Bezier .quadric (ax, ay, 0, x1, y1, 0, x, y, 0, BEZIER_STEPS));
1353
+ Bezier .quadric (ax, ay, 0, x1, y1, 0, x, y, 0, BEZIER_STEPS, points);
1346
1354
 
1347
1355
  ax = x;
1348
1356
  ay = y;
@@ -1403,7 +1411,7 @@ SVGParser .prototype = Object .assign (Object .create (X3DParser .prototype),
1403
1411
  }
1404
1412
  }
1405
1413
 
1406
- points .push (... Bezier .quadric (ax, ay, 0, x1, y1, 0, x, y, 0, BEZIER_STEPS));
1414
+ Bezier .quadric (ax, ay, 0, x1, y1, 0, x, y, 0, BEZIER_STEPS, points);
1407
1415
 
1408
1416
  ax = x;
1409
1417
  ay = y;
@@ -1469,7 +1477,7 @@ SVGParser .prototype = Object .assign (Object .create (X3DParser .prototype),
1469
1477
  y += ay;
1470
1478
  }
1471
1479
 
1472
- points .push (... Bezier .cubic (ax, ay, 0, x1, y1, 0, x2, y2, 0, x, y, 0, BEZIER_STEPS));
1480
+ Bezier .cubic (ax, ay, 0, x1, y1, 0, x2, y2, 0, x, y, 0, BEZIER_STEPS, points);
1473
1481
 
1474
1482
  ax = x;
1475
1483
  ay = y;
@@ -1534,19 +1542,19 @@ SVGParser .prototype = Object .assign (Object .create (X3DParser .prototype),
1534
1542
  case 'S':
1535
1543
  case 's':
1536
1544
  {
1537
- x1 = ax + (ax - px);
1538
- y1 = ay + (ay - py);
1545
+ var x1 = ax + (ax - px);
1546
+ var y1 = ay + (ay - py);
1539
1547
  break;
1540
1548
  }
1541
1549
  default:
1542
1550
  {
1543
- x1 = ax;
1544
- y1 = ay;
1551
+ var x1 = ax;
1552
+ var y1 = ay;
1545
1553
  break;
1546
1554
  }
1547
1555
  }
1548
1556
 
1549
- points .push (... Bezier .cubic (ax, ay, 0, x1, y1, 0, x2, y2, 0, x, y, 0, BEZIER_STEPS));
1557
+ Bezier .cubic (ax, ay, 0, x1, y1, 0, x2, y2, 0, x, y, 0, BEZIER_STEPS, points);
1550
1558
 
1551
1559
  ax = x;
1552
1560
  ay = y;
@@ -1618,7 +1626,7 @@ SVGParser .prototype = Object .assign (Object .create (X3DParser .prototype),
1618
1626
  y += ay;
1619
1627
  }
1620
1628
 
1621
- points .push (... Bezier .arc (ax, ay, rx, ry, xAxisRotation, largeArcFlag, sweepFlag, x, y, CIRCLE_STEPS));
1629
+ Bezier .arc (ax, ay, rx, ry, xAxisRotation, largeArcFlag, sweepFlag, x, y, CIRCLE_STEPS, points);
1622
1630
 
1623
1631
  ax = x;
1624
1632
  ay = y;
@@ -1643,8 +1651,6 @@ SVGParser .prototype = Object .assign (Object .create (X3DParser .prototype),
1643
1651
  {
1644
1652
  // closepath
1645
1653
 
1646
- points = this .removeConsecutiveIdenticalPoints (points);
1647
-
1648
1654
  if (points .length > 2)
1649
1655
  {
1650
1656
  ax = points [0] .x;
@@ -1665,17 +1671,11 @@ SVGParser .prototype = Object .assign (Object .create (X3DParser .prototype),
1665
1671
  break;
1666
1672
  }
1667
1673
 
1668
- points = this .removeConsecutiveIdenticalPoints (points);
1669
-
1670
1674
  if (points .length > 2)
1671
1675
  contours .push (Object .assign (points, { index: index, closed: false }));
1672
1676
 
1673
1677
  return !! contours .length;
1674
1678
  },
1675
- removeConsecutiveIdenticalPoints: function (points)
1676
- {
1677
- return points .filter ((p, i, a) => !p .equals (a [(i + 1) % a .length]));
1678
- },
1679
1679
  transformAttribute: function (attribute)
1680
1680
  {
1681
1681
  const matrix = new Matrix3 ();
@@ -142,11 +142,12 @@ X3DParser .prototype = {
142
142
  convertColor: function (value)
143
143
  {
144
144
  const
145
- div = $("<div></div>") .css ("color", value) .appendTo (this .getBrowser () .getShadow ()),
145
+ wrap = $("<div></div>") .hide () .css ("color", "black") .appendTo ($("body")),
146
+ div = $("<div></div>").css ("color", value) .appendTo (wrap),
146
147
  rgb = window .getComputedStyle (div [0]) .color,
147
148
  values = rgb .replace (/^rgba?\(|\)$/g, "") .split (/[\s,]+/) .map (s => parseFloat (s));
148
149
 
149
- div .remove ();
150
+ wrap .remove ();
150
151
 
151
152
  values [0] /= 255;
152
153
  values [1] /= 255;
@@ -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 ();