@plastic-software/three 0.181.3 → 0.183.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (437) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +3 -4
  3. package/build/three.cjs +11330 -10017
  4. package/build/three.core.js +10011 -9493
  5. package/build/three.core.min.js +2 -2
  6. package/build/three.module.js +1414 -631
  7. package/build/three.module.min.js +2 -2
  8. package/build/three.tsl.js +21 -13
  9. package/build/three.tsl.min.js +2 -2
  10. package/build/three.webgpu.js +8007 -5427
  11. package/build/three.webgpu.min.js +2 -2
  12. package/build/three.webgpu.nodes.js +8005 -5426
  13. package/build/three.webgpu.nodes.min.js +2 -2
  14. package/examples/jsm/Addons.js +0 -3
  15. package/examples/jsm/animation/CCDIKSolver.js +2 -2
  16. package/examples/jsm/controls/ArcballControls.js +3 -3
  17. package/examples/jsm/controls/MapControls.js +55 -1
  18. package/examples/jsm/controls/OrbitControls.js +109 -6
  19. package/examples/jsm/controls/TrackballControls.js +6 -6
  20. package/examples/jsm/csm/CSM.js +2 -1
  21. package/examples/jsm/effects/AnaglyphEffect.js +102 -7
  22. package/examples/jsm/environments/ColorEnvironment.js +59 -0
  23. package/examples/jsm/environments/RoomEnvironment.js +3 -0
  24. package/examples/jsm/exporters/EXRExporter.js +1 -1
  25. package/examples/jsm/exporters/GLTFExporter.js +131 -4
  26. package/examples/jsm/exporters/USDZExporter.js +22 -3
  27. package/examples/jsm/geometries/DecalGeometry.js +1 -1
  28. package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
  29. package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -1
  30. package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
  31. package/examples/jsm/helpers/ViewHelper.js +67 -8
  32. package/examples/jsm/inspector/Inspector.js +74 -14
  33. package/examples/jsm/inspector/RendererInspector.js +12 -2
  34. package/examples/jsm/inspector/tabs/Console.js +41 -7
  35. package/examples/jsm/inspector/tabs/Parameters.js +18 -2
  36. package/examples/jsm/inspector/tabs/Performance.js +2 -2
  37. package/examples/jsm/inspector/tabs/Viewer.js +4 -4
  38. package/examples/jsm/inspector/ui/Profiler.js +1836 -31
  39. package/examples/jsm/inspector/ui/Style.js +973 -14
  40. package/examples/jsm/inspector/ui/Tab.js +188 -1
  41. package/examples/jsm/inspector/ui/Values.js +17 -1
  42. package/examples/jsm/libs/meshopt_decoder.module.js +6 -5
  43. package/examples/jsm/lines/LineMaterial.js +6 -0
  44. package/examples/jsm/loaders/3DMLoader.js +5 -4
  45. package/examples/jsm/loaders/3MFLoader.js +2 -2
  46. package/examples/jsm/loaders/AMFLoader.js +2 -2
  47. package/examples/jsm/loaders/ColladaLoader.js +24 -4026
  48. package/examples/jsm/loaders/DRACOLoader.js +5 -5
  49. package/examples/jsm/loaders/EXRLoader.js +5 -5
  50. package/examples/jsm/loaders/FBXLoader.js +2 -4
  51. package/examples/jsm/loaders/GCodeLoader.js +34 -8
  52. package/examples/jsm/loaders/GLTFLoader.js +122 -171
  53. package/examples/jsm/loaders/HDRLoader.js +0 -1
  54. package/examples/jsm/loaders/KMZLoader.js +5 -5
  55. package/examples/jsm/loaders/KTX2Loader.js +19 -3
  56. package/examples/jsm/loaders/LDrawLoader.js +2 -3
  57. package/examples/jsm/loaders/LWOLoader.js +7 -39
  58. package/examples/jsm/loaders/NRRDLoader.js +2 -2
  59. package/examples/jsm/loaders/PCDLoader.js +4 -2
  60. package/examples/jsm/loaders/SVGLoader.js +1 -1
  61. package/examples/jsm/loaders/TDSLoader.js +0 -2
  62. package/examples/jsm/loaders/TGALoader.js +0 -2
  63. package/examples/jsm/loaders/USDLoader.js +100 -40
  64. package/examples/jsm/loaders/UltraHDRLoader.js +285 -160
  65. package/examples/jsm/loaders/VOXLoader.js +660 -117
  66. package/examples/jsm/loaders/VRMLLoader.js +79 -2
  67. package/examples/jsm/loaders/VTKLoader.js +37 -24
  68. package/examples/jsm/loaders/collada/ColladaComposer.js +2950 -0
  69. package/examples/jsm/loaders/collada/ColladaParser.js +1962 -0
  70. package/examples/jsm/loaders/usd/USDAParser.js +447 -366
  71. package/examples/jsm/loaders/usd/USDCParser.js +1841 -6
  72. package/examples/jsm/loaders/usd/USDComposer.js +4041 -0
  73. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
  74. package/examples/jsm/materials/WoodNodeMaterial.js +11 -11
  75. package/examples/jsm/math/Octree.js +131 -1
  76. package/examples/jsm/misc/Volume.js +0 -1
  77. package/examples/jsm/misc/VolumeSlice.js +0 -1
  78. package/examples/jsm/objects/LensflareMesh.js +1 -1
  79. package/examples/jsm/objects/Sky.js +76 -4
  80. package/examples/jsm/objects/SkyMesh.js +127 -10
  81. package/examples/jsm/objects/Water.js +4 -3
  82. package/examples/jsm/objects/Water2.js +5 -3
  83. package/examples/jsm/objects/WaterMesh.js +5 -7
  84. package/examples/jsm/physics/AmmoPhysics.js +12 -7
  85. package/examples/jsm/physics/JoltPhysics.js +10 -6
  86. package/examples/jsm/physics/RapierPhysics.js +9 -5
  87. package/examples/jsm/postprocessing/EffectComposer.js +7 -5
  88. package/examples/jsm/postprocessing/OutputPass.js +9 -0
  89. package/examples/jsm/postprocessing/RenderPass.js +10 -0
  90. package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
  91. package/examples/jsm/postprocessing/UnrealBloomPass.js +48 -18
  92. package/examples/jsm/renderers/CSS3DRenderer.js +1 -1
  93. package/examples/jsm/renderers/Projector.js +268 -30
  94. package/examples/jsm/renderers/SVGRenderer.js +193 -60
  95. package/examples/jsm/shaders/GTAOShader.js +19 -6
  96. package/examples/jsm/shaders/HalftoneShader.js +12 -1
  97. package/examples/jsm/shaders/PoissonDenoiseShader.js +6 -2
  98. package/examples/jsm/shaders/SAOShader.js +17 -4
  99. package/examples/jsm/shaders/SSAOShader.js +11 -1
  100. package/examples/jsm/shaders/SSRShader.js +6 -5
  101. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -4
  102. package/examples/jsm/shaders/VignetteShader.js +1 -1
  103. package/examples/jsm/transpiler/AST.js +44 -0
  104. package/examples/jsm/transpiler/GLSLDecoder.js +61 -4
  105. package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
  106. package/examples/jsm/transpiler/TSLEncoder.js +46 -3
  107. package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
  108. package/examples/jsm/transpiler/WGSLEncoder.js +27 -0
  109. package/examples/jsm/tsl/display/AfterImageNode.js +1 -1
  110. package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
  111. package/examples/jsm/tsl/display/AnamorphicNode.js +1 -1
  112. package/examples/jsm/tsl/display/BilateralBlurNode.js +364 -0
  113. package/examples/jsm/tsl/display/BloomNode.js +16 -6
  114. package/examples/jsm/tsl/display/CRT.js +150 -0
  115. package/examples/jsm/tsl/display/DenoiseNode.js +1 -1
  116. package/examples/jsm/tsl/display/DepthOfFieldNode.js +1 -1
  117. package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
  118. package/examples/jsm/tsl/display/FXAANode.js +2 -2
  119. package/examples/jsm/tsl/display/GTAONode.js +5 -4
  120. package/examples/jsm/tsl/display/GaussianBlurNode.js +11 -2
  121. package/examples/jsm/tsl/display/GodraysNode.js +624 -0
  122. package/examples/jsm/tsl/display/LensflareNode.js +1 -1
  123. package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
  124. package/examples/jsm/tsl/display/OutlineNode.js +3 -3
  125. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
  126. package/examples/jsm/tsl/display/PixelationPassNode.js +7 -6
  127. package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
  128. package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
  129. package/examples/jsm/tsl/display/SMAANode.js +2 -2
  130. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
  131. package/examples/jsm/tsl/display/SSGINode.js +8 -20
  132. package/examples/jsm/tsl/display/SSRNode.js +8 -8
  133. package/examples/jsm/tsl/display/SSSNode.js +6 -4
  134. package/examples/jsm/tsl/display/Shape.js +29 -0
  135. package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
  136. package/examples/jsm/tsl/display/StereoCompositePassNode.js +8 -1
  137. package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
  138. package/examples/jsm/tsl/display/TRAANode.js +273 -125
  139. package/examples/jsm/tsl/display/TransitionNode.js +1 -1
  140. package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
  141. package/examples/jsm/tsl/display/radialBlur.js +68 -0
  142. package/examples/jsm/tsl/math/Bayer.js +40 -1
  143. package/examples/jsm/utils/LDrawUtils.js +1 -1
  144. package/examples/jsm/utils/ShadowMapViewer.js +24 -10
  145. package/examples/jsm/utils/ShadowMapViewerGPU.js +1 -1
  146. package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
  147. package/package.json +20 -26
  148. package/src/Three.Core.js +2 -1
  149. package/src/Three.TSL.js +19 -11
  150. package/src/Three.WebGPU.Nodes.js +2 -0
  151. package/src/Three.WebGPU.js +3 -0
  152. package/src/Three.js +1 -0
  153. package/src/animation/AnimationAction.js +1 -1
  154. package/src/animation/AnimationClip.js +1 -1
  155. package/src/animation/AnimationMixer.js +6 -0
  156. package/src/animation/AnimationUtils.js +1 -12
  157. package/src/animation/KeyframeTrack.js +47 -8
  158. package/src/animation/PropertyMixer.js +4 -4
  159. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  160. package/src/animation/tracks/ColorKeyframeTrack.js +1 -1
  161. package/src/animation/tracks/NumberKeyframeTrack.js +1 -1
  162. package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -1
  163. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  164. package/src/animation/tracks/VectorKeyframeTrack.js +1 -1
  165. package/src/audio/Audio.js +1 -1
  166. package/src/audio/AudioListener.js +5 -3
  167. package/src/cameras/Camera.js +32 -2
  168. package/src/cameras/CubeCamera.js +20 -0
  169. package/src/constants.js +90 -5
  170. package/src/core/BufferGeometry.js +14 -2
  171. package/src/core/Clock.js +7 -0
  172. package/src/core/Object3D.js +56 -4
  173. package/src/core/Raycaster.js +2 -2
  174. package/src/core/RenderTarget.js +3 -4
  175. package/src/extras/PMREMGenerator.js +7 -18
  176. package/src/extras/TextureUtils.js +5 -1
  177. package/src/geometries/ExtrudeGeometry.js +2 -2
  178. package/src/geometries/PolyhedronGeometry.js +1 -1
  179. package/src/geometries/TorusGeometry.js +8 -3
  180. package/src/helpers/CameraHelper.js +3 -0
  181. package/src/helpers/DirectionalLightHelper.js +4 -1
  182. package/src/helpers/HemisphereLightHelper.js +3 -0
  183. package/src/helpers/PointLightHelper.js +1 -25
  184. package/src/helpers/SpotLightHelper.js +3 -0
  185. package/src/lights/DirectionalLight.js +13 -0
  186. package/src/lights/HemisphereLight.js +10 -0
  187. package/src/lights/Light.js +1 -11
  188. package/src/lights/LightProbe.js +0 -15
  189. package/src/lights/LightShadow.js +15 -6
  190. package/src/lights/PointLight.js +15 -0
  191. package/src/lights/PointLightShadow.js +0 -86
  192. package/src/lights/SpotLight.js +22 -1
  193. package/src/lights/webgpu/IESSpotLight.js +2 -1
  194. package/src/loaders/Cache.js +28 -0
  195. package/src/loaders/FileLoader.js +1 -1
  196. package/src/loaders/ImageBitmapLoader.js +8 -3
  197. package/src/loaders/Loader.js +6 -0
  198. package/src/loaders/MaterialLoader.js +2 -1
  199. package/src/loaders/ObjectLoader.js +21 -2
  200. package/src/loaders/nodes/NodeLoader.js +2 -2
  201. package/src/materials/Material.js +2 -0
  202. package/src/materials/MeshLambertMaterial.js +9 -0
  203. package/src/materials/MeshPhongMaterial.js +9 -0
  204. package/src/materials/ShaderMaterial.js +20 -1
  205. package/src/materials/nodes/Line2NodeMaterial.js +7 -7
  206. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +5 -2
  207. package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -4
  208. package/src/materials/nodes/NodeMaterial.js +72 -25
  209. package/src/materials/nodes/manager/NodeMaterialObserver.js +10 -4
  210. package/src/math/Line3.js +3 -5
  211. package/src/math/MathUtils.js +10 -10
  212. package/src/math/Matrix4.js +74 -65
  213. package/src/math/Quaternion.js +3 -29
  214. package/src/math/Sphere.js +1 -1
  215. package/src/math/Vector3.js +3 -5
  216. package/src/math/interpolants/BezierInterpolant.js +108 -0
  217. package/src/nodes/Nodes.js +87 -68
  218. package/src/nodes/TSL.js +6 -6
  219. package/src/nodes/accessors/Arrays.js +1 -1
  220. package/src/nodes/accessors/BatchNode.js +10 -10
  221. package/src/nodes/accessors/Bitangent.js +5 -5
  222. package/src/nodes/accessors/BufferAttributeNode.js +98 -12
  223. package/src/nodes/accessors/BufferNode.js +29 -2
  224. package/src/nodes/accessors/Camera.js +149 -28
  225. package/src/nodes/accessors/ClippingNode.js +4 -4
  226. package/src/nodes/accessors/CubeTextureNode.js +20 -1
  227. package/src/nodes/accessors/InstanceNode.js +148 -43
  228. package/src/nodes/accessors/MaterialNode.js +9 -1
  229. package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
  230. package/src/nodes/accessors/ModelNode.js +1 -1
  231. package/src/nodes/accessors/Normal.js +11 -11
  232. package/src/nodes/accessors/Position.js +34 -2
  233. package/src/nodes/accessors/ReferenceBaseNode.js +4 -4
  234. package/src/nodes/accessors/ReferenceNode.js +4 -4
  235. package/src/nodes/accessors/RendererReferenceNode.js +1 -2
  236. package/src/nodes/accessors/SceneProperties.js +53 -0
  237. package/src/nodes/accessors/SkinningNode.js +27 -26
  238. package/src/nodes/accessors/StorageBufferNode.js +4 -21
  239. package/src/nodes/accessors/StorageTextureNode.js +37 -1
  240. package/src/nodes/accessors/Tangent.js +4 -14
  241. package/src/nodes/accessors/Texture3DNode.js +32 -35
  242. package/src/nodes/accessors/TextureNode.js +58 -22
  243. package/src/nodes/accessors/UniformArrayNode.js +4 -2
  244. package/src/nodes/accessors/UserDataNode.js +1 -2
  245. package/src/nodes/accessors/VertexColorNode.js +1 -2
  246. package/src/nodes/code/FunctionNode.js +1 -2
  247. package/src/nodes/core/ArrayNode.js +20 -1
  248. package/src/nodes/core/AssignNode.js +2 -2
  249. package/src/nodes/core/AttributeNode.js +2 -2
  250. package/src/nodes/core/ContextNode.js +103 -4
  251. package/src/nodes/core/MRTNode.js +48 -2
  252. package/src/nodes/core/Node.js +29 -3
  253. package/src/nodes/core/NodeBuilder.js +170 -53
  254. package/src/nodes/core/NodeError.js +28 -0
  255. package/src/nodes/core/NodeFrame.js +12 -4
  256. package/src/nodes/core/NodeUtils.js +10 -8
  257. package/src/nodes/core/OutputStructNode.js +12 -10
  258. package/src/nodes/core/ParameterNode.js +3 -3
  259. package/src/nodes/core/PropertyNode.js +19 -3
  260. package/src/nodes/core/StackNode.js +65 -16
  261. package/src/nodes/core/StackTrace.js +139 -0
  262. package/src/nodes/core/StructNode.js +16 -2
  263. package/src/nodes/core/StructTypeNode.js +11 -17
  264. package/src/nodes/core/SubBuildNode.js +1 -1
  265. package/src/nodes/core/UniformNode.js +21 -5
  266. package/src/nodes/core/VarNode.js +47 -22
  267. package/src/nodes/core/VaryingNode.js +1 -18
  268. package/src/nodes/display/BlendModes.js +0 -64
  269. package/src/nodes/display/ColorAdjustment.js +17 -0
  270. package/src/nodes/display/ColorSpaceNode.js +3 -3
  271. package/src/nodes/display/NormalMapNode.js +39 -4
  272. package/src/nodes/display/PassNode.js +98 -9
  273. package/src/nodes/display/RenderOutputNode.js +3 -3
  274. package/src/nodes/display/ScreenNode.js +3 -1
  275. package/src/nodes/display/ToneMappingNode.js +1 -1
  276. package/src/nodes/display/ToonOutlinePassNode.js +2 -2
  277. package/src/nodes/display/ViewportDepthNode.js +52 -4
  278. package/src/nodes/display/ViewportTextureNode.js +21 -4
  279. package/src/nodes/fog/Fog.js +18 -35
  280. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +3 -3
  281. package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
  282. package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
  283. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +1 -1
  284. package/src/nodes/functions/PhysicalLightingModel.js +126 -45
  285. package/src/nodes/geometry/RangeNode.js +4 -2
  286. package/src/nodes/gpgpu/ComputeBuiltinNode.js +1 -2
  287. package/src/nodes/gpgpu/ComputeNode.js +5 -4
  288. package/src/nodes/gpgpu/SubgroupFunctionNode.js +1 -1
  289. package/src/nodes/gpgpu/WorkgroupInfoNode.js +4 -4
  290. package/src/nodes/lighting/AnalyticLightNode.js +53 -0
  291. package/src/nodes/lighting/EnvironmentNode.js +28 -3
  292. package/src/nodes/lighting/LightsNode.js +2 -2
  293. package/src/nodes/lighting/PointShadowNode.js +162 -149
  294. package/src/nodes/lighting/ShadowFilterNode.js +53 -65
  295. package/src/nodes/lighting/ShadowNode.js +97 -41
  296. package/src/nodes/math/BitcountNode.js +433 -0
  297. package/src/nodes/math/ConditionalNode.js +2 -2
  298. package/src/nodes/math/MathNode.js +3 -40
  299. package/src/nodes/math/OperatorNode.js +2 -1
  300. package/src/nodes/math/PackFloatNode.js +98 -0
  301. package/src/nodes/math/UnpackFloatNode.js +96 -0
  302. package/src/nodes/pmrem/PMREMNode.js +1 -1
  303. package/src/nodes/pmrem/PMREMUtils.js +9 -15
  304. package/src/nodes/tsl/TSLCore.js +17 -14
  305. package/src/nodes/utils/ArrayElementNode.js +13 -0
  306. package/src/nodes/utils/DebugNode.js +11 -11
  307. package/src/nodes/utils/EventNode.js +1 -2
  308. package/src/nodes/utils/JoinNode.js +2 -2
  309. package/src/nodes/utils/LoopNode.js +1 -1
  310. package/src/nodes/utils/MemberNode.js +1 -1
  311. package/src/nodes/utils/Packing.js +13 -1
  312. package/src/nodes/utils/PostProcessingUtils.js +33 -1
  313. package/src/nodes/utils/RTTNode.js +1 -1
  314. package/src/nodes/utils/ReflectorNode.js +3 -4
  315. package/src/nodes/utils/SampleNode.js +1 -1
  316. package/src/nodes/utils/SpriteSheetUV.js +35 -0
  317. package/src/nodes/utils/UVUtils.js +28 -0
  318. package/src/objects/BatchedMesh.js +27 -14
  319. package/src/objects/InstancedMesh.js +11 -0
  320. package/src/objects/Line.js +1 -1
  321. package/src/objects/Mesh.js +1 -1
  322. package/src/objects/Points.js +1 -1
  323. package/src/objects/Skeleton.js +9 -0
  324. package/src/renderers/WebGLRenderer.js +178 -92
  325. package/src/renderers/common/Backend.js +29 -0
  326. package/src/renderers/common/Background.js +24 -11
  327. package/src/renderers/common/BindGroup.js +1 -9
  328. package/src/renderers/common/Binding.js +11 -0
  329. package/src/renderers/common/Bindings.js +27 -12
  330. package/src/renderers/common/BlendMode.js +143 -0
  331. package/src/renderers/common/Buffer.js +40 -0
  332. package/src/renderers/common/BundleGroup.js +1 -1
  333. package/src/renderers/common/ChainMap.js +30 -6
  334. package/src/renderers/common/CubeRenderTarget.js +50 -6
  335. package/src/renderers/common/Geometries.js +29 -3
  336. package/src/renderers/common/Lighting.js +5 -21
  337. package/src/renderers/common/Pipelines.js +4 -4
  338. package/src/renderers/common/PostProcessing.js +8 -206
  339. package/src/renderers/common/RenderBundles.js +2 -1
  340. package/src/renderers/common/RenderContext.js +16 -0
  341. package/src/renderers/common/RenderContexts.js +33 -49
  342. package/src/renderers/common/RenderLists.js +2 -1
  343. package/src/renderers/common/RenderObject.js +15 -3
  344. package/src/renderers/common/RenderObjectPipeline.js +40 -0
  345. package/src/renderers/common/RenderObjects.js +18 -2
  346. package/src/renderers/common/RenderPipeline.js +203 -17
  347. package/src/renderers/common/Renderer.js +257 -72
  348. package/src/renderers/common/Sampler.js +4 -4
  349. package/src/renderers/common/StorageBuffer.js +13 -1
  350. package/src/renderers/common/Textures.js +17 -1
  351. package/src/renderers/common/TimestampQueryPool.js +5 -3
  352. package/src/renderers/common/Uniform.js +8 -0
  353. package/src/renderers/common/UniformsGroup.js +61 -0
  354. package/src/renderers/common/XRManager.js +3 -2
  355. package/src/renderers/common/extras/PMREMGenerator.js +2 -8
  356. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  357. package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +18 -6
  358. package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
  359. package/src/renderers/common/nodes/NodeUniformBuffer.js +52 -0
  360. package/src/renderers/shaders/DFGLUTData.js +19 -34
  361. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
  362. package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
  363. package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
  364. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
  365. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
  366. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +7 -11
  367. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +5 -2
  368. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
  369. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
  370. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
  371. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +112 -51
  372. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
  373. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +225 -186
  374. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
  375. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  376. package/src/renderers/shaders/ShaderChunk.js +3 -3
  377. package/src/renderers/shaders/ShaderLib/depth.glsl.js +3 -0
  378. package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +1 -2
  379. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
  380. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
  381. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
  382. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
  383. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
  384. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
  385. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
  386. package/src/renderers/shaders/ShaderLib.js +7 -5
  387. package/src/renderers/shaders/UniformsLib.js +0 -3
  388. package/src/renderers/webgl/WebGLBackground.js +2 -2
  389. package/src/renderers/webgl/WebGLBindingStates.js +99 -27
  390. package/src/renderers/webgl/WebGLCapabilities.js +3 -4
  391. package/src/renderers/webgl/WebGLEnvironments.js +228 -0
  392. package/src/renderers/webgl/WebGLGeometries.js +10 -7
  393. package/src/renderers/webgl/WebGLLights.js +18 -1
  394. package/src/renderers/webgl/WebGLMaterials.js +12 -0
  395. package/src/renderers/webgl/WebGLObjects.js +3 -1
  396. package/src/renderers/webgl/WebGLOutput.js +267 -0
  397. package/src/renderers/webgl/WebGLProgram.js +45 -109
  398. package/src/renderers/webgl/WebGLPrograms.js +45 -49
  399. package/src/renderers/webgl/WebGLRenderLists.js +15 -0
  400. package/src/renderers/webgl/WebGLShadowMap.js +188 -24
  401. package/src/renderers/webgl/WebGLState.js +32 -37
  402. package/src/renderers/webgl/WebGLTextures.js +89 -28
  403. package/src/renderers/webgl/WebGLUniforms.js +40 -3
  404. package/src/renderers/webgl/WebGLUtils.js +6 -2
  405. package/src/renderers/webgl-fallback/WebGLBackend.js +148 -18
  406. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +156 -35
  407. package/src/renderers/webgl-fallback/utils/WebGLState.js +181 -5
  408. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +5 -3
  409. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +9 -9
  410. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +6 -2
  411. package/src/renderers/webgpu/WebGPUBackend.js +119 -13
  412. package/src/renderers/webgpu/WebGPURenderer.js +2 -1
  413. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +322 -68
  414. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +4 -17
  415. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +357 -200
  416. package/src/renderers/webgpu/utils/WebGPUConstants.js +2 -0
  417. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +61 -23
  418. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +152 -200
  419. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +65 -42
  420. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +7 -7
  421. package/src/renderers/webgpu/utils/WebGPUUtils.js +17 -11
  422. package/src/renderers/webxr/WebXRManager.js +2 -2
  423. package/src/textures/CubeDepthTexture.js +76 -0
  424. package/src/textures/Source.js +1 -1
  425. package/src/textures/Texture.js +3 -3
  426. package/src/utils.js +258 -3
  427. package/examples/jsm/materials/MeshGouraudMaterial.js +0 -434
  428. package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
  429. package/examples/jsm/shaders/GodRaysShader.js +0 -333
  430. package/src/nodes/accessors/SceneNode.js +0 -145
  431. package/src/nodes/code/ScriptableNode.js +0 -726
  432. package/src/nodes/code/ScriptableValueNode.js +0 -253
  433. package/src/nodes/display/PosterizeNode.js +0 -65
  434. package/src/nodes/functions/BSDF/DFGApprox.js +0 -71
  435. package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
  436. package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
  437. package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
