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,80 @@
1
+ import { abs, color, float, Fn, Loop, mix, nodeObject, perspectiveDepthToViewZ, reference, textureSize, uv, vec2, vec4, viewZToOrthographicDepth, int, If, array, ivec2 } from 'three/tsl';
2
+
3
+ /**
4
+ * Performs a depth-aware blend between a base scene and a secondary effect (like godrays).
5
+ * This function uses a Poisson disk sampling pattern to detect depth discontinuities
6
+ * in the neighborhood of the current pixel. If an edge is detected, it shifts the
7
+ * sampling coordinate for the blend node away from the edge to prevent light leaking/haloing.
8
+ *
9
+ * @param {Node} baseNode - The main scene/beauty pass texture node.
10
+ * @param {Node} blendNode - The effect to be blended (e.g., Godrays, Bloom).
11
+ * @param {Node} depthNode - The scene depth texture node.
12
+ * @param {Camera} camera - The camera used for the scene.
13
+ * @param {Object} [options={}] - Configuration for the blend effect.
14
+ * @param {Node|Color} [options.blendColor=Color(0xff0000)] - The color applied to the blend node.
15
+ * @param {Node<int> | number} [options.edgeRadius=2] - The search radius (in pixels) for detecting depth edges.
16
+ * @param {Node<float> | number} [options.edgeStrength=2] - How far to "push" the UV away from detected edges.
17
+ * @returns {Node<vec4>} The resulting blended color node.
18
+ */
19
+ export const depthAwareBlend = /*#__PURE__*/ Fn( ( [ baseNode, blendNode, depthNode, camera, options = {} ] ) => {
20
+
21
+ const uvNode = baseNode.uvNode || uv();
22
+
23
+ const cameraNear = reference( 'near', 'float', camera );
24
+ const cameraFar = reference( 'far', 'float', camera );
25
+
26
+ const blendColor = nodeObject( options.blendColor ) || color( 0xffffff );
27
+ const edgeRadius = nodeObject( options.edgeRadius ) || int( 2 );
28
+ const edgeStrength = nodeObject( options.edgeStrength ) || float( 2 );
29
+
30
+ const viewZ = perspectiveDepthToViewZ( depthNode, cameraNear, cameraFar );
31
+ const correctDepth = viewZToOrthographicDepth( viewZ, cameraNear, cameraFar );
32
+
33
+ const pushDir = vec2( 0.0 ).toVar();
34
+ const count = float( 0 ).toVar();
35
+
36
+ const resolution = ivec2( textureSize( baseNode ) ).toConst();
37
+ const pixelStep = vec2( 1 ).div( resolution );
38
+
39
+ const poissonDisk = array( [
40
+ vec2( 0.493393, 0.394269 ),
41
+ vec2( 0.798547, 0.885922 ),
42
+ vec2( 0.259143, 0.650754 ),
43
+ vec2( 0.605322, 0.023588 ),
44
+ vec2( - 0.574681, 0.137452 ),
45
+ vec2( - 0.430397, - 0.638423 ),
46
+ vec2( - 0.849487, - 0.366258 ),
47
+ vec2( 0.170621, - 0.569941 )
48
+ ] );
49
+
50
+ Loop( 8, ( { i } ) => {
51
+
52
+ const offset = poissonDisk.element( i ).mul( edgeRadius );
53
+
54
+ const sampleUv = uvNode.add( offset.mul( pixelStep ) );
55
+ const sampleDepth = depthNode.sample( sampleUv );
56
+
57
+ const sampleViewZ = perspectiveDepthToViewZ( sampleDepth, cameraNear, cameraFar );
58
+ const sampleLinearDepth = viewZToOrthographicDepth( sampleViewZ, cameraNear, cameraFar );
59
+
60
+ If( abs( sampleLinearDepth.sub( correctDepth ) ).lessThan( float( 0.05 ).mul( correctDepth ) ), () => {
61
+
62
+ pushDir.addAssign( offset );
63
+ count.addAssign( 1 );
64
+
65
+ } );
66
+
67
+ } );
68
+
69
+ count.assign( count.equal( 0 ).select( 1, count ) );
70
+
71
+ pushDir.divAssign( count ).normalize();
72
+
73
+ const sampleUv = pushDir.length().greaterThan( 0 ).select( uvNode.add( edgeStrength.mul( pushDir.div( resolution ) ) ), uvNode );
74
+
75
+ const bestChoice = blendNode.sample( sampleUv ).r;
76
+ const baseColor = baseNode.sample( uvNode );
77
+
78
+ return vec4( mix( baseColor, vec4( blendColor, 1 ), bestChoice ) );
79
+
80
+ } );
@@ -0,0 +1,68 @@
1
+ import { interleavedGradientNoise, Fn, vec2, vec4, mix, uv, Loop, premultiplyAlpha, unpremultiplyAlpha, int, float, nodeObject, convertToTexture, screenCoordinate } from 'three/tsl';
2
+
3
+ /**
4
+ * This TSL function blurs an image in a circular pattern, radiating from a configurable center point in screen space.
5
+ *
6
+ * Radial blurs can be used for different kind of effects like producing simple faked lighting effects also known as
7
+ * "light shafts". The major limitation of this specific usage is the center point can only be defined in 2D so the
8
+ * effect does not honor the depth of 3D objects. Consequently, it is not intended for physically correct lit scenes.
9
+ *
10
+ * @tsl
11
+ * @function
12
+ * @param {Node<vec4>} textureNode - The texture node that should be blurred.
13
+ * @param {Object} [options={}] - Additional options for the radial blur effect.
14
+ * @param {Node<vec2>} [options.center=vec2(0.5, 0.5)] - The center of the light in screen uvs.
15
+ * @param {Node<int>} [options.weight=float(0.9)] - Base weight factor for each sample in the range `[0,1]`.
16
+ * @param {Node<int>} [options.decay=float(0.95)] - Decreases the weight factor so each iteration adds less to the sum. Must be in the range `[0,1]`.
17
+ * If you increase the sample count, you have to increase this option as well to avoid a darking effect.
18
+ * @param {Node<int>} [options.count=int(32)] - The number if iterations. Should be in the range `[16,64]`.
19
+ * @param {Node<int>} [options.exposure=float(5)] - Exposure control of the blur.
20
+ * @return {Node<vec4>} The blurred texture node.
21
+ */
22
+ export const radialBlur = /*#__PURE__*/ Fn( ( [ textureNode, options = {} ] ) => {
23
+
24
+ textureNode = convertToTexture( textureNode );
25
+
26
+ const center = nodeObject( options.center ) || vec2( 0.5, 0.5 );
27
+ const weight = nodeObject( options.weight ) || float( 0.9 );
28
+ const decay = nodeObject( options.decay ) || float( 0.95 );
29
+ const count = nodeObject( options.count ) || int( 32 );
30
+ const exposure = nodeObject( options.exposure ) || float( 5 );
31
+ const premultipliedAlpha = options.premultipliedAlpha || false;
32
+
33
+ const tap = ( uv ) => {
34
+
35
+ const sample = textureNode.sample( uv );
36
+
37
+ return premultipliedAlpha ? premultiplyAlpha( sample ) : sample;
38
+
39
+ };
40
+
41
+ const sampleUv = vec2( textureNode.uvNode || uv() );
42
+
43
+ const base = tap( sampleUv ).toConst();
44
+ const blur = vec4().toVar();
45
+ const offset = center.sub( sampleUv ).div( count ).toConst();
46
+ const w = float( weight ).toVar();
47
+
48
+ const noise = interleavedGradientNoise( screenCoordinate );
49
+ sampleUv.addAssign( offset.mul( noise ) ); // mitigate banding
50
+
51
+ Loop( { start: int( 0 ), end: int( count ), type: 'int', condition: '<' }, () => {
52
+
53
+ sampleUv.addAssign( offset );
54
+ const sample = tap( sampleUv );
55
+
56
+ blur.addAssign( sample.mul( w ) );
57
+ w.mulAssign( decay );
58
+
59
+ } );
60
+
61
+ blur.divAssign( count );
62
+ blur.mulAssign( exposure );
63
+
64
+ const color = mix( blur, base.mul( 2 ), 0.5 );
65
+
66
+ return premultipliedAlpha ? unpremultiplyAlpha( color ) : color;
67
+
68
+ } );
@@ -0,0 +1,300 @@
1
+ import { LightsNode, NodeUtils, warn } from 'three/webgpu';
2
+ import { nodeObject } from 'three/tsl';
3
+
4
+ import AmbientLightDataNode from './data/AmbientLightDataNode.js';
5
+ import DirectionalLightDataNode from './data/DirectionalLightDataNode.js';
6
+ import PointLightDataNode from './data/PointLightDataNode.js';
7
+ import SpotLightDataNode from './data/SpotLightDataNode.js';
8
+ import HemisphereLightDataNode from './data/HemisphereLightDataNode.js';
9
+
10
+ const _lightNodeRef = /*@__PURE__*/ new WeakMap();
11
+ const _hashData = [];
12
+
13
+ const _lightTypeToDataNode = {
14
+ AmbientLight: AmbientLightDataNode,
15
+ DirectionalLight: DirectionalLightDataNode,
16
+ PointLight: PointLightDataNode,
17
+ SpotLight: SpotLightDataNode,
18
+ HemisphereLight: HemisphereLightDataNode
19
+ };
20
+
21
+ const _lightTypeToMaxProp = {
22
+ DirectionalLight: 'maxDirectionalLights',
23
+ PointLight: 'maxPointLights',
24
+ SpotLight: 'maxSpotLights',
25
+ HemisphereLight: 'maxHemisphereLights'
26
+ };
27
+
28
+ const sortLights = ( lights ) => lights.sort( ( a, b ) => a.id - b.id );
29
+
30
+ const isSpecialSpotLight = ( light ) => {
31
+
32
+ return light.isSpotLight === true && ( light.map !== null || light.colorNode !== undefined );
33
+
34
+ };
35
+
36
+ const canBatchLight = ( light ) => {
37
+
38
+ return light.isNode !== true &&
39
+ light.castShadow !== true &&
40
+ isSpecialSpotLight( light ) === false &&
41
+ _lightTypeToDataNode[ light.constructor.name ] !== undefined;
42
+
43
+ };
44
+
45
+ const getOrCreateLightNode = ( light, nodeLibrary ) => {
46
+
47
+ const lightNodeClass = nodeLibrary.getLightNodeClass( light.constructor );
48
+
49
+ if ( lightNodeClass === null ) {
50
+
51
+ warn( `DynamicLightsNode: Light node not found for ${ light.constructor.name }.` );
52
+ return null;
53
+
54
+ }
55
+
56
+ if ( _lightNodeRef.has( light ) === false ) {
57
+
58
+ _lightNodeRef.set( light, new lightNodeClass( light ) );
59
+
60
+ }
61
+
62
+ return _lightNodeRef.get( light );
63
+
64
+ };
65
+
66
+ /**
67
+ * A custom version of `LightsNode` that batches supported analytic lights into
68
+ * uniform arrays and loops.
69
+ *
70
+ * Unsupported lights, node lights, shadow-casting lights, and projected spot
71
+ * lights keep the default per-light path.
72
+ *
73
+ * @augments LightsNode
74
+ * @three_import import { DynamicLightsNode } from 'three/addons/tsl/lighting/DynamicLightsNode.js';
75
+ */
76
+ class DynamicLightsNode extends LightsNode {
77
+
78
+ static get type() {
79
+
80
+ return 'DynamicLightsNode';
81
+
82
+ }
83
+
84
+ /**
85
+ * Constructs a new dynamic lights node.
86
+ *
87
+ * @param {Object} [options={}] - Dynamic lighting configuration.
88
+ * @param {number} [options.maxDirectionalLights=8] - Maximum number of batched directional lights.
89
+ * @param {number} [options.maxPointLights=16] - Maximum number of batched point lights.
90
+ * @param {number} [options.maxSpotLights=16] - Maximum number of batched spot lights.
91
+ * @param {number} [options.maxHemisphereLights=4] - Maximum number of batched hemisphere lights.
92
+ */
93
+ constructor( options = {} ) {
94
+
95
+ super();
96
+
97
+ this.maxDirectionalLights = options.maxDirectionalLights !== undefined ? options.maxDirectionalLights : 8;
98
+ this.maxPointLights = options.maxPointLights !== undefined ? options.maxPointLights : 16;
99
+ this.maxSpotLights = options.maxSpotLights !== undefined ? options.maxSpotLights : 16;
100
+ this.maxHemisphereLights = options.maxHemisphereLights !== undefined ? options.maxHemisphereLights : 4;
101
+
102
+ this._dataNodes = new Map();
103
+
104
+ }
105
+
106
+ customCacheKey() {
107
+
108
+ const typeSet = new Set();
109
+
110
+ for ( let i = 0; i < this._lights.length; i ++ ) {
111
+
112
+ const light = this._lights[ i ];
113
+
114
+ if ( canBatchLight( light ) ) {
115
+
116
+ typeSet.add( light.constructor.name );
117
+
118
+ } else {
119
+
120
+ _hashData.push( light.id );
121
+ _hashData.push( light.castShadow ? 1 : 0 );
122
+
123
+ if ( light.isSpotLight === true ) {
124
+
125
+ const hashMap = light.map !== null ? light.map.id : - 1;
126
+ const hashColorNode = light.colorNode ? light.colorNode.getCacheKey() : - 1;
127
+
128
+ _hashData.push( hashMap, hashColorNode );
129
+
130
+ }
131
+
132
+ }
133
+
134
+ }
135
+
136
+ for ( const typeName of this._dataNodes.keys() ) {
137
+
138
+ typeSet.add( typeName );
139
+
140
+ }
141
+
142
+ for ( const typeName of [ ...typeSet ].sort() ) {
143
+
144
+ _hashData.push( NodeUtils.hashString( typeName ) );
145
+
146
+ }
147
+
148
+ const cacheKey = NodeUtils.hashArray( _hashData );
149
+
150
+ _hashData.length = 0;
151
+
152
+ return cacheKey;
153
+
154
+ }
155
+
156
+ setupLightsNode( builder ) {
157
+
158
+ const lightNodes = [];
159
+ const lightsByType = new Map();
160
+ const lights = sortLights( this._lights );
161
+ const nodeLibrary = builder.renderer.library;
162
+
163
+ for ( const light of lights ) {
164
+
165
+ if ( light.isNode === true ) {
166
+
167
+ lightNodes.push( nodeObject( light ) );
168
+ continue;
169
+
170
+ }
171
+
172
+ if ( canBatchLight( light ) ) {
173
+
174
+ const typeName = light.constructor.name;
175
+ const typeLights = lightsByType.get( typeName );
176
+
177
+ if ( typeLights === undefined ) {
178
+
179
+ lightsByType.set( typeName, [ light ] );
180
+
181
+ } else {
182
+
183
+ typeLights.push( light );
184
+
185
+ }
186
+
187
+ continue;
188
+
189
+ }
190
+
191
+ const lightNode = getOrCreateLightNode( light, nodeLibrary );
192
+
193
+ if ( lightNode !== null ) {
194
+
195
+ lightNodes.push( lightNode );
196
+
197
+ }
198
+
199
+ }
200
+
201
+ for ( const [ typeName, typeLights ] of lightsByType ) {
202
+
203
+ let dataNode = this._dataNodes.get( typeName );
204
+
205
+ if ( dataNode === undefined ) {
206
+
207
+ const DataNodeClass = _lightTypeToDataNode[ typeName ];
208
+ const maxProp = _lightTypeToMaxProp[ typeName ];
209
+ const maxCount = maxProp !== undefined ? this[ maxProp ] : undefined;
210
+
211
+ dataNode = maxCount !== undefined ? new DataNodeClass( maxCount ) : new DataNodeClass();
212
+
213
+ this._dataNodes.set( typeName, dataNode );
214
+
215
+ }
216
+
217
+ dataNode.setLights( typeLights );
218
+ lightNodes.push( dataNode );
219
+
220
+ }
221
+
222
+ for ( const [ typeName, dataNode ] of this._dataNodes ) {
223
+
224
+ if ( lightsByType.has( typeName ) === false ) {
225
+
226
+ dataNode.setLights( [] );
227
+ lightNodes.push( dataNode );
228
+
229
+ }
230
+
231
+ }
232
+
233
+ this._lightNodes = lightNodes;
234
+
235
+ }
236
+
237
+ setLights( lights ) {
238
+
239
+ super.setLights( lights );
240
+
241
+ if ( this._dataNodes.size > 0 ) {
242
+
243
+ this._updateDataNodeLights( lights );
244
+
245
+ }
246
+
247
+ return this;
248
+
249
+ }
250
+
251
+ _updateDataNodeLights( lights ) {
252
+
253
+ const lightsByType = new Map();
254
+
255
+ for ( const light of lights ) {
256
+
257
+ if ( canBatchLight( light ) === false ) continue;
258
+
259
+ const typeName = light.constructor.name;
260
+ const typeLights = lightsByType.get( typeName );
261
+
262
+ if ( typeLights === undefined ) {
263
+
264
+ lightsByType.set( typeName, [ light ] );
265
+
266
+ } else {
267
+
268
+ typeLights.push( light );
269
+
270
+ }
271
+
272
+ }
273
+
274
+ for ( const [ typeName, dataNode ] of this._dataNodes ) {
275
+
276
+ dataNode.setLights( lightsByType.get( typeName ) || [] );
277
+
278
+ }
279
+
280
+ }
281
+
282
+ get hasLights() {
283
+
284
+ return super.hasLights || this._dataNodes.size > 0;
285
+
286
+ }
287
+
288
+ }
289
+
290
+ export default DynamicLightsNode;
291
+
292
+ /**
293
+ * TSL function that creates a dynamic lights node.
294
+ *
295
+ * @tsl
296
+ * @function
297
+ * @param {Object} [options={}] - Dynamic lighting configuration.
298
+ * @return {DynamicLightsNode} The created dynamic lights node.
299
+ */
300
+ export const dynamicLights = ( options = {} ) => new DynamicLightsNode( options );
@@ -0,0 +1,61 @@
1
+ import { Color, Node } from 'three/webgpu';
2
+ import { NodeUpdateType, renderGroup, uniform } from 'three/tsl';
3
+
4
+ /**
5
+ * Batched data node for ambient lights in dynamic lighting mode.
6
+ *
7
+ * @augments Node
8
+ */
9
+ class AmbientLightDataNode extends Node {
10
+
11
+ static get type() {
12
+
13
+ return 'AmbientLightDataNode';
14
+
15
+ }
16
+
17
+ constructor() {
18
+
19
+ super();
20
+
21
+ this._color = new Color();
22
+ this._lights = [];
23
+
24
+ this.colorNode = uniform( this._color ).setGroup( renderGroup );
25
+ this.updateType = NodeUpdateType.RENDER;
26
+
27
+ }
28
+
29
+ setLights( lights ) {
30
+
31
+ this._lights = lights;
32
+
33
+ return this;
34
+
35
+ }
36
+
37
+ update() {
38
+
39
+ this._color.setScalar( 0 );
40
+
41
+ for ( let i = 0; i < this._lights.length; i ++ ) {
42
+
43
+ const light = this._lights[ i ];
44
+
45
+ this._color.r += light.color.r * light.intensity;
46
+ this._color.g += light.color.g * light.intensity;
47
+ this._color.b += light.color.b * light.intensity;
48
+
49
+ }
50
+
51
+ }
52
+
53
+ setup( builder ) {
54
+
55
+ builder.context.irradiance.addAssign( this.colorNode );
56
+
57
+ }
58
+
59
+ }
60
+
61
+ export default AmbientLightDataNode;
@@ -0,0 +1,111 @@
1
+ import { Color, Node, Vector3 } from 'three/webgpu';
2
+ import { Loop, NodeUpdateType, renderGroup, 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.DirectionalLightDataNode: ${ message }` );
10
+
11
+ };
12
+
13
+ /**
14
+ * Batched data node for directional lights in dynamic lighting mode.
15
+ *
16
+ * @augments Node
17
+ */
18
+ class DirectionalLightDataNode extends Node {
19
+
20
+ static get type() {
21
+
22
+ return 'DirectionalLightDataNode';
23
+
24
+ }
25
+
26
+ constructor( maxCount = 8 ) {
27
+
28
+ super();
29
+
30
+ this.maxCount = maxCount;
31
+ this._lights = [];
32
+ this._colors = [];
33
+ this._directions = [];
34
+
35
+ for ( let i = 0; i < maxCount; i ++ ) {
36
+
37
+ this._colors.push( new Color() );
38
+ this._directions.push( new Vector3() );
39
+
40
+ }
41
+
42
+ this.colorsNode = uniformArray( this._colors, '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( { camera } ) {
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._colors[ i ].copy( light.color ).multiplyScalar( light.intensity );
74
+
75
+ _lightPosition.setFromMatrixPosition( light.matrixWorld );
76
+ _targetPosition.setFromMatrixPosition( light.target.matrixWorld );
77
+
78
+ this._directions[ i ].subVectors( _lightPosition, _targetPosition ).transformDirection( camera.matrixWorldInverse );
79
+
80
+ }
81
+
82
+ }
83
+
84
+ setup( builder ) {
85
+
86
+ const { lightingModel, reflectedLight } = builder.context;
87
+ const dynDiffuse = vec3( 0 ).toVar( 'dynDirectionalDiffuse' );
88
+ const dynSpecular = vec3( 0 ).toVar( 'dynDirectionalSpecular' );
89
+
90
+ Loop( this.countNode, ( { i } ) => {
91
+
92
+ const lightColor = this.colorsNode.element( i ).toVar();
93
+ const lightDirection = this.directionsNode.element( i ).normalize().toVar();
94
+
95
+ lightingModel.direct( {
96
+ lightDirection,
97
+ lightColor,
98
+ lightNode: { light: {}, shadowNode: null },
99
+ reflectedLight: { directDiffuse: dynDiffuse, directSpecular: dynSpecular }
100
+ }, builder );
101
+
102
+ } );
103
+
104
+ reflectedLight.directDiffuse.addAssign( dynDiffuse );
105
+ reflectedLight.directSpecular.addAssign( dynSpecular );
106
+
107
+ }
108
+
109
+ }
110
+
111
+ export default DirectionalLightDataNode;