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
@@ -96,6 +96,53 @@ class AnalyticLightNode extends LightingNode {
96
96
  */
97
97
  this.updateType = NodeUpdateType.FRAME;
98
98
 
99
+ if ( light && light.shadow ) {
100
+
101
+ this._shadowDisposeListener = () => {
102
+
103
+ this.disposeShadow();
104
+
105
+ };
106
+
107
+ light.addEventListener( 'dispose', this._shadowDisposeListener );
108
+
109
+ }
110
+
111
+ }
112
+
113
+ dispose() {
114
+
115
+ if ( this._shadowDisposeListener ) {
116
+
117
+ this.light.removeEventListener( 'dispose', this._shadowDisposeListener );
118
+
119
+ }
120
+
121
+ super.dispose();
122
+
123
+ }
124
+
125
+ /**
126
+ * Frees internal resources related to shadows.
127
+ */
128
+ disposeShadow() {
129
+
130
+ if ( this.shadowNode !== null ) {
131
+
132
+ this.shadowNode.dispose();
133
+ this.shadowNode = null;
134
+
135
+ }
136
+
137
+ this.shadowColorNode = null;
138
+
139
+ if ( this.baseColorNode !== null ) {
140
+
141
+ this.colorNode = this.baseColorNode;
142
+ this.baseColorNode = null;
143
+
144
+ }
145
+
99
146
  }
100
147
 
101
148
  getHash() {
@@ -188,6 +235,12 @@ class AnalyticLightNode extends LightingNode {
188
235
 
189
236
  //
190
237
 
238
+ if ( builder.context.getShadow ) {
239
+
240
+ shadowColorNode = builder.context.getShadow( this, builder );
241
+
242
+ }
243
+
191
244
  this.colorNode = shadowColorNode;
192
245
 
193
246
  }
@@ -9,7 +9,7 @@ import { bentNormalView } from '../accessors/AccessorsUtils.js';
9
9
  import { pmremTexture } from '../pmrem/PMREMNode.js';
10
10
  import { materialEnvIntensity } from '../accessors/MaterialProperties.js';
11
11
 
12
- const _envNodeCache = new WeakMap();
12
+ const _rendererCache = new WeakMap();
13
13
 
14
14
  /**
15
15
  * Represents a physical model for Image-based lighting (IBL). The environment
@@ -55,13 +55,15 @@ class EnvironmentNode extends LightingNode {
55
55
 
56
56
  const value = ( envNode.isTextureNode ) ? envNode.value : material[ envNode.property ];
57
57
 
58
- let cacheEnvNode = _envNodeCache.get( value );
58
+ const cache = this._getPMREMNodeCache( builder.renderer );
59
+
60
+ let cacheEnvNode = cache.get( value );
59
61
 
60
62
  if ( cacheEnvNode === undefined ) {
61
63
 
62
64
  cacheEnvNode = pmremTexture( value );
63
65
 
64
- _envNodeCache.set( value, cacheEnvNode );
66
+ cache.set( value, cacheEnvNode );
65
67
 
66
68
  }
67
69
 
@@ -101,6 +103,29 @@ class EnvironmentNode extends LightingNode {
101
103
 
102
104
  }
103
105
 
106
+ /**
107
+ * Returns the PMREM node cache of the current renderer.
108
+ *
109
+ * @private
110
+ * @param {Renderer} renderer - The current renderer.
111
+ * @return {WeakMap} The node cache.
112
+ */
113
+ _getPMREMNodeCache( renderer ) {
114
+
115
+ let pmremCache = _rendererCache.get( renderer );
116
+
117
+ if ( pmremCache === undefined ) {
118
+
119
+ pmremCache = new WeakMap();
120
+
121
+ _rendererCache.set( renderer, pmremCache );
122
+
123
+ }
124
+
125
+ return pmremCache;
126
+
127
+ }
128
+
104
129
  }
105
130
 
106
131
  export default EnvironmentNode;
