@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
@@ -8,12 +8,13 @@ import { float, pow4 } from '../tsl/TSLBase.js';
8
8
  import { bentNormalView } from '../accessors/AccessorsUtils.js';
9
9
  import { pmremTexture } from '../pmrem/PMREMNode.js';
10
10
  import { materialEnvIntensity } from '../accessors/MaterialProperties.js';
11
+ import { NodeUpdateType } from '../core/constants.js';
11
12
 
12
13
  const _rendererCache = new WeakMap();
13
14
 
14
15
  /**
15
16
  * Represents a physical model for Image-based lighting (IBL). The environment
16
- * is defined via environment maps in the equirectangular, cube map or cubeUV (PMREM) format.
17
+ * is defined by an equirectangular or cube texture.
17
18
  * `EnvironmentNode` is intended for PBR materials like {@link MeshStandardNodeMaterial}.
18
19
  *
19
20
  * @augments LightingNode
@@ -43,6 +44,16 @@ class EnvironmentNode extends LightingNode {
43
44
  */
44
45
  this.envNode = envNode;
45
46
 
47
+ /**
48
+ * The PMREM node of a texture or material reference environment. Its texture is
49
+ * resolved before rendering since materials with different environments can share a shader.
50
+ *
51
+ * @private
52
+ * @type {?PMREMNode}
53
+ * @default null
54
+ */
55
+ this._pmremNode = null;
56
+
46
57
  }
47
58
 
