@plastic-software/three 0.179.0 → 0.181.1

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 (430) hide show
  1. package/build/three.cjs +1108 -591
  2. package/build/three.core.js +616 -345
  3. package/build/three.core.min.js +1 -1
  4. package/build/three.module.js +488 -250
  5. package/build/three.module.min.js +1 -1
  6. package/build/three.tsl.js +37 -6
  7. package/build/three.tsl.min.js +1 -1
  8. package/build/three.webgpu.js +6576 -2152
  9. package/build/three.webgpu.min.js +1 -1
  10. package/build/three.webgpu.nodes.js +6575 -2151
  11. package/build/three.webgpu.nodes.min.js +1 -1
  12. package/examples/fonts/MPLUSRounded1c/MPLUSRounded1c-Regular.typeface.json.zip +0 -0
  13. package/examples/fonts/MPLUSRounded1c/OFL.txt +91 -0
  14. package/examples/jsm/Addons.js +1 -1
  15. package/examples/jsm/animation/CCDIKSolver.js +1 -1
  16. package/examples/jsm/controls/ArcballControls.js +8 -8
  17. package/examples/jsm/controls/DragControls.js +7 -57
  18. package/examples/jsm/controls/FirstPersonControls.js +3 -3
  19. package/examples/jsm/controls/FlyControls.js +1 -1
  20. package/examples/jsm/controls/OrbitControls.js +2 -2
  21. package/examples/jsm/controls/PointerLockControls.js +2 -10
  22. package/examples/jsm/controls/TrackballControls.js +1 -1
  23. package/examples/jsm/controls/TransformControls.js +1 -1
  24. package/examples/jsm/effects/AsciiEffect.js +8 -8
  25. package/examples/jsm/exporters/DRACOExporter.js +2 -2
  26. package/examples/jsm/exporters/EXRExporter.js +1 -1
  27. package/examples/jsm/exporters/GLTFExporter.js +33 -25
  28. package/examples/jsm/exporters/KTX2Exporter.js +4 -2
  29. package/examples/jsm/exporters/PLYExporter.js +1 -1
  30. package/examples/jsm/exporters/USDZExporter.js +9 -2
  31. package/examples/jsm/geometries/DecalGeometry.js +2 -2
  32. package/examples/jsm/geometries/ParametricGeometry.js +1 -1
  33. package/examples/jsm/geometries/TeapotGeometry.js +2 -2
  34. package/examples/jsm/geometries/TextGeometry.js +3 -2
  35. package/examples/jsm/gpgpu/BitonicSort.js +715 -0
  36. package/examples/jsm/helpers/ViewHelper.js +43 -5
  37. package/examples/jsm/inspector/Inspector.js +427 -0
  38. package/examples/jsm/inspector/RendererInspector.js +415 -0
  39. package/examples/jsm/inspector/tabs/Console.js +204 -0
  40. package/examples/jsm/inspector/tabs/Parameters.js +332 -0
  41. package/examples/jsm/inspector/tabs/Performance.js +268 -0
  42. package/examples/jsm/inspector/tabs/Viewer.js +166 -0
  43. package/examples/jsm/inspector/ui/Graph.js +95 -0
  44. package/examples/jsm/inspector/ui/Item.js +170 -0
  45. package/examples/jsm/inspector/ui/List.js +75 -0
  46. package/examples/jsm/inspector/ui/Profiler.js +170 -0
  47. package/examples/jsm/inspector/ui/Style.js +654 -0
  48. package/examples/jsm/inspector/ui/Tab.js +46 -0
  49. package/examples/jsm/inspector/ui/Values.js +423 -0
  50. package/examples/jsm/inspector/ui/utils.js +56 -0
  51. package/examples/jsm/interactive/HTMLMesh.js +6 -10
  52. package/examples/jsm/interactive/InteractiveGroup.js +1 -1
  53. package/examples/jsm/interactive/SelectionBox.js +30 -0
  54. package/examples/jsm/libs/ktx-parse.module.js +1 -1
  55. package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -1
  56. package/examples/jsm/lines/Line2.js +3 -3
  57. package/examples/jsm/lines/LineGeometry.js +1 -1
  58. package/examples/jsm/lines/LineSegments2.js +2 -2
  59. package/examples/jsm/lines/Wireframe.js +2 -2
  60. package/examples/jsm/lines/WireframeGeometry2.js +1 -1
  61. package/examples/jsm/lines/webgpu/LineSegments2.js +1 -1
  62. package/examples/jsm/lines/webgpu/Wireframe.js +1 -1
  63. package/examples/jsm/loaders/3MFLoader.js +1 -1
  64. package/examples/jsm/loaders/ColladaLoader.js +3 -3
  65. package/examples/jsm/loaders/DDSLoader.js +1 -1
  66. package/examples/jsm/loaders/DRACOLoader.js +73 -22
  67. package/examples/jsm/loaders/EXRLoader.js +5 -5
  68. package/examples/jsm/loaders/FBXLoader.js +2 -2
  69. package/examples/jsm/loaders/FontLoader.js +23 -5
  70. package/examples/jsm/loaders/GLTFLoader.js +14 -8
  71. package/examples/jsm/loaders/HDRCubeTextureLoader.js +5 -5
  72. package/examples/jsm/loaders/HDRLoader.js +486 -0
  73. package/examples/jsm/loaders/KTX2Loader.js +136 -49
  74. package/examples/jsm/loaders/KTXLoader.js +2 -2
  75. package/examples/jsm/loaders/LDrawLoader.js +1 -1
  76. package/examples/jsm/loaders/LUT3dlLoader.js +2 -2
  77. package/examples/jsm/loaders/LUTCubeLoader.js +1 -1
  78. package/examples/jsm/loaders/LWOLoader.js +2 -2
  79. package/examples/jsm/loaders/MaterialXLoader.js +22 -5
  80. package/examples/jsm/loaders/OBJLoader.js +1 -1
  81. package/examples/jsm/loaders/PDBLoader.js +1 -1
  82. package/examples/jsm/loaders/RGBELoader.js +7 -473
  83. package/examples/jsm/loaders/SVGLoader.js +2 -2
  84. package/examples/jsm/loaders/TTFLoader.js +4 -4
  85. package/examples/jsm/loaders/UltraHDRLoader.js +2 -2
  86. package/examples/jsm/loaders/lwo/IFFParser.js +1 -1
  87. package/examples/jsm/materials/WoodNodeMaterial.js +533 -0
  88. package/examples/jsm/math/ColorSpaces.js +19 -1
  89. package/examples/jsm/math/ConvexHull.js +3 -3
  90. package/examples/jsm/math/ImprovedNoise.js +1 -1
  91. package/examples/jsm/math/Lut.js +2 -2
  92. package/examples/jsm/math/SimplexNoise.js +1 -1
  93. package/examples/jsm/misc/MD2CharacterComplex.js +1 -1
  94. package/examples/jsm/misc/ProgressiveLightMap.js +9 -3
  95. package/examples/jsm/misc/ProgressiveLightMapGPU.js +7 -1
  96. package/examples/jsm/misc/TubePainter.js +383 -40
  97. package/examples/jsm/misc/Volume.js +1 -1
  98. package/examples/jsm/modifiers/SimplifyModifier.js +1 -1
  99. package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
  100. package/examples/jsm/objects/Sky.js +1 -1
  101. package/examples/jsm/objects/SkyMesh.js +1 -1
  102. package/examples/jsm/objects/Water.js +3 -3
  103. package/examples/jsm/objects/WaterMesh.js +6 -6
  104. package/examples/jsm/postprocessing/GlitchPass.js +2 -2
  105. package/examples/jsm/postprocessing/OutlinePass.js +1 -1
  106. package/examples/jsm/postprocessing/SSRPass.js +37 -8
  107. package/examples/jsm/postprocessing/UnrealBloomPass.js +8 -6
  108. package/examples/jsm/renderers/CSS2DRenderer.js +16 -5
  109. package/examples/jsm/renderers/CSS3DRenderer.js +7 -6
  110. package/examples/jsm/renderers/SVGRenderer.js +1 -1
  111. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +1 -1
  112. package/examples/jsm/shaders/AfterimageShader.js +1 -1
  113. package/examples/jsm/shaders/BleachBypassShader.js +1 -1
  114. package/examples/jsm/shaders/BokehShader.js +1 -1
  115. package/examples/jsm/shaders/BokehShader2.js +1 -1
  116. package/examples/jsm/shaders/DotScreenShader.js +1 -1
  117. package/examples/jsm/shaders/FocusShader.js +1 -1
  118. package/examples/jsm/shaders/GTAOShader.js +2 -2
  119. package/examples/jsm/shaders/GodRaysShader.js +1 -1
  120. package/examples/jsm/shaders/KaleidoShader.js +1 -1
  121. package/examples/jsm/shaders/PoissonDenoiseShader.js +2 -2
  122. package/examples/jsm/shaders/SSRShader.js +1 -1
  123. package/examples/jsm/shaders/SepiaShader.js +1 -1
  124. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +1 -1
  125. package/examples/jsm/shaders/TriangleBlurShader.js +1 -1
  126. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +1 -1
  127. package/examples/jsm/shaders/VignetteShader.js +1 -1
  128. package/examples/jsm/transpiler/GLSLDecoder.js +22 -19
  129. package/examples/jsm/transpiler/TSLEncoder.js +9 -10
  130. package/examples/jsm/transpiler/WGSLEncoder.js +24 -0
  131. package/examples/jsm/tsl/display/AfterImageNode.js +26 -24
  132. package/examples/jsm/tsl/display/AnamorphicNode.js +28 -4
  133. package/examples/jsm/tsl/display/BloomNode.js +7 -3
  134. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +2 -1
  135. package/examples/jsm/tsl/display/DenoiseNode.js +2 -0
  136. package/examples/jsm/tsl/display/DepthOfFieldNode.js +446 -90
  137. package/examples/jsm/tsl/display/GTAONode.js +53 -5
  138. package/examples/jsm/tsl/display/GaussianBlurNode.js +49 -35
  139. package/examples/jsm/tsl/display/OutlineNode.js +13 -2
  140. package/examples/jsm/tsl/display/SSGINode.js +654 -0
  141. package/examples/jsm/tsl/display/SSRNode.js +182 -65
  142. package/examples/jsm/tsl/display/SSSNode.js +488 -0
  143. package/examples/jsm/tsl/display/TRAANode.js +124 -7
  144. package/examples/jsm/tsl/display/boxBlur.js +65 -0
  145. package/examples/jsm/tsl/display/hashBlur.js +16 -18
  146. package/examples/jsm/tsl/lighting/TiledLightsNode.js +21 -1
  147. package/examples/jsm/utils/BufferGeometryUtils.js +1 -1
  148. package/examples/jsm/utils/ShadowMapViewerGPU.js +12 -5
  149. package/examples/jsm/webxr/OculusHandModel.js +1 -1
  150. package/examples/jsm/webxr/XRControllerModelFactory.js +1 -1
  151. package/examples/jsm/webxr/XRHandModelFactory.js +2 -6
  152. package/package.json +5 -10
  153. package/src/Three.Core.js +4 -2
  154. package/src/Three.TSL.js +36 -5
  155. package/src/Three.WebGPU.Nodes.js +2 -0
  156. package/src/Three.WebGPU.js +2 -0
  157. package/src/animation/AnimationClip.js +20 -4
  158. package/src/animation/AnimationMixer.js +3 -3
  159. package/src/animation/AnimationObjectGroup.js +2 -1
  160. package/src/animation/KeyframeTrack.js +7 -6
  161. package/src/animation/PropertyBinding.js +12 -11
  162. package/src/audio/Audio.js +10 -9
  163. package/src/audio/PositionalAudio.js +1 -1
  164. package/src/cameras/OrthographicCamera.js +1 -1
  165. package/src/cameras/PerspectiveCamera.js +1 -1
  166. package/src/cameras/StereoCamera.js +2 -2
  167. package/src/constants.js +11 -3
  168. package/src/core/BufferGeometry.js +10 -10
  169. package/src/core/EventDispatcher.js +1 -1
  170. package/src/core/InterleavedBuffer.js +1 -1
  171. package/src/core/InterleavedBufferAttribute.js +3 -2
  172. package/src/core/Object3D.js +3 -2
  173. package/src/core/Raycaster.js +2 -1
  174. package/src/core/RenderTarget.js +10 -1
  175. package/src/extras/Controls.js +5 -4
  176. package/src/extras/DataUtils.js +2 -1
  177. package/src/extras/Earcut.js +6 -0
  178. package/src/extras/ImageUtils.js +2 -2
  179. package/src/extras/PMREMGenerator.js +268 -55
  180. package/src/extras/TextureUtils.js +2 -1
  181. package/src/extras/core/Curve.js +2 -1
  182. package/src/extras/core/Interpolations.js +7 -1
  183. package/src/extras/core/ShapePath.js +4 -4
  184. package/src/extras/lib/earcut.js +8 -8
  185. package/src/geometries/BoxGeometry.js +1 -0
  186. package/src/geometries/CapsuleGeometry.js +1 -0
  187. package/src/geometries/CircleGeometry.js +1 -0
  188. package/src/geometries/ConeGeometry.js +1 -0
  189. package/src/geometries/CylinderGeometry.js +1 -0
  190. package/src/geometries/DodecahedronGeometry.js +1 -0
  191. package/src/geometries/ExtrudeGeometry.js +8 -6
  192. package/src/geometries/IcosahedronGeometry.js +1 -0
  193. package/src/geometries/LatheGeometry.js +1 -0
  194. package/src/geometries/OctahedronGeometry.js +1 -0
  195. package/src/geometries/PlaneGeometry.js +1 -0
  196. package/src/geometries/RingGeometry.js +1 -0
  197. package/src/geometries/ShapeGeometry.js +1 -0
  198. package/src/geometries/SphereGeometry.js +1 -0
  199. package/src/geometries/TetrahedronGeometry.js +1 -0
  200. package/src/geometries/TorusGeometry.js +1 -0
  201. package/src/geometries/TorusKnotGeometry.js +1 -0
  202. package/src/geometries/TubeGeometry.js +1 -0
  203. package/src/helpers/CameraHelper.js +1 -1
  204. package/src/lights/webgpu/ProjectorLight.js +1 -1
  205. package/src/loaders/AnimationLoader.js +2 -1
  206. package/src/loaders/AudioLoader.js +2 -1
  207. package/src/loaders/BufferGeometryLoader.js +2 -2
  208. package/src/loaders/Cache.js +2 -2
  209. package/src/loaders/DataTextureLoader.js +1 -1
  210. package/src/loaders/FileLoader.js +3 -2
  211. package/src/loaders/ImageBitmapLoader.js +5 -4
  212. package/src/loaders/ImageLoader.js +1 -1
  213. package/src/loaders/Loader.js +3 -3
  214. package/src/loaders/LoadingManager.js +25 -3
  215. package/src/loaders/MaterialLoader.js +3 -2
  216. package/src/loaders/ObjectLoader.js +13 -13
  217. package/src/loaders/TextureLoader.js +1 -1
  218. package/src/loaders/nodes/NodeLoader.js +3 -2
  219. package/src/materials/Material.js +16 -3
  220. package/src/materials/MeshBasicMaterial.js +1 -0
  221. package/src/materials/MeshDepthMaterial.js +1 -0
  222. package/src/materials/MeshDistanceMaterial.js +1 -1
  223. package/src/materials/MeshLambertMaterial.js +2 -1
  224. package/src/materials/MeshMatcapMaterial.js +22 -0
  225. package/src/materials/MeshNormalMaterial.js +1 -0
  226. package/src/materials/MeshPhongMaterial.js +2 -1
  227. package/src/materials/MeshPhysicalMaterial.js +2 -1
  228. package/src/materials/MeshStandardMaterial.js +8 -7
  229. package/src/materials/MeshToonMaterial.js +1 -0
  230. package/src/materials/PointsMaterial.js +1 -1
  231. package/src/materials/ShaderMaterial.js +2 -2
  232. package/src/materials/nodes/Line2NodeMaterial.js +2 -2
  233. package/src/materials/nodes/MeshSSSNodeMaterial.js +1 -1
  234. package/src/materials/nodes/NodeMaterial.js +62 -22
  235. package/src/materials/nodes/PointsNodeMaterial.js +81 -28
  236. package/src/materials/nodes/SpriteNodeMaterial.js +3 -15
  237. package/src/materials/nodes/manager/NodeMaterialObserver.js +3 -2
  238. package/src/math/Color.js +6 -5
  239. package/src/math/ColorManagement.js +9 -3
  240. package/src/math/Cylindrical.js +1 -1
  241. package/src/math/Euler.js +2 -1
  242. package/src/math/MathUtils.js +13 -11
  243. package/src/math/Matrix2.js +1 -1
  244. package/src/math/Matrix3.js +2 -2
  245. package/src/math/Matrix4.js +7 -7
  246. package/src/math/Plane.js +1 -1
  247. package/src/math/Quaternion.js +68 -66
  248. package/src/math/Spherical.js +1 -1
  249. package/src/nodes/Nodes.js +4 -1
  250. package/src/nodes/TSL.js +4 -1
  251. package/src/nodes/accessors/BufferNode.js +1 -1
  252. package/src/nodes/accessors/Camera.js +133 -7
  253. package/src/nodes/accessors/ClippingNode.js +6 -5
  254. package/src/nodes/accessors/CubeTextureNode.js +5 -4
  255. package/src/nodes/accessors/InstanceNode.js +25 -5
  256. package/src/nodes/accessors/Lights.js +10 -0
  257. package/src/nodes/accessors/Normal.js +5 -4
  258. package/src/nodes/accessors/Object3DNode.js +1 -1
  259. package/src/nodes/accessors/Position.js +18 -2
  260. package/src/nodes/accessors/ReferenceBaseNode.js +1 -1
  261. package/src/nodes/accessors/ReferenceNode.js +3 -2
  262. package/src/nodes/accessors/SceneNode.js +2 -1
  263. package/src/nodes/accessors/StorageBufferNode.js +2 -1
  264. package/src/nodes/accessors/StorageTextureNode.js +22 -0
  265. package/src/nodes/accessors/Texture3DNode.js +14 -1
  266. package/src/nodes/accessors/TextureNode.js +130 -44
  267. package/src/nodes/code/FunctionCallNode.js +24 -4
  268. package/src/nodes/code/FunctionNode.js +23 -0
  269. package/src/nodes/core/ArrayNode.js +1 -0
  270. package/src/nodes/core/AssignNode.js +4 -3
  271. package/src/nodes/core/AttributeNode.js +2 -1
  272. package/src/nodes/core/ContextNode.js +29 -10
  273. package/src/nodes/core/IndexNode.js +2 -2
  274. package/src/nodes/core/InputNode.js +2 -1
  275. package/src/nodes/core/InspectorNode.js +128 -0
  276. package/src/nodes/core/{CacheNode.js → IsolateNode.js} +40 -7
  277. package/src/nodes/core/Node.js +152 -31
  278. package/src/nodes/core/NodeBuilder.js +183 -35
  279. package/src/nodes/core/NodeFrame.js +21 -21
  280. package/src/nodes/core/NodeFunction.js +2 -1
  281. package/src/nodes/core/NodeParser.js +2 -1
  282. package/src/nodes/core/NodeUniform.js +1 -1
  283. package/src/nodes/core/NodeUtils.js +17 -91
  284. package/src/nodes/core/ParameterNode.js +31 -0
  285. package/src/nodes/core/PropertyNode.js +7 -0
  286. package/src/nodes/core/StackNode.js +43 -16
  287. package/src/nodes/core/StructNode.js +5 -5
  288. package/src/nodes/core/StructTypeNode.js +1 -0
  289. package/src/nodes/core/SubBuildNode.js +2 -2
  290. package/src/nodes/core/UniformNode.js +18 -10
  291. package/src/nodes/core/VarNode.js +70 -33
  292. package/src/nodes/core/VaryingNode.js +3 -2
  293. package/src/nodes/display/BlendModes.js +5 -4
  294. package/src/nodes/display/BumpMapNode.js +1 -1
  295. package/src/nodes/display/ColorAdjustment.js +1 -1
  296. package/src/nodes/display/FrontFacingNode.js +4 -8
  297. package/src/nodes/display/NormalMapNode.js +2 -1
  298. package/src/nodes/display/PassNode.js +52 -11
  299. package/src/nodes/display/RenderOutputNode.js +28 -2
  300. package/src/nodes/display/ScreenNode.js +44 -14
  301. package/src/nodes/display/ToneMappingNode.js +31 -4
  302. package/src/nodes/display/ToonOutlinePassNode.js +8 -0
  303. package/src/nodes/display/ViewportDepthTextureNode.js +16 -4
  304. package/src/nodes/display/ViewportSharedTextureNode.js +12 -0
  305. package/src/nodes/display/ViewportTextureNode.js +42 -12
  306. package/src/nodes/fog/Fog.js +3 -2
  307. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +52 -0
  308. package/src/nodes/functions/BSDF/DFGApprox.js +60 -19
  309. package/src/nodes/functions/BasicLightingModel.js +2 -1
  310. package/src/nodes/functions/PhysicalLightingModel.js +3 -2
  311. package/src/nodes/functions/VolumetricLightingModel.js +5 -5
  312. package/src/nodes/geometry/RangeNode.js +40 -4
  313. package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -1
  314. package/src/nodes/gpgpu/ComputeNode.js +17 -5
  315. package/src/nodes/gpgpu/SubgroupFunctionNode.js +455 -0
  316. package/src/nodes/gpgpu/WorkgroupInfoNode.js +2 -1
  317. package/src/nodes/lighting/EnvironmentNode.js +6 -6
  318. package/src/nodes/lighting/LightsNode.js +3 -4
  319. package/src/nodes/lighting/PointShadowNode.js +6 -0
  320. package/src/nodes/lighting/ShadowFilterNode.js +2 -0
  321. package/src/nodes/lighting/ShadowNode.js +75 -8
  322. package/src/nodes/math/BitcastNode.js +156 -0
  323. package/src/nodes/math/ConditionalNode.js +24 -7
  324. package/src/nodes/math/MathNode.js +25 -19
  325. package/src/nodes/math/OperatorNode.js +7 -5
  326. package/src/nodes/pmrem/PMREMUtils.js +117 -2
  327. package/src/nodes/shapes/Shapes.js +1 -1
  328. package/src/nodes/tsl/TSLBase.js +5 -2
  329. package/src/nodes/tsl/TSLCore.js +460 -159
  330. package/src/nodes/utils/DebugNode.js +2 -1
  331. package/src/nodes/utils/EventNode.js +36 -0
  332. package/src/nodes/utils/FunctionOverloadingNode.js +37 -19
  333. package/src/nodes/utils/JoinNode.js +6 -3
  334. package/src/nodes/utils/LoopNode.js +20 -24
  335. package/src/nodes/utils/MemberNode.js +59 -7
  336. package/src/nodes/utils/PostProcessingUtils.js +28 -1
  337. package/src/nodes/utils/RTTNode.js +13 -3
  338. package/src/nodes/utils/ReflectorNode.js +58 -7
  339. package/src/nodes/utils/SampleNode.js +12 -2
  340. package/src/nodes/utils/SplitNode.js +11 -0
  341. package/src/nodes/utils/Timer.js +0 -47
  342. package/src/objects/BatchedMesh.js +2 -2
  343. package/src/objects/LOD.js +1 -1
  344. package/src/objects/Line.js +2 -1
  345. package/src/objects/LineSegments.js +2 -1
  346. package/src/objects/Skeleton.js +3 -2
  347. package/src/objects/SkinnedMesh.js +3 -1
  348. package/src/objects/Sprite.js +4 -3
  349. package/src/renderers/WebGLRenderer.js +48 -41
  350. package/src/renderers/common/Animation.js +13 -1
  351. package/src/renderers/common/Attributes.js +1 -1
  352. package/src/renderers/common/Backend.js +108 -27
  353. package/src/renderers/common/Background.js +2 -1
  354. package/src/renderers/common/Bindings.js +58 -2
  355. package/src/renderers/common/CanvasTarget.js +341 -0
  356. package/src/renderers/common/ChainMap.js +1 -1
  357. package/src/renderers/common/DataMap.js +1 -1
  358. package/src/renderers/common/Geometries.js +26 -0
  359. package/src/renderers/common/Info.js +4 -2
  360. package/src/renderers/common/InspectorBase.js +146 -0
  361. package/src/renderers/common/Pipelines.js +1 -1
  362. package/src/renderers/common/PostProcessing.js +6 -25
  363. package/src/renderers/common/QuadMesh.js +7 -1
  364. package/src/renderers/common/RenderContext.js +2 -2
  365. package/src/renderers/common/RenderList.js +7 -3
  366. package/src/renderers/common/RenderObject.js +16 -2
  367. package/src/renderers/common/RenderObjects.js +1 -1
  368. package/src/renderers/common/Renderer.js +473 -245
  369. package/src/renderers/common/RendererUtils.js +9 -0
  370. package/src/renderers/common/SampledTexture.js +9 -1
  371. package/src/renderers/common/Sampler.js +50 -12
  372. package/src/renderers/common/StorageTexture.js +9 -1
  373. package/src/renderers/common/Textures.js +121 -45
  374. package/src/renderers/common/TimestampQueryPool.js +65 -3
  375. package/src/renderers/common/UniformsGroup.js +2 -1
  376. package/src/renderers/common/XRManager.js +42 -22
  377. package/src/renderers/common/extras/PMREMGenerator.js +160 -65
  378. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  379. package/src/renderers/common/nodes/NodeLibrary.js +9 -7
  380. package/src/renderers/common/nodes/NodeSampler.js +13 -1
  381. package/src/renderers/common/nodes/Nodes.js +38 -16
  382. package/src/renderers/shaders/DFGLUTData.js +64 -0
  383. package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -12
  384. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +1 -1
  385. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +1 -1
  386. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +52 -18
  387. package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +1 -1
  388. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
  389. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +1 -1
  390. package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +1 -1
  391. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +7 -15
  392. package/src/renderers/shaders/ShaderLib/depth.glsl.js +1 -1
  393. package/src/renderers/shaders/UniformsLib.js +1 -0
  394. package/src/renderers/shaders/UniformsUtils.js +25 -4
  395. package/src/renderers/webgl/WebGLCapabilities.js +2 -1
  396. package/src/renderers/webgl/WebGLExtensions.js +2 -25
  397. package/src/renderers/webgl/WebGLInfo.js +3 -1
  398. package/src/renderers/webgl/WebGLProgram.js +15 -14
  399. package/src/renderers/webgl/WebGLPrograms.js +2 -1
  400. package/src/renderers/webgl/WebGLShadowMap.js +3 -2
  401. package/src/renderers/webgl/WebGLState.js +15 -14
  402. package/src/renderers/webgl/WebGLTextures.js +19 -14
  403. package/src/renderers/webgl/WebGLUniformsGroups.js +5 -3
  404. package/src/renderers/webgl/WebGLUtils.js +3 -2
  405. package/src/renderers/webgl-fallback/WebGLBackend.js +199 -167
  406. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +181 -25
  407. package/src/renderers/webgl-fallback/utils/WebGLConstants.js +2 -3
  408. package/src/renderers/webgl-fallback/utils/WebGLState.js +7 -6
  409. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +169 -19
  410. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +51 -22
  411. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +3 -2
  412. package/src/renderers/webgpu/WebGPUBackend.js +153 -123
  413. package/src/renderers/webgpu/WebGPURenderer.Nodes.js +2 -1
  414. package/src/renderers/webgpu/WebGPURenderer.js +3 -2
  415. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +142 -50
  416. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +2 -1
  417. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +5 -3
  418. package/src/renderers/webgpu/utils/WebGPUConstants.js +7 -2
  419. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +53 -34
  420. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +6 -8
  421. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +260 -99
  422. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +32 -9
  423. package/src/renderers/webgpu/utils/WebGPUUtils.js +22 -2
  424. package/src/renderers/webxr/WebXRManager.js +42 -26
  425. package/src/textures/ExternalTexture.js +15 -4
  426. package/src/textures/Source.js +3 -2
  427. package/src/textures/Texture.js +3 -2
  428. package/src/textures/VideoTexture.js +2 -3
  429. package/src/utils.js +67 -3
  430. package/examples/jsm/loaders/RGBMLoader.js +0 -1148
