@unikia/upe-renderer 0.186.110 → 0.187.11

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 (506) hide show
  1. package/README.md +5 -7
  2. package/UPSTREAM.md +4 -4
  3. package/build/three.core.js +853 -277
  4. package/build/three.module.js +1098 -1280
  5. package/build/three.tsl.js +41938 -686
  6. package/build/three.webgpu.js +10604 -49055
  7. package/build/three.webgpu.nodes.js +9249 -5788
  8. package/examples/jsm/Addons.js +2 -0
  9. package/examples/jsm/animation/CCDIKSolver.js +17 -5
  10. package/examples/jsm/controls/FirstPersonControls.js +1 -1
  11. package/examples/jsm/controls/OrbitControls.js +27 -14
  12. package/examples/jsm/csm/CSMShader.js +74 -3
  13. package/examples/jsm/curves/CurveExtras.js +4 -4
  14. package/examples/jsm/curves/NURBSCurve.js +14 -0
  15. package/examples/jsm/exporters/EXRExporter.js +673 -16
  16. package/examples/jsm/exporters/GLTFExporter.js +4 -4
  17. package/examples/jsm/exporters/KTX2Exporter.js +1 -1
  18. package/examples/jsm/exporters/OBJExporter.js +48 -5
  19. package/examples/jsm/exporters/PLYExporter.js +22 -11
  20. package/examples/jsm/generators/CityGenerator.js +3 -2
  21. package/examples/jsm/generators/city/SkyscraperGenerator.js +63 -21
  22. package/examples/jsm/gpgpu/BitonicSort.js +30 -23
  23. package/examples/jsm/helpers/VertexTangentsHelper.js +1 -1
  24. package/examples/jsm/inspector/Extension.js +1 -1
  25. package/examples/jsm/inspector/Inspector.js +6 -46
  26. package/examples/jsm/inspector/RendererInspector.js +43 -8
  27. package/examples/jsm/inspector/Storage.js +49 -0
  28. package/examples/jsm/inspector/extensions/color-grading/ColorGrading.js +32 -27
  29. package/examples/jsm/inspector/tabs/Parameters.js +5 -1
  30. package/examples/jsm/inspector/tabs/Performance.js +22 -7
  31. package/examples/jsm/inspector/tabs/Settings.js +1 -1
  32. package/examples/jsm/inspector/tabs/Timeline.js +83 -7
  33. package/examples/jsm/inspector/tabs/Viewer.js +25 -10
  34. package/examples/jsm/inspector/ui/Profiler.js +1 -1
  35. package/examples/jsm/inspector/ui/Style.js +21 -53
  36. package/examples/jsm/inspector/ui/Values.js +28 -3
  37. package/examples/jsm/libs/fflate.module.js +83 -56
  38. package/examples/jsm/libs/mikktspace.README.md +27 -0
  39. package/examples/jsm/libs/mikktspace.module.js +721 -109
  40. package/examples/jsm/lighting/ClusteredLighting.js +100 -2
  41. package/examples/jsm/lighting/LightMapper.js +295 -0
  42. package/examples/jsm/lighting/LightProbeGrid.js +242 -139
  43. package/examples/jsm/lighting/LightProbeGridWebGL.js +30 -14
  44. package/examples/jsm/lighting/vxgi/VXGIConeTracer.js +54 -5
  45. package/examples/jsm/lighting/vxgi/VXGIIrradiance.js +43 -0
  46. package/examples/jsm/lighting/vxgi/VXGINode.js +13 -56
  47. package/examples/jsm/lighting/vxgi/VXGISceneCollector.js +316 -1
  48. package/examples/jsm/lighting/vxgi/VXGIVolume.js +69 -59
  49. package/examples/jsm/lights/SunLight.js +9 -4
  50. package/examples/jsm/lights/SunLightNode.js +3 -3
  51. package/examples/jsm/lines/LineMaterial.js +26 -10
  52. package/examples/jsm/loaders/3DMLoader.js +10 -1
  53. package/examples/jsm/loaders/3MFLoader.js +5 -1
  54. package/examples/jsm/loaders/AMFLoader.js +2 -0
  55. package/examples/jsm/loaders/BVHLoader.js +2 -0
  56. package/examples/jsm/loaders/ColladaLoader.js +8 -0
  57. package/examples/jsm/loaders/DDSLoader.js +1 -1
  58. package/examples/jsm/loaders/DRACOLoader.js +5 -1
  59. package/examples/jsm/loaders/EXRLoader.js +120 -104
  60. package/examples/jsm/loaders/FBXLoader.js +4 -0
  61. package/examples/jsm/loaders/FontLoader.js +2 -0
  62. package/examples/jsm/loaders/GCodeLoader.js +5 -9
  63. package/examples/jsm/loaders/GLTFLoader.js +112 -31
  64. package/examples/jsm/loaders/GaussianSplatPLYLoader.js +2 -0
  65. package/examples/jsm/loaders/HDRCubeTextureLoader.js +3 -0
  66. package/examples/jsm/loaders/IESLoader.js +46 -12
  67. package/examples/jsm/loaders/JXLLoader.js +159 -0
  68. package/examples/jsm/loaders/KMZLoader.js +6 -0
  69. package/examples/jsm/loaders/KSPLATLoader.js +2 -0
  70. package/examples/jsm/loaders/KTX2Loader.js +49 -4
  71. package/examples/jsm/loaders/KTXLoader.js +5 -3
  72. package/examples/jsm/loaders/LDrawLoader.js +15 -22
  73. package/examples/jsm/loaders/LUT3dlLoader.js +5 -1
  74. package/examples/jsm/loaders/LUTCubeLoader.js +6 -2
  75. package/examples/jsm/loaders/LUTImageLoader.js +2 -0
  76. package/examples/jsm/loaders/LWOLoader.js +6 -0
  77. package/examples/jsm/loaders/MD2Loader.js +2 -0
  78. package/examples/jsm/loaders/MDDLoader.js +4 -0
  79. package/examples/jsm/loaders/MTLLoader.js +8 -0
  80. package/examples/jsm/loaders/MaterialXLoader.js +57 -5
  81. package/examples/jsm/loaders/NRRDLoader.js +4 -2
  82. package/examples/jsm/loaders/OBJLoader.js +10 -4
  83. package/examples/jsm/loaders/PCDLoader.js +6 -2
  84. package/examples/jsm/loaders/PDBLoader.js +5 -3
  85. package/examples/jsm/loaders/PLYLoader.js +39 -15
  86. package/examples/jsm/loaders/PVRLoader.js +2 -2
  87. package/examples/jsm/loaders/SPLATLoader.js +2 -0
  88. package/examples/jsm/loaders/SPZLoader.js +2 -0
  89. package/examples/jsm/loaders/STLLoader.js +3 -1
  90. package/examples/jsm/loaders/SVGLoader.js +27 -49
  91. package/examples/jsm/loaders/TDSLoader.js +4 -0
  92. package/examples/jsm/loaders/TGALoader.js +6 -5
  93. package/examples/jsm/loaders/TTFLoader.js +2 -0
  94. package/examples/jsm/loaders/USDLoader.js +14 -0
  95. package/examples/jsm/loaders/UltraHDRLoader.js +2 -0
  96. package/examples/jsm/loaders/VOXLoader.js +3 -0
  97. package/examples/jsm/loaders/VRMLLoader.js +4 -0
  98. package/examples/jsm/loaders/VTKLoader.js +2 -0
  99. package/examples/jsm/loaders/XYZLoader.js +2 -0
  100. package/examples/jsm/loaders/collada/ColladaComposer.js +15 -8
  101. package/examples/jsm/loaders/materialx/MaterialXDocument.js +610 -138
  102. package/examples/jsm/loaders/materialx/MaterialXInterfaceValidation.js +12 -95
  103. package/examples/jsm/loaders/materialx/MaterialXLog.js +4 -0
  104. package/examples/jsm/loaders/materialx/MaterialXNodeDefs.js +99 -0
  105. package/examples/jsm/loaders/materialx/MaterialXNodeInterfaceRegistry.js +760 -1
  106. package/examples/jsm/loaders/materialx/MaterialXNodeLibrary.js +222 -372
  107. package/examples/jsm/loaders/materialx/MaterialXSurfaceMappings.js +163 -259
  108. package/examples/jsm/loaders/materialx/MaterialXUtils.js +25 -0
  109. package/examples/jsm/loaders/materialx/compile/MaterialXCompileRegistry.js +161 -159
  110. package/examples/jsm/loaders/usd/USDAParser.js +56 -47
  111. package/examples/jsm/loaders/usd/USDComposer.js +25 -30
  112. package/examples/jsm/math/ColorConverter.js +7 -3
  113. package/examples/jsm/math/Lut.js +2 -2
  114. package/examples/jsm/math/OBB.js +3 -3
  115. package/examples/jsm/math/Octree.js +20 -17
  116. package/examples/jsm/objects/GaussianSplat.js +5 -4
  117. package/examples/jsm/objects/Reflector.js +5 -0
  118. package/examples/jsm/objects/SkyMesh.js +14 -7
  119. package/examples/jsm/objects/Water2Mesh.js +2 -2
  120. package/examples/jsm/physics/RapierPhysics.js +2 -2
  121. package/examples/jsm/pipelines/MeshletDrawingPipeline.js +5571 -0
  122. package/examples/jsm/pipelines/VisibilityBufferDrawingPipeline.js +954 -0
  123. package/examples/jsm/postprocessing/BokehPass.js +1 -1
  124. package/examples/jsm/postprocessing/GTAOPass.js +26 -18
  125. package/examples/jsm/renderers/SVGRenderer.js +3 -2
  126. package/examples/jsm/shaders/GTAOShader.js +7 -4
  127. package/examples/jsm/shaders/PoissonDenoiseShader.js +1 -10
  128. package/examples/jsm/tsl/WebGLNodesHandler.js +21 -9
  129. package/examples/jsm/tsl/display/AfterImageNode.js +3 -3
  130. package/examples/jsm/tsl/display/BilateralBlurNode.js +3 -3
  131. package/examples/jsm/tsl/display/BloomNode.js +3 -3
  132. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +8 -19
  133. package/examples/jsm/tsl/display/DenoiseNode.js +5 -5
  134. package/examples/jsm/tsl/display/DepthOfFieldNode.js +3 -3
  135. package/examples/jsm/tsl/display/DotScreenNode.js +3 -3
  136. package/examples/jsm/tsl/display/FSR1Node.js +3 -3
  137. package/examples/jsm/tsl/display/FXAANode.js +3 -10
  138. package/examples/jsm/tsl/display/FilmNode.js +3 -3
  139. package/examples/jsm/tsl/display/GTAONode.js +33 -25
  140. package/examples/jsm/tsl/display/GaussianBlurNode.js +3 -3
  141. package/examples/jsm/tsl/display/GodraysNode.js +5 -19
  142. package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +8 -4
  143. package/examples/jsm/tsl/display/LensflareNode.js +3 -3
  144. package/examples/jsm/tsl/display/Lut3DNode.js +3 -3
  145. package/examples/jsm/tsl/display/OITPassNode.js +0 -11
  146. package/examples/jsm/tsl/display/OutlineNode.js +107 -5
  147. package/examples/jsm/tsl/display/PixelationPassNode.js +85 -193
  148. package/examples/jsm/tsl/display/RGBShiftNode.js +3 -3
  149. package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +23 -126
  150. package/examples/jsm/tsl/display/SMAANode.js +3 -3
  151. package/examples/jsm/tsl/display/SSAONode.js +6 -20
  152. package/examples/jsm/tsl/display/SSGINode.js +36 -29
  153. package/examples/jsm/tsl/display/SSRNode.js +135 -63
  154. package/examples/jsm/tsl/display/SSSNode.js +6 -20
  155. package/examples/jsm/tsl/display/SharpenNode.js +3 -3
  156. package/examples/jsm/tsl/display/SobelOperatorNode.js +3 -3
  157. package/examples/jsm/tsl/display/TAAUNode.js +10 -42
  158. package/examples/jsm/tsl/display/TRAANode.js +11 -43
  159. package/examples/jsm/tsl/display/TemporalReprojectNode.js +42 -47
  160. package/examples/jsm/tsl/display/TransitionNode.js +3 -3
  161. package/examples/jsm/tsl/display/lensDirt.js +30 -0
  162. package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +482 -121
  163. package/examples/jsm/tsl/lighting/DynamicLightsNode.js +41 -140
  164. package/examples/jsm/tsl/lighting/LightProbeGridNode.js +72 -25
  165. package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +6 -0
  166. package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +6 -0
  167. package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +6 -0
  168. package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +6 -0
  169. package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +6 -0
  170. package/examples/jsm/tsl/shadows/TileShadowNode.js +102 -14
  171. package/examples/jsm/tsl/utils/Raymarching.js +1 -1
  172. package/examples/jsm/tsl/utils/SoftParticles.js +5 -12
  173. package/examples/jsm/tsl/utils/SpecularHelpers.js +47 -70
  174. package/examples/jsm/tsl/utils/TAAUtils.js +6 -17
  175. package/examples/jsm/utils/BufferGeometryUtils.js +110 -88
  176. package/examples/jsm/utils/MeshletGeometryUtils.js +417 -0
  177. package/examples/jsm/utils/SceneOptimizer.js +2 -1
  178. package/examples/jsm/utils/SceneUtils.js +1 -1
  179. package/examples/jsm/utils/unwrapUVs.js +865 -0
  180. package/examples/jsm/webxr/XREstimatedLight.js +11 -4
  181. package/package.json +3 -3
  182. package/src/Three.TSL.js +2 -683
  183. package/src/Three.WebGPU.Nodes.js +2 -1
  184. package/src/Three.WebGPU.js +2 -1
  185. package/src/animation/AnimationAction.js +1 -1
  186. package/src/animation/AnimationUtils.js +1 -3
  187. package/src/animation/KeyframeTrack.js +19 -0
  188. package/src/cameras/ArrayCamera.js +12 -0
  189. package/src/cameras/CubeCamera.js +3 -3
  190. package/src/constants.js +1 -9
  191. package/src/core/BufferAttribute.js +57 -21
  192. package/src/core/BufferGeometry.js +5 -13
  193. package/src/core/Clock.js +1 -1
  194. package/src/core/InterleavedBuffer.js +28 -18
  195. package/src/core/InterleavedBufferAttribute.js +54 -20
  196. package/src/core/Object3D.js +19 -9
  197. package/src/core/Raycaster.js +2 -0
  198. package/src/core/RenderTarget.js +11 -5
  199. package/src/core/UniformsGroup.js +7 -3
  200. package/src/extras/PMREMGenerator.js +392 -685
  201. package/src/extras/core/Curve.js +4 -0
  202. package/src/extras/core/CurvePath.js +13 -0
  203. package/src/extras/core/ShapePath.js +1 -1
  204. package/src/geometries/EdgesGeometry.js +12 -10
  205. package/src/geometries/LatheGeometry.js +2 -0
  206. package/src/helpers/PolarGridHelper.js +1 -1
  207. package/src/lights/Light.js +11 -0
  208. package/src/lights/LightProbe.js +2 -0
  209. package/src/lights/LightShadow.js +2 -0
  210. package/src/loaders/AnimationLoader.js +2 -0
  211. package/src/loaders/AudioLoader.js +2 -0
  212. package/src/loaders/BufferGeometryLoader.js +2 -0
  213. package/src/loaders/CompressedTextureLoader.js +2 -0
  214. package/src/loaders/CubeTextureLoader.js +2 -0
  215. package/src/loaders/DataTextureLoader.js +2 -0
  216. package/src/loaders/FileLoader.js +2 -0
  217. package/src/loaders/ImageBitmapLoader.js +3 -1
  218. package/src/loaders/ImageLoader.js +1 -0
  219. package/src/loaders/Loader.js +47 -0
  220. package/src/loaders/MaterialLoader.js +2 -0
  221. package/src/loaders/ObjectLoader.js +27 -8
  222. package/src/loaders/TextureLoader.js +5 -3
  223. package/src/loaders/nodes/NodeLoader.js +2 -0
  224. package/src/materials/Material.js +21 -2
  225. package/src/materials/MeshDepthMaterial.js +1 -1
  226. package/src/materials/MeshDistanceMaterial.js +1 -1
  227. package/src/materials/MeshLambertMaterial.js +1 -1
  228. package/src/materials/MeshMatcapMaterial.js +1 -1
  229. package/src/materials/MeshNormalMaterial.js +1 -1
  230. package/src/materials/MeshPhongMaterial.js +1 -1
  231. package/src/materials/MeshPhysicalMaterial.js +90 -11
  232. package/src/materials/MeshStandardMaterial.js +1 -1
  233. package/src/materials/MeshToonMaterial.js +1 -1
  234. package/src/materials/nodes/Line2NodeMaterial.js +32 -10
  235. package/src/materials/nodes/MeshLambertNodeMaterial.js +13 -0
  236. package/src/materials/nodes/MeshPhongNodeMaterial.js +13 -0
  237. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +40 -5
  238. package/src/materials/nodes/MeshToonNodeMaterial.js +13 -0
  239. package/src/materials/nodes/NodeMaterial.js +36 -16
  240. package/src/materials/nodes/NodeMaterialInstance.js +193 -0
  241. package/src/materials/nodes/NodeMaterials.js +1 -0
  242. package/src/materials/nodes/PointsNodeMaterial.js +1 -1
  243. package/src/materials/nodes/SpriteNodeMaterial.js +3 -3
  244. package/src/materials/nodes/manager/NodeMaterialObserver.js +191 -22
  245. package/src/math/Box3.js +2 -2
  246. package/src/math/Color.js +8 -8
  247. package/src/math/ColorManagement.js +2 -21
  248. package/src/math/FrustumArray.js +12 -0
  249. package/src/math/Interpolant.js +1 -1
  250. package/src/math/Line3.js +2 -4
  251. package/src/math/MathUtils.js +33 -46
  252. package/src/math/Matrix2.js +1 -1
  253. package/src/math/Matrix3.js +1 -1
  254. package/src/math/Matrix4.js +1 -1
  255. package/src/math/Triangle.js +2 -1
  256. package/src/math/Vector2.js +1 -1
  257. package/src/math/Vector3.js +1 -1
  258. package/src/math/Vector4.js +1 -1
  259. package/src/nodes/Nodes.js +1 -0
  260. package/src/nodes/TSL.js +2 -0
  261. package/src/nodes/accessors/Arrays.js +1 -1
  262. package/src/nodes/accessors/Batch.js +29 -23
  263. package/src/nodes/accessors/BufferAttributeNode.js +21 -1
  264. package/src/nodes/accessors/BuiltinNode.js +6 -0
  265. package/src/nodes/accessors/Camera.js +100 -93
  266. package/src/nodes/accessors/ClippingNode.js +17 -6
  267. package/src/nodes/accessors/CubeTextureNode.js +12 -24
  268. package/src/nodes/accessors/Instance.js +198 -160
  269. package/src/nodes/accessors/Lights.js +19 -6
  270. package/src/nodes/accessors/MaterialNode.js +33 -4
  271. package/src/nodes/accessors/Morph.js +81 -22
  272. package/src/nodes/accessors/Normal.js +0 -42
  273. package/src/nodes/accessors/Object3DNode.js +6 -0
  274. package/src/nodes/accessors/PointUVNode.js +6 -0
  275. package/src/nodes/accessors/ReferenceAttributeNode.js +279 -0
  276. package/src/nodes/accessors/ReferenceBaseNode.js +6 -0
  277. package/src/nodes/accessors/ReferenceNode.js +6 -0
  278. package/src/nodes/accessors/Skinning.js +57 -52
  279. package/src/nodes/accessors/StorageBufferNode.js +3 -12
  280. package/src/nodes/accessors/TextureBicubic.js +30 -27
  281. package/src/nodes/accessors/TextureNode.js +164 -78
  282. package/src/nodes/accessors/TextureSizeNode.js +6 -0
  283. package/src/nodes/accessors/UniformArrayNode.js +8 -15
  284. package/src/nodes/accessors/VelocityNode.js +13 -8
  285. package/src/nodes/code/CodeNode.js +6 -0
  286. package/src/nodes/code/ExpressionNode.js +6 -0
  287. package/src/nodes/code/FunctionCallNode.js +3 -3
  288. package/src/nodes/code/FunctionNode.js +15 -13
  289. package/src/nodes/core/ArrayNode.js +3 -3
  290. package/src/nodes/core/AssignNode.js +10 -9
  291. package/src/nodes/core/AttributeNode.js +39 -0
  292. package/src/nodes/core/BypassNode.js +6 -0
  293. package/src/nodes/core/ConstNode.js +31 -1
  294. package/src/nodes/core/ContextNode.js +11 -6
  295. package/src/nodes/core/IndexNode.js +6 -0
  296. package/src/nodes/core/InputNode.js +6 -0
  297. package/src/nodes/core/InspectorNode.js +17 -31
  298. package/src/nodes/core/IsolateNode.js +8 -0
  299. package/src/nodes/core/Node.js +367 -67
  300. package/src/nodes/core/NodeBuilder.js +664 -222
  301. package/src/nodes/core/NodeUtils.js +25 -0
  302. package/src/nodes/core/NodeVar.js +10 -1
  303. package/src/nodes/core/OutputStructNode.js +6 -0
  304. package/src/nodes/core/OverrideContextNode.js +38 -37
  305. package/src/nodes/core/PropertyNode.js +14 -0
  306. package/src/nodes/core/StackNode.js +33 -21
  307. package/src/nodes/core/StructNode.js +6 -0
  308. package/src/nodes/core/StructTypeNode.js +6 -0
  309. package/src/nodes/core/SubBuildNode.js +8 -0
  310. package/src/nodes/core/TempNode.js +10 -35
  311. package/src/nodes/core/UniformGroupNode.js +6 -0
  312. package/src/nodes/core/VarNode.js +43 -135
  313. package/src/nodes/core/VaryingNode.js +33 -2
  314. package/src/nodes/display/BlendModes.js +5 -40
  315. package/src/nodes/display/BumpMapNode.js +17 -7
  316. package/src/nodes/display/ColorAdjustment.js +22 -10
  317. package/src/nodes/display/ColorSpaceFunctions.js +2 -14
  318. package/src/nodes/display/ColorSpaceNode.js +3 -3
  319. package/src/nodes/display/FrontFacingNode.js +6 -0
  320. package/src/nodes/display/NormalMapNode.js +3 -3
  321. package/src/nodes/display/PassNode.js +75 -16
  322. package/src/nodes/display/RenderOutputNode.js +22 -5
  323. package/src/nodes/display/ScreenNode.js +6 -0
  324. package/src/nodes/display/ToneMappingFunctions.js +9 -51
  325. package/src/nodes/display/ToneMappingNode.js +3 -3
  326. package/src/nodes/display/ToonOutlinePassNode.js +66 -2
  327. package/src/nodes/display/ViewportDepthNode.js +34 -4
  328. package/src/nodes/functions/BSDF/BRDF_EON.js +65 -0
  329. package/src/nodes/functions/BSDF/BRDF_GGX.js +5 -3
  330. package/src/nodes/functions/BSDF/BRDF_Sheen.js +2 -16
  331. package/src/nodes/functions/BSDF/D_GGX.js +1 -8
  332. package/src/nodes/functions/BSDF/D_GGX_Anisotropic.js +7 -10
  333. package/src/nodes/functions/BSDF/LTC.js +20 -47
  334. package/src/nodes/functions/BSDF/Schlick_to_F0.js +1 -9
  335. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +1 -9
  336. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +10 -13
  337. package/src/nodes/functions/PhysicalLightingModel.js +84 -51
  338. package/src/nodes/functions/VolumetricLightingModel.js +1 -1
  339. package/src/nodes/functions/material/getAlphaHashThreshold.js +3 -9
  340. package/src/nodes/functions/material/getParallaxCorrectNormal.js +10 -11
  341. package/src/nodes/functions/material/getRoughness.js +3 -1
  342. package/src/nodes/geometry/RangeNode.js +52 -69
  343. package/src/nodes/gpgpu/AtomicFunctionNode.js +11 -6
  344. package/src/nodes/gpgpu/BarrierNode.js +6 -0
  345. package/src/nodes/gpgpu/ComputeBuiltinNode.js +6 -0
  346. package/src/nodes/gpgpu/ComputeNode.js +6 -0
  347. package/src/nodes/gpgpu/SubgroupFunctionNode.js +38 -29
  348. package/src/nodes/gpgpu/WorkgroupInfoNode.js +6 -0
  349. package/src/nodes/lighting/AnalyticLightNode.js +7 -14
  350. package/src/nodes/lighting/BasicEnvironmentNode.js +5 -1
  351. package/src/nodes/lighting/EnvironmentNode.js +58 -8
  352. package/src/nodes/lighting/IESSpotLightNode.js +19 -4
  353. package/src/nodes/lighting/LightProbeNode.js +2 -1
  354. package/src/nodes/lighting/LightUtils.js +2 -2
  355. package/src/nodes/lighting/LightingNode.js +6 -0
  356. package/src/nodes/lighting/LightsNode.js +26 -32
  357. package/src/nodes/lighting/PointShadowNode.js +92 -48
  358. package/src/nodes/lighting/ProjectorLightNode.js +1 -1
  359. package/src/nodes/lighting/RectAreaLightNode.js +13 -14
  360. package/src/nodes/lighting/ShadowBaseNode.js +9 -17
  361. package/src/nodes/lighting/ShadowFilterNode.js +26 -3
  362. package/src/nodes/lighting/ShadowNode.js +13 -11
  363. package/src/nodes/materialx/MaterialXColor.js +2 -14
  364. package/src/nodes/materialx/MaterialXColorTransform.js +1 -7
  365. package/src/nodes/materialx/MaterialXNodes.js +8 -11
  366. package/src/nodes/materialx/MaterialXNoise.js +195 -454
  367. package/src/nodes/math/BitcastNode.js +5 -5
  368. package/src/nodes/math/BitcountNode.js +18 -46
  369. package/src/nodes/math/ConditionalNode.js +92 -22
  370. package/src/nodes/math/Hash.js +1 -1
  371. package/src/nodes/math/MathNode.js +86 -64
  372. package/src/nodes/math/MathUtils.js +2 -2
  373. package/src/nodes/math/OperatorNode.js +42 -59
  374. package/src/nodes/math/PackFloatNode.js +9 -9
  375. package/src/nodes/math/Packed4x8IntegerNode.js +20 -52
  376. package/src/nodes/math/TriNoise3D.js +3 -23
  377. package/src/nodes/math/UnpackFloatNode.js +9 -9
  378. package/src/nodes/pmrem/PMREMNode.js +38 -75
  379. package/src/nodes/pmrem/PMREMUtils.js +108 -272
  380. package/src/nodes/procedural/Checker.js +1 -1
  381. package/src/nodes/tsl/TSLCore.js +199 -74
  382. package/src/nodes/utils/ArrayElementNode.js +19 -1
  383. package/src/nodes/utils/CubeMapNode.js +3 -3
  384. package/src/nodes/utils/DebugNode.js +2 -2
  385. package/src/nodes/utils/EventNode.js +6 -0
  386. package/src/nodes/utils/FlipNode.js +3 -3
  387. package/src/nodes/utils/FunctionOverloadingNode.js +7 -1
  388. package/src/nodes/utils/JoinNode.js +3 -3
  389. package/src/nodes/utils/LoopNode.js +14 -9
  390. package/src/nodes/utils/MemberNode.js +18 -0
  391. package/src/nodes/utils/PostProcessingUtils.js +20 -25
  392. package/src/nodes/utils/RTTNode.js +2 -0
  393. package/src/nodes/utils/ReflectorNode.js +24 -0
  394. package/src/nodes/utils/RotateNode.js +3 -3
  395. package/src/nodes/utils/SampleNode.js +6 -0
  396. package/src/nodes/utils/SetNode.js +3 -3
  397. package/src/nodes/utils/SplitNode.js +6 -0
  398. package/src/nodes/utils/UVUtils.js +2 -2
  399. package/src/objects/BatchedMesh.js +146 -15
  400. package/src/objects/InstancedMesh.js +12 -4
  401. package/src/objects/Line.js +20 -0
  402. package/src/objects/Mesh.js +8 -0
  403. package/src/objects/Points.js +20 -0
  404. package/src/objects/Skeleton.js +26 -0
  405. package/src/objects/SkinnedMesh.js +3 -3
  406. package/src/objects/Sprite.js +10 -0
  407. package/src/renderers/WebGLRenderer.js +104 -70
  408. package/src/renderers/common/Animation.js +5 -1
  409. package/src/renderers/common/Attributes.js +67 -57
  410. package/src/renderers/common/Backend.js +78 -3
  411. package/src/renderers/common/BindGroup.js +11 -0
  412. package/src/renderers/common/Binding.js +0 -11
  413. package/src/renderers/common/Bindings.js +116 -10
  414. package/src/renderers/common/Buffer.js +1 -1
  415. package/src/renderers/common/ClippingContext.js +12 -1
  416. package/src/renderers/common/ComputePipeline.js +17 -1
  417. package/src/renderers/common/DirectRenderPipeline.js +7 -3
  418. package/src/renderers/common/Geometries.js +170 -132
  419. package/src/renderers/common/Info.js +1 -1
  420. package/src/renderers/common/InspectorBase.js +5 -5
  421. package/src/renderers/common/Lighting.js +59 -0
  422. package/src/renderers/common/Pipelines.js +26 -12
  423. package/src/renderers/common/ProgrammableStage.js +1 -17
  424. package/src/renderers/common/RenderContext.js +21 -0
  425. package/src/renderers/common/RenderContexts.js +13 -4
  426. package/src/renderers/common/RenderObject.js +111 -35
  427. package/src/renderers/common/RenderObjects.js +37 -19
  428. package/src/renderers/common/Renderer.js +537 -295
  429. package/src/renderers/common/RendererUtils.js +15 -0
  430. package/src/renderers/common/StandardDrawingPipeline.js +343 -0
  431. package/src/renderers/common/Storage3DTexture.js +11 -0
  432. package/src/renderers/common/StorageArrayTexture.js +10 -0
  433. package/src/renderers/common/StorageTexture.js +0 -9
  434. package/src/renderers/common/Textures.js +144 -37
  435. package/src/renderers/common/UniformsGroup.js +19 -0
  436. package/src/renderers/common/XRManager.js +10 -91
  437. package/src/renderers/common/extras/PMREMGenerator.js +298 -576
  438. package/src/renderers/common/nodes/NodeBuilderState.js +7 -5
  439. package/src/renderers/common/nodes/NodeLibrary.js +11 -35
  440. package/src/renderers/common/nodes/NodeManager.js +80 -31
  441. package/src/renderers/common/nodes/NodeSampledTexture.js +14 -0
  442. package/src/renderers/common/nodes/NodeSampler.js +14 -0
  443. package/src/renderers/common/nodes/NodeStorageBuffer.js +1 -1
  444. package/src/renderers/common/nodes/NodeUniformBuffer.js +1 -14
  445. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +13 -4
  446. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +8 -8
  447. package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +23 -11
  448. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +21 -2
  449. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +1 -1
  450. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +18 -2
  451. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +104 -7
  452. package/src/renderers/shaders/ShaderChunk/morphcolor_vertex.glsl.js +11 -2
  453. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +36 -20
  454. package/src/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl.js +5 -0
  455. package/src/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl.js +6 -0
  456. package/src/renderers/shaders/ShaderChunk/uv_vertex.glsl.js +5 -0
  457. package/src/renderers/shaders/ShaderChunk.js +0 -2
  458. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +4 -18
  459. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +0 -1
  460. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +0 -1
  461. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +8 -1
  462. package/src/renderers/shaders/ShaderLib.js +3 -0
  463. package/src/renderers/shaders/UniformsLib.js +4 -5
  464. package/src/renderers/webgl/WebGLBackground.js +3 -3
  465. package/src/renderers/webgl/WebGLBindingStates.js +4 -2
  466. package/src/renderers/webgl/WebGLCapabilities.js +7 -1
  467. package/src/renderers/webgl/WebGLEnvironments.js +2 -2
  468. package/src/renderers/webgl/WebGLGeometries.js +42 -14
  469. package/src/renderers/webgl/WebGLMaterials.js +15 -2
  470. package/src/renderers/webgl/WebGLOutput.js +37 -1
  471. package/src/renderers/webgl/WebGLProgram.js +13 -54
  472. package/src/renderers/webgl/WebGLPrograms.js +22 -8
  473. package/src/renderers/webgl/WebGLRenderStates.js +11 -8
  474. package/src/renderers/webgl/WebGLShadowMap.js +6 -4
  475. package/src/renderers/webgl/WebGLState.js +10 -6
  476. package/src/renderers/webgl/WebGLTextures.js +129 -77
  477. package/src/renderers/webgl/WebGLUniforms.js +44 -6
  478. package/src/renderers/webgl/WebGLUniformsGroups.js +75 -69
  479. package/src/renderers/webgl-fallback/WebGLBackend.js +206 -278
  480. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +154 -20
  481. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +45 -42
  482. package/src/renderers/webgl-fallback/utils/WebGLState.js +29 -4
  483. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +129 -49
  484. package/src/renderers/webgl-fallback/utils/WebGLVertexArrayUtils.js +346 -0
  485. package/src/renderers/webgpu/WebGPUBackend.js +140 -82
  486. package/src/renderers/webgpu/WebGPURenderer.js +1 -1
  487. package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +10 -10
  488. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +10 -10
  489. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +135 -60
  490. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +128 -55
  491. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +1 -1
  492. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +15 -12
  493. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +55 -19
  494. package/src/renderers/webgpu/utils/WebGPUUtils.js +20 -3
  495. package/src/renderers/webxr/WebXRController.js +3 -3
  496. package/src/renderers/webxr/WebXRManager.js +5 -90
  497. package/src/scenes/Scene.js +4 -4
  498. package/src/textures/CompressedTexture.js +2 -2
  499. package/src/textures/DepthTexture.js +2 -2
  500. package/src/textures/FramebufferTexture.js +11 -0
  501. package/src/textures/Texture.js +29 -1
  502. package/src/textures/TextureSource.js +1 -1
  503. package/src/upe.js +1 -1
  504. package/src/utils.js +4 -4
  505. package/examples/jsm/libs/surfaceNet.js +0 -201
  506. package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +0 -186
