@plastic-software/three 0.181.3 → 0.183.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (437) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +3 -4
  3. package/build/three.cjs +11330 -10017
  4. package/build/three.core.js +10011 -9493
  5. package/build/three.core.min.js +2 -2
  6. package/build/three.module.js +1414 -631
  7. package/build/three.module.min.js +2 -2
  8. package/build/three.tsl.js +21 -13
  9. package/build/three.tsl.min.js +2 -2
  10. package/build/three.webgpu.js +8007 -5427
  11. package/build/three.webgpu.min.js +2 -2
  12. package/build/three.webgpu.nodes.js +8005 -5426
  13. package/build/three.webgpu.nodes.min.js +2 -2
  14. package/examples/jsm/Addons.js +0 -3
  15. package/examples/jsm/animation/CCDIKSolver.js +2 -2
  16. package/examples/jsm/controls/ArcballControls.js +3 -3
  17. package/examples/jsm/controls/MapControls.js +55 -1
  18. package/examples/jsm/controls/OrbitControls.js +109 -6
  19. package/examples/jsm/controls/TrackballControls.js +6 -6
  20. package/examples/jsm/csm/CSM.js +2 -1
  21. package/examples/jsm/effects/AnaglyphEffect.js +102 -7
  22. package/examples/jsm/environments/ColorEnvironment.js +59 -0
  23. package/examples/jsm/environments/RoomEnvironment.js +3 -0
  24. package/examples/jsm/exporters/EXRExporter.js +1 -1
  25. package/examples/jsm/exporters/GLTFExporter.js +131 -4
  26. package/examples/jsm/exporters/USDZExporter.js +22 -3
  27. package/examples/jsm/geometries/DecalGeometry.js +1 -1
  28. package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
  29. package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -1
  30. package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
  31. package/examples/jsm/helpers/ViewHelper.js +67 -8
  32. package/examples/jsm/inspector/Inspector.js +74 -14
  33. package/examples/jsm/inspector/RendererInspector.js +12 -2
  34. package/examples/jsm/inspector/tabs/Console.js +41 -7
  35. package/examples/jsm/inspector/tabs/Parameters.js +18 -2
  36. package/examples/jsm/inspector/tabs/Performance.js +2 -2
  37. package/examples/jsm/inspector/tabs/Viewer.js +4 -4
  38. package/examples/jsm/inspector/ui/Profiler.js +1836 -31
  39. package/examples/jsm/inspector/ui/Style.js +973 -14
  40. package/examples/jsm/inspector/ui/Tab.js +188 -1
  41. package/examples/jsm/inspector/ui/Values.js +17 -1
  42. package/examples/jsm/libs/meshopt_decoder.module.js +6 -5
  43. package/examples/jsm/lines/LineMaterial.js +6 -0
  44. package/examples/jsm/loaders/3DMLoader.js +5 -4
  45. package/examples/jsm/loaders/3MFLoader.js +2 -2
  46. package/examples/jsm/loaders/AMFLoader.js +2 -2
  47. package/examples/jsm/loaders/ColladaLoader.js +24 -4026
  48. package/examples/jsm/loaders/DRACOLoader.js +5 -5
  49. package/examples/jsm/loaders/EXRLoader.js +5 -5
  50. package/examples/jsm/loaders/FBXLoader.js +2 -4
  51. package/examples/jsm/loaders/GCodeLoader.js +34 -8
  52. package/examples/jsm/loaders/GLTFLoader.js +122 -171
  53. package/examples/jsm/loaders/HDRLoader.js +0 -1
  54. package/examples/jsm/loaders/KMZLoader.js +5 -5
  55. package/examples/jsm/loaders/KTX2Loader.js +19 -3
  56. package/examples/jsm/loaders/LDrawLoader.js +2 -3
  57. package/examples/jsm/loaders/LWOLoader.js +7 -39
  58. package/examples/jsm/loaders/NRRDLoader.js +2 -2
  59. package/examples/jsm/loaders/PCDLoader.js +4 -2
  60. package/examples/jsm/loaders/SVGLoader.js +1 -1
  61. package/examples/jsm/loaders/TDSLoader.js +0 -2
  62. package/examples/jsm/loaders/TGALoader.js +0 -2
  63. package/examples/jsm/loaders/USDLoader.js +100 -40
  64. package/examples/jsm/loaders/UltraHDRLoader.js +285 -160
  65. package/examples/jsm/loaders/VOXLoader.js +660 -117
  66. package/examples/jsm/loaders/VRMLLoader.js +79 -2
  67. package/examples/jsm/loaders/VTKLoader.js +37 -24
  68. package/examples/jsm/loaders/collada/ColladaComposer.js +2950 -0
  69. package/examples/jsm/loaders/collada/ColladaParser.js +1962 -0
  70. package/examples/jsm/loaders/usd/USDAParser.js +447 -366
  71. package/examples/jsm/loaders/usd/USDCParser.js +1841 -6
  72. package/examples/jsm/loaders/usd/USDComposer.js +4041 -0
  73. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
  74. package/examples/jsm/materials/WoodNodeMaterial.js +11 -11
  75. package/examples/jsm/math/Octree.js +131 -1
  76. package/examples/jsm/misc/Volume.js +0 -1
  77. package/examples/jsm/misc/VolumeSlice.js +0 -1
  78. package/examples/jsm/objects/LensflareMesh.js +1 -1
  79. package/examples/jsm/objects/Sky.js +76 -4
  80. package/examples/jsm/objects/SkyMesh.js +127 -10
  81. package/examples/jsm/objects/Water.js +4 -3
  82. package/examples/jsm/objects/Water2.js +5 -3
  83. package/examples/jsm/objects/WaterMesh.js +5 -7
  84. package/examples/jsm/physics/AmmoPhysics.js +12 -7
  85. package/examples/jsm/physics/JoltPhysics.js +10 -6
  86. package/examples/jsm/physics/RapierPhysics.js +9 -5
  87. package/examples/jsm/postprocessing/EffectComposer.js +7 -5
  88. package/examples/jsm/postprocessing/OutputPass.js +9 -0
  89. package/examples/jsm/postprocessing/RenderPass.js +10 -0
  90. package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
  91. package/examples/jsm/postprocessing/UnrealBloomPass.js +48 -18
  92. package/examples/jsm/renderers/CSS3DRenderer.js +1 -1
  93. package/examples/jsm/renderers/Projector.js +268 -30
  94. package/examples/jsm/renderers/SVGRenderer.js +193 -60
  95. package/examples/jsm/shaders/GTAOShader.js +19 -6
  96. package/examples/jsm/shaders/HalftoneShader.js +12 -1
  97. package/examples/jsm/shaders/PoissonDenoiseShader.js +6 -2
  98. package/examples/jsm/shaders/SAOShader.js +17 -4
  99. package/examples/jsm/shaders/SSAOShader.js +11 -1
  100. package/examples/jsm/shaders/SSRShader.js +6 -5
  101. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -4
  102. package/examples/jsm/shaders/VignetteShader.js +1 -1
  103. package/examples/jsm/transpiler/AST.js +44 -0
  104. package/examples/jsm/transpiler/GLSLDecoder.js +61 -4
  105. package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
  106. package/examples/jsm/transpiler/TSLEncoder.js +46 -3
  107. package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
  108. package/examples/jsm/transpiler/WGSLEncoder.js +27 -0
  109. package/examples/jsm/tsl/display/AfterImageNode.js +1 -1
  110. package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
  111. package/examples/jsm/tsl/display/AnamorphicNode.js +1 -1
  112. package/examples/jsm/tsl/display/BilateralBlurNode.js +364 -0
  113. package/examples/jsm/tsl/display/BloomNode.js +16 -6
  114. package/examples/jsm/tsl/display/CRT.js +150 -0
  115. package/examples/jsm/tsl/display/DenoiseNode.js +1 -1
  116. package/examples/jsm/tsl/display/DepthOfFieldNode.js +1 -1
  117. package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
  118. package/examples/jsm/tsl/display/FXAANode.js +2 -2
  119. package/examples/jsm/tsl/display/GTAONode.js +5 -4
  120. package/examples/jsm/tsl/display/GaussianBlurNode.js +11 -2
  121. package/examples/jsm/tsl/display/GodraysNode.js +624 -0
  122. package/examples/jsm/tsl/display/LensflareNode.js +1 -1
  123. package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
  124. package/examples/jsm/tsl/display/OutlineNode.js +3 -3
  125. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
  126. package/examples/jsm/tsl/display/PixelationPassNode.js +7 -6
  127. package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
  128. package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
  129. package/examples/jsm/tsl/display/SMAANode.js +2 -2
  130. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
  131. package/examples/jsm/tsl/display/SSGINode.js +8 -20
  132. package/examples/jsm/tsl/display/SSRNode.js +8 -8
  133. package/examples/jsm/tsl/display/SSSNode.js +6 -4
  134. package/examples/jsm/tsl/display/Shape.js +29 -0
  135. package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
  136. package/examples/jsm/tsl/display/StereoCompositePassNode.js +8 -1
  137. package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
  138. package/examples/jsm/tsl/display/TRAANode.js +273 -125
  139. package/examples/jsm/tsl/display/TransitionNode.js +1 -1
  140. package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
  141. package/examples/jsm/tsl/display/radialBlur.js +68 -0
  142. package/examples/jsm/tsl/math/Bayer.js +40 -1
  143. package/examples/jsm/utils/LDrawUtils.js +1 -1
  144. package/examples/jsm/utils/ShadowMapViewer.js +24 -10
  145. package/examples/jsm/utils/ShadowMapViewerGPU.js +1 -1
  146. package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
  147. package/package.json +20 -26
  148. package/src/Three.Core.js +2 -1
  149. package/src/Three.TSL.js +19 -11
  150. package/src/Three.WebGPU.Nodes.js +2 -0
  151. package/src/Three.WebGPU.js +3 -0
  152. package/src/Three.js +1 -0
  153. package/src/animation/AnimationAction.js +1 -1
  154. package/src/animation/AnimationClip.js +1 -1
  155. package/src/animation/AnimationMixer.js +6 -0
  156. package/src/animation/AnimationUtils.js +1 -12
  157. package/src/animation/KeyframeTrack.js +47 -8
  158. package/src/animation/PropertyMixer.js +4 -4
  159. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  160. package/src/animation/tracks/ColorKeyframeTrack.js +1 -1
  161. package/src/animation/tracks/NumberKeyframeTrack.js +1 -1
  162. package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -1
  163. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  164. package/src/animation/tracks/VectorKeyframeTrack.js +1 -1
  165. package/src/audio/Audio.js +1 -1
  166. package/src/audio/AudioListener.js +5 -3
  167. package/src/cameras/Camera.js +32 -2
  168. package/src/cameras/CubeCamera.js +20 -0
  169. package/src/constants.js +90 -5
  170. package/src/core/BufferGeometry.js +14 -2
  171. package/src/core/Clock.js +7 -0
  172. package/src/core/Object3D.js +56 -4
  173. package/src/core/Raycaster.js +2 -2
  174. package/src/core/RenderTarget.js +3 -4
  175. package/src/extras/PMREMGenerator.js +7 -18
  176. package/src/extras/TextureUtils.js +5 -1
  177. package/src/geometries/ExtrudeGeometry.js +2 -2
  178. package/src/geometries/PolyhedronGeometry.js +1 -1
  179. package/src/geometries/TorusGeometry.js +8 -3
  180. package/src/helpers/CameraHelper.js +3 -0
  181. package/src/helpers/DirectionalLightHelper.js +4 -1
  182. package/src/helpers/HemisphereLightHelper.js +3 -0
  183. package/src/helpers/PointLightHelper.js +1 -25
  184. package/src/helpers/SpotLightHelper.js +3 -0
  185. package/src/lights/DirectionalLight.js +13 -0
  186. package/src/lights/HemisphereLight.js +10 -0
  187. package/src/lights/Light.js +1 -11
  188. package/src/lights/LightProbe.js +0 -15
  189. package/src/lights/LightShadow.js +15 -6
  190. package/src/lights/PointLight.js +15 -0
  191. package/src/lights/PointLightShadow.js +0 -86
  192. package/src/lights/SpotLight.js +22 -1
  193. package/src/lights/webgpu/IESSpotLight.js +2 -1
  194. package/src/loaders/Cache.js +28 -0
  195. package/src/loaders/FileLoader.js +1 -1
  196. package/src/loaders/ImageBitmapLoader.js +8 -3
  197. package/src/loaders/Loader.js +6 -0
  198. package/src/loaders/MaterialLoader.js +2 -1
  199. package/src/loaders/ObjectLoader.js +21 -2
  200. package/src/loaders/nodes/NodeLoader.js +2 -2
  201. package/src/materials/Material.js +2 -0
  202. package/src/materials/MeshLambertMaterial.js +9 -0
  203. package/src/materials/MeshPhongMaterial.js +9 -0
  204. package/src/materials/ShaderMaterial.js +20 -1
  205. package/src/materials/nodes/Line2NodeMaterial.js +7 -7
  206. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +5 -2
  207. package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -4
  208. package/src/materials/nodes/NodeMaterial.js +72 -25
  209. package/src/materials/nodes/manager/NodeMaterialObserver.js +10 -4
  210. package/src/math/Line3.js +3 -5
  211. package/src/math/MathUtils.js +10 -10
  212. package/src/math/Matrix4.js +74 -65
  213. package/src/math/Quaternion.js +3 -29
  214. package/src/math/Sphere.js +1 -1
  215. package/src/math/Vector3.js +3 -5
  216. package/src/math/interpolants/BezierInterpolant.js +108 -0
  217. package/src/nodes/Nodes.js +87 -68
  218. package/src/nodes/TSL.js +6 -6
  219. package/src/nodes/accessors/Arrays.js +1 -1
  220. package/src/nodes/accessors/BatchNode.js +10 -10
  221. package/src/nodes/accessors/Bitangent.js +5 -5
  222. package/src/nodes/accessors/BufferAttributeNode.js +98 -12
  223. package/src/nodes/accessors/BufferNode.js +29 -2
  224. package/src/nodes/accessors/Camera.js +149 -28
  225. package/src/nodes/accessors/ClippingNode.js +4 -4
  226. package/src/nodes/accessors/CubeTextureNode.js +20 -1
  227. package/src/nodes/accessors/InstanceNode.js +148 -43
  228. package/src/nodes/accessors/MaterialNode.js +9 -1
  229. package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
  230. package/src/nodes/accessors/ModelNode.js +1 -1
  231. package/src/nodes/accessors/Normal.js +11 -11
  232. package/src/nodes/accessors/Position.js +34 -2
  233. package/src/nodes/accessors/ReferenceBaseNode.js +4 -4
  234. package/src/nodes/accessors/ReferenceNode.js +4 -4
  235. package/src/nodes/accessors/RendererReferenceNode.js +1 -2
  236. package/src/nodes/accessors/SceneProperties.js +53 -0
  237. package/src/nodes/accessors/SkinningNode.js +27 -26
  238. package/src/nodes/accessors/StorageBufferNode.js +4 -21
  239. package/src/nodes/accessors/StorageTextureNode.js +37 -1
  240. package/src/nodes/accessors/Tangent.js +4 -14
  241. package/src/nodes/accessors/Texture3DNode.js +32 -35
  242. package/src/nodes/accessors/TextureNode.js +58 -22
  243. package/src/nodes/accessors/UniformArrayNode.js +4 -2
  244. package/src/nodes/accessors/UserDataNode.js +1 -2
  245. package/src/nodes/accessors/VertexColorNode.js +1 -2
  246. package/src/nodes/code/FunctionNode.js +1 -2
  247. package/src/nodes/core/ArrayNode.js +20 -1
  248. package/src/nodes/core/AssignNode.js +2 -2
  249. package/src/nodes/core/AttributeNode.js +2 -2
  250. package/src/nodes/core/ContextNode.js +103 -4
  251. package/src/nodes/core/MRTNode.js +48 -2
  252. package/src/nodes/core/Node.js +29 -3
  253. package/src/nodes/core/NodeBuilder.js +170 -53
  254. package/src/nodes/core/NodeError.js +28 -0
  255. package/src/nodes/core/NodeFrame.js +12 -4
  256. package/src/nodes/core/NodeUtils.js +10 -8
  257. package/src/nodes/core/OutputStructNode.js +12 -10
  258. package/src/nodes/core/ParameterNode.js +3 -3
  259. package/src/nodes/core/PropertyNode.js +19 -3
  260. package/src/nodes/core/StackNode.js +65 -16
  261. package/src/nodes/core/StackTrace.js +139 -0
  262. package/src/nodes/core/StructNode.js +16 -2
  263. package/src/nodes/core/StructTypeNode.js +11 -17
  264. package/src/nodes/core/SubBuildNode.js +1 -1
  265. package/src/nodes/core/UniformNode.js +21 -5
  266. package/src/nodes/core/VarNode.js +47 -22
  267. package/src/nodes/core/VaryingNode.js +1 -18
  268. package/src/nodes/display/BlendModes.js +0 -64
  269. package/src/nodes/display/ColorAdjustment.js +17 -0
  270. package/src/nodes/display/ColorSpaceNode.js +3 -3
  271. package/src/nodes/display/NormalMapNode.js +39 -4
  272. package/src/nodes/display/PassNode.js +98 -9
  273. package/src/nodes/display/RenderOutputNode.js +3 -3
  274. package/src/nodes/display/ScreenNode.js +3 -1
  275. package/src/nodes/display/ToneMappingNode.js +1 -1
  276. package/src/nodes/display/ToonOutlinePassNode.js +2 -2
  277. package/src/nodes/display/ViewportDepthNode.js +52 -4
  278. package/src/nodes/display/ViewportTextureNode.js +21 -4
  279. package/src/nodes/fog/Fog.js +18 -35
  280. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +3 -3
  281. package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
  282. package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
  283. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +1 -1
  284. package/src/nodes/functions/PhysicalLightingModel.js +126 -45
  285. package/src/nodes/geometry/RangeNode.js +4 -2
  286. package/src/nodes/gpgpu/ComputeBuiltinNode.js +1 -2
  287. package/src/nodes/gpgpu/ComputeNode.js +5 -4
  288. package/src/nodes/gpgpu/SubgroupFunctionNode.js +1 -1
  289. package/src/nodes/gpgpu/WorkgroupInfoNode.js +4 -4
  290. package/src/nodes/lighting/AnalyticLightNode.js +53 -0
  291. package/src/nodes/lighting/EnvironmentNode.js +28 -3
  292. package/src/nodes/lighting/LightsNode.js +2 -2
  293. package/src/nodes/lighting/PointShadowNode.js +162 -149
  294. package/src/nodes/lighting/ShadowFilterNode.js +53 -65
  295. package/src/nodes/lighting/ShadowNode.js +97 -41
  296. package/src/nodes/math/BitcountNode.js +433 -0
  297. package/src/nodes/math/ConditionalNode.js +2 -2
  298. package/src/nodes/math/MathNode.js +3 -40
  299. package/src/nodes/math/OperatorNode.js +2 -1
  300. package/src/nodes/math/PackFloatNode.js +98 -0
  301. package/src/nodes/math/UnpackFloatNode.js +96 -0
  302. package/src/nodes/pmrem/PMREMNode.js +1 -1
  303. package/src/nodes/pmrem/PMREMUtils.js +9 -15
  304. package/src/nodes/tsl/TSLCore.js +17 -14
  305. package/src/nodes/utils/ArrayElementNode.js +13 -0
  306. package/src/nodes/utils/DebugNode.js +11 -11
  307. package/src/nodes/utils/EventNode.js +1 -2
  308. package/src/nodes/utils/JoinNode.js +2 -2
  309. package/src/nodes/utils/LoopNode.js +1 -1
  310. package/src/nodes/utils/MemberNode.js +1 -1
  311. package/src/nodes/utils/Packing.js +13 -1
  312. package/src/nodes/utils/PostProcessingUtils.js +33 -1
  313. package/src/nodes/utils/RTTNode.js +1 -1
  314. package/src/nodes/utils/ReflectorNode.js +3 -4
  315. package/src/nodes/utils/SampleNode.js +1 -1
  316. package/src/nodes/utils/SpriteSheetUV.js +35 -0
  317. package/src/nodes/utils/UVUtils.js +28 -0
  318. package/src/objects/BatchedMesh.js +27 -14
  319. package/src/objects/InstancedMesh.js +11 -0
  320. package/src/objects/Line.js +1 -1
  321. package/src/objects/Mesh.js +1 -1
  322. package/src/objects/Points.js +1 -1
  323. package/src/objects/Skeleton.js +9 -0
  324. package/src/renderers/WebGLRenderer.js +178 -92
  325. package/src/renderers/common/Backend.js +29 -0
  326. package/src/renderers/common/Background.js +24 -11
  327. package/src/renderers/common/BindGroup.js +1 -9
  328. package/src/renderers/common/Binding.js +11 -0
  329. package/src/renderers/common/Bindings.js +27 -12
  330. package/src/renderers/common/BlendMode.js +143 -0
  331. package/src/renderers/common/Buffer.js +40 -0
  332. package/src/renderers/common/BundleGroup.js +1 -1
  333. package/src/renderers/common/ChainMap.js +30 -6
  334. package/src/renderers/common/CubeRenderTarget.js +50 -6
  335. package/src/renderers/common/Geometries.js +29 -3
  336. package/src/renderers/common/Lighting.js +5 -21
  337. package/src/renderers/common/Pipelines.js +4 -4
  338. package/src/renderers/common/PostProcessing.js +8 -206
  339. package/src/renderers/common/RenderBundles.js +2 -1
  340. package/src/renderers/common/RenderContext.js +16 -0
  341. package/src/renderers/common/RenderContexts.js +33 -49
  342. package/src/renderers/common/RenderLists.js +2 -1
  343. package/src/renderers/common/RenderObject.js +15 -3
  344. package/src/renderers/common/RenderObjectPipeline.js +40 -0
  345. package/src/renderers/common/RenderObjects.js +18 -2
  346. package/src/renderers/common/RenderPipeline.js +203 -17
  347. package/src/renderers/common/Renderer.js +257 -72
  348. package/src/renderers/common/Sampler.js +4 -4
  349. package/src/renderers/common/StorageBuffer.js +13 -1
  350. package/src/renderers/common/Textures.js +17 -1
  351. package/src/renderers/common/TimestampQueryPool.js +5 -3
  352. package/src/renderers/common/Uniform.js +8 -0
  353. package/src/renderers/common/UniformsGroup.js +61 -0
  354. package/src/renderers/common/XRManager.js +3 -2
  355. package/src/renderers/common/extras/PMREMGenerator.js +2 -8
  356. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  357. package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +18 -6
  358. package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
  359. package/src/renderers/common/nodes/NodeUniformBuffer.js +52 -0
  360. package/src/renderers/shaders/DFGLUTData.js +19 -34
  361. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
  362. package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
  363. package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
  364. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
  365. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
  366. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +7 -11
  367. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +5 -2
  368. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
  369. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
  370. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
  371. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +112 -51
  372. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
  373. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +225 -186
  374. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
  375. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  376. package/src/renderers/shaders/ShaderChunk.js +3 -3
  377. package/src/renderers/shaders/ShaderLib/depth.glsl.js +3 -0
  378. package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +1 -2
  379. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
  380. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
  381. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
  382. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
  383. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
  384. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
  385. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
  386. package/src/renderers/shaders/ShaderLib.js +7 -5
  387. package/src/renderers/shaders/UniformsLib.js +0 -3
  388. package/src/renderers/webgl/WebGLBackground.js +2 -2
  389. package/src/renderers/webgl/WebGLBindingStates.js +99 -27
  390. package/src/renderers/webgl/WebGLCapabilities.js +3 -4
  391. package/src/renderers/webgl/WebGLEnvironments.js +228 -0
  392. package/src/renderers/webgl/WebGLGeometries.js +10 -7
  393. package/src/renderers/webgl/WebGLLights.js +18 -1
  394. package/src/renderers/webgl/WebGLMaterials.js +12 -0
  395. package/src/renderers/webgl/WebGLObjects.js +3 -1
  396. package/src/renderers/webgl/WebGLOutput.js +267 -0
  397. package/src/renderers/webgl/WebGLProgram.js +45 -109
  398. package/src/renderers/webgl/WebGLPrograms.js +45 -49
  399. package/src/renderers/webgl/WebGLRenderLists.js +15 -0
  400. package/src/renderers/webgl/WebGLShadowMap.js +188 -24
  401. package/src/renderers/webgl/WebGLState.js +32 -37
  402. package/src/renderers/webgl/WebGLTextures.js +89 -28
  403. package/src/renderers/webgl/WebGLUniforms.js +40 -3
  404. package/src/renderers/webgl/WebGLUtils.js +6 -2
  405. package/src/renderers/webgl-fallback/WebGLBackend.js +148 -18
  406. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +156 -35
  407. package/src/renderers/webgl-fallback/utils/WebGLState.js +181 -5
  408. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +5 -3
  409. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +9 -9
  410. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +6 -2
  411. package/src/renderers/webgpu/WebGPUBackend.js +119 -13
  412. package/src/renderers/webgpu/WebGPURenderer.js +2 -1
  413. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +322 -68
  414. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +4 -17
  415. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +357 -200
  416. package/src/renderers/webgpu/utils/WebGPUConstants.js +2 -0
  417. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +61 -23
  418. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +152 -200
  419. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +65 -42
  420. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +7 -7
  421. package/src/renderers/webgpu/utils/WebGPUUtils.js +17 -11
  422. package/src/renderers/webxr/WebXRManager.js +2 -2
  423. package/src/textures/CubeDepthTexture.js +76 -0
  424. package/src/textures/Source.js +1 -1
  425. package/src/textures/Texture.js +3 -3
  426. package/src/utils.js +258 -3
  427. package/examples/jsm/materials/MeshGouraudMaterial.js +0 -434
  428. package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
  429. package/examples/jsm/shaders/GodRaysShader.js +0 -333
  430. package/src/nodes/accessors/SceneNode.js +0 -145
  431. package/src/nodes/code/ScriptableNode.js +0 -726
  432. package/src/nodes/code/ScriptableValueNode.js +0 -253
  433. package/src/nodes/display/PosterizeNode.js +0 -65
  434. package/src/nodes/functions/BSDF/DFGApprox.js +0 -71
  435. package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
  436. package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
  437. package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
