@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,5 @@
1
- import { Break, Continue, Fn, If, Loop, abs, bool, cross, distance, div, dot, float, getScreenPosition, getViewPosition, int, logarithmicDepthToViewZ, luminance, max, min, mix, mul, nodeObject, normalize, orthographicDepthToViewZ, passTexture, perspectiveDepthToViewZ, reference, reflect, sub, texture, trunc, uniform, uv, vec2, vec3, vec4, viewZToPerspectiveDepth, context } from 'three/tsl';
2
- import { HalfFloatType, LinearFilter, LinearMipmapLinearFilter, Matrix4, NodeMaterial, NodeUpdateType, QuadMesh, RenderTarget, RendererUtils, TempNode, Vector2, Vector3 } from 'three/webgpu';
1
+ import { Break, Continue, Fn, If, Loop, abs, bool, cross, distance, div, dot, float, getScreenPosition, getViewPosition, int, luminance, max, min, mix, mul, nodeObject, normalize, orthographicDepthToViewZ, passTexture, perspectiveDepthToViewZ, reference, reflect, sub, texture, textureSize, trunc, uniform, uv, vec2, vec3, vec4, context, isBackgroundDepth, projectionDepth } from 'three/tsl';
2
+ import { HalfFloatType, LinearFilter, LinearMipmapLinearFilter, Matrix4, NodeMaterial, NodeUpdateType, QuadMesh, RenderTarget, RendererUtils, Node, Vector2, Vector3 } from 'three/webgpu';
3
3
  import { bindAnalyticNoise } from '../utils/RNoise.js';
4
4
  import { ENV_RAY_LENGTH, getSpecularDominantFactor, ggxReflectionSample } from '../utils/SpecularHelpers.js';
5
5
  import { boxBlur } from './boxBlur.js';
@@ -16,6 +16,8 @@ const MAX_STEPS = 64;
16
16
  * @typedef {Object} SSRNodeOptions
17
17
  * @property {boolean} [stochastic=false] - When `false`, traces a single mirror reflection and softens roughness with a blur pass (first-generation SSR). When `true`, varies the reflection direction per pixel with stochastic GGX rays (second-generation SSR); higher quality on rough/glossy surfaces but noisier, so it expects a temporal/spatial denoiser downstream.
18
18
  * @property {Node<float>} [metalnessNode=null] - Per-pixel metalness. Drives GGX reflection sampling and, with `reflectNonMetals=false`, the non-metal early-out.
19
+ * @property {Node<vec3>} [specularNode=null] - Stochastic mode only: material normal-incidence reflectance (F0), typically an MRT `specularColorBlended` attachment (it already includes IOR, specular intensity and metalness; raw `material.specularColor` reflects too brightly). Defaults to the metalness/base-color approximation.
20
+ * @property {Node<float>} [specularF90Node=null] - Stochastic mode only: material grazing reflectance, typically an MRT `specularF90` attachment. Defaults to one.
19
21
  * @property {Node<float>} [roughnessNode=null] - Per-pixel roughness. Drives GGX sampling and the blur mip selection.
20
22
  * @property {boolean} [reflectNonMetals=false] - Only used when `stochastic=false`. When `false`, non-metallic surfaces are discarded for a noticeable performance gain; set `true` to also reflect dielectrics (e.g. marble, polished wood, plastic).
21
23
  * @property {Texture} [environmentNode=null] - Equirectangular HDR environment map with CPU-side `image.data` (e.g. from RGBELoader). Not compatible with PMREM / `scene.environment` cubemaps.
@@ -30,10 +32,10 @@ const MAX_STEPS = 64;
30
32
  *