48
59
  setup( builder ) {
@@ -53,21 +64,22 @@ class EnvironmentNode extends LightingNode {
53
64
 
54
65
  if ( envNode.isTextureNode || envNode.isMaterialReferenceNode ) {
55
66
 
56
- const value = ( envNode.isTextureNode ) ? envNode.value : material[ envNode.property ];
57
-
58
67
  const cache = this._getPMREMNodeCache( builder.renderer );
59
68
 
60
- let cacheEnvNode = cache.get( value );
69
+ let pmremNode = cache.get( envNode );
61
70
 
62
- if ( cacheEnvNode === undefined ) {
71
+ if ( pmremNode === undefined ) {
63
72
 
64
- cacheEnvNode = pmremTexture( value );
73
+ pmremNode = pmremTexture( this._getEnvTexture( builder ) );
65
74
 
66
- cache.set( value, cacheEnvNode );
75
+ cache.set( envNode, pmremNode );
67
76
 
68
77
  }
69
78
 
70
- envNode = cacheEnvNode;
79
+ this._pmremNode = pmremNode;
80
+ this.updateBeforeType = envNode.isMaterialReferenceNode ? NodeUpdateType.OBJECT : NodeUpdateType.RENDER;
81
+
82
+ envNode = pmremNode;
71
83
 
72
84
  }
73
85
 
@@ -111,6 +123,44 @@ class EnvironmentNode extends LightingNode {
111
123
 
112
124
  }
113
125
 
126
+ updateBefore( frame ) {
127
+
128
+ const texture = this._getEnvTexture( frame );
129
+
130
+ // the texture can be removed without a rebuild of the material
131
+
132
+ if ( texture && this._pmremNode.value !== texture ) {
133
+
134
+ this._pmremNode.value = texture;
135
+ this._pmremNode.updateBefore( frame );
136
+
137
+ }
138
+
139
+ }
140
+
141
+ /**
142
+ * Returns the current texture of the environment node.
143
+ *
144
+ * @private
145
+ * @param {(NodeFrame|NodeBuilder)} state - The current state.
146
+ * @return {Texture} The environment texture.
147
+ */
148
+ _getEnvTexture( state ) {
149
+
150
+ const envNode = this.envNode;
151
+
152
+ if ( envNode.isMaterialReferenceNode ) {
153
+
154
+ envNode.updateReference( state );
155
+
156
+ return envNode.getValueFromReference();
157
+
158
+ }
159
+
160
+ return envNode.value;
161
+
162
+ }
163
+
114
164
  /**
115
165
  * Returns the PMREM node cache of the current renderer.
116
166
  *
@@ -1,6 +1,9 @@
1
1
  import SpotLightNode from './SpotLightNode.js';
2
2
  import { texture } from '../accessors/TextureNode.js';
3
- import { vec2 } from '../tsl/TSLBase.js';
3
+ import { textureSize } from '../accessors/TextureSizeNode.js';
4
+ import { float, vec2 } from '../tsl/TSLBase.js';
5
+ import { atan } from '../math/MathNode.js';
6
+ import { remap } from '../utils/Remap.js';
4
7
 
5
8
  /**
6
9
  * An IES version of the default spot light node.
@@ -49,11 +52,23 @@ class IESSpotLightNode extends SpotLightNode {
49
52
 
50
53
  if ( iesMap && iesMap.isTexture === true ) {
51
54
 
52
- const angle = angleCosine.acos().mul( 1.0 / Math.PI );
55
+ // the light space coordinate used for projected maps, centered on the forward axis twist calculation
56
+ const lightCoord = this.getLightCoord( builder ).sub( 0.5 );
53
57
 
54
- this._iesTextureNode = texture( iesMap, vec2( angle, 0 ), 0 );
58
+ this._iesTextureNode = texture( iesMap );
55
59
 
56
- spotAttenuation = this._iesTextureNode.r;
60
+ // get the width of half a texel in uv
61
+ const texelInset = float( 0.5 ).div( vec2( textureSize( this._iesTextureNode ) ) );
62
+
63
+ // the twist angle around the light's forward axis, mapping from [0, 359]deg texels
64
+ // offset by half a texel so we start at the center of the first texel
65
+ const twistAngle = remap( atan( lightCoord.y, lightCoord.x ), - Math.PI, Math.PI ).add( texelInset.y );
66
+
67
+ // the tilt angle off the forward axis spanning from [0, 180]deg
68
+ // inset by half a texel on each side so we're clamping to the center of the extreme texels
69
+ const tiltAngle = remap( angleCosine.acos(), 0, Math.PI, texelInset.x, float( 1 ).sub( texelInset.x ) );
70
+
71
+ spotAttenuation = this._iesTextureNode.sample( vec2( tiltAngle, twistAngle ) ).level( 0 ).r;
57
72
 
58
73
  } else {
59
74
 
@@ -1,6 +1,7 @@
1
1
  import AnalyticLightNode from './AnalyticLightNode.js';
2
2
  import { normalWorld } from '../accessors/Normal.js';
3
3
  import { uniformArray } from '../accessors/UniformArrayNode.js';
4
+ import { renderGroup } from '../core/UniformGroupNode.js';
4
5
  import { Vector3 } from '../../math/Vector3.js';
5
6
  import getShIrradianceAt from '../functions/material/getShIrradianceAt.js';
6
7
 
@@ -35,7 +36,7 @@ class LightProbeNode extends AnalyticLightNode {
35
36
  *
36
37
  * @type {UniformArrayNode}
37
38
  */
38
- this.lightProbe = uniformArray( array );
39
+ this.lightProbe = uniformArray( array ).setGroup( renderGroup );
39
40
 
40
41
  }
41
42
 
@@ -1,7 +1,7 @@
1
1
  import { Fn } from '../tsl/TSLBase.js';
2
2
 
3
3
  /**
4
- * Represents a `discard` shader operation in TSL.
4
+ * Calculates, at a given distance from a light, the falloff of the light's brightness.
5
5
  *
6
6
  * @method
7
7
  * @param {Object} inputs - The input parameter object.
@@ -22,4 +22,4 @@ export const getDistanceAttenuation = /*@__PURE__*/ Fn( ( { lightDistance, cutof
22
22
  distanceFalloff
23
23
  );
24
24
 
25
- } ); // validated
25
+ }, { lightDistance: 'float', cutoffDistance: 'float', decayExponent: 'float', return: 'float' } ); // validated
@@ -31,6 +31,12 @@ class LightingNode extends Node {
31
31
 
32
32
  }
33
33
 
34
+ isCacheable( /*builder*/ ) {
35
+
36
+ return false;
37
+
38
+ }
39
+
34
40
  }
35
41
 
36
42
  export default LightingNode;
@@ -138,6 +138,12 @@ class LightsNode extends Node {
138
138
 
139
139
  }
140
140
 