@@ -213,14 +213,12 @@ class LightsNode extends Node {
213
213
 
214
214
  if ( previousLightNodes !== null ) {
215
215
 
216
- lightNode = getLightNodeById( light.id, previousLightNodes ); // reuse existing light node
216
+ lightNode = getLightNodeById( light.id, previousLightNodes );
217
217
 
218
218
  }
219
219
 
220
220
  if ( lightNode === null ) {
221
221
 
222
- // find the corresponding node type for a given light
223
-
224
222
  const lightNodeClass = nodeLibrary.getLightNodeClass( light.constructor );
225
223
 
226
224
  if ( lightNodeClass === null ) {
@@ -230,23 +228,18 @@ class LightsNode extends Node {
230
228
 
231
229
  }
232
230
 
233
- let lightNode = null;
234
-
235
- if ( ! _lightsNodeRef.has( light ) ) {
236
-
237
- lightNode = nodeObject( new lightNodeClass( light ) );
238
- _lightsNodeRef.set( light, lightNode );
231
+ if ( _lightsNodeRef.has( light ) === false ) {
239
232
 
240
- } else {
241
-
242
- lightNode = _lightsNodeRef.get( light );
233
+ _lightsNodeRef.set( light, new lightNodeClass( light ) );
243
234
 
244
235
  }
245
236
 
246
- lightNodes.push( lightNode );
237
+ lightNode = _lightsNodeRef.get( light );
247
238
 
248
239
  }
249
240
 
241
+ lightNodes.push( lightNode );
242
+
250
243
  }
251
244
 
252
245
  }
@@ -325,8 +318,6 @@ class LightsNode extends Node {
325
318
 
326
319
  builder.lightsNode = this;
327
320
 
328
- //
329
-
330
321
  let outgoingLightNode = this.outgoingLightNode;
331
322
 
332
323
  const context = builder.context;
@@ -342,16 +333,10 @@ class LightsNode extends Node {
342
333
 
343
334
  const stack = builder.addStack();
344
335
 
345
- //
346
-
347
336
  properties.nodes = stack.nodes;
348
337
 
349
- //
350
-
351
338
  lightingModel.start( builder );
352
339
 
353
- //
354
-
355
340
  const { backdrop, backdropAlpha } = context;
356
341
  const { directDiffuse, directSpecular, indirectDiffuse, indirectSpecular } = context.reflectedLight;
357
342
 
@@ -376,12 +361,8 @@ class LightsNode extends Node {
376
361
 
377
362
  outgoingLightNode.assign( totalDiffuseNode.add( totalSpecularNode ) );
378
363
 
379
- //
380
-
381
364
  lightingModel.finish( builder );
382
365
 
383
- //
384
-
385
366
  outgoingLightNode = outgoingLightNode.bypass( builder.removeStack() );
386
367
 
387
368
  } else {
@@ -390,8 +371,6 @@ class LightsNode extends Node {
390
371
 
391
372
  }
392
373
 
393
- //
394
-
395
374
  builder.lightsNode = currentLightsNode;
396
375
 
397
376
  return outgoingLightNode;
@@ -450,4 +429,4 @@ export default LightsNode;
450
429
  * @param {Array<Light>} lights - An array of lights.
451
430
  * @return {LightsNode} The created lights node.
452
431
  */
453
- export const lights = ( lights = [] ) => nodeObject( new LightsNode() ).setLights( lights );
432
+ export const lights = ( lights = [] ) => new LightsNode().setLights( lights );
@@ -1,151 +1,134 @@
1
1
  import ShadowNode from './ShadowNode.js';
2
2
  import { uniform } from '../core/UniformNode.js';
3
- import { float, vec2, If, Fn, nodeObject } from '../tsl/TSLBase.js';
3
+ import { float, vec3, If, Fn } from '../tsl/TSLBase.js';
4
4
  import { reference } from '../accessors/ReferenceNode.js';
5
- import { texture } from '../accessors/TextureNode.js';
6
- import { max, abs, sign } from '../math/MathNode.js';
7
- import { sub, div } from '../math/OperatorNode.js';
5
+ import { cubeTexture } from '../accessors/CubeTextureNode.js';
8
6
  import { renderGroup } from '../core/UniformGroupNode.js';
9
- import { Vector2 } from '../../math/Vector2.js';
10
- import { Vector4 } from '../../math/Vector4.js';
7
+ import { Matrix4 } from '../../math/Matrix4.js';
8
+ import { Vector3 } from '../../math/Vector3.js';
11
9
  import { Color } from '../../math/Color.js';
12
- import { BasicShadowMap } from '../../constants.js';
10
+ import { BasicShadowMap, GreaterEqualCompare, LessEqualCompare, WebGPUCoordinateSystem } from '../../constants.js';
11
+ import { CubeDepthTexture } from '../../textures/CubeDepthTexture.js';
12
+ import { screenCoordinate } from '../display/ScreenNode.js';
13
+ import { interleavedGradientNoise, vogelDiskSample } from '../utils/PostProcessingUtils.js';
14
+ import { abs, normalize, cross } from '../math/MathNode.js';
15
+ import { viewZToPerspectiveDepth, viewZToReversedPerspectiveDepth } from '../display/ViewportDepthNode.js';
13
16
 
14
17
  const _clearColor = /*@__PURE__*/ new Color();
18
+ const _projScreenMatrix = /*@__PURE__*/ new Matrix4();
19
+ const _lightPositionWorld = /*@__PURE__*/ new Vector3();
20
+ const _lookTarget = /*@__PURE__*/ new Vector3();
21
+
22
+ // Cube map face directions and up vectors for point light shadows
23
+ // Face order: +X, -X, +Y, -Y, +Z, -Z
24
+ // WebGPU coordinate system - Y faces swapped to match texture sampling convention
25
+ const _cubeDirectionsWebGPU = [
26
+ /*@__PURE__*/ new Vector3( 1, 0, 0 ), /*@__PURE__*/ new Vector3( - 1, 0, 0 ), /*@__PURE__*/ new Vector3( 0, - 1, 0 ),
27
+ /*@__PURE__*/ new Vector3( 0, 1, 0 ), /*@__PURE__*/ new Vector3( 0, 0, 1 ), /*@__PURE__*/ new Vector3( 0, 0, - 1 )
28
+ ];
29
+
30
+ const _cubeUpsWebGPU = [
31
+ /*@__PURE__*/ new Vector3( 0, - 1, 0 ), /*@__PURE__*/ new Vector3( 0, - 1, 0 ), /*@__PURE__*/ new Vector3( 0, 0, - 1 ),
32
+ /*@__PURE__*/ new Vector3( 0, 0, 1 ), /*@__PURE__*/ new Vector3( 0, - 1, 0 ), /*@__PURE__*/ new Vector3( 0, - 1, 0 )
33
+ ];
34
+
35
+ // WebGL coordinate system - standard OpenGL convention
36
+ const _cubeDirectionsWebGL = [
37
+ /*@__PURE__*/ new Vector3( 1, 0, 0 ), /*@__PURE__*/ new Vector3( - 1, 0, 0 ), /*@__PURE__*/ new Vector3( 0, 1, 0 ),
38
+ /*@__PURE__*/ new Vector3( 0, - 1, 0 ), /*@__PURE__*/ new Vector3( 0, 0, 1 ), /*@__PURE__*/ new Vector3( 0, 0, - 1 )
39
+ ];
40
+
41
+ const _cubeUpsWebGL = [
42
+ /*@__PURE__*/ new Vector3( 0, - 1, 0 ), /*@__PURE__*/ new Vector3( 0, - 1, 0 ), /*@__PURE__*/ new Vector3( 0, 0, 1 ),
43
+ /*@__PURE__*/ new Vector3( 0, 0, - 1 ), /*@__PURE__*/ new Vector3( 0, - 1, 0 ), /*@__PURE__*/ new Vector3( 0, - 1, 0 )
44
+ ];
45
+
46
+ export const BasicPointShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, bd3D, dp } ) => {
47
+
48
+ return cubeTexture( depthTexture, bd3D ).compare( dp );
15
49
 
16
- // cubeToUV() maps a 3D direction vector suitable for cube texture mapping to a 2D
17
- // vector suitable for 2D texture mapping. This code uses the following layout for the
18
- // 2D texture:
19
- //
20
- // xzXZ
21
- // y Y
22
- //
23
- // Y - Positive y direction
24
- // y - Negative y direction
25
- // X - Positive x direction
26
- // x - Negative x direction
27
- // Z - Positive z direction
28
- // z - Negative z direction
29
- //
30
- // Source and test bed:
31
- // https://gist.github.com/tschw/da10c43c467ce8afd0c4
32
-
33
- export const cubeToUV = /*@__PURE__*/ Fn( ( [ pos, texelSizeY ] ) => {
34
-
35
- const v = pos.toVar();
36
-
37
- // Number of texels to avoid at the edge of each square
38
-
39
- const absV = abs( v );
40
-
41
- // Intersect unit cube
42
-
43
- const scaleToCube = div( 1.0, max( absV.x, max( absV.y, absV.z ) ) );
44
- absV.mulAssign( scaleToCube );
45
-
46
- // Apply scale to avoid seams
47
-
48
- // two texels less per square (one texel will do for NEAREST)
49
- v.mulAssign( scaleToCube.mul( texelSizeY.mul( 2 ).oneMinus() ) );
50
-
51
- // Unwrap
52
-
53
- // space: -1 ... 1 range for each square
54
- //
55
- // #X## dim := ( 4 , 2 )
56
- // # # center := ( 1 , 1 )
57
-
58
- const planar = vec2( v.xy ).toVar();
59
-
60
- const almostATexel = texelSizeY.mul( 1.5 );
61
- const almostOne = almostATexel.oneMinus();
62
-
63
- If( absV.z.greaterThanEqual( almostOne ), () => {
64
-
65
- If( v.z.greaterThan( 0.0 ), () => {
66
-
67
- planar.x.assign( sub( 4.0, v.x ) );
68
-
69
- } );
50
+ } );
70
51
 
71
- } ).ElseIf( absV.x.greaterThanEqual( almostOne ), () => {
52
+ /**
53
+ * A shadow filtering function for point lights using Vogel disk sampling and IGN.
54
+ *
55
+ * Uses 5 samples distributed via Vogel disk pattern in tangent space around the
56
+ * sample direction, rotated per-pixel using Interleaved Gradient Noise (IGN).
57
+ *
58
+ * @method
59
+ * @param {Object} inputs - The input parameter object.
60
+ * @param {CubeDepthTexture} inputs.depthTexture - A reference to the shadow cube map.
61
+ * @param {Node<vec3>} inputs.bd3D - The normalized direction from light to fragment.
62
+ * @param {Node<float>} inputs.dp - The depth value to compare against.
63
+ * @param {LightShadow} inputs.shadow - The light shadow.
64
+ * @return {Node<float>} The filtering result.
65
+ */
66
+ export const PointShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, bd3D, dp, shadow } ) => {
72
67
 
73
- const signX = sign( v.x );
74
- planar.x.assign( v.z.mul( signX ).add( signX.mul( 2.0 ) ) );
68
+ const radius = reference( 'radius', 'float', shadow ).setGroup( renderGroup );
69
+ const mapSize = reference( 'mapSize', 'vec2', shadow ).setGroup( renderGroup );
75
70
 
76
- } ).ElseIf( absV.y.greaterThanEqual( almostOne ), () => {
71
+ const texelSize = radius.div( mapSize.x );
77
72
 
78
- const signY = sign( v.y );
79
- planar.x.assign( v.x.add( signY.mul( 2.0 ) ).add( 2.0 ) );
80
- planar.y.assign( v.z.mul( signY ).sub( 2.0 ) );
73
+ // Build a tangent-space coordinate system for applying offsets
74
+ const absDir = abs( bd3D );
75
+ const tangent = normalize( cross( bd3D, absDir.x.greaterThan( absDir.z ).select( vec3( 0, 1, 0 ), vec3( 1, 0, 0 ) ) ) );
76
+ const bitangent = cross( bd3D, tangent );
81
77
 
82
- } );
78
+ // Use IGN to rotate sampling pattern per pixel (phi = IGN * 2π)
79
+ const phi = interleavedGradientNoise( screenCoordinate.xy ).mul( 6.28318530718 );
83
80
 
84
- // Transform to UV space
81
+ // 5 samples using Vogel disk distribution in tangent space
82
+ const sample0 = vogelDiskSample( 0, 5, phi );
83
+ const sample1 = vogelDiskSample( 1, 5, phi );
84
+ const sample2 = vogelDiskSample( 2, 5, phi );
85
+ const sample3 = vogelDiskSample( 3, 5, phi );
86
+ const sample4 = vogelDiskSample( 4, 5, phi );
85
87
 
86
- // scale := 0.5 / dim
87
- // translate := ( center + 0.5 ) / dim
88
- return vec2( 0.125, 0.25 ).mul( planar ).add( vec2( 0.375, 0.75 ) ).flipY();
88
+ return cubeTexture( depthTexture, bd3D.add( tangent.mul( sample0.x ).add( bitangent.mul( sample0.y ) ).mul( texelSize ) ) ).compare( dp )
89
+ .add( cubeTexture( depthTexture, bd3D.add( tangent.mul( sample1.x ).add( bitangent.mul( sample1.y ) ).mul( texelSize ) ) ).compare( dp ) )
90
+ .add( cubeTexture( depthTexture, bd3D.add( tangent.mul( sample2.x ).add( bitangent.mul( sample2.y ) ).mul( texelSize ) ) ).compare( dp ) )
91
+ .add( cubeTexture( depthTexture, bd3D.add( tangent.mul( sample3.x ).add( bitangent.mul( sample3.y ) ).mul( texelSize ) ) ).compare( dp ) )
92
+ .add( cubeTexture( depthTexture, bd3D.add( tangent.mul( sample4.x ).add( bitangent.mul( sample4.y ) ).mul( texelSize ) ) ).compare( dp ) )
93
+ .mul( 1.0 / 5.0 );
89
94
 
90
- } ).setLayout( {
91
- name: 'cubeToUV',
92
- type: 'vec2',
93
- inputs: [
94
- { name: 'pos', type: 'vec3' },
95
- { name: 'texelSizeY', type: 'float' }
96
- ]
97
95
  } );
