@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
@@ -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 };
@@ -0,0 +1,212 @@
1
+ import { Group, NodeMaterial, Mesh, PlaneGeometry, DoubleSide, CameraHelper } from 'three/webgpu';
2
+ import { Fn, vec4, vec3, texture, uv, positionLocal, vec2, float, screenSize } from 'three/tsl';
3
+
4
+ /**
5
+ * Helper class to manage and display debug visuals for TileShadowNode.
6
+ *
7
+ * @augments Group
8
+ * @three_import import { TileShadowNodeHelper } from 'three/addons/tsl/shadows/TileShadowNodeHelper.js';
9
+ */
10
+ class TileShadowNodeHelper extends Group {
11
+
12
+ /**
13
+ * @param {TileShadowNode} tileShadowNode The TileShadowNode instance to debug.
14
+ */
15
+ constructor( tileShadowNode ) {
16
+
17
+ super();
18
+
19
+ if ( ! tileShadowNode ) {
20
+
21
+ throw new Error( 'TileShadowNode instance is required for TileShadowNodeHelper.' );
22
+
23
+ }
24
+
25
+ this.tileShadowNode = tileShadowNode;
26
+ this.config = tileShadowNode.config;
27
+ this.tiles = tileShadowNode.tiles;
28
+ this._debugMeshes = [];
29
+ this._shadowCamHelpers = [];
30
+
31
+ this.initialized = false;
32
+
33
+ }
34
+
35
+ /**
36
+ * Initializes the debug displays (planes and camera helpers).
37
+ * Should be called after TileShadowNode has initialized its lights and shadow nodes.
38
+ */
39
+ init() {
40
+
41
+ if ( this.tileShadowNode._shadowNodes.length !== this.tiles.length ) {
42
+
43
+ console.error( 'Cannot initialize TileShadowNodeHelper: Shadow nodes not ready or mismatch count.' );
44
+ return;
45
+
46
+ }
47
+
48
+ const tilesX = this.config.tilesX;
49
+ const tilesY = this.config.tilesY;
50
+
51
+ // Clear previous helpers if any (e.g., during a re-init)
52
+ this.dispose();
53
+
54
+ // Create a display for each shadow map tile
55
+ for ( let i = 0; i < this.tiles.length; i ++ ) {
56
+
57
+ // Create display plane
58
+ const display = new Mesh( new PlaneGeometry( 1, 1 ), new NodeMaterial() );
59
+ display.renderOrder = 9999999; // Ensure they appear on top
60
+ display.material.transparent = true;
61
+ display.frustumCulled = false;
62
+ display.side = DoubleSide;
63
+ display.material.depthTest = false; // Disable depth testing
64
+ display.material.depthWrite = false; // Disable depth writing
65
+
66
+ const col = i % tilesX;
67
+ const row = Math.floor( i / tilesX );
68
+
69
+ // Vertex shader logic for positioning the debug quad
70
+ display.material.vertexNode = Fn( () => {
71
+
72
+ const aspectRatio = screenSize.x.div( screenSize.y );
73
+ const maxTiles = Math.max( tilesX, tilesY );
74
+ const displaySize = float( 0.8 / maxTiles ); // Size adapts to number of tiles
75
+ const margin = float( 0.01 );
76
+ const cornerOffset = float( 0.05 );
77
+
78
+ // Position tiles left-to-right, top-to-bottom
79
+ const xBase = float( - 1.0 ).add( cornerOffset ).add(
80
+ displaySize.div( 2 ).div( aspectRatio )
81
+ ).add( float( col ).mul( displaySize.div( aspectRatio ).add( margin ) ) );
82
+
83
+ const yBase = float( 1.0 ).sub( cornerOffset ).sub(
84
+ displaySize.div( 2 )
85
+ ).sub( float( row ).mul( displaySize.add( margin ) ) );
86
+
87
+ const scaledPos = vec2(
88
+ positionLocal.x.mul( displaySize.div( aspectRatio ) ),
89
+ positionLocal.y.mul( displaySize )
90
+ );
91
+
92
+ const finalPos = vec2(
93
+ scaledPos.x.add( xBase ),
94
+ scaledPos.y.add( yBase )
95
+ );
96
+
97
+ return vec4( finalPos.x, finalPos.y, 0.0, 1.0 );
98
+
99
+ } )();
100
+
101
+ display.material.outputNode = Fn( () => {
102
+
103
+ // Ensure shadowMap and depthTexture are available
104
+ if ( ! this.tileShadowNode.shadowMap || ! this.tileShadowNode.shadowMap.depthTexture ) {
105
+
106
+ return vec4( 1, 0, 1, 1 ); // Magenta error color
107
+
108
+ }
109
+
110
+ const sampledDepth = texture( this.tileShadowNode.shadowMap.depthTexture )
111
+ .sample( uv().flipY() )
112
+ .depth( float( i ) ) // Sample correct layer
113
+ .compare( 0.9 ); // Example comparison value
114
+
115
+ // Simple tint based on index for visual distinction
116
+ const r = float( 0.5 + ( i % 3 ) * 0.16 );
117
+ const g = float( 0.5 + ( i % 2 ) * 0.25 );
118
+ const b = float( 0.7 + ( i % 4 ) * 0.075 );
119
+
120
+ return vec4(
121
+ vec3( r, g, b )
122
+ .mul( sampledDepth )
123
+ .saturate()
124
+ .rgb,
125
+ 1.0
126
+ );
127
+
128
+ } )();
129
+
130
+ this.add( display );
131
+ this._debugMeshes.push( display );
132
+
133
+ if ( this.tileShadowNode._shadowNodes[ i ] && this.tileShadowNode._shadowNodes[ i ].shadow ) {
134
+
135
+ const camHelper = new CameraHelper( this.tileShadowNode._shadowNodes[ i ].shadow.camera );
136
+ camHelper.fog = false;
137
+ this.add( camHelper );
138
+ this._shadowCamHelpers.push( camHelper );
139
+
140
+ } else {
141
+
142
+ console.warn( `TileShadowNodeHelper: Could not create CameraHelper for tile index ${i}. Shadow node or camera missing.` );
143
+ this._shadowCamHelpers.push( null );
144
+
145
+ }
146
+
147
+ }
148
+
149
+ this.initialized = true;
150
+
151
+ }
152
+
153
+ /**
154
+ * Updates the debug visuals (specifically camera helpers).
155
+ * Should be called within TileShadowNode's update method.
156
+ */
157
+ update() {
158
+
159
+ if ( this.initialized === false ) {
160
+
161
+ this.init();
162
+
163
+ }
164
+
165
+ for ( const helper of this._shadowCamHelpers ) {
166
+
167
+ if ( helper ) {
168
+
169
+ helper.update(); // Update CameraHelper matrices
170
+ helper.updateMatrixWorld( true ); // Ensure world matrix is current
171
+
172
+ }
173
+
174
+ }
175
+
176
+ }
177
+
178
+ /**
179
+ * Removes all debug objects (planes and helpers) from the scene.
180
+ */
181
+ dispose() {
182
+
183
+ if ( this.scene ) {
184
+
185
+ for ( const mesh of this._debugMeshes ) {
186
+
187
+ mesh.geometry.dispose();
188
+ mesh.material.dispose();
189
+ this.scene.remove( mesh );
190
+
191
+ }
192
+
193
+ for ( const helper of this._shadowCamHelpers ) {
194
+
195
+ if ( helper ) {
196
+
197
+ this.scene.remove( helper );
198
+
199
+ }
200
+
201
+ }
202
+
203
+ }
204
+
205
+ this._debugMeshes = [];
206
+ this._shadowCamHelpers = [];
207
+
208
+ }
209
+
210
+ }
211
+
212
+ export { TileShadowNodeHelper };
@@ -1,6 +1,9 @@
1
1
  import { varying, vec4, modelWorldMatrixInverse, cameraPosition, positionGeometry, float, Fn, Loop, max, min, vec2, vec3 } from 'three/tsl';
