@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
@@ -74,18 +74,19 @@ class PixelationNode extends TempNode {
74
74
  /**
75
75
  * Uniform node that represents the resolution.
76
76
  *
77
+ * @private
77
78
  * @type {Node<vec4>}
78
79
  */
79
80
  this._resolution = uniform( new Vector4() );
80
81
 
81
82
  /**
82
- * The `updateBeforeType` is set to `NodeUpdateType.FRAME` since the node updates
83
+ * The `updateType` is set to `NodeUpdateType.FRAME` since the node updates
83
84
  * its internal uniforms once per frame in `updateBefore()`.
84
85
  *
85
86
  * @type {string}
86
87
  * @default 'frame'
87
88
  */
88
- this.updateBeforeType = NodeUpdateType.FRAME;
89
+ this.updateType = NodeUpdateType.FRAME;
89
90
 
90
91
  }
91
92
 
@@ -94,7 +95,7 @@ class PixelationNode extends TempNode {
94
95
  *
95
96
  * @param {NodeFrame} frame - The current node frame.
96
97
  */
97
- updateBefore() {
98
+ update() {
98
99
 
99
100
  const map = this.textureNode.value;
100
101
 
@@ -193,7 +194,7 @@ class PixelationNode extends TempNode {
193
194
 
194
195
  const nei = property( 'float', 'nei' );
195
196
 
196
- If( this.normalEdgeStrength.greaterThan( 0.0 ), () => {
197
+ If( this.normalEdgeStrength.greaterThan( 0.0 ).and( normal.length().greaterThan( 0 ) ), () => {
197
198
 
198
199
  nei.assign( normalEdgeIndicator( depth, normal ) );
199
200
 
@@ -213,7 +214,7 @@ class PixelationNode extends TempNode {
213
214
 
214
215
  }
215
216
 
216
- const pixelation = ( node, depthNode, normalNode, pixelSize = 6, normalEdgeStrength = 0.3, depthEdgeStrength = 0.4 ) => nodeObject( new PixelationNode( convertToTexture( node ), convertToTexture( depthNode ), convertToTexture( normalNode ), nodeObject( pixelSize ), nodeObject( normalEdgeStrength ), nodeObject( depthEdgeStrength ) ) );
217
+ const pixelation = ( node, depthNode, normalNode, pixelSize = 6, normalEdgeStrength = 0.3, depthEdgeStrength = 0.4 ) => new PixelationNode( convertToTexture( node ), convertToTexture( depthNode ), convertToTexture( normalNode ), nodeObject( pixelSize ), nodeObject( normalEdgeStrength ), nodeObject( depthEdgeStrength ) );
217
218
 
218
219
  /**
219
220
  * A special render pass node that renders the scene with a pixelation effect.
@@ -329,6 +330,6 @@ class PixelationPassNode extends PassNode {
329
330
  * @param {Node<float> | number} [depthEdgeStrength=0.4] - The depth edge strength.
330
331
  * @returns {PixelationPassNode}
331
332
  */
332
- export const pixelationPass = ( scene, camera, pixelSize, normalEdgeStrength, depthEdgeStrength ) => nodeObject( new PixelationPassNode( scene, camera, pixelSize, normalEdgeStrength, depthEdgeStrength ) );
333
+ export const pixelationPass = ( scene, camera, pixelSize, normalEdgeStrength, depthEdgeStrength ) => new PixelationPassNode( scene, camera, pixelSize, normalEdgeStrength, depthEdgeStrength );
333
334
 
334
335
  export default PixelationPassNode;
@@ -1,5 +1,5 @@
1
1
  import { TempNode } from 'three/webgpu';
2
- import { nodeObject, Fn, uv, uniform, vec2, sin, cos, vec4, convertToTexture } from 'three/tsl';
2
+ import { Fn, uv, uniform, vec2, sin, cos, vec4, convertToTexture } from 'three/tsl';
3
3
 
4
4
  /**
5
5
  * Post processing node for shifting/splitting RGB color channels. The effect
@@ -93,4 +93,4 @@ export default RGBShiftNode;
93
93
  * @param {number} [angle=0] - Defines in which direction colors are shifted.
94
94
  * @returns {RGBShiftNode}
95
95
  */
96
- export const rgbShift = ( node, amount, angle ) => nodeObject( new RGBShiftNode( convertToTexture( node ), amount, angle ) );
96
+ export const rgbShift = ( node, amount, angle ) => new RGBShiftNode( convertToTexture( node ), amount, angle );
@@ -0,0 +1,263 @@
1
+ import { MeshBasicNodeMaterial, PassNode, UnsignedByteType, NearestFilter, CubeMapNode, MeshPhongNodeMaterial } from 'three/webgpu';
2
+ import { float, vec2, vec4, Fn, uv, varying, cameraProjectionMatrix, cameraViewMatrix, positionWorld, screenSize, materialColor, uint, texture, uniform, context, reflectVector } from 'three/tsl';
3
+
4
+ const _affineUv = varying( vec2() );
5
+ const _w = varying( float() );
6
+
7
+ const _clipSpaceRetro = Fn( () => {
8
+
9
+ const defaultPosition = cameraProjectionMatrix
10
+ .mul( cameraViewMatrix )
11
+ .mul( positionWorld );
12
+
13
+ const roundedPosition = defaultPosition.xy
14
+ .div( defaultPosition.w.mul( 2 ) )
15
+ .mul( screenSize.xy )
16
+ .round()
17
+ .div( screenSize.xy )
18
+ .mul( defaultPosition.w.mul( 2 ) );
19
+
20
+ _affineUv.assign( uv().mul( defaultPosition.w ) );
21
+ _w.assign( defaultPosition.w );
22
+
23
+ return vec4( roundedPosition.xy, defaultPosition.zw );
24
+
25
+ } )();
26
+
27
+ /**
28
+ * A post-processing pass that applies a retro PS1-style effect to the scene.
29
+ *
30
+ * This node renders the scene with classic PlayStation 1 visual characteristics:
31
+ * - **Vertex snapping**: Vertices are snapped to screen pixels, creating the iconic "wobbly" geometry
32
+ * - **Affine texture mapping**: Textures are sampled without perspective correction, resulting in distortion effects
33
+ * - **Low resolution**: Default 0.25 scale (typical 320x240 equivalent)
34
+ * - **Nearest-neighbor filtering**: Sharp pixelated textures without smoothing
35
+ *
36
+ * @augments PassNode
37
+ */
38
+ class RetroPassNode extends PassNode {
39
+
40
+ /**
41
+ * Creates a new RetroPassNode instance.
42
+ *
43
+ * @param {Scene} scene - The scene to render.
44
+ * @param {Camera} camera - The camera to render from.
45
+ * @param {Object} [options={}] - Additional options for the retro pass.
46
+ * @param {Node} [options.affineDistortion=null] - An optional node to apply affine distortion to UVs.
47
+ */
48
+ constructor( scene, camera, options = {} ) {
49
+
50
+ super( PassNode.COLOR, scene, camera );
51
+
52
+ const {
53
+ affineDistortion = null,
54
+ filterTextures = false
55
+ } = options;
56
+
57
+ this.setResolutionScale( .25 );
58
+
59
+ this.renderTarget.texture.type = UnsignedByteType;
60
+ this.renderTarget.texture.magFilter = NearestFilter;
61
+ this.renderTarget.texture.minFilter = NearestFilter;
62
+
63
+ this.affineDistortionNode = affineDistortion;
64
+
65
+ this.filterTextures = filterTextures;
66
+
67
+ this._materialCache = new Map();
68
+
69
+ }
70
+
71
+ /**
72
+ * Updates the retro pass before rendering.
73
+ *
74
+ * @override
75
+ * @param {Frame} frame - The current frame information.
76
+ * @returns {void}
77
+ */
78
+ updateBefore( frame ) {
79
+
80
+ const renderer = frame.renderer;
81
+
82
+ const currentRenderObjectFunction = renderer.getRenderObjectFunction();
83
+
84
+ renderer.setRenderObjectFunction( ( object, scene, camera, geometry, material, ...params ) => {
85
+
86
+ const retroMaterialData = this._materialCache.get( material );
87
+
88
+ let retroMaterial;
89
+
90
+ if ( retroMaterialData === undefined || retroMaterialData.version !== material.version ) {
91
+
92
+ if ( retroMaterialData !== undefined ) {
93
+
94
+ retroMaterialData.material.dispose();
95
+
96
+ }
97
+
98
+ if ( material.isMeshBasicMaterial || material.isMeshBasicNodeMaterial ) {
99
+
100
+ retroMaterial = new MeshBasicNodeMaterial();
101
+
102
+ } else {
103
+
104
+ retroMaterial = new MeshPhongNodeMaterial();
105
+
106
+ }
107
+
108
+ retroMaterial.colorNode = material.colorNode || null;
109
+ retroMaterial.opacityNode = material.opacityNode || null;
110
+ retroMaterial.positionNode = material.positionNode || null;
111
+ retroMaterial.vertexNode = material.vertexNode || _clipSpaceRetro;
112
+
113
+ let colorNode = material.colorNode || materialColor;
114
+
115
+ if ( material.isMeshStandardNodeMaterial || material.isMeshStandardMaterial ) {
116
+
117
+ const envMap = material.envMap || scene.environment;
118
+
119
+ if ( envMap ) {
120
+
121
+ const reflection = new CubeMapNode( texture( envMap ) );
122
+
123
+ let metalness;
124
+
125
+ if ( material.metalnessNode ) {
126
+
127
+ metalness = material.metalnessNode;
128
+
129
+ } else {
130
+
131
+ metalness = uniform( material.metalness ).onRenderUpdate( ( { material } ) => material.metalness );
132
+
133
+ if ( material.metalnessMap ) {
134
+
135
+ const textureUniform = texture( material.metalnessMap ).onRenderUpdate( ( { material } ) => material.metalnessMap );
136
+
137
+ metalness = metalness.mul( textureUniform.b );
138
+
139
+ }
140
+
141
+ }
142
+
143
+ colorNode = metalness.mix( colorNode, reflection );
144
+
145
+ }
146
+
147
+ }
148
+
149
+ retroMaterial.colorNode = colorNode;
150
+
151
+ //
152
+
153
+ const contextData = {};
154
+
155
+ if ( this.affineDistortionNode ) {
156
+
157
+ contextData.getUV = ( texture ) => {
158
+
159
+ let finalUV;
160
+
161
+ if ( texture.isCubeTextureNode ) {
162
+
163
+ finalUV = reflectVector;
164
+
165
+ } else {
166
+
167
+ finalUV = this.affineDistortionNode.mix( uv(), _affineUv.div( _w ) );
168
+
169
+ }
170
+
171
+ return finalUV;
172
+
173
+ };
174
+
175
+ }
176
+
177
+ if ( this.filterTextures !== true ) {
178
+
179
+ contextData.getTextureLevel = () => uint( 0 );
180
+
181
+ }
182
+
183
+ retroMaterial.contextNode = context( contextData );
184
+
185
+ //
186
+
187
+ this._materialCache.set( material, {
188
+ material: retroMaterial,
189
+ version: material.version
190
+ } );
191
+
192
+ } else {
193
+
194
+ retroMaterial = retroMaterialData.material;
195
+
196
+ }
197
+
198
+ for ( const property in material ) {
199
+
200
+ if ( retroMaterial[ property ] === undefined ) continue;
201
+
202
+ retroMaterial[ property ] = material[ property ];
203
+
204
+ }
205
+
206
+ renderer.renderObject( object, scene, camera, geometry, retroMaterial, ...params );
207
+
208
+ } );
209
+
210
+ super.updateBefore( frame );
211
+
212
+ renderer.setRenderObjectFunction( currentRenderObjectFunction );
213
+
214
+ }
215
+
216
+ /**
217
+ * Disposes the retro pass and its internal resources.
218
+ *
219
+ * @override
220
+ * @returns {void}
221
+ */
222
+ dispose() {
223
+
224
+ super.dispose();
225
+
226
+ this._materialCache.forEach( ( data ) => {
227
+
228
+ data.material.dispose();
229
+
230
+ } );
231
+
232
+ this._materialCache.clear();
233
+
234
+ }
235
+
236
+ }
237
+
238
+ export default RetroPassNode;
239
+
240
+ /**
241
+ * Creates a new RetroPassNode instance for PS1-style rendering.
242
+ *
243
+ * The retro pass applies vertex snapping, affine texture mapping, and low-resolution
244
+ * rendering to achieve an authentic PlayStation 1 aesthetic. Combine with other
245
+ * post-processing effects like dithering, posterization, and scanlines for full retro look.
246
+ *
247
+ * ```js
248
+ * // Combined with other effects
249
+ * let pipeline = retroPass( scene, camera );
250
+ * pipeline = bayerDither( pipeline, 32 );
251
+ * pipeline = posterize( pipeline, 32 );
252
+ * renderPipeline.outputNode = pipeline;
253
+ * ```
254
+ *
255
+ * @tsl
256
+ * @function
257
+ * @param {Scene} scene - The scene to render.
258
+ * @param {Camera} camera - The camera to render from.
259
+ * @param {Object} [options={}] - Additional options for the retro pass.
260
+ * @param {Node} [options.affineDistortion=null] - An optional node to apply affine distortion to UVs.
261
+ * @return {RetroPassNode} A new RetroPassNode instance.
262
+ */
263
+ export const retroPass = ( scene, camera, options = {} ) => new RetroPassNode( scene, camera, options );
@@ -1,5 +1,5 @@
1
1
  import { HalfFloatType, LinearFilter, NearestFilter, RenderTarget, Texture, Vector2, QuadMesh, NodeMaterial, TempNode, RendererUtils } from 'three/webgpu';
2
- import { abs, nodeObject, Fn, NodeUpdateType, uv, uniform, convertToTexture, varyingProperty, vec2, vec4, modelViewProjection, passTexture, max, step, dot, float, texture, If, Loop, int, Break, sqrt, sign, mix } from 'three/tsl';
2
+ import { abs, Fn, NodeUpdateType, uv, uniform, convertToTexture, varyingProperty, vec2, vec4, modelViewProjection, passTexture, max, step, dot, float, texture, If, Loop, int, Break, sqrt, sign, mix } from 'three/tsl';
3
3
 
4
4
  const _quadMesh = /*@__PURE__*/ new QuadMesh();
5
5
  const _size = /*@__PURE__*/ new Vector2();
@@ -765,4 +765,4 @@ export default SMAANode;
765
765
  * @param {Node<vec4>} node - The node that represents the input of the effect.
766
766
  * @returns {SMAANode}
767
767
  */
768
- export const smaa = ( node ) => nodeObject( new SMAANode( convertToTexture( node ) ) );
768
+ export const smaa = ( node ) => new SMAANode( convertToTexture( node ) );
@@ -1,5 +1,5 @@
1
1
  import { AdditiveBlending, Color, Vector2, RendererUtils, PassNode, QuadMesh, NodeMaterial } from 'three/webgpu';
2
- import { nodeObject, uniform, mrt, texture, getTextureIndex, unpremultiplyAlpha } from 'three/tsl';
2
+ import { uniform, mrt, texture, getTextureIndex, unpremultiplyAlpha } from 'three/tsl';
3
3
 
4
4
  const _size = /*@__PURE__*/ new Vector2();
5
5
 
@@ -355,4 +355,4 @@ const _JitterVectors = [
355
355
  * @param {Camera} camera - The camera to render the scene with.
356
356
  * @returns {SSAAPassNode}
357
357
  */
358
- export const ssaaPass = ( scene, camera ) => nodeObject( new SSAAPassNode( scene, camera ) );
358
+ export const ssaaPass = ( scene, camera ) => new SSAAPassNode( scene, camera );
@@ -1,5 +1,5 @@
1
1
  import { RenderTarget, Vector2, TempNode, QuadMesh, NodeMaterial, RendererUtils, MathUtils } from 'three/webgpu';
2
- import { clamp, normalize, reference, nodeObject, Fn, NodeUpdateType, uniform, vec4, passTexture, uv, logarithmicDepthToViewZ, viewZToPerspectiveDepth, getViewPosition, screenCoordinate, float, sub, fract, dot, vec2, rand, vec3, Loop, mul, PI, cos, sin, uint, cross, acos, sign, pow, luminance, If, max, abs, Break, sqrt, HALF_PI, div, ceil, shiftRight, convertToTexture, bool, getNormalFromDepth, interleavedGradientNoise } from 'three/tsl';
2
+ import { clamp, normalize, reference, Fn, NodeUpdateType, uniform, vec4, passTexture, uv, logarithmicDepthToViewZ, viewZToPerspectiveDepth, getViewPosition, screenCoordinate, float, sub, fract, dot, vec2, rand, vec3, Loop, mul, PI, cos, sin, uint, cross, acos, sign, pow, luminance, If, max, abs, Break, sqrt, HALF_PI, div, ceil, shiftRight, convertToTexture, bool, getNormalFromDepth, countOneBits, interleavedGradientNoise } from 'three/tsl';
3
3
 
4
4
  const _quadMesh = /*@__PURE__*/ new QuadMesh();
5
5
  const _size = /*@__PURE__*/ new Vector2();
@@ -197,6 +197,7 @@ class SSGINode extends TempNode {
197
197
  /**
198
198
  * The resolution of the effect.
199
199
  *
200
+ * @private
200
201
  * @type {UniformNode<vec2>}
201
202
  */
202
203
  this._resolution = uniform( new Vector2() );
@@ -204,6 +205,7 @@ class SSGINode extends TempNode {
204
205
  /**
205
206
  * Used to compute the effective step radius when viewSpaceSampling is `false`.
206
207
  *
208
+ * @private
207
209
  * @type {UniformNode<vec2>}
208
210
  */
209
211
  this._halfProjScale = uniform( 1 );
@@ -211,6 +213,7 @@ class SSGINode extends TempNode {
211
213
  /**
212
214
  * Temporal direction that influences the rotation angle for each slice.
213
215
  *
216
+ * @private
214
217
  * @type {UniformNode<float>}
215
218
  */
216
219
  this._temporalDirection = uniform( 0 );
@@ -218,6 +221,7 @@ class SSGINode extends TempNode {
218
221
  /**
219
222
  * Temporal offset added to the initial ray step.
220
223
  *
224
+ * @private
221
225
  * @type {UniformNode<float>}
222
226
  */
223
227
  this._temporalOffset = uniform( 0 );
@@ -431,22 +435,6 @@ class SSGINode extends TempNode {
431
435
  ]
432
436
  } );
433
437
 
434
- const bitCount = Fn( ( [ value ] ) => {
435
-
436
- const v = uint( value );
437
- v.assign( v.sub( v.shiftRight( uint( 1 ) ).bitAnd( uint( 0x55555555 ) ) ) );
438
- v.assign( v.bitAnd( uint( 0x33333333 ) ).add( v.shiftRight( uint( 2 ) ).bitAnd( uint( 0x33333333 ) ) ) );
439
-
440
- return v.add( v.shiftRight( uint( 4 ) ) ).bitAnd( uint( 0xF0F0F0F ) ).mul( uint( 0x1010101 ) ).shiftRight( uint( 24 ) );
441
-
442
- } ).setLayout( {
443
- name: 'bitCount',
444
- type: 'uint',
445
- inputs: [
446
- { name: 'value', type: 'uint' }
447
- ]
448
- } );
449
-
450
438
  const horizonSampling = Fn( ( [ directionIsRight, RADIUS, viewPosition, slideDirTexelSize, initialRayStep, uvNode, viewDir, viewNormal, n ] ) => {
451
439
 
452
440
  const STEP_COUNT = this.stepCount.toConst();
@@ -509,7 +497,7 @@ class SSGINode extends TempNode {
509
497
  currentOccludedBitfield = currentOccludedBitfield.bitAnd( globalOccludedBitfield.bitNot() );
510
498
 
511
499
  globalOccludedBitfield.assign( globalOccludedBitfield.bitOr( currentOccludedBitfield ) );
512
- const numOccludedZones = bitCount( currentOccludedBitfield );
500
+ const numOccludedZones = countOneBits( currentOccludedBitfield );
513
501
 
514
502
  //
515
503
 
@@ -593,7 +581,7 @@ class SSGINode extends TempNode {
593
581
  color.addAssign( horizonSampling( bool( true ), RADIUS, viewPosition, slideDirTexelSize, initialRayStep, uvNode, viewDir, viewNormal, n ) );
594
582
  color.addAssign( horizonSampling( bool( false ), RADIUS, viewPosition, slideDirTexelSize, initialRayStep, uvNode, viewDir, viewNormal, n ) );
595
583
 
596
- ao.addAssign( float( bitCount( globalOccludedBitfield ) ).div( float( MAX_RAY ) ) );
584
+ ao.addAssign( float( countOneBits( globalOccludedBitfield ) ).div( float( MAX_RAY ) ) );
597
585
 
598
586
  } );
599
587
 
@@ -651,4 +639,4 @@ export default SSGINode;
651
639
  * @param {Camera} camera - The camera the scene is rendered with.
652
640
  * @returns {SSGINode}
653
641
  */
654
- export const ssgi = ( beautyNode, depthNode, normalNode, camera ) => nodeObject( new SSGINode( convertToTexture( beautyNode ), depthNode, normalNode, camera ) );
642
+ export const ssgi = ( beautyNode, depthNode, normalNode, camera ) => new SSGINode( convertToTexture( beautyNode ), depthNode, normalNode, camera );
@@ -1,5 +1,5 @@
1
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';
2
+ import { texture, reference, viewZToPerspectiveDepth, logarithmicDepthToViewZ, getScreenPosition, getViewPosition, 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
3
  import { boxBlur } from './boxBlur.js';
4
4
 
5
5
  const _quadMesh = /*@__PURE__*/ new QuadMesh();
@@ -206,7 +206,7 @@ class SSRNode extends TempNode {
206
206
  * @private
207
207
  * @type {UniformNode<bool>}
208
208
  */
209
- this._isPerspectiveCamera = uniform( camera.isPerspectiveCamera );
209
+ this._isPerspectiveCamera = uniform( camera.isPerspectiveCamera === true );
210
210
 
211
211
  /**
212
212
  * The resolution of the pass.
@@ -275,7 +275,8 @@ class SSRNode extends TempNode {
275
275
  if ( this.roughnessNode !== null ) {
276
276
 
277
277
  const mips = this._blurRenderTarget.texture.mipmaps.length - 1;
278
- const lod = float( this.roughnessNode ).mul( mips ).clamp( 0, mips );
278
+ const r = float( this.roughnessNode );
279
+ const lod = r.mul( r ).mul( mips ).clamp( 0, mips );
279
280
 
280
281
  blurredTextureNode = passTexture( this, this._blurRenderTarget.texture ).level( lod );
281
282
 
@@ -399,10 +400,9 @@ class SSRNode extends TempNode {
399
400
  // https://en.wikipedia.org/wiki/Plane_(geometry)
400
401
  // http://paulbourke.net/geometry/pointlineplane/
401
402
 
403
+ // planeNormal is already normalized, so denominator is 1
402
404
  const d = mul( planeNormal.x, planePoint.x ).add( mul( planeNormal.y, planePoint.y ) ).add( mul( planeNormal.z, planePoint.z ) ).negate().toVar();
403
-
404
- const denominator = sqrt( mul( planeNormal.x, planeNormal.x, ).add( mul( planeNormal.y, planeNormal.y ) ).add( mul( planeNormal.z, planeNormal.z ) ) ).toVar();
405
- const distance = div( mul( planeNormal.x, point.x ).add( mul( planeNormal.y, point.y ) ).add( mul( planeNormal.z, point.z ) ).add( d ), denominator );
405
+ const distance = mul( planeNormal.x, point.x ).add( mul( planeNormal.y, point.y ) ).add( mul( planeNormal.z, point.z ) ).add( d );
406
406
  return distance;
407
407
 
408
408
  } );
@@ -589,7 +589,7 @@ class SSRNode extends TempNode {
589
589
 
590
590
  // output
591
591
  const reflectColor = this.colorNode.sample( uvNode );
592
- output.assign( vec4( reflectColor.rgb, op ) );
592
+ output.assign( vec4( reflectColor.rgb.mul( op ), 1 ) );
593
593
  Break();
594
594
 
595
595
  } );
@@ -653,4 +653,4 @@ export default SSRNode;
653
653
  * @param {?Camera} [camera=null] - The camera the scene is rendered with.
654
654
  * @returns {SSRNode}
655
655
  */
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 ) );
656
+ export const ssr = ( colorNode, depthNode, normalNode, metalnessNode, roughnessNode = null, camera = null ) => new SSRNode( nodeObject( colorNode ), nodeObject( depthNode ), nodeObject( normalNode ), nodeObject( metalnessNode ), nodeObject( roughnessNode ), camera );
@@ -1,5 +1,5 @@
1
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, nodeObject, Fn, passTexture, uv, uniform, perspectiveDepthToViewZ, orthographicDepthToViewZ, vec2, lightPosition, lightTargetPosition, fract, rand, mix } from 'three/tsl';
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 } from 'three/tsl';
3
3
 
4
4
  const _quadMesh = /*@__PURE__*/ new QuadMesh();
5
5
  const _size = /*@__PURE__*/ new Vector2();
@@ -90,9 +90,9 @@ class SSSNode extends TempNode {
90
90
  * Shadow intensity. Must be in the range `[0, 1]`.
91
91
  *
92
92
  * @type {UniformNode<float>}
93
- * @default 0.5
93
+ * @default 1.0
94
94
  */
95
- this.shadowIntensity = uniform( 0.5, 'float' );
95
+ this.shadowIntensity = uniform( 1.0, 'float' );
96
96
 
97
97
  /**
98
98
  * This parameter controls how detailed the raymarching process works.
@@ -192,6 +192,7 @@ class SSSNode extends TempNode {
192
192
  /**
193
193
  * Temporal offset added to the initial ray step.
194
194
  *
195
+ * @private
195
196
  * @type {UniformNode<float>}
196
197
  */
197
198
  this._temporalOffset = uniform( 0 );
@@ -199,6 +200,7 @@ class SSSNode extends TempNode {
199
200
  /**
200
201
  * The frame ID use when temporal filtering is enabled.
201
202
  *
203
+ * @private
202
204
  * @type {UniformNode<uint>}
203
205
  */
204
206
  this._frameId = uniform( 0 );
@@ -485,4 +487,4 @@ export default SSSNode;
485
487
  * @param {DirectionalLight} mainLight - The main directional light of the scene.
486
488
  * @returns {SSSNode}
487
489
  */
488
- export const sss = ( depthNode, camera, mainLight ) => nodeObject( new SSSNode( depthNode, camera, mainLight ) );
490
+ export const sss = ( depthNode, camera, mainLight ) => new SSSNode( depthNode, camera, mainLight );
@@ -0,0 +1,29 @@
1
+ import { Fn, float, length, smoothstep, uv } from 'three/tsl';
2
+
3
+ /**
4
+ * Returns a radial gradient from center (white) to edges (black).
5
+ * Useful for masking effects based on distance from center.
6
+ *
7
+ * @tsl
8
+ * @function
9
+ * @param {Node<float>} [scale=1.0] - Controls the size of the gradient (0 = all black, 1 = full circle).
10
+ * @param {Node<float>} [softness=0.5] - Controls the edge softness (0 = hard edge, 1 = soft gradient).
11
+ * @param {Node<vec2>} [coord=uv()] - The input UV coordinates.
12
+ * @return {Node<float>} 1.0 at center, 0.0 at edges.
13
+ */
14
+ export const circle = Fn( ( [ scale = float( 1.0 ), softness = float( 0.5 ), coord = uv() ] ) => {
15
+
16
+ // Center UV coordinates (-0.5 to 0.5)
17
+ const centered = coord.sub( 0.5 );
18
+
19
+ // Calculate distance from center (0 at center, ~0.707 at corners)
20
+ const dist = length( centered ).mul( 2.0 );
21
+
22
+ // Calculate inner and outer edges based on scale and softness
23
+ const outer = scale;
24
+ const inner = scale.sub( softness.mul( scale ) );
25
+
26
+ // Smoothstep for soft/hard transition
27
+ return smoothstep( outer, inner, dist );
28
+
29
+ } );
@@ -1,5 +1,5 @@
1
1
  import { Vector2, TempNode, NodeUpdateType } from 'three/webgpu';
2
- import { nodeObject, Fn, uv, uniform, convertToTexture, vec2, vec3, vec4, mat3, luminance, add } from 'three/tsl';
2
+ import { Fn, uv, uniform, convertToTexture, vec2, vec3, vec4, mat3, luminance, add } from 'three/tsl';
3
3
 
4
4
  /**
5
5
  * Post processing node for detecting edges with a sobel filter.
@@ -165,4 +165,4 @@ export default SobelOperatorNode;
165
165
  * @param {Node<vec4>} node - The node that represents the input of the effect.
166
166
  * @returns {SobelOperatorNode}
167
167
  */
168
- export const sobel = ( node ) => nodeObject( new SobelOperatorNode( convertToTexture( node ) ) );
168
+ export const sobel = ( node ) => new SobelOperatorNode( convertToTexture( node ) );
@@ -50,11 +50,13 @@ class StereoCompositePassNode extends PassNode {
50
50
  * @type {StereoCamera}
51
51
  */
52
52
  this.stereo = new StereoCamera();
53
+
53
54
  const _params = { minFilter: LinearFilter, magFilter: NearestFilter, type: HalfFloatType };
54
55
 
55
56
  /**
56
57
  * The render target for rendering the left eye's view.
57
58
  *
59
+ * @private
58
60
  * @type {RenderTarget}
59
61
  */
60
62
  this._renderTargetL = new RenderTarget( 1, 1, _params );
@@ -62,6 +64,7 @@ class StereoCompositePassNode extends PassNode {
62
64
  /**
63
65
  * The render target for rendering the right eye's view.
64
66
  *
67
+ * @private
65
68
  * @type {RenderTarget}
66
69
  */
67
70
  this._renderTargetR = new RenderTarget( 1, 1, _params );
@@ -69,6 +72,7 @@ class StereoCompositePassNode extends PassNode {
69
72
  /**
70
73
  * A texture node representing the left's eye view.
71
74
  *
75
+ * @private
72
76
  * @type {TextureNode}
73
77
  */
74
78
  this._mapLeft = texture( this._renderTargetL.texture );
@@ -76,6 +80,7 @@ class StereoCompositePassNode extends PassNode {
76
80
  /**
77
81
  * A texture node representing the right's eye view.
78
82
  *
83
+ * @private
79
84
  * @type {TextureNode}
80
85
  */
81
86
  this._mapRight = texture( this._renderTargetR.texture );
@@ -84,7 +89,9 @@ class StereoCompositePassNode extends PassNode {
84
89
  * The node material that implements the composite. All
85
90
  * derived effect passes must provide an instance for rendering.
86
91
  *
87
- * @type {NodeMaterial}
92
+ * @private
93
+ * @type {?NodeMaterial}
94
+ * @default null
88
95
  */
89
96
  this._material = null;
90
97
 
@@ -1,5 +1,4 @@
1
1
  import { StereoCamera, Vector2, PassNode, RendererUtils } from 'three/webgpu';
2
- import { nodeObject } from 'three/tsl';
3
2
 
4
3
  const _size = /*@__PURE__*/ new Vector2();
5
4
 
@@ -117,4 +116,4 @@ export default StereoPassNode;
117
116
  * @param {Camera} camera - The camera to render the scene with.
118
117
  * @returns {StereoPassNode}
119
118
  */
120
- export const stereoPass = ( scene, camera ) => nodeObject( new StereoPassNode( scene, camera ) );
119
+ export const stereoPass = ( scene, camera ) => new StereoPassNode( scene, camera );