x_ite 8.9.6 → 8.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) hide show
  1. package/build/bin/tests.pl +1 -1
  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 +26 -26
  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 +35 -34
  13. package/dist/assets/components/Geometry2D.min.js +1 -1
  14. package/dist/assets/components/Geospatial.js +37 -37
  15. package/dist/assets/components/Geospatial.min.js +1 -1
  16. package/dist/assets/components/HAnim.js +370 -208
  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 -30
  21. package/dist/assets/components/Layout.min.js +1 -1
  22. package/dist/assets/components/NURBS.js +26 -26
  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 +18 -18
  27. package/dist/assets/components/Picking.min.js +1 -1
  28. package/dist/assets/components/RigidBodyPhysics.js +23 -23
  29. package/dist/assets/components/RigidBodyPhysics.min.js +1 -1
  30. package/dist/assets/components/Scripting.js +37 -37
  31. package/dist/assets/components/Scripting.min.js +1 -1
  32. package/dist/assets/components/Text.js +31 -31
  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 +33 -33
  37. package/dist/assets/components/Texturing3D.min.js +1 -1
  38. package/dist/assets/components/VolumeRendering.js +18 -18
  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 +9157 -8799
  44. package/dist/x_ite.min.js +1 -1
  45. package/dist/x_ite.zip +0 -0
  46. package/docs/_config.yml +5 -5
  47. package/docs/_posts/components/Core/MetadataBoolean.md +1 -1
  48. package/docs/_posts/components/Core/MetadataDouble.md +1 -1
  49. package/docs/_posts/components/Core/MetadataFloat.md +1 -1
  50. package/docs/_posts/components/Core/MetadataInteger.md +1 -1
  51. package/docs/_posts/components/Core/MetadataSet.md +1 -1
  52. package/docs/_posts/components/Core/MetadataString.md +1 -1
  53. package/docs/_posts/components/Core/WorldInfo.md +1 -1
  54. package/docs/_posts/components/EventUtilities/BooleanFilter.md +2 -2
  55. package/docs/_posts/components/EventUtilities/BooleanSequencer.md +2 -2
  56. package/docs/_posts/components/EventUtilities/BooleanToggle.md +2 -2
  57. package/docs/_posts/components/EventUtilities/BooleanTrigger.md +2 -2
  58. package/docs/_posts/components/EventUtilities/IntegerSequencer.md +2 -2
  59. package/docs/_posts/components/EventUtilities/IntegerTrigger.md +2 -2
  60. package/docs/_posts/components/EventUtilities/TimeTrigger.md +2 -2
  61. package/docs/_posts/components/Geometry2D/Arc2D.md +1 -1
  62. package/docs/_posts/components/Geometry2D/ArcClose2D.md +1 -1
  63. package/docs/_posts/components/Geometry2D/Circle2D.md +1 -1
  64. package/docs/_posts/components/Geometry2D/Disk2D.md +1 -1
  65. package/docs/_posts/components/Geometry2D/Polyline2D.md +1 -1
  66. package/docs/_posts/components/Geometry2D/Polypoint2D.md +1 -1
  67. package/docs/_posts/components/Geometry2D/Rectangle2D.md +1 -1
  68. package/docs/_posts/components/HAnim/HAnimHumanoid.md +17 -17
  69. package/docs/_posts/components/Interpolation/ColorInterpolator.md +1 -1
  70. package/docs/_posts/components/Interpolation/CoordinateInterpolator.md +1 -1
  71. package/docs/_posts/components/Interpolation/CoordinateInterpolator2D.md +1 -1
  72. package/docs/_posts/components/Interpolation/NormalInterpolator.md +1 -1
  73. package/docs/_posts/components/Interpolation/OrientationInterpolator.md +1 -1
  74. package/docs/_posts/components/Interpolation/PositionInterpolator.md +1 -1
  75. package/docs/_posts/components/Interpolation/PositionInterpolator2D.md +1 -1
  76. package/docs/_posts/components/Interpolation/ScalarInterpolator.md +1 -1
  77. package/docs/_posts/components/KeyDeviceSensor/KeySensor.md +1 -1
  78. package/docs/_posts/components/KeyDeviceSensor/StringSensor.md +1 -1
  79. package/docs/_posts/components/Networking/LoadSensor.md +1 -1
  80. package/docs/_posts/components/PointingDeviceSensor/CylinderSensor.md +1 -1
  81. package/docs/_posts/components/PointingDeviceSensor/PlaneSensor.md +1 -1
  82. package/docs/_posts/components/PointingDeviceSensor/TouchSensor.md +1 -1
  83. package/docs/_posts/components/Text/Text.md +1 -1
  84. package/docs/_posts/components/Time/TimeSensor.md +1 -1
  85. package/docs/_posts/reference/browser-services.md +6 -6
  86. package/docs/_posts/what's-new.md +23 -0
  87. package/docs/laboratory/gltf-sample-viewer.html +17 -8
  88. package/package.json +1 -1
  89. package/src/assets/shaders/webgl1/Depth.vs.js +4 -4
  90. package/src/assets/shaders/webgl1/Pointing.fs.js +1 -1
  91. package/src/assets/shaders/webgl2/Depth.vs.js +7 -4
  92. package/src/assets/shaders/webgl2/LineTransform.vs.js +24 -12
  93. package/src/assets/shaders/webgl2/Pointing.fs.js +1 -1
  94. package/src/assets/shaders/webgl2/Pointing.vs.js +12 -9
  95. package/src/assets/shaders/webgl2/include/Particle.glsl.js +5 -15
  96. package/src/assets/shaders/webgl2/include/Skin.glsl.js +88 -0
  97. package/src/assets/shaders/webgl2/include/Utils.glsl.js +13 -0
  98. package/src/assets/shaders/webgl2/include/Vertex.glsl.js +17 -8
  99. package/src/bookmarks.js +54 -2
  100. package/src/tests.js +0 -360
  101. package/src/x_ite/Base/X3DArrayField.js +18 -3
  102. package/src/x_ite/Base/X3DBaseNode.js +73 -56
  103. package/src/x_ite/Base/X3DObjectArrayField.js +6 -4
  104. package/src/x_ite/Browser/Core/Context.js +14 -4
  105. package/src/x_ite/Browser/Core/Notification.js +4 -3
  106. package/src/x_ite/Browser/Core/X3DCoreContext.js +8 -8
  107. package/src/x_ite/Browser/Geometry2D/Arc2DOptions.js +4 -3
  108. package/src/x_ite/Browser/Geometry2D/ArcClose2DOptions.js +4 -3
  109. package/src/x_ite/Browser/Geometry2D/Circle2DOptions.js +6 -6
  110. package/src/x_ite/Browser/Geometry2D/Disk2DOptions.js +9 -10
  111. package/src/x_ite/Browser/Geometry3D/ConeOptions.js +5 -4
  112. package/src/x_ite/Browser/Geometry3D/CylinderOptions.js +5 -4
  113. package/src/x_ite/Browser/Geometry3D/IcoSphereOptions.js +3 -2
  114. package/src/x_ite/Browser/Geometry3D/QuadSphereOptions.js +3 -2
  115. package/src/x_ite/Browser/Layout/ScreenText.js +2 -2
  116. package/src/x_ite/Browser/Navigation/ExamineViewer.js +4 -4
  117. package/src/x_ite/Browser/Navigation/LookAtViewer.js +4 -4
  118. package/src/x_ite/Browser/Navigation/PlaneViewer.js +3 -3
  119. package/src/x_ite/Browser/Navigation/X3DFlyViewer.js +3 -3
  120. package/src/x_ite/Browser/Navigation/X3DNavigationContext.js +6 -5
  121. package/src/x_ite/Browser/Navigation/X3DViewer.js +2 -13
  122. package/src/x_ite/Browser/Networking/X3DNetworkingContext.js +5 -4
  123. package/src/x_ite/Browser/PointingDeviceSensor/PointingDevice.js +8 -18
  124. package/src/x_ite/Browser/PointingDeviceSensor/X3DPointingDeviceSensorContext.js +17 -5
  125. package/src/x_ite/Browser/Rendering/X3DRenderingContext.js +6 -5
  126. package/src/x_ite/Browser/Shaders/Shaders.js +4 -0
  127. package/src/x_ite/Browser/Shape/X3DShapeContext.js +3 -3
  128. package/src/x_ite/Browser/Sound/X3DSoundContext.js +4 -3
  129. package/src/x_ite/Browser/Text/PolygonText.js +2 -2
  130. package/src/x_ite/Browser/Texturing/X3DTexturingContext.js +1 -1
  131. package/src/x_ite/Browser/VERSION.js +1 -1
  132. package/src/x_ite/Browser/X3DBrowser.js +49 -17
  133. package/src/x_ite/Browser/X3DBrowserContext.js +8 -7
  134. package/src/x_ite/Components/Core/X3DChildNode.js +2 -5
  135. package/src/x_ite/Components/Core/X3DPrototypeInstance.js +14 -14
  136. package/src/x_ite/Components/CubeMapTexturing/ComposedCubeMapTexture.js +1 -1
  137. package/src/x_ite/Components/EnvironmentalSensor/X3DEnvironmentalSensorNode.js +1 -1
  138. package/src/x_ite/Components/Geometry3D/ElevationGrid.js +5 -2
  139. package/src/x_ite/Components/Geometry3D/Extrusion.js +24 -13
  140. package/src/x_ite/Components/Geometry3D/IndexedFaceSet.js +5 -2
  141. package/src/x_ite/Components/Geospatial/GeoElevationGrid.js +2 -2
  142. package/src/x_ite/Components/Geospatial/GeoViewpoint.js +2 -2
  143. package/src/x_ite/Components/Grouping/X3DBoundedObject.js +1 -2
  144. package/src/x_ite/Components/HAnim/HAnimHumanoid.js +314 -161
  145. package/src/x_ite/Components/HAnim/HAnimJoint.js +37 -25
  146. package/src/x_ite/Components/Layering/X3DLayerNode.js +2 -2
  147. package/src/x_ite/Components/NURBS/NurbsOrientationInterpolator.js +1 -1
  148. package/src/x_ite/Components/NURBS/NurbsPositionInterpolator.js +1 -1
  149. package/src/x_ite/Components/Navigation/NavigationInfo.js +4 -4
  150. package/src/x_ite/Components/Navigation/OrthoViewpoint.js +1 -1
  151. package/src/x_ite/Components/Navigation/X3DViewpointNode.js +12 -12
  152. package/src/x_ite/Components/Networking/X3DUrlObject.js +18 -11
  153. package/src/x_ite/Components/Rendering/IndexedLineSet.js +17 -14
  154. package/src/x_ite/Components/Rendering/LineSet.js +16 -13
  155. package/src/x_ite/Components/Rendering/PointSet.js +16 -12
  156. package/src/x_ite/Components/Rendering/X3DColorNode.js +1 -3
  157. package/src/x_ite/Components/Rendering/X3DComposedGeometryNode.js +3 -0
  158. package/src/x_ite/Components/Rendering/X3DGeometryNode.js +48 -77
  159. package/src/x_ite/Components/Rendering/X3DLineGeometryNode.js +31 -12
  160. package/src/x_ite/Components/Rendering/X3DPointGeometryNode.js +3 -0
  161. package/src/x_ite/Components/RigidBodyPhysics/RigidBody.js +3 -3
  162. package/src/x_ite/Components/RigidBodyPhysics/X3DNBodyCollidableNode.js +2 -2
  163. package/src/x_ite/Components/RigidBodyPhysics/X3DRigidJointNode.js +1 -1
  164. package/src/x_ite/Components/Shaders/X3DProgrammableShaderObject.js +24 -7
  165. package/src/x_ite/Components/Shaders/X3DVertexAttributeNode.js +1 -1
  166. package/src/x_ite/Components/Shape/FillProperties.js +1 -3
  167. package/src/x_ite/Components/Shape/X3DAppearanceNode.js +1 -3
  168. package/src/x_ite/Components/Shape/X3DMaterialNode.js +8 -6
  169. package/src/x_ite/Components/Shape/X3DOneSidedMaterialNode.js +0 -2
  170. package/src/x_ite/Components/Sound/AudioClip.js +1 -1
  171. package/src/x_ite/Components/Sound/BufferAudioSource.js +1 -1
  172. package/src/x_ite/Components/Sound/ListenerPointSource.js +2 -2
  173. package/src/x_ite/Components/Sound/MicrophoneSource.js +2 -2
  174. package/src/x_ite/Components/Sound/OscillatorSource.js +2 -2
  175. package/src/x_ite/Components/Sound/Sound.js +1 -1
  176. package/src/x_ite/Components/Sound/StreamAudioSource.js +2 -2
  177. package/src/x_ite/Components/Sound/X3DSoundProcessingNode.js +1 -1
  178. package/src/x_ite/Components/Text/X3DFontStyleNode.js +4 -4
  179. package/src/x_ite/Components/Texturing/MultiTexture.js +1 -1
  180. package/src/x_ite/Components/Texturing/PixelTexture.js +1 -1
  181. package/src/x_ite/Components/Texturing/X3DSingleTextureCoordinateNode.js +2 -2
  182. package/src/x_ite/Components/Texturing/X3DTextureNode.js +1 -3
  183. package/src/x_ite/Components/Texturing3D/ComposedTexture3D.js +2 -2
  184. package/src/x_ite/Components/Texturing3D/PixelTexture3D.js +1 -1
  185. package/src/x_ite/Components/Time/TimeSensor.js +1 -1
  186. package/src/x_ite/Components/Time/X3DTimeDependentNode.js +2 -2
  187. package/src/x_ite/Execution/X3DExecutionContext.js +3 -4
  188. package/src/x_ite/Execution/X3DScene.js +4 -4
  189. package/src/x_ite/Execution/X3DWorld.js +1 -1
  190. package/src/x_ite/Parser/GLTF2Parser.js +196 -116
  191. package/src/x_ite/Parser/X3DOptimizer.js +47 -18
  192. package/src/x_ite/Prototype/X3DExternProtoDeclaration.js +4 -4
  193. package/src/x_ite/Prototype/X3DProtoDeclarationNode.js +1 -1
  194. package/src/x_ite/Rendering/X3DRenderObject.js +20 -12
  195. package/src/x_ite.html +36 -10
  196. package/x_ite.min.html +36 -10
