@plastic-software/three 0.175.14 → 0.178.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 (528) hide show
  1. package/README.md +3 -3
  2. package/build/three.cjs +7746 -6791
  3. package/build/three.core.js +7371 -6576
  4. package/build/three.core.min.js +1 -1
  5. package/build/three.module.js +189 -29
  6. package/build/three.module.min.js +1 -1
  7. package/build/three.tsl.js +19 -11
  8. package/build/three.tsl.min.js +1 -1
  9. package/build/three.webgpu.js +4989 -2235
  10. package/build/three.webgpu.min.js +1 -1
  11. package/build/three.webgpu.nodes.js +5082 -2469
  12. package/build/three.webgpu.nodes.min.js +1 -1
  13. package/examples/jsm/Addons.js +0 -1
  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 +1 -0
  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 +18 -4
  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 +49 -35
  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 +12 -10
  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 +2 -1
  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 +7 -0
  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/lighting/TiledLighting.js +1 -0
  76. package/examples/jsm/lights/LightProbeGenerator.js +1 -0
  77. package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -0
  78. package/examples/jsm/lights/RectAreaLightUniformsLib.js +1 -0
  79. package/examples/jsm/lines/Line2.js +1 -0
  80. package/examples/jsm/lines/LineGeometry.js +1 -0
  81. package/examples/jsm/lines/LineMaterial.js +4 -4
  82. package/examples/jsm/lines/LineSegments2.js +1 -0
  83. package/examples/jsm/lines/LineSegmentsGeometry.js +1 -0
  84. package/examples/jsm/lines/Wireframe.js +1 -0
  85. package/examples/jsm/lines/WireframeGeometry2.js +1 -0
  86. package/examples/jsm/lines/webgpu/Line2.js +1 -0
  87. package/examples/jsm/lines/webgpu/LineSegments2.js +3 -1
  88. package/examples/jsm/lines/webgpu/Wireframe.js +1 -0
  89. package/examples/jsm/loaders/3DMLoader.js +1 -0
  90. package/examples/jsm/loaders/3MFLoader.js +1 -0
  91. package/examples/jsm/loaders/AMFLoader.js +1 -0
  92. package/examples/jsm/loaders/BVHLoader.js +1 -0
  93. package/examples/jsm/loaders/ColladaLoader.js +6 -5
  94. package/examples/jsm/loaders/DDSLoader.js +1 -0
  95. package/examples/jsm/loaders/DRACOLoader.js +2 -1
  96. package/examples/jsm/loaders/EXRLoader.js +1 -0
  97. package/examples/jsm/loaders/FBXLoader.js +25 -23
  98. package/examples/jsm/loaders/FontLoader.js +1 -0
  99. package/examples/jsm/loaders/GCodeLoader.js +1 -0
  100. package/examples/jsm/loaders/GLTFLoader.js +10 -82
  101. package/examples/jsm/loaders/HDRCubeTextureLoader.js +1 -0
  102. package/examples/jsm/loaders/IESLoader.js +1 -0
  103. package/examples/jsm/loaders/KMZLoader.js +1 -0
  104. package/examples/jsm/loaders/KTX2Loader.js +67 -26
  105. package/examples/jsm/loaders/KTXLoader.js +1 -0
  106. package/examples/jsm/loaders/LDrawLoader.js +55 -3
  107. package/examples/jsm/loaders/LUT3dlLoader.js +1 -0
  108. package/examples/jsm/loaders/LUTCubeLoader.js +1 -0
  109. package/examples/jsm/loaders/LUTImageLoader.js +1 -0
  110. package/examples/jsm/loaders/LWOLoader.js +1 -13
  111. package/examples/jsm/loaders/LottieLoader.js +15 -0
  112. package/examples/jsm/loaders/MD2Loader.js +1 -0
  113. package/examples/jsm/loaders/MDDLoader.js +1 -0
  114. package/examples/jsm/loaders/MTLLoader.js +4 -3
  115. package/examples/jsm/loaders/MaterialXLoader.js +1 -0
  116. package/examples/jsm/loaders/NRRDLoader.js +1 -0
  117. package/examples/jsm/loaders/OBJLoader.js +1 -0
  118. package/examples/jsm/loaders/PCDLoader.js +122 -19
  119. package/examples/jsm/loaders/PDBLoader.js +1 -0
  120. package/examples/jsm/loaders/PLYLoader.js +1 -0
  121. package/examples/jsm/loaders/PVRLoader.js +1 -0
  122. package/examples/jsm/loaders/RGBELoader.js +1 -0
  123. package/examples/jsm/loaders/RGBMLoader.js +1 -0
  124. package/examples/jsm/loaders/STLLoader.js +1 -0
  125. package/examples/jsm/loaders/SVGLoader.js +1 -0
  126. package/examples/jsm/loaders/TDSLoader.js +1 -0
  127. package/examples/jsm/loaders/TGALoader.js +1 -0
  128. package/examples/jsm/loaders/TIFFLoader.js +1 -0
  129. package/examples/jsm/loaders/TTFLoader.js +1 -0
  130. package/examples/jsm/loaders/USDZLoader.js +1 -0
  131. package/examples/jsm/loaders/UltraHDRLoader.js +1 -0
  132. package/examples/jsm/loaders/VOXLoader.js +1 -0
  133. package/examples/jsm/loaders/VRMLLoader.js +3 -2
  134. package/examples/jsm/loaders/VTKLoader.js +1 -0
  135. package/examples/jsm/loaders/XYZLoader.js +1 -0
  136. package/examples/jsm/loaders/lwo/IFFParser.js +74 -74
  137. package/examples/jsm/materials/LDrawConditionalLineMaterial.js +1 -0
  138. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +1 -0
  139. package/examples/jsm/materials/MeshPostProcessingMaterial.js +1 -0
  140. package/examples/jsm/math/Capsule.js +2 -0
  141. package/examples/jsm/math/ColorConverter.js +1 -0
  142. package/examples/jsm/math/ConvexHull.js +2 -0
  143. package/examples/jsm/math/ImprovedNoise.js +19 -14
  144. package/examples/jsm/math/Lut.js +2 -0
  145. package/examples/jsm/math/MeshSurfaceSampler.js +2 -0
  146. package/examples/jsm/math/OBB.js +2 -0
  147. package/examples/jsm/math/Octree.js +20 -1
  148. package/examples/jsm/math/SimplexNoise.js +2 -0
  149. package/examples/jsm/misc/ConvexObjectBreaker.js +3 -1
  150. package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
  151. package/examples/jsm/misc/Gyroscope.js +1 -0
  152. package/examples/jsm/misc/MD2Character.js +2 -0
  153. package/examples/jsm/misc/MD2CharacterComplex.js +5 -3
  154. package/examples/jsm/misc/MorphAnimMesh.js +1 -0
  155. package/examples/jsm/misc/MorphBlendMesh.js +1 -0
  156. package/examples/jsm/misc/ProgressiveLightMap.js +2 -0
  157. package/examples/jsm/misc/ProgressiveLightMapGPU.js +2 -0
  158. package/examples/jsm/misc/RollerCoaster.js +5 -0
  159. package/examples/jsm/misc/Timer.js +2 -0
  160. package/examples/jsm/misc/TubePainter.js +1 -0
  161. package/examples/jsm/misc/Volume.js +2 -0
  162. package/examples/jsm/misc/VolumeSlice.js +1 -0
  163. package/examples/jsm/modifiers/CurveModifier.js +3 -0
  164. package/examples/jsm/modifiers/CurveModifierGPU.js +2 -0
  165. package/examples/jsm/modifiers/EdgeSplitModifier.js +2 -0
  166. package/examples/jsm/modifiers/SimplifyModifier.js +2 -0
  167. package/examples/jsm/modifiers/TessellateModifier.js +2 -0
  168. package/examples/jsm/objects/GroundedSkybox.js +1 -0
  169. package/examples/jsm/objects/Lensflare.js +3 -0
  170. package/examples/jsm/objects/LensflareMesh.js +1 -0
  171. package/examples/jsm/objects/MarchingCubes.js +2 -0
  172. package/examples/jsm/objects/Reflector.js +1 -0
  173. package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
  174. package/examples/jsm/objects/Refractor.js +1 -0
  175. package/examples/jsm/objects/ShadowMesh.js +1 -0
  176. package/examples/jsm/objects/Sky.js +2 -1
  177. package/examples/jsm/objects/SkyMesh.js +20 -17
  178. package/examples/jsm/objects/Water.js +1 -0
  179. package/examples/jsm/objects/Water2.js +1 -0
  180. package/examples/jsm/objects/Water2Mesh.js +3 -1
  181. package/examples/jsm/objects/WaterMesh.js +2 -1
  182. package/examples/jsm/physics/AmmoPhysics.js +1 -0
  183. package/examples/jsm/physics/JoltPhysics.js +1 -0
  184. package/examples/jsm/physics/RapierPhysics.js +139 -12
  185. package/examples/jsm/postprocessing/AfterimagePass.js +20 -2
  186. package/examples/jsm/postprocessing/BloomPass.js +2 -1
  187. package/examples/jsm/postprocessing/BokehPass.js +2 -1
  188. package/examples/jsm/postprocessing/ClearPass.js +1 -0
  189. package/examples/jsm/postprocessing/CubeTexturePass.js +1 -0
  190. package/examples/jsm/postprocessing/DotScreenPass.js +1 -0
  191. package/examples/jsm/postprocessing/EffectComposer.js +4 -2
  192. package/examples/jsm/postprocessing/FXAAPass.js +40 -0
  193. package/examples/jsm/postprocessing/FilmPass.js +1 -0
  194. package/examples/jsm/postprocessing/GTAOPass.js +4 -3
  195. package/examples/jsm/postprocessing/GlitchPass.js +2 -1
  196. package/examples/jsm/postprocessing/HalftonePass.js +2 -1
  197. package/examples/jsm/postprocessing/LUTPass.js +1 -0
  198. package/examples/jsm/postprocessing/MaskPass.js +1 -0
  199. package/examples/jsm/postprocessing/OutlinePass.js +5 -2
  200. package/examples/jsm/postprocessing/OutputPass.js +1 -0
  201. package/examples/jsm/postprocessing/Pass.js +3 -1
  202. package/examples/jsm/postprocessing/RenderPass.js +1 -0
  203. package/examples/jsm/postprocessing/RenderPixelatedPass.js +2 -1
  204. package/examples/jsm/postprocessing/RenderTransitionPass.js +4 -3
  205. package/examples/jsm/postprocessing/SAOPass.js +3 -2
  206. package/examples/jsm/postprocessing/SMAAPass.js +3 -2
  207. package/examples/jsm/postprocessing/SSAARenderPass.js +2 -1
  208. package/examples/jsm/postprocessing/SSAOPass.js +2 -1
  209. package/examples/jsm/postprocessing/SSRPass.js +4 -3
  210. package/examples/jsm/postprocessing/SavePass.js +2 -1
  211. package/examples/jsm/postprocessing/ShaderPass.js +1 -0
  212. package/examples/jsm/postprocessing/TAARenderPass.js +1 -0
  213. package/examples/jsm/postprocessing/TexturePass.js +1 -0
  214. package/examples/jsm/postprocessing/UnrealBloomPass.js +2 -1
  215. package/examples/jsm/renderers/CSS2DRenderer.js +3 -0
  216. package/examples/jsm/renderers/CSS3DRenderer.js +4 -0
  217. package/examples/jsm/renderers/Projector.js +2 -0
  218. package/examples/jsm/renderers/SVGRenderer.js +3 -0
  219. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +4 -1
  220. package/examples/jsm/shaders/AfterimageShader.js +4 -1
  221. package/examples/jsm/shaders/BasicShader.js +4 -1
  222. package/examples/jsm/shaders/BleachBypassShader.js +4 -1
  223. package/examples/jsm/shaders/BlendShader.js +4 -1
  224. package/examples/jsm/shaders/BokehShader.js +4 -1
  225. package/examples/jsm/shaders/BokehShader2.js +4 -1
  226. package/examples/jsm/shaders/BrightnessContrastShader.js +4 -1
  227. package/examples/jsm/shaders/ColorCorrectionShader.js +4 -1
  228. package/examples/jsm/shaders/ColorifyShader.js +4 -1
  229. package/examples/jsm/shaders/ConvolutionShader.js +4 -1
  230. package/examples/jsm/shaders/CopyShader.js +4 -1
  231. package/examples/jsm/shaders/DOFMipMapShader.js +4 -1
  232. package/examples/jsm/shaders/DepthLimitedBlurShader.js +4 -1
  233. package/examples/jsm/shaders/DigitalGlitch.js +4 -1
  234. package/examples/jsm/shaders/DotScreenShader.js +4 -1
  235. package/examples/jsm/shaders/ExposureShader.js +4 -1
  236. package/examples/jsm/shaders/FXAAShader.js +4 -1
  237. package/examples/jsm/shaders/FilmShader.js +4 -1
  238. package/examples/jsm/shaders/FocusShader.js +4 -1
  239. package/examples/jsm/shaders/FreiChenShader.js +4 -1
  240. package/examples/jsm/shaders/GTAOShader.js +4 -1
  241. package/examples/jsm/shaders/GammaCorrectionShader.js +4 -1
  242. package/examples/jsm/shaders/GodRaysShader.js +4 -1
  243. package/examples/jsm/shaders/HalftoneShader.js +4 -1
  244. package/examples/jsm/shaders/HorizontalBlurShader.js +4 -1
  245. package/examples/jsm/shaders/HorizontalTiltShiftShader.js +4 -1
  246. package/examples/jsm/shaders/HueSaturationShader.js +4 -1
  247. package/examples/jsm/shaders/KaleidoShader.js +4 -1
  248. package/examples/jsm/shaders/LuminosityHighPassShader.js +4 -1
  249. package/examples/jsm/shaders/LuminosityShader.js +4 -1
  250. package/examples/jsm/shaders/MirrorShader.js +4 -1
  251. package/examples/jsm/shaders/NormalMapShader.js +4 -1
  252. package/examples/jsm/shaders/OutputShader.js +4 -1
  253. package/examples/jsm/shaders/PoissonDenoiseShader.js +4 -1
  254. package/examples/jsm/shaders/RGBShiftShader.js +4 -1
  255. package/examples/jsm/shaders/SAOShader.js +4 -1
  256. package/examples/jsm/shaders/SMAAShader.js +1 -0
  257. package/examples/jsm/shaders/SSAOShader.js +4 -1
  258. package/examples/jsm/shaders/SSRShader.js +1 -0
  259. package/examples/jsm/shaders/SepiaShader.js +4 -1
  260. package/examples/jsm/shaders/SobelOperatorShader.js +4 -1
  261. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +4 -1
  262. package/examples/jsm/shaders/TechnicolorShader.js +4 -1
  263. package/examples/jsm/shaders/ToonShader.js +2 -1
  264. package/examples/jsm/shaders/TriangleBlurShader.js +4 -1
  265. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +4 -1
  266. package/examples/jsm/shaders/VelocityShader.js +4 -1
  267. package/examples/jsm/shaders/VerticalBlurShader.js +4 -1
  268. package/examples/jsm/shaders/VerticalTiltShiftShader.js +4 -1
  269. package/examples/jsm/shaders/VignetteShader.js +4 -1
  270. package/examples/jsm/shaders/VolumeShader.js +5 -2
  271. package/examples/jsm/shaders/WaterRefractionShader.js +4 -1
  272. package/examples/jsm/textures/FlakesTexture.js +2 -0
  273. package/examples/jsm/transpiler/AST.js +381 -30
  274. package/examples/jsm/transpiler/GLSLDecoder.js +226 -87
  275. package/examples/jsm/transpiler/Linker.js +327 -0
  276. package/examples/jsm/transpiler/TSLEncoder.js +234 -85
  277. package/examples/jsm/transpiler/Transpiler.js +19 -1
  278. package/examples/jsm/transpiler/TranspilerUtils.js +29 -0
  279. package/examples/jsm/transpiler/WGSLEncoder.js +788 -0
  280. package/examples/jsm/tsl/display/AfterImageNode.js +2 -3
  281. package/examples/jsm/tsl/display/AnaglyphPassNode.js +1 -0
  282. package/examples/jsm/tsl/display/AnamorphicNode.js +5 -4
  283. package/examples/jsm/tsl/display/BloomNode.js +1 -0
  284. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +206 -0
  285. package/examples/jsm/tsl/display/DenoiseNode.js +33 -33
  286. package/examples/jsm/tsl/display/DepthOfFieldNode.js +1 -0
  287. package/examples/jsm/tsl/display/DotScreenNode.js +1 -0
  288. package/examples/jsm/tsl/display/FXAANode.js +3 -2
  289. package/examples/jsm/tsl/display/FilmNode.js +1 -0
  290. package/examples/jsm/tsl/display/GTAONode.js +1 -0
  291. package/examples/jsm/tsl/display/GaussianBlurNode.js +4 -29
  292. package/examples/jsm/tsl/display/LensflareNode.js +1 -0
  293. package/examples/jsm/tsl/display/Lut3DNode.js +1 -0
  294. package/examples/jsm/tsl/display/OutlineNode.js +1 -0
  295. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +1 -0
  296. package/examples/jsm/tsl/display/PixelationPassNode.js +1 -0
  297. package/examples/jsm/tsl/display/RGBShiftNode.js +1 -0
  298. package/examples/jsm/tsl/display/SMAANode.js +9 -8
  299. package/examples/jsm/tsl/display/SSAAPassNode.js +5 -4
  300. package/examples/jsm/tsl/display/SSRNode.js +1 -0
  301. package/examples/jsm/tsl/display/SobelOperatorNode.js +1 -0
  302. package/examples/jsm/tsl/display/StereoCompositePassNode.js +1 -0
  303. package/examples/jsm/tsl/display/StereoPassNode.js +1 -0
  304. package/examples/jsm/tsl/display/TRAAPassNode.js +5 -4
  305. package/examples/jsm/tsl/display/TransitionNode.js +1 -0
  306. package/examples/jsm/tsl/display/hashBlur.js +28 -6
  307. package/examples/jsm/tsl/lighting/TiledLightsNode.js +4 -3
  308. package/examples/jsm/tsl/math/Bayer.js +4 -1
  309. package/examples/jsm/tsl/shadows/TileShadowNode.js +456 -0
  310. package/examples/jsm/tsl/shadows/TileShadowNodeHelper.js +212 -0
  311. package/examples/jsm/tsl/utils/Raymarching.js +6 -3
  312. package/examples/jsm/utils/BufferGeometryUtils.js +4 -1
  313. package/examples/jsm/utils/CameraUtils.js +4 -1
  314. package/examples/jsm/utils/GeometryCompressionUtils.js +4 -1
  315. package/examples/jsm/utils/GeometryUtils.js +4 -1
  316. package/examples/jsm/utils/LDrawUtils.js +2 -0
  317. package/examples/jsm/utils/SceneOptimizer.js +2 -0
  318. package/examples/jsm/utils/SceneUtils.js +4 -1
  319. package/examples/jsm/utils/ShadowMapViewer.js +2 -0
  320. package/examples/jsm/utils/ShadowMapViewerGPU.js +2 -0
  321. package/examples/jsm/utils/SkeletonUtils.js +4 -1
  322. package/examples/jsm/utils/SortUtils.js +4 -1
  323. package/examples/jsm/utils/UVsDebug.js +4 -1
  324. package/examples/jsm/utils/WebGLTextureUtils.js +4 -1
  325. package/examples/jsm/utils/WebGPUTextureUtils.js +4 -1
  326. package/examples/jsm/utils/WorkerPool.js +2 -0
  327. package/examples/jsm/webxr/ARButton.js +1 -0
  328. package/examples/jsm/webxr/OculusHandModel.js +1 -0
  329. package/examples/jsm/webxr/OculusHandPointerModel.js +1 -0
  330. package/examples/jsm/webxr/Text2D.js +4 -1
  331. package/examples/jsm/webxr/VRButton.js +1 -0
  332. package/examples/jsm/webxr/XRButton.js +1 -0
  333. package/examples/jsm/webxr/XRControllerModelFactory.js +2 -0
  334. package/examples/jsm/webxr/XREstimatedLight.js +1 -0
  335. package/examples/jsm/webxr/XRHandMeshModel.js +2 -0
  336. package/examples/jsm/webxr/XRHandModelFactory.js +2 -0
  337. package/examples/jsm/webxr/XRHandPrimitiveModel.js +2 -0
  338. package/examples/jsm/webxr/XRPlanes.js +1 -0
  339. package/package.json +6 -4
  340. package/src/Three.Core.js +1 -1
  341. package/src/Three.TSL.js +18 -10
  342. package/src/Three.WebGPU.Nodes.js +1 -0
  343. package/src/Three.WebGPU.js +3 -0
  344. package/src/audio/AudioListener.js +13 -10
  345. package/src/cameras/ArrayCamera.js +9 -1
  346. package/src/constants.js +47 -20
  347. package/src/core/BufferAttribute.js +3 -3
  348. package/src/core/BufferGeometry.js +2 -5
  349. package/src/core/Clock.js +2 -8
  350. package/src/core/GLBufferAttribute.js +13 -1
  351. package/src/core/Object3D.js +23 -22
  352. package/src/core/RenderTarget.js +65 -21
  353. package/src/core/RenderTarget3D.js +1 -0
  354. package/src/extras/TextureUtils.js +1 -5
  355. package/src/extras/core/Curve.js +1 -1
  356. package/src/extras/core/Path.js +22 -22
  357. package/src/geometries/CapsuleGeometry.js +167 -17
  358. package/src/geometries/ExtrudeGeometry.js +39 -29
  359. package/src/helpers/ArrowHelper.js +2 -2
  360. package/src/helpers/SkeletonHelper.js +1 -1
  361. package/src/lights/LightShadow.js +14 -0
  362. package/src/lights/SpotLightShadow.js +9 -1
  363. package/src/lights/webgpu/ProjectorLight.js +46 -0
  364. package/src/loaders/BufferGeometryLoader.js +1 -10
  365. package/src/loaders/FileLoader.js +2 -2
  366. package/src/loaders/ImageBitmapLoader.js +25 -9
  367. package/src/loaders/ImageLoader.js +55 -8
  368. package/src/loaders/ObjectLoader.js +44 -16
  369. package/src/loaders/nodes/NodeObjectLoader.js +2 -2
  370. package/src/materials/Material.js +1 -7
  371. package/src/materials/nodes/MeshBasicNodeMaterial.js +4 -3
  372. package/src/materials/nodes/MeshMatcapNodeMaterial.js +1 -1
  373. package/src/materials/nodes/MeshNormalNodeMaterial.js +2 -2
  374. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +2 -1
  375. package/src/materials/nodes/MeshSSSNodeMaterial.js +2 -2
  376. package/src/materials/nodes/NodeMaterial.js +105 -19
  377. package/src/materials/nodes/manager/NodeMaterialObserver.js +20 -2
  378. package/src/math/Box3.js +28 -0
  379. package/src/math/Color.js +7 -7
  380. package/src/math/ColorManagement.js +22 -3
  381. package/src/math/Frustum.js +6 -1
  382. package/src/math/FrustumArray.js +253 -0
  383. package/src/math/Quaternion.js +1 -1
  384. package/src/math/Ray.js +2 -0
  385. package/src/math/Sphere.js +28 -0
  386. package/src/nodes/Nodes.js +2 -3
  387. package/src/nodes/TSL.js +5 -3
  388. package/src/nodes/accessors/AccessorsUtils.js +7 -8
  389. package/src/nodes/accessors/Bitangent.js +54 -26
  390. package/src/nodes/accessors/Camera.js +31 -4
  391. package/src/nodes/accessors/CubeTextureNode.js +50 -2
  392. package/src/nodes/accessors/InstanceNode.js +5 -4
  393. package/src/nodes/accessors/Lights.js +2 -2
  394. package/src/nodes/accessors/MaterialNode.js +4 -0
  395. package/src/nodes/accessors/ModelNode.js +1 -1
  396. package/src/nodes/accessors/Normal.js +102 -16
  397. package/src/nodes/accessors/Object3DNode.js +7 -8
  398. package/src/nodes/accessors/Position.js +14 -4
  399. package/src/nodes/accessors/ReferenceBaseNode.js +1 -1
  400. package/src/nodes/accessors/ReferenceNode.js +1 -1
  401. package/src/nodes/accessors/ReflectVector.js +3 -3
  402. package/src/nodes/accessors/SkinningNode.js +3 -2
  403. package/src/nodes/accessors/StorageBufferNode.js +25 -0
  404. package/src/nodes/accessors/StorageTextureNode.js +14 -3
  405. package/src/nodes/accessors/Tangent.js +25 -17
  406. package/src/nodes/accessors/TangentUtils.js +46 -0
  407. package/src/nodes/accessors/TextureBicubic.js +21 -3
  408. package/src/nodes/accessors/TextureNode.js +59 -8
  409. package/src/nodes/accessors/UniformArrayNode.js +0 -16
  410. package/src/nodes/accessors/VelocityNode.js +1 -0
  411. package/src/nodes/accessors/VertexColorNode.js +4 -4
  412. package/src/nodes/code/CodeNode.js +8 -11
  413. package/src/nodes/core/AssignNode.js +27 -5
  414. package/src/nodes/core/AttributeNode.js +2 -2
  415. package/src/nodes/core/ContextNode.js +7 -3
  416. package/src/nodes/core/Node.js +69 -20
  417. package/src/nodes/core/NodeBuilder.js +248 -29
  418. package/src/nodes/core/NodeUtils.js +42 -0
  419. package/src/nodes/core/NodeVarying.js +19 -1
  420. package/src/nodes/core/PropertyNode.js +8 -12
  421. package/src/nodes/core/StackNode.js +129 -26
  422. package/src/nodes/core/StructTypeNode.js +26 -4
  423. package/src/nodes/core/SubBuildNode.js +89 -0
  424. package/src/nodes/core/VarNode.js +11 -2
  425. package/src/nodes/core/VaryingNode.js +45 -24
  426. package/src/nodes/display/BlendModes.js +42 -1
  427. package/src/nodes/display/ColorSpaceNode.js +4 -27
  428. package/src/nodes/display/FrontFacingNode.js +34 -2
  429. package/src/nodes/display/NormalMapNode.js +19 -50
  430. package/src/nodes/display/PassNode.js +18 -19
  431. package/src/nodes/display/ScreenNode.js +0 -26
  432. package/src/nodes/functions/BSDF/BRDF_GGX.js +2 -6
  433. package/src/nodes/functions/BSDF/BRDF_Sheen.js +4 -4
  434. package/src/nodes/functions/PhongLightingModel.js +3 -3
  435. package/src/nodes/functions/PhysicalLightingModel.js +14 -14
  436. package/src/nodes/functions/ShadowMaskModel.js +5 -1
  437. package/src/nodes/functions/material/getGeometryRoughness.js +2 -2
  438. package/src/nodes/functions/material/getParallaxCorrectNormal.js +1 -1
  439. package/src/nodes/gpgpu/AtomicFunctionNode.js +28 -10
  440. package/src/nodes/gpgpu/BarrierNode.js +3 -3
  441. package/src/nodes/gpgpu/ComputeNode.js +1 -1
  442. package/src/nodes/lighting/AnalyticLightNode.js +7 -13
  443. package/src/nodes/lighting/EnvironmentNode.js +5 -5
  444. package/src/nodes/lighting/HemisphereLightNode.js +2 -2
  445. package/src/nodes/lighting/IESSpotLightNode.js +2 -1
  446. package/src/nodes/lighting/LightsNode.js +29 -11
  447. package/src/nodes/lighting/ProjectorLightNode.js +78 -0
  448. package/src/nodes/lighting/ShadowBaseNode.js +1 -12
  449. package/src/nodes/lighting/ShadowFilterNode.js +274 -0
  450. package/src/nodes/lighting/ShadowNode.js +174 -242
  451. package/src/nodes/lighting/SpotLightNode.js +44 -7
  452. package/src/nodes/materialx/lib/mx_noise.js +1 -1
  453. package/src/nodes/math/ConditionalNode.js +0 -19
  454. package/src/nodes/math/MathNode.js +68 -21
  455. package/src/nodes/math/OperatorNode.js +108 -98
  456. package/src/nodes/shapes/Shapes.js +5 -4
  457. package/src/nodes/tsl/TSLBase.js +1 -0
  458. package/src/nodes/tsl/TSLCore.js +160 -65
  459. package/src/nodes/utils/DebugNode.js +15 -3
  460. package/src/nodes/utils/Discard.js +2 -2
  461. package/src/nodes/utils/EquirectUV.js +27 -0
  462. package/src/nodes/utils/LoopNode.js +64 -34
  463. package/src/nodes/utils/MatcapUV.js +22 -0
  464. package/src/nodes/utils/RTTNode.js +13 -5
  465. package/src/nodes/utils/ReflectorNode.js +77 -7
  466. package/src/nodes/utils/SampleNode.js +81 -0
  467. package/src/nodes/utils/TriplanarTextures.js +65 -0
  468. package/src/objects/BatchedMesh.js +16 -4
  469. package/src/objects/Mesh.js +9 -0
  470. package/src/objects/Skeleton.js +1 -1
  471. package/src/objects/Sprite.js +9 -0
  472. package/src/renderers/WebGL3DRenderTarget.js +1 -0
  473. package/src/renderers/WebGLArrayRenderTarget.js +1 -0
  474. package/src/renderers/WebGLCubeRenderTarget.js +2 -4
  475. package/src/renderers/WebGLRenderer.js +25 -11
  476. package/src/renderers/common/Animation.js +2 -2
  477. package/src/renderers/common/Background.js +13 -2
  478. package/src/renderers/common/CubeRenderTarget.js +1 -1
  479. package/src/renderers/common/RenderList.js +0 -4
  480. package/src/renderers/common/RenderObject.js +80 -4
  481. package/src/renderers/common/Renderer.js +116 -8
  482. package/src/renderers/common/Storage3DTexture.js +79 -0
  483. package/src/renderers/common/StorageArrayTexture.js +63 -0
  484. package/src/renderers/common/Textures.js +15 -21
  485. package/src/renderers/common/TimestampQueryPool.js +1 -0
  486. package/src/renderers/common/Uniform.js +1 -1
  487. package/src/renderers/common/UniformsGroup.js +14 -18
  488. package/src/renderers/common/XRManager.js +157 -27
  489. package/src/renderers/common/XRRenderTarget.js +21 -4
  490. package/src/renderers/common/extras/PMREMGenerator.js +30 -23
  491. package/src/renderers/common/nodes/Nodes.js +13 -3
  492. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +1 -1
  493. package/src/renderers/shaders/ShaderLib/background.glsl.js +1 -1
  494. package/src/renderers/webgl/WebGLAttributes.js +4 -0
  495. package/src/renderers/webgl/WebGLPrograms.js +4 -2
  496. package/src/renderers/webgl/WebGLShadowMap.js +3 -2
  497. package/src/renderers/webgl/WebGLState.js +4 -4
  498. package/src/renderers/webgl/WebGLTextures.js +144 -4
  499. package/src/renderers/webgl/WebGLUtils.js +1 -3
  500. package/src/renderers/webgl-fallback/WebGLBackend.js +244 -87
  501. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +73 -7
  502. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +4 -0
  503. package/src/renderers/webgl-fallback/utils/WebGLConstants.js +1 -0
  504. package/src/renderers/webgl-fallback/utils/WebGLState.js +4 -4
  505. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +44 -29
  506. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +22 -21
  507. package/src/renderers/webgpu/WebGPUBackend.js +451 -128
  508. package/src/renderers/webgpu/WebGPURenderer.js +7 -0
  509. package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +4 -1
  510. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +4 -1
  511. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +86 -33
  512. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +3 -0
  513. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +9 -1
  514. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +28 -5
  515. package/src/renderers/webgpu/utils/WebGPUConstants.js +8 -2
  516. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +38 -8
  517. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +45 -50
  518. package/src/renderers/webxr/WebXRController.js +1 -1
  519. package/src/renderers/webxr/WebXRManager.js +2 -1
  520. package/src/textures/DepthTexture.js +6 -10
  521. package/src/textures/Source.js +22 -0
  522. package/src/textures/Texture.js +118 -1
  523. package/src/textures/VideoTexture.js +1 -1
  524. package/examples/jsm/effects/PeppersGhostEffect.js +0 -172
  525. package/src/core/RenderTargetArray.js +0 -40
  526. package/src/nodes/utils/EquirectUVNode.js +0 -65
  527. package/src/nodes/utils/MatcapUVNode.js +0 -49
  528. package/src/nodes/utils/TriplanarTexturesNode.js +0 -148