@@ -0,0 +1,624 @@
1
+ import { Frustum, Matrix4, RenderTarget, Vector2, RendererUtils, QuadMesh, TempNode, NodeMaterial, NodeUpdateType, Vector3, Plane, WebGPUCoordinateSystem } from 'three/webgpu';
2
+ import { cubeTexture, clamp, viewZToPerspectiveDepth, logarithmicDepthToViewZ, float, Loop, max, Fn, passTexture, uv, dot, uniformArray, If, getViewPosition, uniform, vec4, add, interleavedGradientNoise, screenCoordinate, round, mul, uint, mix, exp, vec3, distance, pow, reference, lightPosition, vec2, bool, texture, perspectiveDepthToViewZ, lightShadowMatrix } from 'three/tsl';
3
+
4
+ const _quadMesh = /*@__PURE__*/ new QuadMesh();
5
+ const _size = /*@__PURE__*/ new Vector2();
6
+
7
+ const _DIRECTIONS = [
8
+ new Vector3( 1, 0, 0 ),
9
+ new Vector3( - 1, 0, 0 ),
10
+ new Vector3( 0, 1, 0 ),
11
+ new Vector3( 0, - 1, 0 ),
12
+ new Vector3( 0, 0, 1 ),
13
+ new Vector3( 0, 0, - 1 ),
14
+ ];
15
+
16
+ const _PLANES = _DIRECTIONS.map( () => new Plane() );
17
+ const _SCRATCH_VECTOR = new Vector3();
18
+ const _SCRATCH_MAT4 = new Matrix4();
19
+ const _SCRATCH_FRUSTUM = new Frustum();
20
+
21
+ let _rendererState;
22
+
23
+ /**
24
+ * Post-Processing node for apply Screen-space raymarched godrays to a scene.
25
+ *
26
+ * After the godrays have been computed, it's recommened to apply a Bilateral
27
+ * Blur to the result to mitigate raymarching and noise artifacts.
28
+ *
29
+ * The composite with the scene pass is ideally done with `depthAwareBlend()`,
30
+ * which mitigates aliasing and light leaking.
31
+ *
32
+ * ```js
33
+ * const godraysPass = godrays( scenePassDepth, camera, light );
34
+ *
35
+ * const blurPass = bilateralBlur( godraysPassColor ); // optional blur
36
+ *
37
+ * const outputBlurred = depthAwareBlend( scenePassColor, blurPassColor, scenePassDepth, camera, { blendColor, edgeRadius, edgeStrength } ); // composite
38
+ * ```
39
+ *
40
+ * Limitations:
41
+ *
42
+ * - Only point and directional lights are currently supported.
43
+ * - The effect requires a full shadow setup. Meaning shadows must be enabled in the renderer,
44
+ * 3D objects must cast and receive shadows and the main light must cast shadows.
45
+ *
46
+ * Reference: This Node is a part of [three-good-godrays](https://github.com/Ameobea/three-good-godrays).
47
+ *
48
+ * @augments TempNode
49
+ * @three_import import { godrays } from 'three/addons/tsl/display/GodraysNode.js';
50
+ */
51
+ class GodraysNode extends TempNode {
52
+
53
+ static get type() {
54
+
55
+ return 'GodraysNode';
56
+
57
+ }
58
+
59
+ /**
60
+ * Constructs a new Godrays node.
61
+ *
62
+ * @param {TextureNode} depthNode - A texture node that represents the scene's depth.
63
+ * @param {Camera} camera - The camera the scene is rendered with.
64
+ * @param {(DirectionalLight|PointLight)} light - The light the godrays are rendered for.
65
+ */
66
+ constructor( depthNode, camera, light ) {
67
+
68
+ super( 'vec4' );
69
+
70
+ /**
71
+ * A node that represents the beauty pass's depth.
72
+ *
73
+ * @type {TextureNode}
74
+ */
75
+ this.depthNode = depthNode;
76
+
77
+ /**
78
+ * The number of raymarching steps
79
+ *
80
+ * @type {UniformNode<uint>}
81
+ * @default 60
82
+ */
83
+ this.raymarchSteps = uniform( uint( 60 ) );
84
+
85
+ /**
86
+ * The rate of accumulation for the godrays. Higher values roughly equate to more humid air/denser fog.
87
+ *
88
+ * @type {UniformNode<float>}
89
+ * @default 0.7
90
+ */
91
+ this.density = uniform( float( 0.7 ) );
92
+
93
+ /**
94
+ * The maximum density of the godrays. Limits the maximum brightness of the godrays.
95
+ *
96
+ * @type {UniformNode<float>}
97
+ * @default 0.5
98
+ */
99
+ this.maxDensity = uniform( float( 0.5 ) );
100
+
101
+ /**
102
+ * Higher values decrease the accumulation of godrays the further away they are from the light source.
103
+ *
104
+ * @type {UniformNode<float>}
105
+ * @default 2
106
+ */
107
+ this.distanceAttenuation = uniform( float( 2 ) );
108
+
109
+ /**
110
+ * The resolution scale.
111
+ *
112
+ * @type {number}
113
+ */
114
+ this.resolutionScale = 0.5;
115
+
116
+ /**
117
+ * The `updateBeforeType` is set to `NodeUpdateType.FRAME` since the node renders
118
+ * its effect once per frame in `updateBefore()`.
119
+ *
120
+ * @type {string}
121
+ * @default 'frame'
122
+ */
123
+ this.updateBeforeType = NodeUpdateType.FRAME;
124
+
125
+ // private uniforms
126
+
127
+ /**
128
+ * Represents the world matrix of the scene's camera.
129
+ *
130
+ * @private
131
+ * @type {UniformNode<mat4>}
132
+ */
133
+ this._cameraMatrixWorld = uniform( camera.matrixWorld );
134
+
135
+ /**
136
+ * Represents the inverse projection matrix of the scene's camera.
137
+ *
138
+ * @private
139
+ * @type {UniformNode<mat4>}
140
+ */
141
+ this._cameraProjectionMatrixInverse = uniform( camera.projectionMatrixInverse );
142
+
143
+ /**
144
+ * Represents the inverse projection matrix of the scene's camera.
145
+ *
146
+ * @private
147
+ * @type {UniformNode<mat4>}
148
+ */
149
+ this._premultipliedLightCameraMatrix = uniform( new Matrix4() );
150
+
151
+ /**
152
+ * Represents the world position of the scene's camera.
153
+ *
154
+ * @private
155
+ * @type {UniformNode<mat4>}
156
+ */
157
+ this._cameraPosition = uniform( new Vector3() );
158
+
159
+ /**
160
+ * Represents the near value of the scene's camera.
161
+ *
162
+ * @private
163
+ * @type {ReferenceNode<float>}
164
+ */
165
+ this._cameraNear = reference( 'near', 'float', camera );
166
+
167
+ /**
168
+ * Represents the far value of the scene's camera.
169
+ *
170
+ * @private
171
+ * @type {ReferenceNode<float>}
172
+ */
173
+ this._cameraFar = reference( 'far', 'float', camera );
174
+
175
+ /**
176
+ * The near value of the shadow camera.
177
+ *
178
+ * @private
179
+ * @type {ReferenceNode<float>}
180
+ */
181
+ this._shadowCameraNear = reference( 'near', 'float', light.shadow.camera );
182
+
183
+ /**
184
+ * The far value of the shadow camera.
185
+ *
186
+ * @private
187
+ * @type {ReferenceNode<float>}
188
+ */
189
+ this._shadowCameraFar = reference( 'far', 'float', light.shadow.camera );
190
+
191
+ this._fNormals = uniformArray( _DIRECTIONS.map( () => new Vector3() ) );
192
+ this._fConstants = uniformArray( _DIRECTIONS.map( () => 0 ) );
193
+
194
+ /**
195
+ * The light the godrays are rendered for.
196
+ *
197
+ * @private
198
+ * @type {(DirectionalLight|PointLight)}
199
+ */
200
+ this._light = light;
201
+
202
+ /**
203
+ * The camera the scene is rendered with.
204
+ *
205
+ * @private
206
+ * @type {Camera}
207
+ */
208
+ this._camera = camera;
209
+
210
+ /**
211
+ * The render target the godrays are rendered into.
212
+ *
213
+ * @private
214
+ * @type {RenderTarget}
215
+ */
216
+ this._godraysRenderTarget = new RenderTarget( 1, 1, { depthBuffer: false } );
217
+ this._godraysRenderTarget.texture.name = 'Godrays';
218
+
219
+ /**
220
+ * The material that is used to render the effect.
221
+ *
222
+ * @private
223
+ * @type {NodeMaterial}
224
+ */
225
+ this._material = new NodeMaterial();
226
+ this._material.name = 'Godrays';
227
+
228
+ /**
229
+ * The result of the effect is represented as a separate texture node.
230
+ *
231
+ * @private
232
+ * @type {PassTextureNode}
233
+ */
234
+ this._textureNode = passTexture( this, this._godraysRenderTarget.texture );
235
+
236
+
237
+ }
238
+
239
+ /**
240
+ * Returns the result of the effect as a texture node.
241
+ *
242
+ * @return {PassTextureNode} A texture node that represents the result of the effect.
243
+ */
244
+ getTextureNode() {
245
+
246
+ return this._textureNode;
247
+
248
+ }
249
+
250
+ /**
251
+ * Sets the size of the effect.
252
+ *
253
+ * @param {number} width - The width of the effect.
254
+ * @param {number} height - The height of the effect.
255
+ */
256
+ setSize( width, height ) {
257
+
258
+ width = Math.round( this.resolutionScale * width );
259
+ height = Math.round( this.resolutionScale * height );
260
+
261
+ this._godraysRenderTarget.setSize( width, height );
262
+
263
+ }
264
+
265
+ /**
266
+ * This method is used to render the effect once per frame.
267
+ *
268
+ * @param {NodeFrame} frame - The current node frame.
269
+ */
270
+ updateBefore( frame ) {
271
+
272
+ const { renderer } = frame;
273
+
274
+ _rendererState = RendererUtils.resetRendererState( renderer, _rendererState );
275
+
276
+ //
277
+
278
+ const size = renderer.getDrawingBufferSize( _size );
279
+ this.setSize( size.width, size.height );
280
+
281
+ //
282
+
283
+ _quadMesh.material = this._material;
284
+ _quadMesh.name = 'Godrays';
285
+
286
+ this._updateLightParams();
287
+
288
+ this._cameraPosition.value.setFromMatrixPosition( this._camera.matrixWorld );
289
+
290
+ // clear
291
+
292
+ renderer.setClearColor( 0xffffff, 1 );
293
+
294
+ // godrays
295
+
296
+ renderer.setRenderTarget( this._godraysRenderTarget );
297
+ _quadMesh.render( renderer );
298
+
299
+ // restore
300
+
301
+ RendererUtils.restoreRendererState( renderer, _rendererState );
302
+
303
+ }
304
+
305
+ _updateLightParams() {
306
+
307
+ const light = this._light;
308
+ const shadowCamera = light.shadow.camera;
309
+
310
+ this._premultipliedLightCameraMatrix.value.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );
311
+
312
+ if ( light.isPointLight ) {
313
+
314
+ for ( let i = 0; i < _DIRECTIONS.length; i ++ ) {
315
+
316
+ const direction = _DIRECTIONS[ i ];
317
+ const plane = _PLANES[ i ];
318
+
319
+ _SCRATCH_VECTOR.copy( light.position );
320
+ _SCRATCH_VECTOR.addScaledVector( direction, shadowCamera.far );
321
+ plane.setFromNormalAndCoplanarPoint( direction, _SCRATCH_VECTOR );
322
+
323
+ this._fNormals.array[ i ].copy( plane.normal );
324
+ this._fConstants.array[ i ] = plane.constant;
325
+
326
+ }
327
+
328
+ } else if ( light.isDirectionalLight ) {
329
+
330
+ _SCRATCH_MAT4.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );
331
+ _SCRATCH_FRUSTUM.setFromProjectionMatrix( _SCRATCH_MAT4 );
332
+
333
+ for ( let i = 0; i < 6; i ++ ) {
334
+
335
+ const plane = _SCRATCH_FRUSTUM.planes[ i ];
336
+
337
+ this._fNormals.array[ i ].copy( plane.normal ).multiplyScalar( - 1 );
338
+ this._fConstants.array[ i ] = plane.constant * - 1;
339
+
340
+ }
341
+
342
+ }
343
+
344
+ }
345
+
346
+ /**
347
+ * This method is used to setup the effect's TSL code.
348
+ *
349
+ * @param {NodeBuilder} builder - The current node builder.
350
+ * @return {PassTextureNode}
351
+ */
352
+ setup( builder ) {
353
+
354
+ const { renderer } = builder;
355
+
356
+ const uvNode = uv();
357
+ const lightPos = lightPosition( this._light );
358
+
359
+ const sampleDepth = ( uv ) => {
360
+
361
+ const depth = this.depthNode.sample( uv ).r;
362
+
363
+ if ( builder.renderer.logarithmicDepthBuffer === true ) {
364
+
365
+ const viewZ = logarithmicDepthToViewZ( depth, this._cameraNear, this._cameraFar );
366
+
367
+ return viewZToPerspectiveDepth( viewZ, this._cameraNear, this._cameraFar );
368
+
369
+ }
370
+
371
+ return depth;
372
+
373
+ };
374
+
375
+ const sdPlane = ( p, n, h ) => {
376
+
377
+ return dot( p, n ).add( h );
378
+
379
+ };
380
+
381
+ const intersectRayPlane = ( rayOrigin, rayDirection, planeNormal, planeDistance ) => {
382
+
383
+ const denom = dot( planeNormal, rayDirection );
384
+ return sdPlane( rayOrigin, planeNormal, planeDistance ).div( denom ).negate();
385
+
386
+ };
387
+
388
+ const computeShadowCoord = ( worldPos ) => {
389
+
390
+ const shadowPosition = lightShadowMatrix( this._light ).mul( worldPos );
391
+ const shadowCoord = shadowPosition.xyz.div( shadowPosition.w );
392
+ let coordZ = shadowCoord.z;
393
+
394
+ if ( renderer.coordinateSystem === WebGPUCoordinateSystem ) {
395
+
396
+ coordZ = coordZ.mul( 2 ).sub( 1 ); // WebGPU: Conversion [ 0, 1 ] to [ - 1, 1 ]
397
+
398
+ }
399
+
400
+ return vec3( shadowCoord.x, shadowCoord.y.oneMinus(), coordZ );
401
+
402
+ };
403
+
404
+ const inShadow = ( worldPos ) => {
405
+
406
+ if ( this._light.isPointLight ) {
407
+
408
+ const lightToPos = worldPos.sub( lightPos ).toConst();
409
+
410
+ const shadowPositionAbs = lightToPos.abs().toConst();
411
+ const viewZ = shadowPositionAbs.x.max( shadowPositionAbs.y ).max( shadowPositionAbs.z ).negate();
412
+
413
+ const depth = viewZToPerspectiveDepth( viewZ, this._shadowCameraNear, this._shadowCameraFar );
414
+
415
+ const result = cubeTexture( this._light.shadow.map.depthTexture, lightToPos ).compare( depth ).r;
416
+
417
+ return vec2( result.oneMinus().add( 0.005 ), viewZ.negate() );
418
+
419
+ } else if ( this._light.isDirectionalLight ) {
420
+
421
+ const shadowCoord = computeShadowCoord( worldPos ).toConst();
422
+
423
+ const frustumTest = shadowCoord.x.greaterThanEqual( 0 )
424
+ .and( shadowCoord.x.lessThanEqual( 1 ) )
425
+ .and( shadowCoord.y.greaterThanEqual( 0 ) )
426
+ .and( shadowCoord.y.lessThanEqual( 1 ) )
427
+ .and( shadowCoord.z.greaterThanEqual( 0 ) )
428
+ .and( shadowCoord.z.lessThanEqual( 1 ) );
429
+
430
+ const output = vec2( 1, 0 );
431
+
432
+ If( frustumTest.equal( true ), () => {
433
+
434
+ const result = texture( this._light.shadow.map.depthTexture, shadowCoord.xy ).compare( shadowCoord.z ).r;
435
+
436
+ const viewZ = perspectiveDepthToViewZ( shadowCoord.z, this._shadowCameraNear, this._shadowCameraFar );
437
+
438
+ output.assign( vec2( result.oneMinus(), viewZ.negate() ) );
439
+
440
+ } );
441
+
442
+ return output;
443
+
444
+ } else {
445
+
446
+ throw new Error( 'GodraysNode: Unsupported light type.' );
447
+
448
+ }
449
+
450
+ };
451
+
452
+ const godrays = Fn( () => {
453
+
454
+ const output = vec4( 0, 0, 0, 1 ).toVar();
455
+ const isEarlyOut = bool( false );
456
+
457
+ const depth = sampleDepth( uvNode ).toConst();
458
+ const viewPosition = getViewPosition( uvNode, depth, this._cameraProjectionMatrixInverse ).toConst();
459
+ const worldPosition = this._cameraMatrixWorld.mul( viewPosition );
460
+
461
+ const inBoxDist = float( - 10000.0 ).toVar();
462
+
463
+ Loop( 6, ( { i } ) => {
464
+
465
+ inBoxDist.assign( max( inBoxDist, sdPlane( this._cameraPosition, this._fNormals.element( i ), this._fConstants.element( i ) ) ) );
466
+
467
+ } );
468
+
469
+ const startPosition = this._cameraPosition.toVar();
470
+
471
+ If( inBoxDist.lessThan( 0 ), () => {
472
+
473
+ // If the ray target is outside the shadow box, move it to the nearest
474
+ // point on the box to avoid marching through unlit space
475
+
476
+ Loop( 6, ( { i } ) => {
477
+
478
+ If( sdPlane( worldPosition, this._fNormals.element( i ), this._fConstants.element( i ) ).greaterThan( 0 ), () => {
479
+
480
+ const direction = worldPosition.sub( this._cameraPosition ).toConst();
481
+
482
+ const t = intersectRayPlane( this._cameraPosition, direction, this._fNormals.element( i ), this._fConstants.element( i ) );
483
+
484
+ worldPosition.assign( this._cameraPosition.add( t.mul( direction ) ) );
485
+
486
+ } );
487
+
488
+ } );
489
+
490
+ } ).Else( () => {
491
+
492
+ // Find the first point where the ray intersects the shadow box (startPos)
493
+
494
+ const direction = worldPosition.sub( this._cameraPosition ).toConst();
495
+
496
+ const minT = float( 10000 ).toVar();
497
+
498
+ Loop( 6, ( { i } ) => {
499
+
500
+ const t = intersectRayPlane( this._cameraPosition, direction, this._fNormals.element( i ), this._fConstants.element( i ) );
501
+
502
+ If( t.lessThan( minT ).and( t.greaterThan( 0 ) ), () => {
503
+
504
+ minT.assign( t );
505
+
506
+ } );
507
+
508
+ } );
509
+
510
+ If( minT.equal( 10000 ), () => {
511
+
512
+ isEarlyOut.assign( true );
513
+
514
+ } ).Else( () => {
515
+
516
+ startPosition.assign( this._cameraPosition.add( minT.add( 0.001 ).mul( direction ) ) );
517
+
518
+ // If the ray target is outside the shadow box, move it to the nearest
519
+ // point on the box to avoid marching through unlit space
520
+
521
+ const endInBoxDist = float( - 10000 ).toVar();
522
+
523
+ Loop( 6, ( { i } ) => {
524
+
525
+ endInBoxDist.assign( max( endInBoxDist, sdPlane( worldPosition, this._fNormals.element( i ), this._fConstants.element( i ) ) ) );
526
+
527
+ } );
528
+
529
+
530
+ If( endInBoxDist.greaterThanEqual( 0 ), () => {
531
+
532
+ const minT = float( 10000 ).toVar();
533
+
534
+ Loop( 6, ( { i } ) => {
535
+
536
+ If( sdPlane( worldPosition, this._fNormals.element( i ), this._fConstants.element( i ) ).greaterThan( 0 ), () => {
537
+
538
+ const t = intersectRayPlane( startPosition, direction, this._fNormals.element( i ), this._fConstants.element( i ) );
539
+
540
+ If( t.lessThan( minT ).and( t.greaterThan( 0 ) ), () => {
541
+
542
+ minT.assign( t );
543
+
544
+ } );
545
+
546
+ } );
547
+
548
+ } );
549
+
550
+ If( minT.lessThan( worldPosition.distance( startPosition ) ), () => {
551
+
552
+ worldPosition.assign( startPosition.add( minT.mul( direction ) ) );
553
+
554
+ } );
555
+
556
+ } );
557
+
558
+ } );
559
+
560
+ } );
561
+
562
+ If( isEarlyOut.equal( false ), () => {
563
+
564
+ const illum = float( 0 ).toVar();
565
+
566
+ const noise = interleavedGradientNoise( screenCoordinate ).toConst();
567
+ const samplesFloat = round( add( this.raymarchSteps, mul( this.raymarchSteps.div( 8 ).add( 2 ), noise ) ) ).toConst();
568
+ const samples = uint( samplesFloat ).toConst();
569
+
570
+ Loop( samples, ( { i } ) => {
571
+
572
+ const samplePos = mix( startPosition, worldPosition, float( i ).div( samplesFloat ) ).toConst();
573
+ const shadowInfo = inShadow( samplePos );
574
+ const shadowAmount = shadowInfo.x.oneMinus().toConst();
575
+
576
+ illum.addAssign( shadowAmount.mul( distance( startPosition, worldPosition ).mul( this.density.div( 100 ) ) ).mul( pow( shadowInfo.y.div( this._shadowCameraFar ).oneMinus(), this.distanceAttenuation ) ) );
577
+
578
+ } );
579
+
580
+ illum.divAssign( samplesFloat );
581
+
582
+ output.assign( vec4( vec3( clamp( exp( illum.negate() ).oneMinus(), 0, this.maxDensity ) ), depth ) );
583
+
584
+
585
+ } );
586
+
587
+ return output;
588
+
589
+ } );
590
+
591
+ this._material.fragmentNode = godrays().context( builder.getSharedContext() );
592
+ this._material.needsUpdate = true;
593
+
594
+ return this._textureNode;
595
+
596
+ }
597
+
598
+ /**
599
+ * Frees internal resources. This method should be called
600
+ * when the effect is no longer required.
601
+ */
602
+ dispose() {
603
+
604
+ this._godraysRenderTarget.dispose();
605
+
606
+ this._material.dispose();
607
+
608
+ }
609
+
610
+ }
611
+
612
+ export default GodraysNode;
613
+
614
+ /**
615
+ * TSL function for creating a Godrays effect.
616
+ *
617
+ * @tsl
618
+ * @function
619
+ * @param {TextureNode} depthNode - A texture node that represents the scene's depth.
620
+ * @param {Camera} camera - The camera the scene is rendered with.
621
+ * @param {(DirectionalLight|PointLight)} light - The light the godrays are rendered for.
622
+ * @returns {GodraysNode}
623
+ */
624
+ export const godrays = ( depthNode, camera, light ) => new GodraysNode( depthNode, camera, light );
@@ -276,4 +276,4 @@ export default LensflareNode;
276
276
  * @param {number} [params.downSampleRatio=4] - Defines how downsampling since the effect is usually not rendered at full resolution.
