@plastic-software/three 0.183.4 → 0.184.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 (277) hide show
  1. package/build/three.cjs +775 -287
  2. package/build/three.core.js +372 -110
  3. package/build/three.core.min.js +1 -1
  4. package/build/three.module.js +428 -181
  5. package/build/three.module.min.js +1 -1
  6. package/build/three.tsl.js +7 -1
  7. package/build/three.tsl.min.js +1 -1
  8. package/build/three.webgpu.js +2979 -1281
  9. package/build/three.webgpu.min.js +1 -1
  10. package/build/three.webgpu.nodes.js +2942 -1281
  11. package/build/three.webgpu.nodes.min.js +1 -1
  12. package/examples/jsm/Addons.js +11 -0
  13. package/examples/jsm/animation/CCDIKSolver.js +5 -1
  14. package/examples/jsm/controls/ArcballControls.js +4 -1
  15. package/examples/jsm/controls/DragControls.js +2 -2
  16. package/examples/jsm/controls/FirstPersonControls.js +58 -54
  17. package/examples/jsm/controls/FlyControls.js +4 -0
  18. package/examples/jsm/controls/OrbitControls.js +2 -2
  19. package/examples/jsm/controls/TrackballControls.js +2 -2
  20. package/examples/jsm/controls/TransformControls.js +34 -2
  21. package/examples/jsm/csm/CSMShadowNode.js +6 -2
  22. package/examples/jsm/exporters/GLTFExporter.js +21 -5
  23. package/examples/jsm/geometries/TextGeometry.js +18 -0
  24. package/examples/jsm/helpers/LightProbeGridHelper.js +221 -0
  25. package/examples/jsm/inspector/Extension.js +13 -0
  26. package/examples/jsm/inspector/Inspector.js +169 -114
  27. package/examples/jsm/inspector/RendererInspector.js +2 -2
  28. package/examples/jsm/inspector/extensions/extensions.json +6 -0
  29. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +916 -0
  30. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +281 -0
  31. package/examples/jsm/inspector/tabs/Memory.js +128 -0
  32. package/examples/jsm/inspector/tabs/Parameters.js +34 -2
  33. package/examples/jsm/inspector/tabs/Performance.js +2 -2
  34. package/examples/jsm/inspector/tabs/Settings.js +264 -0
  35. package/examples/jsm/inspector/tabs/Timeline.js +1611 -0
  36. package/examples/jsm/inspector/tabs/Viewer.js +105 -3
  37. package/examples/jsm/inspector/ui/Graph.js +2 -2
  38. package/examples/jsm/inspector/ui/List.js +1 -1
  39. package/examples/jsm/inspector/ui/Profiler.js +273 -176
  40. package/examples/jsm/inspector/ui/Style.js +64 -10
  41. package/examples/jsm/inspector/ui/Tab.js +39 -7
  42. package/examples/jsm/inspector/ui/Values.js +39 -2
  43. package/examples/jsm/inspector/ui/utils.js +13 -0
  44. package/examples/jsm/interaction/InteractionManager.js +226 -0
  45. package/examples/jsm/libs/meshopt_decoder.module.js +8 -8
  46. package/examples/jsm/lighting/DynamicLighting.js +82 -0
  47. package/examples/jsm/lighting/LightProbeGrid.js +651 -0
  48. package/examples/jsm/lines/LineMaterial.js +1 -1
  49. package/examples/jsm/loaders/EXRLoader.js +682 -43
  50. package/examples/jsm/loaders/FBXLoader.js +233 -33
  51. package/examples/jsm/loaders/GLTFLoader.js +24 -7
  52. package/examples/jsm/loaders/HDRLoader.js +1 -1
  53. package/examples/jsm/loaders/KTX2Loader.js +8 -2
  54. package/examples/jsm/loaders/LDrawLoader.js +39 -47
  55. package/examples/jsm/loaders/SVGLoader.js +1 -1
  56. package/examples/jsm/loaders/VTKLoader.js +5 -1
  57. package/examples/jsm/loaders/collada/ColladaComposer.js +101 -7
  58. package/examples/jsm/loaders/collada/ColladaParser.js +19 -4
  59. package/examples/jsm/loaders/usd/USDAParser.js +6 -0
  60. package/examples/jsm/loaders/usd/USDCParser.js +26 -0
  61. package/examples/jsm/loaders/usd/USDComposer.js +656 -103
  62. package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
  63. package/examples/jsm/misc/RollerCoaster.js +42 -4
  64. package/examples/jsm/modifiers/TessellateModifier.js +1 -1
  65. package/examples/jsm/objects/Reflector.js +73 -25
  66. package/examples/jsm/objects/Sky.js +14 -2
  67. package/examples/jsm/objects/SkyMesh.js +23 -6
  68. package/examples/jsm/renderers/Projector.js +18 -38
  69. package/examples/jsm/renderers/SVGRenderer.js +6 -25
  70. package/examples/jsm/transpiler/GLSLDecoder.js +2 -2
  71. package/examples/jsm/tsl/WebGLNodesHandler.js +605 -0
  72. package/examples/jsm/tsl/display/AfterImageNode.js +10 -0
  73. package/examples/jsm/tsl/display/AnamorphicNode.js +11 -0
  74. package/examples/jsm/tsl/display/BilateralBlurNode.js +10 -0
  75. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +3 -36
  76. package/examples/jsm/tsl/display/FSR1Node.js +477 -0
  77. package/examples/jsm/tsl/display/GTAONode.js +2 -1
  78. package/examples/jsm/tsl/display/GaussianBlurNode.js +10 -0
  79. package/examples/jsm/tsl/display/GodraysNode.js +2 -11
  80. package/examples/jsm/tsl/display/OutlineNode.js +66 -16
  81. package/examples/jsm/tsl/display/SSGINode.js +0 -4
  82. package/examples/jsm/tsl/display/SharpenNode.js +283 -0
  83. package/examples/jsm/tsl/display/TAAUNode.js +835 -0
  84. package/examples/jsm/tsl/display/TRAANode.js +48 -7
  85. package/examples/jsm/tsl/lighting/DynamicLightsNode.js +300 -0
  86. package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +61 -0
  87. package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +111 -0
  88. package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +99 -0
  89. package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +134 -0
  90. package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +161 -0
  91. package/examples/jsm/tsl/math/Bayer.js +13 -2
  92. package/examples/jsm/utils/BufferGeometryUtils.js +2 -3
  93. package/examples/jsm/utils/ColorUtils.js +76 -0
  94. package/examples/jsm/utils/SkeletonUtils.js +14 -8
  95. package/examples/jsm/webxr/XRHandMeshModel.js +36 -10
  96. package/examples/jsm/webxr/XRHandModelFactory.js +2 -1
  97. package/package.json +4 -4
  98. package/src/Three.Core.js +1 -0
  99. package/src/Three.TSL.js +6 -0
  100. package/src/Three.WebGPU.Nodes.js +3 -0
  101. package/src/Three.WebGPU.js +6 -0
  102. package/src/animation/AnimationAction.js +11 -1
  103. package/src/audio/AudioContext.js +2 -2
  104. package/src/constants.js +1 -1
  105. package/src/core/BufferAttribute.js +13 -1
  106. package/src/core/Clock.js +1 -1
  107. package/src/core/Object3D.js +1 -5
  108. package/src/core/RenderTarget.js +1 -0
  109. package/src/extras/curves/CatmullRomCurve3.js +3 -2
  110. package/src/loaders/AudioLoader.js +11 -1
  111. package/src/loaders/DataTextureLoader.js +6 -4
  112. package/src/loaders/FileLoader.js +1 -2
  113. package/src/loaders/ImageBitmapLoader.js +4 -6
  114. package/src/loaders/MaterialLoader.js +1 -1
  115. package/src/loaders/ObjectLoader.js +25 -4
  116. package/src/loaders/nodes/NodeObjectLoader.js +18 -0
  117. package/src/materials/MeshToonMaterial.js +1 -1
  118. package/src/materials/nodes/Line2NodeMaterial.js +27 -0
  119. package/src/materials/nodes/NodeMaterial.js +0 -27
  120. package/src/materials/nodes/manager/NodeMaterialObserver.js +188 -89
  121. package/src/math/Line3.js +3 -0
  122. package/src/math/Matrix2.js +13 -9
  123. package/src/math/Matrix3.js +13 -9
  124. package/src/math/Matrix4.js +13 -9
  125. package/src/math/Plane.js +4 -3
  126. package/src/math/Triangle.js +1 -1
  127. package/src/math/Vector2.js +11 -7
  128. package/src/math/Vector3.js +12 -8
  129. package/src/math/Vector4.js +13 -9
  130. package/src/nodes/Nodes.js +0 -1
  131. package/src/nodes/TSL.js +1 -1
  132. package/src/nodes/accessors/BufferAttributeNode.js +9 -3
  133. package/src/nodes/accessors/CubeTextureNode.js +7 -1
  134. package/src/nodes/accessors/MaterialProperties.js +2 -5
  135. package/src/nodes/accessors/Object3DNode.js +1 -1
  136. package/src/nodes/accessors/ReferenceBaseNode.js +2 -2
  137. package/src/nodes/accessors/ReferenceNode.js +4 -4
  138. package/src/nodes/accessors/SceneProperties.js +2 -8
  139. package/src/nodes/accessors/StorageBufferNode.js +10 -4
  140. package/src/nodes/accessors/StorageTextureNode.js +4 -9
  141. package/src/nodes/accessors/TextureNode.js +10 -2
  142. package/src/nodes/accessors/UniformArrayNode.js +2 -2
  143. package/src/nodes/code/FunctionCallNode.js +1 -1
  144. package/src/nodes/code/FunctionNode.js +1 -1
  145. package/src/nodes/core/ArrayNode.js +1 -1
  146. package/src/nodes/core/AssignNode.js +1 -1
  147. package/src/nodes/core/AttributeNode.js +1 -1
  148. package/src/nodes/core/BypassNode.js +1 -1
  149. package/src/nodes/core/ContextNode.js +1 -1
  150. package/src/nodes/core/IndexNode.js +2 -1
  151. package/src/nodes/core/InputNode.js +1 -1
  152. package/src/nodes/core/InspectorNode.js +1 -1
  153. package/src/nodes/core/IsolateNode.js +1 -1
  154. package/src/nodes/core/Node.js +83 -12
  155. package/src/nodes/core/NodeBuilder.js +117 -16
  156. package/src/nodes/core/NodeUtils.js +1 -1
  157. package/src/nodes/core/OutputStructNode.js +1 -1
  158. package/src/nodes/core/ParameterNode.js +1 -1
  159. package/src/nodes/core/StackNode.js +1 -1
  160. package/src/nodes/core/StructNode.js +1 -1
  161. package/src/nodes/core/StructTypeNode.js +1 -1
  162. package/src/nodes/core/SubBuildNode.js +1 -1
  163. package/src/nodes/core/UniformGroupNode.js +36 -6
  164. package/src/nodes/core/VarNode.js +1 -1
  165. package/src/nodes/core/VaryingNode.js +1 -1
  166. package/src/nodes/display/NormalMapNode.js +2 -2
  167. package/src/nodes/display/PassNode.js +27 -7
  168. package/src/nodes/display/RenderOutputNode.js +4 -4
  169. package/src/nodes/display/ScreenNode.js +1 -1
  170. package/src/nodes/display/ViewportDepthTextureNode.js +11 -15
  171. package/src/nodes/display/ViewportTextureNode.js +18 -7
  172. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +2 -2
  173. package/src/nodes/geometry/RangeNode.js +1 -1
  174. package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
  175. package/src/nodes/gpgpu/BarrierNode.js +9 -0
  176. package/src/nodes/gpgpu/ComputeBuiltinNode.js +1 -1
  177. package/src/nodes/gpgpu/ComputeNode.js +69 -44
  178. package/src/nodes/gpgpu/SubgroupFunctionNode.js +1 -1
  179. package/src/nodes/lighting/LightsNode.js +6 -27
  180. package/src/nodes/lighting/ShadowNode.js +24 -2
  181. package/src/nodes/math/BitcastNode.js +1 -1
  182. package/src/nodes/math/ConditionalNode.js +1 -1
  183. package/src/nodes/math/MathNode.js +73 -1
  184. package/src/nodes/math/OperatorNode.js +1 -1
  185. package/src/nodes/math/PackFloatNode.js +1 -1
  186. package/src/nodes/math/UnpackFloatNode.js +1 -1
  187. package/src/nodes/tsl/TSLBase.js +1 -1
  188. package/src/nodes/tsl/TSLCore.js +21 -3
  189. package/src/nodes/utils/ArrayElementNode.js +1 -1
  190. package/src/nodes/utils/ConvertNode.js +1 -1
  191. package/src/nodes/utils/DebugNode.js +1 -1
  192. package/src/nodes/utils/EventNode.js +30 -0
  193. package/src/nodes/utils/FlipNode.js +1 -1
  194. package/src/nodes/utils/FunctionOverloadingNode.js +1 -1
  195. package/src/nodes/utils/JoinNode.js +1 -1
  196. package/src/nodes/utils/MemberNode.js +1 -1
  197. package/src/nodes/utils/Remap.js +48 -0
  198. package/src/nodes/utils/RotateNode.js +1 -1
  199. package/src/nodes/utils/SetNode.js +1 -1
  200. package/src/nodes/utils/SplitNode.js +1 -1
  201. package/src/objects/BatchedMesh.js +17 -2
  202. package/src/objects/InstancedMesh.js +19 -3
  203. package/src/objects/SkinnedMesh.js +26 -9
  204. package/src/renderers/WebGLRenderer.js +147 -48
  205. package/src/renderers/common/Animation.js +3 -3
  206. package/src/renderers/common/Attributes.js +15 -1
  207. package/src/renderers/common/Backend.js +0 -8
  208. package/src/renderers/common/Background.js +2 -2
  209. package/src/renderers/common/BindGroup.js +1 -8
  210. package/src/renderers/common/Bindings.js +2 -2
  211. package/src/renderers/common/ComputePipeline.js +1 -1
  212. package/src/renderers/common/CubeRenderTarget.js +1 -1
  213. package/src/renderers/common/Info.js +333 -4
  214. package/src/renderers/common/InspectorBase.js +6 -1
  215. package/src/renderers/common/Pipelines.js +36 -3
  216. package/src/renderers/common/ReadbackBuffer.js +78 -0
  217. package/src/renderers/common/RenderBundle.js +3 -1
  218. package/src/renderers/common/RenderBundles.js +5 -2
  219. package/src/renderers/common/RenderObject.js +2 -2
  220. package/src/renderers/common/RenderObjects.js +3 -3
  221. package/src/renderers/common/RenderPipeline.js +35 -6
  222. package/src/renderers/common/Renderer.js +232 -53
  223. package/src/renderers/common/Textures.js +72 -3
  224. package/src/renderers/common/UniformsGroup.js +1 -1
  225. package/src/renderers/common/XRManager.js +34 -27
  226. package/src/renderers/common/extras/PMREMGenerator.js +23 -15
  227. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  228. package/src/renderers/common/nodes/NodeManager.js +230 -99
  229. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +0 -1
  230. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +1 -1
  231. package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +80 -0
  232. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +8 -0
  233. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +2 -0
  234. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +1 -3
  235. package/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js +7 -0
  236. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +0 -1
  237. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +12 -2
  238. package/src/renderers/shaders/ShaderChunk.js +2 -0
  239. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +1 -2
  240. package/src/renderers/shaders/ShaderLib.js +0 -1
  241. package/src/renderers/shaders/UniformsLib.js +7 -2
  242. package/src/renderers/shaders/UniformsUtils.js +27 -5
  243. package/src/renderers/webgl/WebGLAnimation.js +2 -1
  244. package/src/renderers/webgl/WebGLBackground.js +13 -13
  245. package/src/renderers/webgl/WebGLBufferRenderer.js +0 -32
  246. package/src/renderers/webgl/WebGLCapabilities.js +6 -0
  247. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +0 -32
  248. package/src/renderers/webgl/WebGLMaterials.js +12 -13
  249. package/src/renderers/webgl/WebGLOutput.js +4 -1
  250. package/src/renderers/webgl/WebGLProgram.js +4 -0
  251. package/src/renderers/webgl/WebGLPrograms.js +21 -4
  252. package/src/renderers/webgl/WebGLRenderStates.js +13 -2
  253. package/src/renderers/webgl/WebGLState.js +43 -0
  254. package/src/renderers/webgl/WebGLTextures.js +129 -26
  255. package/src/renderers/webgl/WebGLUniformsGroups.js +19 -0
  256. package/src/renderers/webgl-fallback/WebGLBackend.js +106 -65
  257. package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +0 -41
  258. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +29 -51
  259. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +53 -19
  260. package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +25 -0
  261. package/src/renderers/webgl-fallback/utils/WebGLState.js +42 -1
  262. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +63 -50
  263. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +1 -1
  264. package/src/renderers/webgpu/WebGPUBackend.js +160 -146
  265. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +55 -33
  266. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +103 -17
  267. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +1 -1
  268. package/src/renderers/webgpu/utils/WebGPUCapabilities.js +48 -0
  269. package/src/renderers/webgpu/utils/WebGPUConstants.js +8 -0
  270. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +91 -17
  271. package/src/renderers/webgpu/utils/WebGPUUtils.js +18 -2
  272. package/src/renderers/webxr/WebXRController.js +12 -0
  273. package/src/textures/HTMLTexture.js +74 -0
  274. package/src/textures/Source.js +1 -1
  275. package/src/textures/Texture.js +13 -2
  276. package/src/utils.js +23 -1
  277. package/src/nodes/utils/RemapNode.js +0 -125