@@ -7,6 +7,7 @@ import { nodeObject, Fn, uv, uniform, convertToTexture, vec2, vec3, vec4, mat3,
7
7
  * space conversion.
8
8
  *
9
9
  * @augments TempNode
10
+ * @three_import import { sobel } from 'three/addons/tsl/display/SobelOperatorNode.js';
10
11
  */
11
12
  class SobelOperatorNode extends TempNode {
12
13
 
@@ -15,6 +15,7 @@ let _rendererState;
15
15
  *
16
16
  * @abstract
17
17
  * @augments PassNode
18
+ * @three_import import { StereoCompositePassNode } from 'three/addons/tsl/display/StereoCompositePassNode.js';
18
19
  */
19
20
  class StereoCompositePassNode extends PassNode {
20
21
 
@@ -9,6 +9,7 @@ let _rendererState;
9
9
  * A special render pass node that renders the scene as a stereoscopic image.
10
10
  *
11
11
  * @augments PassNode
12
+ * @three_import import { stereoPass } from 'three/addons/tsl/display/StereoPassNode.js';
12
13
  */
13
14
  class StereoPassNode extends PassNode {
14
15
 
@@ -17,6 +17,7 @@ let _rendererState;
17
17
  * - {@link https://www.elopezr.com/temporal-aa-and-the-quest-for-the-holy-trail/}
18
18
  *
19
19
  * @augments PassNode
20
+ * @three_import import { traaPass } from 'three/addons/tsl/display/TRAAPassNode.js';
20
21
  */
21
22
  class TRAAPassNode extends PassNode {
22
23
 
@@ -153,7 +154,7 @@ class TRAAPassNode extends PassNode {
153
154
  const { renderer } = frame;
154
155
  const { scene, camera } = this;
155
156
 
156
- _rendererState = RendererUtils.resetRendererAndSceneState( renderer, scene, _rendererState );
157
+ _rendererState = RendererUtils.resetRendererState( renderer, _rendererState );
157
158
 
158
159
  //
159
160
 
@@ -291,7 +292,7 @@ class TRAAPassNode extends PassNode {
291
292
 
292
293
  velocityOutput.setProjectionMatrix( null );
293
294
 
294
- RendererUtils.restoreRendererAndSceneState( renderer, scene, _rendererState );
295
+ RendererUtils.restoreRendererState( renderer, _rendererState );
295
296
 
296
297
  }
297
298
 
@@ -379,8 +380,8 @@ class TRAAPassNode extends PassNode {
379
380
  const currentWeight = float( 0.05 ).toVar();
380
381
  const historyWeight = currentWeight.oneMinus().toVar();
381
382
 
382
- const compressedCurrent = currentColor.mul( float( 1 ).div( ( max( max( currentColor.r, currentColor.g ), currentColor.b ).add( 1.0 ) ) ) );
383
- const compressedHistory = clampedHistoryColor.mul( float( 1 ).div( ( max( max( clampedHistoryColor.r, clampedHistoryColor.g ), clampedHistoryColor.b ).add( 1.0 ) ) ) );
383
+ const compressedCurrent = currentColor.mul( float( 1 ).div( ( max( currentColor.r, currentColor.g, currentColor.b ).add( 1.0 ) ) ) );
384
+ const compressedHistory = clampedHistoryColor.mul( float( 1 ).div( ( max( clampedHistoryColor.r, clampedHistoryColor.g, clampedHistoryColor.b ).add( 1.0 ) ) ) );
384
385
 
385
386
  const luminanceCurrent = luminance( compressedCurrent.rgb );
386
387
  const luminanceHistory = luminance( compressedHistory.rgb );
@@ -5,6 +5,7 @@ import { nodeObject, Fn, float, uv, convertToTexture, vec4, If, int, clamp, sub,
5
5
  * Post processing node for creating a transition effect between scenes.
6
6
  *
7
7
  * @augments TempNode
8
+ * @three_import import { transition } from 'three/addons/tsl/display/TransitionNode.js';
8
9
  */
9
10
  class TransitionNode extends TempNode {
10
11
 
@@ -1,20 +1,42 @@
1
- import { float, Fn, vec2, uv, sin, rand, degrees, cos, Loop, vec4 } from 'three/tsl';
1
+ import { float, Fn, vec2, uv, sin, rand, degrees, cos, Loop, vec4, premultiplyAlpha, unpremultiplyAlpha } from 'three/tsl';
2
2
 
3
3
  /**
4
4
  * Applies a hash blur effect to the given texture node.
5
5
  *
6
6
  * Reference: {@link https://www.shadertoy.com/view/4lXXWn}.
7
7
  *
8
- * @tsl
9
8
  * @function
10
9
  * @param {Node<vec4>} textureNode - The texture node that should be blurred.
11
10
  * @param {Node<float>} [bluramount=float(0.1)] - This node determines the amount of blur.
12
- * @param {Node<float>} [repeats=float(45)] - This node determines the quality of the blur. A higher value produces a less grainy result but is also more expensive.
11
+ * @param {Object} [options={}] - Additional options for the hash blur effect.
12
+ * @param {Node<float>} [options.repeats=float(45)] - The number of iterations for the blur effect.
13
+ * @param {Node<vec4>} [options.mask=null] - A mask node to control the alpha blending of the blur.
14
+ * @param {boolean} [options.premultipliedAlpha=false] - Whether to use premultiplied alpha for the blur effect.
13
15
  * @return {Node<vec4>} The blurred texture node.
14
16
  */
15
- export const hashBlur = /*#__PURE__*/ Fn( ( [ textureNode, bluramount = float( 0.1 ), repeats = float( 45 ) ] ) => {
17
+ export const hashBlur = /*#__PURE__*/ Fn( ( [ textureNode, bluramount = float( 0.1 ), options = {} ] ) => {
16
18
 
17
- const draw = ( uv ) => textureNode.sample( uv );
19
+ const {
20
+ repeats = float( 45 ),
21
+ mask = null,
22
+ premultipliedAlpha = false
23
+ } = options;
24
+
25
+ const draw = ( uv ) => {
26
+
27
+ let sample = textureNode.sample( uv );
28
+
29
+ if ( mask !== null ) {
30
+
31
+ const alpha = mask.sample( uv ).x;
32
+
33
+ sample = vec4( sample.rgb, sample.a.mul( alpha ) );
34
+
35
+ }
36
+
37
+ return premultipliedAlpha ? premultiplyAlpha( sample ) : sample;
38
+
39
+ };
18
40
 
19
41
  const targetUV = textureNode.uvNode || uv();
20
42
  const blurred_image = vec4( 0. ).toVar();
@@ -29,6 +51,6 @@ export const hashBlur = /*#__PURE__*/ Fn( ( [ textureNode, bluramount = float( 0
29
51
 
30
52
  blurred_image.divAssign( repeats );
31
53
 
32
- return blurred_image;
54
+ return premultipliedAlpha ? unpremultiplyAlpha( blurred_image ) : blurred_image;
33
55
 
34
56
  } );
@@ -40,6 +40,7 @@ const _size = /*@__PURE__*/ new Vector2();
40
40
  * a custom implementation.
41
41
  *
42
42
  * @augments LightsNode
43
+ * @three_import import { tiledLights } from 'three/addons/tsl/lighting/TiledLightsNode.js';
43
44
  */
44
45
  class TiledLightsNode extends LightsNode {
45
46
 
@@ -233,8 +234,8 @@ class TiledLightsNode extends LightsNode {
233
234
  const lightingModel = builder.context.reflectedLight;
234
235
 
235
236
  // force declaration order, before of the loop
236
- lightingModel.directDiffuse.append();
237
- lightingModel.directSpecular.append();
237
+ lightingModel.directDiffuse.toStack();
238
+ lightingModel.directSpecular.toStack();
238
239
 
239
240
  super.setupLights( builder, lightNodes );
240
241
 
@@ -261,7 +262,7 @@ class TiledLightsNode extends LightsNode {
261
262
 
262
263
  } );
263
264
 
264
- } )().append();
265
+ }, 'void' )();
265
266
 
266
267
  }
267
268
 
@@ -1,7 +1,10 @@
1
1
  import { TextureLoader } from 'three';
2
2
  import { Fn, int, ivec2, textureLoad } from 'three/tsl';
3
3
 
4
- /** @module Bayer */
4
+ /**
5
+ * @module Bayer
6
+ * @three_import import { bayer16 } from 'three/addons/tsl/math/Bayer.js';
7
+ */
5
8
 
6
9
  let bayer16Texture = null;
7
10
 
@@ -0,0 +1,456 @@
1
+ import {
2
+ Vector3,
3
+ Object3D,
4
+ ShadowBaseNode,
5
+ Plane,
6
+ Line3,
7
+ DepthTexture,
8
+ LessCompare,
9
+ Vector2,
10
+ RedFormat,
11
+ ArrayCamera,
12
+ VSMShadowMap,
13
+ RendererUtils,
14
+ Quaternion
15
+ } from 'three/webgpu';
16
+
17
+ import { min, Fn, shadow, NodeUpdateType, getShadowMaterial, getShadowRenderObjectFunction } from 'three/tsl';
18
+
19
+ const { resetRendererAndSceneState, restoreRendererAndSceneState } = RendererUtils;
20
+ let _rendererState;
21
+
22
+ const _cameraLayers = [];
23
+ const _vec3Temp1 = /*@__PURE__*/ new Vector3();
24
+ const _vec3Temp2 = /*@__PURE__*/ new Vector3();
25
+ const _vec3Temp3 = /*@__PURE__*/ new Vector3();
26
+ const _quatTemp1 = /*@__PURE__*/ new Quaternion();
27
+
28
+ class LwLight extends Object3D {
29
+
30
+ constructor() {
31
+
32
+ super();
33
+ this.target = new Object3D();
34
+
35
+ }
36
+
37
+ }
38
+
39
+ /**
40
+ * A class that extends `ShadowBaseNode` to implement tiled shadow mapping.
41
+ * This allows splitting a shadow map into multiple tiles, each with its own light and camera,
42
+ * to improve shadow quality and performance for large scenes.
43
+ *
44
+ * **Note:** This class does not support `VSMShadowMap` at the moment.
45
+ *
46
+ * @class
47
+ * @augments ShadowBaseNode
48
+ * @three_import import { TileShadowNode } from 'three/addons/tsl/shadows/TileShadowNode.js';
49
+ */
50
+ class TileShadowNode extends ShadowBaseNode {
51
+
52
+ /**
53
+ * Creates an instance of `TileShadowNode`.
54
+ *
55
+ * @param {Light} light - The original light source used for shadow mapping.
56
+ * @param {Object} [options={}] - Configuration options for the tiled shadow node.
57
+ * @param {number} [options.tilesX=2] - The number of tiles along the X-axis.
58
+ * @param {number} [options.tilesY=2] - The number of tiles along the Y-axis.
59
+ * @param {Object} [options.resolution] - The resolution of the shadow map.
60
+ * @param {boolean} [options.debug=false] - Whether to enable debug mode.
61
+ */
62
+ constructor( light, options = {} ) {
63
+
64
+ super( light );
65
+
66
+ // Default configuration with sensible defaults
67
+ this.config = {
68
+ tilesX: options.tilesX || 2,
69
+ tilesY: options.tilesY || 2,
70
+ resolution: options.resolution || light.shadow.mapSize,
71
+ debug: options.debug !== undefined ? options.debug : false
72
+ };
73
+
74
+ this.debug = this.config.debug;
75
+
76
+ this.originalLight = light;
77
+ this.lightPlane = new Plane( new Vector3( 0, 1, 0 ), 0 );
78
+ this.line = new Line3();
79
+
80
+ this.initialLightDirection = new Vector3();
81
+ this.updateLightDirection();
82
+
83
+ this._cameraFrameId = new WeakMap();
84
+
85
+ this.shadowSize = {
86
+ top: light.shadow.camera.top,
87
+ bottom: light.shadow.camera.bottom,
88
+ left: light.shadow.camera.left,
89
+ right: light.shadow.camera.right,
90
+ };
91
+
92
+ this.lights = [];
93
+ this._shadowNodes = [];
94
+
95
+ this.tiles = this.generateTiles( this.config.tilesX, this.config.tilesY );
96
+
97
+ }
98
+
99
+ /**
100
+ * Generates the tiles for the shadow map based on the specified number of tiles along the X and Y axes.
101
+ *
102
+ * @param {number} tilesX - The number of tiles along the X-axis.
103
+ * @param {number} tilesY - The number of tiles along the Y-axis.
104
+ * @returns {Array<Object>} An array of tile objects, each containing the tile's bounds and index.
105
+ */
106
+ generateTiles( tilesX, tilesY ) {
107
+
108
+ const tiles = [];
109
+ const tileWidth = 1 / tilesX;
110
+ const tileHeight = 1 / tilesY;
111
+
112
+ for ( let y = 0; y < tilesY; y ++ ) {
113
+
114
+ for ( let x = 0; x < tilesX; x ++ ) {
115
+
116
+ tiles.push( {
117
+ x: [ x * tileWidth, ( x + 1 ) * tileWidth ],
118
+ y: [ ( tilesY - 1 - y ) * tileHeight, ( tilesY - y ) * tileHeight ], // Start from top row
119
+ index: y * tilesX + x
120
+ } );
121
+
122
+ }
123
+
124
+ }
125
+
126
+ return tiles;
127
+
128
+ }
129
+
130
+ /**
131
+ * Updates the initial light direction based on the light's target position.
132
+ */
133
+ updateLightDirection() {
134
+
135
+ this.initialLightDirection.subVectors(
136
+ this.originalLight.target.getWorldPosition( new Vector3() ),
137
+ this.originalLight.getWorldPosition( new Vector3() )
138
+ ).normalize();
139
+
140
+ }
141
+
142
+ /**
143
+ * Initializes the tiled shadow node by creating lights, cameras, and shadow maps for each tile.
144
+ *
145
+ * @param {Builder} builder - The builder used to create render targets and other resources.
146
+ */
147
+ init( builder ) {
148
+
149
+ const light = this.originalLight;
150
+ const parent = light.parent;
151
+
152
+ const width = this.shadowSize.right - this.shadowSize.left;
153
+ const height = this.shadowSize.top - this.shadowSize.bottom;
154
+
155
+ const tileCount = this.tiles.length;
156
+ const shadowWidth = this.config.resolution.width;
157
+ const shadowHeight = this.config.resolution.height;
158
+
159
+ // Clear existing lights/nodes if re-initializing
160
+ this.disposeLightsAndNodes();
161
+
162
+ const depthTexture = new DepthTexture( shadowWidth, shadowHeight, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, tileCount );
163
+ depthTexture.compareFunction = LessCompare;
164
+ depthTexture.name = 'ShadowDepthArrayTexture';
165
+ const shadowMap = builder.createRenderTarget( shadowWidth, shadowHeight, { format: RedFormat, depth: tileCount } );
166
+ shadowMap.depthTexture = depthTexture;
167
+ shadowMap.texture.name = 'ShadowTexture';
168
+ this.shadowMap = shadowMap;
169
+ const cameras = [];
170
+
171
+
172
+ // Create lights, one for each tile
173
+ for ( let i = 0; i < tileCount; i ++ ) {
174
+
175
+ const lwLight = new LwLight();
176
+ lwLight.castShadow = true;
177
+ const lShadow = light.shadow.clone();
178
+ lShadow.filterNode = light.shadow.filterNode;
179
+ const tile = this.tiles[ i ];
180
+ lShadow.camera.left = this.shadowSize.left + width * tile.x[ 0 ];
181
+ lShadow.camera.right = this.shadowSize.left + width * tile.x[ 1 ];
182
+ lShadow.camera.top = this.shadowSize.bottom + height * tile.y[ 1 ];
183
+ lShadow.camera.bottom = this.shadowSize.bottom + height * tile.y[ 0 ];
184
+ lShadow.bias = light.shadow.bias;
185
+ lShadow.camera.near = light.shadow.camera.near;
186
+ lShadow.camera.far = light.shadow.camera.far;
187
+ lShadow.camera.userData.tileIndex = i;
188
+ lwLight.shadow = lShadow;
189
+
190
+ if ( parent ) {
191
+
192
+ parent.add( lwLight );
193
+ parent.add( lwLight.target );
194
+
195
+ } else {
196
+
197
+ console.warn( 'TileShadowNode: Original light has no parent during init. Tile lights not added to scene graph directly.' );
198
+
199
+ }
200
+
201
+ this.syncLightTransformation( lwLight, light );
202
+
203
+ this.lights.push( lwLight );
204
+ lShadow.camera.updateMatrixWorld();
205
+
206
+ cameras.push( lShadow.camera );
207
+ const shadowNode = shadow( lwLight, lShadow );
208
+ shadowNode.depthLayer = i;
209
+ shadowNode.updateBeforeType = NodeUpdateType.NONE;
210
+
211
+ shadowNode.setupRenderTarget = () => {
212
+
213
+ return { shadowMap, depthTexture };
214
+
215
+ };
216
+
217
+ this._shadowNodes.push( shadowNode );
218
+
219
+ }
220
+
221
+ const cameraArray = new ArrayCamera( cameras );
222
+ this.cameraArray = cameraArray;
223
+
224
+ }
225
+
226
+ /**
227
+ * Updates the light transformations and shadow cameras for each tile.
228
+ */
229
+ update() {
230
+
231
+ const light = this.originalLight;
232
+
233
+ const shadowCam = light.shadow.camera;
234
+ const lsMin = new Vector2( shadowCam.left, shadowCam.bottom );
235
+ const lsMax = new Vector2( shadowCam.right, shadowCam.top );
236
+ const fullWidth = lsMax.x - lsMin.x;
237
+ const fullHeight = lsMax.y - lsMin.y;
238
+
239
+ for ( let i = 0; i < this.lights.length; i ++ ) {
240
+
241
+ const lwLight = this.lights[ i ];
242
+ const tile = this.tiles[ i ];
243
+ this.syncLightTransformation( lwLight, light );
244
+ const lShadow = lwLight.shadow;
245
+ const tileLeft = lsMin.x + tile.x[ 0 ] * fullWidth;
246
+ const tileRight = lsMin.x + tile.x[ 1 ] * fullWidth;
247
+ const tileBottom = lsMin.y + tile.y[ 0 ] * fullHeight;
248
+ const tileTop = lsMin.y + tile.y[ 1 ] * fullHeight;
249
+ lShadow.camera.left = tileLeft;
250
+ lShadow.camera.right = tileRight;
251
+ lShadow.camera.bottom = tileBottom;
252
+ lShadow.camera.top = tileTop;
253
+ lShadow.camera.near = light.shadow.camera.near;
254
+ lShadow.camera.far = light.shadow.camera.far;
255
+ lShadow.camera.updateProjectionMatrix();
256
+ lShadow.camera.updateWorldMatrix( true, false );
257
+ lShadow.camera.updateMatrixWorld( true );
258
+ this._shadowNodes[ i ].shadow.needsUpdate = true;
259
+
260
+ }
261
+
262
+ }
263
+
264
+ /**
265
+ * Updates the shadow map rendering.
266
+ * @param {NodeFrame} frame - A reference to the current node frame.
267
+ */
268
+ updateShadow( frame ) {
269
+
270
+ const { shadowMap, light } = this;
271
+ const { renderer, scene, camera } = frame;
272
+ const shadowType = renderer.shadowMap.type;
273
+ const depthVersion = shadowMap.depthTexture.version;
274
+ this._depthVersionCached = depthVersion;
275
+ const currentRenderObjectFunction = renderer.getRenderObjectFunction();
276
+ const currentMRT = renderer.getMRT();
277
+ const useVelocity = currentMRT ? currentMRT.has( 'velocity' ) : false;
278
+
279
+ _rendererState = resetRendererAndSceneState( renderer, scene, _rendererState );
280
+ scene.overrideMaterial = getShadowMaterial( light );
281
+ renderer.setRenderTarget( this.shadowMap );
282
+
283
+
284
+ for ( let index = 0; index < this.lights.length; index ++ ) {
285
+
286
+ const light = this.lights[ index ];
287
+ const shadow = light.shadow;
288
+
289
+ const _shadowCameraLayer = shadow.camera.layers.mask;
290
+ _cameraLayers.push( _shadowCameraLayer );
291
+
292
+ if ( ( shadow.camera.layers.mask & 0xFFFFFFFE ) === 0 ) {
293
+
294
+ shadow.camera.layers.mask = camera.layers.mask;
295
+
296
+ }
297
+
298
+ shadow.updateMatrices( light );
299
+
300
+ renderer.setRenderObjectFunction( getShadowRenderObjectFunction( renderer, shadow, shadowType, useVelocity ) );
301
+ this.shadowMap.setSize( shadow.mapSize.width, shadow.mapSize.height, shadowMap.depth );
302
+
303
+ }
304
+
305
+ renderer.render( scene, this.cameraArray );
306
+ renderer.setRenderObjectFunction( currentRenderObjectFunction );
307
+
308
+ if ( light.isPointLight !== true && shadowType === VSMShadowMap ) {
309
+
310
+ console.warn( 'THREE.TileShadowNode: VSM shadow map is not supported yet.' );
311
+ // this.vsmPass( renderer );
312
+
313
+ }
314
+
315
+ restoreRendererAndSceneState( renderer, scene, _rendererState );
316
+
317
+ for ( let index = 0; index < this.lights.length; index ++ ) {
318
+
319
+ const light = this.lights[ index ];
320
+ const shadow = light.shadow;
321
+
322
+ shadow.camera.layers.mask = _cameraLayers[ index ];
323
+
324
+ }
325
+
326
+ _cameraLayers.length = 0;
327
+
328
+ }
329
+
330
+ /**
331
+ * The implementation performs the update of the shadow map if necessary.
332
+ *
333
+ * @param {NodeFrame} frame - A reference to the current node frame.
334
+ */
335
+ updateBefore( frame ) {
336
+
337
+ const shadow = this.originalLight.shadow;
338
+
339
+ let needsUpdate = shadow.needsUpdate || shadow.autoUpdate;
340
+
341
+ if ( needsUpdate ) {
342
+
343
+ if ( this._cameraFrameId[ frame.camera ] === frame.frameId ) {
344
+
345
+ needsUpdate = false;
346
+
347
+ }
348
+
349
+ this._cameraFrameId[ frame.camera ] = frame.frameId;
350
+
351
+ }
352
+
353
+ if ( needsUpdate ) {
354
+
355
+ this.update();
356
+ this.updateShadow( frame );
357
+
358
+ if ( this.shadowMap.depthTexture.version === this._depthVersionCached ) {
359
+
360
+ shadow.needsUpdate = false;
361
+
362
+ }
363
+
364
+ }
365
+
366
+ }
367
+
368
+ /**
369
+ * Synchronizes the transformation of a tile light with the source light.
370
+ *
371
+ * @param {LwLight} lwLight - The tile light to synchronize.
372
+ * @param {Light} sourceLight - The source light to copy transformations from.
373
+ */
374
+ syncLightTransformation( lwLight, sourceLight ) {
375
+
376
+ const sourceWorldPos = sourceLight.getWorldPosition( _vec3Temp1 );
377
+ const targetWorldPos = sourceLight.target.getWorldPosition( _vec3Temp2 );
378
+ const forward = _vec3Temp3.subVectors( targetWorldPos, sourceWorldPos );
379
+ const targetDistance = forward.length();
380
+ forward.normalize();
381
+ lwLight.position.copy( sourceWorldPos );
382
+ lwLight.target.position.copy( sourceWorldPos ).add( forward.multiplyScalar( targetDistance ) );
383
+ lwLight.quaternion.copy( sourceLight.getWorldQuaternion( _quatTemp1 ) );
384
+ lwLight.scale.copy( sourceLight.scale );
385
+ lwLight.updateMatrix();
386
+ lwLight.updateMatrixWorld( true );
387
+ lwLight.target.updateMatrix();
388
+ lwLight.target.updateMatrixWorld( true );
389
+
390
+ }
391
+
392
+ /**
393
+ * Sets up the shadow node for rendering.
394
+ *
395
+ * @param {Builder} builder - The builder used to set up the shadow node.
396
+ * @returns {Node} A node representing the shadow value.
397
+ */
398
+ setup( builder ) {
399
+
400
+ if ( this.lights.length === 0 ) {
401
+
402
+ this.init( builder );
403
+
404
+ }
405
+
406
+ return Fn( ( builder ) => {
407
+
408
+ this.setupShadowPosition( builder );
409
+ return min( ...this._shadowNodes ).toVar( 'shadowValue' );
410
+
411
+ } )();
412
+
413
+ }
414
+
415
+ /**
416
+ * Helper method to remove lights and associated nodes/targets.
417
+ * Used internally during dispose and potential re-initialization.
418
+ */
419
+ disposeLightsAndNodes() {
420
+
421
+ for ( const light of this.lights ) {
422
+
423
+ const parent = light.parent;
424
+ if ( parent ) {
425
+
426
+ parent.remove( light.target );
427
+ parent.remove( light );
428
+
429
+ }
430
+
431
+ }
432
+
433
+ this.lights = [];
434
+ this._shadowNodes = [];
435
+
436
+ if ( this.shadowMap ) {
437
+
438
+ this.shadowMap.dispose(); // Disposes render target and textures
439
+ this.shadowMap = null;
440
+
441
+ }
442
+
443
+ }
444
+
445
+
446
+ dispose() {
447
+
448
+ // Dispose lights, nodes, and shadow map
449
+ this.disposeLightsAndNodes();
450
+ super.dispose();
451
+
452
+ }
453
+
454
+ }
455
+
456
+ export { TileShadowNode };