@plastic-software/three 0.175.14 → 0.179.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 (572) hide show
  1. package/README.md +4 -4
  2. package/build/three.cjs +8402 -6787
  3. package/build/three.core.js +8007 -6688
  4. package/build/three.core.min.js +1 -1
  5. package/build/three.module.js +397 -102
  6. package/build/three.module.min.js +1 -1
  7. package/build/three.tsl.js +84 -27
  8. package/build/three.tsl.min.js +1 -1
  9. package/build/three.webgpu.js +6831 -2838
  10. package/build/three.webgpu.min.js +1 -1
  11. package/build/three.webgpu.nodes.js +6648 -2838
  12. package/build/three.webgpu.nodes.min.js +1 -1
  13. package/examples/jsm/Addons.js +1 -3
  14. package/examples/jsm/animation/AnimationClipCreator.js +1 -0
  15. package/examples/jsm/animation/CCDIKSolver.js +6 -3
  16. package/examples/jsm/capabilities/WebGL.js +1 -27
  17. package/examples/jsm/capabilities/WebGPU.js +2 -1
  18. package/examples/jsm/controls/ArcballControls.js +15 -4
  19. package/examples/jsm/controls/DragControls.js +1 -0
  20. package/examples/jsm/controls/FirstPersonControls.js +1 -0
  21. package/examples/jsm/controls/FlyControls.js +1 -0
  22. package/examples/jsm/controls/MapControls.js +1 -0
  23. package/examples/jsm/controls/OrbitControls.js +1 -0
  24. package/examples/jsm/controls/PointerLockControls.js +5 -3
  25. package/examples/jsm/controls/TrackballControls.js +1 -0
  26. package/examples/jsm/controls/TransformControls.js +62 -14
  27. package/examples/jsm/csm/CSM.js +2 -0
  28. package/examples/jsm/csm/CSMFrustum.js +2 -0
  29. package/examples/jsm/csm/CSMHelper.js +1 -0
  30. package/examples/jsm/csm/CSMShader.js +4 -1
  31. package/examples/jsm/csm/CSMShadowNode.js +22 -8
  32. package/examples/jsm/curves/CurveExtras.js +14 -0
  33. package/examples/jsm/curves/NURBSCurve.js +1 -0
  34. package/examples/jsm/curves/NURBSSurface.js +2 -0
  35. package/examples/jsm/curves/NURBSUtils.js +4 -1
  36. package/examples/jsm/curves/NURBSVolume.js +2 -0
  37. package/examples/jsm/effects/AnaglyphEffect.js +2 -0
  38. package/examples/jsm/effects/AsciiEffect.js +2 -0
  39. package/examples/jsm/effects/OutlineEffect.js +2 -0
  40. package/examples/jsm/effects/ParallaxBarrierEffect.js +2 -0
  41. package/examples/jsm/effects/StereoEffect.js +2 -0
  42. package/examples/jsm/environments/DebugEnvironment.js +1 -0
  43. package/examples/jsm/environments/RoomEnvironment.js +57 -38
  44. package/examples/jsm/exporters/DRACOExporter.js +4 -2
  45. package/examples/jsm/exporters/EXRExporter.js +2 -0
  46. package/examples/jsm/exporters/GLTFExporter.js +7 -4
  47. package/examples/jsm/exporters/KTX2Exporter.js +2 -0
  48. package/examples/jsm/exporters/OBJExporter.js +3 -1
  49. package/examples/jsm/exporters/PLYExporter.js +4 -2
  50. package/examples/jsm/exporters/STLExporter.js +2 -0
  51. package/examples/jsm/exporters/USDZExporter.js +679 -300
  52. package/examples/jsm/geometries/BoxLineGeometry.js +1 -0
  53. package/examples/jsm/geometries/ConvexGeometry.js +1 -0
  54. package/examples/jsm/geometries/DecalGeometry.js +1 -0
  55. package/examples/jsm/geometries/ParametricFunctions.js +4 -1
  56. package/examples/jsm/geometries/ParametricGeometry.js +1 -0
  57. package/examples/jsm/geometries/RoundedBoxGeometry.js +48 -8
  58. package/examples/jsm/geometries/TeapotGeometry.js +1 -0
  59. package/examples/jsm/geometries/TextGeometry.js +1 -0
  60. package/examples/jsm/helpers/LightProbeHelper.js +1 -0
  61. package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -0
  62. package/examples/jsm/helpers/OctreeHelper.js +1 -0
  63. package/examples/jsm/helpers/PositionalAudioHelper.js +1 -0
  64. package/examples/jsm/helpers/RapierHelper.js +59 -0
  65. package/examples/jsm/helpers/RectAreaLightHelper.js +1 -0
  66. package/examples/jsm/helpers/TextureHelper.js +1 -0
  67. package/examples/jsm/helpers/TextureHelperGPU.js +5 -4
  68. package/examples/jsm/helpers/VertexNormalsHelper.js +1 -0
  69. package/examples/jsm/helpers/VertexTangentsHelper.js +1 -0
  70. package/examples/jsm/helpers/ViewHelper.js +1 -0
  71. package/examples/jsm/interactive/HTMLMesh.js +11 -2
  72. package/examples/jsm/interactive/InteractiveGroup.js +1 -0
  73. package/examples/jsm/interactive/SelectionBox.js +2 -0
  74. package/examples/jsm/interactive/SelectionHelper.js +2 -0
  75. package/examples/jsm/libs/meshopt_decoder.module.js +75 -58
  76. package/examples/jsm/lighting/TiledLighting.js +1 -0
  77. package/examples/jsm/lights/LightProbeGenerator.js +15 -3
  78. package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -0
  79. package/examples/jsm/lights/RectAreaLightUniformsLib.js +1 -0
  80. package/examples/jsm/lines/Line2.js +1 -0
  81. package/examples/jsm/lines/LineGeometry.js +1 -0
  82. package/examples/jsm/lines/LineMaterial.js +4 -4
  83. package/examples/jsm/lines/LineSegments2.js +1 -0
  84. package/examples/jsm/lines/LineSegmentsGeometry.js +1 -0
  85. package/examples/jsm/lines/Wireframe.js +1 -0
  86. package/examples/jsm/lines/WireframeGeometry2.js +1 -0
  87. package/examples/jsm/lines/webgpu/Line2.js +1 -0
  88. package/examples/jsm/lines/webgpu/LineSegments2.js +3 -1
  89. package/examples/jsm/lines/webgpu/Wireframe.js +1 -0
  90. package/examples/jsm/loaders/3DMLoader.js +1 -0
  91. package/examples/jsm/loaders/3MFLoader.js +1 -0
  92. package/examples/jsm/loaders/AMFLoader.js +1 -0
  93. package/examples/jsm/loaders/BVHLoader.js +1 -0
  94. package/examples/jsm/loaders/ColladaLoader.js +6 -5
  95. package/examples/jsm/loaders/DDSLoader.js +1 -0
  96. package/examples/jsm/loaders/DRACOLoader.js +2 -1
  97. package/examples/jsm/loaders/EXRLoader.js +211 -22
  98. package/examples/jsm/loaders/FBXLoader.js +25 -23
  99. package/examples/jsm/loaders/FontLoader.js +1 -0
  100. package/examples/jsm/loaders/GCodeLoader.js +1 -0
  101. package/examples/jsm/loaders/GLTFLoader.js +10 -82
  102. package/examples/jsm/loaders/HDRCubeTextureLoader.js +1 -0
  103. package/examples/jsm/loaders/IESLoader.js +1 -0
  104. package/examples/jsm/loaders/KMZLoader.js +1 -0
  105. package/examples/jsm/loaders/KTX2Loader.js +67 -26
  106. package/examples/jsm/loaders/KTXLoader.js +1 -0
  107. package/examples/jsm/loaders/LDrawLoader.js +55 -3
  108. package/examples/jsm/loaders/LUT3dlLoader.js +1 -0
  109. package/examples/jsm/loaders/LUTCubeLoader.js +1 -0
  110. package/examples/jsm/loaders/LUTImageLoader.js +1 -0
  111. package/examples/jsm/loaders/LWOLoader.js +1 -13
  112. package/examples/jsm/loaders/LottieLoader.js +15 -0
  113. package/examples/jsm/loaders/MD2Loader.js +1 -0
  114. package/examples/jsm/loaders/MDDLoader.js +1 -0
  115. package/examples/jsm/loaders/MTLLoader.js +4 -3
  116. package/examples/jsm/loaders/MaterialXLoader.js +213 -30
  117. package/examples/jsm/loaders/NRRDLoader.js +1 -0
  118. package/examples/jsm/loaders/OBJLoader.js +1 -0
  119. package/examples/jsm/loaders/PCDLoader.js +122 -19
  120. package/examples/jsm/loaders/PDBLoader.js +1 -0
  121. package/examples/jsm/loaders/PLYLoader.js +1 -0
  122. package/examples/jsm/loaders/PVRLoader.js +1 -0
  123. package/examples/jsm/loaders/RGBELoader.js +1 -0
  124. package/examples/jsm/loaders/RGBMLoader.js +1 -0
  125. package/examples/jsm/loaders/STLLoader.js +1 -0
  126. package/examples/jsm/loaders/SVGLoader.js +1 -0
  127. package/examples/jsm/loaders/TDSLoader.js +1 -0
  128. package/examples/jsm/loaders/TGALoader.js +1 -0
  129. package/examples/jsm/loaders/TIFFLoader.js +1 -0
  130. package/examples/jsm/loaders/TTFLoader.js +14 -1
  131. package/examples/jsm/loaders/USDLoader.js +219 -0
  132. package/examples/jsm/loaders/USDZLoader.js +4 -891
  133. package/examples/jsm/loaders/UltraHDRLoader.js +1 -0
  134. package/examples/jsm/loaders/VOXLoader.js +1 -0
  135. package/examples/jsm/loaders/VRMLLoader.js +3 -2
  136. package/examples/jsm/loaders/VTKLoader.js +1 -0
  137. package/examples/jsm/loaders/XYZLoader.js +1 -0
  138. package/examples/jsm/loaders/lwo/IFFParser.js +74 -74
  139. package/examples/jsm/loaders/usd/USDAParser.js +741 -0
  140. package/examples/jsm/loaders/usd/USDCParser.js +17 -0
  141. package/examples/jsm/materials/LDrawConditionalLineMaterial.js +1 -0
  142. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +1 -0
  143. package/examples/jsm/materials/MeshPostProcessingMaterial.js +1 -0
  144. package/examples/jsm/math/Capsule.js +2 -0
  145. package/examples/jsm/math/ColorConverter.js +1 -0
  146. package/examples/jsm/math/ConvexHull.js +2 -0
  147. package/examples/jsm/math/ImprovedNoise.js +19 -14
  148. package/examples/jsm/math/Lut.js +2 -0
  149. package/examples/jsm/math/MeshSurfaceSampler.js +2 -0
  150. package/examples/jsm/math/OBB.js +2 -0
  151. package/examples/jsm/math/Octree.js +20 -1
  152. package/examples/jsm/math/SimplexNoise.js +2 -0
  153. package/examples/jsm/misc/ConvexObjectBreaker.js +3 -1
  154. package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
  155. package/examples/jsm/misc/Gyroscope.js +1 -0
  156. package/examples/jsm/misc/MD2Character.js +2 -0
  157. package/examples/jsm/misc/MD2CharacterComplex.js +5 -3
  158. package/examples/jsm/misc/MorphAnimMesh.js +1 -0
  159. package/examples/jsm/misc/MorphBlendMesh.js +1 -0
  160. package/examples/jsm/misc/ProgressiveLightMap.js +2 -0
  161. package/examples/jsm/misc/ProgressiveLightMapGPU.js +2 -0
  162. package/examples/jsm/misc/RollerCoaster.js +5 -0
  163. package/examples/jsm/misc/TubePainter.js +1 -0
  164. package/examples/jsm/misc/Volume.js +2 -0
  165. package/examples/jsm/misc/VolumeSlice.js +1 -0
  166. package/examples/jsm/modifiers/CurveModifier.js +3 -0
  167. package/examples/jsm/modifiers/CurveModifierGPU.js +2 -0
  168. package/examples/jsm/modifiers/EdgeSplitModifier.js +2 -0
  169. package/examples/jsm/modifiers/SimplifyModifier.js +2 -0
  170. package/examples/jsm/modifiers/TessellateModifier.js +2 -0
  171. package/examples/jsm/objects/GroundedSkybox.js +1 -0
  172. package/examples/jsm/objects/Lensflare.js +3 -0
  173. package/examples/jsm/objects/LensflareMesh.js +4 -3
  174. package/examples/jsm/objects/MarchingCubes.js +2 -0
  175. package/examples/jsm/objects/Reflector.js +1 -0
  176. package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
  177. package/examples/jsm/objects/Refractor.js +1 -0
  178. package/examples/jsm/objects/ShadowMesh.js +1 -0
  179. package/examples/jsm/objects/Sky.js +2 -1
  180. package/examples/jsm/objects/SkyMesh.js +22 -19
  181. package/examples/jsm/objects/Water.js +1 -0
  182. package/examples/jsm/objects/Water2.js +1 -0
  183. package/examples/jsm/objects/Water2Mesh.js +3 -1
  184. package/examples/jsm/objects/WaterMesh.js +2 -1
  185. package/examples/jsm/physics/AmmoPhysics.js +1 -0
  186. package/examples/jsm/physics/JoltPhysics.js +1 -0
  187. package/examples/jsm/physics/RapierPhysics.js +149 -13
  188. package/examples/jsm/postprocessing/AfterimagePass.js +20 -2
  189. package/examples/jsm/postprocessing/BloomPass.js +2 -1
  190. package/examples/jsm/postprocessing/BokehPass.js +2 -1
  191. package/examples/jsm/postprocessing/ClearPass.js +1 -0
  192. package/examples/jsm/postprocessing/CubeTexturePass.js +1 -0
  193. package/examples/jsm/postprocessing/DotScreenPass.js +1 -0
  194. package/examples/jsm/postprocessing/EffectComposer.js +4 -2
  195. package/examples/jsm/postprocessing/FXAAPass.js +40 -0
  196. package/examples/jsm/postprocessing/FilmPass.js +1 -0
  197. package/examples/jsm/postprocessing/GTAOPass.js +14 -12
  198. package/examples/jsm/postprocessing/GlitchPass.js +2 -1
  199. package/examples/jsm/postprocessing/HalftonePass.js +2 -1
  200. package/examples/jsm/postprocessing/LUTPass.js +1 -0
  201. package/examples/jsm/postprocessing/MaskPass.js +1 -0
  202. package/examples/jsm/postprocessing/OutlinePass.js +22 -19
  203. package/examples/jsm/postprocessing/OutputPass.js +1 -0
  204. package/examples/jsm/postprocessing/Pass.js +3 -1
  205. package/examples/jsm/postprocessing/RenderPass.js +1 -0
  206. package/examples/jsm/postprocessing/RenderPixelatedPass.js +2 -1
  207. package/examples/jsm/postprocessing/RenderTransitionPass.js +4 -3
  208. package/examples/jsm/postprocessing/SAOPass.js +3 -2
  209. package/examples/jsm/postprocessing/SMAAPass.js +3 -2
  210. package/examples/jsm/postprocessing/SSAARenderPass.js +2 -1
  211. package/examples/jsm/postprocessing/SSAOPass.js +12 -10
  212. package/examples/jsm/postprocessing/SSRPass.js +4 -3
  213. package/examples/jsm/postprocessing/SavePass.js +2 -1
  214. package/examples/jsm/postprocessing/ShaderPass.js +1 -0
  215. package/examples/jsm/postprocessing/TAARenderPass.js +1 -0
  216. package/examples/jsm/postprocessing/TexturePass.js +1 -0
  217. package/examples/jsm/postprocessing/UnrealBloomPass.js +2 -1
  218. package/examples/jsm/renderers/CSS2DRenderer.js +3 -0
  219. package/examples/jsm/renderers/CSS3DRenderer.js +4 -0
  220. package/examples/jsm/renderers/Projector.js +2 -0
  221. package/examples/jsm/renderers/SVGRenderer.js +3 -0
  222. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +4 -1
  223. package/examples/jsm/shaders/AfterimageShader.js +4 -1
  224. package/examples/jsm/shaders/BasicShader.js +4 -1
  225. package/examples/jsm/shaders/BleachBypassShader.js +4 -1
  226. package/examples/jsm/shaders/BlendShader.js +4 -1
  227. package/examples/jsm/shaders/BokehShader.js +4 -1
  228. package/examples/jsm/shaders/BokehShader2.js +4 -1
  229. package/examples/jsm/shaders/BrightnessContrastShader.js +4 -1
  230. package/examples/jsm/shaders/ColorCorrectionShader.js +4 -1
  231. package/examples/jsm/shaders/ColorifyShader.js +4 -1
  232. package/examples/jsm/shaders/ConvolutionShader.js +4 -1
  233. package/examples/jsm/shaders/CopyShader.js +4 -1
  234. package/examples/jsm/shaders/DOFMipMapShader.js +4 -1
  235. package/examples/jsm/shaders/DepthLimitedBlurShader.js +4 -1
  236. package/examples/jsm/shaders/DigitalGlitch.js +4 -1
  237. package/examples/jsm/shaders/DotScreenShader.js +4 -1
  238. package/examples/jsm/shaders/ExposureShader.js +4 -1
  239. package/examples/jsm/shaders/FXAAShader.js +4 -1
  240. package/examples/jsm/shaders/FilmShader.js +4 -1
  241. package/examples/jsm/shaders/FocusShader.js +4 -1
  242. package/examples/jsm/shaders/FreiChenShader.js +4 -1
  243. package/examples/jsm/shaders/GTAOShader.js +4 -1
  244. package/examples/jsm/shaders/GammaCorrectionShader.js +4 -1
  245. package/examples/jsm/shaders/GodRaysShader.js +4 -1
  246. package/examples/jsm/shaders/HalftoneShader.js +4 -1
  247. package/examples/jsm/shaders/HorizontalBlurShader.js +4 -1
  248. package/examples/jsm/shaders/HorizontalTiltShiftShader.js +4 -1
  249. package/examples/jsm/shaders/HueSaturationShader.js +4 -1
  250. package/examples/jsm/shaders/KaleidoShader.js +4 -1
  251. package/examples/jsm/shaders/LuminosityHighPassShader.js +4 -1
  252. package/examples/jsm/shaders/LuminosityShader.js +4 -1
  253. package/examples/jsm/shaders/MirrorShader.js +4 -1
  254. package/examples/jsm/shaders/NormalMapShader.js +4 -1
  255. package/examples/jsm/shaders/OutputShader.js +4 -1
  256. package/examples/jsm/shaders/PoissonDenoiseShader.js +4 -1
  257. package/examples/jsm/shaders/RGBShiftShader.js +4 -1
  258. package/examples/jsm/shaders/SAOShader.js +4 -1
  259. package/examples/jsm/shaders/SMAAShader.js +1 -0
  260. package/examples/jsm/shaders/SSAOShader.js +4 -1
  261. package/examples/jsm/shaders/SSRShader.js +1 -0
  262. package/examples/jsm/shaders/SepiaShader.js +4 -1
  263. package/examples/jsm/shaders/SobelOperatorShader.js +4 -1
  264. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +4 -1
  265. package/examples/jsm/shaders/TechnicolorShader.js +4 -1
  266. package/examples/jsm/shaders/ToonShader.js +2 -1
  267. package/examples/jsm/shaders/TriangleBlurShader.js +4 -1
  268. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +15 -3
  269. package/examples/jsm/shaders/VelocityShader.js +4 -1
  270. package/examples/jsm/shaders/VerticalBlurShader.js +4 -1
  271. package/examples/jsm/shaders/VerticalTiltShiftShader.js +4 -1
  272. package/examples/jsm/shaders/VignetteShader.js +4 -1
  273. package/examples/jsm/shaders/VolumeShader.js +5 -2
  274. package/examples/jsm/shaders/WaterRefractionShader.js +4 -1
  275. package/examples/jsm/textures/FlakesTexture.js +2 -0
  276. package/examples/jsm/transpiler/AST.js +381 -30
  277. package/examples/jsm/transpiler/GLSLDecoder.js +227 -88
  278. package/examples/jsm/transpiler/Linker.js +327 -0
  279. package/examples/jsm/transpiler/TSLEncoder.js +234 -85
  280. package/examples/jsm/transpiler/Transpiler.js +19 -1
  281. package/examples/jsm/transpiler/TranspilerUtils.js +29 -0
  282. package/examples/jsm/transpiler/WGSLEncoder.js +788 -0
  283. package/examples/jsm/tsl/display/AfterImageNode.js +2 -3
  284. package/examples/jsm/tsl/display/AnaglyphPassNode.js +1 -0
  285. package/examples/jsm/tsl/display/AnamorphicNode.js +5 -4
  286. package/examples/jsm/tsl/display/BloomNode.js +9 -7
  287. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +206 -0
  288. package/examples/jsm/tsl/display/DenoiseNode.js +33 -33
  289. package/examples/jsm/tsl/display/DepthOfFieldNode.js +1 -0
  290. package/examples/jsm/tsl/display/DotScreenNode.js +1 -0
  291. package/examples/jsm/tsl/display/FXAANode.js +3 -2
  292. package/examples/jsm/tsl/display/FilmNode.js +1 -0
  293. package/examples/jsm/tsl/display/GTAONode.js +1 -0
  294. package/examples/jsm/tsl/display/GaussianBlurNode.js +9 -36
  295. package/examples/jsm/tsl/display/LensflareNode.js +1 -0
  296. package/examples/jsm/tsl/display/Lut3DNode.js +1 -0
  297. package/examples/jsm/tsl/display/OutlineNode.js +1 -0
  298. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +1 -0
  299. package/examples/jsm/tsl/display/PixelationPassNode.js +1 -0
  300. package/examples/jsm/tsl/display/RGBShiftNode.js +1 -0
  301. package/examples/jsm/tsl/display/SMAANode.js +9 -8
  302. package/examples/jsm/tsl/display/SSAAPassNode.js +5 -4
  303. package/examples/jsm/tsl/display/SSRNode.js +1 -0
  304. package/examples/jsm/tsl/display/SobelOperatorNode.js +1 -0
  305. package/examples/jsm/tsl/display/StereoCompositePassNode.js +1 -0
  306. package/examples/jsm/tsl/display/StereoPassNode.js +1 -0
  307. package/examples/jsm/tsl/display/{TRAAPassNode.js → TRAANode.js} +184 -174
  308. package/examples/jsm/tsl/display/TransitionNode.js +1 -0
  309. package/examples/jsm/tsl/display/hashBlur.js +28 -6
  310. package/examples/jsm/tsl/lighting/TiledLightsNode.js +5 -4
  311. package/examples/jsm/tsl/math/Bayer.js +4 -1
  312. package/examples/jsm/tsl/shadows/TileShadowNode.js +456 -0
  313. package/examples/jsm/tsl/shadows/TileShadowNodeHelper.js +212 -0
  314. package/examples/jsm/tsl/utils/Raymarching.js +6 -3
  315. package/examples/jsm/utils/BufferGeometryUtils.js +4 -1
  316. package/examples/jsm/utils/CameraUtils.js +4 -1
  317. package/examples/jsm/utils/GeometryCompressionUtils.js +4 -1
  318. package/examples/jsm/utils/GeometryUtils.js +4 -1
  319. package/examples/jsm/utils/LDrawUtils.js +2 -0
  320. package/examples/jsm/utils/SceneOptimizer.js +2 -0
  321. package/examples/jsm/utils/SceneUtils.js +4 -1
  322. package/examples/jsm/utils/ShadowMapViewer.js +2 -0
  323. package/examples/jsm/utils/ShadowMapViewerGPU.js +2 -0
  324. package/examples/jsm/utils/SkeletonUtils.js +4 -1
  325. package/examples/jsm/utils/SortUtils.js +4 -1
  326. package/examples/jsm/utils/UVsDebug.js +4 -1
  327. package/examples/jsm/utils/WebGLTextureUtils.js +4 -1
  328. package/examples/jsm/utils/WebGPUTextureUtils.js +4 -1
  329. package/examples/jsm/utils/WorkerPool.js +2 -0
  330. package/examples/jsm/webxr/ARButton.js +1 -0
  331. package/examples/jsm/webxr/OculusHandModel.js +1 -0
  332. package/examples/jsm/webxr/OculusHandPointerModel.js +1 -0
  333. package/examples/jsm/webxr/Text2D.js +4 -1
  334. package/examples/jsm/webxr/VRButton.js +1 -0
  335. package/examples/jsm/webxr/XRButton.js +1 -0
  336. package/examples/jsm/webxr/XRControllerModelFactory.js +2 -0
  337. package/examples/jsm/webxr/XREstimatedLight.js +1 -0
  338. package/examples/jsm/webxr/XRHandMeshModel.js +2 -0
  339. package/examples/jsm/webxr/XRHandModelFactory.js +2 -0
  340. package/examples/jsm/webxr/XRHandPrimitiveModel.js +2 -0
  341. package/examples/jsm/webxr/XRPlanes.js +1 -0
  342. package/package.json +6 -4
  343. package/src/Three.Core.js +2 -1
  344. package/src/Three.TSL.js +83 -26
  345. package/src/Three.WebGPU.Nodes.js +1 -0
  346. package/src/Three.WebGPU.js +3 -0
  347. package/src/animation/KeyframeTrack.js +1 -1
  348. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  349. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  350. package/src/audio/AudioListener.js +13 -10
  351. package/src/cameras/ArrayCamera.js +9 -1
  352. package/src/cameras/Camera.js +14 -0
  353. package/src/cameras/OrthographicCamera.js +1 -1
  354. package/src/cameras/PerspectiveCamera.js +1 -1
  355. package/src/constants.js +47 -20
  356. package/src/core/BufferAttribute.js +3 -3
  357. package/src/core/BufferGeometry.js +2 -5
  358. package/src/core/Clock.js +2 -8
  359. package/src/core/GLBufferAttribute.js +13 -1
  360. package/src/core/Object3D.js +23 -22
  361. package/src/core/RenderTarget.js +65 -21
  362. package/src/core/RenderTarget3D.js +1 -0
  363. package/{examples/jsm/misc → src/core}/Timer.js +4 -40
  364. package/src/extras/PMREMGenerator.js +11 -0
  365. package/src/extras/TextureUtils.js +1 -5
  366. package/src/extras/core/Curve.js +1 -1
  367. package/src/extras/core/Path.js +22 -22
  368. package/src/geometries/CapsuleGeometry.js +167 -17
  369. package/src/geometries/ExtrudeGeometry.js +39 -29
  370. package/src/helpers/ArrowHelper.js +2 -2
  371. package/src/helpers/CameraHelper.js +41 -11
  372. package/src/helpers/SkeletonHelper.js +36 -7
  373. package/src/lights/LightShadow.js +34 -7
  374. package/src/lights/PointLightShadow.js +1 -1
  375. package/src/lights/SpotLightShadow.js +9 -1
  376. package/src/lights/webgpu/ProjectorLight.js +46 -0
  377. package/src/loaders/BufferGeometryLoader.js +1 -10
  378. package/src/loaders/FileLoader.js +27 -4
  379. package/src/loaders/ImageBitmapLoader.js +48 -9
  380. package/src/loaders/ImageLoader.js +55 -8
  381. package/src/loaders/Loader.js +14 -0
  382. package/src/loaders/LoadingManager.js +23 -0
  383. package/src/loaders/ObjectLoader.js +44 -16
  384. package/src/loaders/nodes/NodeObjectLoader.js +2 -2
  385. package/src/materials/Material.js +1 -7
  386. package/src/materials/MeshBasicMaterial.js +1 -1
  387. package/src/materials/nodes/Line2NodeMaterial.js +0 -8
  388. package/src/materials/nodes/MeshBasicNodeMaterial.js +4 -3
  389. package/src/materials/nodes/MeshMatcapNodeMaterial.js +1 -1
  390. package/src/materials/nodes/MeshNormalNodeMaterial.js +2 -2
  391. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +2 -1
  392. package/src/materials/nodes/MeshSSSNodeMaterial.js +2 -2
  393. package/src/materials/nodes/NodeMaterial.js +106 -20
  394. package/src/materials/nodes/PointsNodeMaterial.js +5 -0
  395. package/src/materials/nodes/manager/NodeMaterialObserver.js +107 -4
  396. package/src/math/Box3.js +28 -0
  397. package/src/math/Color.js +7 -7
  398. package/src/math/ColorManagement.js +22 -3
  399. package/src/math/Frustum.js +25 -9
  400. package/src/math/FrustumArray.js +258 -0
  401. package/src/math/Line3.js +129 -2
  402. package/src/math/Matrix4.js +48 -27
  403. package/src/math/Quaternion.js +1 -1
  404. package/src/math/Ray.js +2 -0
  405. package/src/math/Sphere.js +28 -0
  406. package/src/math/Spherical.js +2 -2
  407. package/src/nodes/Nodes.js +3 -3
  408. package/src/nodes/TSL.js +6 -3
  409. package/src/nodes/accessors/AccessorsUtils.js +7 -8
  410. package/src/nodes/accessors/Bitangent.js +54 -26
  411. package/src/nodes/accessors/Camera.js +40 -13
  412. package/src/nodes/accessors/CubeTextureNode.js +50 -2
  413. package/src/nodes/accessors/InstanceNode.js +5 -4
  414. package/src/nodes/accessors/Lights.js +2 -2
  415. package/src/nodes/accessors/MaterialNode.js +4 -0
  416. package/src/nodes/accessors/ModelNode.js +1 -1
  417. package/src/nodes/accessors/Normal.js +110 -24
  418. package/src/nodes/accessors/Object3DNode.js +7 -8
  419. package/src/nodes/accessors/Position.js +14 -4
  420. package/src/nodes/accessors/ReferenceBaseNode.js +1 -1
  421. package/src/nodes/accessors/ReferenceNode.js +19 -4
  422. package/src/nodes/accessors/ReflectVector.js +3 -3
  423. package/src/nodes/accessors/SceneNode.js +1 -1
  424. package/src/nodes/accessors/SkinningNode.js +3 -2
  425. package/src/nodes/accessors/StorageBufferNode.js +25 -0
  426. package/src/nodes/accessors/StorageTextureNode.js +15 -4
  427. package/src/nodes/accessors/Tangent.js +25 -17
  428. package/src/nodes/accessors/TangentUtils.js +46 -0
  429. package/src/nodes/accessors/TextureBicubic.js +21 -3
  430. package/src/nodes/accessors/TextureNode.js +71 -8
  431. package/src/nodes/accessors/UniformArrayNode.js +0 -16
  432. package/src/nodes/accessors/VelocityNode.js +1 -0
  433. package/src/nodes/accessors/VertexColorNode.js +4 -4
  434. package/src/nodes/code/CodeNode.js +8 -11
  435. package/src/nodes/core/ArrayNode.js +12 -0
  436. package/src/nodes/core/AssignNode.js +30 -5
  437. package/src/nodes/core/AttributeNode.js +2 -2
  438. package/src/nodes/core/ContextNode.js +27 -4
  439. package/src/nodes/core/Node.js +83 -22
  440. package/src/nodes/core/NodeBuilder.js +273 -49
  441. package/src/nodes/core/NodeUtils.js +46 -1
  442. package/src/nodes/core/NodeVarying.js +19 -1
  443. package/src/nodes/core/PropertyNode.js +8 -12
  444. package/src/nodes/core/StackNode.js +171 -26
  445. package/src/nodes/core/StructTypeNode.js +26 -4
  446. package/src/nodes/core/SubBuildNode.js +89 -0
  447. package/src/nodes/core/UniformNode.js +63 -5
  448. package/src/nodes/core/VarNode.js +102 -4
  449. package/src/nodes/core/VaryingNode.js +45 -24
  450. package/src/nodes/display/BlendModes.js +42 -1
  451. package/src/nodes/display/ColorSpaceNode.js +4 -27
  452. package/src/nodes/display/FrontFacingNode.js +34 -2
  453. package/src/nodes/display/NormalMapNode.js +19 -50
  454. package/src/nodes/display/PassNode.js +165 -20
  455. package/src/nodes/display/ScreenNode.js +0 -26
  456. package/src/nodes/display/ViewportTextureNode.js +67 -7
  457. package/src/nodes/functions/BSDF/BRDF_GGX.js +2 -6
  458. package/src/nodes/functions/BSDF/BRDF_Sheen.js +4 -4
  459. package/src/nodes/functions/PhongLightingModel.js +3 -3
  460. package/src/nodes/functions/PhysicalLightingModel.js +16 -16
  461. package/src/nodes/functions/ShadowMaskModel.js +5 -1
  462. package/src/nodes/functions/material/getGeometryRoughness.js +2 -2
  463. package/src/nodes/functions/material/getParallaxCorrectNormal.js +1 -1
  464. package/src/nodes/gpgpu/AtomicFunctionNode.js +28 -10
  465. package/src/nodes/gpgpu/BarrierNode.js +3 -3
  466. package/src/nodes/gpgpu/ComputeNode.js +68 -24
  467. package/src/nodes/gpgpu/WorkgroupInfoNode.js +28 -3
  468. package/src/nodes/lighting/AnalyticLightNode.js +7 -13
  469. package/src/nodes/lighting/EnvironmentNode.js +5 -5
  470. package/src/nodes/lighting/HemisphereLightNode.js +2 -2
  471. package/src/nodes/lighting/IESSpotLightNode.js +2 -1
  472. package/src/nodes/lighting/LightsNode.js +29 -11
  473. package/src/nodes/lighting/ProjectorLightNode.js +91 -0
  474. package/src/nodes/lighting/ShadowBaseNode.js +1 -12
  475. package/src/nodes/lighting/ShadowFilterNode.js +274 -0
  476. package/src/nodes/lighting/ShadowNode.js +174 -242
  477. package/src/nodes/lighting/SpotLightNode.js +44 -7
  478. package/src/nodes/materialx/MaterialXNodes.js +131 -2
  479. package/src/nodes/materialx/lib/mx_noise.js +166 -2
  480. package/src/nodes/math/ConditionalNode.js +1 -20
  481. package/src/nodes/math/MathNode.js +146 -75
  482. package/src/nodes/math/OperatorNode.js +129 -119
  483. package/src/nodes/shapes/Shapes.js +5 -4
  484. package/src/nodes/tsl/TSLBase.js +1 -0
  485. package/src/nodes/tsl/TSLCore.js +222 -72
  486. package/src/nodes/utils/DebugNode.js +16 -4
  487. package/src/nodes/utils/Discard.js +2 -2
  488. package/src/nodes/utils/EquirectUV.js +27 -0
  489. package/src/nodes/utils/EventNode.js +83 -0
  490. package/src/nodes/utils/LoopNode.js +64 -34
  491. package/src/nodes/utils/MatcapUV.js +22 -0
  492. package/src/nodes/utils/RTTNode.js +22 -5
  493. package/src/nodes/utils/ReflectorNode.js +77 -7
  494. package/src/nodes/utils/SampleNode.js +81 -0
  495. package/src/nodes/utils/TriplanarTextures.js +65 -0
  496. package/src/objects/BatchedMesh.js +20 -6
  497. package/src/objects/Mesh.js +9 -0
  498. package/src/objects/Skeleton.js +1 -1
  499. package/src/objects/Sprite.js +9 -0
  500. package/src/renderers/WebGL3DRenderTarget.js +1 -0
  501. package/src/renderers/WebGLArrayRenderTarget.js +1 -0
  502. package/src/renderers/WebGLCubeRenderTarget.js +2 -4
  503. package/src/renderers/WebGLRenderer.js +45 -32
  504. package/src/renderers/common/Animation.js +2 -2
  505. package/src/renderers/common/Background.js +13 -2
  506. package/src/renderers/common/Bindings.js +19 -18
  507. package/src/renderers/common/Color4.js +2 -2
  508. package/src/renderers/common/CubeRenderTarget.js +1 -1
  509. package/src/renderers/common/PostProcessing.js +60 -5
  510. package/src/renderers/common/RenderList.js +0 -4
  511. package/src/renderers/common/RenderObject.js +80 -4
  512. package/src/renderers/common/Renderer.js +133 -22
  513. package/src/renderers/common/SampledTexture.js +3 -71
  514. package/src/renderers/common/Sampler.js +79 -0
  515. package/src/renderers/common/Storage3DTexture.js +100 -0
  516. package/src/renderers/common/StorageArrayTexture.js +84 -0
  517. package/src/renderers/common/StorageTexture.js +19 -0
  518. package/src/renderers/common/Textures.js +34 -24
  519. package/src/renderers/common/TimestampQueryPool.js +1 -0
  520. package/src/renderers/common/Uniform.js +1 -1
  521. package/src/renderers/common/UniformsGroup.js +14 -18
  522. package/src/renderers/common/XRManager.js +183 -35
  523. package/src/renderers/common/XRRenderTarget.js +21 -4
  524. package/src/renderers/common/extras/PMREMGenerator.js +30 -23
  525. package/src/renderers/common/nodes/NodeSampledTexture.js +0 -12
  526. package/src/renderers/common/nodes/Nodes.js +13 -3
  527. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +1 -1
  528. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +20 -2
  529. package/src/renderers/shaders/ShaderLib/background.glsl.js +1 -1
  530. package/src/renderers/shaders/ShaderLib/depth.glsl.js +11 -2
  531. package/src/renderers/webgl/WebGLAttributes.js +4 -0
  532. package/src/renderers/webgl/WebGLCapabilities.js +2 -2
  533. package/src/renderers/webgl/WebGLMaterials.js +6 -6
  534. package/src/renderers/webgl/WebGLProgram.js +22 -16
  535. package/src/renderers/webgl/WebGLPrograms.js +8 -6
  536. package/src/renderers/webgl/WebGLShadowMap.js +14 -3
  537. package/src/renderers/webgl/WebGLState.js +4 -4
  538. package/src/renderers/webgl/WebGLTextures.js +163 -11
  539. package/src/renderers/webgl/WebGLUtils.js +1 -3
  540. package/src/renderers/webgl-fallback/WebGLBackend.js +261 -94
  541. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +75 -9
  542. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +4 -0
  543. package/src/renderers/webgl-fallback/utils/WebGLConstants.js +1 -0
  544. package/src/renderers/webgl-fallback/utils/WebGLState.js +4 -4
  545. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +44 -29
  546. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +22 -21
  547. package/src/renderers/webgpu/WebGPUBackend.js +505 -143
  548. package/src/renderers/webgpu/WebGPURenderer.js +7 -0
  549. package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +4 -1
  550. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +4 -1
  551. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +129 -96
  552. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +3 -0
  553. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +9 -1
  554. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +58 -31
  555. package/src/renderers/webgpu/utils/WebGPUConstants.js +8 -2
  556. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +39 -9
  557. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +50 -108
  558. package/src/renderers/webgpu/utils/WebGPUUtils.js +2 -17
  559. package/src/renderers/webxr/WebXRController.js +1 -1
  560. package/src/renderers/webxr/WebXRDepthSensing.js +6 -10
  561. package/src/renderers/webxr/WebXRManager.js +70 -9
  562. package/src/textures/DepthTexture.js +6 -10
  563. package/src/textures/ExternalTexture.js +45 -0
  564. package/src/textures/FramebufferTexture.js +2 -2
  565. package/src/textures/Source.js +32 -0
  566. package/src/textures/Texture.js +118 -1
  567. package/src/textures/VideoTexture.js +31 -3
  568. package/examples/jsm/effects/PeppersGhostEffect.js +0 -172
  569. package/src/core/RenderTargetArray.js +0 -40
  570. package/src/nodes/utils/EquirectUVNode.js +0 -65
  571. package/src/nodes/utils/MatcapUVNode.js +0 -49
  572. package/src/nodes/utils/TriplanarTexturesNode.js +0 -148