141
+ isCacheable( /*builder*/ ) {
142
+
143
+ return false;
144
+
145
+ }
146
+
141
147
  /**
142
148
  * Overwrites the default {@link Node#customCacheKey} implementation by including
143
149
  * light data into the cache key.
@@ -155,6 +161,17 @@ class LightsNode extends Node {
155
161
  _hashData.push( light.id );
156
162
  _hashData.push( light.castShadow ? 1 : 0 );
157
163
 
164
+ if ( light.castShadow === true ) {
165
+
166
+ // force rebuild on version change to avoid the usage of removed shadow nodes
167
+
168
+ const lightNode = _lightsNodeRef.get( light );
169
+ const lightVersion = ( lightNode ) ? lightNode.version : 0; // light nodes start at version 0, see #35019
170
+
171
+ _hashData.push( lightVersion );
172
+
173
+ }
174
+
158
175
  if ( light.isSpotLight === true ) {
159
176
 
160
177
  const hashMap = ( light.map !== null ) ? light.map.id : - 1;
@@ -206,26 +223,6 @@ class LightsNode extends Node {
206
223
 
207
224
  }
208
225
 
209
- /**
210
- * Analyzes the node's dependencies by building all nested light nodes
211
- * and the output node.
212
- *
213
- * @param {NodeBuilder} builder - A reference to the current node builder.
214
- */
215
- analyze( builder ) {
216
-
217
- const properties = builder.getNodeProperties( this );
218
-
219
- for ( const node of properties.nodes ) {
220
-
221
- node.build( builder );
222
-
223
- }
224
-
225
- properties.outputNode.build( builder );
226
-
227
- }
228
-
229
226
  /**
230
227
  * Creates lighting nodes for each scene light. This makes it possible to further
231
228
  * process lights in the node system.
@@ -244,7 +241,6 @@ class LightsNode extends Node {
244
241
  const builtinLights = this.getBuiltinLights();
245
242
 
246
243
  const lights = sortLights( [ ...materialLightings, ...builtinLights ] );
247
- const nodeLibrary = builder.renderer.library;
248
244
 
249
245
  for ( const light of lights ) {
250
246
 
@@ -264,9 +260,9 @@ class LightsNode extends Node {
264
260
 
265
261
  if ( lightNode === null ) {
266
262
 
267
- const lightNodeClass = nodeLibrary.getLightNodeClass( light.constructor );
263
+ const lightNodeClass = light._lightNode;
268
264
 
269
- if ( lightNodeClass === null ) {
265
+ if ( lightNodeClass === undefined ) {
270
266
 
271
267
  warn( `LightsNode.setupNodeLights: Light node not found for ${ light.constructor.name }` );
272
268
  continue;
@@ -346,6 +342,12 @@ class LightsNode extends Node {
346
342
 
347
343
  }
348
344
 
345
+ if ( builder.context.lightProbeIrradiance !== undefined ) {
346
+
347
+ builder.context.irradiance.addAssign( builder.context.lightProbeIrradiance );
348
+
349
+ }
350
+
349
351
  }
350
352
 
351
353
  getLightNodes( builder ) {
@@ -381,17 +383,13 @@ class LightsNode extends Node {
381
383
  const context = builder.context;
382
384
  const lightingModel = context.lightingModel;
383
385
 
384
- const properties = builder.getNodeProperties( this );
385
-
386
386
  if ( lightingModel ) {
387
387
 
388
388
  const { totalDiffuseNode, totalSpecularNode } = this;
389
389
 
390
390
  context.outgoingLight = outgoingLightNode;
391
391
 
392
- const stack = builder.addStack();
393
-
394
- properties.nodes = stack.nodes;
392
+ builder.addStack();
395
393
 
396
394
  lightingModel.start( builder );
397
395
 
@@ -423,10 +421,6 @@ class LightsNode extends Node {
423
421
 
424
422
  outgoingLightNode = outgoingLightNode.bypass( builder.removeStack() );
425
423
 
426
- } else {
427
-
428
- properties.nodes = [];
429
-
430
424
  }
431
425
 
432
426
  builder.lightsNode = currentLightsNode;
@@ -1,4 +1,5 @@
1
1
  import ShadowNode from './ShadowNode.js';
2
+ import { Loop } from '../utils/LoopNode.js';
2
3
  import { uniform } from '../core/UniformNode.js';
3
4
  import { float, vec3, If, Fn } from '../tsl/TSLBase.js';
4
5
  import { reference } from '../accessors/ReferenceNode.js';
@@ -11,8 +12,8 @@ import { BasicShadowMap, GreaterEqualCompare, LessEqualCompare, WebGPUCoordinate
11
12
  import { CubeDepthTexture } from '../../textures/CubeDepthTexture.js';
12
13
  import { screenCoordinate } from '../display/ScreenNode.js';
13
14
  import { interleavedGradientNoise, vogelDiskSample } from '../utils/PostProcessingUtils.js';
14
- import { abs, normalize, cross } from '../math/MathNode.js';
15
- import { viewZToLogarithmicDepth, viewZToPerspectiveDepth, viewZToReversedPerspectiveDepth } from '../display/ViewportDepthNode.js';
15
+ import { abs, normalize, cross, max } from '../math/MathNode.js';
16
+ import { viewZToLogarithmicDepth } from '../display/ViewportDepthNode.js';
16
17
 
17
18
  const _clearColor = /*@__PURE__*/ new Color();
