super-three 0.181.0 → 0.184.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 (539) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +3 -4
  3. package/build/three.cjs +13152 -11354
  4. package/build/three.core.js +12319 -11539
  5. package/build/three.core.min.js +2 -2
  6. package/build/three.module.js +1808 -781
  7. package/build/three.module.min.js +2 -2
  8. package/build/three.tsl.js +27 -13
  9. package/build/three.tsl.min.js +2 -2
  10. package/build/three.webgpu.js +10523 -6263
  11. package/build/three.webgpu.min.js +2 -2
  12. package/build/three.webgpu.nodes.js +10484 -6262
  13. package/build/three.webgpu.nodes.min.js +2 -2
  14. package/examples/jsm/Addons.js +11 -3
  15. package/examples/jsm/animation/CCDIKSolver.js +7 -3
  16. package/examples/jsm/controls/ArcballControls.js +7 -4
  17. package/examples/jsm/controls/DragControls.js +2 -2
  18. package/examples/jsm/controls/FirstPersonControls.js +58 -54
  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 +34 -2
  24. package/examples/jsm/csm/CSM.js +2 -1
  25. package/examples/jsm/csm/CSMShadowNode.js +6 -2
  26. package/examples/jsm/effects/AnaglyphEffect.js +102 -7
  27. package/examples/jsm/environments/ColorEnvironment.js +59 -0
  28. package/examples/jsm/environments/RoomEnvironment.js +3 -0
  29. package/examples/jsm/exporters/EXRExporter.js +1 -1
  30. package/examples/jsm/exporters/GLTFExporter.js +152 -9
  31. package/examples/jsm/exporters/USDZExporter.js +22 -3
  32. package/examples/jsm/geometries/DecalGeometry.js +1 -1
  33. package/examples/jsm/geometries/TextGeometry.js +18 -0
  34. package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
  35. package/examples/jsm/helpers/LightProbeGridHelper.js +221 -0
  36. package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -1
  37. package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
  38. package/examples/jsm/helpers/ViewHelper.js +67 -8
  39. package/examples/jsm/inspector/Extension.js +13 -0
  40. package/examples/jsm/inspector/Inspector.js +203 -88
  41. package/examples/jsm/inspector/RendererInspector.js +14 -4
  42. package/examples/jsm/inspector/extensions/extensions.json +6 -0
  43. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +916 -0
  44. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +281 -0
  45. package/examples/jsm/inspector/tabs/Console.js +41 -7
  46. package/examples/jsm/inspector/tabs/Memory.js +128 -0
  47. package/examples/jsm/inspector/tabs/Parameters.js +51 -3
  48. package/examples/jsm/inspector/tabs/Performance.js +4 -4
  49. package/examples/jsm/inspector/tabs/Settings.js +264 -0
  50. package/examples/jsm/inspector/tabs/Timeline.js +1611 -0
  51. package/examples/jsm/inspector/tabs/Viewer.js +107 -5
  52. package/examples/jsm/inspector/ui/Graph.js +2 -2
  53. package/examples/jsm/inspector/ui/List.js +1 -1
  54. package/examples/jsm/inspector/ui/Profiler.js +1936 -34
  55. package/examples/jsm/inspector/ui/Style.js +1044 -31
  56. package/examples/jsm/inspector/ui/Tab.js +222 -3
  57. package/examples/jsm/inspector/ui/Values.js +55 -2
  58. package/examples/jsm/inspector/ui/utils.js +13 -0
  59. package/examples/jsm/interaction/InteractionManager.js +226 -0
  60. package/examples/jsm/libs/meshopt_decoder.module.js +9 -8
  61. package/examples/jsm/lighting/DynamicLighting.js +82 -0
  62. package/examples/jsm/lighting/LightProbeGrid.js +651 -0
  63. package/examples/jsm/lines/LineMaterial.js +7 -1
  64. package/examples/jsm/loaders/3DMLoader.js +5 -4
  65. package/examples/jsm/loaders/3MFLoader.js +2 -2
  66. package/examples/jsm/loaders/AMFLoader.js +2 -2
  67. package/examples/jsm/loaders/ColladaLoader.js +24 -4026
  68. package/examples/jsm/loaders/DRACOLoader.js +5 -5
  69. package/examples/jsm/loaders/EXRLoader.js +687 -48
  70. package/examples/jsm/loaders/FBXLoader.js +235 -37
  71. package/examples/jsm/loaders/GCodeLoader.js +34 -8
  72. package/examples/jsm/loaders/GLTFLoader.js +146 -178
  73. package/examples/jsm/loaders/HDRLoader.js +1 -2
  74. package/examples/jsm/loaders/KMZLoader.js +5 -5
  75. package/examples/jsm/loaders/KTX2Loader.js +27 -5
  76. package/examples/jsm/loaders/LDrawLoader.js +41 -50
  77. package/examples/jsm/loaders/LWOLoader.js +7 -39
  78. package/examples/jsm/loaders/NRRDLoader.js +2 -2
  79. package/examples/jsm/loaders/PCDLoader.js +4 -2
  80. package/examples/jsm/loaders/SVGLoader.js +2 -2
  81. package/examples/jsm/loaders/TDSLoader.js +0 -2
  82. package/examples/jsm/loaders/TGALoader.js +0 -2
  83. package/examples/jsm/loaders/USDLoader.js +100 -40
  84. package/examples/jsm/loaders/UltraHDRLoader.js +285 -160
  85. package/examples/jsm/loaders/VOXLoader.js +660 -117
  86. package/examples/jsm/loaders/VRMLLoader.js +79 -2
  87. package/examples/jsm/loaders/VTKLoader.js +42 -25
  88. package/examples/jsm/loaders/collada/ColladaComposer.js +3044 -0
  89. package/examples/jsm/loaders/collada/ColladaParser.js +1977 -0
  90. package/examples/jsm/loaders/usd/USDAParser.js +450 -363
  91. package/examples/jsm/loaders/usd/USDCParser.js +1867 -6
  92. package/examples/jsm/loaders/usd/USDComposer.js +4594 -0
  93. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
  94. package/examples/jsm/materials/WoodNodeMaterial.js +11 -11
  95. package/examples/jsm/math/Octree.js +131 -1
  96. package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
  97. package/examples/jsm/misc/RollerCoaster.js +42 -4
  98. package/examples/jsm/misc/Volume.js +0 -1
  99. package/examples/jsm/misc/VolumeSlice.js +0 -1
  100. package/examples/jsm/modifiers/TessellateModifier.js +1 -1
  101. package/examples/jsm/objects/LensflareMesh.js +1 -1
  102. package/examples/jsm/objects/Reflector.js +73 -25
  103. package/examples/jsm/objects/Sky.js +90 -6
  104. package/examples/jsm/objects/SkyMesh.js +150 -16
  105. package/examples/jsm/objects/Water.js +4 -3
  106. package/examples/jsm/objects/Water2.js +5 -3
  107. package/examples/jsm/objects/WaterMesh.js +5 -7
  108. package/examples/jsm/physics/AmmoPhysics.js +12 -7
  109. package/examples/jsm/physics/JoltPhysics.js +10 -6
  110. package/examples/jsm/physics/RapierPhysics.js +9 -5
  111. package/examples/jsm/postprocessing/EffectComposer.js +7 -5
  112. package/examples/jsm/postprocessing/OutputPass.js +9 -0
  113. package/examples/jsm/postprocessing/RenderPass.js +10 -0
  114. package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
  115. package/examples/jsm/postprocessing/UnrealBloomPass.js +48 -18
  116. package/examples/jsm/renderers/CSS3DRenderer.js +1 -1
  117. package/examples/jsm/renderers/Projector.js +246 -28
  118. package/examples/jsm/renderers/SVGRenderer.js +174 -60
  119. package/examples/jsm/shaders/GTAOShader.js +19 -6
  120. package/examples/jsm/shaders/HalftoneShader.js +12 -1
  121. package/examples/jsm/shaders/PoissonDenoiseShader.js +6 -2
  122. package/examples/jsm/shaders/SAOShader.js +17 -4
  123. package/examples/jsm/shaders/SSAOShader.js +11 -1
  124. package/examples/jsm/shaders/SSRShader.js +6 -5
  125. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -4
  126. package/examples/jsm/shaders/VignetteShader.js +1 -1
  127. package/examples/jsm/transpiler/AST.js +44 -0
  128. package/examples/jsm/transpiler/GLSLDecoder.js +63 -6
  129. package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
  130. package/examples/jsm/transpiler/TSLEncoder.js +46 -3
  131. package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
  132. package/examples/jsm/transpiler/WGSLEncoder.js +27 -0
  133. package/examples/jsm/tsl/WebGLNodesHandler.js +605 -0
  134. package/examples/jsm/tsl/display/AfterImageNode.js +11 -1
  135. package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
  136. package/examples/jsm/tsl/display/AnamorphicNode.js +12 -1
  137. package/examples/jsm/tsl/display/BilateralBlurNode.js +374 -0
  138. package/examples/jsm/tsl/display/BloomNode.js +16 -6
  139. package/examples/jsm/tsl/display/CRT.js +150 -0
  140. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +3 -36
  141. package/examples/jsm/tsl/display/DenoiseNode.js +1 -1
  142. package/examples/jsm/tsl/display/DepthOfFieldNode.js +1 -1
  143. package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
  144. package/examples/jsm/tsl/display/FSR1Node.js +477 -0
  145. package/examples/jsm/tsl/display/FXAANode.js +2 -2
  146. package/examples/jsm/tsl/display/GTAONode.js +6 -4
  147. package/examples/jsm/tsl/display/GaussianBlurNode.js +21 -2
  148. package/examples/jsm/tsl/display/GodraysNode.js +615 -0
  149. package/examples/jsm/tsl/display/LensflareNode.js +1 -1
  150. package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
  151. package/examples/jsm/tsl/display/OutlineNode.js +69 -19
  152. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
  153. package/examples/jsm/tsl/display/PixelationPassNode.js +7 -6
  154. package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
  155. package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
  156. package/examples/jsm/tsl/display/SMAANode.js +2 -2
  157. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
  158. package/examples/jsm/tsl/display/SSGINode.js +8 -24
  159. package/examples/jsm/tsl/display/SSRNode.js +8 -8
  160. package/examples/jsm/tsl/display/SSSNode.js +6 -4
  161. package/examples/jsm/tsl/display/Shape.js +29 -0
  162. package/examples/jsm/tsl/display/SharpenNode.js +283 -0
  163. package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
  164. package/examples/jsm/tsl/display/StereoCompositePassNode.js +8 -1
  165. package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
  166. package/examples/jsm/tsl/display/TAAUNode.js +835 -0
  167. package/examples/jsm/tsl/display/TRAANode.js +315 -126
  168. package/examples/jsm/tsl/display/TransitionNode.js +1 -1
  169. package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
  170. package/examples/jsm/tsl/display/radialBlur.js +68 -0
  171. package/examples/jsm/tsl/lighting/DynamicLightsNode.js +300 -0
  172. package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +61 -0
  173. package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +111 -0
  174. package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +99 -0
  175. package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +134 -0
  176. package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +161 -0
  177. package/examples/jsm/tsl/math/Bayer.js +53 -3
  178. package/examples/jsm/utils/BufferGeometryUtils.js +2 -3
  179. package/examples/jsm/utils/ColorUtils.js +76 -0
  180. package/examples/jsm/utils/LDrawUtils.js +1 -1
  181. package/examples/jsm/utils/ShadowMapViewer.js +24 -10
  182. package/examples/jsm/utils/ShadowMapViewerGPU.js +1 -1
  183. package/examples/jsm/utils/SkeletonUtils.js +14 -8
  184. package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
  185. package/examples/jsm/webxr/XRHandMeshModel.js +36 -10
  186. package/examples/jsm/webxr/XRHandModelFactory.js +2 -1
  187. package/package.json +24 -30
  188. package/src/Three.Core.js +3 -1
  189. package/src/Three.TSL.js +25 -11
  190. package/src/Three.WebGPU.Nodes.js +5 -0
  191. package/src/Three.WebGPU.js +9 -0
  192. package/src/Three.js +1 -0
  193. package/src/animation/AnimationAction.js +12 -2
  194. package/src/animation/AnimationClip.js +1 -1
  195. package/src/animation/AnimationMixer.js +6 -0
  196. package/src/animation/AnimationUtils.js +1 -12
  197. package/src/animation/KeyframeTrack.js +47 -8
  198. package/src/animation/PropertyMixer.js +4 -4
  199. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  200. package/src/animation/tracks/ColorKeyframeTrack.js +1 -1
  201. package/src/animation/tracks/NumberKeyframeTrack.js +1 -1
  202. package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -1
  203. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  204. package/src/animation/tracks/VectorKeyframeTrack.js +1 -1
  205. package/src/audio/Audio.js +1 -1
  206. package/src/audio/AudioContext.js +2 -2
  207. package/src/audio/AudioListener.js +5 -3
  208. package/src/cameras/Camera.js +32 -2
  209. package/src/cameras/CubeCamera.js +20 -0
  210. package/src/constants.js +90 -5
  211. package/src/core/BufferAttribute.js +13 -1
  212. package/src/core/BufferGeometry.js +14 -2
  213. package/src/core/Clock.js +7 -0
  214. package/src/core/Object3D.js +52 -4
  215. package/src/core/Raycaster.js +2 -2
  216. package/src/core/RenderTarget.js +4 -4
  217. package/src/extras/PMREMGenerator.js +7 -18
  218. package/src/extras/TextureUtils.js +5 -1
  219. package/src/extras/curves/CatmullRomCurve3.js +3 -2
  220. package/src/geometries/ExtrudeGeometry.js +2 -2
  221. package/src/geometries/PolyhedronGeometry.js +1 -1
  222. package/src/geometries/TorusGeometry.js +8 -3
  223. package/src/helpers/CameraHelper.js +3 -0
  224. package/src/helpers/DirectionalLightHelper.js +4 -1
  225. package/src/helpers/HemisphereLightHelper.js +3 -0
  226. package/src/helpers/PointLightHelper.js +1 -25
  227. package/src/helpers/SpotLightHelper.js +3 -0
  228. package/src/lights/DirectionalLight.js +13 -0
  229. package/src/lights/HemisphereLight.js +10 -0
  230. package/src/lights/Light.js +1 -11
  231. package/src/lights/LightProbe.js +0 -15
  232. package/src/lights/LightShadow.js +15 -6
  233. package/src/lights/PointLight.js +15 -0
  234. package/src/lights/PointLightShadow.js +0 -86
  235. package/src/lights/SpotLight.js +22 -1
  236. package/src/lights/webgpu/IESSpotLight.js +2 -1
  237. package/src/loaders/AudioLoader.js +11 -1
  238. package/src/loaders/Cache.js +28 -0
  239. package/src/loaders/DataTextureLoader.js +6 -4
  240. package/src/loaders/FileLoader.js +2 -3
  241. package/src/loaders/ImageBitmapLoader.js +12 -9
  242. package/src/loaders/Loader.js +6 -0
  243. package/src/loaders/MaterialLoader.js +3 -2
  244. package/src/loaders/ObjectLoader.js +46 -6
  245. package/src/loaders/nodes/NodeLoader.js +2 -2
  246. package/src/loaders/nodes/NodeObjectLoader.js +18 -0
  247. package/src/materials/Material.js +2 -0
  248. package/src/materials/MeshLambertMaterial.js +9 -0
  249. package/src/materials/MeshPhongMaterial.js +9 -0
  250. package/src/materials/MeshToonMaterial.js +1 -1
  251. package/src/materials/ShaderMaterial.js +20 -1
  252. package/src/materials/nodes/Line2NodeMaterial.js +34 -7
  253. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +5 -2
  254. package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -4
  255. package/src/materials/nodes/NodeMaterial.js +45 -25
  256. package/src/materials/nodes/manager/NodeMaterialObserver.js +191 -86
  257. package/src/math/Line3.js +6 -5
  258. package/src/math/MathUtils.js +10 -10
  259. package/src/math/Matrix2.js +13 -9
  260. package/src/math/Matrix3.js +13 -9
  261. package/src/math/Matrix4.js +87 -74
  262. package/src/math/Plane.js +4 -3
  263. package/src/math/Quaternion.js +3 -29
  264. package/src/math/Sphere.js +1 -1
  265. package/src/math/Triangle.js +1 -1
  266. package/src/math/Vector2.js +11 -7
  267. package/src/math/Vector3.js +15 -13
  268. package/src/math/Vector4.js +13 -9
  269. package/src/math/interpolants/BezierInterpolant.js +108 -0
  270. package/src/nodes/Nodes.js +86 -68
  271. package/src/nodes/TSL.js +7 -7
  272. package/src/nodes/accessors/Arrays.js +1 -1
  273. package/src/nodes/accessors/BatchNode.js +10 -10
  274. package/src/nodes/accessors/Bitangent.js +5 -5
  275. package/src/nodes/accessors/BufferAttributeNode.js +107 -15
  276. package/src/nodes/accessors/BufferNode.js +29 -2
  277. package/src/nodes/accessors/Camera.js +149 -28
  278. package/src/nodes/accessors/ClippingNode.js +4 -4
  279. package/src/nodes/accessors/CubeTextureNode.js +27 -2
  280. package/src/nodes/accessors/InstanceNode.js +148 -43
  281. package/src/nodes/accessors/MaterialNode.js +9 -1
  282. package/src/nodes/accessors/MaterialProperties.js +2 -5
  283. package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
  284. package/src/nodes/accessors/ModelNode.js +1 -1
  285. package/src/nodes/accessors/Normal.js +11 -11
  286. package/src/nodes/accessors/Object3DNode.js +1 -1
  287. package/src/nodes/accessors/Position.js +34 -2
  288. package/src/nodes/accessors/ReferenceBaseNode.js +6 -6
  289. package/src/nodes/accessors/ReferenceNode.js +8 -8
  290. package/src/nodes/accessors/RendererReferenceNode.js +1 -2
  291. package/src/nodes/accessors/SceneProperties.js +47 -0
  292. package/src/nodes/accessors/SkinningNode.js +27 -26
  293. package/src/nodes/accessors/StorageBufferNode.js +14 -25
  294. package/src/nodes/accessors/StorageTextureNode.js +40 -9
  295. package/src/nodes/accessors/Tangent.js +4 -14
  296. package/src/nodes/accessors/Texture3DNode.js +32 -35
  297. package/src/nodes/accessors/TextureNode.js +67 -23
  298. package/src/nodes/accessors/UniformArrayNode.js +6 -4
  299. package/src/nodes/accessors/UserDataNode.js +1 -2
  300. package/src/nodes/accessors/VertexColorNode.js +1 -2
  301. package/src/nodes/code/FunctionCallNode.js +1 -1
  302. package/src/nodes/code/FunctionNode.js +2 -3
  303. package/src/nodes/core/ArrayNode.js +21 -2
  304. package/src/nodes/core/AssignNode.js +3 -3
  305. package/src/nodes/core/AttributeNode.js +3 -3
  306. package/src/nodes/core/BypassNode.js +1 -1
  307. package/src/nodes/core/ContextNode.js +104 -5
  308. package/src/nodes/core/IndexNode.js +2 -1
  309. package/src/nodes/core/InputNode.js +1 -1
  310. package/src/nodes/core/InspectorNode.js +1 -1
  311. package/src/nodes/core/IsolateNode.js +1 -1
  312. package/src/nodes/core/MRTNode.js +48 -2
  313. package/src/nodes/core/Node.js +112 -15
  314. package/src/nodes/core/NodeBuilder.js +284 -66
  315. package/src/nodes/core/NodeError.js +28 -0
  316. package/src/nodes/core/NodeFrame.js +12 -4
  317. package/src/nodes/core/NodeUtils.js +11 -9
  318. package/src/nodes/core/OutputStructNode.js +12 -10
  319. package/src/nodes/core/ParameterNode.js +4 -4
  320. package/src/nodes/core/PropertyNode.js +19 -3
  321. package/src/nodes/core/StackNode.js +66 -17
  322. package/src/nodes/core/StackTrace.js +139 -0
  323. package/src/nodes/core/StructNode.js +17 -3
  324. package/src/nodes/core/StructTypeNode.js +12 -18
  325. package/src/nodes/core/SubBuildNode.js +2 -2
  326. package/src/nodes/core/UniformGroupNode.js +36 -6
  327. package/src/nodes/core/UniformNode.js +21 -5
  328. package/src/nodes/core/VarNode.js +48 -23
  329. package/src/nodes/core/VaryingNode.js +2 -19
  330. package/src/nodes/display/BlendModes.js +0 -64
  331. package/src/nodes/display/ColorAdjustment.js +17 -0
  332. package/src/nodes/display/ColorSpaceNode.js +3 -3
  333. package/src/nodes/display/NormalMapNode.js +39 -4
  334. package/src/nodes/display/PassNode.js +125 -16
  335. package/src/nodes/display/RenderOutputNode.js +7 -7
  336. package/src/nodes/display/ScreenNode.js +4 -2
  337. package/src/nodes/display/ToneMappingNode.js +1 -1
  338. package/src/nodes/display/ToonOutlinePassNode.js +2 -2
  339. package/src/nodes/display/ViewportDepthNode.js +52 -4
  340. package/src/nodes/display/ViewportDepthTextureNode.js +11 -15
  341. package/src/nodes/display/ViewportTextureNode.js +39 -11
  342. package/src/nodes/fog/Fog.js +18 -35
  343. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +3 -3
  344. package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
  345. package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
  346. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +2 -2
  347. package/src/nodes/functions/PhysicalLightingModel.js +126 -45
  348. package/src/nodes/geometry/RangeNode.js +5 -3
  349. package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
  350. package/src/nodes/gpgpu/BarrierNode.js +9 -0
  351. package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -3
  352. package/src/nodes/gpgpu/ComputeNode.js +74 -48
  353. package/src/nodes/gpgpu/SubgroupFunctionNode.js +2 -2
  354. package/src/nodes/gpgpu/WorkgroupInfoNode.js +4 -4
  355. package/src/nodes/lighting/AnalyticLightNode.js +53 -0
  356. package/src/nodes/lighting/EnvironmentNode.js +28 -3
  357. package/src/nodes/lighting/LightsNode.js +7 -28
  358. package/src/nodes/lighting/PointShadowNode.js +162 -149
  359. package/src/nodes/lighting/ShadowFilterNode.js +53 -65
  360. package/src/nodes/lighting/ShadowNode.js +120 -42
  361. package/src/nodes/math/BitcastNode.js +1 -1
  362. package/src/nodes/math/BitcountNode.js +433 -0
  363. package/src/nodes/math/ConditionalNode.js +3 -3
  364. package/src/nodes/math/MathNode.js +76 -41
  365. package/src/nodes/math/OperatorNode.js +3 -2
  366. package/src/nodes/math/PackFloatNode.js +98 -0
  367. package/src/nodes/math/UnpackFloatNode.js +96 -0
  368. package/src/nodes/pmrem/PMREMNode.js +1 -1
  369. package/src/nodes/pmrem/PMREMUtils.js +9 -15
  370. package/src/nodes/tsl/TSLBase.js +1 -1
  371. package/src/nodes/tsl/TSLCore.js +38 -17
  372. package/src/nodes/utils/ArrayElementNode.js +14 -1
  373. package/src/nodes/utils/ConvertNode.js +1 -1
  374. package/src/nodes/utils/DebugNode.js +12 -12
  375. package/src/nodes/utils/EventNode.js +31 -2
  376. package/src/nodes/utils/FlipNode.js +1 -1
  377. package/src/nodes/utils/FunctionOverloadingNode.js +1 -1
  378. package/src/nodes/utils/JoinNode.js +3 -3
  379. package/src/nodes/utils/LoopNode.js +1 -1
  380. package/src/nodes/utils/MemberNode.js +2 -2
  381. package/src/nodes/utils/Packing.js +13 -1
  382. package/src/nodes/utils/PostProcessingUtils.js +33 -1
  383. package/src/nodes/utils/RTTNode.js +1 -1
  384. package/src/nodes/utils/ReflectorNode.js +3 -4
  385. package/src/nodes/utils/Remap.js +48 -0
  386. package/src/nodes/utils/RotateNode.js +1 -1
  387. package/src/nodes/utils/SampleNode.js +1 -1
  388. package/src/nodes/utils/SetNode.js +1 -1
  389. package/src/nodes/utils/SplitNode.js +1 -1
  390. package/src/nodes/utils/SpriteSheetUV.js +35 -0
  391. package/src/nodes/utils/UVUtils.js +28 -0
  392. package/src/objects/BatchedMesh.js +44 -16
  393. package/src/objects/InstancedMesh.js +30 -3
  394. package/src/objects/Line.js +1 -1
  395. package/src/objects/Mesh.js +1 -1
  396. package/src/objects/Points.js +1 -1
  397. package/src/objects/Skeleton.js +9 -0
  398. package/src/objects/SkinnedMesh.js +26 -9
  399. package/src/renderers/WebGLRenderer.js +329 -145
  400. package/src/renderers/common/Animation.js +3 -3
  401. package/src/renderers/common/Attributes.js +15 -1
  402. package/src/renderers/common/Backend.js +29 -8
  403. package/src/renderers/common/Background.js +26 -13
  404. package/src/renderers/common/BindGroup.js +1 -16
  405. package/src/renderers/common/Binding.js +11 -0
  406. package/src/renderers/common/Bindings.js +29 -14
  407. package/src/renderers/common/BlendMode.js +143 -0
  408. package/src/renderers/common/Buffer.js +40 -0
  409. package/src/renderers/common/BundleGroup.js +1 -1
  410. package/src/renderers/common/ChainMap.js +30 -6
  411. package/src/renderers/common/ComputePipeline.js +1 -1
  412. package/src/renderers/common/CubeRenderTarget.js +51 -7
  413. package/src/renderers/common/Geometries.js +29 -3
  414. package/src/renderers/common/Info.js +333 -4
  415. package/src/renderers/common/InspectorBase.js +6 -1
  416. package/src/renderers/common/Lighting.js +5 -21
  417. package/src/renderers/common/Pipelines.js +40 -7
  418. package/src/renderers/common/PostProcessing.js +8 -206
  419. package/src/renderers/common/ReadbackBuffer.js +78 -0
  420. package/src/renderers/common/RenderBundle.js +3 -1
  421. package/src/renderers/common/RenderBundles.js +7 -3
  422. package/src/renderers/common/RenderContext.js +16 -0
  423. package/src/renderers/common/RenderContexts.js +33 -49
  424. package/src/renderers/common/RenderLists.js +2 -1
  425. package/src/renderers/common/RenderObject.js +17 -5
  426. package/src/renderers/common/RenderObjectPipeline.js +40 -0
  427. package/src/renderers/common/RenderObjects.js +21 -5
  428. package/src/renderers/common/RenderPipeline.js +232 -17
  429. package/src/renderers/common/Renderer.js +481 -117
  430. package/src/renderers/common/Sampler.js +4 -4
  431. package/src/renderers/common/StorageBuffer.js +13 -1
  432. package/src/renderers/common/Textures.js +89 -4
  433. package/src/renderers/common/TimestampQueryPool.js +5 -3
  434. package/src/renderers/common/Uniform.js +8 -0
  435. package/src/renderers/common/UniformsGroup.js +62 -1
  436. package/src/renderers/common/XRManager.js +37 -29
  437. package/src/renderers/common/extras/PMREMGenerator.js +25 -23
  438. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  439. package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +242 -99
  440. package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
  441. package/src/renderers/common/nodes/NodeUniformBuffer.js +52 -0
  442. package/src/renderers/shaders/DFGLUTData.js +19 -34
  443. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
  444. package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
  445. package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
  446. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
  447. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
  448. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +0 -1
  449. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +8 -12
  450. package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +80 -0
  451. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +13 -2
  452. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
  453. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
  454. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +2 -0
  455. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
  456. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +112 -53
  457. package/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js +7 -0
  458. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
  459. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +0 -1
  460. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +225 -186
  461. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +12 -2
  462. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
  463. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  464. package/src/renderers/shaders/ShaderChunk.js +5 -3
  465. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +1 -2
  466. package/src/renderers/shaders/ShaderLib/depth.glsl.js +3 -0
  467. package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +1 -2
  468. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
  469. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
  470. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
  471. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
  472. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
  473. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
  474. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
  475. package/src/renderers/shaders/ShaderLib.js +7 -6
  476. package/src/renderers/shaders/UniformsLib.js +7 -5
  477. package/src/renderers/shaders/UniformsUtils.js +27 -5
  478. package/src/renderers/webgl/WebGLAnimation.js +2 -1
  479. package/src/renderers/webgl/WebGLBackground.js +15 -15
  480. package/src/renderers/webgl/WebGLBindingStates.js +99 -27
  481. package/src/renderers/webgl/WebGLBufferRenderer.js +0 -32
  482. package/src/renderers/webgl/WebGLCapabilities.js +9 -4
  483. package/src/renderers/webgl/WebGLEnvironments.js +228 -0
  484. package/src/renderers/webgl/WebGLGeometries.js +10 -7
  485. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +0 -32
  486. package/src/renderers/webgl/WebGLLights.js +18 -1
  487. package/src/renderers/webgl/WebGLMaterials.js +24 -13
  488. package/src/renderers/webgl/WebGLObjects.js +3 -1
  489. package/src/renderers/webgl/WebGLOutput.js +270 -0
  490. package/src/renderers/webgl/WebGLProgram.js +49 -109
  491. package/src/renderers/webgl/WebGLPrograms.js +63 -51
  492. package/src/renderers/webgl/WebGLRenderLists.js +15 -0
  493. package/src/renderers/webgl/WebGLRenderStates.js +13 -2
  494. package/src/renderers/webgl/WebGLShadowMap.js +188 -24
  495. package/src/renderers/webgl/WebGLState.js +75 -37
  496. package/src/renderers/webgl/WebGLTextures.js +215 -54
  497. package/src/renderers/webgl/WebGLUniforms.js +40 -3
  498. package/src/renderers/webgl/WebGLUniformsGroups.js +19 -0
  499. package/src/renderers/webgl/WebGLUtils.js +6 -2
  500. package/src/renderers/webgl-fallback/WebGLBackend.js +253 -82
  501. package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +0 -41
  502. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +173 -74
  503. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +53 -19
  504. package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +25 -0
  505. package/src/renderers/webgl-fallback/utils/WebGLState.js +223 -6
  506. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +68 -53
  507. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +10 -10
  508. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +6 -2
  509. package/src/renderers/webgpu/WebGPUBackend.js +260 -140
  510. package/src/renderers/webgpu/WebGPURenderer.js +2 -1
  511. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +366 -90
  512. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +107 -34
  513. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +357 -200
  514. package/src/renderers/webgpu/utils/WebGPUCapabilities.js +48 -0
  515. package/src/renderers/webgpu/utils/WebGPUConstants.js +10 -0
  516. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +61 -23
  517. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +152 -200
  518. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +156 -59
  519. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +7 -7
  520. package/src/renderers/webgpu/utils/WebGPUUtils.js +33 -11
  521. package/src/renderers/webxr/WebXRController.js +12 -0
  522. package/src/renderers/webxr/WebXRManager.js +4 -2
  523. package/src/textures/CubeDepthTexture.js +76 -0
  524. package/src/textures/HTMLTexture.js +74 -0
  525. package/src/textures/Source.js +2 -2
  526. package/src/textures/Texture.js +16 -5
  527. package/src/utils.js +280 -3
  528. package/examples/jsm/materials/MeshGouraudMaterial.js +0 -434
  529. package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
  530. package/examples/jsm/shaders/GodRaysShader.js +0 -333
  531. package/src/nodes/accessors/SceneNode.js +0 -145
  532. package/src/nodes/code/ScriptableNode.js +0 -726
  533. package/src/nodes/code/ScriptableValueNode.js +0 -253
  534. package/src/nodes/display/PosterizeNode.js +0 -65
  535. package/src/nodes/functions/BSDF/DFGApprox.js +0 -71
  536. package/src/nodes/utils/RemapNode.js +0 -125
  537. package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
  538. package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
  539. package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