277
277
  * @returns {LensflareNode}
278
278
  */
279
- export const lensflare = ( node, params ) => nodeObject( new LensflareNode( convertToTexture( node ), params ) );
279
+ export const lensflare = ( node, params ) => new LensflareNode( convertToTexture( node ), params );
@@ -106,4 +106,4 @@ export default Lut3DNode;
106
106
  * @param {Node<float> | number} intensity - Controls the intensity of the effect.
107
107
  * @returns {Lut3DNode}
108
108
  */
109
- export const lut3D = ( node, lut, size, intensity ) => nodeObject( new Lut3DNode( nodeObject( node ), nodeObject( lut ), size, nodeObject( intensity ) ) );
109
+ export const lut3D = ( node, lut, size, intensity ) => new Lut3DNode( nodeObject( node ), nodeObject( lut ), size, nodeObject( intensity ) );
@@ -13,7 +13,7 @@ let _rendererState;
13
13
  * gives you great flexibility in composing the final outline look depending on
14
14
  * your requirements.
15
15
  * ```js
16
- * const postProcessing = new THREE.PostProcessing( renderer );
16
+ * const renderPipeline = new THREE.RenderPipeline( renderer );
17
17
  *
18
18
  * const scenePass = pass( scene, camera );
19
19
  *
@@ -36,7 +36,7 @@ let _rendererState;
36
36
  * const { visibleEdge, hiddenEdge } = outlinePass;
37
37
  * const outlineColor = visibleEdge.mul( visibleEdgeColor ).add( hiddenEdge.mul( hiddenEdgeColor ) ).mul( edgeStrength );
38
38
  *
39
- * postProcessing.outputNode = outlineColor.add( scenePass );
39
+ * renderPipeline.outputNode = outlineColor.add( scenePass );
40
40
  * ```