18
19
  const _projScreenMatrix = /*@__PURE__*/ new Matrix4();
@@ -21,15 +22,15 @@ const _lookTarget = /*@__PURE__*/ new Vector3();
21
22
 
22
23
  // Cube map face directions and up vectors for point light shadows
23
24
  // Face order: +X, -X, +Y, -Y, +Z, -Z
24
- // WebGPU coordinate system - Y faces swapped to match texture sampling convention
25
+ // WebGPU coordinate system - same face orientations as CubeCamera
25
26
  const _cubeDirectionsWebGPU = [
26
- /*@__PURE__*/ new Vector3( 1, 0, 0 ), /*@__PURE__*/ new Vector3( - 1, 0, 0 ), /*@__PURE__*/ new Vector3( 0, - 1, 0 ),
27
- /*@__PURE__*/ new Vector3( 0, 1, 0 ), /*@__PURE__*/ new Vector3( 0, 0, 1 ), /*@__PURE__*/ new Vector3( 0, 0, - 1 )
27
+ /*@__PURE__*/ new Vector3( - 1, 0, 0 ), /*@__PURE__*/ new Vector3( 1, 0, 0 ), /*@__PURE__*/ new Vector3( 0, 1, 0 ),
28
+ /*@__PURE__*/ new Vector3( 0, - 1, 0 ), /*@__PURE__*/ new Vector3( 0, 0, 1 ), /*@__PURE__*/ new Vector3( 0, 0, - 1 )
28
29
  ];
29
30
 
30
31
  const _cubeUpsWebGPU = [
31
- /*@__PURE__*/ new Vector3( 0, - 1, 0 ), /*@__PURE__*/ new Vector3( 0, - 1, 0 ), /*@__PURE__*/ new Vector3( 0, 0, - 1 ),
32
- /*@__PURE__*/ new Vector3( 0, 0, 1 ), /*@__PURE__*/ new Vector3( 0, - 1, 0 ), /*@__PURE__*/ new Vector3( 0, - 1, 0 )
32
+ /*@__PURE__*/ new Vector3( 0, 1, 0 ), /*@__PURE__*/ new Vector3( 0, 1, 0 ), /*@__PURE__*/ new Vector3( 0, 0, - 1 ),
33
+ /*@__PURE__*/ new Vector3( 0, 0, 1 ), /*@__PURE__*/ new Vector3( 0, 1, 0 ), /*@__PURE__*/ new Vector3( 0, 1, 0 )
33
34
  ];
34
35
 
35
36
  // WebGL coordinate system - standard OpenGL convention
@@ -43,6 +44,55 @@ const _cubeUpsWebGL = [
43
44
  /*@__PURE__*/ new Vector3( 0, 0, - 1 ), /*@__PURE__*/ new Vector3( 0, - 1, 0 ), /*@__PURE__*/ new Vector3( 0, - 1, 0 )
44
45
  ];
45
46
 
