super-three 0.181.0 → 0.185.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 (693) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +3 -4
  3. package/build/three.cjs +21332 -19201
  4. package/build/three.core.js +20908 -19853
  5. package/build/three.core.min.js +2 -2
  6. package/build/three.module.js +1947 -862
  7. package/build/three.module.min.js +2 -2
  8. package/build/three.tsl.js +37 -16
  9. package/build/three.tsl.min.js +2 -2
  10. package/build/three.webgpu.js +33628 -25197
  11. package/build/three.webgpu.min.js +2 -2
  12. package/build/three.webgpu.nodes.js +33394 -25000
  13. package/build/three.webgpu.nodes.min.js +2 -2
  14. package/examples/jsm/Addons.js +14 -3
  15. package/examples/jsm/animation/CCDIKSolver.js +7 -3
  16. package/examples/jsm/controls/ArcballControls.js +13 -6
  17. package/examples/jsm/controls/DragControls.js +2 -2
  18. package/examples/jsm/controls/FirstPersonControls.js +127 -86
  19. package/examples/jsm/controls/FlyControls.js +4 -0
  20. package/examples/jsm/controls/MapControls.js +55 -1
  21. package/examples/jsm/controls/OrbitControls.js +111 -8
  22. package/examples/jsm/controls/TrackballControls.js +8 -8
  23. package/examples/jsm/controls/TransformControls.js +102 -17
  24. package/examples/jsm/csm/CSM.js +2 -1
  25. package/examples/jsm/csm/CSMFrustum.js +31 -6
  26. package/examples/jsm/csm/CSMShadowNode.js +10 -3
  27. package/examples/jsm/effects/AnaglyphEffect.js +102 -7
  28. package/examples/jsm/effects/AsciiEffect.js +14 -1
  29. package/examples/jsm/environments/ColorEnvironment.js +59 -0
  30. package/examples/jsm/environments/RoomEnvironment.js +3 -0
  31. package/examples/jsm/exporters/DRACOExporter.js +27 -6
  32. package/examples/jsm/exporters/EXRExporter.js +1 -1
  33. package/examples/jsm/exporters/GLTFExporter.js +266 -21
  34. package/examples/jsm/exporters/PLYExporter.js +286 -73
  35. package/examples/jsm/exporters/USDZExporter.js +353 -99
  36. package/examples/jsm/generators/CityGenerator.js +346 -0
  37. package/examples/jsm/generators/ForestGenerator.js +347 -0
  38. package/examples/jsm/generators/TerrainGenerator.js +504 -0
  39. package/examples/jsm/generators/TreeGenerator.js +377 -0
  40. package/examples/jsm/generators/city/SidewalkGenerator.js +253 -0
  41. package/examples/jsm/generators/city/SkyscraperGenerator.js +1357 -0
  42. package/examples/jsm/geometries/DecalGeometry.js +1 -1
  43. package/examples/jsm/geometries/LoftGeometry.js +355 -0
  44. package/examples/jsm/geometries/TextGeometry.js +18 -0
  45. package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
  46. package/examples/jsm/helpers/LightProbeGridHelper.js +221 -0
  47. package/examples/jsm/helpers/LightProbeHelper.js +5 -4
  48. package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -1
  49. package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
  50. package/examples/jsm/helpers/ViewHelper.js +83 -14
  51. package/examples/jsm/inspector/Extension.js +13 -0
  52. package/examples/jsm/inspector/Inspector.js +244 -91
  53. package/examples/jsm/inspector/RendererInspector.js +165 -39
  54. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +916 -0
  55. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +281 -0
  56. package/examples/jsm/inspector/tabs/Console.js +241 -25
  57. package/examples/jsm/inspector/tabs/Memory.js +136 -0
  58. package/examples/jsm/inspector/tabs/Parameters.js +115 -7
  59. package/examples/jsm/inspector/tabs/Performance.js +24 -9
  60. package/examples/jsm/inspector/tabs/Settings.js +306 -0
  61. package/examples/jsm/inspector/tabs/Timeline.js +1696 -0
  62. package/examples/jsm/inspector/tabs/Viewer.js +723 -9
  63. package/examples/jsm/inspector/ui/Graph.js +162 -25
  64. package/examples/jsm/inspector/ui/Item.js +92 -13
  65. package/examples/jsm/inspector/ui/List.js +2 -2
  66. package/examples/jsm/inspector/ui/Profiler.js +1991 -44
  67. package/examples/jsm/inspector/ui/Style.js +1943 -543
  68. package/examples/jsm/inspector/ui/Tab.js +226 -5
  69. package/examples/jsm/inspector/ui/Values.js +126 -8
  70. package/examples/jsm/inspector/ui/utils.js +143 -10
  71. package/examples/jsm/interaction/InteractionManager.js +226 -0
  72. package/examples/jsm/libs/basis/README.md +0 -1
  73. package/examples/jsm/libs/demuxer_mp4.js +3 -3
  74. package/examples/jsm/libs/draco/README.md +0 -1
  75. package/examples/jsm/libs/meshopt_clusterizer.module.js +421 -0
  76. package/examples/jsm/libs/meshopt_decoder.module.js +9 -8
  77. package/examples/jsm/libs/meshopt_simplifier.module.js +627 -0
  78. package/examples/jsm/libs/mikktspace.module.js +34 -9
  79. package/examples/jsm/lighting/ClusteredLighting.js +55 -0
  80. package/examples/jsm/lighting/DynamicLighting.js +82 -0
  81. package/examples/jsm/lighting/LightProbeGrid.js +681 -0
  82. package/examples/jsm/lines/LineMaterial.js +45 -16
  83. package/examples/jsm/lines/LineSegments2.js +8 -0
  84. package/examples/jsm/lines/webgpu/LineSegments2.js +8 -0
  85. package/examples/jsm/loaders/3DMLoader.js +6 -5
  86. package/examples/jsm/loaders/3MFLoader.js +2 -2
  87. package/examples/jsm/loaders/AMFLoader.js +2 -2
  88. package/examples/jsm/loaders/ColladaLoader.js +24 -4026
  89. package/examples/jsm/loaders/DRACOLoader.js +51 -18
  90. package/examples/jsm/loaders/EXRLoader.js +701 -90
  91. package/examples/jsm/loaders/FBXLoader.js +235 -37
  92. package/examples/jsm/loaders/GCodeLoader.js +34 -8
  93. package/examples/jsm/loaders/GLTFLoader.js +146 -178
  94. package/examples/jsm/loaders/HDRLoader.js +7 -30
  95. package/examples/jsm/loaders/KMZLoader.js +5 -5
  96. package/examples/jsm/loaders/KTX2Loader.js +58 -17
  97. package/examples/jsm/loaders/LDrawLoader.js +49 -58
  98. package/examples/jsm/loaders/LUT3dlLoader.js +2 -2
  99. package/examples/jsm/loaders/LUTCubeLoader.js +2 -2
  100. package/examples/jsm/loaders/LWOLoader.js +11 -39
  101. package/examples/jsm/loaders/LottieLoader.js +1 -1
  102. package/examples/jsm/loaders/MaterialXLoader.js +31 -9
  103. package/examples/jsm/loaders/NRRDLoader.js +5 -5
  104. package/examples/jsm/loaders/PCDLoader.js +11 -9
  105. package/examples/jsm/loaders/PLYLoader.js +218 -55
  106. package/examples/jsm/loaders/SVGLoader.js +549 -497
  107. package/examples/jsm/loaders/TDSLoader.js +0 -2
  108. package/examples/jsm/loaders/TGALoader.js +0 -2
  109. package/examples/jsm/loaders/TTFLoader.js +1 -1
  110. package/examples/jsm/loaders/USDLoader.js +127 -43
  111. package/examples/jsm/loaders/UltraHDRLoader.js +285 -160
  112. package/examples/jsm/loaders/VOXLoader.js +660 -117
  113. package/examples/jsm/loaders/VRMLLoader.js +80 -3
  114. package/examples/jsm/loaders/VTKLoader.js +42 -25
  115. package/examples/jsm/loaders/collada/ColladaComposer.js +3044 -0
  116. package/examples/jsm/loaders/collada/ColladaParser.js +1977 -0
  117. package/examples/jsm/loaders/usd/USDAParser.js +504 -344
  118. package/examples/jsm/loaders/usd/USDCParser.js +1867 -6
  119. package/examples/jsm/loaders/usd/USDComposer.js +4627 -0
  120. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
  121. package/examples/jsm/materials/WoodNodeMaterial.js +11 -11
  122. package/examples/jsm/math/Octree.js +131 -1
  123. package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
  124. package/examples/jsm/misc/RollerCoaster.js +42 -4
  125. package/examples/jsm/misc/TileCreasedNormalsPlugin.js +270 -0
  126. package/examples/jsm/misc/Volume.js +2 -3
  127. package/examples/jsm/misc/VolumeSlice.js +0 -1
  128. package/examples/jsm/modifiers/TessellateModifier.js +1 -1
  129. package/examples/jsm/objects/GroundedSkybox.js +1 -1
  130. package/examples/jsm/objects/LensflareMesh.js +1 -1
  131. package/examples/jsm/objects/Reflector.js +72 -25
  132. package/examples/jsm/objects/Sky.js +90 -6
  133. package/examples/jsm/objects/SkyMesh.js +150 -16
  134. package/examples/jsm/objects/Water.js +4 -3
  135. package/examples/jsm/objects/Water2.js +5 -3
  136. package/examples/jsm/objects/Water2Mesh.js +1 -1
  137. package/examples/jsm/objects/WaterMesh.js +5 -7
  138. package/examples/jsm/physics/AmmoPhysics.js +27 -15
  139. package/examples/jsm/physics/JoltPhysics.js +10 -6
  140. package/examples/jsm/physics/RapierPhysics.js +36 -7
  141. package/examples/jsm/postprocessing/EffectComposer.js +7 -5
  142. package/examples/jsm/postprocessing/OutputPass.js +9 -0
  143. package/examples/jsm/postprocessing/RenderPass.js +10 -0
  144. package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
  145. package/examples/jsm/postprocessing/UnrealBloomPass.js +48 -18
  146. package/examples/jsm/renderers/CSS3DRenderer.js +1 -1
  147. package/examples/jsm/renderers/Projector.js +246 -28
  148. package/examples/jsm/renderers/SVGRenderer.js +174 -60
  149. package/examples/jsm/shaders/GTAOShader.js +19 -6
  150. package/examples/jsm/shaders/HalftoneShader.js +12 -1
  151. package/examples/jsm/shaders/PoissonDenoiseShader.js +6 -2
  152. package/examples/jsm/shaders/SAOShader.js +17 -4
  153. package/examples/jsm/shaders/SSAOShader.js +11 -1
  154. package/examples/jsm/shaders/SSRShader.js +6 -5
  155. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -4
  156. package/examples/jsm/shaders/VignetteShader.js +1 -1
  157. package/examples/jsm/shaders/VolumeShader.js +31 -44
  158. package/examples/jsm/transpiler/AST.js +44 -0
  159. package/examples/jsm/transpiler/GLSLDecoder.js +65 -8
  160. package/examples/jsm/transpiler/Linker.js +1 -1
  161. package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
  162. package/examples/jsm/transpiler/TSLEncoder.js +46 -3
  163. package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
  164. package/examples/jsm/transpiler/WGSLEncoder.js +27 -0
  165. package/examples/jsm/tsl/WebGLNodesHandler.js +605 -0
  166. package/examples/jsm/tsl/display/AfterImageNode.js +11 -1
  167. package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
  168. package/examples/jsm/tsl/display/BilateralBlurNode.js +374 -0
  169. package/examples/jsm/tsl/display/BloomNode.js +75 -25
  170. package/examples/jsm/tsl/display/CRT.js +150 -0
  171. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +3 -36
  172. package/examples/jsm/tsl/display/DenoiseNode.js +1 -1
  173. package/examples/jsm/tsl/display/DepthOfFieldNode.js +3 -3
  174. package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
  175. package/examples/jsm/tsl/display/FSR1Node.js +477 -0
  176. package/examples/jsm/tsl/display/FXAANode.js +13 -14
  177. package/examples/jsm/tsl/display/GTAONode.js +40 -17
  178. package/examples/jsm/tsl/display/GaussianBlurNode.js +21 -2
  179. package/examples/jsm/tsl/display/GodraysNode.js +615 -0
  180. package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +560 -0
  181. package/examples/jsm/tsl/display/LensflareNode.js +1 -1
  182. package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
  183. package/examples/jsm/tsl/display/OutlineNode.js +69 -19
  184. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
  185. package/examples/jsm/tsl/display/PixelationPassNode.js +9 -8
  186. package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
  187. package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +912 -0
  188. package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
  189. package/examples/jsm/tsl/display/SMAANode.js +2 -2
  190. package/examples/jsm/tsl/display/SSAAPassNode.js +15 -27
  191. package/examples/jsm/tsl/display/SSGINode.js +96 -62
  192. package/examples/jsm/tsl/display/SSRNode.js +831 -134
  193. package/examples/jsm/tsl/display/SSSNode.js +8 -6
  194. package/examples/jsm/tsl/display/Shape.js +29 -0
  195. package/examples/jsm/tsl/display/SharpenNode.js +283 -0
  196. package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
  197. package/examples/jsm/tsl/display/StereoCompositePassNode.js +8 -1
  198. package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
  199. package/examples/jsm/tsl/display/TAAUNode.js +835 -0
  200. package/examples/jsm/tsl/display/TRAANode.js +315 -126
  201. package/examples/jsm/tsl/display/TemporalReprojectNode.js +1023 -0
  202. package/examples/jsm/tsl/display/TransitionNode.js +1 -1
  203. package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
  204. package/examples/jsm/tsl/display/radialBlur.js +68 -0
  205. package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +622 -0
  206. package/examples/jsm/tsl/lighting/DynamicLightsNode.js +300 -0
  207. package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +61 -0
  208. package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +111 -0
  209. package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +99 -0
  210. package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +134 -0
  211. package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +161 -0
  212. package/examples/jsm/tsl/math/Bayer.js +53 -3
  213. package/examples/jsm/tsl/math/curlNoise.js +107 -0
  214. package/examples/jsm/tsl/shadows/TileShadowNode.js +1 -1
  215. package/examples/jsm/tsl/shadows/TileShadowNodeHelper.js +3 -3
  216. package/examples/jsm/tsl/utils/GroundedSkybox.js +62 -0
  217. package/examples/jsm/tsl/utils/RNoise.js +51 -0
  218. package/examples/jsm/tsl/utils/SpecularHelpers.js +325 -0
  219. package/examples/jsm/utils/BufferGeometryUtils.js +128 -62
  220. package/examples/jsm/utils/ColorUtils.js +76 -0
  221. package/examples/jsm/utils/GeometryCompressionUtils.js +1 -1
  222. package/examples/jsm/utils/LDrawUtils.js +1 -1
  223. package/examples/jsm/utils/SceneOptimizer.js +1 -1
  224. package/examples/jsm/utils/ShadowMapViewer.js +24 -10
  225. package/examples/jsm/utils/ShadowMapViewerGPU.js +1 -1
  226. package/examples/jsm/utils/SkeletonUtils.js +14 -8
  227. package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
  228. package/examples/jsm/webxr/ARButton.js +1 -1
  229. package/examples/jsm/webxr/WebGLXRFallback.js +89 -0
  230. package/examples/jsm/webxr/XRControllerModelFactory.js +2 -2
  231. package/examples/jsm/webxr/XRHandMeshModel.js +36 -10
  232. package/examples/jsm/webxr/XRHandModelFactory.js +2 -1
  233. package/package.json +28 -34
  234. package/src/Three.Core.js +3 -1
  235. package/src/Three.TSL.js +35 -14
  236. package/src/Three.WebGPU.Nodes.js +5 -0
  237. package/src/Three.WebGPU.js +13 -0
  238. package/src/Three.js +1 -0
  239. package/src/animation/AnimationAction.js +18 -4
  240. package/src/animation/AnimationClip.js +0 -139
  241. package/src/animation/AnimationMixer.js +6 -0
  242. package/src/animation/AnimationUtils.js +1 -12
  243. package/src/animation/KeyframeTrack.js +47 -8
  244. package/src/animation/PropertyBinding.js +2 -2
  245. package/src/animation/PropertyMixer.js +4 -4
  246. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  247. package/src/animation/tracks/ColorKeyframeTrack.js +1 -1
  248. package/src/animation/tracks/NumberKeyframeTrack.js +1 -1
  249. package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -1
  250. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  251. package/src/animation/tracks/VectorKeyframeTrack.js +1 -1
  252. package/src/audio/Audio.js +1 -1
  253. package/src/audio/AudioContext.js +2 -2
  254. package/src/audio/AudioListener.js +5 -3
  255. package/src/cameras/Camera.js +34 -4
  256. package/src/cameras/CubeCamera.js +20 -0
  257. package/src/cameras/StereoCamera.js +5 -2
  258. package/src/constants.js +90 -5
  259. package/src/core/BufferAttribute.js +13 -1
  260. package/src/core/BufferGeometry.js +43 -9
  261. package/src/core/Clock.js +7 -0
  262. package/src/core/Object3D.js +69 -11
  263. package/src/core/Raycaster.js +3 -3
  264. package/src/core/RenderTarget.js +19 -6
  265. package/src/extras/PMREMGenerator.js +13 -22
  266. package/src/extras/TextureUtils.js +6 -2
  267. package/src/extras/core/ShapePath.js +149 -160
  268. package/src/extras/curves/CatmullRomCurve3.js +3 -2
  269. package/src/geometries/ExtrudeGeometry.js +2 -2
  270. package/src/geometries/PolyhedronGeometry.js +1 -1
  271. package/src/geometries/SphereGeometry.js +8 -3
  272. package/src/geometries/TorusGeometry.js +8 -3
  273. package/src/helpers/CameraHelper.js +3 -0
  274. package/src/helpers/DirectionalLightHelper.js +6 -1
  275. package/src/helpers/HemisphereLightHelper.js +5 -0
  276. package/src/helpers/PointLightHelper.js +3 -25
  277. package/src/helpers/SpotLightHelper.js +4 -1
  278. package/src/lights/DirectionalLight.js +13 -0
  279. package/src/lights/HemisphereLight.js +10 -0
  280. package/src/lights/Light.js +1 -11
  281. package/src/lights/LightProbe.js +0 -15
  282. package/src/lights/LightShadow.js +15 -6
  283. package/src/lights/PointLight.js +15 -0
  284. package/src/lights/PointLightShadow.js +0 -86
  285. package/src/lights/SpotLight.js +22 -1
  286. package/src/lights/webgpu/IESSpotLight.js +2 -1
  287. package/src/loaders/AudioLoader.js +11 -1
  288. package/src/loaders/Cache.js +28 -0
  289. package/src/loaders/DataTextureLoader.js +75 -42
  290. package/src/loaders/FileLoader.js +2 -3
  291. package/src/loaders/ImageBitmapLoader.js +12 -9
  292. package/src/loaders/Loader.js +6 -0
  293. package/src/loaders/LoadingManager.js +5 -0
  294. package/src/loaders/MaterialLoader.js +37 -266
  295. package/src/loaders/ObjectLoader.js +48 -6
  296. package/src/loaders/nodes/NodeLoader.js +2 -2
  297. package/src/loaders/nodes/NodeObjectLoader.js +18 -0
  298. package/src/materials/LineBasicMaterial.js +4 -0
  299. package/src/materials/Material.js +198 -1
  300. package/src/materials/MeshBasicMaterial.js +24 -0
  301. package/src/materials/MeshDepthMaterial.js +10 -0
  302. package/src/materials/MeshDistanceMaterial.js +10 -0
  303. package/src/materials/MeshLambertMaterial.js +49 -1
  304. package/src/materials/MeshMatcapMaterial.js +25 -1
  305. package/src/materials/MeshNormalMaterial.js +9 -1
  306. package/src/materials/MeshPhongMaterial.js +49 -1
  307. package/src/materials/MeshPhysicalMaterial.js +38 -0
  308. package/src/materials/MeshStandardMaterial.js +42 -1
  309. package/src/materials/MeshToonMaterial.js +35 -2
  310. package/src/materials/PointsMaterial.js +7 -0
  311. package/src/materials/ShaderMaterial.js +106 -1
  312. package/src/materials/SpriteMaterial.js +7 -0
  313. package/src/materials/nodes/Line2NodeMaterial.js +380 -297
  314. package/src/materials/nodes/MeshBasicNodeMaterial.js +2 -2
  315. package/src/materials/nodes/MeshNormalNodeMaterial.js +2 -2
  316. package/src/materials/nodes/MeshPhongNodeMaterial.js +0 -9
  317. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +3 -30
  318. package/src/materials/nodes/MeshSSSNodeMaterial.js +0 -13
  319. package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -15
  320. package/src/materials/nodes/NodeMaterial.js +153 -89
  321. package/src/materials/nodes/SpriteNodeMaterial.js +0 -10
  322. package/src/materials/nodes/manager/NodeMaterialObserver.js +234 -100
  323. package/src/math/Box3.js +5 -0
  324. package/src/math/FrustumArray.js +103 -133
  325. package/src/math/Interpolant.js +1 -1
  326. package/src/math/Line3.js +6 -5
  327. package/src/math/MathUtils.js +12 -12
  328. package/src/math/Matrix2.js +13 -9
  329. package/src/math/Matrix3.js +24 -9
  330. package/src/math/Matrix4.js +112 -74
  331. package/src/math/Plane.js +4 -3
  332. package/src/math/Quaternion.js +3 -29
  333. package/src/math/Sphere.js +1 -1
  334. package/src/math/Triangle.js +1 -1
  335. package/src/math/Vector2.js +13 -9
  336. package/src/math/Vector3.js +17 -15
  337. package/src/math/Vector4.js +15 -11
  338. package/src/math/interpolants/BezierInterpolant.js +106 -0
  339. package/src/nodes/Nodes.js +86 -71
  340. package/src/nodes/TSL.js +15 -13
  341. package/src/nodes/accessors/Arrays.js +5 -5
  342. package/src/nodes/accessors/Batch.js +108 -0
  343. package/src/nodes/accessors/Bitangent.js +7 -7
  344. package/src/nodes/accessors/BufferAttributeNode.js +120 -17
  345. package/src/nodes/accessors/BufferNode.js +29 -2
  346. package/src/nodes/accessors/Camera.js +149 -28
  347. package/src/nodes/accessors/ClippingNode.js +5 -5
  348. package/src/nodes/accessors/CubeTextureNode.js +27 -2
  349. package/src/nodes/accessors/Instance.js +264 -0
  350. package/src/nodes/accessors/MaterialNode.js +27 -3
  351. package/src/nodes/accessors/MaterialProperties.js +6 -8
  352. package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
  353. package/src/nodes/accessors/ModelNode.js +1 -1
  354. package/src/nodes/accessors/{MorphNode.js → Morph.js} +99 -112
  355. package/src/nodes/accessors/Normal.js +24 -24
  356. package/src/nodes/accessors/Object3DNode.js +1 -1
  357. package/src/nodes/accessors/Position.js +39 -3
  358. package/src/nodes/accessors/ReferenceBaseNode.js +6 -6
  359. package/src/nodes/accessors/ReferenceNode.js +9 -8
  360. package/src/nodes/accessors/ReflectVector.js +3 -3
  361. package/src/nodes/accessors/RendererReferenceNode.js +1 -2
  362. package/src/nodes/accessors/SceneProperties.js +47 -0
  363. package/src/nodes/accessors/Skinning.js +263 -0
  364. package/src/nodes/accessors/StorageBufferNode.js +16 -27
  365. package/src/nodes/accessors/StorageTexture3DNode.js +100 -0
  366. package/src/nodes/accessors/StorageTextureNode.js +74 -11
  367. package/src/nodes/accessors/Tangent.js +8 -18
  368. package/src/nodes/accessors/Texture3DNode.js +32 -35
  369. package/src/nodes/accessors/TextureNode.js +124 -25
  370. package/src/nodes/accessors/UniformArrayNode.js +6 -4
  371. package/src/nodes/accessors/UserDataNode.js +1 -2
  372. package/src/nodes/accessors/VertexColorNode.js +1 -2
  373. package/src/nodes/code/FunctionCallNode.js +1 -1
  374. package/src/nodes/code/FunctionNode.js +4 -19
  375. package/src/nodes/core/ArrayNode.js +21 -2
  376. package/src/nodes/core/AssignNode.js +3 -3
  377. package/src/nodes/core/AttributeNode.js +3 -3
  378. package/src/nodes/core/BypassNode.js +1 -1
  379. package/src/nodes/core/ContextNode.js +104 -5
  380. package/src/nodes/core/IndexNode.js +2 -1
  381. package/src/nodes/core/InputNode.js +1 -1
  382. package/src/nodes/core/InspectorNode.js +1 -1
  383. package/src/nodes/core/IsolateNode.js +1 -1
  384. package/src/nodes/core/MRTNode.js +55 -4
  385. package/src/nodes/core/Node.js +151 -17
  386. package/src/nodes/core/NodeBuilder.js +479 -101
  387. package/src/nodes/core/NodeError.js +28 -0
  388. package/src/nodes/core/NodeFrame.js +12 -4
  389. package/src/nodes/core/NodeUtils.js +20 -18
  390. package/src/nodes/core/OutputStructNode.js +13 -11
  391. package/src/nodes/core/OverrideContextNode.js +153 -0
  392. package/src/nodes/core/ParameterNode.js +4 -4
  393. package/src/nodes/core/PropertyNode.js +66 -4
  394. package/src/nodes/core/StackNode.js +91 -20
  395. package/src/nodes/core/StackTrace.js +139 -0
  396. package/src/nodes/core/StructNode.js +20 -8
  397. package/src/nodes/core/StructTypeNode.js +17 -23
  398. package/src/nodes/core/SubBuildNode.js +2 -2
  399. package/src/nodes/core/UniformGroupNode.js +36 -6
  400. package/src/nodes/core/UniformNode.js +21 -5
  401. package/src/nodes/core/VarNode.js +56 -23
  402. package/src/nodes/core/VaryingNode.js +14 -21
  403. package/src/nodes/display/BlendModes.js +1 -105
  404. package/src/nodes/display/BumpMapNode.js +6 -1
  405. package/src/nodes/display/ColorAdjustment.js +27 -9
  406. package/src/nodes/display/ColorSpaceNode.js +3 -3
  407. package/src/nodes/display/FrontFacingNode.js +38 -9
  408. package/src/nodes/display/NormalMapNode.js +41 -6
  409. package/src/nodes/display/PassNode.js +157 -56
  410. package/src/nodes/display/PremultiplyAlphaFunctions.js +39 -0
  411. package/src/nodes/display/RenderOutputNode.js +19 -10
  412. package/src/nodes/display/ScreenNode.js +4 -2
  413. package/src/nodes/display/ToneMappingNode.js +1 -1
  414. package/src/nodes/display/ToonOutlinePassNode.js +2 -2
  415. package/src/nodes/display/ViewportDepthNode.js +52 -4
  416. package/src/nodes/display/ViewportDepthTextureNode.js +11 -15
  417. package/src/nodes/display/ViewportTextureNode.js +39 -11
  418. package/src/nodes/fog/Fog.js +18 -35
  419. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +3 -3
  420. package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
  421. package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
  422. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +2 -2
  423. package/src/nodes/functions/PhysicalLightingModel.js +126 -45
  424. package/src/nodes/functions/VolumetricLightingModel.js +40 -7
  425. package/src/nodes/geometry/RangeNode.js +5 -3
  426. package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
  427. package/src/nodes/gpgpu/BarrierNode.js +9 -0
  428. package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -3
  429. package/src/nodes/gpgpu/ComputeNode.js +74 -48
  430. package/src/nodes/gpgpu/SubgroupFunctionNode.js +2 -2
  431. package/src/nodes/gpgpu/WorkgroupInfoNode.js +5 -5
  432. package/src/nodes/lighting/AnalyticLightNode.js +53 -0
  433. package/src/nodes/lighting/EnvironmentNode.js +30 -5
  434. package/src/nodes/lighting/IESSpotLightNode.js +40 -2
  435. package/src/nodes/lighting/LightingContextNode.js +10 -2
  436. package/src/nodes/lighting/LightsNode.js +97 -65
  437. package/src/nodes/lighting/PointShadowNode.js +166 -148
  438. package/src/nodes/lighting/ShadowFilterNode.js +74 -117
  439. package/src/nodes/lighting/ShadowNode.js +149 -51
  440. package/src/nodes/materialx/lib/mx_noise.js +2 -2
  441. package/src/nodes/math/BitcastNode.js +1 -1
  442. package/src/nodes/math/BitcountNode.js +433 -0
  443. package/src/nodes/math/ConditionalNode.js +6 -6
  444. package/src/nodes/math/MathNode.js +115 -52
  445. package/src/nodes/math/OperatorNode.js +24 -23
  446. package/src/nodes/math/PackFloatNode.js +98 -0
  447. package/src/nodes/math/UnpackFloatNode.js +96 -0
  448. package/src/nodes/parsers/GLSLNodeFunction.js +1 -1
  449. package/src/nodes/pmrem/PMREMNode.js +34 -3
  450. package/src/nodes/pmrem/PMREMUtils.js +9 -15
  451. package/src/nodes/tsl/TSLBase.js +1 -1
  452. package/src/nodes/tsl/TSLCore.js +99 -33
  453. package/src/nodes/utils/ArrayElementNode.js +14 -1
  454. package/src/nodes/utils/ConvertNode.js +1 -1
  455. package/src/nodes/utils/DebugNode.js +12 -12
  456. package/src/nodes/utils/EquirectUV.js +30 -5
  457. package/src/nodes/utils/EventNode.js +31 -2
  458. package/src/nodes/utils/FlipNode.js +1 -1
  459. package/src/nodes/utils/FunctionOverloadingNode.js +2 -2
  460. package/src/nodes/utils/JoinNode.js +3 -3
  461. package/src/nodes/utils/LoopNode.js +1 -1
  462. package/src/nodes/utils/MemberNode.js +2 -2
  463. package/src/nodes/utils/Packing.js +48 -5
  464. package/src/nodes/utils/PostProcessingUtils.js +33 -1
  465. package/src/nodes/utils/RTTNode.js +41 -25
  466. package/src/nodes/utils/ReflectorNode.js +4 -4
  467. package/src/nodes/utils/Remap.js +48 -0
  468. package/src/nodes/utils/RotateNode.js +1 -1
  469. package/src/nodes/utils/SampleNode.js +1 -1
  470. package/src/nodes/utils/SetNode.js +1 -1
  471. package/src/nodes/utils/SplitNode.js +1 -1
  472. package/src/nodes/utils/SpriteSheetUV.js +35 -0
  473. package/src/nodes/utils/StorageArrayElementNode.js +1 -1
  474. package/src/nodes/utils/UVUtils.js +28 -0
  475. package/src/objects/BatchedMesh.js +66 -30
  476. package/src/objects/InstancedMesh.js +19 -3
  477. package/src/objects/Line.js +1 -1
  478. package/src/objects/Mesh.js +1 -1
  479. package/src/objects/Points.js +1 -1
  480. package/src/objects/SkinnedMesh.js +26 -9
  481. package/src/renderers/WebGLRenderer.js +344 -156
  482. package/src/renderers/common/Animation.js +3 -3
  483. package/src/renderers/common/Attributes.js +15 -1
  484. package/src/renderers/common/Backend.js +78 -13
  485. package/src/renderers/common/Background.js +26 -13
  486. package/src/renderers/common/BindGroup.js +1 -16
  487. package/src/renderers/common/Binding.js +11 -0
  488. package/src/renderers/common/Bindings.js +141 -57
  489. package/src/renderers/common/BlendMode.js +143 -0
  490. package/src/renderers/common/Buffer.js +49 -0
  491. package/src/renderers/common/BundleGroup.js +1 -1
  492. package/src/renderers/common/ChainMap.js +30 -6
  493. package/src/renderers/common/ClippingContext.js +10 -2
  494. package/src/renderers/common/ComputePipeline.js +1 -1
  495. package/src/renderers/common/CubeRenderTarget.js +51 -7
  496. package/src/renderers/common/Geometries.js +29 -3
  497. package/src/renderers/common/Info.js +374 -4
  498. package/src/renderers/common/InspectorBase.js +6 -1
  499. package/src/renderers/common/Lighting.js +51 -19
  500. package/src/renderers/common/Pipelines.js +40 -7
  501. package/src/renderers/common/PostProcessing.js +8 -206
  502. package/src/renderers/common/ReadbackBuffer.js +78 -0
  503. package/src/renderers/common/RenderBundle.js +3 -1
  504. package/src/renderers/common/RenderBundles.js +7 -3
  505. package/src/renderers/common/RenderContext.js +16 -0
  506. package/src/renderers/common/RenderContexts.js +33 -49
  507. package/src/renderers/common/RenderList.js +41 -4
  508. package/src/renderers/common/RenderLists.js +2 -1
  509. package/src/renderers/common/RenderObject.js +88 -16
  510. package/src/renderers/common/RenderObjectPipeline.js +40 -0
  511. package/src/renderers/common/RenderObjects.js +21 -5
  512. package/src/renderers/common/RenderPipeline.js +232 -17
  513. package/src/renderers/common/Renderer.js +700 -163
  514. package/src/renderers/common/Sampler.js +16 -48
  515. package/src/renderers/common/StorageBuffer.js +13 -1
  516. package/src/renderers/common/Textures.js +121 -9
  517. package/src/renderers/common/TimestampQueryPool.js +6 -4
  518. package/src/renderers/common/Uniform.js +8 -0
  519. package/src/renderers/common/UniformsGroup.js +84 -1
  520. package/src/renderers/common/XRManager.js +377 -51
  521. package/src/renderers/common/extras/PMREMGenerator.js +40 -61
  522. package/src/renderers/common/nodes/NodeBuilderState.js +10 -2
  523. package/src/renderers/common/nodes/NodeLibrary.js +4 -4
  524. package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +298 -106
  525. package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
  526. package/src/renderers/common/nodes/NodeUniformBuffer.js +65 -0
  527. package/src/renderers/shaders/DFGLUTData.js +19 -34
  528. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
  529. package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
  530. package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
  531. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
  532. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
  533. package/src/renderers/shaders/ShaderChunk/common.glsl.js +13 -4
  534. package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +0 -6
  535. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +0 -1
  536. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +9 -13
  537. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +2 -2
  538. package/src/renderers/shaders/ShaderChunk/envmap_vertex.glsl.js +1 -1
  539. package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +80 -0
  540. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +13 -2
  541. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
  542. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
  543. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +3 -1
  544. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
  545. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +112 -53
  546. package/src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js +2 -2
  547. package/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js +7 -0
  548. package/src/renderers/shaders/ShaderChunk/normal_vertex.glsl.js +6 -0
  549. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
  550. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +0 -1
  551. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +225 -186
  552. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +12 -2
  553. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
  554. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +2 -2
  555. package/src/renderers/shaders/ShaderChunk.js +5 -3
  556. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +1 -2
  557. package/src/renderers/shaders/ShaderLib/depth.glsl.js +3 -0
  558. package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +2 -3
  559. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
  560. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
  561. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
  562. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
  563. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
  564. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
  565. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
  566. package/src/renderers/shaders/ShaderLib.js +7 -6
  567. package/src/renderers/shaders/UniformsLib.js +7 -5
  568. package/src/renderers/shaders/UniformsUtils.js +27 -5
  569. package/src/renderers/webgl/WebGLAnimation.js +2 -1
  570. package/src/renderers/webgl/WebGLBackground.js +15 -15
  571. package/src/renderers/webgl/WebGLBindingStates.js +99 -27
  572. package/src/renderers/webgl/WebGLBufferRenderer.js +0 -32
  573. package/src/renderers/webgl/WebGLCapabilities.js +9 -4
  574. package/src/renderers/webgl/WebGLEnvironments.js +228 -0
  575. package/src/renderers/webgl/WebGLGeometries.js +10 -7
  576. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +0 -32
  577. package/src/renderers/webgl/WebGLLights.js +18 -1
  578. package/src/renderers/webgl/WebGLMaterials.js +24 -13
  579. package/src/renderers/webgl/WebGLObjects.js +3 -1
  580. package/src/renderers/webgl/WebGLOutput.js +271 -0
  581. package/src/renderers/webgl/WebGLProgram.js +54 -113
  582. package/src/renderers/webgl/WebGLPrograms.js +74 -55
  583. package/src/renderers/webgl/WebGLRenderLists.js +24 -1
  584. package/src/renderers/webgl/WebGLRenderStates.js +13 -2
  585. package/src/renderers/webgl/WebGLShaderCache.js +5 -11
  586. package/src/renderers/webgl/WebGLShadowMap.js +188 -24
  587. package/src/renderers/webgl/WebGLState.js +75 -37
  588. package/src/renderers/webgl/WebGLTextures.js +230 -56
  589. package/src/renderers/webgl/WebGLUniforms.js +40 -3
  590. package/src/renderers/webgl/WebGLUniformsGroups.js +82 -35
  591. package/src/renderers/webgl/WebGLUtils.js +6 -2
  592. package/src/renderers/webgl-fallback/WebGLBackend.js +322 -92
  593. package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +0 -41
  594. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +295 -66
  595. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +53 -19
  596. package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +25 -0
  597. package/src/renderers/webgl-fallback/utils/WebGLState.js +223 -6
  598. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +118 -73
  599. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +10 -10
  600. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +9 -3
  601. package/src/renderers/webgpu/WebGPUBackend.js +733 -302
  602. package/src/renderers/webgpu/WebGPURenderer.js +2 -1
  603. package/src/renderers/webgpu/descriptors/GPUBindGroupDescriptor.js +48 -0
  604. package/src/renderers/webgpu/descriptors/GPUBufferDescriptor.js +57 -0
  605. package/src/renderers/webgpu/descriptors/GPUCommandEncoderDescriptor.js +30 -0
  606. package/src/renderers/webgpu/descriptors/GPUComputePassDescriptor.js +38 -0
  607. package/src/renderers/webgpu/descriptors/GPUComputePipelineDescriptor.js +48 -0
  608. package/src/renderers/webgpu/descriptors/GPUCopyExternalImageDestInfo.js +47 -0
  609. package/src/renderers/webgpu/descriptors/GPUCopyExternalImageSourceInfo.js +50 -0
  610. package/src/renderers/webgpu/descriptors/GPUExtent3D.js +51 -0
  611. package/src/renderers/webgpu/descriptors/GPUPipelineLayoutDescriptor.js +39 -0
  612. package/src/renderers/webgpu/descriptors/GPUQuerySetDescriptor.js +47 -0
  613. package/src/renderers/webgpu/descriptors/GPURenderBundleEncoderDescriptor.js +74 -0
  614. package/src/renderers/webgpu/descriptors/GPURenderPassColorAttachment.js +72 -0
  615. package/src/renderers/webgpu/descriptors/GPURenderPassDepthStencilAttachment.js +99 -0
  616. package/src/renderers/webgpu/descriptors/GPURenderPassDescriptor.js +72 -0
  617. package/src/renderers/webgpu/descriptors/GPURenderPassTimestampWrites.js +49 -0
  618. package/src/renderers/webgpu/descriptors/GPURenderPipelineDescriptor.js +130 -0
  619. package/src/renderers/webgpu/descriptors/GPUSamplerDescriptor.js +119 -0
  620. package/src/renderers/webgpu/descriptors/GPUShaderModuleDescriptor.js +46 -0
  621. package/src/renderers/webgpu/descriptors/GPUTexelCopyBufferInfo.js +57 -0
  622. package/src/renderers/webgpu/descriptors/GPUTexelCopyBufferLayout.js +48 -0
  623. package/src/renderers/webgpu/descriptors/GPUTexelCopyTextureInfo.js +61 -0
  624. package/src/renderers/webgpu/descriptors/GPUTextureDescriptor.js +99 -0
  625. package/src/renderers/webgpu/descriptors/GPUTextureViewDescriptor.js +108 -0
  626. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +0 -1
  627. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +526 -93
  628. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +1 -1
  629. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +194 -61
  630. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +395 -234
  631. package/src/renderers/webgpu/utils/WebGPUCapabilities.js +48 -0
  632. package/src/renderers/webgpu/utils/WebGPUConstants.js +10 -0
  633. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +224 -91
  634. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +228 -213
  635. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +428 -175
  636. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +40 -25
  637. package/src/renderers/webgpu/utils/WebGPUUtils.js +70 -13
  638. package/src/renderers/webxr/WebXRController.js +12 -0
  639. package/src/renderers/webxr/WebXRManager.js +4 -2
  640. package/src/textures/CubeDepthTexture.js +76 -0
  641. package/src/textures/DepthTexture.js +1 -1
  642. package/src/textures/ExternalTexture.js +0 -3
  643. package/src/textures/HTMLTexture.js +74 -0
  644. package/src/textures/Source.js +2 -2
  645. package/src/textures/Texture.js +16 -5
  646. package/src/utils.js +280 -3
  647. package/examples/fonts/LICENSE +0 -13
  648. package/examples/fonts/MPLUSRounded1c/MPLUSRounded1c-Regular.typeface.json.zip +0 -0
  649. package/examples/fonts/MPLUSRounded1c/OFL.txt +0 -91
  650. package/examples/fonts/README.md +0 -11
  651. package/examples/fonts/droid/NOTICE +0 -190
  652. package/examples/fonts/droid/README.txt +0 -18
  653. package/examples/fonts/droid/droid_sans_bold.typeface.json +0 -1
  654. package/examples/fonts/droid/droid_sans_mono_regular.typeface.json +0 -1
  655. package/examples/fonts/droid/droid_sans_regular.typeface.json +0 -1
  656. package/examples/fonts/droid/droid_serif_bold.typeface.json +0 -1
  657. package/examples/fonts/droid/droid_serif_regular.typeface.json +0 -1
  658. package/examples/fonts/gentilis_bold.typeface.json +0 -1
  659. package/examples/fonts/gentilis_regular.typeface.json +0 -1
  660. package/examples/fonts/helvetiker_bold.typeface.json +0 -1
  661. package/examples/fonts/helvetiker_regular.typeface.json +0 -1
  662. package/examples/fonts/optimer_bold.typeface.json +0 -1
  663. package/examples/fonts/optimer_regular.typeface.json +0 -1
  664. package/examples/fonts/ttf/README.md +0 -9
  665. package/examples/fonts/ttf/kenpixel.ttf +0 -0
  666. package/examples/jsm/libs/ammo.wasm.js +0 -822
  667. package/examples/jsm/libs/ammo.wasm.wasm +0 -0
  668. package/examples/jsm/libs/draco/draco_encoder.js +0 -33
  669. package/examples/jsm/libs/draco/gltf/draco_encoder.js +0 -33
  670. package/examples/jsm/libs/lottie_canvas.module.js +0 -14849
  671. package/examples/jsm/libs/opentype.module.js +0 -14506
  672. package/examples/jsm/libs/rhino3dm/rhino3dm.js +0 -21
  673. package/examples/jsm/libs/rhino3dm/rhino3dm.module.js +0 -16
  674. package/examples/jsm/libs/rhino3dm/rhino3dm.wasm +0 -0
  675. package/examples/jsm/lighting/TiledLighting.js +0 -42
  676. package/examples/jsm/materials/MeshGouraudMaterial.js +0 -434
  677. package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
  678. package/examples/jsm/shaders/GodRaysShader.js +0 -333
  679. package/examples/jsm/tsl/display/AnamorphicNode.js +0 -282
  680. package/examples/jsm/tsl/lighting/TiledLightsNode.js +0 -442
  681. package/src/nodes/accessors/BatchNode.js +0 -163
  682. package/src/nodes/accessors/InstanceNode.js +0 -244
  683. package/src/nodes/accessors/InstancedMeshNode.js +0 -50
  684. package/src/nodes/accessors/SceneNode.js +0 -145
  685. package/src/nodes/accessors/SkinningNode.js +0 -327
  686. package/src/nodes/code/ScriptableNode.js +0 -726
  687. package/src/nodes/code/ScriptableValueNode.js +0 -253
  688. package/src/nodes/display/PosterizeNode.js +0 -65
  689. package/src/nodes/functions/BSDF/DFGApprox.js +0 -71
  690. package/src/nodes/utils/RemapNode.js +0 -125
  691. package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
  692. package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
  693. package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