41
41
  *
42
42
  * @augments TempNode
@@ -759,4 +759,4 @@ export default OutlineNode;
759
759
  * @param {number} [params.downSampleRatio=2] - The downsample ratio.
760
760
  * @returns {OutlineNode}
761
761
  */
762
- export const outline = ( scene, camera, params ) => nodeObject( new OutlineNode( scene, camera, params ) );
762
+ export const outline = ( scene, camera, params ) => new OutlineNode( scene, camera, params );
@@ -1,5 +1,5 @@
1
1
  import { NodeMaterial } from 'three/webgpu';
2
- import { nodeObject, Fn, vec4, uv, If, mod, screenCoordinate } from 'three/tsl';
2
+ import { Fn, vec4, uv, If, mod, screenCoordinate } from 'three/tsl';
3
3
  import StereoCompositePassNode from './StereoCompositePassNode.js';
4
4
 
5
5
  /**
@@ -86,4 +86,4 @@ export default ParallaxBarrierPassNode;
86
86
  * @param {Camera} camera - The camera to render the scene with.
87
87
  * @returns {ParallaxBarrierPassNode}
88
88
  */
89
- export const parallaxBarrierPass = ( scene, camera ) => nodeObject( new ParallaxBarrierPassNode( scene, camera ) );
89
+ export const parallaxBarrierPass = ( scene, camera ) => new ParallaxBarrierPassNode( scene, camera );