@@ -1,5 +1,4 @@
1
- import { LightsNode, NodeUtils, warn } from 'three/webgpu';
2
- import { nodeObject } from 'three/tsl';
1
+ import { AmbientLight, DirectionalLight, HemisphereLight, LightsNode, NodeUtils, PointLight, SpotLight } from 'three/webgpu';
3
2
 
4
3
  import AmbientLightDataNode from './data/AmbientLightDataNode.js';
5
4
  import DirectionalLightDataNode from './data/DirectionalLightDataNode.js';
@@ -7,9 +6,16 @@ import PointLightDataNode from './data/PointLightDataNode.js';
7
6
  import SpotLightDataNode from './data/SpotLightDataNode.js';
8
7
  import HemisphereLightDataNode from './data/HemisphereLightDataNode.js';
9
8
 
10
- const _lightNodeRef = /*@__PURE__*/ new WeakMap();
11
9
  const _hashData = [];
12
10
 
11
+ const _lightClassToType = new Map( [
12
+ [ AmbientLight, 'AmbientLight' ],
13
+ [ DirectionalLight, 'DirectionalLight' ],
14
+ [ PointLight, 'PointLight' ],
15
+ [ SpotLight, 'SpotLight' ],
16
+ [ HemisphereLight, 'HemisphereLight' ]
17
+ ] );
18
+
13
19
  const _lightTypeToDataNode = {
14
20
  AmbientLight: AmbientLightDataNode,
15
21
  DirectionalLight: DirectionalLightDataNode,
@@ -25,8 +31,6 @@ const _lightTypeToMaxProp = {
25
31
  HemisphereLight: 'maxHemisphereLights'
26
32
  };
27
33
 
28
- const sortLights = ( lights ) => lights.sort( ( a, b ) => a.id - b.id );
29
-
30
34
  const isSpecialSpotLight = ( light ) => {
31
35
 
32
36
  return light.isSpotLight === true && ( light.map !== null || light.colorNode !== undefined );
@@ -38,28 +42,7 @@ const canBatchLight = ( light ) => {
38
42
  return light.isNode !== true &&
39
43
  light.castShadow !== true &&
40
44
  isSpecialSpotLight( light ) === false &&
41
- _lightTypeToDataNode[ light.constructor.name ] !== undefined;
42
-
43
- };
44
-
45
- const getOrCreateLightNode = ( light, nodeLibrary ) => {
46
-
47
- const lightNodeClass = nodeLibrary.getLightNodeClass( light.constructor );
48
-
49
- if ( lightNodeClass === null ) {
50
-
51
- warn( `DynamicLightsNode: Light node not found for ${ light.constructor.name }.` );
52
- return null;
53
-
54
- }
55
-
56
- if ( _lightNodeRef.has( light ) === false ) {
57
-
58
- _lightNodeRef.set( light, new lightNodeClass( light ) );
59
-
60
- }
61
-
62
- return _lightNodeRef.get( light );
45
+ _lightClassToType.has( light.constructor );
63
46
 
64
47
  };
65
48
 
@@ -99,47 +82,16 @@ class DynamicLightsNode extends LightsNode {
99
82
  this.maxSpotLights = options.maxSpotLights !== undefined ? options.maxSpotLights : 16;
100
83
  this.maxHemisphereLights = options.maxHemisphereLights !== undefined ? options.maxHemisphereLights : 4;
101
84
 
85
+ this._builtinLights = [];
102
86
  this._dataNodes = new Map();
103
87
 
104
88
  }
105
89
 
106
90
  customCacheKey() {
107
91
 
108
- const typeSet = new Set();
109
-
110
- for ( let i = 0; i < this._lights.length; i ++ ) {
111
-
112
- const light = this._lights[ i ];
113
-
114
- if ( canBatchLight( light ) ) {
115
-
116
- typeSet.add( light.constructor.name );
117
-
118
- } else {
119
-
120
- _hashData.push( light.id );
121
- _hashData.push( light.castShadow ? 1 : 0 );
122
-
123
- if ( light.isSpotLight === true ) {
124
-
125
- const hashMap = light.map !== null ? light.map.id : - 1;
126
- const hashColorNode = light.colorNode ? light.colorNode.getCacheKey() : - 1;
92
+ _hashData.push( super.customCacheKey() );
127
93
 
128
- _hashData.push( hashMap, hashColorNode );
129
-
130
- }
131
-
132
- }
133
-
134
- }
135
-
136
- for ( const typeName of this._dataNodes.keys() ) {
137
-
138
- typeSet.add( typeName );
139
-
140
- }
141
-
142
- for ( const typeName of [ ...typeSet ].sort() ) {
94
+ for ( const typeName of [ ...this._dataNodes.keys() ].sort() ) {
143
95
 
144
96
  _hashData.push( NodeUtils.hashString( typeName ) );
145
97
 
@@ -155,127 +107,76 @@ class DynamicLightsNode extends LightsNode {
155
107
 
156
108
  setupLightsNode( builder ) {
157
109
 
158
- const lightNodes = [];
159
- const lightsByType = new Map();
160
- const lights = sortLights( this._lights );
161
- const nodeLibrary = builder.renderer.library;
162
-
163
- for ( const light of lights ) {
110
+ const lightNodes = super.setupLightsNode( builder );
164
111
 
165
- if ( light.isNode === true ) {
112
+ for ( const dataNode of this._dataNodes.values() ) {
166
113
 
167
- lightNodes.push( nodeObject( light ) );
168
- continue;
114
+ lightNodes.push( dataNode );
169
115
 
170
- }
116
+ }
171
117
 
172
- if ( canBatchLight( light ) ) {
118
+ return lightNodes;
173
119
 
174
- const typeName = light.constructor.name;
175
- const typeLights = lightsByType.get( typeName );
120
+ }
176
121
 
177
- if ( typeLights === undefined ) {
122
+ setLights( lights ) {
178
123
 
179
- lightsByType.set( typeName, [ light ] );
124
+ const builtinLights = this._builtinLights;
125
+ const lightsByType = new Map();
180
126
 
181
- } else {
127
+ builtinLights.length = 0;
182
128
 
183
- typeLights.push( light );
129
+ for ( const light of lights ) {
184
130
 
185
- }
131
+ if ( canBatchLight( light ) === false ) {
186
132
 
133
+ builtinLights.push( light );
187
134
  continue;
188
135
 
189
136
  }
190
137
 
191
- const lightNode = getOrCreateLightNode( light, nodeLibrary );
138
+ const typeName = _lightClassToType.get( light.constructor );
139
+ const typeLights = lightsByType.get( typeName );
140
+
141
+ if ( typeLights === undefined ) {
142
+
143
+ lightsByType.set( typeName, [ light ] );
192
144
 
193
- if ( lightNode !== null ) {
145
+ } else {
194
146
 
195
- lightNodes.push( lightNode );
147
+ typeLights.push( light );
196
148
 
197
149
  }
198
150
 
199
151
  }
200
152
 
201
- for ( const [ typeName, typeLights ] of lightsByType ) {
202
-
203
- let dataNode = this._dataNodes.get( typeName );
153
+ for ( const typeName of lightsByType.keys() ) {
204
154
 
205
- if ( dataNode === undefined ) {
155
+ if ( this._dataNodes.has( typeName ) === false ) {
206
156
 
207
157
  const DataNodeClass = _lightTypeToDataNode[ typeName ];
208
158
  const maxProp = _lightTypeToMaxProp[ typeName ];
209
159
  const maxCount = maxProp !== undefined ? this[ maxProp ] : undefined;
210
160
 
211
- dataNode = maxCount !== undefined ? new DataNodeClass( maxCount ) : new DataNodeClass();
212
-
213
- this._dataNodes.set( typeName, dataNode );
161
+ this._dataNodes.set( typeName, maxCount !== undefined ? new DataNodeClass( maxCount ) : new DataNodeClass() );
214
162
 
215
163
  }
216
164
 
217
- dataNode.setLights( typeLights );
218
- lightNodes.push( dataNode );
219
-
220
165
  }
221
166
 
222
167
  for ( const [ typeName, dataNode ] of this._dataNodes ) {
223
168
 
224
- if ( lightsByType.has( typeName ) === false ) {
225
-
226
- dataNode.setLights( [] );
227
- lightNodes.push( dataNode );
228
-
229
- }
230
-
231
- }
232
-
233
- return lightNodes;
234
-
235
- }
236
-
237
- setLights( lights ) {
238
-
239
- super.setLights( lights );
240
-
241
- if ( this._dataNodes.size > 0 ) {
242
-
243
- this._updateDataNodeLights( lights );
169
+ dataNode.setLights( lightsByType.get( typeName ) || [] );
244
170
 
245
171
  }
246
172
 
247
- return this;
173
+ return super.setLights( lights );
248
174
 
249
175
  }
250
176
 
251
- _updateDataNodeLights( lights ) {
177
+ getBuiltinLights() {
252
178
 
253
- const lightsByType = new Map();
254
-
255
- for ( const light of lights ) {
256
-
257
- if ( canBatchLight( light ) === false ) continue;
258
-
259
- const typeName = light.constructor.name;
260
- const typeLights = lightsByType.get( typeName );
261
-
262
- if ( typeLights === undefined ) {
263
-
264
- lightsByType.set( typeName, [ light ] );
265
-
266
- } else {
267
-
268
- typeLights.push( light );
269
-
270
- }
271
-
272
- }
273
-
274
- for ( const [ typeName, dataNode ] of this._dataNodes ) {
275
-
276
- dataNode.setLights( lightsByType.get( typeName ) || [] );
277
-
278
- }
179
+ return this._builtinLights;
279
180
 
280
181
  }
281
182
 
@@ -1,5 +1,5 @@
1
- import { AnalyticLightNode, Vector3 } from 'three/webgpu';
2
- import { array, getShIrradianceAt, normalWorld, positionWorld, texture3D, uniform, vec3 } from 'three/tsl';
1
+ import { AnalyticLightNode, NodeUpdateType, Vector3 } from 'three/webgpu';
2
+ import { INFINITY, If, array, getShIrradianceAt, normalWorld, positionWorld, renderGroup, texture3D, uniform, vec3 } from 'three/tsl';
3
3
 
4
4
  // Padding texels at each boundary of every atlas sub-volume.
5
5
  export const ATLAS_PADDING = 1;
@@ -49,6 +49,53 @@ function evaluateGridIrradiance( atlas, uvw, res, normal ) {
49
49
 
50
50
  }
51
51
 
52
+ /**
53
+ * Evaluates the irradiance of a light probe grid at the given world-space position and normal.
54
+ *
55
+ * @private
56
+ * @param {LightProbeGrid} light - The light probe grid.
57
+ * @param {Node<vec3>} min - The minimum of the grid bounds.
58
+ * @param {Node<vec3>} max - The maximum of the grid bounds.
59
+ * @param {Node<vec3>} res - The probe resolution.
60
+ * @param {Node<float>} intensity - The intensity.
61
+ * @param {Node<vec3>} position - The world-space position.
62
+ * @param {Node<vec3>} normal - The world-space normal.
63
+ * @return {Node<vec3>} The irradiance.
64
+ */
65
+ function getGridIrradiance( light, min, max, res, intensity, position, normal ) {
66
+
67
+ const range = max.sub( min );
68
+ const spacing = range.div( res );
69
+
70
+ // Offset along the normal by half a probe spacing. The bounds hold one cell per
71
+ // probe, so they map directly to the probe grid; clamp to the outermost texel centers.
72
+
73
+ const samplePos = position.add( normal.mul( spacing ).mul( 0.5 ) );
74
+ const halfTexel = vec3( 0.5 ).div( res );
75
+ const uvw = samplePos.sub( min ).div( range ).clamp( halfTexel, halfTexel.oneMinus() );
76
+
77
+ return evaluateGridIrradiance( texture3D( light.texture ), uvw, res, normal ).mul( intensity );
78
+
79
+ }
80
+
81
+ /**
82
+ * Returns the irradiance of a baked {@link LightProbeGrid} at the given world-space
83
+ * position and normal. Use this to evaluate the grid outside of the lighting context,
84
+ * e.g. when baking light maps with {@link LightMapper}.
85
+ *
86
+ * @param {LightProbeGrid} light - The baked light probe grid.
87
+ * @param {Node<vec3>} position - The world-space position.
88
+ * @param {Node<vec3>} normal - The world-space normal.
89
+ * @return {Node<vec3>} The irradiance.
90
+ */
91
+ export function lightProbeGridIrradiance( light, position, normal ) {
92
+
93
+ const box = light.boundingBox;
94
+
95
+ return getGridIrradiance( light, uniform( box.min ), uniform( box.max ), uniform( light.resolution ), uniform( light.intensity ), position, normal );
96
+
97
+ }
98
+
52
99
  /**
53
100
  * The light node that applies a {@link LightProbeGrid} to the scene. It samples
54
101
  * the baked L2 spherical-harmonic atlas at the surface position and adds the
@@ -71,11 +118,15 @@ class LightProbeGridNode extends AnalyticLightNode {
71
118
 
72
119
  super( light );
73
120
 
121
+ // Bounce grid intensity changes between bake passes within a frame.
122
+
74
123
  this._min = uniform( new Vector3() );
75
124
  this._max = uniform( new Vector3() );
76
125
  this._resolution = uniform( new Vector3() );
77
- this._intensity = uniform( 1 );
78
- this._falloff = uniform( 0 );
126
+ this._intensity = uniform( 1 ).setGroup( renderGroup );
127
+ this._priority = uniform( 0 ).setGroup( renderGroup );
128
+
129
+ this.updateType = NodeUpdateType.RENDER;
79
130
 
80
131
  }
81
132
 
@@ -87,7 +138,7 @@ class LightProbeGridNode extends AnalyticLightNode {
87
138
  this._max.value.copy( light.boundingBox.max );
88
139
  this._resolution.value.copy( light.resolution );
89
140
  this._intensity.value = light.intensity;
90
- this._falloff.value = light.falloff;
141
+ this._priority.value = light.priority;
91
142
 
92
143
  }
93
144
 
@@ -95,39 +146,35 @@ class LightProbeGridNode extends AnalyticLightNode {
95
146
 
96
147
  const light = this.light;
97
148
 
98
- // No baked data yet: contribute nothing.
99
-
100
- if ( light.texture === null ) return;
101
-
102
149
  const min = this._min;
103
150
  const max = this._max;
104
151
  const res = this._resolution;
105
152
 
106
- const range = max.sub( min );
107
- const resMinusOne = res.sub( 1.0 );
108
- const spacing = range.div( resMinusOne );
109
-
110
- // Offset along the normal by half a probe spacing, then remap to texel centers.
111
-
153
+ const spacing = max.sub( min ).div( res );
112
154
  const samplePos = positionWorld.add( normalWorld.mul( spacing ).mul( 0.5 ) );
113
- const uvw = samplePos.sub( min ).div( range ).clamp( 0.0, 1.0 ).mul( resMinusOne ).div( res ).add( vec3( 0.5 ).div( res ) );
114
155
 
115
- const result = evaluateGridIrradiance( texture3D( light.texture ), uvw, res, normalWorld );
156
+ // Grow the bounds by 1% of a cell, so fragments on the bounds aren't left out by
157
+ // precision errors or samples outside of the triangle.
158
+
159
+ const margin = spacing.mul( 0.01 );
160
+ const inside = samplePos.greaterThanEqual( min.sub( margin ) ).all().and( samplePos.lessThanEqual( max.add( margin ) ).all() );
116
161
 
117
- let irradiance = result.mul( this._intensity );
162
+ builder.context.lightProbeIrradiance ||= vec3().toVar( 'lightProbeIrradiance' );
163
+ builder.context.lightProbePriority ||= INFINITY.negate().toVar( 'lightProbePriority' );
118
164
 
119
- // Optional smooth boundary for blending grids; falloff 0 applies everywhere.
165
+ const prioritized = this._priority.greaterThanEqual( builder.context.lightProbePriority );
120
166
 
121
- if ( light.falloff > 0 ) {
167
+ If( inside.and( prioritized ), () => {
122
168
 
123
- const outside = min.sub( positionWorld ).max( 0.0 ).add( positionWorld.sub( max ).max( 0.0 ) );
124
- const weight = outside.length().smoothstep( 0.0, this._falloff ).oneMinus();
169
+ const irradiance = getGridIrradiance( light, min, max, res, this._intensity, positionWorld, normalWorld ).toConst();
125
170
 
126
- irradiance = irradiance.mul( weight );
171
+ // fragments can be located in multiple grids but only the one with the highest priority defines the irradiance,
172
+ // on ties the most recently created grid wins, see #34798
127
173
 
128
- }
174
+ builder.context.lightProbeIrradiance.assign( irradiance );
175
+ builder.context.lightProbePriority.assign( this._priority );
129
176
 
130
- builder.context.irradiance.addAssign( irradiance );
177
+ } );
131
178
 
132
179
  }
133
180
 
@@ -26,6 +26,12 @@ class AmbientLightDataNode extends Node {
26
26
 
27
27
  }
28
28
 
29
+ isCacheable( /*builder*/ ) {
30
+
31
+ return false;
32
+
33
+ }
34
+
29
35
  setLights( lights ) {
30
36
 
31
37
  this._lights = lights;
@@ -46,6 +46,12 @@ class DirectionalLightDataNode extends Node {
46
46
 
47
47
  }
48
48
 
49
+ isCacheable( /*builder*/ ) {
50
+
51
+ return false;
52
+
53
+ }
54
+
49
55
  setLights( lights ) {
50
56
 
51
57
  if ( lights.length > this.maxCount ) {
@@ -46,6 +46,12 @@ class HemisphereLightDataNode extends Node {
46
46
 
47
47
  }
48
48
 
49
+ isCacheable( /*builder*/ ) {
50
+
51
+ return false;
52
+
53
+ }
54
+
49
55
  setLights( lights ) {
50
56
 
51
57
  if ( lights.length > this.maxCount ) {
@@ -48,6 +48,12 @@ class PointLightDataNode extends Node {
48
48
 
49
49
  }
50
50
 
51
+ isCacheable( /*builder*/ ) {
52
+
53
+ return false;
54
+
55
+ }
56
+
51
57
  setLights( lights ) {
52
58
 
53
59
  if ( lights.length > this.maxCount ) {
@@ -54,6 +54,12 @@ class SpotLightDataNode extends Node {
54
54
 
55
55
  }
56
56
 
57
+ isCacheable( /*builder*/ ) {
58
+
59
+ return false;
60
+
61
+ }
62
+
57
63
  setLights( lights ) {
58
64
 
59
65
  if ( lights.length > this.maxCount ) {
@@ -5,16 +5,22 @@ import {
5
5
  Plane,
6
6
  Line3,
7
7
  DepthTexture,
8
+ Compatibility,
8
9
  LessCompare,
10
+ GreaterEqualCompare,
11
+ LinearFilter,
12
+ NearestFilter,
13
+ PCFShadowMap,
9
14
  Vector2,
10
15
  RedFormat,
11
16
  ArrayCamera,
12
17
  VSMShadowMap,
13
18
  RendererUtils,
14
- Quaternion
19
+ Quaternion,
20
+ UnsignedIntType
15
21
  } from 'three/webgpu';
16
22
 
17
- import { min, Fn, shadow, NodeUpdateType } from 'three/tsl';
23
+ import { Fn, int, lightShadowMatrix, mix, normalWorld, reference, renderGroup, shadow, shadowPositionWorld, texture, vec2, vec3, vec4, NodeUpdateType } from 'three/tsl';
18
24
 
19
25
  const { resetRendererAndSceneState, restoreRendererAndSceneState } = RendererUtils;
20
26
  let _rendererState;
@@ -57,6 +63,7 @@ class TileShadowNode extends ShadowBaseNode {
57
63
  * @param {number} [options.tilesX=2] - The number of tiles along the X-axis.
58
64
  * @param {number} [options.tilesY=2] - The number of tiles along the Y-axis.
59
65
  * @param {Object} [options.resolution] - The resolution of the shadow map.
66
+ * @param {number} [options.depthType=UnsignedIntType] - The type of the tile depth texture. `UnsignedShortType` halves the memory when the depth range allows it.
60
67
  * @param {boolean} [options.debug=false] - Whether to enable debug mode.
61
68
  */
62
69
  constructor( light, options = {} ) {
@@ -68,6 +75,7 @@ class TileShadowNode extends ShadowBaseNode {
68
75
  tilesX: options.tilesX || 2,
69
76
  tilesY: options.tilesY || 2,
70
77
  resolution: options.resolution || light.shadow.mapSize,
78
+ depthType: options.depthType || UnsignedIntType,
71
79
  debug: options.debug !== undefined ? options.debug : false
72
80
  };
73
81
 
@@ -159,12 +167,14 @@ class TileShadowNode extends ShadowBaseNode {
159
167
  // Clear existing lights/nodes if re-initializing
160
168
  this.disposeLightsAndNodes();
161
169
 
162
- const depthTexture = new DepthTexture( shadowWidth, shadowHeight, undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined, tileCount );
163
- depthTexture.compareFunction = LessCompare;
170
+ const depthTexture = new DepthTexture( shadowWidth, shadowHeight, this.config.depthType, undefined, undefined, undefined, undefined, undefined, undefined, undefined, tileCount );
171
+ depthTexture.compareFunction = builder.renderer.reversedDepthBuffer ? GreaterEqualCompare : LessCompare;
164
172
  depthTexture.name = 'ShadowDepthArrayTexture';
165
- const shadowMap = builder.createRenderTarget( shadowWidth, shadowHeight, { format: RedFormat, depth: tileCount, useArrayDepthTexture: true } );
173
+ // The color attachment is only sampled for transmitted shadows.
174
+ const count = builder.renderer.shadowMap.transmitted === true ? 1 : 0;
175
+ const shadowMap = builder.createRenderTarget( shadowWidth, shadowHeight, { count, format: RedFormat, depth: tileCount, useArrayDepthTexture: true } );
166
176
  shadowMap.depthTexture = depthTexture;
167
- shadowMap.texture.name = 'ShadowTexture';
177
+ if ( count > 0 ) shadowMap.texture.name = 'ShadowTexture';
168
178
  this.shadowMap = shadowMap;
169
179
  const cameras = [];
170
180
 
@@ -221,6 +231,10 @@ class TileShadowNode extends ShadowBaseNode {
221
231
  const cameraArray = new ArrayCamera( cameras );
222
232
  this.cameraArray = cameraArray;
223
233
 
234
+ // setup() reads depth through this camera.
235
+ light.shadow.camera.coordinateSystem = builder.renderer.coordinateSystem;
236
+ light.shadow.camera._reversedDepth = builder.renderer.reversedDepthBuffer;
237
+
224
238
  }
225
239
 
226
240
  /**
@@ -259,6 +273,11 @@ class TileShadowNode extends ShadowBaseNode {
259
273
 
260
274
  }
261
275
 
276
+ // The original light does not render a shadow map, but setup() uses its shadow matrix.
277
+
278
+ shadowCam.updateProjectionMatrix();
279
+ light.shadow.updateMatrices( light );
280
+
262
281
  }
263
282
 
264
283
  /**
@@ -270,14 +289,15 @@ class TileShadowNode extends ShadowBaseNode {
270
289
  const { shadowMap, light } = this;
271
290
  const { renderer, scene, camera } = frame;
272
291
  const shadowType = renderer.shadowMap.type;
273
- const depthVersion = shadowMap.depthTexture.version;
274
- this._depthVersionCached = depthVersion;
275
292
  const currentRenderObjectFunction = renderer.getRenderObjectFunction();
276
293
 
277
294
  _rendererState = resetRendererAndSceneState( renderer, scene, _rendererState );
278
295
  scene.overrideMaterial = this.getShadowMaterial();
279
296
  renderer.setRenderTarget( this.shadowMap );
280
297
 
298
+ const cameraArrayLayers = this.cameraArray.layers.mask;
299
+ this.cameraArray.layers.mask = 0;
300
+
281
301
  for ( let index = 0; index < this.lights.length; index ++ ) {
282
302
 
283
303
  const light = this.lights[ index ];
@@ -294,6 +314,9 @@ class TileShadowNode extends ShadowBaseNode {
294
314
 
295
315
  shadow.updateMatrices( light );
296
316
 
317
+ // The tiles render through the array camera, so it has to see every tile's layers.
318
+ this.cameraArray.layers.mask |= shadow.camera.layers.mask;
319
+
297
320
  renderer.setRenderObjectFunction( this.getShadowRenderObjectFunction( renderer, shadow ) );
298
321
  this.shadowMap.setSize( shadow.mapSize.width, shadow.mapSize.height, shadowMap.depth );
299
322
 
@@ -311,6 +334,8 @@ class TileShadowNode extends ShadowBaseNode {
311
334
 
312
335
  restoreRendererAndSceneState( renderer, scene, _rendererState );
313
336
 
337
+ this.cameraArray.layers.mask = cameraArrayLayers;
338
+
314
339
  for ( let index = 0; index < this.lights.length; index ++ ) {
315
340
 
316
341
  const light = this.lights[ index ];
@@ -352,11 +377,7 @@ class TileShadowNode extends ShadowBaseNode {
352
377
  this.update();
353
378
  this.updateShadow( frame );
354
379
 
355
- if ( this.shadowMap.depthTexture.version === this._depthVersionCached ) {
356
-
357
- shadow.needsUpdate = false;
358
-
359
- }
380
+ shadow.needsUpdate = false;
360
381
 
361
382
  }
362
383
 
@@ -400,10 +421,77 @@ class TileShadowNode extends ShadowBaseNode {
400
421
 
401
422
  }
402
423
 
424
+ // Hardware-filtered depth comparisons for PCF, as in ShadowNode. The shadow type can change between
425
+ // builds, so this is checked every time; disposing the shadow map recreates it with the new filter.
426
+
427
+ const { renderer } = builder;
428
+ const filter = renderer.shadowMap.type === PCFShadowMap && renderer.hasCompatibility( Compatibility.TEXTURE_COMPARE ) ? LinearFilter : NearestFilter;
429
+ const depthTexture = this.shadowMap.depthTexture;
430
+
431
+ if ( depthTexture.magFilter !== filter ) {
432
+
433
+ depthTexture.minFilter = filter;
434
+ depthTexture.magFilter = filter;
435
+
436
+ this.shadowMap.dispose();
437
+
438
+ }
439
+
403
440
  return Fn( ( builder ) => {
404
441
 
405
442
  this.setupShadowPosition( builder );
406
- return min( ...this._shadowNodes ).toVar( 'shadowValue' );
443
+
444
+ // The fragment's position in the full shadow camera gives its tile and the coordinate within it.
445
+
446
+ const { tilesX, tilesY } = this.config;
447
+ const tileShadowNode = this._shadowNodes[ 0 ];
448
+ const tileShadow = this.lights[ 0 ].shadow;
449
+ const shadow = this.originalLight.shadow;
450
+ const normalBias = reference( 'normalBias', 'float', shadow ).setGroup( renderGroup );
451
+
452
+ const shadowPosition = lightShadowMatrix( this.originalLight ).mul( vec4( shadowPositionWorld.add( normalWorld.mul( normalBias ) ), 1 ) );
453
+ const shadowCoord = tileShadowNode.setupShadowCoord( builder, shadowPosition );
454
+
455
+ const grid = shadowCoord.xy.mul( vec2( tilesX, tilesY ) ); // tiles start from the top row
456
+ const tile = grid.floor().clamp( vec2( 0 ), vec2( tilesX - 1, tilesY - 1 ) );
457
+ const depthLayer = int( tile.y.mul( tilesX ).add( tile.x ) );
458
+
459
+ const tileCoord = vec3( grid.sub( tile ), shadowCoord.z );
460
+
461
+ const filterFn = tileShadow.filterNode || tileShadowNode.getShadowFilterFn( builder.renderer.shadowMap.type );
462
+ const shadowValue = tileShadowNode.setupShadowFilter( builder, {
463
+ filterFn,
464
+ depthTexture,
465
+ shadowCoord: tileCoord,
466
+ shadow: tileShadow,
467
+ depthLayer
468
+ } );
469
+
470
+ const shadowIntensity = reference( 'intensity', 'float', shadow ).setGroup( renderGroup );
471
+
472
+ let shadowOutput;
473
+
474
+ if ( builder.renderer.shadowMap.transmitted === true ) {
475
+
476
+ const shadowColor = texture( this.shadowMap.texture, tileCoord ).depth( depthLayer );
477
+
478
+ shadowOutput = mix( 1, shadowValue.rgb.mix( shadowColor, 1 ), shadowIntensity.mul( shadowColor.a ) ).toVar( 'shadowValue' );
479
+
480
+ } else {
481
+
482
+ shadowOutput = mix( 1, shadowValue, shadowIntensity ).toVar( 'shadowValue' );
483
+
484
+ }
485
+
486
+ // As in ShadowNode.setup(), which the tiles no longer go through.
487
+
488
+ if ( builder.material.receivedShadowNode ) {
489
+
490
+ shadowOutput = builder.material.receivedShadowNode( shadowOutput );
491
+
492
+ }
493
+
494
+ return shadowOutput;
407
495
 
408
496
  } )();
409
497