47
+ /**
48
+ * Returns a function that gives the depth the cube shadow map stores for the point at
49
+ * `direction * distance`, from the largest absolute component of the direction. Each face
50
+ * stores the depth along its own axis, and perspective depth is `depthA + depthB / max( |x|, |y|, |z| )`,
51
+ * so everything but the division is computed once.
52
+ *
53
+ * @private
54
+ * @param {Node<float>} distance - The distance from the light to the fragment.
55
+ * @param {Node<float>} near - The near plane of the shadow camera.
56
+ * @param {Node<float>} far - The far plane of the shadow camera.
57
+ * @param {Node<float>} bias - The shadow bias.
58
+ * @param {Renderer} renderer - The renderer.
59
+ * @return {function(Node<float>):Node<float>} The function, which takes the largest absolute component of the direction.
60
+ */
61
+ const getPointShadowDepthFn = ( distance, near, far, bias, renderer ) => {
62
+
63
+ const { reversedDepthBuffer, logarithmicDepthBuffer } = renderer;
64
+
65
+ // logarithmic depth gets a separate depth function
66
+
67
+ if ( logarithmicDepthBuffer === true ) {
68
+
69
+ return ( maxAbs ) => viewZToLogarithmicDepth( maxAbs.mul( distance ).negate(), near, far ).add( bias );
70
+
71
+ }
72
+
73
+ // default and reverse depth share one
74
+
75
+ const depthRange = far.sub( near );
76
+ const nearFar = near.mul( far ).div( depthRange.mul( distance ) );
77
+
78
+ let depthA, depthB;
79
+
80
+ if ( reversedDepthBuffer === true ) {
81
+
82
+ depthA = near.div( depthRange ).add( bias ).negate().toConst();
83
+ depthB = nearFar.toConst();
84
+
85
+ } else {
86
+
87
+ depthA = far.div( depthRange ).add( bias ).toConst();
88
+ depthB = nearFar.negate().toConst();
89
+
90
+ }
91
+
92
+ return ( maxAbs ) => depthA.add( depthB.div( maxAbs ) );
93
+
94
+ };
95
+
46
96
  export const BasicPointShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, bd3D, dp } ) => {
47
97
 
48
98
  return cubeTexture( depthTexture, bd3D ).compare( dp );
@@ -59,38 +109,48 @@ export const BasicPointShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, bd3D,
59
109
  * @param {Object} inputs - The input parameter object.
60
110
  * @param {CubeDepthTexture} inputs.depthTexture - A reference to the shadow cube map.
61
111
  * @param {Node<vec3>} inputs.bd3D - The normalized direction from light to fragment.
62
- * @param {Node<float>} inputs.dp - The depth value to compare against.
112
+ * @param {Node<float>} inputs.distance - The distance from the light to the fragment.
63
113
  * @param {LightShadow} inputs.shadow - The light shadow.
64
114
  * @return {Node<float>} The filtering result.
65
115
  */
66
- export const PointShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, bd3D, dp, shadow } ) => {
116
+ export const PointShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, bd3D, distance, shadow }, builder ) => {
67
117
 
68
118
  const radius = reference( 'radius', 'float', shadow ).setGroup( renderGroup );
69
119
  const mapSize = reference( 'mapSize', 'vec2', shadow ).setGroup( renderGroup );
120
+ const near = reference( 'near', 'float', shadow.camera ).setGroup( renderGroup );
121
+ const far = reference( 'far', 'float', shadow.camera ).setGroup( renderGroup );
122
+ const bias = reference( 'bias', 'float', shadow ).setGroup( renderGroup );
70
123
 
71
- const texelSize = radius.div( mapSize.x );
124
+ const texelSize = radius.div( mapSize.x ).toConst();
72
125
 
73
126
  // Build a tangent-space coordinate system for applying offsets
74
127
  const absDir = abs( bd3D );
75
- const tangent = normalize( cross( bd3D, absDir.x.greaterThan( absDir.z ).select( vec3( 0, 1, 0 ), vec3( 1, 0, 0 ) ) ) );
76
- const bitangent = cross( bd3D, tangent );
128
+ const tangent = normalize( cross( bd3D, absDir.x.greaterThan( absDir.z ).select( vec3( 0, 1, 0 ), vec3( 1, 0, 0 ) ) ) ).toConst();
129
+ const bitangent = cross( bd3D, tangent ).toConst();
77
130
 
78
131
  // Use IGN to rotate sampling pattern per pixel (phi = IGN * 2π)
79
- const phi = interleavedGradientNoise( screenCoordinate.xy ).mul( 6.28318530718 );
80
-
81
- // 5 samples using Vogel disk distribution in tangent space
82
- const sample0 = vogelDiskSample( 0, 5, phi );
83
- const sample1 = vogelDiskSample( 1, 5, phi );
84
- const sample2 = vogelDiskSample( 2, 5, phi );
85
- const sample3 = vogelDiskSample( 3, 5, phi );
86
- const sample4 = vogelDiskSample( 4, 5, phi );
87
-
88
- return cubeTexture( depthTexture, bd3D.add( tangent.mul( sample0.x ).add( bitangent.mul( sample0.y ) ).mul( texelSize ) ) ).compare( dp )
89
- .add( cubeTexture( depthTexture, bd3D.add( tangent.mul( sample1.x ).add( bitangent.mul( sample1.y ) ).mul( texelSize ) ) ).compare( dp ) )
90
- .add( cubeTexture( depthTexture, bd3D.add( tangent.mul( sample2.x ).add( bitangent.mul( sample2.y ) ).mul( texelSize ) ) ).compare( dp ) )
91
- .add( cubeTexture( depthTexture, bd3D.add( tangent.mul( sample3.x ).add( bitangent.mul( sample3.y ) ).mul( texelSize ) ) ).compare( dp ) )
92
- .add( cubeTexture( depthTexture, bd3D.add( tangent.mul( sample4.x ).add( bitangent.mul( sample4.y ) ).mul( texelSize ) ) ).compare( dp ) )
93
- .mul( 1.0 / 5.0 );
132
+ const phi = interleavedGradientNoise( screenCoordinate.xy ).mul( 6.28318530718 ).toConst();
133
+
134
+ // Each sample is compared against the depth of the point next to the fragment in its direction,
135
+ // on whichever face of the cube it falls, so the comparison is the same on every face.
136
+ const getDepth = getPointShadowDepthFn( distance, near, far, bias, builder.renderer );
137
+
138
+ // Accumulate five samples using Vogel disk distribution in tangent space.
139
+
140
+ const result = float( 0.0 ).toVar();
141
+
142
+ Loop( 5, ( { i } ) => {
143
+
144
+ const sample = vogelDiskSample( i, 5, phi );
145
+ const direction = bd3D.add( tangent.mul( sample.x ).add( bitangent.mul( sample.y ) ).mul( texelSize ) ).toConst();
146
+ const absDirection = abs( direction ).toConst();
147
+ const maxAbs = max( absDirection.x, absDirection.y, absDirection.z ).toConst();
148
+
149
+ result.addAssign( cubeTexture( depthTexture, direction ).compare( getDepth( maxAbs ) ) );
150
+
151
+ } );
152
+
153
+ return result.mul( 1.0 / 5.0 );
94
154
 
95
155
  } );