@@ -48,6 +48,7 @@
48
48
  import X3DParser from "./X3DParser.js";
49
49
  import X3DOptimizer from "./X3DOptimizer.js";
50
50
  import URLs from "../Browser/Networking/URLs.js";
51
+ import Algorithm from "../../standard/Math/Algorithm.js";
51
52
  import Vector2 from "../../standard/Math/Numbers/Vector2.js";
52
53
  import Vector3 from "../../standard/Math/Numbers/Vector3.js";
53
54
  import Quaternion from "../../standard/Math/Numbers/Quaternion.js";
@@ -55,8 +56,7 @@ import Rotation4 from "../../standard/Math/Numbers/Rotation4.js";
55
56
  import Matrix4 from "../../standard/Math/Numbers/Matrix4.js";
56
57
  import Color3 from "../../standard/Math/Numbers/Color3.js";
57
58
  import Color4 from "../../standard/Math/Numbers/Color4.js";
58
- import Algorithm from "../../standard/Math/Algorithm.js";
59
- import DEVELOPMENT from "../DEVELOPMENT.js"
59
+ import Box3 from "../../standard/Math/Geometry/Box3.js";
60
60
 
61
61
  // https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html
62
62
  // https://github.com/KhronosGroup/glTF-Sample-Models
@@ -91,7 +91,6 @@ function GLTF2Parser (scene)
91
91
  this .nodes = [ ];