@@ -18,8 +18,11 @@ import {
18
18
  RGBA_ASTC_4x4_Format,
19
19
  RGBA_ASTC_6x6_Format,
20
20
  RGBA_BPTC_Format,
21
- RGBA_S3TC_DXT3_Format,
22
21
  RGBA_ETC2_EAC_Format,
22
+ R11_EAC_Format,
23
+ SIGNED_R11_EAC_Format,
24
+ RG11_EAC_Format,
25
+ SIGNED_RG11_EAC_Format,
23
26
  RGBA_PVRTC_4BPPV1_Format,
24
27
  RGBA_PVRTC_2BPPV1_Format,
25
28
  RGBA_S3TC_DXT1_Format,
@@ -71,6 +74,10 @@ import {
71
74
  VK_FORMAT_BC7_UNORM_BLOCK,
72
75
  VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK,
73
76
  VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK,
77
+ VK_FORMAT_EAC_R11_UNORM_BLOCK,
78
+ VK_FORMAT_EAC_R11_SNORM_BLOCK,
79
+ VK_FORMAT_EAC_R11G11_UNORM_BLOCK,
80
+ VK_FORMAT_EAC_R11G11_SNORM_BLOCK,
74
81
  VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG,
75
82
  VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG,
76
83
  VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG,
@@ -244,6 +251,7 @@ class KTX2Loader extends Loader {
244
251
  };
245
252
 
246
253
  if ( typeof navigator !== 'undefined' &&
254
+ typeof navigator.platform !== 'undefined' && typeof navigator.userAgent !== 'undefined' &&
247
255
  navigator.platform.indexOf( 'Linux' ) >= 0 && navigator.userAgent.indexOf( 'Firefox' ) >= 0 &&
248
256
  this.workerConfig.astcSupported && this.workerConfig.etc2Supported &&
249
257
  this.workerConfig.bptcSupported && this.workerConfig.dxtSupported ) {
@@ -968,6 +976,10 @@ const FORMAT_MAP = {
968
976
 
969
977
  [ VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK ]: RGBA_ETC2_EAC_Format,
970
978
  [ VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK ]: RGB_ETC2_Format,
979
+ [ VK_FORMAT_EAC_R11_UNORM_BLOCK ]: R11_EAC_Format,
980
+ [ VK_FORMAT_EAC_R11_SNORM_BLOCK ]: SIGNED_R11_EAC_Format,
981
+ [ VK_FORMAT_EAC_R11G11_UNORM_BLOCK ]: RG11_EAC_Format,
982
+ [ VK_FORMAT_EAC_R11G11_SNORM_BLOCK ]: SIGNED_RG11_EAC_Format,
971
983
 
972
984
  [ VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT ]: RGBA_ASTC_4x4_Format,
973
985
  [ VK_FORMAT_ASTC_4x4_SRGB_BLOCK ]: RGBA_ASTC_4x4_Format,
@@ -981,8 +993,8 @@ const FORMAT_MAP = {
981
993
  [ VK_FORMAT_BC1_RGB_SRGB_BLOCK ]: RGB_S3TC_DXT1_Format,
982
994
  [ VK_FORMAT_BC1_RGB_UNORM_BLOCK ]: RGB_S3TC_DXT1_Format,
983
995
 
984
- [ VK_FORMAT_BC3_SRGB_BLOCK ]: RGBA_S3TC_DXT3_Format,
985
- [ VK_FORMAT_BC3_UNORM_BLOCK ]: RGBA_S3TC_DXT3_Format,
996
+ [ VK_FORMAT_BC3_SRGB_BLOCK ]: RGBA_S3TC_DXT5_Format,
997
+ [ VK_FORMAT_BC3_UNORM_BLOCK ]: RGBA_S3TC_DXT5_Format,
986
998
 
987
999
  [ VK_FORMAT_BC4_SNORM_BLOCK ]: SIGNED_RED_RGTC1_Format,
988
1000
  [ VK_FORMAT_BC4_UNORM_BLOCK ]: RED_RGTC1_Format,
@@ -1022,6 +1034,10 @@ const TYPE_MAP = {
1022
1034
 
1023
1035
  [ VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK ]: UnsignedByteType,
1024
1036
  [ VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK ]: UnsignedByteType,
1037
+ [ VK_FORMAT_EAC_R11_UNORM_BLOCK ]: UnsignedByteType,
1038
+ [ VK_FORMAT_EAC_R11_SNORM_BLOCK ]: UnsignedByteType,
1039
+ [ VK_FORMAT_EAC_R11G11_UNORM_BLOCK ]: UnsignedByteType,
1040
+ [ VK_FORMAT_EAC_R11G11_SNORM_BLOCK ]: UnsignedByteType,
1025
1041
 
1026
1042
  [ VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT ]: HalfFloatType,
1027
1043
  [ VK_FORMAT_ASTC_4x4_SRGB_BLOCK ]: UnsignedByteType,
@@ -1664,7 +1664,7 @@ function createObject( loader, elements, elementSize, isConditionalSegments = fa
1664
1664
 
1665
1665
  if ( numGroupVerts > 0 ) {
1666
1666
 
1667
- bufferGeometry.addGroup( index0, Infinity, materials.length - 1 );
1667
+ bufferGeometry.addGroup( index0, numGroupVerts, materials.length - 1 );
1668
1668
 
1669
1669
  }
1670
1670
 
@@ -1749,7 +1749,7 @@ function createObject( loader, elements, elementSize, isConditionalSegments = fa
1749
1749
  /**
1750
1750
  * A loader for the LDraw format.
1751
1751
  *
1752
- * [LDraw](https://ldraw.org/} (LEGO Draw) is an [open format specification]{@link https://ldraw.org/article/218.html)
1752
+ * [LDraw](https://ldraw.org/} (LEGO Draw) is an [open format specification](https://ldraw.org/article/218.html)
1753
1753
  * for describing LEGO and other construction set 3D models.
1754
1754
  *
1755
1755
  * An LDraw asset (a text file usually with extension .ldr, .dat or .txt) can describe just a single construction
@@ -2400,7 +2400,6 @@ class LDrawLoader extends Loader {
2400
2400
 
2401
2401
  material.color.setStyle( fillColor, COLOR_SPACE_LDRAW );
2402
2402
  material.transparent = isTransparent;
2403
- material.premultipliedAlpha = true;
2404
2403
  material.opacity = alpha;
2405
2404
  material.depthWrite = ! isTransparent;
2406
2405
 
@@ -23,7 +23,8 @@ import {
23
23
  RepeatWrapping,
24
24
  SRGBColorSpace,
25
25
  TextureLoader,
26
- Vector2
26
+ Vector2,
27
+ Vector3
27
28
  } from 'three';
28
29
 
29
30
  import { IFFParser } from './lwo/IFFParser.js';
@@ -185,8 +186,6 @@ class LWOTreeParser {
185
186
 
186
187
  } );
187
188
 
188
- this.applyPivots( finalMeshes );
189
-
190
189
  return finalMeshes;
191
190
 
192
191
  }
@@ -204,38 +203,14 @@ class LWOTreeParser {
204
203
  if ( layer.name ) mesh.name = layer.name;
205
204
  else mesh.name = this.defaultLayerName + '_layer_' + layer.number;
206
205
 
207
- mesh.userData.pivot = layer.pivot;
208
-
209
- return mesh;
210
-
211
- }
212
-
213
- // TODO: may need to be reversed in z to convert LWO to three.js coordinates
214
- applyPivots( meshes ) {
215
-
216
- meshes.forEach( function ( mesh ) {
217
-
218
- mesh.traverse( function ( child ) {
219
-
220
- const pivot = child.userData.pivot;
221
-
222
- child.position.x += pivot[ 0 ];
223
- child.position.y += pivot[ 1 ];
224
- child.position.z += pivot[ 2 ];
206
+ const pivot = layer.pivot;
207
+ if ( pivot[ 0 ] !== 0 || pivot[ 1 ] !== 0 || pivot[ 2 ] !== 0 ) {
225
208
 
226
- if ( child.parent ) {
209
+ mesh.pivot = new Vector3( pivot[ 0 ], pivot[ 1 ], pivot[ 2 ] );
227
210
 
228
- const parentPivot = child.parent.userData.pivot;
229
-
230
- child.position.x -= parentPivot[ 0 ];
231
- child.position.y -= parentPivot[ 1 ];
232
- child.position.z -= parentPivot[ 2 ];
233
-
234
- }
235
-
236
- } );
211
+ }
237
212
 
238
- } );
213
+ return mesh;
239
214
 
240
215
  }
241
216
 
@@ -813,13 +788,6 @@ class GeometryParser {
813
788
  this.parseUVs( geometry, layer );
814
789
  this.parseMorphTargets( geometry, layer );
815
790
 
816
- // TODO: z may need to be reversed to account for coordinate system change
817
- geometry.translate( - layer.pivot[ 0 ], - layer.pivot[ 1 ], - layer.pivot[ 2 ] );
818
-
819
- // let userData = geometry.userData;
820
- // geometry = geometry.toNonIndexed()
821
- // geometry.userData = userData;
822
-
823
791
  return geometry;
824
792
 
825
793
  }
@@ -4,7 +4,7 @@ import {
4
4
  Matrix4,
5
5
  Vector3
6
6
  } from 'three';
7
- import * as fflate from '../libs/fflate.module.js';
7
+ import { gunzipSync } from '../libs/fflate.module.js';
8
8
  import { Volume } from '../misc/Volume.js';
9
9
 
10
10
  /**
@@ -356,7 +356,7 @@ class NRRDLoader extends Loader {
356
356
 
357
357
  // we need to decompress the datastream
358
358
  // here we start the unzipping and get a typed Uint8Array back
359
- _data = fflate.gunzipSync( new Uint8Array( _data ) );
359
+ _data = gunzipSync( new Uint8Array( _data ) );
360
360
 
361
361
  } else if ( headerObject.encoding === 'ascii' || headerObject.encoding === 'text' || headerObject.encoding === 'txt' || headerObject.encoding === 'hex' ) {
362
362
 
@@ -100,6 +100,7 @@ class PCDLoader extends Loader {
100
100
  /**
101
101
  * Get dataview value by field type and size.
102
102
  *
103
+ * @private
103
104
  * @param {DataView} dataview - The DataView to read from.
104
105
  * @param {number} offset - The offset to start reading from.
105
106
  * @param {'F' | 'U' | 'I'} type - Field type.
@@ -517,7 +518,7 @@ class PCDLoader extends Loader {
517
518
  if ( offset.label !== undefined ) {
518
519
 
519
520
  const labelIndex = PCDheader.fields.indexOf( 'label' );
520
- label.push( dataview.getInt32( ( PCDheader.points * offset.label ) + PCDheader.size[ labelIndex ] * i, this.littleEndian ) );
521
+ label.push( this._getDataView( dataview, ( PCDheader.points * offset.label ) + PCDheader.size[ labelIndex ] * i, PCDheader.type[ labelIndex ], PCDheader.size[ labelIndex ] ) );
521
522
 
522
523
  }
523
524
 
@@ -577,7 +578,8 @@ class PCDLoader extends Loader {
577
578
 
578
579
  if ( offset.label !== undefined ) {
579
580
 
580
- label.push( dataview.getInt32( row + offset.label, this.littleEndian ) );
581
+ const labelIndex = PCDheader.fields.indexOf( 'label' );
582
+ label.push( this._getDataView( dataview, row + offset.label, PCDheader.type[ labelIndex ], PCDheader.size[ labelIndex ] ) );
581
583
 
582
584
  }
583
585
 
@@ -1082,7 +1082,7 @@ class SVGLoader extends Loader {
1082
1082
  };
1083
1083
 
1084
1084
  if ( node.hasAttribute( svgName ) ) style[ jsName ] = adjustFunction( node.getAttribute( svgName ) );
1085
- if ( stylesheetStyles[ svgName ] ) style[ jsName ] = adjustFunction( stylesheetStyles[ svgName ] );
1085
+ if ( stylesheetStyles[ jsName ] ) style[ jsName ] = adjustFunction( stylesheetStyles[ jsName ] );
1086
1086
  if ( node.style && node.style[ svgName ] !== '' ) style[ jsName ] = adjustFunction( node.style[ svgName ] );
1087
1087
 
1088
1088
  }
@@ -684,11 +684,9 @@ class TDSLoader extends Loader {
684
684
 
685
685
  case INT_PERCENTAGE:
686
686
  return ( subChunk.readShort( ) / 100 );
687
- break;
688
687
 
689
688
  case FLOAT_PERCENTAGE:
690
689
  return subChunk.readFloat( );
691
- break;
692
690
 
693
691
  default:
694
692
  this.debugMessage( ' Unknown percentage chunk: ' + subChunk.hexId );
@@ -389,7 +389,6 @@ class TGALoader extends DataTextureLoader {
389
389
 
390
390
  default:
391
391
  throw new Error( 'THREE.TGALoader: Format not supported.' );
392
- break;
393
392
 
394
393
  }
395
394
 
@@ -415,7 +414,6 @@ class TGALoader extends DataTextureLoader {
415
414
 
416
415
  default:
417
416
  throw new Error( 'THREE.TGALoader: Format not supported.' );
418
- break;
419
417
 
420
418
  }
421
419
 
@@ -3,18 +3,20 @@ import {
3
3
  Loader
4
4
  } from 'three';
5
5
 
6
- import * as fflate from '../libs/fflate.module.js';
6
+ import { unzipSync } from '../libs/fflate.module.js';
7
7
  import { USDAParser } from './usd/USDAParser.js';
8
8
  import { USDCParser } from './usd/USDCParser.js';
9
+ import { USDComposer } from './usd/USDComposer.js';
9
10
 
10
11
  /**
11
- * A loader for the USDZ format.
12
+ * A loader for the USD format (USD, USDA, USDC, USDZ).
12
13
  *
13
- * USDZ files that use USDC internally are not yet supported, only USDA.
14
+ * Supports both ASCII (USDA) and binary (USDC) USD files, as well as
15
+ * USDZ archives containing either format.
14
16
  *
15
17
  * ```js
16
- * const loader = new USDZLoader();
17
- * const model = await loader.loadAsync( 'saeukkang.usdz' );
18
+ * const loader = new USDLoader();
19
+ * const model = await loader.loadAsync( 'model.usdz' );
18
20
  * scene.add( model );
19
21
  * ```
20
22
  *
@@ -88,34 +90,60 @@ class USDLoader extends Loader {
88
90
 
89
91
  const usda = new USDAParser();
90
92
  const usdc = new USDCParser();
93
+ const textDecoder = new TextDecoder();
94
+
95
+ function toArrayBuffer( data ) {
96
+
97
+ if ( data instanceof ArrayBuffer ) return data;
98
+
99
+ if ( data.byteOffset === 0 && data.byteLength === data.buffer.byteLength ) {
100
+
101
+ return data.buffer;
102
+
103
+ }
104
+
105
+ return data.buffer.slice( data.byteOffset, data.byteOffset + data.byteLength );
106
+
107
+ }
108
+
109
+ function getLowercaseExtension( filename ) {
110
+
111
+ const lastDot = filename.lastIndexOf( '.' );
112
+ if ( lastDot < 0 ) return '';
113
+
114
+ const lastSlash = filename.lastIndexOf( '/' );
115
+ if ( lastSlash > lastDot ) return '';
116
+
117
+ return filename.slice( lastDot + 1 ).toLowerCase();
118
+
119
+ }
91
120
 
92
121
  function parseAssets( zip ) {
93
122
 
94
123
  const data = {};
95
- const loader = new FileLoader();
96
- loader.setResponseType( 'arraybuffer' );
97
124
 
98
125
  for ( const filename in zip ) {
99
126
 
100
- if ( filename.endsWith( 'png' ) ) {
127
+ const fileBytes = zip[ filename ];
128
+ const ext = getLowercaseExtension( filename );
101
129
 
102
- const blob = new Blob( [ zip[ filename ] ], { type: 'image/png' } );
103
- data[ filename ] = URL.createObjectURL( blob );
130
+ if ( ext === 'png' || ext === 'jpg' || ext === 'jpeg' || ext === 'avif' ) {
104
131
 
105
- }
132
+ // Keep raw image bytes and create object URLs lazily in USDComposer.
133
+ data[ filename ] = fileBytes;
134
+ continue;
106
135
 
107
- if ( filename.endsWith( 'usd' ) || filename.endsWith( 'usda' ) || filename.endsWith( 'usdc' ) ) {
136
+ }
108
137
 
109
- if ( isCrateFile( zip[ filename ] ) ) {
138
+ if ( ext !== 'usd' && ext !== 'usda' && ext !== 'usdc' ) continue;
110
139
 
111
- data[ filename ] = usdc.parse( zip[ filename ].buffer, data );
140
+ if ( isCrateFile( fileBytes ) ) {
112
141
 
113
- } else {
142
+ data[ filename ] = usdc.parseData( toArrayBuffer( fileBytes ) );
114
143
 
115
- const text = fflate.strFromU8( zip[ filename ] );
116
- data[ filename ] = usda.parseText( text );
144
+ } else {
117
145
 
118
- }
146
+ data[ filename ] = usda.parseData( textDecoder.decode( fileBytes ) );
119
147
 
120
148
  }
121
149
 
@@ -128,10 +156,9 @@ class USDLoader extends Loader {
128
156
  function isCrateFile( buffer ) {
129
157
 
130
158
  const crateHeader = new Uint8Array( [ 0x50, 0x58, 0x52, 0x2D, 0x55, 0x53, 0x44, 0x43 ] ); // PXR-USDC
159
+ const view = buffer instanceof Uint8Array ? buffer : new Uint8Array( buffer );
131
160
 
132
- if ( buffer.byteLength < crateHeader.length ) return false;
133
-
134
- const view = new Uint8Array( buffer, 0, crateHeader.length );
161
+ if ( view.byteLength < crateHeader.length ) return false;
135
162
 
136
163
  for ( let i = 0; i < crateHeader.length; i ++ ) {
137
164
 
@@ -145,26 +172,30 @@ class USDLoader extends Loader {
145
172
 
146
173
  function findUSD( zip ) {
147
174
 
148
- if ( zip.length < 1 ) return undefined;
175
+ const fileNames = Object.keys( zip );
176
+ if ( fileNames.length < 1 ) return { file: undefined, filename: '', basePath: '' };
149
177
 
150
- const firstFileName = Object.keys( zip )[ 0 ];
178
+ const firstFileName = fileNames[ 0 ];
179
+ const ext = getLowercaseExtension( firstFileName );
151
180
  let isCrate = false;
152
181
 
153
- // As per the USD specification, the first entry in the zip archive is used as the main file ("UsdStage").
182
+ const lastSlash = firstFileName.lastIndexOf( '/' );
183
+ const basePath = lastSlash >= 0 ? firstFileName.slice( 0, lastSlash ) : '';
184
+
185
+ // Per AOUSD core spec v1.0.1 section 16.4.1.2, the first ZIP entry is the root layer.
154
186
  // ASCII files can end in either .usda or .usd.
155
- // See https://openusd.org/release/spec_usdz.html#layout
156
- if ( firstFileName.endsWith( 'usda' ) ) return zip[ firstFileName ];
187
+ if ( ext === 'usda' ) return { file: zip[ firstFileName ], filename: firstFileName, basePath };
157
188
 
158
- if ( firstFileName.endsWith( 'usdc' ) ) {
189
+ if ( ext === 'usdc' ) {
159
190
 
160
191
  isCrate = true;
161
192
 
162
- } else if ( firstFileName.endsWith( 'usd' ) ) {
193
+ } else if ( ext === 'usd' ) {
163
194
 
164
195
  // If this is not a crate file, we assume it is a plain USDA file.
165
196
  if ( ! isCrateFile( zip[ firstFileName ] ) ) {
166
197
 
167
- return zip[ firstFileName ];
198
+ return { file: zip[ firstFileName ], filename: firstFileName, basePath };
168
199
 
169
200
  } else {
170
201
 
@@ -176,41 +207,70 @@ class USDLoader extends Loader {
176
207
 
177
208
  if ( isCrate ) {
178
209
 
179
- return zip[ firstFileName ];
210
+ return { file: zip[ firstFileName ], filename: firstFileName, basePath };
180
211
 
181
212
  }
182
213
 
214
+ return { file: undefined, filename: '', basePath: '' };
215
+
183
216
  }
184
217
 
185
- // USDA
218
+ const scope = this;
219
+
220
+ // USDA (standalone)
186
221
 
187
222
  if ( typeof buffer === 'string' ) {
188
223
 
189
- return usda.parse( buffer, {} );
224
+ const composer = new USDComposer( scope.manager );
225
+ const data = usda.parseData( buffer );
226
+ return composer.compose( data, {} );
190
227
 
191
228
  }
192
229
 
193
- // USDC
230
+ // USDC (standalone)
194
231
 
195
232
  if ( isCrateFile( buffer ) ) {
196
233
 
197
- return usdc.parse( buffer );
234
+ const composer = new USDComposer( scope.manager );
235
+ const data = usdc.parseData( toArrayBuffer( buffer ) );
236
+ return composer.compose( data, {} );
198
237
 
199
238
  }
200
239
 
240
+ const bytes = new Uint8Array( buffer );
241
+
201
242
  // USDZ
202
243
 
203
- const zip = fflate.unzipSync( new Uint8Array( buffer ) );
244
+ if ( bytes[ 0 ] === 0x50 && bytes[ 1 ] === 0x4B ) {
245
+
246
+ const zip = unzipSync( bytes );
247
+ const assets = parseAssets( zip );
248
+ const { file, filename, basePath } = findUSD( zip );
204
249
 
205
- const assets = parseAssets( zip );
250
+ if ( ! file ) {
206
251
 
207
- // console.log( assets );
252
+ throw new Error( 'USDLoader: Invalid USDZ package. The first ZIP entry must be a USD layer (.usd/.usda/.usdc).' );
208
253
 
209
- const file = findUSD( zip );
254
+ }
255
+
256
+ const composer = new USDComposer( scope.manager );
257
+ const data = assets[ filename ];
258
+ if ( ! data ) {
259
+
260
+ throw new Error( 'USDLoader: Failed to parse root layer "' + filename + '".' );
261
+
262
+ }
263
+
264
+ return composer.compose( data, assets, {}, basePath );
265
+
266
+ }
210
267
 
211
- const text = fflate.strFromU8( file );
268
+ // USDA (standalone, as ArrayBuffer)
212
269
 
213
- return usda.parse( text, assets );
270
+ const composer = new USDComposer( scope.manager );
271
+ const text = textDecoder.decode( bytes );
272
+ const data = usda.parseData( text );
273
+ return composer.compose( data, {} );
214
274
 
215
275
  }
216
276