31
33
  * Reference: {@link https://lettier.github.io/3d-game-shaders-for-beginners/screen-space-reflection.html}
32
34
  *
33
- * @augments TempNode
35
+ * @augments Node
34
36
  * @three_import import { ssr } from 'three/addons/tsl/display/SSRNode.js';
35
37
  */
36
- class SSRNode extends TempNode {
38
+ class SSRNode extends Node {
37
39
 
38
40
  static get type() {
39
41
 
@@ -56,6 +58,8 @@ class SSRNode extends TempNode {
56
58
  const {
57
59
  stochastic = false,
58
60
  metalnessNode = null,
61
+ specularNode = null,
62
+ specularF90Node = null,
59
63
  roughnessNode = null,
60
64
  reflectNonMetals = false,
61
65
  environmentNode = null,
@@ -120,6 +124,26 @@ class SSRNode extends TempNode {
120
124
  */
121
125
  this.metalnessNode = metalnessNode;
122
126
 
127
+ /**
128
+ * Stochastic mode only: per-pixel normal-incidence reflectance (F0), typically an MRT
129
+ * `specularColorBlended` attachment, which already includes IOR, specular intensity and
130
+ * metalness (raw `material.specularColor` reflects too brightly). When `null`, F0 is
131
+ * derived from metalness and the diffuse color.
132
+ *
133
+ * @type {?Node<vec3>}
134
+ * @default null
135
+ */
136
+ this.specularNode = specularNode;
137
+
138
+ /**
139
+ * Stochastic mode only: per-pixel grazing reflectance (F90), typically an MRT
140
+ * `specularF90` attachment. When `null`, the shader uses `1`.
141
+ *
142
+ * @type {?Node<float>}
143
+ * @default null
144
+ */
145
+ this.specularF90Node = specularF90Node;
146
+
123
147
  /**
124
148
  * Per-pixel roughness, used to drive the GGX reflection sampling and the blur mip
125
149
  * selection. When `null`, the shader treats surfaces as fully smooth.
@@ -230,13 +254,13 @@ class SSRNode extends TempNode {
230
254
 
231
255
  /**
232
256
  * Mirror bias for the stochastic GGX sampling. Concentrates the reflected rays toward
233
- * the lobe's narrow (near-mirror) core, trading a small amount of bias for less noise.
257
+ * the lobe's narrow (near-mirror) core, trading sampling bias for less noise.
234
258
  * `0` samples the full VNDF lobe; values toward `1` tighten the cone. Range `[0,1]`.
235
259
  *
236
260
  * @type {UniformNode<float>}
237
- * @default 0.5
261
+ * @default 0
238
262
  */
239
- this.mirrorBias = uniform( 0.5 );
263
+ this.mirrorBias = uniform( 0 );
240
264
 
241
265
  /**
242
266
  * The quality of the blur. Must be an integer in the range `[1,3]`.
@@ -812,7 +836,7 @@ class SSRNode extends TempNode {
812
836
 
813
837
  return cross( point.sub( linePointA ), point.sub( linePointB ) ).length().div( linePointB.sub( linePointA ).length() );
814
838
 
815
- } );
839
+ }, { point: 'vec3', linePointA: 'vec3', linePointB: 'vec3', return: 'float' } );
816
840
 
817
841
  const pointPlaneDistance = Fn( ( [ point, planePoint, planeNormal ] ) => {
818
842
 
@@ -825,7 +849,7 @@ class SSRNode extends TempNode {
825
849
  const distance = mul( planeNormal.x, point.x ).add( mul( planeNormal.y, point.y ) ).add( mul( planeNormal.z, point.z ) ).add( d );
826
850
  return distance;
827
851
 
828
- } );
852
+ }, { point: 'vec3', planePoint: 'vec3', planeNormal: 'vec3', return: 'float' } );
829
853
 
830
854
  const getViewZ = Fn( ( [ depth ] ) => {
831
855
 
@@ -845,21 +869,7 @@ class SSRNode extends TempNode {
845
869
 
846
870
  } );
847
871
 
848
- const sampleDepth = ( uv ) => {
849
-
850
- const depth = this.depthNode.sample( uv ).r;
851
-
852
- if ( builder.renderer.logarithmicDepthBuffer === true ) {
853
-
854
- const viewZ = logarithmicDepthToViewZ( depth, this._cameraNear, this._cameraFar );
855
-
856
- return viewZToPerspectiveDepth( viewZ, this._cameraNear, this._cameraFar );
857
-
858
- }
859
-
860
- return depth;
861
-
862
- };
872
+ const sampleDepth = ( uv ) => projectionDepth( this.depthNode.sample( uv ).r, this._cameraNear, this._cameraFar );
863
873
 
864
874
  const sampleMarchNoise = this.stochastic === true ? bindAnalyticNoise( this._resolution, 47 ) : null;
865
875
 
@@ -878,24 +888,20 @@ class SSRNode extends TempNode {
878
888
 
879
889
  return t.smoothstep( 0, 1 ).pow( 0.125 );
880
890
 
881
- } ).setLayout( {
882
- name: 'computeScreenBorderFactor',
883
- type: 'float',
884
- inputs: [
885
- { name: 'uvCoord', type: 'vec2' },
886
- { name: 'borderWidth', type: 'float' }
887
- ]
888
- } );
891
+ }, { uvCoord: 'vec2', borderWidth: 'float', return: 'float' } );
889
892
 
890
893
  const ssr = Fn( () => {
891
894
 
892
895
  const noise = this.stochastic === true ? sampleMarchNoise( uvNode, this._noiseIndex ) : null;
893
- const uvPos = uvNode.toVar();
896
+ // reconstruct at the depth texel center
897
+
898
+ const depthSize = vec2( textureSize( this.depthNode ) ).toConst();
899
+ const uvPos = uvNode.mul( depthSize ).floor().add( 0.5 ).div( depthSize ).toVar();
894
900
 
895
901
  const depth = sampleDepth( uvPos ).toVar();
896
902
 
897
903
  // Skip background pixels (cleared far-plane depth); the target is cleared each frame.
898
- depth.greaterThanEqual( 1.0 ).discard();
904
+ isBackgroundDepth( depth ).discard();
899
905
 
900
906
  const viewPosition = getViewPosition( uvPos, depth, this._cameraProjectionMatrixInverse ).toVar();
901
907
  const worldPosition = this._cameraWorldMatrix.mul( vec4( viewPosition, 1.0 ) ).xyz.toVar();
@@ -922,7 +928,6 @@ class SSRNode extends TempNode {
922
928
  const V = viewIncidentDir.negate().normalize().toVar();
923
929
 
924
930
  let viewReflectDir, finalSampleWeight, specDominantFactor;
925
- const albedo = vec3( 1 ).toVar();
926
931
  let sampleEnvReflection = null;
927
932
 
928
933
  if ( this.stochastic === false ) {
@@ -934,17 +939,17 @@ class SSRNode extends TempNode {
934
939
  } else {
935
940
 
936
941
  const Xi = noise.toVar();
937
- // Mirror-bias: pull `Xi.y` toward the cap top to tighten the GGX lobe and cut mid-roughness
938
- // noise. Unbiased — bounded VNDF keeps brdf·cos/pdf ~constant (EA, "Stochastic SSR").
942
+ // mirror bias trades the unbiased GGX lobe for lower variance
939
943
  Xi.y.assign( mix( Xi.y, 0.0, this.mirrorBias.mul( Xi.w.sqrt() ) ) );
940
944
 
941
- albedo.assign( ( this.diffuseNode !== null ? this.diffuseNode.sample( uvPos ).rgb : vec3( 1 ) ) );
942
- const ggxSample = ggxReflectionSample( viewNormal, V, roughness, metalness, albedo, Xi ).toVar();
945
+ // The base color only feeds the metalness F0 fallback.
946
+ const albedo = ( this.specularNode === null && this.diffuseNode !== null ? this.diffuseNode.sample( uvPos ).rgb : vec3( 1 ) ).toVar();
947
+ const ggxSample = ggxReflectionSample( viewNormal, V, roughness, metalness, albedo, Xi, this.specularNode, this.specularF90Node ?? 1 ).toVar();
943
948
 
944
949
  // Sometimes the GGX sample is facing away from the surface, so we need to re-sample.
945
950
  If( ggxSample.get( 'reflectDir' ).dot( viewNormal ).lessThan( 0 ), () => {
946
951
 
947
- ggxSample.assign( ggxReflectionSample( viewNormal, V, roughness, metalness, albedo, Xi.add( Xi.mul( 7 ) ).fract() ) );
952
+ ggxSample.assign( ggxReflectionSample( viewNormal, V, roughness, metalness, albedo, Xi.add( Xi.mul( 7 ) ).fract(), this.specularNode, this.specularF90Node ?? 1 ) );
948
953
 
949
954
  } );
950
955
 
@@ -969,6 +974,7 @@ class SSRNode extends TempNode {
969
974
  V,
970
975
  alpha: ggxSample.get( 'alpha' ),
971
976
  f0: ggxSample.get( 'f0' ),
977
+ f90: ggxSample.get( 'f90' ),
972
978
  Xi2
973
979
  } ) );
974
980
 
@@ -980,7 +986,8 @@ class SSRNode extends TempNode {
980
986
  N: viewNormal,
981
987
  V,
982
988
  alpha: ggxSample.get( 'alpha' ),
983
- f0: ggxSample.get( 'f0' )
989
+ f0: ggxSample.get( 'f0' ),
990
+ f90: ggxSample.get( 'f90' )
984
991
  } ) );
985
992
 
986
993
  }
@@ -1030,7 +1037,7 @@ class SSRNode extends TempNode {
1030
1037
 
1031
1038
  };
1032
1039
 
1033
- const maxReflectRayLen = this.maxDistance.div( dot( viewIncidentDir.negate(), viewNormal ) ).toVar();
1040
+ const maxReflectRayLen = this.maxDistance.div( dot( viewIncidentDir.negate(), viewNormal ).max( 1e-4 ) ).toVar();
1034
1041
 
1035
1042
  const d1viewPosition = viewPosition.add( viewReflectDir.mul( maxReflectRayLen ) ).toVar();
1036
1043
 
@@ -1050,6 +1057,24 @@ class SSRNode extends TempNode {
1050
1057
  const d0 = uvPos.mul( this._resolution ).xy.toVar();
1051
1058
  const d1 = getScreenPosition( d1viewPosition, this._cameraProjectionMatrix ).mul( this._resolution ).toVar();
1052
1059
 
1060
+ // clip the ray to the screen so all steps land on visible texels
1061
+
1062
+ const extent = d1.sub( d0 ).toVar();
1063
+ const exitT = vec2(
1064
+ extent.x.greaterThanEqual( 0 ).select( this._resolution.x.sub( d0.x ), d0.x ),
1065
+ extent.y.greaterThanEqual( 0 ).select( this._resolution.y.sub( d0.y ), d0.y )
1066
+ ).div( extent.abs().max( 1e-6 ) );
1067
+ const clipT = min( exitT.x, exitT.y ).min( 1 ).toConst();
1068
+
1069
+ If( clipT.lessThan( 1 ), () => {
1070
+
1071
+ d1.assign( d0.add( extent.mul( clipT ) ) );
1072
+ d1viewPosition.assign( this.camera.isPerspectiveCamera
1073
+ ? mix( viewPosition.div( viewPosition.z ), d1viewPosition.div( d1viewPosition.z ), clipT ).div( mix( viewPosition.z.reciprocal(), d1viewPosition.z.reciprocal(), clipT ) )
1074
+ : mix( viewPosition, d1viewPosition, clipT ) );
1075
+
1076
+ } );
1077
+
1053
1078
  const xLen = d1.x.sub( d0.x ).toVar();
1054
1079
  const yLen = d1.y.sub( d0.y ).toVar();
1055
1080
 
@@ -1083,6 +1108,12 @@ class SSRNode extends TempNode {
1083
1108
  ? ( sVal ) => float( 1 ).div( recipVPZ.add( sVal.mul( recipD1VPZ.sub( recipVPZ ) ) ) )
1084
1109
  : ( sVal ) => viewPosition.z.add( sVal.mul( d1viewPosition.z.sub( viewPosition.z ) ) );
1085
1110
 
1111
+ // view-space point on the reflected ray at s
1112
+
1113
+ const rayPointAt = this.camera.isPerspectiveCamera
1114
+ ? ( sVal ) => mix( viewPosition.div( viewPosition.z ), d1viewPosition.div( d1viewPosition.z ), sVal ).mul( reflectRayZAt( sVal ) )
1115
+ : ( sVal ) => mix( viewPosition, d1viewPosition, sVal );
1116
+
1086
1117
  // Screen-space position along the ray for a given s ∈ [0,1].
1087
1118
  const screenPosAt = ( sVal ) => d0.add( stepVec.mul( sVal.mul( totalStep ) ) );
1088
1119
 
@@ -1104,6 +1135,9 @@ class SSRNode extends TempNode {
1104
1135
  // Carry the coarse hit's UV/depth to skip a redundant fetch when refinement is off.
1105
1136
  const hitUvS = vec2( 0 ).toVar();
1106
1137
  const hitD = float( 0 ).toVar();
1138
+ const previousS = float( 0 ).toVar();
1139
+ const previousInFront = bool( true ).toVar();
1140
+ const canRefine = bool( false ).toVar();
1107
1141
 
1108
1142
  // March from d0 toward d1, looking for an intersection with the depth buffer.
1109
1143
  Loop( { start: int( 1 ), end: totalStep }, ( { i } ) => {
@@ -1111,6 +1145,12 @@ class SSRNode extends TempNode {
1111
1145
  // Exponentially-distributed ray parameter, shared by the sample position and ray depth.
1112
1146
  const s = sampleFraction( float( i ) ).toVar();
1113
1147
 
1148
+ If( s.greaterThan( 1 ), () => {
1149
+
1150
+ Break();
1151
+
1152
+ } );
1153
+
1114
1154
  const xy = screenPosAt( s ).toVar();
1115
1155
 
1116
1156
  If( xy.x.lessThan( 0 ).or( xy.x.greaterThan( this._resolution.x ) ).or( xy.y.lessThan( 0 ) ).or( xy.y.greaterThan( this._resolution.y ) ), () => {
@@ -1125,7 +1165,13 @@ class SSRNode extends TempNode {
1125
1165
 
1126
1166
  const viewReflectRayZ = reflectRayZAt( s ).toVar();
1127
1167
 
1128
- If( viewReflectRayZ.lessThanEqual( vZ ), () => {
1168
+ // Advance the previous sample before any Continue() so rejected samples still bound the next bracket.
1169
+ const lastS = previousS.toVar();
1170
+ const lastInFront = previousInFront.toVar();
1171
+ previousS.assign( s );
1172
+ previousInFront.assign( viewReflectRayZ.greaterThan( vZ ) );
1173
+
1174
+ If( isBackgroundDepth( d ).not().and( viewReflectRayZ.lessThanEqual( vZ ) ), () => {
1129
1175
 
1130
1176
  // Depth crossing: ray went behind the depth buffer. Gate by thickness before stopping
1131
1177
  // so an occluder gap doesn't end the march prematurely.
@@ -1135,7 +1181,10 @@ class SSRNode extends TempNode {
1135
1181
  const uvNeighbor = uvS.add( uvPixelStepX ).toVar();
1136
1182
  const vPNeighbor = getViewPosition( uvNeighbor, d, this._cameraProjectionMatrixInverse ).toVar();
1137
1183
  const minThickness = vPNeighbor.x.sub( vP.x ).mul( 3 ).toVar();
1138
- const tk = max( minThickness, this.thickness ).toVar();
1184
+ // Only refinement may use a wider coarse tolerance.
1185
+
1186
+ const stepLength = distance( rayPointAt( lastS ), rayPointAt( s ) );
1187
+ const tk = ( this.binaryRefine ? max( max( minThickness, this.thickness ), stepLength ) : max( minThickness, this.thickness ) ).toVar();
1139
1188
 
1140
1189
  If( away.lessThanEqual( tk ), () => {
1141
1190
 
@@ -1143,13 +1192,13 @@ class SSRNode extends TempNode {
1143
1192
 
1144
1193
  // the reflected ray is pointing towards the same side as the fragment's normal (current ray position),
1145
1194
  // which means it wouldn't reflect off the surface. The loop continues to the next step for the next ray sample.
1146
- if ( this.stochastic === false ) {
1195
+ If( dot( viewReflectDir, vN ).greaterThanEqual( 0 ), () => {
1147
1196
 
1148
- If( dot( viewReflectDir, vN ).greaterThanEqual( 0 ), () => {
1197
+ Continue();
1149
1198
 
1150
- Continue();
1199
+ } );
1151
1200
 
1152
- } );
1201
+ if ( this.stochastic === false ) {
1153
1202
 
1154
1203
  // this distance represents the depth of the intersection point between the reflected ray and the scene.
1155
1204
  const distance = pointPlaneDistance( vP, viewPosition, viewNormal ).toVar();
@@ -1170,7 +1219,10 @@ class SSRNode extends TempNode {
1170
1219
 
1171
1220
  if ( this.binaryRefine ) {
1172
1221
 
1173
- hitSLo.assign( sampleFraction( float( i ).sub( 1 ) ) );
1222
+ // refine only front-to-back crossings
1223
+
1224
+ canRefine.assign( lastInFront );
1225
+ hitSLo.assign( lastS );
1174
1226
  hitSHi.assign( s );
1175
1227
 
1176
1228
  }
@@ -1190,26 +1242,33 @@ class SSRNode extends TempNode {
1190
1242
  // nested (a loop-inside-a-loop tripped shader-compiler bugs on some drivers).
1191
1243
  if ( this.binaryRefine ) {
1192
1244
 
1193
- Loop( { start: int( 0 ), end: int( 8 ), type: 'int', condition: '<' }, () => {
1245
+ If( canRefine, () => {
1194
1246
 
1195
- const sMid = hitSLo.add( hitSHi ).mul( 0.5 ).toVar();
1196
- const sceneZMid = getViewZ( sampleDepth( screenPosAt( sMid ).mul( invResolution ) ) );
1247
+ Loop( { start: int( 0 ), end: int( 8 ), type: 'int', condition: '<' }, () => {
1197
1248
 
1198
- If( reflectRayZAt( sMid ).lessThanEqual( sceneZMid ), () => {
1249
+ const sMid = hitSLo.add( hitSHi ).mul( 0.5 ).toVar();
1250
+ const uvMid = screenPosAt( sMid ).mul( invResolution ).toConst();
1251
+ const sceneZMid = getViewZ( sampleDepth( uvMid ) );
1252
+ const frontFacing = dot( viewReflectDir, this.normalNode.sample( uvMid ).rgb.normalize() ).lessThan( 0 );
1199
1253
 
1200
- hitSHi.assign( sMid );
1254
+ If( reflectRayZAt( sMid ).lessThanEqual( sceneZMid ).and( frontFacing ), () => {
1201
1255
 
1202
- } ).Else( () => {
1256
+ hitSHi.assign( sMid );
1203
1257
 
1204
- hitSLo.assign( sMid );
1258
+ } ).Else( () => {
1259
+
1260
+ hitSLo.assign( sMid );
1261
+
1262
+ } );
1205
1263
 
1206
1264
  } );
1207
1265
 
1208
- } );
1266
+ // re-fetch UV/depth at the refined `s`
1209
1267
 
1210
- // Refinement moved the crossing, so re-fetch UV/depth at the refined `s`.
1211
- hitUvS.assign( screenPosAt( hitSHi ).mul( invResolution ) );
1212
- hitD.assign( sampleDepth( hitUvS ) );
1268
+ hitUvS.assign( screenPosAt( hitSHi ).mul( invResolution ) );
1269
+ hitD.assign( sampleDepth( hitUvS ) );
1270
+
1271
+ } );
1213
1272
 
1214
1273
  }
1215
1274
 
@@ -1220,7 +1279,20 @@ class SSRNode extends TempNode {
1220
1279
  // In blur mode the ratio² falloff re-grows past maxDistance, so over-range hits fall back
1221
1280
  // to env. The scatter path bounds reach via ray length, so every hit shades.
1222
1281
  const distancePointPlane = this.stochastic === false ? pointPlaneDistance( vP, viewPosition, viewNormal ).toVar() : float( 0 );
1223
- const withinRange = distancePointPlane.lessThanEqual( this.maxDistance );
1282
+ const withinRange = distancePointPlane.lessThanEqual( this.maxDistance ).toVar();
1283
+
1284
+ if ( this.binaryRefine ) {
1285
+
1286
+ // bisection can land on a depth discontinuity, so validate the refined hit
1287
+
1288
+ const neighbor = getViewPosition( uvS.add( uvPixelStepX ), hitD, this._cameraProjectionMatrixInverse );
1289
+ const tk = max( neighbor.x.sub( vP.x ).mul( 3 ), this.thickness );
1290
+ withinRange.assign( withinRange.and( isBackgroundDepth( hitD ).not() )
1291
+ .and( pointToLineDistance( vP, viewPosition, d1viewPosition ).lessThanEqual( tk ) ) );
1292
+
1293
+ withinRange.assign( withinRange.and( dot( viewReflectDir, this.normalNode.sample( uvS ).rgb.normalize() ).lessThan( 0 ) ) );
1294
+
1295
+ }
1224
1296
 
1225
1297
  If( withinRange, () => {
1226
1298
 
@@ -1350,9 +1422,9 @@ export default SSRNode;
1350
1422
  * @param {SSRNodeOptions} [options] - Optional inputs for material and environment data.
1351
1423
  * @returns {SSRNode}
1352
1424
  */
1353
- export const ssr = ( colorNode, depthNode, normalNode, options = {} ) => nodeObject( new SSRNode(
1425
+ export const ssr = ( colorNode, depthNode, normalNode, options = {} ) => new SSRNode(
1354
1426
  nodeObject( colorNode ),
1355
1427
  nodeObject( depthNode ),
1356
1428
  nodeObject( normalNode ),
1357
1429
  options
1358
- ) );
1430
+ );
@@ -1,5 +1,5 @@
1
- import { RedFormat, RenderTarget, Vector2, RendererUtils, QuadMesh, TempNode, NodeMaterial, NodeUpdateType, UnsignedByteType } from 'three/webgpu';
2
- import { reference, viewZToPerspectiveDepth, logarithmicDepthToViewZ, getScreenPosition, getViewPosition, float, Break, Loop, int, max, abs, If, interleavedGradientNoise, screenCoordinate, Fn, passTexture, uv, uniform, perspectiveDepthToViewZ, orthographicDepthToViewZ, vec2, lightPosition, lightTargetPosition, fract, rand, mix, context } from 'three/tsl';
1
+ import { RedFormat, RenderTarget, Vector2, RendererUtils, QuadMesh, Node, NodeMaterial, NodeUpdateType, UnsignedByteType } from 'three/webgpu';
2
+ import { reference, getScreenPosition, getViewPosition, float, Break, Loop, int, max, abs, If, interleavedGradientNoise, screenCoordinate, Fn, passTexture, uv, uniform, perspectiveDepthToViewZ, orthographicDepthToViewZ, vec2, lightPosition, lightTargetPosition, fract, rand, mix, context, isBackgroundDepth, projectionDepth } from 'three/tsl';
3
3
 
4
4
  const _quadMesh = /*@__PURE__*/ new QuadMesh();
5
5
  const _size = /*@__PURE__*/ new Vector2();
@@ -40,10 +40,10 @@ let _rendererState;
40
40
  * - {@link https://panoskarabelas.com/posts/screen_space_shadows/}.
41
41
  * - {@link https://www.bendstudio.com/blog/inside-bend-screen-space-shadows/}.
42
42
  *
43
- * @augments TempNode
43
+ * @augments Node
44
44
  * @three_import import { sss } from 'three/addons/tsl/display/SSSNode.js';
45
45
  */
46
- class SSSNode extends TempNode {
46
+ class SSSNode extends Node {
47
47
 
48
48
  static get type() {
49
49
 
@@ -357,26 +357,12 @@ class SSSNode extends TempNode {
357
357
 
358
358
  } );
359
359
 
360
- const sampleDepth = ( uv ) => {
361
-
362
- const depth = this.depthNode.sample( uv ).r;
363
-
364
- if ( builder.renderer.logarithmicDepthBuffer === true ) {
365
-
366
- const viewZ = logarithmicDepthToViewZ( depth, this._cameraNear, this._cameraFar );
367
-
368
- return viewZToPerspectiveDepth( viewZ, this._cameraNear, this._cameraFar );
369
-
370
- }
371
-
372
- return depth;
373
-
374
- };
360
+ const sampleDepth = ( uv ) => projectionDepth( this.depthNode.sample( uv ).r, this._cameraNear, this._cameraFar );
375
361
 
376
362
  const sss = Fn( () => {
377
363
 
378
364
  const depth = sampleDepth( uvNode ).toVar();
379
- depth.greaterThanEqual( 1.0 ).discard();
365
+ isBackgroundDepth( depth ).discard();
380
366
 
381
367
  // compute ray position and direction (in view-space)
382
368
 
@@ -1,4 +1,4 @@
1
- import { HalfFloatType, RenderTarget, Vector2, NodeMaterial, RendererUtils, QuadMesh, TempNode, NodeUpdateType } from 'three/webgpu';
1
+ import { HalfFloatType, RenderTarget, Vector2, NodeMaterial, RendererUtils, QuadMesh, Node, NodeUpdateType } from 'three/webgpu';
2
2
  import { Fn, float, vec3, vec4, ivec2, int, uv, floor, abs, max, min, exp2, nodeObject, passTexture, textureSize, textureLoad, convertToTexture, context } from 'three/tsl';
3
3
 
4
4
  const _quadMesh = /*@__PURE__*/ new QuadMesh();
@@ -11,10 +11,10 @@ let _rendererState;
11
11
  *
12
12
  * Reference: {@link https://gpuopen.com/fidelityfx-superresolution/}.
13
13
  *
14
- * @augments TempNode
14
+ * @augments Node
15
15
  * @three_import import { sharpen } from 'three/addons/tsl/display/SharpenNode.js';
16
16
  */
17
- class SharpenNode extends TempNode {
17
+ class SharpenNode extends Node {
18
18
 
19
19
  static get type() {
20
20
 
@@ -1,4 +1,4 @@
1
- import { Vector2, TempNode, NodeUpdateType } from 'three/webgpu';
1
+ import { Vector2, Node, NodeUpdateType } from 'three/webgpu';
2
2
  import { Fn, uv, uniform, convertToTexture, vec2, vec3, vec4, mat3, luminance, add } from 'three/tsl';
3
3
 
4
4
  /**
@@ -6,10 +6,10 @@ import { Fn, uv, uniform, convertToTexture, vec2, vec3, vec4, mat3, luminance, a
6
6
  * A sobel filter should be applied after tone mapping and output color
7
7
  * space conversion.
8
8
  *
9
- * @augments TempNode
9
+ * @augments Node
10
10
  * @three_import import { sobel } from 'three/addons/tsl/display/SobelOperatorNode.js';
11
11
  */
12
- class SobelOperatorNode extends TempNode {
12
+ class SobelOperatorNode extends Node {
13
13
 
14
14
  static get type() {
15
15
 
@@ -1,4 +1,4 @@
1
- import { HalfFloatType, Vector2, RenderTarget, RendererUtils, QuadMesh, NodeMaterial, TempNode, NodeUpdateType, Matrix4, DepthTexture, FloatType } from 'three/webgpu';
1
+ import { HalfFloatType, Vector2, RenderTarget, RendererUtils, QuadMesh, NodeMaterial, Node, NodeUpdateType, Matrix4, DepthTexture } from 'three/webgpu';
2
2
  import { exp, float, Fn, max, texture, uniform, uv, vec2, vec4, luminance, convertToTexture, passTexture, velocity, ivec2, mix, property, outputStruct, context, OnBeforeRenderPipeline, OnAfterRenderPipeline } from 'three/tsl';
3
3
  import { clipAABB, computeHaltonOffsets, flickerReduction, sampleCurrentDepth, samplePreviousDepth } from '../utils/TAAUtils.js';
4
4
 
@@ -27,10 +27,10 @@ let _rendererState;
27
27
  *
28
28
  * Note: MSAA must be disabled when TAAU is in use.
29
29
  *
30
- * @augments TempNode
30
+ * @augments Node
31
31
  * @three_import import { taau } from 'three/addons/tsl/display/TAAUNode.js';
32
32
  */
33
- class TAAUNode extends TempNode {
33
+ class TAAUNode extends Node {
34
34
 
35
35
  static get type() {
36
36
 
@@ -280,14 +280,6 @@ class TAAUNode extends TempNode {
280
280
  */
281
281
  this._previousDepthNode = texture( this._previousDepthRenderTarget.depthTexture );
282
282
 
283
- /**
284
- * Sync the post processing stack with the TAAU node.
285
- *
286
- * @private
287
- * @type {boolean}
288
- */
289
- this._needsPostProcessingSync = false;
290
-
291
283
  }
292
284
 
293
285
  /**
@@ -393,13 +385,7 @@ class TAAUNode extends TempNode {
393
385
  this._cameraWorldMatrixInverse.value.copy( this.camera.matrixWorldInverse );
394
386
  this._cameraProjectionMatrixInverse.value.copy( this.camera.projectionMatrixInverse );
395
387
 
396
- // extract input dimensions from the beauty buffer and output
397
- // dimensions from the renderer's drawing buffer
398
-
399
- const beautyRenderTarget = ( this.beautyNode.isRTTNode ) ? this.beautyNode.renderTarget : this.beautyNode.passNode.renderTarget;
400
-
401
- const inputWidth = beautyRenderTarget.texture.width;
402
- const inputHeight = beautyRenderTarget.texture.height;
388
+ // the output dimensions are derived from the renderer's drawing buffer
403
389
 
404
390
  const drawingBufferSize = renderer.getDrawingBufferSize( _size );
405
391
  const outputWidth = drawingBufferSize.width;
@@ -421,11 +407,6 @@ class TAAUNode extends TempNode {
421
407
 
422
408
  if ( needsRestart === true ) {
423
409
 
424
- // make sure render targets are initialized after the resize which triggers a dispose()
425
-
426
- renderer.initRenderTarget( this._historyRenderTarget );
427
- renderer.initRenderTarget( this._resolveRenderTarget );
428
-
429
410
  // Seed the history with a bilinear upscale of the current beauty
430
411
  // buffer. Without this the first frames after a resize fade in
431
412
  // from black because the history target was cleared. The seed
@@ -440,16 +421,6 @@ class TAAUNode extends TempNode {
440
421
 
441
422
  }
442
423
 
443
- // must run after needsRestart so it does not affect the seed reset
444
-
445
- if ( this._needsPostProcessingSync === true ) {
446
-
447
- this.setViewOffset( inputWidth, inputHeight );
448
-
449
- this._needsPostProcessingSync = false;
450
-
451
- }
452
-
453
424
  // resolve
454
425
 
455
426
  renderer.setRenderTarget( this._resolveRenderTarget );
@@ -478,13 +449,11 @@ class TAAUNode extends TempNode {
478
449
  if ( this._previousDepthRenderTarget.width !== srcW || this._previousDepthRenderTarget.height !== srcH ) {
479
450
 
480
451
  this._previousDepthRenderTarget.setSize( srcW, srcH );
481
- renderer.initRenderTarget( this._previousDepthRenderTarget );
482
452
 
483
453
  }
484
454
 
485
455
  const dstDepth = this._previousDepthRenderTarget.depthTexture;
486
456
  renderer.copyTextureToTexture( currentDepth, dstDepth );
487
- this._previousDepthNode.value = dstDepth;
488
457
 
489
458
  }
490
459
 
@@ -502,12 +471,14 @@ class TAAUNode extends TempNode {
502
471
  */
503
472
  setup( builder ) {
504
473
 
474
+ this.depthNode.build( builder );
475
+ this.velocityNode.build( builder );
476
+ this.beautyNode.build( builder );
477
+
505
478
  if ( builder.renderPipeline && ! builder.context.renderPipelineState.viewOffsetOwner ) {
506
479
 
507
480
  builder.context.renderPipelineState.viewOffsetOwner = this;
508
481
 
509
- this._needsPostProcessingSync = true;
510
-
511
482
  OnBeforeRenderPipeline( () => {
512
483
 
513
484
  const beautyRenderTarget = ( this.beautyNode.isRTTNode ) ? this.beautyNode.renderTarget : this.beautyNode.passNode.renderTarget;
@@ -527,11 +498,8 @@ class TAAUNode extends TempNode {
527
498
 
528
499
  }
529
500
 
530
- if ( builder.renderer.reversedDepthBuffer === true ) {
531
-
532
- this._previousDepthRenderTarget.depthTexture.type = FloatType;
533
-
534
- }
501
+ this._previousDepthRenderTarget.depthTexture.format = this.depthNode.value.format;
502
+ this._previousDepthRenderTarget.depthTexture.type = this.depthNode.value.type;
535
503
 
536
504
  const historyNode = texture( this._historyRenderTarget.textures[ 0 ] );
537
505
  const lockNode = texture( this._historyRenderTarget.textures[ 1 ] );