92
92
  this .skins = [ ];
93
93
  this .joints = new Set ();
94
- this .skeletons = new Set ();
95
94
  this .animations = 0;
96
95
  }
97
96
 
@@ -133,8 +132,8 @@ Object .assign (Object .setPrototypeOf (GLTF2Parser .prototype, X3DParser .proto
133
132
  "materials",
134
133
  "meshes",
135
134
  "cameras",
136
- "nodes",
137
135
  "skins",
136
+ "nodes",
138
137
  "scenes",
139
138
  "scene",
140
139
  "animations",
@@ -206,12 +205,19 @@ Object .assign (Object .setPrototypeOf (GLTF2Parser .prototype, X3DParser .proto
206
205
  this .materialsArray (glTF .materials);
207
206
  this .meshesArray (glTF .meshes);
208
207
  this .camerasArray (glTF .cameras);
209
- this .nodesArray (glTF .nodes);
210
208
  this .skinsArray (glTF .skins);
209
+ this .nodesArray (glTF .nodes);
211
210
  this .scenesArray (glTF .scenes, glTF .scene);
212
211
  this .animationsArray (glTF .animations);
213
212
 
214
- //this .optimizeSceneGraph (this .getExecutionContext () .getRootNodes ());
213
+ try
214
+ {
215
+ this .optimizeSceneGraph (this .getExecutionContext () .getRootNodes ());
216
+ }
217
+ catch (error)
218
+ {
219
+ console .error (error)
220
+ }
215
221
 
216
222
  return this .getScene ();
217
223
  },
@@ -611,19 +617,19 @@ Object .assign (Object .setPrototypeOf (GLTF2Parser .prototype, X3DParser .proto
611
617
 
612
618
  // minFilter
613
619
 
614
- const minificationFilter = MinificationFilters .get (sampler .minFilter) || ["AVG_PIXEL", false];
620
+ const minificationFilter = MinificationFilters .get (sampler .minFilter) ?? ["AVG_PIXEL", false];
615
621
 
616
622
  texturePropertiesNode ._minificationFilter = minificationFilter [0];
617
623
  texturePropertiesNode ._generateMipMaps = minificationFilter [1];
618
624
 
619
625
  // magFilter
620
626
 
621
- texturePropertiesNode ._magnificationFilter = MagnificationFilters .get (sampler .magFilter) || "AVG_PIXEL";
627
+ texturePropertiesNode ._magnificationFilter = MagnificationFilters .get (sampler .magFilter) ?? "AVG_PIXEL";
622
628
 
623
629
  // boundaryMode
624
630
 
625
- texturePropertiesNode ._boundaryModeS = BoundaryModes .get (sampler .wrapS) || "REPEAT";
626
- texturePropertiesNode ._boundaryModeT = BoundaryModes .get (sampler .wrapT) || "REPEAT";
631
+ texturePropertiesNode ._boundaryModeS = BoundaryModes .get (sampler .wrapS) ?? "REPEAT";
632
+ texturePropertiesNode ._boundaryModeT = BoundaryModes .get (sampler .wrapT) ?? "REPEAT";
627
633
 
628
634
  // setup
629
635
 
@@ -1040,15 +1046,16 @@ Object .assign (Object .setPrototypeOf (GLTF2Parser .prototype, X3DParser .proto
1040
1046
  return;
1041
1047
 
1042
1048
  if (mesh .shapeNodes)
1043
- return mesh .shapeNodes;
1044
-
1045
- if (skin instanceof Object)
1046
1049
  {
1047
- const scene = this .getScene ();
1050
+ const primitives = mesh .primitives;
1051
+
1052
+ if (!(primitives instanceof Array))
1053
+ return mesh .shapeNodes;
1054
+
1055
+ for (const primitive of primitives)
1056
+ this .attributesJointsArray (skin, primitive .attributes ?.JOINTS, primitive .attributes ?.WEIGHTS);
1048
1057
 
1049
- skin .textureCoordinateNode = scene .createNode ("TextureCoordinate", false);
1050
- skin .normalNode = scene .createNode ("Normal", false);
1051
- skin .coordinateNode = scene .createNode ("Coordinate", false);
1058
+ return mesh .shapeNodes;
1052
1059
  }
1053
1060
 
1054
1061
  const shapeNodes = this .primitivesArray (mesh .primitives, skin);
@@ -1068,13 +1075,6 @@ Object .assign (Object .setPrototypeOf (GLTF2Parser .prototype, X3DParser .proto
1068
1075
  }
1069
1076
  }
1070
1077
 
1071
- if (skin instanceof Object)
1072
- {
1073
- skin .textureCoordinateNode .setup ();
1074
- skin .normalNode .setup ();
1075
- skin .coordinateNode .setup ();
1076
- }
1077
-
1078
1078
  return mesh .shapeNodes = shapeNodes;
1079
1079
  },
1080
1080
  primitivesArray (primitives, skin)
@@ -1311,11 +1311,7 @@ Object .assign (Object .setPrototypeOf (GLTF2Parser .prototype, X3DParser .proto
1311
1311
  scene .addExportedNode (scene .getUniqueExportName (name), viewpointNode);
1312
1312
  }
1313
1313
 
1314
- if (camera .name)
1315
- viewpointNode ._description = camera .name;
1316
- else
1317
- viewpointNode ._description = `Viewpoint ${++ this .viewpoints}`;
1318
-
1314
+ viewpointNode ._description = camera .name ? this .description (camera .name) : `Viewpoint ${++ this .viewpoints}`;
1319
1315
  viewpointNode ._position = Vector3 .Zero;
1320
1316
  viewpointNode ._centerOfRotation = new Vector3 (0, 0, -10);
1321
1317
 
@@ -1385,22 +1381,71 @@ Object .assign (Object .setPrototypeOf (GLTF2Parser .prototype, X3DParser .proto
1385
1381
  if (!(nodes instanceof Array))
1386
1382
  return;
1387
1383
 
1388
- this .nodes = nodes;
1384
+ this .nodes = nodes .map ((node, index) => this .nodeObject (node, index));
1385
+
1386
+ // 1. Replace skeleton nodes with humanoid.
1387
+ // 2. Add children.
1388
+
1389
+ this .nodes .forEach (node => this .nodeSkeleton (node));
1390
+ this .nodes .forEach (node => this .nodeChildren (node));
1389
1391
  },
1390
1392
  nodeObject (node, index)
1391
1393
  {
1392
1394
  if (!(node instanceof Object))
1393
- return;
1395
+ return { };
1394
1396
 
1395
- if (node .childNode !== undefined)
1396
- return node .childNode;
1397
+ if (node .transformNode)
1398
+ return node;
1397
1399
 
1398
1400
  // Create Transform or HAnimJoint.
1399
1401
 
1400
1402
  const
1401
1403
  scene = this .getExecutionContext (),
1402
1404
  typeName = this .joints .has (index) ? "HAnimJoint" : "Transform",
1403
- transformNode = scene .createNode (typeName, false),
1405
+ transformNode = scene .createNode (typeName, false);
1406
+
1407
+ node .transformNode = transformNode;
1408
+
1409
+ // Create humanoid.
1410
+
1411
+ const skin = this .skins [node .skin];
1412
+
1413
+ if (skin)
1414
+ {
1415
+ // Skins can be cloned.
1416
+
1417
+ if (!skin .humanoidNode)
1418
+ skin .humanoidNode = scene .createNode ("HAnimHumanoid", false);
1419
+
1420
+ node .humanoidNode = skin .humanoidNode;
1421
+ }
1422
+
1423
+ node .childNode = node .humanoidNode ?? node .transformNode;
1424
+
1425
+ return node;
1426
+ },
1427
+ nodeSkeleton (node)
1428
+ {
1429
+ const skin = this .skins [node .skin];
1430
+
1431
+ if (!skin)
1432
+ return;
1433
+
1434
+ const
1435
+ skeleton = this .nodes [skin .skeleton],
1436
+ humanoidNode = skin .humanoidNode;
1437
+
1438
+ if (!skeleton)
1439
+ return;
1440
+
1441
+ skeleton .humanoidNode = humanoidNode;
1442
+ skeleton .childNode = humanoidNode;
1443
+ },
1444
+ nodeChildren (node)
1445
+ {
1446
+ const
1447
+ scene = this .getExecutionContext (),
1448
+ transformNode = node .transformNode,
1404
1449
  name = this .sanitizeName (node .name);
1405
1450
 
1406
1451
  // Name
@@ -1410,7 +1455,7 @@ Object .assign (Object .setPrototypeOf (GLTF2Parser .prototype, X3DParser .proto
1410
1455
  scene .addNamedNode (scene .getUniqueName (name), transformNode);
1411
1456
  scene .addExportedNode (scene .getUniqueExportName (name), transformNode);
1412
1457
 
1413
- if (typeName === "HAnimJoint")
1458
+ if (transformNode .getTypeName () === "HAnimJoint")
1414
1459
  transformNode ._name = node .name;
1415
1460
  }
1416
1461
 
@@ -1418,10 +1463,10 @@ Object .assign (Object .setPrototypeOf (GLTF2Parser .prototype, X3DParser .proto
1418
1463
 
1419
1464
  const
1420
1465
  translation = new Vector3 (0, 0, 0),
1421
- quaternion = new Quaternion (0, 0, 0, 1),
1422
1466
  rotation = new Rotation4 (),
1423
1467
  scale = new Vector3 (1, 1, 1),
1424
1468
  scaleOrientation = new Rotation4 (),
1469
+ quaternion = new Quaternion (0, 0, 0, 1),
1425
1470
  matrix = new Matrix4 ();
1426
1471
 
1427
1472
  if (this .vectorValue (node .matrix, matrix))
@@ -1445,6 +1490,12 @@ Object .assign (Object .setPrototypeOf (GLTF2Parser .prototype, X3DParser .proto
1445
1490
  transformNode ._scale = scale;
1446
1491
  }
1447
1492
 
1493
+ // Add mesh.
1494
+
1495
+ const
1496
+ skin = this .skins [node .skin],
1497
+ shapeNodes = this .meshObject (this .meshes [node .mesh], skin);
1498
+
1448
1499
  // Add camera.
1449
1500
 
1450
1501
  const viewpointNode = this .cameraObject (this .cameras [node .camera]);
@@ -1456,73 +1507,70 @@ Object .assign (Object .setPrototypeOf (GLTF2Parser .prototype, X3DParser .proto
1456
1507
 
1457
1508
  this .nodeExtensions (node .extensions, transformNode);
1458
1509
 
1459
- // Add mesh.
1510
+ // Add children.
1460
1511
 
1461
- const mesh = this .meshes [node .mesh];
1512
+ transformNode ._children .push (... this .nodeChildrenArray (node .children));
1462
1513
 
1463
- if (mesh)
1464
- {
1465
- const
1466
- skin = this .skins [node .skin],
1467
- shapeNodes = this .meshObject (mesh, skin);
1514
+ // Add Shape nodes.
1468
1515
 
1516
+ if (shapeNodes)
1469
1517
  transformNode ._children .push (... shapeNodes);
1470
1518
 
1471
- if (skin && shapeNodes .length)
1472
- {
1473
- var humanoidNode = scene .createNode ("HAnimHumanoid", false);
1474
-
1475
- const name = this .sanitizeName (skin .name);
1519
+ transformNode .setup ();
1476
1520
 
1477
- if (name)
1478
- scene .addNamedNode (scene .getUniqueName (name), humanoidNode);
1521
+ // Skin
1479
1522
 
1480
- humanoidNode ._name = skin .name;
1481
- humanoidNode ._version = "2.0";
1482
- humanoidNode ._skeletalConfiguration = "NONE";
1523
+ if (!skin)
1524
+ return;
1483
1525
 
1484
- const skeletonNode = this .nodeObject (this .nodes [skin .skeleton], skin .skeleton);
1526
+ const humanoidNode = skin .humanoidNode;
1485
1527
 
1486
- if (skeletonNode)
1487
- humanoidNode ._skeleton .push (skeletonNode);
1528
+ if (!humanoidNode .isInitialized ())
1529
+ {
1530
+ const name = this .sanitizeName (skin .name) || transformNode .getName ();
1488
1531
 
1489
- for (const [i, joint] of skin .joints .entries ())
1490
- {
1491
- const inverseBindMatrix = skin .inverseBindMatrices [i] ?? Matrix4 .Identity;
1532
+ if (name)
1533
+ {
1534
+ scene .addNamedNode (scene .getUniqueName (name), humanoidNode);
1535
+ scene .addExportedNode (scene .getUniqueExportName (name), humanoidNode);
1536
+ }
1492
1537
 
1493
- inverseBindMatrix .get (translation, rotation, scale);
1538
+ humanoidNode ._name = skin .name ?? node .name ?? "";
1539
+ humanoidNode ._version = "2.0";
1540
+ humanoidNode ._skeletalConfiguration = "GLTF";
1494
1541
 
1495
- humanoidNode ._joints .push (this .nodeObject (this .nodes [joint], joint));
1496
- humanoidNode ._jointBindingPositions .push (translation);
1497
- humanoidNode ._jointBindingRotations .push (rotation);
1498
- humanoidNode ._jointBindingScales .push (scale);
1499
- }
1542
+ const skeletonNode = this .nodes [skin .skeleton] ?.transformNode;
1500
1543
 
1501
- humanoidNode ._skinBindingNormal = shapeNodes [0] ._geometry .normal ?.getValue () ?.copy ();
1502
- humanoidNode ._skinBindingCoord = shapeNodes [0] ._geometry .coord ?.getValue () ?.copy ();
1503
- humanoidNode ._skinNormal = shapeNodes [0] ._geometry .normal;
1504
- humanoidNode ._skinCoord = shapeNodes [0] ._geometry .coord;
1505
- humanoidNode ._skin .push (transformNode);
1544
+ if (skeletonNode)
1545
+ humanoidNode ._skeleton .push (skeletonNode);
1506
1546
 
1507
- humanoidNode .setup ();
1508
- }
1509
- }
1547
+ for (const [i, joint] of skin .joints .entries ())
1548
+ {
1549
+ const
1550
+ jointNode = this .nodes [joint] ?.transformNode,
1551
+ inverseBindMatrix = skin .inverseBindMatrices [i] ?? Matrix4 .Identity;
1510
1552
 
1511
- // Get children.
1553
+ if (!jointNode)
1554
+ continue;
1512
1555
 
1513
- transformNode ._children .push (... this .nodeChildrenArray (node .children));
1556
+ inverseBindMatrix .get (translation, rotation, scale);
1514
1557
 
1515
- // Finish.
1558
+ humanoidNode ._joints .push (jointNode);
1559
+ humanoidNode ._jointBindingPositions .push (translation);
1560
+ humanoidNode ._jointBindingRotations .push (rotation);
1561
+ humanoidNode ._jointBindingScales .push (scale);
1562
+ }
1516
1563
 
1517
- transformNode .setup ();
1564
+ humanoidNode .setup ();
1565
+ }
1518
1566
 
1519
- if (typeName === "Transform")
1567
+ if (shapeNodes ?.length)
1520
1568
  {
1521
- if (!transformNode ._children .length)
1522
- return node .childNode = null;
1569
+ humanoidNode ._skinNormal = shapeNodes [0] ._geometry .normal;
1570
+ humanoidNode ._skinCoord = shapeNodes [0] ._geometry .coord;
1523
1571
  }
1524
1572
 
1525
- return node .childNode = humanoidNode ?? transformNode;
1573
+ humanoidNode ._skin .push (transformNode);
1526
1574
  },
1527
1575
  nodeExtensions (extensions, transformNode)
1528
1576
  {
@@ -1550,10 +1598,13 @@ Object .assign (Object .setPrototypeOf (GLTF2Parser .prototype, X3DParser .proto
1550
1598
  if (!(children instanceof Array))
1551
1599
  return [ ];
1552
1600
 
1553
- return children
1554
- .filter (index => !this .skeletons .has (index))
1555
- .map (index => this .nodeObject (this .nodes [index], index))
1556
- .filter (node => node);
1601
+ const nodes = [... new Set (children
1602
+ .map (index => this .nodes [index] ?.childNode)
1603
+ .filter (node => node)
1604
+ .filter (node => node .getTypeName () !== "HAnimHumanoid" || !node .getCloneCount ())
1605
+ )];
1606
+
1607
+ return nodes;
1557
1608
  },
1558
1609
  skinsArray (skins)
1559
1610
  {
@@ -1570,14 +1621,19 @@ Object .assign (Object .setPrototypeOf (GLTF2Parser .prototype, X3DParser .proto
1570
1621
  if (!(skin instanceof Object))
1571
1622
  return;
1572
1623
 
1573
- skin .joints = this .jointsArray (skin .joints);
1624
+ const scene = this .getScene ();
1574
1625
 
1575
- if (skin .skeleton === undefined)
1576
- skin .skeleton = this .skeleton (skin .joints);
1626
+ skin .joints = this .jointsArray (skin .joints);
1627
+ skin .skeleton = skin .skeleton ?? this .skeleton (skin .joints);
1628
+ skin .inverseBindMatrices = this .inverseBindMatricesAccessors (this .accessors [skin .inverseBindMatrices]);
1577
1629
 
1578
- this .skeletons .add (skin .skeleton);
1630
+ skin .textureCoordinateNode = scene .createNode ("TextureCoordinate", false);
1631
+ skin .normalNode = scene .createNode ("Normal", false);
1632
+ skin .coordinateNode = scene .createNode ("Coordinate", false);
1579
1633
 
1580
- skin .inverseBindMatrices = this .inverseBindMatricesAccessors (this .accessors [skin .inverseBindMatrices]);
1634
+ skin .textureCoordinateNode .setup ();
1635
+ skin .normalNode .setup ();
1636
+ skin .coordinateNode .setup ();
1581
1637
  },
1582
1638
  jointsArray: function (joints)
1583
1639
  {
@@ -1613,14 +1669,14 @@ Object .assign (Object .setPrototypeOf (GLTF2Parser .prototype, X3DParser .proto
1613
1669
 
1614
1670
  return matrices;
1615
1671
  },
1616
- scenesArray (scenes, sceneNumber)
1672
+ scenesArray (scenes, sceneNumber = 0)
1617
1673
  {
1618
1674
  if (!(scenes instanceof Array))
1619
1675
  return;
1620
1676
 
1621
1677
  const
1622
1678
  scene = this .getExecutionContext (),
1623
- children = scenes .map (scene => this .sceneObject (scene));
1679
+ children = scenes .map (scene => this .sceneObject (scene)) .filter (node => node);
1624
1680
 
1625
1681
  switch (children .length)
1626
1682
  {
@@ -1665,12 +1721,12 @@ Object .assign (Object .setPrototypeOf (GLTF2Parser .prototype, X3DParser .proto
1665
1721
  }
1666
1722
  }
1667
1723
  },
1668
- sceneObject (sceneObject)
1724
+ sceneObject (scene)
1669
1725
  {
1670
- if (!(sceneObject instanceof Object))
1726
+ if (!(scene instanceof Object))
1671
1727
  return null;
1672
1728
 
1673
- const nodes = this .sceneNodesArray (sceneObject .nodes);
1729
+ const nodes = this .sceneNodesArray (scene .nodes);
1674
1730
 
1675
1731
  switch (nodes .length)
1676
1732
  {
@@ -1687,7 +1743,7 @@ Object .assign (Object .setPrototypeOf (GLTF2Parser .prototype, X3DParser .proto
1687
1743
  const
1688
1744
  scene = this .getExecutionContext (),
1689
1745
  groupNode = scene .createNode ("Group", false),
1690
- name = this .sanitizeName (sceneObject .name);
1746
+ name = this .sanitizeName (scene .name);
1691
1747
 
1692
1748
  if (name)
1693
1749
  {
@@ -1756,7 +1812,7 @@ Object .assign (Object .setPrototypeOf (GLTF2Parser .prototype, X3DParser .proto
1756
1812
  scene .addExportedNode (scene .getUniqueExportName (name || `Animation${this .animations}`), groupNode);
1757
1813
  scene .addExportedNode (scene .getUniqueExportName (`Timer${this .animations}`), timeSensorNode);
1758
1814
 
1759
- timeSensorNode ._description = animation .name || `Animation ${this .animations}`;
1815
+ timeSensorNode ._description = this .description (animation .name) || `Animation ${this .animations}`;
1760
1816
  groupNode ._children .push (timeSensorNode, ... channelNodes);
1761
1817
 
1762
1818
  timeSensorNode .setup ();
@@ -1777,7 +1833,6 @@ Object .assign (Object .setPrototypeOf (GLTF2Parser .prototype, X3DParser .proto
1777
1833
  .filter (input => input ?.array .length)
1778
1834
  .reduce ((value, input) => Math .max (value, input .array .at (-1)), 0);
1779
1835
 
1780
- timeSensorNode ._loop = DEVELOPMENT;
1781
1836
  timeSensorNode ._cycleInterval = cycleInterval;
1782
1837
 
1783
1838
  return channels
@@ -1794,7 +1849,7 @@ Object .assign (Object .setPrototypeOf (GLTF2Parser .prototype, X3DParser .proto
1794
1849
  if (!(target instanceof Object))
1795
1850
  return null;
1796
1851
 
1797
- const node = this .nodeObject (this .nodes [target .node], target .node);
1852
+ const node = this .nodes [target .node] ?.transformNode;
1798
1853
 
1799
1854
  if (!node)
1800
1855
  return null;
@@ -1875,9 +1930,7 @@ Object .assign (Object .setPrototypeOf (GLTF2Parser .prototype, X3DParser .proto
1875
1930
  materialNode .setup ();
1876
1931
  appearanceNode .setup ();
1877
1932
 
1878
- this .defaultAppearance = appearanceNode;
1879
-
1880
- return appearanceNode;
1933
+ return this .defaultAppearance = appearanceNode;
1881
1934
  },
1882
1935
  createMultiTextureTransform (materialNode)
1883
1936
  {
@@ -2097,13 +2150,13 @@ Object .assign (Object .setPrototypeOf (GLTF2Parser .prototype, X3DParser .proto
2097
2150
  scene = this .getExecutionContext (),
2098
2151
  geometryNode = scene .createNode ("IndexedTriangleSet", false);
2099
2152
 
2100
- geometryNode ._solid = material ? !material .doubleSided : true;
2153
+ geometryNode ._solid = !material ?.doubleSided;
2101
2154
  geometryNode ._index = indices .array;
2102
2155
  geometryNode ._color = this .createColor (attributes .COLOR [0], material);
2103
2156
  geometryNode ._texCoord = this .createMultiTextureCoordinate (attributes .TEXCOORD, material);
2104
2157
  geometryNode ._normal = this .createNormal (attributes .NORMAL);
2105
2158
  geometryNode ._coord = this .createCoordinate (attributes .POSITION);
2106
- geometryNode ._normalPerVertex = !! geometryNode ._normal;
2159
+ geometryNode ._normalPerVertex = !! geometryNode ._normal .getValue ();
2107
2160
 
2108
2161
  this .attributesJointsArray (skin, attributes .JOINTS, attributes .WEIGHTS);
2109
2162
  this .skinGeometry (skin, geometryNode);
@@ -2118,12 +2171,12 @@ Object .assign (Object .setPrototypeOf (GLTF2Parser .prototype, X3DParser .proto
2118
2171
  scene = this .getExecutionContext (),
2119
2172
  geometryNode = scene .createNode ("TriangleSet", false);
2120
2173
 
2121
- geometryNode ._solid = material ? !material .doubleSided : true;
2174
+ geometryNode ._solid = !material ?.doubleSided;
2122
2175
  geometryNode ._color = this .createColor (attributes .COLOR [0], material);
2123
2176
  geometryNode ._texCoord = this .createMultiTextureCoordinate (attributes .TEXCOORD, material);
2124
2177
  geometryNode ._normal = this .createNormal (attributes .NORMAL);
2125
2178
  geometryNode ._coord = this .createCoordinate (attributes .POSITION);
2126
- geometryNode ._normalPerVertex = !! geometryNode ._normal;
2179
+ geometryNode ._normalPerVertex = !! geometryNode ._normal .getValue ();
2127
2180
 
2128
2181
  this .attributesJointsArray (skin, attributes .JOINTS, attributes .WEIGHTS);
2129
2182
  this .skinGeometry (skin, geometryNode);
@@ -2138,13 +2191,13 @@ Object .assign (Object .setPrototypeOf (GLTF2Parser .prototype, X3DParser .proto
2138
2191
  scene = this .getExecutionContext (),
2139
2192
  geometryNode = scene .createNode ("IndexedTriangleStripSet", false);
2140
2193
 
2141
- geometryNode ._solid = material ? !material .doubleSided : true;
2194
+ geometryNode ._solid = !material ?.doubleSided;
2142
2195
  geometryNode ._index = indices .array;
2143
2196
  geometryNode ._color = this .createColor (attributes .COLOR [0], material);
2144
2197
  geometryNode ._texCoord = this .createMultiTextureCoordinate (attributes .TEXCOORD, material);
2145
2198
  geometryNode ._normal = this .createNormal (attributes .NORMAL);
2146
2199
  geometryNode ._coord = this .createCoordinate (attributes .POSITION);
2147
- geometryNode ._normalPerVertex = !! geometryNode ._normal;
2200
+ geometryNode ._normalPerVertex = !! geometryNode ._normal .getValue ();
2148
2201
 
2149
2202
  this .attributesJointsArray (skin, attributes .JOINTS, attributes .WEIGHTS);
2150
2203
  this .skinGeometry (skin, geometryNode);
@@ -2159,12 +2212,12 @@ Object .assign (Object .setPrototypeOf (GLTF2Parser .prototype, X3DParser .proto
2159
2212
  scene = this .getExecutionContext (),
2160
2213
  geometryNode = scene .createNode ("TriangleStripSet", false);
2161
2214
 
2162
- geometryNode ._solid = material ? !material .doubleSided : true;
2215
+ geometryNode ._solid = !material ?.doubleSided;
2163
2216
  geometryNode ._color = this .createColor (attributes .COLOR [0], material);
2164
2217
  geometryNode ._texCoord = this .createMultiTextureCoordinate (attributes .TEXCOORD, material);
2165
2218
  geometryNode ._normal = this .createNormal (attributes .NORMAL);
2166
2219
  geometryNode ._coord = this .createCoordinate (attributes .POSITION);
2167
- geometryNode ._normalPerVertex = !! geometryNode ._normal;
2220
+ geometryNode ._normalPerVertex = !! geometryNode ._normal .getValue ();
2168
2221
 
2169
2222
  const coord = geometryNode ._coord;
2170
2223
 
@@ -2187,13 +2240,13 @@ Object .assign (Object .setPrototypeOf (GLTF2Parser .prototype, X3DParser .proto
2187
2240
  scene = this .getExecutionContext (),
2188
2241
  geometryNode = scene .createNode ("IndexedTriangleFanSet", false);
2189
2242
 
2190
- geometryNode ._solid = material ? !material .doubleSided : true;
2243
+ geometryNode ._solid = !material ?.doubleSided;
2191
2244
  geometryNode ._index = indices .array;
2192
2245
  geometryNode ._color = this .createColor (attributes .COLOR [0], material);
2193
2246
  geometryNode ._texCoord = this .createMultiTextureCoordinate (attributes .TEXCOORD, material);
2194
2247
  geometryNode ._normal = this .createNormal (attributes .NORMAL);
2195
2248
  geometryNode ._coord = this .createCoordinate (attributes .POSITION);
2196
- geometryNode ._normalPerVertex = !! geometryNode ._normal;
2249
+ geometryNode ._normalPerVertex = !! geometryNode ._normal .getValue ();
2197
2250
 
2198
2251
  this .attributesJointsArray (skin, attributes .JOINTS, attributes .WEIGHTS);
2199
2252
  this .skinGeometry (skin, geometryNode);
@@ -2208,12 +2261,12 @@ Object .assign (Object .setPrototypeOf (GLTF2Parser .prototype, X3DParser .proto
2208
2261
  scene = this .getExecutionContext (),
2209
2262
  geometryNode = scene .createNode ("TriangleFanSet", false);
2210
2263
 
2211
- geometryNode ._solid = material ? !material .doubleSided : true;
2264
+ geometryNode ._solid = !material ?.doubleSided;
2212
2265
  geometryNode ._color = this .createColor (attributes .COLOR [0], material);
2213
2266
  geometryNode ._texCoord = this .createMultiTextureCoordinate (attributes .TEXCOORD, material);
2214
2267
  geometryNode ._normal = this .createNormal (attributes .NORMAL);
2215
2268
  geometryNode ._coord = this .createCoordinate (attributes .POSITION);
2216
- geometryNode ._normalPerVertex = !! geometryNode ._normal;
2269
+ geometryNode ._normalPerVertex = !! geometryNode ._normal .getValue ();
2217
2270
 
2218
2271
  const coord = geometryNode ._coord;
2219
2272
 
@@ -2256,10 +2309,30 @@ Object .assign (Object .setPrototypeOf (GLTF2Parser .prototype, X3DParser .proto
2256
2309
  opaque = appearanceNode ._alphaMode .getValue () === "OPAQUE",
2257
2310
  colorNode = scene .createNode (opaque ? "Color" : typeName, false);
2258
2311
 
2259
- colorNode ._color = opaque && typeName !== "Color"
2312
+ const array = opaque && typeName !== "Color"
2260
2313
  ? color .array .filter ((_, i) => (i + 1) % 4)
2261
2314
  : color .array;
2262
2315
 
2316
+ switch (color .componentType)
2317
+ {
2318
+ case 5120: // Int8Array
2319
+ case 5122: // Int16Array
2320
+ case 5124: // Int32Array
2321
+ break;
2322
+ case 5121: // Uint8Array
2323
+ colorNode ._color = array .map (v => v / 0xff);
2324
+ break;
2325
+ case 5123: // Uint16Array
2326
+ colorNode ._color = array .map (v => v / 0xffff);
2327
+ break;
2328
+ case 5125: // Uint32Array
2329
+ colorNode ._color = array .map (v => v / 0xffffffff);
2330
+ break;
2331
+ case 5126: // Float32Array
2332
+ colorNode ._color = array;
2333
+ break;
2334
+ }
2335
+
2263
2336
  colorNode .setup ();
2264
2337
 
2265
2338
  return color .colorNode = colorNode;
@@ -2417,7 +2490,10 @@ Object .assign (Object .setPrototypeOf (GLTF2Parser .prototype, X3DParser .proto
2417
2490
 
2418
2491
  const
2419
2492
  index = skin .joints [jointsArray [v * 4 + i]],
2420
- jointNode = this .nodeObject (this .nodes [index], index);
2493
+ jointNode = this .nodes [index] ?.transformNode;
2494
+
2495
+ if (!jointNode)
2496
+ continue;
2421
2497
 
2422
2498
  jointNode ._skinCoordIndex .push (v + start);
2423
2499
  jointNode ._skinCoordWeight .push (w);
@@ -2715,6 +2791,10 @@ Object .assign (Object .setPrototypeOf (GLTF2Parser .prototype, X3DParser .proto
2715
2791
 
2716
2792
  return value;
2717
2793
  },
2794
+ description (string)
2795
+ {
2796
+ return string ?.replace (/_+/g, " ") .trim () ?? "";
2797
+ },
2718
2798
  });
2719
2799
 
2720
2800
  export default GLTF2Parser;