98
96
 
99
- export const BasicPointShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, bd3D, dp, texelSize } ) => {
100
-
101
- return texture( depthTexture, cubeToUV( bd3D, texelSize.y ) ).compare( dp );
97
+ const pointShadowFilter = /*@__PURE__*/ Fn( ( { filterFn, depthTexture, shadowCoord, shadow }, builder ) => {
102
98
 
103
- } );
99
+ // for point lights, the uniform @vShadowCoord is re-purposed to hold
100
+ // the vector from the light to the world-space position of the fragment.
101
+ const shadowPosition = shadowCoord.xyz.toConst();
102
+ const shadowPositionAbs = shadowPosition.abs().toConst();
103
+ const viewZ = shadowPositionAbs.x.max( shadowPositionAbs.y ).max( shadowPositionAbs.z );
104
104
 
105
- export const PointShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, bd3D, dp, texelSize, shadow } ) => {
105
+ const shadowCameraNear = uniform( 'float' ).setGroup( renderGroup ).onRenderUpdate( () => shadow.camera.near );
106
+ const shadowCameraFar = uniform( 'float' ).setGroup( renderGroup ).onRenderUpdate( () => shadow.camera.far );
107
+ const bias = reference( 'bias', 'float', shadow ).setGroup( renderGroup );
106
108
 
107
- const radius = reference( 'radius', 'float', shadow ).setGroup( renderGroup );
108
- const offset = vec2( - 1.0, 1.0 ).mul( radius ).mul( texelSize.y );
109
-
110
- return texture( depthTexture, cubeToUV( bd3D.add( offset.xyy ), texelSize.y ) ).compare( dp )
111
- .add( texture( depthTexture, cubeToUV( bd3D.add( offset.yyy ), texelSize.y ) ).compare( dp ) )
112
- .add( texture( depthTexture, cubeToUV( bd3D.add( offset.xyx ), texelSize.y ) ).compare( dp ) )
113
- .add( texture( depthTexture, cubeToUV( bd3D.add( offset.yyx ), texelSize.y ) ).compare( dp ) )
114
- .add( texture( depthTexture, cubeToUV( bd3D, texelSize.y ) ).compare( dp ) )
115
- .add( texture( depthTexture, cubeToUV( bd3D.add( offset.xxy ), texelSize.y ) ).compare( dp ) )
116
- .add( texture( depthTexture, cubeToUV( bd3D.add( offset.yxy ), texelSize.y ) ).compare( dp ) )
117
- .add( texture( depthTexture, cubeToUV( bd3D.add( offset.xxx ), texelSize.y ) ).compare( dp ) )
118
- .add( texture( depthTexture, cubeToUV( bd3D.add( offset.yxx ), texelSize.y ) ).compare( dp ) )
119
- .mul( 1.0 / 9.0 );
109
+ const result = float( 1.0 ).toVar();
120
110
 
121
- } );
111
+ If( viewZ.sub( shadowCameraFar ).lessThanEqual( 0.0 ).and( viewZ.sub( shadowCameraNear ).greaterThanEqual( 0.0 ) ), () => {
122
112
 
123
- const pointShadowFilter = /*@__PURE__*/ Fn( ( { filterFn, depthTexture, shadowCoord, shadow } ) => {
113
+ let dp;
124
114
 
125
- // for point lights, the uniform @vShadowCoord is re-purposed to hold
126
- // the vector from the light to the world-space position of the fragment.
127
- const lightToPosition = shadowCoord.xyz.toVar();
128
- const lightToPositionLength = lightToPosition.length();
115
+ if ( builder.renderer.reversedDepthBuffer ) {
129
116
 
130
- const cameraNearLocal = uniform( 'float' ).setGroup( renderGroup ).onRenderUpdate( () => shadow.camera.near );
131
- const cameraFarLocal = uniform( 'float' ).setGroup( renderGroup ).onRenderUpdate( () => shadow.camera.far );
132
- const bias = reference( 'bias', 'float', shadow ).setGroup( renderGroup );
133
- const mapSize = uniform( shadow.mapSize ).setGroup( renderGroup );
117
+ dp = viewZToReversedPerspectiveDepth( viewZ.negate(), shadowCameraNear, shadowCameraFar );
118
+ dp.subAssign( bias );
134
119
 
135
- const result = float( 1.0 ).toVar();
120
+ } else {
136
121
 
137
- If( lightToPositionLength.sub( cameraFarLocal ).lessThanEqual( 0.0 ).and( lightToPositionLength.sub( cameraNearLocal ).greaterThanEqual( 0.0 ) ), () => {
122
+ dp = viewZToPerspectiveDepth( viewZ.negate(), shadowCameraNear, shadowCameraFar );
123
+ dp.addAssign( bias );
138
124
 
139
- // dp = normalized distance from light to fragment position
140
- const dp = lightToPositionLength.sub( cameraNearLocal ).div( cameraFarLocal.sub( cameraNearLocal ) ).toVar(); // need to clamp?
141
- dp.addAssign( bias );
125
+ }
142
126
 
143
- // bd3D = base direction 3D
144
- const bd3D = lightToPosition.normalize();
145
- const texelSize = vec2( 1.0 ).div( mapSize.mul( vec2( 4.0, 2.0 ) ) );
127
+ // bd3D = base direction 3D (direction from light to fragment)
128
+ const bd3D = shadowPosition.normalize();
146
129
 
147
- // percentage-closer filtering
148
- result.assign( filterFn( { depthTexture, bd3D, dp, texelSize, shadow } ) );
130
+ // percentage-closer filtering using cube texture sampling
131
+ result.assign( filterFn( { depthTexture, bd3D, dp, shadow } ) );
149
132
 
150
133
  } );
151
134
 
@@ -153,10 +136,6 @@ const pointShadowFilter = /*@__PURE__*/ Fn( ( { filterFn, depthTexture, shadowCo
153
136
 
154
137
  } );
155
138
 
156
- const _viewport = /*@__PURE__*/ new Vector4();
157
- const _viewportSize = /*@__PURE__*/ new Vector2();
158
- const _shadowMapSize = /*@__PURE__*/ new Vector2();
159
-
160
139
 
161
140
  /**
162
141
  * Represents the shadow implementation for point light nodes.
@@ -216,15 +195,35 @@ class PointShadowNode extends ShadowNode {
216
195
  * @param {NodeBuilder} builder - A reference to the current node builder.
217
196
  * @param {Object} inputs - A configuration object that defines the shadow filtering.
218
197
  * @param {Function} inputs.filterFn - This function defines the filtering type of the shadow map e.g. PCF.
219
- * @param {Texture} inputs.shadowTexture - A reference to the shadow map's texture.
220
- * @param {DepthTexture} inputs.depthTexture - A reference to the shadow map's texture data.
198
+ * @param {DepthTexture} inputs.depthTexture - A reference to the shadow map's depth texture.
221
199
  * @param {Node<vec3>} inputs.shadowCoord - Shadow coordinates which are used to sample from the shadow map.
222
200
  * @param {LightShadow} inputs.shadow - The light shadow.
223
201
  * @return {Node<float>} The result node of the shadow filtering.
224
202
  */
225
- setupShadowFilter( builder, { filterFn, shadowTexture, depthTexture, shadowCoord, shadow } ) {
203
+ setupShadowFilter( builder, { filterFn, depthTexture, shadowCoord, shadow } ) {
204
+
205
+ return pointShadowFilter( { filterFn, depthTexture, shadowCoord, shadow } );
206
+
207
+ }
208
+
209
+ /**
210
+ * Overwrites the default implementation to create a CubeRenderTarget with CubeDepthTexture.
211
+ *
212
+ * @param {LightShadow} shadow - The light shadow object.
213
+ * @param {NodeBuilder} builder - A reference to the current node builder.
214
+ * @return {Object} An object containing the shadow map and depth texture.
215
+ */
216
+ setupRenderTarget( shadow, builder ) {
217
+
218
+ const depthTexture = new CubeDepthTexture( shadow.mapSize.width );
219
+ depthTexture.name = 'PointShadowDepthTexture';
220
+ depthTexture.compareFunction = builder.renderer.reversedDepthBuffer ? GreaterEqualCompare : LessEqualCompare;
221
+
222
+ const shadowMap = builder.createCubeRenderTarget( shadow.mapSize.width );
223
+ shadowMap.texture.name = 'PointShadowMap';
224
+ shadowMap.depthTexture = depthTexture;
226
225
 
227
- return pointShadowFilter( { filterFn, shadowTexture, depthTexture, shadowCoord, shadow } );
226
+ return { shadowMap, depthTexture };
228
227
 
229
228
  }
230
229
 
@@ -239,14 +238,15 @@ class PointShadowNode extends ShadowNode {
239
238
  const { shadow, shadowMap, light } = this;
240
239
  const { renderer, scene } = frame;
241
240
 
242
- const shadowFrameExtents = shadow.getFrameExtents();
241
+ const camera = shadow.camera;
242
+ const shadowMatrix = shadow.matrix;
243
243
 
244
- _shadowMapSize.copy( shadow.mapSize );
245
- _shadowMapSize.multiply( shadowFrameExtents );
244
+ // Select cube directions/ups based on coordinate system
245
+ const isWebGPU = renderer.coordinateSystem === WebGPUCoordinateSystem;
246
+ const cubeDirections = isWebGPU ? _cubeDirectionsWebGPU : _cubeDirectionsWebGL;
247
+ const cubeUps = isWebGPU ? _cubeUpsWebGPU : _cubeUpsWebGL;
246
248
 
247
- shadowMap.setSize( _shadowMapSize.width, _shadowMapSize.height );
248
-
249
- _viewportSize.copy( shadow.mapSize );
249
+ shadowMap.setSize( shadow.mapSize.width, shadow.mapSize.width );
250
250
 
251
251
  //
252
252
 
@@ -257,33 +257,46 @@ class PointShadowNode extends ShadowNode {
257
257
 
258
258
  renderer.autoClear = false;
259
259
  renderer.setClearColor( shadow.clearColor, shadow.clearAlpha );
260
- renderer.clear();
261
260
 
262
- const viewportCount = shadow.getViewportCount();
261
+ // Render each cube face
262
+ for ( let face = 0; face < 6; face ++ ) {
263
+
264
+ // Set render target to the specific cube face
265
+ renderer.setRenderTarget( shadowMap, face );
266
+ renderer.clear();
267
+
268
+ // Update shadow camera matrices for this face
269
+
270
+ const far = light.distance || camera.far;
271
+
272
+ if ( far !== camera.far ) {
273
+
274
+ camera.far = far;
275
+ camera.updateProjectionMatrix();
263
276
 
264
- for ( let vp = 0; vp < viewportCount; vp ++ ) {
277
+ }
265
278
 
266
- const viewport = shadow.getViewport( vp );
279
+ _lightPositionWorld.setFromMatrixPosition( light.matrixWorld );
280
+ camera.position.copy( _lightPositionWorld );
267
281
 
268
- const x = _viewportSize.x * viewport.x;
269
- const y = _shadowMapSize.y - _viewportSize.y - ( _viewportSize.y * viewport.y );
282
+ _lookTarget.copy( camera.position );
283
+ _lookTarget.add( cubeDirections[ face ] );
284
+ camera.up.copy( cubeUps[ face ] );
285
+ camera.lookAt( _lookTarget );
286
+ camera.updateMatrixWorld();
270
287
 
271
- _viewport.set(
272
- x,
273
- y,
274
- _viewportSize.x * viewport.z,
275
- _viewportSize.y * viewport.w
276
- );
288
+ shadowMatrix.makeTranslation( - _lightPositionWorld.x, - _lightPositionWorld.y, - _lightPositionWorld.z );
277
289
 
278
- shadowMap.viewport.copy( _viewport );
290
+ _projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );
291
+ shadow._frustum.setFromProjectionMatrix( _projScreenMatrix, camera.coordinateSystem, camera.reversedDepth );
279
292
 
280
- shadow.updateMatrices( light, vp );
293
+ //
281
294
 
282
295
  const currentSceneName = scene.name;
283
296
 
284
- scene.name = `Point Light Shadow [ ${ light.name || 'ID: ' + light.id } ] - Face ${ vp + 1 }`;
297
+ scene.name = `Point Light Shadow [ ${ light.name || 'ID: ' + light.id } ] - Face ${ face + 1 }`;
285
298
 
286
- renderer.render( scene, shadow.camera );
299
+ renderer.render( scene, camera );
287
300
 
288
301
  scene.name = currentSceneName;
289
302
 
@@ -309,4 +322,4 @@ export default PointShadowNode;
309
322
  * @param {?PointLightShadow} [shadow=null] - An optional point light shadow.
310
323
  * @return {PointShadowNode} The created point shadow node.
311
324
  */
312
- export const pointShadow = ( light, shadow ) => nodeObject( new PointShadowNode( light, shadow ) );
325
+ export const pointShadow = ( light, shadow ) => new PointShadowNode( light, shadow );