2
2
 
3
- /** @module Raymarching */
3
+ /**
4
+ * @module Raymarching
5
+ * @three_import import { RaymarchingBox } from 'three/addons/tsl/utils/Raymarching.js';
6
+ */
4
7
 
5
8
  const hitBox = /*@__PURE__*/ Fn( ( { orig, dir } ) => {
6
9
 
@@ -50,13 +53,13 @@ export const RaymarchingBox = ( steps, callback ) => {
50
53
  bounds.assign( vec2( max( bounds.x, 0.0 ), bounds.y ) );
51
54
 
52
55
  const inc = vec3( rayDir.abs().reciprocal() ).toVar();
53
- const delta = float( min( inc.x, min( inc.y, inc.z ) ) ).toVar( 'rayDelta' ); // used 'rayDelta' name in loop
56
+ const delta = float( min( inc.x, min( inc.y, inc.z ) ) ).toVar();
54
57
 
55
58
  delta.divAssign( float( steps ) );
56
59
 
57
60
  const positionRay = vec3( vOrigin.add( bounds.x.mul( rayDir ) ) ).toVar();
58
61
 
59
- Loop( { type: 'float', start: bounds.x, end: bounds.y, update: '+= rayDelta' }, () => {
62
+ Loop( { type: 'float', start: bounds.x, end: bounds.y, update: delta }, () => {
60
63
 
61
64
  callback( { positionRay } );
62
65
 
@@ -11,7 +11,10 @@ import {
11
11
  Vector3,
12
12
  } from 'three';
13
13
 
14
- /** @module BufferGeometryUtils */
14
+ /**
15
+ * @module BufferGeometryUtils
16
+ * @three_import import * as BufferGeometryUtils from 'three/addons/utils/BufferGeometryUtils.js';
17
+ */
15
18
 
16
19
  /**
17
20
  * Computes vertex tangents using the MikkTSpace algorithm. MikkTSpace generates the same tangents consistently,
@@ -4,7 +4,10 @@ import {
4
4
  Vector3
5
5
  } from 'three';
6
6
 
7
- /** @module CameraUtils */
7
+ /**
8
+ * @module CameraUtils
9
+ * @three_import import * as CameraUtils from 'three/addons/utils/CameraUtils.js';
10
+ */
8
11
 
9
12
  const _va = /*@__PURE__*/ new Vector3(), // from pe to pa
10
13
  _vb = /*@__PURE__*/ new Vector3(), // from pe to pb