@@ -1,23 +1,22 @@
1
- import {
2
- BufferAttribute,
3
- BufferGeometry,
4
- ClampToEdgeWrapping,
5
- Group,
6
- NoColorSpace,
7
- Mesh,
8
- MeshPhysicalMaterial,
9
- MirroredRepeatWrapping,
10
- RepeatWrapping,
11
- SRGBColorSpace,
12
- TextureLoader,
13
- Object3D,
14
- Vector2
15
- } from 'three';
1
+ // Pre-compiled regex patterns for performance
2
+ const DEF_MATCH_REGEX = /^def\s+(?:(\w+)\s+)?"?([^"]+)"?$/;
3
+ const VARIANT_STRING_REGEX = /^string\s+(\w+)$/;
4
+ const ATTR_MATCH_REGEX = /^(?:uniform\s+)?(\w+(?:\[\])?)\s+(.+)$/;
5
+
6
+ // Spec types (must match USDCParser/USDComposer)
7
+ const SpecType = {
8
+ Attribute: 1,
9
+ Prim: 6,
10
+ Relationship: 8
11
+ };
16
12
 
17
13
  class USDAParser {
18
14
 
19
15
  parseText( text ) {
20
16
 
17
+ // Preprocess: strip comments and normalize multiline values
18
+ text = this._preprocess( text );
19
+
21
20
  const root = {};
22
21
 
23
22
  const lines = text.split( '\n' );
@@ -27,18 +26,22 @@ class USDAParser {
27
26
 
28
27
  const stack = [ root ];
29
28
 
30
- // Parse USDA file
31
-
32
29
  for ( const line of lines ) {
33
30
 
34
- // console.log( line );
35
-
36
31
  if ( line.includes( '=' ) ) {
37
32
 
38
- const assignment = line.split( '=' );
33
+ // Find the first '=' that's not inside quotes
34
+ const eqIdx = this._findAssignmentOperator( line );
39
35
 
40
- const lhs = assignment[ 0 ].trim();
41
- const rhs = assignment[ 1 ].trim();
36
+ if ( eqIdx === - 1 ) {
37
+
38
+ string = line.trim();
39
+ continue;
40
+
41
+ }
42
+
43
+ const lhs = line.slice( 0, eqIdx ).trim();
44
+ const rhs = line.slice( eqIdx + 1 ).trim();
42
45
 
43
46
  if ( rhs.endsWith( '{' ) ) {
44
47
 
@@ -66,8 +69,24 @@ class USDAParser {
66
69
 
67
70
  }
68
71
 
72
+ } else if ( line.includes( ':' ) && ! line.includes( '=' ) ) {
73
+
74
+ // Handle dictionary entries like "0: [(...)...]" for timeSamples
75
+ const colonIdx = line.indexOf( ':' );
76
+ const key = line.slice( 0, colonIdx ).trim();
77
+ const value = line.slice( colonIdx + 1 ).trim();
78
+
79
+ // Only process if key looks like a number (timeSamples frame)
80
+ if ( /^[\d.]+$/.test( key ) ) {
81
+
82
+ target[ key ] = value;
83
+
84
+ }
85
+
69
86
  } else if ( line.endsWith( '{' ) ) {
70
87
 
88
+ string = line.slice( 0, - 1 ).trim() || string;
89
+
71
90
  const group = target[ string ] || {};
72
91
  stack.push( group );
73
92
 
@@ -98,7 +117,7 @@ class USDAParser {
98
117
 
99
118
  target = stack[ stack.length - 1 ];
100
119
 
101
- } else {
120
+ } else if ( line.trim() ) {
102
121
 
103
122
  string = line.trim();
104
123
 
@@ -110,499 +129,604 @@ class USDAParser {
110
129
 
111
130
  }
112
131
 
113
- parse( text, assets ) {
114
-
115
- const root = this.parseText( text );
132
+ _preprocess( text ) {
116
133
 
117
- // Build scene graph
134
+ // Remove block comments /* ... */
135
+ text = this._stripBlockComments( text );
118
136
 
119
- function findMeshGeometry( data ) {
137
+ // Collapse triple-quoted strings into single lines
138
+ text = this._collapseTripleQuotedStrings( text );
120
139
 
121
- if ( ! data ) return undefined;
140
+ // Remove line comments # ... (but preserve #usda header)
141
+ // Only remove # comments that aren't at the start of a line or after whitespace
142
+ const lines = text.split( '\n' );
143
+ const processed = [];
122
144
 
123
- if ( 'prepend references' in data ) {
145
+ let inMultilineValue = false;
146
+ let bracketDepth = 0;
147
+ let parenDepth = 0;
148
+ let accumulated = '';
124
149
 
125
- const reference = data[ 'prepend references' ];
126
- const parts = reference.split( '@' );
127
- const path = parts[ 1 ].replace( /^.\//, '' );
128
- const id = parts[ 2 ].replace( /^<\//, '' ).replace( />$/, '' );
150
+ for ( let i = 0; i < lines.length; i ++ ) {
129
151
 
130
- return findGeometry( assets[ path ], id );
152
+ let line = lines[ i ];
131
153
 
132
- }
154
+ // Strip inline comments (but not inside strings)
155
+ line = this._stripInlineComment( line );
133
156
 
134
- return findGeometry( data );
157
+ // Track bracket/paren depth for multiline values
158
+ const trimmed = line.trim();
135
159
 
136
- }
160
+ if ( inMultilineValue ) {
137
161
 
138
- function findGeometry( data, id ) {
162
+ // Continue accumulating multiline value
163
+ accumulated += ' ' + trimmed;
139
164
 
140
- if ( ! data ) return undefined;
165
+ // Update depths
166
+ for ( const ch of trimmed ) {
141
167
 
142
- if ( id !== undefined ) {
168
+ if ( ch === '[' ) bracketDepth ++;
169
+ else if ( ch === ']' ) bracketDepth --;
170
+ else if ( ch === '(' && bracketDepth > 0 ) parenDepth ++;
171
+ else if ( ch === ')' && bracketDepth > 0 ) parenDepth --;
143
172
 
144
- const def = `def Mesh "${id}"`;
173
+ }
145
174
 
146
- if ( def in data ) {
175
+ // Check if multiline value is complete
176
+ if ( bracketDepth === 0 && parenDepth === 0 ) {
147
177
 
148
- return data[ def ];
178
+ processed.push( accumulated );
179
+ accumulated = '';
180
+ inMultilineValue = false;
149
181
 
150
182
  }
151
183
 
152
- }
184
+ } else {
153
185
 
154
- for ( const name in data ) {
186
+ // Check if this line starts a multiline array value
187
+ // Look for patterns like "attr = [" or "attr = @path@[" without closing ]
188
+ if ( trimmed.includes( '=' ) ) {
155
189
 
156
- const object = data[ name ];
190
+ const eqIdx = this._findAssignmentOperator( trimmed );
157
191
 
158
- if ( name.startsWith( 'def Mesh' ) ) {
192
+ if ( eqIdx !== - 1 ) {
159
193
 
160
- return object;
194
+ const rhs = trimmed.slice( eqIdx + 1 ).trim();
161
195
 
162
- }
196
+ // Count brackets in the value part
197
+ let openBrackets = 0;
198
+ let closeBrackets = 0;
199
+
200
+ for ( const ch of rhs ) {
201
+
202
+ if ( ch === '[' ) openBrackets ++;
203
+ else if ( ch === ']' ) closeBrackets ++;
204
+
205
+ }
163
206
 
207
+ if ( openBrackets > closeBrackets ) {
164
208
 
165
- if ( typeof object === 'object' ) {
209
+ // Multiline array detected
210
+ inMultilineValue = true;
211
+ bracketDepth = openBrackets - closeBrackets;
212
+ parenDepth = 0;
213
+ accumulated = trimmed;
214
+ continue;
166
215
 
167
- const geometry = findGeometry( object );
216
+ }
168
217
 
169
- if ( geometry ) return geometry;
218
+ }
170
219
 
171
220
  }
172
221
 
222
+ processed.push( trimmed );
223
+
173
224
  }
174
225
 
175
226
  }
176
227
 
177
- function buildGeometry( data ) {
178
-
179
- if ( ! data ) return undefined;
228
+ return processed.join( '\n' );
180
229
 
181
- const geometry = new BufferGeometry();
182
- let indices = null;
183
- let counts = null;
184
- let uvs = null;
230
+ }
185
231
 
186
- let positionsLength = - 1;
232
+ _stripBlockComments( text ) {
187
233
 
188
- // index
234
+ // Iteratively remove /* ... */ comments without regex backtracking
235
+ let result = '';
236
+ let i = 0;
189
237
 
190
- if ( 'int[] faceVertexIndices' in data ) {
238
+ while ( i < text.length ) {
191
239
 
192
- indices = JSON.parse( data[ 'int[] faceVertexIndices' ] );
240
+ // Check for block comment start
241
+ if ( text[ i ] === '/' && i + 1 < text.length && text[ i + 1 ] === '*' ) {
193
242
 
194
- }
243
+ // Find the closing */
244
+ let j = i + 2;
195
245
 
196
- // face count
246
+ while ( j < text.length ) {
197
247
 
198
- if ( 'int[] faceVertexCounts' in data ) {
248
+ if ( text[ j ] === '*' && j + 1 < text.length && text[ j + 1 ] === '/' ) {
199
249
 
200
- counts = JSON.parse( data[ 'int[] faceVertexCounts' ] );
201
- indices = toTriangleIndices( indices, counts );
250
+ // Found closing, skip past it
251
+ j += 2;
252
+ break;
202
253
 
203
- }
254
+ }
204
255
 
205
- // position
256
+ j ++;
206
257
 
207
- if ( 'point3f[] points' in data ) {
258
+ }
208
259
 
209
- const positions = JSON.parse( data[ 'point3f[] points' ].replace( /[()]*/g, '' ) );
210
- positionsLength = positions.length;
211
- let attribute = new BufferAttribute( new Float32Array( positions ), 3 );
260
+ // Move past the comment (or to end if unclosed)
261
+ i = j;
212
262
 
213
- if ( indices !== null ) attribute = toFlatBufferAttribute( attribute, indices );
263
+ } else {
214
264
 
215
- geometry.setAttribute( 'position', attribute );
265
+ result += text[ i ];
266
+ i ++;
216
267
 
217
268
  }
218
269
 
219
- // uv
270
+ }
220
271
 
221
- if ( 'float2[] primvars:st' in data ) {
272
+ return result;
222
273
 
223
- data[ 'texCoord2f[] primvars:st' ] = data[ 'float2[] primvars:st' ];
274
+ }
224
275
 
225
- }
276
+ _collapseTripleQuotedStrings( text ) {
226
277
 
227
- if ( 'texCoord2f[] primvars:st' in data ) {
278
+ let result = '';
279
+ let i = 0;
228
280
 
229
- uvs = JSON.parse( data[ 'texCoord2f[] primvars:st' ].replace( /[()]*/g, '' ) );
230
- let attribute = new BufferAttribute( new Float32Array( uvs ), 2 );
281
+ while ( i < text.length ) {
231
282
 
232
- if ( indices !== null ) attribute = toFlatBufferAttribute( attribute, indices );
283
+ if ( i + 2 < text.length ) {
233
284
 
234
- geometry.setAttribute( 'uv', attribute );
285
+ const triple = text.slice( i, i + 3 );
235
286
 
236
- }
287
+ if ( triple === '\'\'\'' || triple === '"""' ) {
237
288
 
238
- if ( 'int[] primvars:st:indices' in data && uvs !== null ) {
289
+ const quoteChar = triple;
290
+ result += quoteChar;
291
+ i += 3;
239
292
 
240
- // custom uv index, overwrite uvs with new data
293
+ while ( i < text.length ) {
241
294
 
242
- const attribute = new BufferAttribute( new Float32Array( uvs ), 2 );
243
- let indices = JSON.parse( data[ 'int[] primvars:st:indices' ] );
244
- indices = toTriangleIndices( indices, counts );
245
- geometry.setAttribute( 'uv', toFlatBufferAttribute( attribute, indices ) );
295
+ if ( i + 2 < text.length && text.slice( i, i + 3 ) === quoteChar ) {
246
296
 
247
- }
297
+ result += quoteChar;
298
+ i += 3;
299
+ break;
248
300
 
249
- // normal
301
+ } else {
250
302
 
251
- if ( 'normal3f[] normals' in data ) {
303
+ if ( text[ i ] === '\n' ) {
252
304
 
253
- const normals = JSON.parse( data[ 'normal3f[] normals' ].replace( /[()]*/g, '' ) );
254
- let attribute = new BufferAttribute( new Float32Array( normals ), 3 );
305
+ result += '\\n';
255
306
 
256
- // normals require a special treatment in USD
307
+ } else if ( text[ i ] !== '\r' ) {
257
308
 
258
- if ( normals.length === positionsLength ) {
309
+ result += text[ i ];
259
310
 
260
- // raw normal and position data have equal length (like produced by USDZExporter)
311
+ }
261
312
 
262
- if ( indices !== null ) attribute = toFlatBufferAttribute( attribute, indices );
313
+ i ++;
263
314
 
264
- } else {
315
+ }
265
316
 
266
- // unequal length, normals are independent of faceVertexIndices
317
+ }
267
318
 
268
- let indices = Array.from( Array( normals.length / 3 ).keys() ); // [ 0, 1, 2, 3 ... ]
269
- indices = toTriangleIndices( indices, counts );
270
- attribute = toFlatBufferAttribute( attribute, indices );
319
+ continue;
271
320
 
272
321
  }
273
322
 
274
- geometry.setAttribute( 'normal', attribute );
323
+ }
275
324
 
276
- } else {
325
+ result += text[ i ];
326
+ i ++;
277
327
 
278
- // compute flat vertex normals
328
+ }
279
329
 
280
- geometry.computeVertexNormals();
330
+ return result;
281
331
 
282
- }
332
+ }
283
333
 
284
- return geometry;
334
+ _stripInlineComment( line ) {
285
335
 
286
- }
336
+ // Don't strip if line starts with #usda
337
+ if ( line.trim().startsWith( '#usda' ) ) return line;
287
338
 
288
- function toTriangleIndices( rawIndices, counts ) {
339
+ // Find # that's not inside a string
340
+ let inString = false;
341
+ let stringChar = null;
342
+ let escaped = false;
289
343
 
290
- const indices = [];
344
+ for ( let i = 0; i < line.length; i ++ ) {
291
345
 
292
- for ( let i = 0; i < counts.length; i ++ ) {
346
+ const ch = line[ i ];
293
347
 
294
- const count = counts[ i ];
348
+ if ( escaped ) {
295
349
 
296
- const stride = i * count;
350
+ escaped = false;
351
+ continue;
352
+
353
+ }
297
354
 
298
- if ( count === 3 ) {
355
+ if ( ch === '\\' ) {
299
356
 
300
- const a = rawIndices[ stride + 0 ];
301
- const b = rawIndices[ stride + 1 ];
302
- const c = rawIndices[ stride + 2 ];
357
+ escaped = true;
358
+ continue;
303
359
 
304
- indices.push( a, b, c );
360
+ }
305
361
 
306
- } else if ( count === 4 ) {
362
+ if ( ! inString && ( ch === '"' || ch === '\'' ) ) {
307
363
 
308
- const a = rawIndices[ stride + 0 ];
309
- const b = rawIndices[ stride + 1 ];
310
- const c = rawIndices[ stride + 2 ];
311
- const d = rawIndices[ stride + 3 ];
364
+ inString = true;
365
+ stringChar = ch;
312
366
 
313
- indices.push( a, b, c );
314
- indices.push( a, c, d );
367
+ } else if ( inString && ch === stringChar ) {
315
368
 
316
- } else {
369
+ inString = false;
370
+ stringChar = null;
317
371
 
318
- console.warn( 'THREE.USDZLoader: Face vertex count of %s unsupported.', count );
372
+ } else if ( ! inString && ch === '#' ) {
319
373
 
320
- }
374
+ // Found comment start outside of string
375
+ return line.slice( 0, i ).trimEnd();
321
376
 
322
377
  }
323
378
 
324
- return indices;
325
-
326
379
  }
327
380
 
328
- function toFlatBufferAttribute( attribute, indices ) {
329
-
330
- const array = attribute.array;
331
- const itemSize = attribute.itemSize;
381
+ return line;
332
382
 
333
- const array2 = new array.constructor( indices.length * itemSize );
383
+ }
334
384
 
335
- let index = 0, index2 = 0;
385
+ _findAssignmentOperator( line ) {
336
386
 
337
- for ( let i = 0, l = indices.length; i < l; i ++ ) {
387
+ // Find the first '=' that's not inside quotes
388
+ let inString = false;
389
+ let stringChar = null;
390
+ let escaped = false;
338
391
 
339
- index = indices[ i ] * itemSize;
392
+ for ( let i = 0; i < line.length; i ++ ) {
340
393
 
341
- for ( let j = 0; j < itemSize; j ++ ) {
394
+ const ch = line[ i ];
342
395
 
343
- array2[ index2 ++ ] = array[ index ++ ];
396
+ if ( escaped ) {
344
397
 
345
- }
398
+ escaped = false;
399
+ continue;
346
400
 
347
401
  }
348
402
 
349
- return new BufferAttribute( array2, itemSize );
350
-
351
- }
403
+ if ( ch === '\\' ) {
352
404
 
353
- function findMeshMaterial( data ) {
405
+ escaped = true;
406
+ continue;
354
407
 
355
- if ( ! data ) return undefined;
408
+ }
356
409
 
357
- if ( 'rel material:binding' in data ) {
410
+ if ( ! inString && ( ch === '"' || ch === '\'' ) ) {
358
411
 
359
- const reference = data[ 'rel material:binding' ];
360
- const id = reference.replace( /^<\//, '' ).replace( />$/, '' );
361
- const parts = id.split( '/' );
412
+ inString = true;
413
+ stringChar = ch;
362
414
 
363
- return findMaterial( root, ` "${ parts[ 1 ] }"` );
415
+ } else if ( inString && ch === stringChar ) {
364
416
 
365
- }
417
+ inString = false;
418
+ stringChar = null;
366
419
 
367
- return findMaterial( data );
420
+ } else if ( ! inString && ch === '=' ) {
368
421
 
369
- }
422
+ return i;
370
423
 
371
- function findMaterial( data, id = '' ) {
424
+ }
372
425
 
373
- for ( const name in data ) {
426
+ }
374
427
 
375
- const object = data[ name ];
428
+ return - 1;
376
429
 
377
- if ( name.startsWith( 'def Material' + id ) ) {
430
+ }
378
431
 
379
- return object;
432
+ /**
433
+ * Parse USDA text and return raw spec data in specsByPath format.
434
+ * Used by USDComposer for unified scene composition.
435
+ */
436
+ parseData( text ) {
380
437
 
381
- }
438
+ const root = this.parseText( text );
439
+ const specsByPath = {};
382
440
 
383
- if ( typeof object === 'object' ) {
441
+ // Parse root metadata
442
+ const rootFields = {};
443
+ if ( '#usda 1.0' in root ) {
384
444
 
385
- const material = findMaterial( object, id );
445
+ const header = root[ '#usda 1.0' ];
386
446
 
387
- if ( material ) return material;
447
+ if ( header.upAxis ) {
388
448
 
389
- }
449
+ rootFields.upAxis = header.upAxis.replace( /"/g, '' );
390
450
 
391
451
  }
392
452
 
393
- }
453
+ if ( header.defaultPrim ) {
394
454
 
395
- function setTextureParams( map, data_value ) {
455
+ rootFields.defaultPrim = header.defaultPrim.replace( /"/g, '' );
396
456
 
397
- // rotation, scale and translation
457
+ }
398
458
 
399
- if ( data_value[ 'float inputs:rotation' ] ) {
459
+ if ( header.metersPerUnit !== undefined ) {
400
460
 
401
- map.rotation = parseFloat( data_value[ 'float inputs:rotation' ] );
461
+ rootFields.metersPerUnit = parseFloat( header.metersPerUnit );
402
462
 
403
463
  }
404
464
 
405
- if ( data_value[ 'float2 inputs:scale' ] ) {
465
+ if ( header.framesPerSecond !== undefined ) {
406
466
 
407
- map.repeat = new Vector2().fromArray( JSON.parse( '[' + data_value[ 'float2 inputs:scale' ].replace( /[()]*/g, '' ) + ']' ) );
467
+ rootFields.framesPerSecond = parseFloat( header.framesPerSecond );
408
468
 
409
469
  }
410
470
 
411
- if ( data_value[ 'float2 inputs:translation' ] ) {
471
+ if ( header.timeCodesPerSecond !== undefined ) {
412
472
 
413
- map.offset = new Vector2().fromArray( JSON.parse( '[' + data_value[ 'float2 inputs:translation' ].replace( /[()]*/g, '' ) + ']' ) );
473
+ rootFields.timeCodesPerSecond = parseFloat( header.timeCodesPerSecond );
414
474
 
415
475
  }
416
476
 
417
477
  }
418
478
 
419
- function buildMaterial( data ) {
479
+ specsByPath[ '/' ] = { specType: SpecType.Prim, fields: rootFields };
420
480
 
421
- const material = new MeshPhysicalMaterial();
481
+ // Walk the tree and build specsByPath
482
+ const walkTree = ( data, parentPath ) => {
422
483
 
423
- if ( data !== undefined ) {
484
+ const primChildren = [];
424
485
 
425
- let surface = undefined;
486
+ for ( const key in data ) {
426
487
 
427
- const surfaceConnection = data[ 'token outputs:surface.connect' ];
488
+ // Skip metadata
489
+ if ( key === '#usda 1.0' ) continue;
490
+ if ( key === 'variants' ) continue;
428
491
 
429
- if ( surfaceConnection ) {
492
+ // Check for primitive definitions
493
+ // Matches both 'def TypeName "name"' and 'def "name"' (no type)
494
+ const defMatch = key.match( DEF_MATCH_REGEX );
495
+ if ( defMatch ) {
430
496
 
431
- const match = /(\w+)\.output/.exec( surfaceConnection );
497
+ const typeName = defMatch[ 1 ] || '';
498
+ const name = defMatch[ 2 ];
499
+ const path = parentPath === '/' ? '/' + name : parentPath + '/' + name;
432
500
 
433
- if ( match ) {
501
+ primChildren.push( name );
434
502
 
435
- const surfaceName = match[ 1 ];
436
- surface = data[ `def Shader "${surfaceName}"` ];
503
+ const primFields = { typeName };
504
+ const primData = data[ key ];
437
505
 
438
- }
506
+ // Extract attributes and relationships from this prim
507
+ this._extractPrimData( primData, path, primFields, specsByPath, SpecType );
508
+
509
+ specsByPath[ path ] = { specType: SpecType.Prim, fields: primFields };
510
+
511
+ // Recurse into children
512
+ walkTree( primData, path );
439
513
 
440
514
  }
441
515
 
442
- if ( surface !== undefined ) {
516
+ }
443
517
 
444
- if ( 'color3f inputs:diffuseColor.connect' in surface ) {
518
+ // Add primChildren to parent spec
519
+ if ( primChildren.length > 0 && specsByPath[ parentPath ] ) {
445
520
 
446
- const path = surface[ 'color3f inputs:diffuseColor.connect' ];
447
- const sampler = findTexture( root, /(\w+).output/.exec( path )[ 1 ] );
521
+ specsByPath[ parentPath ].fields.primChildren = primChildren;
448
522
 
449
- material.map = buildTexture( sampler );
450
- material.map.colorSpace = SRGBColorSpace;
523
+ }
451
524
 
452
- if ( 'def Shader "Transform2d_diffuse"' in data ) {
525
+ };
453
526
 
454
- setTextureParams( material.map, data[ 'def Shader "Transform2d_diffuse"' ] );
527
+ walkTree( root, '/' );
455
528
 
456
- }
529
+ // Fallback: infer elementSize for primvars:skel:jointIndices/jointWeights
530
+ // when not explicitly declared in the USDA text
531
+ this._inferSkelElementSize( specsByPath );
457
532
 
458
- } else if ( 'color3f inputs:diffuseColor' in surface ) {
533
+ return { specsByPath };
459
534
 
460
- const color = surface[ 'color3f inputs:diffuseColor' ].replace( /[()]*/g, '' );
461
- material.color.fromArray( JSON.parse( '[' + color + ']' ) );
535
+ }
462
536
 
463
- }
537
+ _inferSkelElementSize( specsByPath ) {
464
538
 
465
- if ( 'color3f inputs:emissiveColor.connect' in surface ) {
539
+ // For each mesh prim with primvars:skel:jointIndices/jointWeights but no
540
+ // elementSize, infer it from the data: elementSize = array.length / numVertices.
541
+ for ( const path in specsByPath ) {
466
542
 
467
- const path = surface[ 'color3f inputs:emissiveColor.connect' ];
468
- const sampler = findTexture( root, /(\w+).output/.exec( path )[ 1 ] );
543
+ const spec = specsByPath[ path ];
544
+ if ( spec.specType !== SpecType.Prim || spec.fields.typeName !== 'Mesh' ) continue;
469
545
 
470
- material.emissiveMap = buildTexture( sampler );
471
- material.emissiveMap.colorSpace = SRGBColorSpace;
472
- material.emissive.set( 0xffffff );
546
+ const pointsSpec = specsByPath[ path + '.points' ];
547
+ if ( ! pointsSpec || ! pointsSpec.fields.default ) continue;
473
548
 
474
- if ( 'def Shader "Transform2d_emissive"' in data ) {
549
+ const numVertices = pointsSpec.fields.default.length / 3;
550
+ if ( numVertices === 0 ) continue;
475
551
 
476
- setTextureParams( material.emissiveMap, data[ 'def Shader "Transform2d_emissive"' ] );
552
+ this._inferElementSize( specsByPath[ path + '.primvars:skel:jointIndices' ], numVertices );
553
+ this._inferElementSize( specsByPath[ path + '.primvars:skel:jointWeights' ], numVertices );
477
554
 
478
- }
555
+ }
479
556
 
480
- } else if ( 'color3f inputs:emissiveColor' in surface ) {
557
+ }
481
558
 
482
- const color = surface[ 'color3f inputs:emissiveColor' ].replace( /[()]*/g, '' );
483
- material.emissive.fromArray( JSON.parse( '[' + color + ']' ) );
559
+ _inferElementSize( attrSpec, numVertices ) {
484
560
 
485
- }
561
+ if ( ! attrSpec || attrSpec.fields.elementSize !== undefined || ! attrSpec.fields.default ) return;
486
562
 
487
- if ( 'normal3f inputs:normal.connect' in surface ) {
563
+ const len = attrSpec.fields.default.length;
564
+ if ( len > 0 && len % numVertices === 0 ) attrSpec.fields.elementSize = len / numVertices;
488
565
 
489
- const path = surface[ 'normal3f inputs:normal.connect' ];
490
- const sampler = findTexture( root, /(\w+).output/.exec( path )[ 1 ] );
566
+ }
491
567
 
492
- material.normalMap = buildTexture( sampler );
493
- material.normalMap.colorSpace = NoColorSpace;
568
+ _extractPrimData( data, path, primFields, specsByPath, SpecType ) {
494
569
 
495
- if ( 'def Shader "Transform2d_normal"' in data ) {
570
+ if ( ! data || typeof data !== 'object' ) return;
496
571
 
497
- setTextureParams( material.normalMap, data[ 'def Shader "Transform2d_normal"' ] );
572
+ for ( const key in data ) {
498
573
 
499
- }
574
+ // Skip nested defs (handled by walkTree)
575
+ if ( key.startsWith( 'def ' ) ) continue;
500
576
 
501
- }
577
+ if ( key === 'prepend references' ) {
502
578
 
503
- if ( 'float inputs:roughness.connect' in surface ) {
579
+ primFields.references = [ data[ key ] ];
580
+ continue;
504
581
 
505
- const path = surface[ 'float inputs:roughness.connect' ];
506
- const sampler = findTexture( root, /(\w+).output/.exec( path )[ 1 ] );
582
+ }
507
583
 
508
- material.roughness = 1.0;
509
- material.roughnessMap = buildTexture( sampler );
510
- material.roughnessMap.colorSpace = NoColorSpace;
584
+ if ( key === 'payload' ) {
511
585
 
512
- if ( 'def Shader "Transform2d_roughness"' in data ) {
586
+ primFields.payload = data[ key ];
587
+ continue;
513
588
 
514
- setTextureParams( material.roughnessMap, data[ 'def Shader "Transform2d_roughness"' ] );
589
+ }
515
590
 
516
- }
591
+ if ( key === 'variants' ) {
517
592
 
518
- } else if ( 'float inputs:roughness' in surface ) {
593
+ const variantSelection = {};
594
+ const variants = data[ key ];
519
595
 
520
- material.roughness = parseFloat( surface[ 'float inputs:roughness' ] );
596
+ for ( const vKey in variants ) {
597
+
598
+ const match = vKey.match( VARIANT_STRING_REGEX );
599
+ if ( match ) {
600
+
601
+ const variantSetName = match[ 1 ];
602
+ const variantValue = variants[ vKey ].replace( /"/g, '' );
603
+ variantSelection[ variantSetName ] = variantValue;
521
604
 
522
605
  }
523
606
 
524
- if ( 'float inputs:metallic.connect' in surface ) {
607
+ }
525
608
 
526
- const path = surface[ 'float inputs:metallic.connect' ];
527
- const sampler = findTexture( root, /(\w+).output/.exec( path )[ 1 ] );
609
+ if ( Object.keys( variantSelection ).length > 0 ) {
528
610
 
529
- material.metalness = 1.0;
530
- material.metalnessMap = buildTexture( sampler );
531
- material.metalnessMap.colorSpace = NoColorSpace;
611
+ primFields.variantSelection = variantSelection;
532
612
 
533
- if ( 'def Shader "Transform2d_metallic"' in data ) {
613
+ }
534
614
 
535
- setTextureParams( material.metalnessMap, data[ 'def Shader "Transform2d_metallic"' ] );
615
+ continue;
536
616
 
537
- }
617
+ }
538
618
 
539
- } else if ( 'float inputs:metallic' in surface ) {
619
+ if ( key.startsWith( 'rel ' ) ) {
540
620
 
541
- material.metalness = parseFloat( surface[ 'float inputs:metallic' ] );
621
+ const relName = key.slice( 4 );
622
+ const relPath = path + '.' + relName;
623
+ const target = data[ key ].replace( /[<>]/g, '' );
624
+ specsByPath[ relPath ] = {
625
+ specType: SpecType.Relationship,
626
+ fields: { targetPaths: [ target ] }
627
+ };
628
+ continue;
542
629
 
543
- }
630
+ }
544
631
 
545
- if ( 'float inputs:clearcoat.connect' in surface ) {
632
+ // Handle xformOpOrder
633
+ if ( key.includes( 'xformOpOrder' ) ) {
546
634
 
547
- const path = surface[ 'float inputs:clearcoat.connect' ];
548
- const sampler = findTexture( root, /(\w+).output/.exec( path )[ 1 ] );
635
+ const ops = data[ key ]
636
+ .replace( /[\[\]]/g, '' )
637
+ .split( ',' )
638
+ .map( s => s.trim().replace( /"/g, '' ) );
639
+ primFields.xformOpOrder = ops;
640
+ continue;
549
641
 
550
- material.clearcoat = 1.0;
551
- material.clearcoatMap = buildTexture( sampler );
552
- material.clearcoatMap.colorSpace = NoColorSpace;
642
+ }
553
643
 
554
- if ( 'def Shader "Transform2d_clearcoat"' in data ) {
644
+ // Handle typed attributes
645
+ // Format: [qualifier] type attrName (e.g., "uniform token[] joints", "float3 position")
646
+ const attrMatch = key.match( ATTR_MATCH_REGEX );
647
+ if ( attrMatch ) {
555
648
 
556
- setTextureParams( material.clearcoatMap, data[ 'def Shader "Transform2d_clearcoat"' ] );
649
+ const valueType = attrMatch[ 1 ];
650
+ const attrName = attrMatch[ 2 ];
651
+ const rawValue = data[ key ];
557
652
 
558
- }
653
+ // Handle connection attributes (e.g., "inputs:normal.connect = </path>")
654
+ if ( attrName.endsWith( '.connect' ) ) {
655
+
656
+ const baseAttrName = attrName.slice( 0, - 8 ); // Remove '.connect'
657
+ const attrPath = path + '.' + baseAttrName;
559
658
 
560
- } else if ( 'float inputs:clearcoat' in surface ) {
659
+ // Parse connection path - extract from <path> format
660
+ let connPath = String( rawValue ).trim();
661
+ if ( connPath.startsWith( '<' ) ) connPath = connPath.slice( 1 );
662
+ if ( connPath.endsWith( '>' ) ) connPath = connPath.slice( 0, - 1 );
561
663
 
562
- material.clearcoat = parseFloat( surface[ 'float inputs:clearcoat' ] );
664
+ // Get or create the attribute spec
665
+ if ( ! specsByPath[ attrPath ] ) {
666
+
667
+ specsByPath[ attrPath ] = {
668
+ specType: SpecType.Attribute,
669
+ fields: { typeName: valueType }
670
+ };
563
671
 
564
672
  }
565
673
 
566
- if ( 'float inputs:clearcoatRoughness.connect' in surface ) {
674
+ specsByPath[ attrPath ].fields.connectionPaths = [ connPath ];
675
+ continue;
567
676
 
568
- const path = surface[ 'float inputs:clearcoatRoughness.connect' ];
569
- const sampler = findTexture( root, /(\w+).output/.exec( path )[ 1 ] );
677
+ }
570
678
 
571
- material.clearcoatRoughness = 1.0;
572
- material.clearcoatRoughnessMap = buildTexture( sampler );
573
- material.clearcoatRoughnessMap.colorSpace = NoColorSpace;
679
+ // Handle timeSamples attributes specially
680
+ if ( attrName.endsWith( '.timeSamples' ) && typeof rawValue === 'object' ) {
574
681
 
575
- if ( 'def Shader "Transform2d_clearcoatRoughness"' in data ) {
682
+ const baseAttrName = attrName.slice( 0, - 12 ); // Remove '.timeSamples'
683
+ const attrPath = path + '.' + baseAttrName;
576
684
 
577
- setTextureParams( material.clearcoatRoughnessMap, data[ 'def Shader "Transform2d_clearcoatRoughness"' ] );
685
+ // Parse timeSamples dictionary into times and values arrays
686
+ const times = [];
687
+ const values = [];
578
688
 
579
- }
689
+ for ( const frameKey in rawValue ) {
580
690
 
581
- } else if ( 'float inputs:clearcoatRoughness' in surface ) {
691
+ const frame = parseFloat( frameKey );
692
+ if ( isNaN( frame ) ) continue;
582
693
 
583
- material.clearcoatRoughness = parseFloat( surface[ 'float inputs:clearcoatRoughness' ] );
694
+ times.push( frame );
695
+ values.push( this._parseAttributeValue( valueType, rawValue[ frameKey ] ) );
584
696
 
585
697
  }
586
698
 
587
- if ( 'float inputs:ior' in surface ) {
699
+ // Sort by time
700
+ const sorted = times.map( ( t, i ) => ( { t, v: values[ i ] } ) ).sort( ( a, b ) => a.t - b.t );
588
701
 
589
- material.ior = parseFloat( surface[ 'float inputs:ior' ] );
702
+ specsByPath[ attrPath ] = {
703
+ specType: SpecType.Attribute,
704
+ fields: {
705
+ timeSamples: { times: sorted.map( s => s.t ), values: sorted.map( s => s.v ) },
706
+ typeName: valueType
707
+ }
708
+ };
590
709
 
591
- }
710
+ } else {
592
711
 
593
- if ( 'float inputs:occlusion.connect' in surface ) {
712
+ // Parse value based on type
713
+ const parsedValue = this._parseAttributeValue( valueType, rawValue );
594
714
 
595
- const path = surface[ 'float inputs:occlusion.connect' ];
596
- const sampler = findTexture( root, /(\w+).output/.exec( path )[ 1 ] );
715
+ // Store as attribute spec, preserving any existing fields
716
+ // (e.g. connectionPaths set by an earlier `.connect` form)
717
+ const attrPath = path + '.' + attrName;
597
718
 
598
- material.aoMap = buildTexture( sampler );
599
- material.aoMap.colorSpace = NoColorSpace;
719
+ if ( specsByPath[ attrPath ] ) {
600
720
 
601
- if ( 'def Shader "Transform2d_occlusion"' in data ) {
721
+ specsByPath[ attrPath ].fields.default = parsedValue;
722
+ specsByPath[ attrPath ].fields.typeName = valueType;
602
723
 
603
- setTextureParams( material.aoMap, data[ 'def Shader "Transform2d_occlusion"' ] );
724
+ } else {
604
725
 
605
- }
726
+ specsByPath[ attrPath ] = {
727
+ specType: SpecType.Attribute,
728
+ fields: { default: parsedValue, typeName: valueType }
729
+ };
606
730
 
607
731
  }
608
732
 
@@ -610,129 +734,165 @@ class USDAParser {
610
734
 
611
735
  }
612
736
 
613
- return material;
614
-
615
737
  }
616
738
 
617
- function findTexture( data, id ) {
618
-
619
- for ( const name in data ) {
739
+ }
620
740
 
621
- const object = data[ name ];
741
+ _parseAttributeValue( valueType, rawValue ) {
622
742
 
623
- if ( name.startsWith( `def Shader "${ id }"` ) ) {
743
+ if ( rawValue === undefined || rawValue === null ) return undefined;
624
744
 
625
- return object;
745
+ const str = String( rawValue ).trim();
626
746
 
627
- }
747
+ // Array types
748
+ if ( valueType.endsWith( '[]' ) ) {
628
749
 
629
- if ( typeof object === 'object' ) {
750
+ let result;
630
751
 
631
- const texture = findTexture( object, id );
752
+ // Parse JSON-like arrays
753
+ try {
632
754
 
633
- if ( texture ) return texture;
755
+ // Handle arrays with parentheses like [(1,2,3), (4,5,6)]
756
+ // Remove trailing comma (valid in USDA but not JSON)
757
+ let cleaned = str.replace( /\(/g, '[' ).replace( /\)/g, ']' );
758
+ if ( cleaned.endsWith( ',' ) ) cleaned = cleaned.slice( 0, - 1 );
759
+ const parsed = JSON.parse( cleaned );
634
760
 
635
- }
761
+ // Flatten nested arrays for types like point3f[]
762
+ result = Array.isArray( parsed ) && Array.isArray( parsed[ 0 ] ) ? parsed.flat() : parsed;
636
763
 
637
- }
764
+ } catch ( e ) {
638
765
 
639
- }
766
+ // Try simple array parsing
767
+ const cleaned = str.replace( /[\[\]]/g, '' );
768
+ result = cleaned.split( ',' ).map( s => {
640
769
 
641
- function buildTexture( data ) {
770
+ const trimmed = s.trim();
771
+ const num = parseFloat( trimmed );
772
+ return isNaN( num ) ? trimmed.replace( /"/g, '' ) : num;
642
773
 
643
- if ( 'asset inputs:file' in data ) {
774
+ } );
644
775
 
645
- const path = data[ 'asset inputs:file' ].replace( /@*/g, '' ).trim();
776
+ }
646
777
 
647
- const loader = new TextureLoader();
778
+ //reorder (w, x, y, z) to (x, y, z, w)
779
+ if ( valueType.startsWith( 'quat' ) ) {
648
780
 
649
- const texture = loader.load( assets[ path ] );
781
+ for ( let i = 0; i < result.length; i += 4 ) {
650
782
 
651
- const map = {
652
- '"clamp"': ClampToEdgeWrapping,
653
- '"mirror"': MirroredRepeatWrapping,
654
- '"repeat"': RepeatWrapping
655
- };
783
+ const w = result[ i ];
784
+ result[ i ] = result[ i + 1 ];
785
+ result[ i + 1 ] = result[ i + 2 ];
786
+ result[ i + 2 ] = result[ i + 3 ];
787
+ result[ i + 3 ] = w;
656
788
 
657
- if ( 'token inputs:wrapS' in data ) {
789
+ }
658
790
 
659
- texture.wrapS = map[ data[ 'token inputs:wrapS' ] ];
791
+ }
660
792
 
661
- }
793
+ return result;
662
794
 
663
- if ( 'token inputs:wrapT' in data ) {
795
+ }
664
796
 
665
- texture.wrapT = map[ data[ 'token inputs:wrapT' ] ];
797
+ // Vector types (double3, float3, point3f, etc.)
798
+ if ( valueType.includes( '3' ) || valueType.includes( '2' ) || valueType.includes( '4' ) ) {
666
799
 
667
- }
800
+ // Parse (x, y, z) format
801
+ const cleaned = str.replace( /[()]/g, '' );
802
+ const values = cleaned.split( ',' ).map( s => parseFloat( s.trim() ) );
803
+ return values;
668
804
 
669
- return texture;
805
+ }
670
806
 
671
- }
807
+ // Quaternion types (quatf, quatd, quath)
808
+ // Text format is (w, x, y, z), convert to (x, y, z, w)
809
+ if ( valueType.startsWith( 'quat' ) ) {
672
810
 
673
- return null;
811
+ const cleaned = str.replace( /[()]/g, '' );
812
+ const values = cleaned.split( ',' ).map( s => parseFloat( s.trim() ) );
813
+ return [ values[ 1 ], values[ 2 ], values[ 3 ], values[ 0 ] ];
674
814
 
675
815
  }
676
816
 
677
- function buildObject( data ) {
817
+ // Matrix types
818
+ if ( valueType.includes( 'matrix' ) ) {
678
819
 
679
- const geometry = buildGeometry( findMeshGeometry( data ) );
680
- const material = buildMaterial( findMeshMaterial( data ) );
820
+ const cleaned = str.replace( /[()]/g, '' );
821
+ const values = cleaned.split( ',' ).map( s => parseFloat( s.trim() ) );
822
+ return values;
681
823
 
682
- const mesh = geometry ? new Mesh( geometry, material ) : new Object3D();
824
+ }
683
825
 
684
- if ( 'matrix4d xformOp:transform' in data ) {
826
+ // Scalar numeric types
827
+ if ( valueType === 'float' || valueType === 'double' || valueType === 'int' ) {
685
828
 
686
- const array = JSON.parse( '[' + data[ 'matrix4d xformOp:transform' ].replace( /[()]*/g, '' ) + ']' );
829
+ return parseFloat( str );
687
830
 
688
- mesh.matrix.fromArray( array );
689
- mesh.matrix.decompose( mesh.position, mesh.quaternion, mesh.scale );
831
+ }
690
832
 
691
- }
833
+ // String/token types
834
+ if ( valueType === 'string' || valueType === 'token' ) {
692
835
 
693
- return mesh;
836
+ return this._parseString( str );
694
837
 
695
838
  }
696
839
 
697
- function buildHierarchy( data, group ) {
840
+ // Asset path
841
+ if ( valueType === 'asset' ) {
698
842
 
699
- for ( const name in data ) {
843
+ return str.replace( /@/g, '' ).replace( /"/g, '' );
700
844
 
701
- if ( name.startsWith( 'def Scope' ) ) {
845
+ }
702
846
 
703
- buildHierarchy( data[ name ], group );
847
+ // Default: return as string with quotes removed
848
+ return this._parseString( str );
704
849
 
705
- } else if ( name.startsWith( 'def Xform' ) ) {
850
+ }
706
851
 
707
- const mesh = buildObject( data[ name ] );
852
+ _parseString( str ) {
708
853
 
709
- if ( /def Xform "(\w+)"/.test( name ) ) {
854
+ // Remove surrounding quotes
855
+ if ( ( str.startsWith( '"' ) && str.endsWith( '"' ) ) ||
856
+ ( str.startsWith( '\'' ) && str.endsWith( '\'' ) ) ) {
710
857
 
711
- mesh.name = /def Xform "(\w+)"/.exec( name )[ 1 ];
858
+ str = str.slice( 1, - 1 );
712
859
 
713
- }
860
+ }
714
861
 
715
- group.add( mesh );
862
+ // Handle escape sequences
863
+ let result = '';
864
+ let i = 0;
716
865
 
717
- buildHierarchy( data[ name ], mesh );
866
+ while ( i < str.length ) {
718
867
 
719
- }
868
+ if ( str[ i ] === '\\' && i + 1 < str.length ) {
720
869
 
721
- }
870
+ const next = str[ i + 1 ];
722
871
 
723
- }
872
+ switch ( next ) {
724
873
 
725
- function buildGroup( data ) {
874
+ case 'n': result += '\n'; break;
875
+ case 't': result += '\t'; break;
876
+ case 'r': result += '\r'; break;
877
+ case '\\': result += '\\'; break;
878
+ case '"': result += '"'; break;
879
+ case '\'': result += '\''; break;
880
+ default: result += next; break;
726
881
 
727
- const group = new Group();
882
+ }
728
883
 
729
- buildHierarchy( data, group );
884
+ i += 2;
730
885
 
731
- return group;
886
+ } else {
887
+
888
+ result += str[ i ];
889
+ i ++;
890
+
891
+ }
732
892
 
733
893
  }
734
894
 
735
- return buildGroup( root );
895
+ return result;
736
896
 
737
897
  }
738
898