@@ -3,7 +3,6 @@ import { NodeUpdateType } from '../core/constants.js';
3
3
  import { uniform } from '../core/UniformNode.js';
4
4
  import { Color } from '../../math/Color.js';
5
5
  import { renderGroup } from '../core/UniformGroupNode.js';
6
- import { hash } from '../core/NodeUtils.js';
7
6
  import { shadow } from './ShadowNode.js';
8
7
  import { nodeObject } from '../tsl/TSLCore.js';
9
8
  import { lightViewPosition } from '../accessors/Lights.js';
@@ -99,24 +98,19 @@ class AnalyticLightNode extends LightingNode {
99
98
 
100
99
  }
101
100
 
102
- /**
103
- * Overwrites the default {@link Node#customCacheKey} implementation by including the
104
- * `light.id` and `light.castShadow` into the cache key.
105
- *
106
- * @return {number} The custom cache key.
107
- */
108
- customCacheKey() {
109
-
110
- return hash( this.light.id, this.light.castShadow ? 1 : 0 );
111
-
112
- }
113
-
114
101
  getHash() {
115
102
 
116
103
  return this.light.uuid;
117
104
 
118
105
  }
119
106
 
107
+ /**
108
+ * Returns a node representing a direction vector which points from the current
109
+ * position in view space to the light's position in view space.
110
+ *
111
+ * @param {NodeBuilder} builder - The builder object used for setting up the light.
112
+ * @return {Node<vec3>} The light vector node.
113
+ */
120
114
  getLightVector( builder ) {
121
115
 
122
116
  return lightViewPosition( this.light ).sub( builder.context.positionView || positionView );
@@ -2,10 +2,10 @@ import LightingNode from './LightingNode.js';
2
2
  import { cache } from '../core/CacheNode.js';
3
3
  import { roughness, clearcoatRoughness } from '../core/PropertyNode.js';
4
4
  import { cameraViewMatrix } from '../accessors/Camera.js';
5
- import { transformedClearcoatNormalView, transformedNormalView, transformedNormalWorld } from '../accessors/Normal.js';
5
+ import { normalView, clearcoatNormalView, normalWorld } from '../accessors/Normal.js';
6
6
  import { positionViewDirection } from '../accessors/Position.js';
7
7
  import { float } from '../tsl/TSLBase.js';
8
- import { transformedBentNormalView } from '../accessors/AccessorsUtils.js';
8
+ import { bentNormalView } from '../accessors/AccessorsUtils.js';
9
9
  import { pmremTexture } from '../pmrem/PMREMNode.js';
10
10
  import { materialEnvIntensity } from '../accessors/MaterialProperties.js';
11
11
 
@@ -72,10 +72,10 @@ class EnvironmentNode extends LightingNode {
72
72
  //
73
73
 
74
74
  const useAnisotropy = material.useAnisotropy === true || material.anisotropy > 0;
75
- const radianceNormalView = useAnisotropy ? transformedBentNormalView : transformedNormalView;
75
+ const radianceNormalView = useAnisotropy ? bentNormalView : normalView;
76
76
 
77
77
  const radiance = envNode.context( createRadianceContext( roughness, radianceNormalView ) ).mul( materialEnvIntensity );
78
- const irradiance = envNode.context( createIrradianceContext( transformedNormalWorld ) ).mul( Math.PI ).mul( materialEnvIntensity );
78
+ const irradiance = envNode.context( createIrradianceContext( normalWorld ) ).mul( Math.PI ).mul( materialEnvIntensity );
79
79
 
80
80
  const isolateRadiance = cache( radiance );
81
81
  const isolateIrradiance = cache( irradiance );
@@ -92,7 +92,7 @@ class EnvironmentNode extends LightingNode {
92
92
 
93
93
  if ( clearcoatRadiance ) {
94
94
 
95
- const clearcoatRadianceContext = envNode.context( createRadianceContext( clearcoatRoughness, transformedClearcoatNormalView ) ).mul( materialEnvIntensity );
95
+ const clearcoatRadianceContext = envNode.context( createRadianceContext( clearcoatRoughness, clearcoatNormalView ) ).mul( materialEnvIntensity );
96
96
  const isolateClearcoatRadiance = cache( clearcoatRadianceContext );
97
97
 
98
98
  clearcoatRadiance.addAssign( isolateClearcoatRadiance );
@@ -1,7 +1,7 @@
1
1
  import AnalyticLightNode from './AnalyticLightNode.js';
2
2
  import { uniform } from '../core/UniformNode.js';
3
3
  import { mix } from '../math/MathNode.js';
4
- import { normalView } from '../accessors/Normal.js';
4
+ import { normalWorld } from '../accessors/Normal.js';
5
5
  import { lightPosition } from '../accessors/Lights.js';
6
6
  import { renderGroup } from '../core/UniformGroupNode.js';
7
7
 
@@ -73,7 +73,7 @@ class HemisphereLightNode extends AnalyticLightNode {
73
73
 
74
74
  const { colorNode, groundColorNode, lightDirectionNode } = this;
75
75
 
76
- const dotNL = normalView.dot( lightDirectionNode );
76
+ const dotNL = normalWorld.dot( lightDirectionNode );
77
77
  const hemiDiffuseWeight = dotNL.mul( 0.5 ).add( 0.5 );
78
78
 
79
79
  const irradiance = mix( groundColorNode, colorNode, hemiDiffuseWeight );
@@ -18,10 +18,11 @@ class IESSpotLightNode extends SpotLightNode {
18
18
  /**
19
19
  * Overwrites the default implementation to compute an IES conform spot attenuation.
20
20
  *
21
+ * @param {NodeBuilder} builder - The node builder.
21
22
  * @param {Node<float>} angleCosine - The angle to compute the spot attenuation for.
22
23
  * @return {Node<float>} The spot attenuation.
23
24
  */
24
- getSpotAttenuation( angleCosine ) {
25
+ getSpotAttenuation( builder, angleCosine ) {
25
26
 
26
27
  const iesMap = this.light.iesMap;
27
28
 
@@ -1,5 +1,5 @@
1
1
  import Node from '../core/Node.js';
2
- import { nodeObject, vec3 } from '../tsl/TSLBase.js';
2
+ import { nodeObject, property, vec3 } from '../tsl/TSLBase.js';
3
3
  import { hashArray } from '../core/NodeUtils.js';
4
4
 
5
5
  const sortLights = ( lights ) => {
@@ -25,6 +25,7 @@ const getLightNodeById = ( id, lightNodes ) => {
25
25
  };
26
26
 
27
27
  const _lightsNodeRef = /*@__PURE__*/ new WeakMap();
28
+ const _hashData = [];
28
29
 
29
30
  /**
30
31
  * This node represents the scene's lighting and manages the lighting model's life cycle
@@ -53,21 +54,21 @@ class LightsNode extends Node {
53
54
  *
54
55
  * @type {Node<vec3>}
55
56
  */
56
- this.totalDiffuseNode = vec3().toVar();
57
+ this.totalDiffuseNode = property( 'vec3', 'totalDiffuse' );
57
58
 
58
59
  /**
59
60
  * A node representing the total specular light.
60
61
  *
61
62
  * @type {Node<vec3>}
62
63
  */
63
- this.totalSpecularNode = vec3().toVar();
64
+ this.totalSpecularNode = property( 'vec3', 'totalSpecular' );
64
65
 
65
66
  /**
66
67
  * A node representing the outgoing light.
67
68
  *
68
69
  * @type {Node<vec3>}
69
70
  */
70
- this.outgoingLightNode = vec3().toVar();
71
+ this.outgoingLightNode = property( 'vec3', 'outgoingLight' );
71
72
 
72
73
  /**
73
74
  * An array representing the lights in the scene.
@@ -107,23 +108,38 @@ class LightsNode extends Node {
107
108
  }
108
109
 
109
110
  /**
110
- * Overwrites the default {@link Node#customCacheKey} implementation by including the
111
- * light IDs into the cache key.
111
+ * Overwrites the default {@link Node#customCacheKey} implementation by including
112
+ * light data into the cache key.
112
113
  *
113
114
  * @return {number} The custom cache key.
114
115
  */
115
116
  customCacheKey() {
116
117
 
117
- const lightIDs = [];
118
118
  const lights = this._lights;
119
119
 
120
120
  for ( let i = 0; i < lights.length; i ++ ) {
121
121
 
122
- lightIDs.push( lights[ i ].id );
122
+ const light = lights[ i ];
123
+
124
+ _hashData.push( light.id );
125
+ _hashData.push( light.castShadow ? 1 : 0 );
126
+
127
+ if ( light.isSpotLight === true ) {
128
+
129
+ const hashMap = ( light.map !== null ) ? light.map.id : - 1;
130
+ const hashColorNode = ( light.colorNode ) ? light.colorNode.getCacheKey() : - 1;
131
+
132
+ _hashData.push( hashMap, hashColorNode );
133
+
134
+ }
123
135
 
124
136
  }
125
137
 
126
- return hashArray( lightIDs );
138
+ const cacheKey = hashArray( _hashData );
139
+
140
+ _hashData.length = 0;
141
+
142
+ return cacheKey;
127
143
 
128
144
  }
129
145
 
@@ -157,7 +173,7 @@ class LightsNode extends Node {
157
173
 
158
174
  analyze( builder ) {
159
175
 
160
- const properties = builder.getDataFromNode( this );
176
+ const properties = builder.getNodeProperties( this );
161
177
 
162
178
  for ( const node of properties.nodes ) {
163
179
 
@@ -165,6 +181,8 @@ class LightsNode extends Node {
165
181
 
166
182
  }
167
183
 
184
+ properties.outputNode.build( builder );
185
+
168
186
  }
169
187
 
170
188
  /**
@@ -313,7 +331,7 @@ class LightsNode extends Node {
313
331
  const context = builder.context;
314
332
  const lightingModel = context.lightingModel;
315
333
 
316
- const properties = builder.getDataFromNode( this );
334
+ const properties = builder.getNodeProperties( this );
317
335
 
318
336
  if ( lightingModel ) {
319
337
 
@@ -0,0 +1,91 @@
1
+ import SpotLightNode from './SpotLightNode.js';
2
+
3
+ import { float, Fn, If, vec2 } from '../tsl/TSLCore.js';
4
+ import { length, min, max, saturate, acos } from '../math/MathNode.js';
5
+ import { div, sub } from '../math/OperatorNode.js';
6
+ import { lightShadowMatrix } from '../accessors/Lights.js';
7
+ import { positionWorld } from '../accessors/Position.js';
8
+
9
+ const sdBox = /*@__PURE__*/ Fn( ( [ p, b ] ) => {
10
+
11
+ const d = p.abs().sub( b );
12
+
13
+ return length( max( d, 0.0 ) ).add( min( max( d.x, d.y ), 0.0 ) );
14
+
15
+ } );
16
+
17
+ /**
18
+ * An implementation of a projector light node.
19
+ *
20
+ * @augments SpotLightNode
21
+ */
22
+ class ProjectorLightNode extends SpotLightNode {
23
+
24
+ static get type() {
25
+
26
+ return 'ProjectorLightNode';
27
+
28
+ }
29
+
30
+ update( frame ) {
31
+
32
+ super.update( frame );
33
+
34
+ const light = this.light;
35
+
36
+ this.penumbraCosNode.value = Math.min( Math.cos( light.angle * ( 1 - light.penumbra ) ), .99999 );
37
+
38
+ if ( light.aspect === null ) {
39
+
40
+ let aspect = 1;
41
+
42
+ if ( light.map !== null ) {
43
+
44
+ aspect = light.map.width / light.map.height;
45
+
46
+ }
47
+
48
+ light.shadow.aspect = aspect;
49
+
50
+ } else {
51
+
52
+ light.shadow.aspect = light.aspect;
53
+
54
+ }
55
+
56
+ }
57
+
58
+ /**
59
+ * Overwrites the default implementation to compute projection attenuation.
60
+ *
61
+ * @param {NodeBuilder} builder - The node builder.
62
+ * @return {Node<float>} The spot attenuation.
63
+ */
64
+ getSpotAttenuation( builder ) {
65
+
66
+ const attenuation = float( 0 );
67
+ const penumbraCos = this.penumbraCosNode;
68
+
69
+ // compute the fragment's position in the light's clip space
70
+
71
+ const spotLightCoord = lightShadowMatrix( this.light ).mul( builder.context.positionWorld || positionWorld );
72
+
73
+ // the sign of w determines whether the current fragment is in front or behind the light.
74
+ // to avoid a back-projection, it's important to only compute an attenuation if w is positive
75
+
76
+ If( spotLightCoord.w.greaterThan( 0 ), () => {
77
+
78
+ const projectionUV = spotLightCoord.xyz.div( spotLightCoord.w );
79
+ const boxDist = sdBox( projectionUV.xy.sub( vec2( 0.5 ) ), vec2( 0.5 ) );
80
+ const angleFactor = div( - 1.0, sub( 1.0, acos( penumbraCos ) ).sub( 1.0 ) );
81
+ attenuation.assign( saturate( boxDist.mul( - 2.0 ).mul( angleFactor ) ) );
82
+
83
+ } );
84
+
85
+ return attenuation;
86
+
87
+ }
88
+
89
+ }
90
+
91
+ export default ProjectorLightNode;
@@ -64,18 +64,7 @@ class ShadowBaseNode extends Node {
64
64
 
65
65
  // Use assign inside an Fn()
66
66
 
67
- shadowPositionWorld.assign( material.shadowPositionNode || context.shadowPositionWorld || positionWorld );
68
-
69
- }
70
-
71
- /**
72
- * Can be called when the shadow isn't required anymore. That can happen when
73
- * a lighting node stops casting shadows by setting {@link Object3D#castShadow}
74
- * to `false`.
75
- */
76
- dispose() {
77
-
78
- this.updateBeforeType = NodeUpdateType.NONE;
67
+ shadowPositionWorld.assign( material.receivedShadowPositionNode || context.shadowPositionWorld || positionWorld );
79
68
 
80
69
  }
81
70
 
@@ -0,0 +1,274 @@
1
+ import { float, vec2, vec4, If, Fn } from '../tsl/TSLBase.js';
2
+ import { reference } from '../accessors/ReferenceNode.js';
3
+ import { texture } from '../accessors/TextureNode.js';
4
+ import { mix, fract, step, max, clamp } from '../math/MathNode.js';
5
+ import { add, sub } from '../math/OperatorNode.js';
6
+ import { renderGroup } from '../core/UniformGroupNode.js';
7
+ import NodeMaterial from '../../materials/nodes/NodeMaterial.js';
8
+ import { objectPosition } from '../accessors/Object3DNode.js';
9
+ import { positionWorld } from '../accessors/Position.js';
10
+
11
+ const shadowMaterialLib = /*@__PURE__*/ new WeakMap();
12
+
13
+ /**
14
+ * A shadow filtering function performing basic filtering. This is in fact an unfiltered version of the shadow map
15
+ * with a binary `[0,1]` result.
16
+ *
17
+ * @method
18
+ * @param {Object} inputs - The input parameter object.
19
+ * @param {DepthTexture} inputs.depthTexture - A reference to the shadow map's texture data.
20
+ * @param {Node<vec3>} inputs.shadowCoord - The shadow coordinates.
21
+ * @return {Node<float>} The filtering result.
22
+ */
23
+ export const BasicShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, shadowCoord, depthLayer } ) => {
24
+
25
+ let basic = texture( depthTexture, shadowCoord.xy ).setName( 't_basic' );
26
+
27
+ if ( depthTexture.isArrayTexture ) {
28
+
29
+ basic = basic.depth( depthLayer );
30
+
31
+ }
32
+
33
+ return basic.compare( shadowCoord.z );
34
+
35
+ } );
36
+
37
+ /**
38
+ * A shadow filtering function performing PCF filtering.
39
+ *
40
+ * @method
41
+ * @param {Object} inputs - The input parameter object.
42
+ * @param {DepthTexture} inputs.depthTexture - A reference to the shadow map's texture data.
43
+ * @param {Node<vec3>} inputs.shadowCoord - The shadow coordinates.
44
+ * @param {LightShadow} inputs.shadow - The light shadow.
45
+ * @return {Node<float>} The filtering result.
46
+ */
47
+ export const PCFShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, shadowCoord, shadow, depthLayer } ) => {
48
+
49
+ const depthCompare = ( uv, compare ) => {
50
+
51
+ let depth = texture( depthTexture, uv );
52
+
53
+ if ( depthTexture.isArrayTexture ) {
54
+
55
+ depth = depth.depth( depthLayer );
56
+
57
+ }
58
+
59
+ return depth.compare( compare );
60
+
61
+ };
62
+
63
+ const mapSize = reference( 'mapSize', 'vec2', shadow ).setGroup( renderGroup );
64
+ const radius = reference( 'radius', 'float', shadow ).setGroup( renderGroup );
65
+
66
+ const texelSize = vec2( 1 ).div( mapSize );
67
+ const dx0 = texelSize.x.negate().mul( radius );
68
+ const dy0 = texelSize.y.negate().mul( radius );
69
+ const dx1 = texelSize.x.mul( radius );
70
+ const dy1 = texelSize.y.mul( radius );
71
+ const dx2 = dx0.div( 2 );
72
+ const dy2 = dy0.div( 2 );
73
+ const dx3 = dx1.div( 2 );
74
+ const dy3 = dy1.div( 2 );
75
+
76
+ return add(
77
+ depthCompare( shadowCoord.xy.add( vec2( dx0, dy0 ) ), shadowCoord.z ),
78
+ depthCompare( shadowCoord.xy.add( vec2( 0, dy0 ) ), shadowCoord.z ),
79
+ depthCompare( shadowCoord.xy.add( vec2( dx1, dy0 ) ), shadowCoord.z ),
80
+ depthCompare( shadowCoord.xy.add( vec2( dx2, dy2 ) ), shadowCoord.z ),
81
+ depthCompare( shadowCoord.xy.add( vec2( 0, dy2 ) ), shadowCoord.z ),
82
+ depthCompare( shadowCoord.xy.add( vec2( dx3, dy2 ) ), shadowCoord.z ),
83
+ depthCompare( shadowCoord.xy.add( vec2( dx0, 0 ) ), shadowCoord.z ),
84
+ depthCompare( shadowCoord.xy.add( vec2( dx2, 0 ) ), shadowCoord.z ),
85
+ depthCompare( shadowCoord.xy, shadowCoord.z ),
86
+ depthCompare( shadowCoord.xy.add( vec2( dx3, 0 ) ), shadowCoord.z ),
87
+ depthCompare( shadowCoord.xy.add( vec2( dx1, 0 ) ), shadowCoord.z ),
88
+ depthCompare( shadowCoord.xy.add( vec2( dx2, dy3 ) ), shadowCoord.z ),
89
+ depthCompare( shadowCoord.xy.add( vec2( 0, dy3 ) ), shadowCoord.z ),
90
+ depthCompare( shadowCoord.xy.add( vec2( dx3, dy3 ) ), shadowCoord.z ),
91
+ depthCompare( shadowCoord.xy.add( vec2( dx0, dy1 ) ), shadowCoord.z ),
92
+ depthCompare( shadowCoord.xy.add( vec2( 0, dy1 ) ), shadowCoord.z ),
93
+ depthCompare( shadowCoord.xy.add( vec2( dx1, dy1 ) ), shadowCoord.z )
94
+ ).mul( 1 / 17 );
95
+
96
+ } );
97
+
98
+ /**
99
+ * A shadow filtering function performing PCF soft filtering.
100
+ *
101
+ * @method
102
+ * @param {Object} inputs - The input parameter object.
103
+ * @param {DepthTexture} inputs.depthTexture - A reference to the shadow map's texture data.
104
+ * @param {Node<vec3>} inputs.shadowCoord - The shadow coordinates.
105
+ * @param {LightShadow} inputs.shadow - The light shadow.
106
+ * @return {Node<float>} The filtering result.
107
+ */
108
+ export const PCFSoftShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, shadowCoord, shadow, depthLayer } ) => {
109
+
110
+ const depthCompare = ( uv, compare ) => {
111
+
112
+ let depth = texture( depthTexture, uv );
113
+
114
+ if ( depthTexture.isArrayTexture ) {
115
+
116
+ depth = depth.depth( depthLayer );
117
+
118
+ }
119
+
120
+ return depth.compare( compare );
121
+
122
+ };
123
+
124
+
125
+ const mapSize = reference( 'mapSize', 'vec2', shadow ).setGroup( renderGroup );
126
+
127
+ const texelSize = vec2( 1 ).div( mapSize );
128
+ const dx = texelSize.x;
129
+ const dy = texelSize.y;
130
+
131
+ const uv = shadowCoord.xy;
132
+ const f = fract( uv.mul( mapSize ).add( 0.5 ) );
133
+ uv.subAssign( f.mul( texelSize ) );
134
+
135
+ return add(
136
+ depthCompare( uv, shadowCoord.z ),
137
+ depthCompare( uv.add( vec2( dx, 0 ) ), shadowCoord.z ),
138
+ depthCompare( uv.add( vec2( 0, dy ) ), shadowCoord.z ),
139
+ depthCompare( uv.add( texelSize ), shadowCoord.z ),
140
+ mix(
141
+ depthCompare( uv.add( vec2( dx.negate(), 0 ) ), shadowCoord.z ),
142
+ depthCompare( uv.add( vec2( dx.mul( 2 ), 0 ) ), shadowCoord.z ),
143
+ f.x
144
+ ),
145
+ mix(
146
+ depthCompare( uv.add( vec2( dx.negate(), dy ) ), shadowCoord.z ),
147
+ depthCompare( uv.add( vec2( dx.mul( 2 ), dy ) ), shadowCoord.z ),
148
+ f.x
149
+ ),
150
+ mix(
151
+ depthCompare( uv.add( vec2( 0, dy.negate() ) ), shadowCoord.z ),
152
+ depthCompare( uv.add( vec2( 0, dy.mul( 2 ) ) ), shadowCoord.z ),
153
+ f.y
154
+ ),
155
+ mix(
156
+ depthCompare( uv.add( vec2( dx, dy.negate() ) ), shadowCoord.z ),
157
+ depthCompare( uv.add( vec2( dx, dy.mul( 2 ) ) ), shadowCoord.z ),
158
+ f.y
159
+ ),
160
+ mix(
161
+ mix(
162
+ depthCompare( uv.add( vec2( dx.negate(), dy.negate() ) ), shadowCoord.z ),
163
+ depthCompare( uv.add( vec2( dx.mul( 2 ), dy.negate() ) ), shadowCoord.z ),
164
+ f.x
165
+ ),
166
+ mix(
167
+ depthCompare( uv.add( vec2( dx.negate(), dy.mul( 2 ) ) ), shadowCoord.z ),
168
+ depthCompare( uv.add( vec2( dx.mul( 2 ), dy.mul( 2 ) ) ), shadowCoord.z ),
169
+ f.x
170
+ ),
171
+ f.y
172
+ )
173
+ ).mul( 1 / 9 );
174
+
175
+ } );
176
+
177
+ /**
178
+ * A shadow filtering function performing VSM filtering.
179
+ *
180
+ * @method
181
+ * @param {Object} inputs - The input parameter object.
182
+ * @param {DepthTexture} inputs.depthTexture - A reference to the shadow map's texture data.
183
+ * @param {Node<vec3>} inputs.shadowCoord - The shadow coordinates.
184
+ * @return {Node<float>} The filtering result.
185
+ */
186
+ export const VSMShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, shadowCoord, depthLayer } ) => {
187
+
188
+ const occlusion = float( 1 ).toVar();
189
+
190
+ let distribution = texture( depthTexture ).sample( shadowCoord.xy );
191
+
192
+ if ( depthTexture.isArrayTexture ) {
193
+
194
+ distribution = distribution.depth( depthLayer );
195
+
196
+ }
197
+
198
+ distribution = distribution.rg;
199
+
200
+ const hardShadow = step( shadowCoord.z, distribution.x );
201
+
202
+ If( hardShadow.notEqual( float( 1.0 ) ), () => {
203
+
204
+ const distance = shadowCoord.z.sub( distribution.x );
205
+ const variance = max( 0, distribution.y.mul( distribution.y ) );
206
+ let softnessProbability = variance.div( variance.add( distance.mul( distance ) ) ); // Chebeyshevs inequality
207
+ softnessProbability = clamp( sub( softnessProbability, 0.3 ).div( 0.95 - 0.3 ) );
208
+ occlusion.assign( clamp( max( hardShadow, softnessProbability ) ) );
209
+
210
+ } );
211
+
212
+ return occlusion;
213
+
214
+ } );
215
+
216
+ //
217
+
218
+ const linearDistance = /*@__PURE__*/ Fn( ( [ position, cameraNear, cameraFar ] ) => {
219
+
220
+ let dist = positionWorld.sub( position ).length();
221
+ dist = dist.sub( cameraNear ).div( cameraFar.sub( cameraNear ) );
222
+ dist = dist.saturate(); // clamp to [ 0, 1 ]
223
+
224
+ return dist;
225
+
226
+ } );
227
+
228
+ const linearShadowDistance = ( light ) => {
229
+
230
+ const camera = light.shadow.camera;
231
+
232
+ const nearDistance = reference( 'near', 'float', camera ).setGroup( renderGroup );
233
+ const farDistance = reference( 'far', 'float', camera ).setGroup( renderGroup );
234
+
235
+ const referencePosition = objectPosition( light );
236
+
237
+ return linearDistance( referencePosition, nearDistance, farDistance );
238
+
239
+ };
240
+
241
+ /**
242
+ * Retrieves or creates a shadow material for the given light source.
243
+ *
244
+ * This function checks if a shadow material already exists for the provided light.
245
+ * If not, it creates a new `NodeMaterial` configured for shadow rendering and stores it
246
+ * in the `shadowMaterialLib` for future use.
247
+ *
248
+ * @param {Light} light - The light source for which the shadow material is needed.
249
+ * If the light is a point light, a depth node is calculated
250
+ * using the linear shadow distance.
251
+ * @returns {NodeMaterial} The shadow material associated with the given light.
252
+ */
253
+ export const getShadowMaterial = ( light ) => {
254
+
255
+ let material = shadowMaterialLib.get( light );
256
+
257
+ if ( material === undefined ) {
258
+
259
+ const depthNode = light.isPointLight ? linearShadowDistance( light ) : null;
260
+
261
+ material = new NodeMaterial();
262
+ material.colorNode = vec4( 0, 0, 0, 1 );
263
+ material.depthNode = depthNode;
264
+ material.isShadowPassMaterial = true; // Use to avoid other overrideMaterial override material.colorNode unintentionally when using material.shadowNode
265
+ material.name = 'ShadowMaterial';
266
+ material.fog = false;
267
+
268
+ shadowMaterialLib.set( light, material );
269
+
270
+ }
271
+
272
+ return material;
273
+
274
+ };