@@ -0,0 +1,99 @@
1
+ import { Color, Node, Vector3 } from 'three/webgpu';
2
+ import { Loop, NodeUpdateType, mix, normalWorld, renderGroup, uniform, uniformArray } from 'three/tsl';
3
+
4
+ const warn = ( message ) => {
5
+
6
+ console.warn( `THREE.HemisphereLightDataNode: ${ message }` );
7
+
8
+ };
9
+
10
+ /**
11
+ * Batched data node for hemisphere lights in dynamic lighting mode.
12
+ *
13
+ * @augments Node
14
+ */
15
+ class HemisphereLightDataNode extends Node {
16
+
17
+ static get type() {
18
+
19
+ return 'HemisphereLightDataNode';
20
+
21
+ }
22
+
23
+ constructor( maxCount = 4 ) {
24
+
25
+ super();
26
+
27
+ this.maxCount = maxCount;
28
+ this._lights = [];
29
+ this._skyColors = [];
30
+ this._groundColors = [];
31
+ this._directions = [];
32
+
33
+ for ( let i = 0; i < maxCount; i ++ ) {
34
+
35
+ this._skyColors.push( new Color() );
36
+ this._groundColors.push( new Color() );
37
+ this._directions.push( new Vector3() );
38
+
39
+ }
40
+
41
+ this.skyColorsNode = uniformArray( this._skyColors, 'color' ).setGroup( renderGroup );
42
+ this.groundColorsNode = uniformArray( this._groundColors, 'color' ).setGroup( renderGroup );
43
+ this.directionsNode = uniformArray( this._directions, 'vec3' ).setGroup( renderGroup );
44
+ this.countNode = uniform( 0, 'int' ).setGroup( renderGroup );
45
+ this.updateType = NodeUpdateType.RENDER;
46
+
47
+ }
48
+
49
+ setLights( lights ) {
50
+
51
+ if ( lights.length > this.maxCount ) {
52
+
53
+ warn( `${ lights.length } lights exceed the configured max of ${ this.maxCount }. Excess lights are ignored.` );
54
+
55
+ }
56
+
57
+ this._lights = lights;
58
+
59
+ return this;
60
+
61
+ }
62
+
63
+ update() {
64
+
65
+ const count = Math.min( this._lights.length, this.maxCount );
66
+
67
+ this.countNode.value = count;
68
+
69
+ for ( let i = 0; i < count; i ++ ) {
70
+
71
+ const light = this._lights[ i ];
72
+
73
+ this._skyColors[ i ].copy( light.color ).multiplyScalar( light.intensity );
74
+ this._groundColors[ i ].copy( light.groundColor ).multiplyScalar( light.intensity );
75
+ this._directions[ i ].setFromMatrixPosition( light.matrixWorld ).normalize();
76
+
77
+ }
78
+
79
+ }
80
+
81
+ setup( builder ) {
82
+
83
+ Loop( this.countNode, ( { i } ) => {
84
+
85
+ const skyColor = this.skyColorsNode.element( i );
86
+ const groundColor = this.groundColorsNode.element( i );
87
+ const lightDirection = this.directionsNode.element( i );
88
+ const hemiDiffuseWeight = normalWorld.dot( lightDirection ).mul( 0.5 ).add( 0.5 );
89
+ const irradiance = mix( groundColor, skyColor, hemiDiffuseWeight );
90
+
91
+ builder.context.irradiance.addAssign( irradiance );
92
+
93
+ } );
94
+
95
+ }
96
+
97
+ }
98
+
99
+ export default HemisphereLightDataNode;
@@ -0,0 +1,134 @@
1
+ import { Color, Node, Vector3, Vector4 } from 'three/webgpu';
2
+ import { Loop, NodeUpdateType, getDistanceAttenuation, positionView, renderGroup, uniform, uniformArray, vec3 } from 'three/tsl';
3
+
4
+ const _position = /*@__PURE__*/ new Vector3();
5
+
6
+ const warn = ( message ) => {
7
+
8
+ console.warn( `THREE.PointLightDataNode: ${ message }` );
9
+
10
+ };
11
+
12
+ /**
13
+ * Batched data node for point lights in dynamic lighting mode.
14
+ *
15
+ * @augments Node
16
+ */
17
+ class PointLightDataNode extends Node {
18
+
19
+ static get type() {
20
+
21
+ return 'PointLightDataNode';
22
+
23
+ }
24
+
25
+ constructor( maxCount = 16 ) {
26
+
27
+ super();
28
+
29
+ this.maxCount = maxCount;
30
+ this._lights = [];
31
+ this._colors = [];
32
+ this._positionsAndCutoff = [];
33
+ this._decays = [];
34
+
35
+ for ( let i = 0; i < maxCount; i ++ ) {
36
+
37
+ this._colors.push( new Color() );
38
+ this._positionsAndCutoff.push( new Vector4() );
39
+ this._decays.push( new Vector4() );
40
+
41
+ }
42
+
43
+ this.colorsNode = uniformArray( this._colors, 'color' ).setGroup( renderGroup );
44
+ this.positionsAndCutoffNode = uniformArray( this._positionsAndCutoff, 'vec4' ).setGroup( renderGroup );
45
+ this.decaysNode = uniformArray( this._decays, 'vec4' ).setGroup( renderGroup );
46
+ this.countNode = uniform( 0, 'int' ).setGroup( renderGroup );
47
+ this.updateType = NodeUpdateType.RENDER;
48
+
49
+ }
50
+
51
+ setLights( lights ) {
52
+
53
+ if ( lights.length > this.maxCount ) {
54
+
55
+ warn( `${ lights.length } lights exceed the configured max of ${ this.maxCount }. Excess lights are ignored.` );
56
+
57
+ }
58
+
59
+ this._lights = lights;
60
+
61
+ return this;
62
+
63
+ }
64
+
65
+ update( { camera } ) {
66
+
67
+ const count = Math.min( this._lights.length, this.maxCount );
68
+
69
+ this.countNode.value = count;
70
+
71
+ for ( let i = 0; i < count; i ++ ) {
72
+
73
+ const light = this._lights[ i ];
74
+
75
+ this._colors[ i ].copy( light.color ).multiplyScalar( light.intensity );
76
+
77
+ _position.setFromMatrixPosition( light.matrixWorld );
78
+ _position.applyMatrix4( camera.matrixWorldInverse );
79
+
80
+ const positionAndCutoff = this._positionsAndCutoff[ i ];
81
+ positionAndCutoff.x = _position.x;
82
+ positionAndCutoff.y = _position.y;
83
+ positionAndCutoff.z = _position.z;
84
+ positionAndCutoff.w = light.distance;
85
+
86
+ this._decays[ i ].x = light.decay;
87
+
88
+ }
89
+
90
+ }
91
+
92
+ setup( builder ) {
93
+
94
+ const surfacePosition = builder.context.positionView || positionView;
95
+ const { lightingModel, reflectedLight } = builder.context;
96
+ const dynDiffuse = vec3( 0 ).toVar( 'dynPointDiffuse' );
97
+ const dynSpecular = vec3( 0 ).toVar( 'dynPointSpecular' );
98
+
99
+ Loop( this.countNode, ( { i } ) => {
100
+
101
+ const positionAndCutoff = this.positionsAndCutoffNode.element( i );
102
+ const lightViewPosition = positionAndCutoff.xyz;
103
+ const cutoffDistance = positionAndCutoff.w;
104
+ const decayExponent = this.decaysNode.element( i ).x;
105
+
106
+ const lightVector = lightViewPosition.sub( surfacePosition ).toVar();
107
+ const lightDirection = lightVector.normalize().toVar();
108
+ const lightDistance = lightVector.length();
109
+
110
+ const attenuation = getDistanceAttenuation( {
111
+ lightDistance,
112
+ cutoffDistance,
113
+ decayExponent
114
+ } );
115
+
116
+ const lightColor = this.colorsNode.element( i ).mul( attenuation ).toVar();
117
+
118
+ lightingModel.direct( {
119
+ lightDirection,
120
+ lightColor,
121
+ lightNode: { light: {}, shadowNode: null },
122
+ reflectedLight: { directDiffuse: dynDiffuse, directSpecular: dynSpecular }
123
+ }, builder );
124
+
125
+ } );
126
+
127
+ reflectedLight.directDiffuse.addAssign( dynDiffuse );
128
+ reflectedLight.directSpecular.addAssign( dynSpecular );
129
+
130
+ }
131
+
132
+ }
133
+
134
+ export default PointLightDataNode;
@@ -0,0 +1,161 @@
1
+ import { Color, Node, Vector3, Vector4 } from 'three/webgpu';
2
+ import { Loop, NodeUpdateType, getDistanceAttenuation, positionView, renderGroup, smoothstep, uniform, uniformArray, vec3 } from 'three/tsl';
3
+
4
+ const _lightPosition = /*@__PURE__*/ new Vector3();
5
+ const _targetPosition = /*@__PURE__*/ new Vector3();
6
+
7
+ const warn = ( message ) => {
8
+
9
+ console.warn( `THREE.SpotLightDataNode: ${ message }` );
10
+
11
+ };
12
+
13
+ /**
14
+ * Batched data node for simple spot lights in dynamic lighting mode.
15
+ *
16
+ * Projected spot lights keep the default per-light path.
17
+ *
18
+ * @augments Node
19
+ */
20
+ class SpotLightDataNode extends Node {
21
+
22
+ static get type() {
23
+
24
+ return 'SpotLightDataNode';
25
+
26
+ }
27
+
28
+ constructor( maxCount = 16 ) {
29
+
30
+ super();
31
+
32
+ this.maxCount = maxCount;
33
+ this._lights = [];
34
+ this._colors = [];
35
+ this._positionsAndCutoff = [];
36
+ this._directionsAndDecay = [];
37
+ this._cones = [];
38
+
39
+ for ( let i = 0; i < maxCount; i ++ ) {
40
+
41
+ this._colors.push( new Color() );
42
+ this._positionsAndCutoff.push( new Vector4() );
43
+ this._directionsAndDecay.push( new Vector4() );
44
+ this._cones.push( new Vector4() );
45
+
46
+ }
47
+
48
+ this.colorsNode = uniformArray( this._colors, 'color' ).setGroup( renderGroup );
49
+ this.positionsAndCutoffNode = uniformArray( this._positionsAndCutoff, 'vec4' ).setGroup( renderGroup );
50
+ this.directionsAndDecayNode = uniformArray( this._directionsAndDecay, 'vec4' ).setGroup( renderGroup );
51
+ this.conesNode = uniformArray( this._cones, 'vec4' ).setGroup( renderGroup );
52
+ this.countNode = uniform( 0, 'int' ).setGroup( renderGroup );
53
+ this.updateType = NodeUpdateType.RENDER;
54
+
55
+ }
56
+
57
+ setLights( lights ) {
58
+
59
+ if ( lights.length > this.maxCount ) {
60
+
61
+ warn( `${ lights.length } lights exceed the configured max of ${ this.maxCount }. Excess lights are ignored.` );
62
+
63
+ }
64
+
65
+ this._lights = lights;
66
+
67
+ return this;
68
+
69
+ }
70
+
71
+ update( { camera } ) {
72
+
73
+ const count = Math.min( this._lights.length, this.maxCount );
74
+
75
+ this.countNode.value = count;
76
+
77
+ for ( let i = 0; i < count; i ++ ) {
78
+
79
+ const light = this._lights[ i ];
80
+
81
+ this._colors[ i ].copy( light.color ).multiplyScalar( light.intensity );
82
+
83
+ _lightPosition.setFromMatrixPosition( light.matrixWorld );
84
+ _lightPosition.applyMatrix4( camera.matrixWorldInverse );
85
+
86
+ const positionAndCutoff = this._positionsAndCutoff[ i ];
87
+ positionAndCutoff.x = _lightPosition.x;
88
+ positionAndCutoff.y = _lightPosition.y;
89
+ positionAndCutoff.z = _lightPosition.z;
90
+ positionAndCutoff.w = light.distance;
91
+
92
+ _lightPosition.setFromMatrixPosition( light.matrixWorld );
93
+ _targetPosition.setFromMatrixPosition( light.target.matrixWorld );
94
+ _lightPosition.sub( _targetPosition ).transformDirection( camera.matrixWorldInverse );
95
+
96
+ const directionAndDecay = this._directionsAndDecay[ i ];
97
+ directionAndDecay.x = _lightPosition.x;
98
+ directionAndDecay.y = _lightPosition.y;
99
+ directionAndDecay.z = _lightPosition.z;
100
+ directionAndDecay.w = light.decay;
101
+
102
+ const cone = this._cones[ i ];
103
+ cone.x = Math.cos( light.angle );
104
+ cone.y = Math.cos( light.angle * ( 1 - light.penumbra ) );
105
+
106
+ }
107
+
108
+ }
109
+
110
+ setup( builder ) {
111
+
112
+ const surfacePosition = builder.context.positionView || positionView;
113
+ const { lightingModel, reflectedLight } = builder.context;
114
+ const dynDiffuse = vec3( 0 ).toVar( 'dynSpotDiffuse' );
115
+ const dynSpecular = vec3( 0 ).toVar( 'dynSpotSpecular' );
116
+
117
+ Loop( this.countNode, ( { i } ) => {
118
+
119
+ const positionAndCutoff = this.positionsAndCutoffNode.element( i );
120
+ const lightViewPosition = positionAndCutoff.xyz;
121
+ const cutoffDistance = positionAndCutoff.w;
122
+
123
+ const directionAndDecay = this.directionsAndDecayNode.element( i );
124
+ const spotDirection = directionAndDecay.xyz;
125
+ const decayExponent = directionAndDecay.w;
126
+
127
+ const cone = this.conesNode.element( i );
128
+ const coneCos = cone.x;
129
+ const penumbraCos = cone.y;
130
+
131
+ const lightVector = lightViewPosition.sub( surfacePosition ).toVar();
132
+ const lightDirection = lightVector.normalize().toVar();
133
+ const lightDistance = lightVector.length();
134
+
135
+ const angleCos = lightDirection.dot( spotDirection );
136
+ const spotAttenuation = smoothstep( coneCos, penumbraCos, angleCos );
137
+ const distanceAttenuation = getDistanceAttenuation( {
138
+ lightDistance,
139
+ cutoffDistance,
140
+ decayExponent
141
+ } );
142
+
143
+ const lightColor = this.colorsNode.element( i ).mul( spotAttenuation ).mul( distanceAttenuation ).toVar();
144
+
145
+ lightingModel.direct( {
146
+ lightDirection,
147
+ lightColor,
148
+ lightNode: { light: {}, shadowNode: null },
149
+ reflectedLight: { directDiffuse: dynDiffuse, directSpecular: dynSpecular }
150
+ }, builder );
151
+
152
+ } );
153
+
154
+ reflectedLight.directDiffuse.addAssign( dynDiffuse );
155
+ reflectedLight.directSpecular.addAssign( dynSpecular );
156
+
157
+ }
158
+
159
+ }
160
+
161
+ export default SpotLightDataNode;
@@ -1,5 +1,5 @@
1
- import { TextureLoader } from 'three';
2
- import { Fn, int, ivec2, textureLoad } from 'three/tsl';
1
+ import { ImageBitmapLoader, Texture } from 'three';
2
+ import { Fn, int, ivec2, textureLoad, screenUV, screenSize, mod, floor, float, vec3 } from 'three/tsl';
3
3
 