96
156
 
@@ -110,30 +170,15 @@ const pointShadowFilter = /*@__PURE__*/ Fn( ( { filterFn, depthTexture, shadowCo
110
170
 
111
171
  If( viewZ.sub( shadowCameraFar ).lessThanEqual( 0.0 ).and( viewZ.sub( shadowCameraNear ).greaterThanEqual( 0.0 ) ), () => {
112
172
 
113
- let dp;
114
-
115
- if ( builder.renderer.reversedDepthBuffer ) {
116
-
117
- dp = viewZToReversedPerspectiveDepth( viewZ.negate(), shadowCameraNear, shadowCameraFar );
118
- dp.subAssign( bias );
119
-
120
- } else if ( builder.renderer.logarithmicDepthBuffer ) {
121
-
122
- dp = viewZToLogarithmicDepth( viewZ.negate(), shadowCameraNear, shadowCameraFar );
123
- dp.addAssign( bias );
124
-
125
- } else {
126
-
127
- dp = viewZToPerspectiveDepth( viewZ.negate(), shadowCameraNear, shadowCameraFar );
128
- dp.addAssign( bias );
129
-
130
- }
131
-
132
173
  // bd3D = base direction 3D (direction from light to fragment)
133
174
  const bd3D = shadowPosition.normalize();
175
+ const distance = shadowPosition.length();
176
+
177
+ const getDepth = getPointShadowDepthFn( distance, shadowCameraNear, shadowCameraFar, bias, builder.renderer );
178
+ const dp = getDepth( viewZ.div( distance ) );
134
179
 
135
180
  // percentage-closer filtering using cube texture sampling
136
- result.assign( filterFn( { depthTexture, bd3D, dp, shadow } ) );
181
+ result.assign( filterFn( { depthTexture, bd3D, dp, distance, shadow } ) );
137
182
 
138
183
  } );
139
184
 
@@ -141,7 +186,6 @@ const pointShadowFilter = /*@__PURE__*/ Fn( ( { filterFn, depthTexture, shadowCo
141
186
 
142
187
  } );
143
188
 
144
-
145
189
  /**
146
190
  * Represents the shadow implementation for point light nodes.
147
191
  *
@@ -12,7 +12,7 @@ const sdBox = /*@__PURE__*/ Fn( ( [ p, b ] ) => {
12
12
 
13
13
  return length( max( d, 0.0 ) ).add( min( max( d.x, d.y ), 0.0 ) );
14
14
 
15
- } );
15
+ }, { p: 'vec2', b: 'vec2', return: 'float' } );
16
16
 
17
17
  /**
18
18
  * An implementation of a projector light node.
@@ -2,14 +2,15 @@ import AnalyticLightNode from './AnalyticLightNode.js';
2
2
  import { texture } from '../accessors/TextureNode.js';
3
3
  import { uniform } from '../core/UniformNode.js';
4
4
  import { lightViewPosition } from '../accessors/Lights.js';
5
+ import { cameraViewMatrix } from '../accessors/Camera.js';
6
+ import { vec4 } from '../tsl/TSLBase.js';
5
7
  import { renderGroup } from '../core/UniformGroupNode.js';
6
8
 
7
9
  import { Matrix4 } from '../../math/Matrix4.js';
8
10
  import { Vector3 } from '../../math/Vector3.js';
9
11
  import { NodeUpdateType } from '../core/constants.js';
10
12
 
11
- const _matrix41 = /*@__PURE__*/ new Matrix4();
12
- const _matrix42 = /*@__PURE__*/ new Matrix4();
13
+ const _matrix4 = /*@__PURE__*/ new Matrix4();
13
14
 
14
15
  let _ltcLib = null;
15
16
 
@@ -50,8 +51,8 @@ class RectAreaLightNode extends AnalyticLightNode {
50
51
  this.halfWidth = uniform( new Vector3() ).setGroup( renderGroup );
51
52
 
52
53
  /**
53
- * The `updateType` is set to `NodeUpdateType.RENDER` since the light
54
- * relies on `viewMatrix` which might vary per render call.
54
+ * The `updateType` is set to `NodeUpdateType.RENDER` since the light's
55
+ * world matrix might vary per render call.
55
56
  *
56
57
  * @type {string}
57
58
  * @default 'render'
@@ -71,18 +72,13 @@ class RectAreaLightNode extends AnalyticLightNode {
71
72
 
72
73
  const { light } = this;
73
74
 
74
- const viewMatrix = frame.camera.matrixWorldInverse;
75
-
76
- _matrix42.identity();
77
- _matrix41.copy( light.matrixWorld );
78
- _matrix41.premultiply( viewMatrix );
79
- _matrix42.extractRotation( _matrix41 );
75
+ _matrix4.extractRotation( light.matrixWorld );
80
76
 
81
77
  this.halfWidth.value.set( light.width * 0.5, 0.0, 0.0 );
82
78
  this.halfHeight.value.set( 0.0, light.height * 0.5, 0.0 );
83
79
 
84
- this.halfWidth.value.applyMatrix4( _matrix42 );
85
- this.halfHeight.value.applyMatrix4( _matrix42 );
80
+ this.halfWidth.value.applyMatrix4( _matrix4 );
81
+ this.halfHeight.value.applyMatrix4( _matrix4 );
86
82
 
87
83
  }
88
84
 
@@ -106,11 +102,14 @@ class RectAreaLightNode extends AnalyticLightNode {
106
102
 
107
103
  const lightPosition = lightViewPosition( light );
108
104
 
105
+ const halfWidth = cameraViewMatrix.mul( vec4( this.halfWidth, 0 ) ).xyz;
106
+ const halfHeight = cameraViewMatrix.mul( vec4( this.halfHeight, 0 ) ).xyz;
107
+
109
108
  return {
110
109
  lightColor: colorNode,
111
110
  lightPosition,
112
- halfWidth: this.halfWidth,
113
- halfHeight: this.halfHeight,
111
+ halfWidth,
112
+ halfHeight,
114
113
  ltc_1,
115
114
  ltc_2
116
115
  };
@@ -1,7 +1,6 @@
1
1
  import Node from '../core/Node.js';
2
2
  import NodeMaterial from '../../materials/nodes/NodeMaterial.js';
3
3
  import ChainMap from '../../renderers/common/ChainMap.js';
4
- import { getDataFromObject } from '../core/NodeUtils.js';
5
4
  import { NodeUpdateType } from '../core/constants.js';
6
5
  import { property, vec4 } from '../tsl/TSLBase.js';
7
6
  import { positionWorld } from '../accessors/Position.js';
@@ -73,28 +72,21 @@ const _disposeShadowMaterial = ( light ) => {
73
72
  * @param {Renderer} renderer - The renderer.
74
73
  * @param {LightShadow} shadow - The light shadow object containing shadow properties.
75
74
  * @param {number} shadowType - The type of shadow map (e.g., BasicShadowMap).
76
- * @param {boolean} useVelocity - Whether to use velocity data for rendering.
77
75
  * @return {shadowRenderObjectFunction} A function that renders shadow objects.
78
76
  */
79
- const _getShadowRenderObjectFunction = ( renderer, shadow, shadowType, useVelocity ) => {
77
+ const _getShadowRenderObjectFunction = ( renderer, shadow, shadowType ) => {
80
78
 
81
79
  _shadowRenderObjectKeys[ 0 ] = renderer;
82
80
  _shadowRenderObjectKeys[ 1 ] = shadow;
83
81
 
84
82
  let renderObjectFunction = _shadowRenderObjectLibrary.get( _shadowRenderObjectKeys );
85
83
 
86
- if ( renderObjectFunction === undefined || ( renderObjectFunction.shadowType !== shadowType || renderObjectFunction.useVelocity !== useVelocity ) ) {
84
+ if ( renderObjectFunction === undefined || renderObjectFunction.shadowType !== shadowType ) {
87
85
 
88
86
  renderObjectFunction = ( object, scene, _camera, geometry, material, group, lightsNode, clippingContext, passId ) => {
89
87
 
90
88
  if ( object.castShadow === true || ( object.receiveShadow && shadowType === VSMShadowMap ) ) {
91
89
 
92
- if ( useVelocity ) {
93
-
94
- getDataFromObject( object ).useVelocity = true;
95
-
96
- }
97
-
98
90
  object.onBeforeShadow( renderer, object, _camera, shadow.camera, geometry, scene.overrideMaterial, group );
99
91
 
100
92
  renderer.renderObject( object, scene, _camera, geometry, material, group, lightsNode, clippingContext, passId );
@@ -106,7 +98,6 @@ const _getShadowRenderObjectFunction = ( renderer, shadow, shadowType, useVeloci
106
98
  };
107
99
 
108
100
  renderObjectFunction.shadowType = shadowType;
109
- renderObjectFunction.useVelocity = useVelocity;
110
101
 
111
102
  _shadowRenderObjectLibrary.set( _shadowRenderObjectKeys, renderObjectFunction );
112
103
 
@@ -171,6 +162,12 @@ class ShadowBaseNode extends Node {
171
162
 
172
163
  }
173
164
 
165
+ isCacheable( /*builder*/ ) {
166
+
167
+ return false;
168
+
169
+ }
170
+
174
171
  /**
175
172
  * Retrieves or creates a shadow material for the shadow casting light source.
176
173
  *
@@ -203,12 +200,7 @@ class ShadowBaseNode extends Node {
203
200
  */
204
201
  getShadowRenderObjectFunction( renderer, shadow = this.light.shadow ) {
205
202
 
206
- const shadowType = renderer.shadowMap.type;
207
-
208
- const currentMRT = renderer.getMRT();
209
- const useVelocity = currentMRT ? currentMRT.has( 'velocity' ) : false;
210
-
211
- return _getShadowRenderObjectFunction( renderer, shadow, shadowType, useVelocity );
203
+ return _getShadowRenderObjectFunction( renderer, shadow, renderer.shadowMap.type );
212
204
 
213
205
  }
214
206