@@ -1,5 +1,6 @@
1
- import { NearestFilter, RenderTarget, Vector2, RendererUtils, QuadMesh, TempNode, NodeMaterial, NodeUpdateType } from 'three/webgpu';
2
- import { reference, viewZToPerspectiveDepth, logarithmicDepthToViewZ, getScreenPosition, getViewPosition, sqrt, mul, div, cross, float, Continue, Break, Loop, int, max, abs, sub, If, dot, reflect, normalize, screenCoordinate, nodeObject, Fn, passTexture, uv, uniform, perspectiveDepthToViewZ, orthographicDepthToViewZ, vec2, vec3, vec4 } from 'three/tsl';
1
+ import { HalfFloatType, RenderTarget, Vector2, RendererUtils, QuadMesh, TempNode, NodeMaterial, NodeUpdateType, LinearFilter, LinearMipmapLinearFilter } from 'three/webgpu';
2
+ import { texture, reference, viewZToPerspectiveDepth, logarithmicDepthToViewZ, getScreenPosition, getViewPosition, sqrt, mul, div, cross, float, Continue, Break, Loop, int, max, abs, sub, If, dot, reflect, normalize, screenCoordinate, nodeObject, Fn, passTexture, uv, uniform, perspectiveDepthToViewZ, orthographicDepthToViewZ, vec2, vec3, vec4 } from 'three/tsl';
3
+ import { boxBlur } from './boxBlur.js';
3
4
 