4
4
  /**
5
5
  * @module Bayer
@@ -25,10 +25,60 @@ export const bayer16 = Fn( ( [ uv ] ) => {
25
25
 
26
26
  const bayer16Base64 = 'data:image/png;base64,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';
27
27
 
28
- bayer16Texture = new TextureLoader().load( bayer16Base64 );
28
+ bayer16Texture = new Texture();
29
+ const loader = new ImageBitmapLoader();
30
+
31
+ loader.setOptions( { imageOrientation: 'flipY', premultiplyAlpha: 'none' } );
32
+
33
+ loader.load( bayer16Base64, ( imageBitmap ) => {
34
+
35
+ bayer16Texture.image = imageBitmap;
36
+ bayer16Texture.flipY = false;
37
+ bayer16Texture.needsUpdate = true;
38
+
39
+ } );
29
40
 
30
41
  }
31
42
 
32
43
  return textureLoad( bayer16Texture, ivec2( uv ).mod( int( 16 ) ) );
33
44
 
34
45
  } );
46
+
47
+ /**
48
+ * This TSL function applies Bayer dithering to a color input. It uses a 4x4 Bayer matrix
49
+ * pattern to add structured noise before color quantization, which helps reduce visible
50
+ * color banding when limiting color depth.
51
+ *
52
+ * @tsl
53
+ * @function
54
+ * @param {Node<vec3>} color - The input color to apply dithering to.
55
+ * @param {Node<float>} [steps=32] - The number of color steps per channel.
56
+ * @return {Node<vec3>} The dithered color ready for quantization.
57
+ *
58
+ * @example
59
+ * // Apply dithering with posterize
60
+ * const ditheredColor = bayerDither( inputColor, 32 );
61
+ * const finalColor = posterize( ditheredColor, 32 );
62
+ */
63
+ export const bayerDither = Fn( ( [ color, steps = float( 32.0 ) ] ) => {
64
+
65
+ const screenPos = screenUV.mul( screenSize );
66
+ const x = mod( floor( screenPos.x ), float( 4.0 ) );
67
+ const y = mod( floor( screenPos.y ), float( 4.0 ) );
68
+
69
+ // Simplified Bayer matrix approximation
70
+ const bayer = mod(
71
+ floor( x.add( 1.0 ) ).mul( floor( y.add( 1.0 ) ) ).mul( 17.0 ),
72
+ 16.0
73
+ ).div( 16.0 ).sub( 0.5 );
74
+
75
+ // Apply dither offset before quantization
76
+ const ditherOffset = bayer.div( steps );
77
+
78
+ return vec3(
79
+ color.r.add( ditherOffset ),
80
+ color.g.add( ditherOffset ),
81
+ color.b.add( ditherOffset )
82
+ );
83
+
84
+ } );
@@ -286,8 +286,7 @@ function mergeGeometries( geometries, useGroups = false ) {
286
286
  for ( const name in morphAttributes ) {
287
287
 
288
288
  const numMorphTargets = morphAttributes[ name ][ 0 ].length;
289
-
290
- if ( numMorphTargets === 0 ) break;
289
+ if ( numMorphTargets === 0 ) continue;
291
290
 
292
291
  mergedGeometry.morphAttributes = mergedGeometry.morphAttributes || {};
293
292
  mergedGeometry.morphAttributes[ name ] = [];
@@ -1021,7 +1020,7 @@ function computeMorphedAttributes( object ) {
1021
1020
  const morphPosition = geometry.morphAttributes.position;
1022
1021
  const morphTargetsRelative = geometry.morphTargetsRelative;
1023
1022
  const normalAttribute = geometry.attributes.normal;
1024
- const morphNormal = geometry.morphAttributes.position;
1023
+ const morphNormal = geometry.morphAttributes.normal;
1025
1024
 
1026
1025
  const groups = geometry.groups;
1027
1026
  const drawRange = geometry.drawRange;
@@ -0,0 +1,76 @@
1
+ import { MathUtils, SRGBColorSpace } from 'three';
2
+
3
+ /**
4
+ * @module ColorUtils
5
+ * @three_import import * as ColorUtils from 'three/addons/utils/ColorUtils.js';
6
+ */
7
+
8
+ /**
9
+ * Sets the given color from a color temperature in Kelvin.
10
+ *
11
+ * Converts a correlated color temperature (CTT) to an approximate sRGB color
12
+ * using Tanner Helland's algorithm. Useful for physically-based lighting
13
+ * setups — e.g. candle flame (~1900K), tungsten bulb (~3200K), daylight
14
+ * (~6500K), or clear blue sky (~10000K). Values outside [1000, 40000] are
15
+ * clamped.
16
+ *
17
+ * Reference: https://tannerhelland.com/2012/09/18/convert-temperature-rgb-algorithm-code.html
18
+ *
19
+ * @param {Color} color - The color to set.
20
+ * @param {number} kelvin - Color temperature in Kelvin. Clamped to [1000, 40000].
21
+ * @return {Color} The updated color.
22
+ */
23
+ function setKelvin( color, kelvin ) {
24
+
25
+ // Algorithm by Tanner Helland (2012). Inputs are divided by 100.
26
+ const temp = MathUtils.clamp( kelvin, 1000, 40000 ) / 100;
27
+
28
+ let r, g, b;
29
+
30
+ // Red channel
31
+ if ( temp <= 66 ) {
32
+
33
+ r = 255;
34
+
35
+ } else {
36
+
37
+ r = 329.698727446 * Math.pow( temp - 60, - 0.1332047592 );
38
+
39
+ }
40
+
41
+ // Green channel
42
+ if ( temp <= 66 ) {
43
+
44
+ g = 99.4708025861 * Math.log( temp ) - 161.1195681661;
45
+
46
+ } else {
47
+
48
+ g = 288.1221695283 * Math.pow( temp - 60, - 0.0755148492 );
49
+
50
+ }
51
+
52
+ // Blue channel
53
+ if ( temp >= 66 ) {
54
+
55
+ b = 255;
56
+
57
+ } else if ( temp <= 19 ) {
58
+
59
+ b = 0;
60
+
61
+ } else {
62
+
63
+ b = 138.5177312231 * Math.log( temp - 10 ) - 305.0447927307;
64
+
65
+ }
66
+
67
+ return color.setRGB(
68
+ MathUtils.clamp( r, 0, 255 ) / 255,
69
+ MathUtils.clamp( g, 0, 255 ) / 255,
70
+ MathUtils.clamp( b, 0, 255 ) / 255,
71
+ SRGBColorSpace
72
+ );
73
+
74
+ }
75
+
76
+ export { setKelvin };
@@ -119,7 +119,7 @@ class LDrawUtils {
119
119
 
120
120
  object.traverse( c => {
121
121
 
122
- if ( c.isMesh | c.isLineSegments ) {
122
+ if ( c.isMesh || c.isLineSegments ) {
123
123
 
124
124
  const elemSize = c.isMesh ? 3 : 2;
125
125
 
@@ -6,10 +6,8 @@ import {
6
6
  OrthographicCamera,
7
7
  PlaneGeometry,
8
8
  Scene,
9
- ShaderMaterial,
10
- UniformsUtils
9
+ ShaderMaterial
11
10
  } from 'three';
12
- import { UnpackDepthRGBAShader } from '../shaders/UnpackDepthRGBAShader.js';
13
11
 
14
12
  /**
15
13
  * This is a helper for visualising a given light's shadow map.
@@ -57,13 +55,29 @@ class ShadowMapViewer {
57
55
  const scene = new Scene();
58
56
 
59
57
  //HUD for shadow map
60
- const shader = UnpackDepthRGBAShader;
61
-
62
- const uniforms = UniformsUtils.clone( shader.uniforms );
63
58
  const material = new ShaderMaterial( {
64
- uniforms: uniforms,
65
- vertexShader: shader.vertexShader,
66
- fragmentShader: shader.fragmentShader
59
+ uniforms: {
60
+ tDiffuse: { value: null },
61
+ opacity: { value: 1.0 }
62
+ },
63
+ vertexShader: /* glsl */`
64
+ varying vec2 vUv;
65
+ void main() {
66
+ vUv = uv;
67
+ gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
68
+ }`,
69
+ fragmentShader: /* glsl */`
70
+ uniform float opacity;
71
+ uniform sampler2D tDiffuse;
72
+ varying vec2 vUv;
73
+ void main() {
74
+ float depth = texture2D( tDiffuse, vUv ).r;
75
+ #ifdef USE_REVERSED_DEPTH_BUFFER
76
+ gl_FragColor = vec4( vec3( depth ), opacity );
77
+ #else
78
+ gl_FragColor = vec4( vec3( 1.0 - depth ), opacity );
79
+ #endif
80
+ }`
67
81
  } );
68
82
  const plane = new PlaneGeometry( frame.width, frame.height );
69
83
  const mesh = new Mesh( plane, material );
@@ -177,7 +191,7 @@ class ShadowMapViewer {
177
191
  //always end up with the scene's first added shadow casting light's shadowMap
178
192
  //in the shader
179
193
  //See: https://github.com/mrdoob/three.js/issues/5932
180
- uniforms.tDiffuse.value = light.shadow.map.texture;
194
+ material.uniforms.tDiffuse.value = light.shadow.map.texture;
181
195
 
182
196
  userAutoClearSetting = renderer.autoClear;
183
197
  renderer.autoClear = false; // To allow render overlay
@@ -9,7 +9,7 @@ import {
9
9
  Scene,
10
10
  DepthTexture,
11
11
  Vector2
12
- } from 'three';
12
+ } from 'three/webgpu';
13
13
  import { uv, uniform, textureLoad } from 'three/tsl';
14
14
 
15
15
  /**
@@ -27,11 +27,13 @@ function getBoneName( bone, options ) {
27
27
  }
28
28
 
29
29
  /**
30
- * Retargets the skeleton from the given source 3D object to the
31
- * target 3D object.
30
+ * Retargets the skeleton from the given source to the target.
32
31
  *
33
- * @param {Object3D} target - The target 3D object.
34
- * @param {Object3D} source - The source 3D object.
32
+ * Both `target` and `source` can be a 3D object with a skeleton property (e.g. a skinned mesh)
33
+ * or a {@link Skeleton} directly.
34
+ *
35
+ * @param {Object3D|Skeleton} target - The target object.
36
+ * @param {Object3D|Skeleton} source - The source object.
35
37
  * @param {module:SkeletonUtils~RetargetOptions} options - The options.
36
38
  */
37
39
  function retarget( target, source, options = {} ) {
@@ -210,11 +212,13 @@ function retarget( target, source, options = {} ) {
210
212
  }
211
213
 
212
214
  /**
213
- * Retargets the animation clip of the source object to the
214
- * target 3D object.
215
+ * Retargets the animation clip of the source to the target 3D object.
216
+ *
217
+ * The `source` can be a 3D object with a skeleton property (e.g. a skinned mesh)
218
+ * or a {@link Skeleton} directly.
215
219
  *
216
- * @param {Object3D} target - The target 3D object.
217
- * @param {Object3D} source - The source 3D object.
220
+ * @param {Object3D} target - The target 3D object. Must have a `skeleton` property.
221
+ * @param {Object3D|Skeleton} source - The source object.
218
222
  * @param {AnimationClip} clip - The animation clip.
219
223
  * @param {module:SkeletonUtils~RetargetOptions} options - The options.
220
224
  * @return {AnimationClip} The retargeted animation clip.
@@ -481,6 +485,8 @@ function parallelTraverse( a, b, callback ) {
481
485
  * @property {string} [hip='hip'] - The name of the source's hip bone.
482
486
  * @property {Vector3} [hipInfluence=(1,1,1)] - The hip influence.
483
487
  * @property {number} [scale=1] - The scale.
488
+ * @property {Object<string,Matrix4>} [localOffsets] - Per-bone local offset matrices, keyed by bone name.
489
+ * @property {Vector3} [hipPosition] - An additional position offset applied to the hip bone.
484
490
  **/
485
491
 
486
492
  export {
@@ -3,7 +3,7 @@ import {
3
3
  NodeMaterial,
4
4
  WebGPURenderer,
5
5
  CanvasTexture
6
- } from 'three';
6
+ } from 'three/webgpu';
7
7
  import { texture, uv } from 'three/tsl';
8
8
 
9
9
  /**