@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
@@ -1852,12 +1852,12 @@ class GLTFWriter {
1852
1852
  ! ( array instanceof Uint8Array ) ) {
1853
1853
 
1854
1854
  console.warn( 'GLTFExporter: Attribute "skinIndex" converted to type UNSIGNED_SHORT.' );
1855
- modifiedAttribute = new BufferAttribute( new Uint16Array( array ), attribute.itemSize, attribute.normalized );
1855
+ modifiedAttribute = GLTFExporter.Utils.toTypedBufferAttribute( attribute, Uint16Array );
1856
1856
 
1857
1857
  } else if ( ( array instanceof Uint32Array || array instanceof Int32Array ) && ! attributeName.startsWith( '_' ) ) {
1858
1858
 
1859
1859
  console.warn( `GLTFExporter: Attribute "${ attributeName }" converted to type FLOAT.` );
1860
- modifiedAttribute = GLTFExporter.Utils.toFloat32BufferAttribute( attribute );
1860
+ modifiedAttribute = GLTFExporter.Utils.toTypedBufferAttribute( attribute, Float32Array );
1861
1861
 
1862
1862
  }
1863
1863
 
@@ -2355,6 +2355,13 @@ class GLTFWriter {
2355
2355
 
2356
2356
  if ( ! json.nodes ) json.nodes = [];
2357
2357
 
2358
+ // Handle pivot by creating a container node
2359
+ if ( object.pivot !== null ) {
2360
+
2361
+ return await this._processNodeWithPivotAsync( object );
2362
+
2363
+ }
2364
+
2358
2365
  const nodeDef = {};
2359
2366
 
2360
2367
  if ( options.trs ) {
@@ -2451,6 +2458,126 @@ class GLTFWriter {
2451
2458
 
2452
2459
  }
2453
2460
 
2461
+ /**
2462
+ * Process Object3D node with pivot using container approach
2463
+ * @param {THREE.Object3D} object Object3D with pivot
2464
+ * @return {Promise<number>} Index of the container node
2465
+ */
2466
+ async _processNodeWithPivotAsync( object ) {
2467
+
2468
+ const json = this.json;
2469
+ const options = this.options;
2470
+ const nodeMap = this.nodeMap;
2471
+
2472
+ const pivot = object.pivot;
2473
+
2474
+ // Container node: holds position + pivot offset, rotation, scale
2475
+ // Animations will target this node
2476
+ const containerDef = {};
2477
+
2478
+ const rotation = object.quaternion.toArray();
2479
+ const position = [
2480
+ object.position.x + pivot.x,
2481
+ object.position.y + pivot.y,
2482
+ object.position.z + pivot.z
2483
+ ];
2484
+ const scale = object.scale.toArray();
2485
+
2486
+ if ( ! equalArray( rotation, [ 0, 0, 0, 1 ] ) ) {
2487
+
2488
+ containerDef.rotation = rotation;
2489
+
2490
+ }
2491
+
2492
+ if ( ! equalArray( position, [ 0, 0, 0 ] ) ) {
2493
+
2494
+ containerDef.translation = position;
2495
+
2496
+ }
2497
+
2498
+ if ( ! equalArray( scale, [ 1, 1, 1 ] ) ) {
2499
+
2500
+ containerDef.scale = scale;
2501
+
2502
+ }
2503
+
2504
+ // Store pivot in extras for round-trip reconstruction
2505
+ containerDef.extras = { pivot: pivot.toArray() };
2506
+
2507
+ if ( object.name !== '' ) containerDef.name = String( object.name );
2508
+
2509
+ this.serializeUserData( object, containerDef );
2510
+
2511
+ const containerIndex = json.nodes.push( containerDef ) - 1;
2512
+
2513
+ // Map original object to container so animations target it
2514
+ nodeMap.set( object, containerIndex );
2515
+
2516
+ // Child node: holds mesh with -pivot offset
2517
+ const childDef = {};
2518
+
2519
+ const childPosition = [ - pivot.x, - pivot.y, - pivot.z ];
2520
+
2521
+ if ( ! equalArray( childPosition, [ 0, 0, 0 ] ) ) {
2522
+
2523
+ childDef.translation = childPosition;
2524
+
2525
+ }
2526
+
2527
+ if ( object.isMesh || object.isLine || object.isPoints ) {
2528
+
2529
+ const meshIndex = await this.processMeshAsync( object );
2530
+
2531
+ if ( meshIndex !== null ) childDef.mesh = meshIndex;
2532
+
2533
+ } else if ( object.isCamera ) {
2534
+
2535
+ childDef.camera = this.processCamera( object );
2536
+
2537
+ }
2538
+
2539
+ if ( object.isSkinnedMesh ) this.skins.push( object );
2540
+
2541
+ const childIndex = json.nodes.push( childDef ) - 1;
2542
+
2543
+ // Build children array for container
2544
+ const containerChildren = [ childIndex ];
2545
+
2546
+ // Process object's children as children of the child node
2547
+ if ( object.children.length > 0 ) {
2548
+
2549
+ const grandchildren = [];
2550
+
2551
+ for ( let i = 0, l = object.children.length; i < l; i ++ ) {
2552
+
2553
+ const child = object.children[ i ];
2554
+
2555
+ if ( child.visible || options.onlyVisible === false ) {
2556
+
2557
+ const childNodeIndex = await this.processNodeAsync( child );
2558
+
2559
+ if ( childNodeIndex !== null ) grandchildren.push( childNodeIndex );
2560
+
2561
+ }
2562
+
2563
+ }
2564
+
2565
+ if ( grandchildren.length > 0 ) childDef.children = grandchildren;
2566
+
2567
+ }
2568
+
2569
+ containerDef.children = containerChildren;
2570
+
2571
+ await this._invokeAllAsync( function ( ext ) {
2572
+
2573
+ ext.writeNode && ext.writeNode( object, containerDef );
2574
+
2575
+ } );
2576
+
2577
+ return containerIndex;
2578
+
2579
+ }
2580
+
2454
2581
  /**
2455
2582
  * Process Scene
2456
2583
  * @param {Scene} scene Scene to process
@@ -3538,9 +3665,9 @@ GLTFExporter.Utils = {
3538
3665
 
3539
3666
  },
3540
3667
 
3541
- toFloat32BufferAttribute: function ( srcAttribute ) {
3668
+ toTypedBufferAttribute: function ( srcAttribute, TypedArray ) {
3542
3669
 
3543
- const dstAttribute = new BufferAttribute( new Float32Array( srcAttribute.count * srcAttribute.itemSize ), srcAttribute.itemSize, false );
3670
+ const dstAttribute = new BufferAttribute( new TypedArray( srcAttribute.count * srcAttribute.itemSize ), srcAttribute.itemSize, false );
3544
3671
 
3545
3672
  if ( ! srcAttribute.normalized && ! srcAttribute.isInterleavedBufferAttribute ) {
3546
3673
 
@@ -501,7 +501,6 @@ function buildHierarchy( object, parentNode, materials, usedNames, files, option
501
501
  function buildXform( object, usedNames ) {
502
502
 
503
503
  const name = getName( object, usedNames );
504
- const transform = buildMatrix( object.matrix );
505
504
 
506
505
  if ( object.matrix.determinant() < 0 ) {
507
506
 
@@ -514,8 +513,28 @@ function buildXform( object, usedNames ) {
514
513
 
515
514
  const node = new USDNode( name, 'Xform' );
516
515
 
517
- node.addProperty( `matrix4d xformOp:transform = ${transform}` );
518
- node.addProperty( 'uniform token[] xformOpOrder = ["xformOp:transform"]' );
516
+ if ( object.pivot !== null ) {
517
+
518
+ // Export with pivot using separate transform ops
519
+ const p = object.position;
520
+ const q = object.quaternion;
521
+ const s = object.scale;
522
+ const piv = object.pivot;
523
+
524
+ node.addProperty( `float3 xformOp:translate = (${p.x.toPrecision( PRECISION )}, ${p.y.toPrecision( PRECISION )}, ${p.z.toPrecision( PRECISION )})` );
525
+ node.addProperty( `float3 xformOp:translate:pivot = (${piv.x.toPrecision( PRECISION )}, ${piv.y.toPrecision( PRECISION )}, ${piv.z.toPrecision( PRECISION )})` );
526
+ node.addProperty( `quatf xformOp:orient = (${q.w.toPrecision( PRECISION )}, ${q.x.toPrecision( PRECISION )}, ${q.y.toPrecision( PRECISION )}, ${q.z.toPrecision( PRECISION )})` );
527
+ node.addProperty( `float3 xformOp:scale = (${s.x.toPrecision( PRECISION )}, ${s.y.toPrecision( PRECISION )}, ${s.z.toPrecision( PRECISION )})` );
528
+ node.addProperty( 'uniform token[] xformOpOrder = ["xformOp:translate", "xformOp:translate:pivot", "xformOp:orient", "xformOp:scale", "!invert!xformOp:translate:pivot"]' );
529
+
530
+ } else {
531
+
532
+ // Export as single transform matrix
533
+ const transform = buildMatrix( object.matrix );
534
+ node.addProperty( `matrix4d xformOp:transform = ${transform}` );
535
+ node.addProperty( 'uniform token[] xformOpOrder = ["xformOp:transform"]' );
536
+
537
+ }
519
538
 
520
539
  return node;
521
540
 
@@ -35,7 +35,7 @@ class DecalGeometry extends BufferGeometry {
35
35
  * @param {Mesh} [mesh] - The base mesh the decal should be projected on.
36
36
  * @param {Vector3} [position] - The position of the decal projector.
37
37
  * @param {Euler} [orientation] - The orientation of the decal projector.
38
- * @param {Vector3} [size] - Tje scale of the decal projector.
38
+ * @param {Vector3} [size] - The scale of the decal projector.
39
39
  */
40
40
  constructor( mesh = new Mesh(), position = new Vector3(), orientation = new Euler(), size = new Vector3( 1, 1, 1 ) ) {
41
41
 
@@ -0,0 +1,302 @@
1
+ import {
2
+ BufferGeometry,
3
+ Float32BufferAttribute,
4
+ Line,
5
+ LineBasicMaterial,
6
+ Object3D,
7
+ Points,
8
+ PointsMaterial
9
+ } from 'three';
10
+
11
+ /**
12
+ * Visualizes the motion path of an animated object based on position keyframes
13
+ * from an AnimationClip.
14
+ *
15
+ * ```js
16
+ * const clip = model.animations[ 0 ];
17
+ * const helper = new AnimationPathHelper( model, clip, object );
18
+ * scene.add( helper );
19
+ * ```
20
+ *
21
+ * @augments Object3D
22
+ * @three_import import { AnimationPathHelper } from 'three/addons/helpers/AnimationPathHelper.js';
23
+ */
24
+ class AnimationPathHelper extends Object3D {
25
+
26
+ /**
27
+ * Constructs a new animation path helper.
28
+ *
29
+ * @param {Object3D} root - The root object containing the animation clips.
30
+ * @param {AnimationClip} clip - The animation clip containing position keyframes.
31
+ * @param {Object3D} object - The specific object to show the path for.
32
+ * @param {Object} [options={}] - Configuration options.
33
+ * @param {number|Color|string} [options.color=0x00ff00] - The path line color.
34
+ * @param {number|Color|string} [options.markerColor=0xff0000] - The keyframe marker color.
35
+ * @param {number} [options.divisions=100] - Number of samples for smooth path interpolation.
36
+ * @param {boolean} [options.showMarkers=true] - Whether to show markers at keyframe positions.
37
+ * @param {number} [options.markerSize=5] - Size of keyframe markers in pixels.
38
+ */
39
+ constructor( root, clip, object, options = {} ) {
40
+
41
+ super();
42
+
43
+ const {
44
+ color = 0x00ff00,
45
+ markerColor = 0xff0000,
46
+ divisions = 100,
47
+ showMarkers = true,
48
+ markerSize = 5
49
+ } = options;
50
+
51
+ /**
52
+ * This flag can be used for type testing.
53
+ *
54
+ * @type {boolean}
55
+ * @readonly
56
+ * @default true
57
+ */
58
+ this.isAnimationPathHelper = true;
59
+
60
+ this.type = 'AnimationPathHelper';
61
+
62
+ /**
63
+ * The root object containing the animation clips.
64
+ *
65
+ * @type {Object3D}
66
+ */
67
+ this.root = root;
68
+
69
+ /**
70
+ * The animation clip containing position keyframes.
71
+ *
72
+ * @type {AnimationClip}
73
+ */
74
+ this.clip = clip;
75
+
76
+ /**
77
+ * The object whose path is being visualized.
78
+ *
79
+ * @type {Object3D}
80
+ */
81
+ this.object = object;
82
+
83
+ /**
84
+ * Number of samples for smooth path interpolation.
85
+ *
86
+ * @type {number}
87
+ * @default 100
88
+ */
89
+ this.divisions = divisions;
90
+
91
+ /**
92
+ * The position track for the object.
93
+ *
94
+ * @type {KeyframeTrack|null}
95
+ * @private
96
+ */
97
+ this._track = this._findTrackForObject( object );
98
+
99
+ if ( this._track === null ) {
100
+
101
+ console.warn( 'AnimationPathHelper: No position track found for object', object.name );
102
+ return;
103
+
104
+ }
105
+
106
+ // Create line for path
107
+ const lineGeometry = new BufferGeometry();
108
+ const lineMaterial = new LineBasicMaterial( {
109
+ color: color,
110
+ toneMapped: false
111
+ } );
112
+
113
+ /**
114
+ * The line representing the animation path.
115
+ *
116
+ * @type {Line}
117
+ */
118
+ this.line = new Line( lineGeometry, lineMaterial );
119
+ this.add( this.line );
120
+
121
+ // Create points for keyframe markers
122
+ if ( showMarkers ) {
123
+
124
+ const pointsGeometry = new BufferGeometry();
125
+ const pointsMaterial = new PointsMaterial( {
126
+ color: markerColor,
127
+ size: markerSize,
128
+ sizeAttenuation: false,
129
+ toneMapped: false
130
+ } );
131
+
132
+ /**
133
+ * Points marking keyframe positions.
134
+ *
135
+ * @type {Points|null}
136
+ */
137
+ this.points = new Points( pointsGeometry, pointsMaterial );
138
+ this.add( this.points );
139
+
140
+ } else {
141
+
142
+ this.points = null;
143
+
144
+ }
145
+
146
+ // Sync matrix with object's parent
147
+ this.matrixAutoUpdate = false;
148
+
149
+ this._updateGeometry();
150
+
151
+ }
152
+
153
+ /**
154
+ * Finds the position track for the given object.
155
+ *
156
+ * @private
157
+ * @param {Object3D} object - The object to find the track for.
158
+ * @returns {KeyframeTrack|null} The position track, or null if not found.
159
+ */
160
+ _findTrackForObject( object ) {
161
+
162
+ const targetName = object.uuid + '.position';
163
+
164
+ for ( const track of this.clip.tracks ) {
165
+
166
+ if ( track.name === targetName && track.getValueSize() === 3 ) {
167
+
168
+ return track;
169
+
170
+ }
171
+
172
+ }
173
+
174
+ return null;
175
+
176
+ }
177
+
178
+ /**
179
+ * Samples the track at regular intervals.
180
+ *
181
+ * @private
182
+ * @returns {Float32Array} Array of sampled positions.
183
+ */
184
+ _sampleTrack() {
185
+
186
+ const track = this._track;
187
+ const interpolant = track.createInterpolant();
188
+ const duration = this.clip.duration;
189
+ const positions = [];
190
+
191
+ for ( let i = 0; i <= this.divisions; i ++ ) {
192
+
193
+ const t = ( i / this.divisions ) * duration;
194
+ const result = interpolant.evaluate( t );
195
+ positions.push( result[ 0 ], result[ 1 ], result[ 2 ] );
196
+
197
+ }
198
+
199
+ return new Float32Array( positions );
200
+
201
+ }
202
+
203
+ /**
204
+ * Updates the geometry with sampled path data.
205
+ *
206
+ * @private
207
+ */
208
+ _updateGeometry() {
209
+
210
+ if ( this._track === null ) return;
211
+
212
+ // Update line geometry
213
+ const sampledPositions = this._sampleTrack();
214
+ this.line.geometry.setAttribute( 'position', new Float32BufferAttribute( sampledPositions, 3 ) );
215
+ this.line.geometry.computeBoundingSphere();
216
+
217
+ // Update keyframe markers
218
+ if ( this.points !== null ) {
219
+
220
+ this.points.geometry.setAttribute( 'position', new Float32BufferAttribute( new Float32Array( this._track.values ), 3 ) );
221
+ this.points.geometry.computeBoundingSphere();
222
+
223
+ }
224
+
225
+ }
226
+
227
+ /**
228
+ * Updates the helper's transform to match the object's parent.
229
+ *
230
+ * @param {boolean} force - Force matrix update.
231
+ */
232
+ updateMatrixWorld( force ) {
233
+
234
+ // Position the helper at the object's parent so the path appears in correct local space
235
+ if ( this.object && this.object.parent ) {
236
+
237
+ this.object.parent.updateWorldMatrix( true, false );
238
+ this.matrix.copy( this.object.parent.matrixWorld );
239
+
240
+ } else {
241
+
242
+ this.matrix.identity();
243
+
244
+ }
245
+
246
+ this.matrixWorld.copy( this.matrix );
247
+
248
+ // Update children
249
+ for ( let i = 0; i < this.children.length; i ++ ) {
250
+
251
+ this.children[ i ].updateMatrixWorld( force );
252
+
253
+ }
254
+
255
+ }
256
+
257
+ /**
258
+ * Sets the path line color.
259
+ *
260
+ * @param {number|Color|string} color - The new color.
261
+ */
262
+ setColor( color ) {
263
+
264
+ if ( this.line ) this.line.material.color.set( color );
265
+
266
+ }
267
+
268
+ /**
269
+ * Sets the keyframe marker color.
270
+ *
271
+ * @param {number|Color|string} color - The new color.
272
+ */
273
+ setMarkerColor( color ) {
274
+
275
+ if ( this.points ) this.points.material.color.set( color );
276
+
277
+ }
278
+
279
+ /**
280
+ * Frees the GPU-related resources allocated by this instance.
281
+ */
282
+ dispose() {
283
+
284
+ if ( this.line ) {
285
+
286
+ this.line.geometry.dispose();
287
+ this.line.material.dispose();
288
+
289
+ }
290
+
291
+ if ( this.points ) {
292
+
293
+ this.points.geometry.dispose();
294
+ this.points.material.dispose();
295
+
296
+ }
297
+
298
+ }
299
+
300
+ }
301
+
302
+ export { AnimationPathHelper };
@@ -2,7 +2,7 @@ import {
2
2
  Mesh,
3
3
  NodeMaterial,
4
4
  SphereGeometry
5
- } from 'three';
5
+ } from 'three/webgpu';
6
6
  import { float, Fn, getShIrradianceAt, normalWorld, uniformArray, uniform, vec4 } from 'three/tsl';
7
7
 
8
8
  /**
@@ -6,7 +6,7 @@ import {
6
6
  PlaneGeometry,
7
7
  DoubleSide,
8
8
  Vector3,
9
- } from 'three';
9
+ } from 'three/webgpu';
10
10
  import { texture as textureNode, cubeTexture, texture3D, float, vec4, attribute } from 'three/tsl';
11
11
  import { mergeGeometries } from '../utils/BufferGeometryUtils.js';
12
12
 
@@ -65,6 +65,20 @@ class ViewHelper extends Object3D {
65
65
  */
66
66
  this.center = new Vector3();
67
67
 
68
+ /**
69
+ * Controls the position of the helper in the viewport.
70
+ * Use `top`/`bottom` for vertical positioning and `left`/`right` for horizontal.
71
+ * If `left` is `null`, `right` is used. If `top` is `null`, `bottom` is used.
72
+ *
73
+ * @type {{top: number|null, right: number, bottom: number, left: number|null}}
74
+ */
75
+ this.location = {
76
+ top: null,
77
+ right: 0,
78
+ bottom: 0,
79
+ left: null
80
+ };
81
+
68
82
  const color1 = new Color( '#ff4466' );
69
83
  const color2 = new Color( '#88ff44' );
70
84
  const color3 = new Color( '#4488ff' );
@@ -142,8 +156,8 @@ class ViewHelper extends Object3D {
142
156
  const turnRate = 2 * Math.PI; // turn rate in angles per second
143
157
 
144
158
  /**
145
- * Renders the helper in a separate view in the bottom-right corner
146
- * of the viewport.
159
+ * Renders the helper in a separate view in the viewport.
160
+ * Position is controlled by the `location` property.
147
161
  *
148
162
  * @param {WebGLRenderer|WebGPURenderer} renderer - The renderer.
149
163
  */
@@ -157,8 +171,31 @@ class ViewHelper extends Object3D {
157
171
 
158
172
  //
159
173
 
160
- const x = domElement.offsetWidth - dim;
161
- const y = renderer.isWebGPURenderer ? domElement.offsetHeight - dim : 0;
174
+ const location = this.location;
175
+
176
+ let x, y;
177
+
178
+ if ( location.left !== null ) {
179
+
180
+ x = location.left;
181
+
182
+ } else {
183
+
184
+ x = domElement.offsetWidth - dim - location.right;
185
+
186
+ }
187
+
188
+ if ( location.top !== null ) {
189
+
190
+ // Position from top
191
+ y = renderer.isWebGPURenderer ? location.top : domElement.offsetHeight - dim - location.top;
192
+
193
+ } else {
194
+
195
+ // Position from bottom
196
+ y = renderer.isWebGPURenderer ? domElement.offsetHeight - dim - location.bottom : location.bottom;
197
+
198
+ }
162
199
 
163
200
  renderer.clearDepth();
164
201
 
@@ -191,10 +228,32 @@ class ViewHelper extends Object3D {
191
228
  if ( this.animating === true ) return false;
192
229
 
193
230
  const rect = domElement.getBoundingClientRect();
194
- const offsetX = rect.left + ( domElement.offsetWidth - dim );
195
- const offsetY = rect.top + ( domElement.offsetHeight - dim );
196
- mouse.x = ( ( event.clientX - offsetX ) / ( rect.right - offsetX ) ) * 2 - 1;
197
- mouse.y = - ( ( event.clientY - offsetY ) / ( rect.bottom - offsetY ) ) * 2 + 1;
231
+ const location = this.location;
232
+
233
+ let offsetX, offsetY;
234
+
235
+ if ( location.left !== null ) {
236
+
237
+ offsetX = rect.left + location.left;
238
+
239
+ } else {
240
+
241
+ offsetX = rect.left + domElement.offsetWidth - dim - location.right;
242
+
243
+ }
244
+
245
+ if ( location.top !== null ) {
246
+
247
+ offsetY = rect.top + location.top;
248
+
249
+ } else {
250
+
251
+ offsetY = rect.top + domElement.offsetHeight - dim - location.bottom;
252
+
253
+ }
254
+
255
+ mouse.x = ( ( event.clientX - offsetX ) / dim ) * 2 - 1;
256
+ mouse.y = - ( ( event.clientY - offsetY ) / dim ) * 2 + 1;
198
257
 
199
258
  raycaster.setFromCamera( mouse, orthoCamera );
200
259