4
5
  const _quadMesh = /*@__PURE__*/ new QuadMesh();
5
6
  const _size = /*@__PURE__*/ new Vector2();
@@ -28,9 +29,10 @@ class SSRNode extends TempNode {
28
29
  * @param {Node<float>} depthNode - A node that represents the beauty pass's depth.
29
30
  * @param {Node<vec3>} normalNode - A node that represents the beauty pass's normals.
30
31
  * @param {Node<float>} metalnessNode - A node that represents the beauty pass's metalness.
31
- * @param {Camera} camera - The camera the scene is rendered with.
32
+ * @param {?Node<float>} [roughnessNode=null] - A node that represents the beauty pass's roughness.
33
+ * @param {?Camera} [camera=null] - The camera the scene is rendered with.
32
34
  */
33
- constructor( colorNode, depthNode, normalNode, metalnessNode, camera ) {
35
+ constructor( colorNode, depthNode, normalNode, metalnessNode, roughnessNode = null, camera = null ) {
34
36
 
35
37
  super( 'vec4' );
36
38
 
@@ -63,22 +65,26 @@ class SSRNode extends TempNode {
63
65
  this.metalnessNode = metalnessNode;
64
66
 
65
67
  /**
66
- * The camera the scene is rendered with.
68
+ * Whether the SSR reflections should be blurred or not. Blurring is a costly
69
+ * operation so turn it off if you encounter performance issues on certain
70
+ * devices.
67
71
  *
68
- * @type {Camera}
72
+ * @private
73
+ * @type {Node<float>}
74
+ * @default false
69
75
  */
70
- this.camera = camera;
76
+ this.roughnessNode = roughnessNode;
71
77
 
72
78
  /**
73
- * The resolution scale. By default SSR reflections
74
- * are computed in half resolutions. Setting the value
75
- * to `1` improves quality but also results in more
76
- * computational overhead.
79
+ * The resolution scale. Valid values are in the range
80
+ * `[0,1]`. `1` means best quality but also results in
81
+ * more computational overhead. Setting to `0.5` means
82
+ * the effect is computed in half-resolution.
77
83
  *
78
84
  * @type {number}
79
- * @default 0.5
85
+ * @default 1
80
86
  */
81
- this.resolutionScale = 0.5;
87
+ this.resolutionScale = 1;
82
88
 
83
89
  /**
84
90
  * The `updateBeforeType` is set to `NodeUpdateType.FRAME` since the node renders
@@ -90,17 +96,8 @@ class SSRNode extends TempNode {
90
96
  this.updateBeforeType = NodeUpdateType.FRAME;
91
97
 
92
98
  /**
93
- * The render target the SSR is rendered into.
94
- *
95
- * @private
96
- * @type {RenderTarget}
97
- */
98
- this._ssrRenderTarget = new RenderTarget( 1, 1, { depthBuffer: false, minFilter: NearestFilter, magFilter: NearestFilter } );
99
- this._ssrRenderTarget.texture.name = 'SSRNode.SSR';
100
-
101
- /**
102
- * Controls how far a fragment can reflect.
103
- *
99
+ * Controls how far a fragment can reflect. Increasing this value result in more
100
+ * computational overhead but also increases the reflection distance.
104
101
  *
105
102
  * @type {UniformNode<float>}
106
103
  */
@@ -114,12 +111,63 @@ class SSRNode extends TempNode {
114
111
  this.thickness = uniform( 0.1 );
115
112
 
116
113
  /**
117
- * Controls the transparency of the reflected colors.
114
+ * Controls how the SSR reflections are blended with the beauty pass.
118
115
  *
119
116
  * @type {UniformNode<float>}
120
117
  */
121
118
  this.opacity = uniform( 1 );
122
119
 
120
+ /**
121
+ * This parameter controls how detailed the raymarching process works.
122
+ * The value ranges is `[0,1]` where `1` means best quality (the maximum number
123
+ * of raymarching iterations/samples) and `0` means no samples at all.
124
+ *
125
+ * A quality of `0.5` is usually sufficient for most use cases. Try to keep
126
+ * this parameter as low as possible. Larger values result in noticeable more
127
+ * overhead.
128
+ *
129
+ * @type {UniformNode<float>}
130
+ */
131
+ this.quality = uniform( 0.5 );
132
+
133
+ /**
134
+ * The quality of the blur. Must be an integer in the range `[1,3]`.
135
+ *
136
+ * @type {UniformNode<int>}
137
+ */
138
+ this.blurQuality = uniform( 2 );
139
+
140
+ //
141
+
142
+ if ( camera === null ) {
143
+
144
+ if ( this.colorNode.passNode && this.colorNode.passNode.isPassNode === true ) {
145
+
146
+ camera = this.colorNode.passNode.camera;
147
+
148
+ } else {
149
+
150
+ throw new Error( 'THREE.TSL: No camera found. ssr() requires a camera.' );
151
+
152
+ }
153
+
154
+ }
155
+
156
+ /**
157
+ * The camera the scene is rendered with.
158
+ *
159
+ * @type {Camera}
160
+ */
161
+ this.camera = camera;
162
+
163
+ /**
164
+ * The spread of the blur. Automatically set when generating mips.
165
+ *
166
+ * @private
167
+ * @type {UniformNode<int>}
168
+ */
169
+ this._blurSpread = uniform( 1 );
170
+
123
171
  /**
124
172
  * Represents the projection matrix of the scene's camera.
125
173
  *
@@ -158,7 +206,7 @@ class SSRNode extends TempNode {
158
206
  * @private
159
207
  * @type {UniformNode<bool>}
160
208
  */
161
- this._isPerspectiveCamera = uniform( camera.isPerspectiveCamera ? 1 : 0 );
209
+ this._isPerspectiveCamera = uniform( camera.isPerspectiveCamera );
162
210
 
163
211
  /**
164
212
  * The resolution of the pass.
@@ -169,13 +217,23 @@ class SSRNode extends TempNode {
169
217
  this._resolution = uniform( new Vector2() );
170
218
 
171
219
  /**
172
- * This value is derived from the resolution and restricts
173
- * the maximum raymarching steps in the fragment shader.
220
+ * The render target the SSR is rendered into.
174
221
  *
175
222
  * @private
176
- * @type {UniformNode<float>}
223
+ * @type {RenderTarget}
224
+ */
225
+ this._ssrRenderTarget = new RenderTarget( 1, 1, { depthBuffer: false, type: HalfFloatType } );
226
+ this._ssrRenderTarget.texture.name = 'SSRNode.SSR';
227
+
228
+ /**
229
+ * The render target for the blurred SSR reflections.
230
+ *
231
+ * @private
232
+ * @type {RenderTarget}
177
233
  */
178
- this._maxStep = uniform( 0 );
234
+ this._blurRenderTarget = new RenderTarget( 1, 1, { depthBuffer: false, type: HalfFloatType, minFilter: LinearMipmapLinearFilter, magFilter: LinearFilter } );
235
+ this._blurRenderTarget.texture.name = 'SSRNode.Blur';
236
+ this._blurRenderTarget.texture.mipmaps.push( {}, {}, {}, {}, {} );
179
237
 
180
238
  /**
181
239
  * The material that is used to render the effect.
@@ -183,8 +241,26 @@ class SSRNode extends TempNode {
183
241
  * @private
184
242
  * @type {NodeMaterial}
185
243
  */
186
- this._material = new NodeMaterial();
187
- this._material.name = 'SSRNode.SSR';
244
+ this._ssrMaterial = new NodeMaterial();
245
+ this._ssrMaterial.name = 'SSRNode.SSR';
246
+
247
+ /**
248
+ * The blur material.
249
+ *
250
+ * @private
251
+ * @type {NodeMaterial}
252
+ */
253
+ this._blurMaterial = new NodeMaterial();
254
+ this._blurMaterial.name = 'SSRNode.Blur';
255
+
256
+ /**
257
+ * The copy material.
258
+ *
259
+ * @private
260
+ * @type {NodeMaterial}
261
+ */
262
+ this._copyMaterial = new NodeMaterial();
263
+ this._copyMaterial.name = 'SSRNode.Copy';
188
264
 
189
265
  /**
190
266
  * The result of the effect is represented as a separate texture node.
@@ -194,6 +270,25 @@ class SSRNode extends TempNode {
194
270
  */
195
271
  this._textureNode = passTexture( this, this._ssrRenderTarget.texture );
196
272
 
273
+ let blurredTextureNode = null;
274
+
275
+ if ( this.roughnessNode !== null ) {
276
+
277
+ const mips = this._blurRenderTarget.texture.mipmaps.length - 1;
278
+ const lod = float( this.roughnessNode ).mul( mips ).clamp( 0, mips );
279
+
280
+ blurredTextureNode = passTexture( this, this._blurRenderTarget.texture ).level( lod );
281
+
282
+ }
283
+
284
+ /**
285
+ * Holds the blurred SSR reflections.
286
+ *
287
+ * @private
288
+ * @type {?PassTextureNode}
289
+ */
290
+ this._blurredTextureNode = blurredTextureNode;
291
+
197
292
  }
198
293
 
199
294
  /**
@@ -203,7 +298,7 @@ class SSRNode extends TempNode {
203
298
  */
204
299
  getTextureNode() {
205
300
 
206
- return this._textureNode;
301
+ return this.roughnessNode !== null ? this._blurredTextureNode : this._textureNode;
207
302
 
208
303
  }
209
304
 
@@ -219,9 +314,8 @@ class SSRNode extends TempNode {
219
314
  height = Math.round( this.resolutionScale * height );
220
315
 
221
316
  this._resolution.value.set( width, height );
222
- this._maxStep.value = Math.round( Math.sqrt( width * width + height * height ) );
223
-
224
317
  this._ssrRenderTarget.setSize( width, height );
318
+ this._blurRenderTarget.setSize( width, height );
225
319
 
226
320
  }
227
321
 
@@ -236,9 +330,12 @@ class SSRNode extends TempNode {
236
330
 
237
331
  _rendererState = RendererUtils.resetRendererState( renderer, _rendererState );
238
332
 
333
+ const ssrRenderTarget = this._ssrRenderTarget;
334
+ const blurRenderTarget = this._blurRenderTarget;
335
+
239
336
  const size = renderer.getDrawingBufferSize( _size );
240
337
 
241
- _quadMesh.material = this._material;
338
+ _quadMesh.material = this._ssrMaterial;
242
339
 
243
340
  this.setSize( size.width, size.height );
244
341
 
@@ -249,9 +346,29 @@ class SSRNode extends TempNode {
249
346
 
250
347
  // ssr
251
348
 
252
- renderer.setRenderTarget( this._ssrRenderTarget );
349
+ renderer.setRenderTarget( ssrRenderTarget );
350
+ _quadMesh.name = 'SSR [ Reflections ]';
253
351
  _quadMesh.render( renderer );
254
352
 
353
+ // blur (optional)
354
+
355
+ if ( this.roughnessNode !== null ) {
356
+
357
+ // blur mips but leave the base mip unblurred
358
+
359
+ for ( let i = 0; i < blurRenderTarget.texture.mipmaps.length; i ++ ) {
360
+
361
+ _quadMesh.material = ( i === 0 ) ? this._copyMaterial : this._blurMaterial;
362
+
363
+ this._blurSpread.value = i;
364
+ renderer.setRenderTarget( blurRenderTarget, 0, i );
365
+ _quadMesh.name = 'SSR [ Blur Level ' + i + ' ]';
366
+ _quadMesh.render( renderer );
367
+
368
+ }
369
+
370
+ }
371
+
255
372
  // restore
256
373
 
257
374
  RendererUtils.restoreRendererState( renderer, _rendererState );
@@ -326,7 +443,7 @@ class SSRNode extends TempNode {
326
443
 
327
444
  const ssr = Fn( () => {
328
445
 
329
- const metalness = this.metalnessNode.sample( uvNode ).r;
446
+ const metalness = float( this.metalnessNode );
330
447
 
331
448
  // fragments with no metalness do not reflect their environment
332
449
  metalness.equal( 0.0 ).discard();
@@ -349,7 +466,7 @@ class SSRNode extends TempNode {
349
466
  const d1viewPosition = viewPosition.add( viewReflectDir.mul( maxReflectRayLen ) ).toVar();
350
467
 
351
468
  // check if d1viewPosition lies behind the camera near plane
352
- If( this._isPerspectiveCamera.equal( float( 1 ) ).and( d1viewPosition.z.greaterThan( this._cameraNear.negate() ) ), () => {
469
+ If( this._isPerspectiveCamera.and( d1viewPosition.z.greaterThan( this._cameraNear.negate() ) ), () => {
353
470
 
354
471
  // if so, ensure d1viewPosition is clamped on the near plane.
355
472
  // this prevents artifacts during the ray marching process
@@ -374,7 +491,7 @@ class SSRNode extends TempNode {
374
491
  // determine the larger delta
375
492
  // The larger difference will help to determine how much to travel in the X and Y direction each iteration and
376
493
  // how many iterations are needed to travel the entire ray
377
- const totalStep = max( abs( xLen ), abs( yLen ) ).toVar();
494
+ const totalStep = int( max( abs( xLen ), abs( yLen ) ).mul( this.quality.clamp() ) ).toConst();
378
495
 
379
496
  // step sizes in the x and y directions
380
497
  const xSpan = xLen.div( totalStep ).toVar();
@@ -385,23 +502,9 @@ class SSRNode extends TempNode {
385
502
  // the actual ray marching loop
386
503
  // starting from d0, the code gradually travels along the ray and looks for an intersection with the geometry.
387
504
  // it does not exceed d1 (the maximum ray extend)
388
- Loop( { start: int( 0 ), end: int( this._maxStep ), type: 'int', condition: '<' }, ( { i } ) => {
389
-
390
- // TODO: Remove this when Chrome is fixed, see https://issues.chromium.org/issues/372714384#comment14
391
- If( metalness.equal( 0 ), () => {
505
+ Loop( totalStep, ( { i } ) => {
392
506
 
393
- Break();
394
-
395
- } );
396
-
397
- // stop if the maximum number of steps is reached for this specific ray
398
- If( float( i ).greaterThanEqual( totalStep ), () => {
399
-
400
- Break();
401
-
402
- } );
403
-
404
- // advance on the ray by computing a new position in screen space
507
+ // advance on the ray by computing a new position in screen coordinates
405
508
  const xy = vec2( d0.x.add( xSpan.mul( float( i ) ) ), d0.y.add( ySpan.mul( float( i ) ) ) ).toVar();
406
509
 
407
510
  // stop processing if the new position lies outside of the screen
@@ -411,11 +514,10 @@ class SSRNode extends TempNode {
411
514
 
412
515
  } );
413
516
 
414
- // compute new uv, depth, viewZ and viewPosition for the new location on the ray
517
+ // compute new uv, depth and viewZ for the next fragment
415
518
  const uvNode = xy.div( this._resolution );
416
519
  const d = sampleDepth( uvNode ).toVar();
417
520
  const vZ = getViewZ( d ).toVar();
418
- const vP = getViewPosition( uvNode, d, this._cameraProjectionMatrixInverse ).toVar();
419
521
 
420
522
  const viewReflectRayZ = float( 0 ).toVar();
421
523
 
@@ -423,7 +525,7 @@ class SSRNode extends TempNode {
423
525
  const s = xy.sub( d0 ).length().div( totalLen );
424
526
 
425
527
  // depending on the camera type, we now compute the z-coordinate of the reflected ray at the current step in view space
426
- If( this._isPerspectiveCamera.equal( float( 1 ) ), () => {
528
+ If( this._isPerspectiveCamera, () => {
427
529
 
428
530
  const recipVPZ = float( 1 ).div( viewPosition.z ).toVar();
429
531
  viewReflectRayZ.assign( float( 1 ).div( recipVPZ.add( s.mul( float( 1 ).div( d1viewPosition.z ).sub( recipVPZ ) ) ) ) );
@@ -439,6 +541,7 @@ class SSRNode extends TempNode {
439
541
 
440
542
  // compute the distance of the new location to the ray in view space
441
543
  // to clarify vP is the fragment's view position which is not an exact point on the ray
544
+ const vP = getViewPosition( uvNode, d, this._cameraProjectionMatrixInverse ).toVar();
442
545
  const away = pointToLineDistance( vP, viewPosition, d1viewPosition ).toVar();
443
546
 
444
547
  // compute the minimum thickness between the current fragment and its neighbor in the x-direction.
@@ -499,12 +602,22 @@ class SSRNode extends TempNode {
499
602
 
500
603
  } );
501
604
 
502
- this._material.fragmentNode = ssr().context( builder.getSharedContext() );
503
- this._material.needsUpdate = true;
605
+ this._ssrMaterial.fragmentNode = ssr().context( builder.getSharedContext() );
606
+ this._ssrMaterial.needsUpdate = true;
607
+
608
+ // below materials are used for blurring
609
+
610
+ const reflectionBuffer = texture( this._ssrRenderTarget.texture );
611
+
612
+ this._blurMaterial.fragmentNode = boxBlur( reflectionBuffer, { size: this.blurQuality, separation: this._blurSpread } );
613
+ this._blurMaterial.needsUpdate = true;
614
+
615
+ this._copyMaterial.fragmentNode = reflectionBuffer;
616
+ this._copyMaterial.needsUpdate = true;
504
617
 
505
618
  //
506
619
 
507
- return this._textureNode;
620
+ return this.getTextureNode();
508
621
 
509
622
  }
510
623
 
@@ -515,8 +628,11 @@ class SSRNode extends TempNode {
515
628
  dispose() {
516
629
 
517
630
  this._ssrRenderTarget.dispose();
631
+ this._blurRenderTarget.dispose();
518
632
 
519
- this._material.dispose();
633
+ this._ssrMaterial.dispose();
634
+ this._blurMaterial.dispose();
635
+ this._copyMaterial.dispose();
520
636
 
521
637
  }
522
638
 
@@ -533,7 +649,8 @@ export default SSRNode;
533
649
  * @param {Node<float>} depthNode - A node that represents the beauty pass's depth.
534
650
  * @param {Node<vec3>} normalNode - A node that represents the beauty pass's normals.
535
651
  * @param {Node<float>} metalnessNode - A node that represents the beauty pass's metalness.
536
- * @param {Camera} camera - The camera the scene is rendered with.
652
+ * @param {?Node<float>} [roughnessNode=null] - A node that represents the beauty pass's roughness.
653
+ * @param {?Camera} [camera=null] - The camera the scene is rendered with.
537
654
  * @returns {SSRNode}
538
655
  */
539
- export const ssr = ( colorNode, depthNode, normalNode, metalnessNode, camera ) => nodeObject( new SSRNode( nodeObject( colorNode ), nodeObject( depthNode ), nodeObject( normalNode ), nodeObject( metalnessNode ), camera ) );
656
+ export const ssr = ( colorNode, depthNode, normalNode, metalnessNode, roughnessNode = null, camera = null ) => nodeObject( new SSRNode( nodeObject( colorNode ), nodeObject( depthNode ), nodeObject( normalNode ), nodeObject( metalnessNode ), nodeObject( roughnessNode ), camera ) );