@@ -27,6 +27,7 @@ import { unzlibSync } from '../libs/fflate.module.js';
27
27
  *
28
28
  * @augments Loader
29
29
  * @three_import import { VTKLoader } from 'three/addons/loaders/VTKLoader.js';
30
+ * @deprecated since r184.
30
31
  */
31
32
  class VTKLoader extends Loader {
32
33
 
@@ -34,15 +35,18 @@ class VTKLoader extends Loader {
34
35
  * Constructs a new VTK loader.
35
36
  *
36
37
  * @param {LoadingManager} [manager] - The loading manager.
38
+ * @deprecated since r184.
37
39
  */
38
40
  constructor( manager ) {
39
41
 
40
42
  super( manager );
41
43
 
44
+ console.warn( 'THREE.VTKLoader: The loader has been deprecated and will be removed with r194. Export your VTK files to glTF before using them on the web.' ); // @deprecated, r184
45
+
42
46
  }
43
47
 
44
48
  /**
45
- * Starts loading from the given URL and passes the loaded VRML asset
49
+ * Starts loading from the given URL and passes the loaded VTK asset
46
50
  * to the `onLoad()` callback.
47
51
  *
48
52
  * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.
@@ -32,10 +32,12 @@ import {
32
32
  Skeleton,
33
33
  SkinnedMesh,
34
34
  SpotLight,
35
+ Triangle,
35
36
  Vector2,
36
37
  Vector3,
37
38
  VectorKeyframeTrack,
38
- SRGBColorSpace
39
+ SRGBColorSpace,
40
+ ShapeUtils
39
41
  } from 'three';
40
42
 
41
43
  import { getElementsByTagName, parseFloats } from './ColladaParser.js';
@@ -1626,6 +1628,7 @@ class ColladaComposer {
1626
1628
  count = primitive.count * 3;
1627
1629
  break;
1628
1630
 
1631
+ case 'polygons':
1629
1632
  case 'polylist':
1630
1633
 
1631
1634
  for ( let g = 0; g < primitive.count; g ++ ) {
@@ -1674,7 +1677,7 @@ class ColladaComposer {
1674
1677
 
1675
1678
  const input = inputs[ name ];
1676
1679
 
1677
- switch ( name ) {
1680
+ switch ( name ) {
1678
1681
 
1679
1682
  case 'VERTEX':
1680
1683
  for ( const key in vertices ) {
@@ -1856,13 +1859,103 @@ class ColladaComposer {
1856
1859
 
1857
1860
  } else if ( count > 4 ) {
1858
1861
 
1859
- for ( let k = 1, kl = ( count - 2 ); k <= kl; k ++ ) {
1862
+ const vertices = [];
1860
1863
 
1861
- const a = index + stride * 0;
1862
- const b = index + stride * k;
1863
- const c = index + stride * ( k + 1 );
1864
+ // prepare vertices which represent the polygon's contour
1864
1865
 
1865
- pushVector( a ); pushVector( b ); pushVector( c );
1866
+ for ( let k = 0; k < count; k ++ ) {
1867
+
1868
+ const a = index + stride * k;
1869
+ const positionIndex = indices[ a ] * sourceStride;
1870
+
1871
+ const x = sourceArray[ positionIndex ];
1872
+ const y = sourceArray[ positionIndex + 1 ];
1873
+ const z = sourceArray[ positionIndex + 2 ];
1874
+
1875
+ vertices.push( new Vector3( x, y, z ) );
1876
+
1877
+ }
1878
+
1879
+ // determine surface normal
1880
+
1881
+ const normal = new Vector3();
1882
+ const _triangle = new Triangle();
1883
+
1884
+ _triangle.a = vertices[ 0 ];
1885
+ _triangle.b = vertices[ 1 ];
1886
+ _triangle.c = vertices[ 2 ];
1887
+ _triangle.getNormal( normal );
1888
+
1889
+ // project to 2D and triangulate
1890
+
1891
+ const vertices2D = [];
1892
+
1893
+ if ( Math.abs( normal.x ) > Math.abs( normal.y ) && Math.abs( normal.x ) > Math.abs( normal.z ) ) {
1894
+
1895
+ for ( let k = 0; k < count; k ++ ) {
1896
+
1897
+ vertices2D.push( new Vector2( vertices[ k ].y, vertices[ k ].z ) );
1898
+
1899
+ }
1900
+
1901
+ } else if ( Math.abs( normal.y ) > Math.abs( normal.z ) ) {
1902
+
1903
+ for ( let k = 0; k < count; k ++ ) {
1904
+
1905
+ vertices2D.push( new Vector2( vertices[ k ].x, vertices[ k ].z ) );
1906
+
1907
+ }
1908
+
1909
+ } else {
1910
+
1911
+ for ( let k = 0; k < count; k ++ ) {
1912
+
1913
+ vertices2D.push( new Vector2( vertices[ k ].x, vertices[ k ].y ) );
1914
+
1915
+ }
1916
+
1917
+ }
1918
+
1919
+ const isClockWise = ShapeUtils.isClockWise( vertices2D );
1920
+
1921
+ if ( isClockWise === true ) {
1922
+
1923
+ vertices2D.reverse();
1924
+
1925
+ }
1926
+
1927
+ const faces = ShapeUtils.triangulateShape( vertices2D, [] );
1928
+
1929
+ // build indices
1930
+
1931
+ for ( let k = 0; k < faces.length; k ++ ) {
1932
+
1933
+ const face = faces[ k ];
1934
+
1935
+ let i0, i1, i2;
1936
+
1937
+ if ( isClockWise === false ) {
1938
+
1939
+ i0 = face[ 0 ];
1940
+ i1 = face[ 1 ];
1941
+ i2 = face[ 2 ];
1942
+
1943
+
1944
+ } else {
1945
+
1946
+ i0 = count - 1 - face[ 0 ];
1947
+ i1 = count - 1 - face[ 2 ];
1948
+ i2 = count - 1 - face[ 1 ];
1949
+
1950
+ }
1951
+
1952
+ const a = index + stride * i0;
1953
+ const b = index + stride * i1;
1954
+ const c = index + stride * i2;
1955
+
1956
+ pushVector( a );
1957
+ pushVector( b );
1958
+ pushVector( c );
1866
1959
 
1867
1960
  }
1868
1961
 
@@ -2627,6 +2720,7 @@ class ColladaComposer {
2627
2720
  break;
2628
2721
 
2629
2722
  case 'triangles':
2723
+ case 'polygons':
2630
2724
  case 'polylist':
2631
2725
  if ( skinning ) {
2632
2726
 
@@ -140,7 +140,8 @@ class ColladaParser {
140
140
  visualScenes: {},
141
141
  kinematicsModels: {},
142
142
  physicsModels: {},
143
- kinematicsScenes: {}
143
+ kinematicsScenes: {},
144
+ joints: {}
144
145
  };
145
146
 
146
147
  this.library = library;
@@ -157,6 +158,7 @@ class ColladaParser {
157
158
  this.parseLibrary( collada, 'library_geometries', 'geometry', this.parseGeometry.bind( this ) );
158
159
  this.parseLibrary( collada, 'library_nodes', 'node', this.parseNode.bind( this ) );
159
160
  this.parseLibrary( collada, 'library_visual_scenes', 'visual_scene', this.parseVisualScene.bind( this ) );
161
+ this.parseLibrary( collada, 'library_joints', 'joint', this.parseLibraryJoint.bind( this ) );
160
162
  this.parseLibrary( collada, 'library_kinematics_models', 'kinematics_model', this.parseKinematicsModel.bind( this ) );
161
163
  this.parseLibrary( collada, 'library_physics_models', 'physics_model', this.parsePhysicsModel.bind( this ) );
162
164
  this.parseLibrary( collada, 'scene', 'instance_kinematics_scene', this.parseKinematicsScene.bind( this ) );
@@ -1231,9 +1233,6 @@ class ColladaParser {
1231
1233
  break;
1232
1234
 
1233
1235
  case 'polygons':
1234
- console.warn( 'THREE.ColladaLoader: Unsupported primitive type: ', child.nodeName );
1235
- break;
1236
-
1237
1236
  case 'lines':
1238
1237
  case 'linestrips':
1239
1238
  case 'polylist':
@@ -1353,12 +1352,24 @@ class ColladaParser {
1353
1352
 
1354
1353
  }
1355
1354
 
1355
+ if ( primitive.type === 'polygons' ) {
1356
+
1357
+ primitive.vcount = [ primitive.p.length / primitive.stride ];
1358
+
1359
+ }
1360
+
1356
1361
  return primitive;
1357
1362
 
1358
1363
  }
1359
1364
 
1360
1365
  // kinematics
1361
1366
 
1367
+ parseLibraryJoint( xml ) {
1368
+
1369
+ this.library.joints[ xml.getAttribute( 'id' ) ] = this.parseKinematicsJoint( xml );
1370
+
1371
+ }
1372
+
1362
1373
  parseKinematicsModel( xml ) {
1363
1374
 
1364
1375
  const data = {
@@ -1401,6 +1412,10 @@ class ColladaParser {
1401
1412
  data.joints[ child.getAttribute( 'sid' ) ] = this.parseKinematicsJoint( child );
1402
1413
  break;
1403
1414
 
1415
+ case 'instance_joint':
1416
+ data.joints[ child.getAttribute( 'sid' ) ] = this.library.joints[ parseId( child.getAttribute( 'url' ) ) ];
1417
+ break;
1418
+
1404
1419
  case 'link':
1405
1420
  data.links.push( this.parseKinematicsLink( child ) );
1406
1421
  break;
@@ -454,6 +454,12 @@ class USDAParser {
454
454
 
455
455
  }
456
456
 
457
+ if ( header.metersPerUnit !== undefined ) {
458
+
459
+ rootFields.metersPerUnit = parseFloat( header.metersPerUnit );
460
+
461
+ }
462
+
457
463
  }
458
464
 
459
465
  specsByPath[ '/' ] = { specType: SpecType.Prim, fields: rootFields };
@@ -1092,6 +1092,19 @@ class USDCParser {
1092
1092
 
1093
1093
  // Seek to payload offset and read value
1094
1094
  const offset = valueRep.payload;
1095
+ if ( offset === 0 && isArray ) {
1096
+
1097
+ // Spec 16.3.9.3: Array payload 0 is an explicit empty-array sentinel.
1098
+ return [];
1099
+
1100
+ }
1101
+
1102
+ if ( offset < 0 || offset >= this.buffer.byteLength ) {
1103
+
1104
+ throw new RangeError( 'USDCParser: Invalid payload offset ' + offset + ' for type ' + type + '.' );
1105
+
1106
+ }
1107
+
1095
1108
  const savedOffset = this.reader.tell();
1096
1109
  this.reader.seek( offset );
1097
1110
 
@@ -1569,6 +1582,19 @@ class USDCParser {
1569
1582
 
1570
1583
  }
1571
1584
 
1585
+ if ( ! Number.isSafeInteger( size ) || size < 0 ) {
1586
+
1587
+ throw new RangeError( 'USDCParser: Invalid array size ' + size + ' for type ' + type + '.' );
1588
+
1589
+ }
1590
+
1591
+ if ( size > 0x7FFFFFFF ) {
1592
+
1593
+ // Crate stores counts as uint64, but JS typed arrays cannot represent all such sizes.
1594
+ throw new RangeError( 'USDCParser: Array size ' + size + ' exceeds implementation limits.' );
1595
+
1596
+ }
1597
+
1572
1598
  if ( size === 0 ) return [];
1573
1599
 
1574
1600
  // Handle compressed arrays