super-three 0.181.0 → 0.184.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 (539) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +3 -4
  3. package/build/three.cjs +13152 -11354
  4. package/build/three.core.js +12319 -11539
  5. package/build/three.core.min.js +2 -2
  6. package/build/three.module.js +1808 -781
  7. package/build/three.module.min.js +2 -2
  8. package/build/three.tsl.js +27 -13
  9. package/build/three.tsl.min.js +2 -2
  10. package/build/three.webgpu.js +10523 -6263
  11. package/build/three.webgpu.min.js +2 -2
  12. package/build/three.webgpu.nodes.js +10484 -6262
  13. package/build/three.webgpu.nodes.min.js +2 -2
  14. package/examples/jsm/Addons.js +11 -3
  15. package/examples/jsm/animation/CCDIKSolver.js +7 -3
  16. package/examples/jsm/controls/ArcballControls.js +7 -4
  17. package/examples/jsm/controls/DragControls.js +2 -2
  18. package/examples/jsm/controls/FirstPersonControls.js +58 -54
  19. package/examples/jsm/controls/FlyControls.js +4 -0
  20. package/examples/jsm/controls/MapControls.js +55 -1
  21. package/examples/jsm/controls/OrbitControls.js +111 -8
  22. package/examples/jsm/controls/TrackballControls.js +8 -8
  23. package/examples/jsm/controls/TransformControls.js +34 -2
  24. package/examples/jsm/csm/CSM.js +2 -1
  25. package/examples/jsm/csm/CSMShadowNode.js +6 -2
  26. package/examples/jsm/effects/AnaglyphEffect.js +102 -7
  27. package/examples/jsm/environments/ColorEnvironment.js +59 -0
  28. package/examples/jsm/environments/RoomEnvironment.js +3 -0
  29. package/examples/jsm/exporters/EXRExporter.js +1 -1
  30. package/examples/jsm/exporters/GLTFExporter.js +152 -9
  31. package/examples/jsm/exporters/USDZExporter.js +22 -3
  32. package/examples/jsm/geometries/DecalGeometry.js +1 -1
  33. package/examples/jsm/geometries/TextGeometry.js +18 -0
  34. package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
  35. package/examples/jsm/helpers/LightProbeGridHelper.js +221 -0
  36. package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -1
  37. package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
  38. package/examples/jsm/helpers/ViewHelper.js +67 -8
  39. package/examples/jsm/inspector/Extension.js +13 -0
  40. package/examples/jsm/inspector/Inspector.js +203 -88
  41. package/examples/jsm/inspector/RendererInspector.js +14 -4
  42. package/examples/jsm/inspector/extensions/extensions.json +6 -0
  43. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +916 -0
  44. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +281 -0
  45. package/examples/jsm/inspector/tabs/Console.js +41 -7
  46. package/examples/jsm/inspector/tabs/Memory.js +128 -0
  47. package/examples/jsm/inspector/tabs/Parameters.js +51 -3
  48. package/examples/jsm/inspector/tabs/Performance.js +4 -4
  49. package/examples/jsm/inspector/tabs/Settings.js +264 -0
  50. package/examples/jsm/inspector/tabs/Timeline.js +1611 -0
  51. package/examples/jsm/inspector/tabs/Viewer.js +107 -5
  52. package/examples/jsm/inspector/ui/Graph.js +2 -2
  53. package/examples/jsm/inspector/ui/List.js +1 -1
  54. package/examples/jsm/inspector/ui/Profiler.js +1936 -34
  55. package/examples/jsm/inspector/ui/Style.js +1044 -31
  56. package/examples/jsm/inspector/ui/Tab.js +222 -3
  57. package/examples/jsm/inspector/ui/Values.js +55 -2
  58. package/examples/jsm/inspector/ui/utils.js +13 -0
  59. package/examples/jsm/interaction/InteractionManager.js +226 -0
  60. package/examples/jsm/libs/meshopt_decoder.module.js +9 -8
  61. package/examples/jsm/lighting/DynamicLighting.js +82 -0
  62. package/examples/jsm/lighting/LightProbeGrid.js +651 -0
  63. package/examples/jsm/lines/LineMaterial.js +7 -1
  64. package/examples/jsm/loaders/3DMLoader.js +5 -4
  65. package/examples/jsm/loaders/3MFLoader.js +2 -2
  66. package/examples/jsm/loaders/AMFLoader.js +2 -2
  67. package/examples/jsm/loaders/ColladaLoader.js +24 -4026
  68. package/examples/jsm/loaders/DRACOLoader.js +5 -5
  69. package/examples/jsm/loaders/EXRLoader.js +687 -48
  70. package/examples/jsm/loaders/FBXLoader.js +235 -37
  71. package/examples/jsm/loaders/GCodeLoader.js +34 -8
  72. package/examples/jsm/loaders/GLTFLoader.js +146 -178
  73. package/examples/jsm/loaders/HDRLoader.js +1 -2
  74. package/examples/jsm/loaders/KMZLoader.js +5 -5
  75. package/examples/jsm/loaders/KTX2Loader.js +27 -5
  76. package/examples/jsm/loaders/LDrawLoader.js +41 -50
  77. package/examples/jsm/loaders/LWOLoader.js +7 -39
  78. package/examples/jsm/loaders/NRRDLoader.js +2 -2
  79. package/examples/jsm/loaders/PCDLoader.js +4 -2
  80. package/examples/jsm/loaders/SVGLoader.js +2 -2
  81. package/examples/jsm/loaders/TDSLoader.js +0 -2
  82. package/examples/jsm/loaders/TGALoader.js +0 -2
  83. package/examples/jsm/loaders/USDLoader.js +100 -40
  84. package/examples/jsm/loaders/UltraHDRLoader.js +285 -160
  85. package/examples/jsm/loaders/VOXLoader.js +660 -117
  86. package/examples/jsm/loaders/VRMLLoader.js +79 -2
  87. package/examples/jsm/loaders/VTKLoader.js +42 -25
  88. package/examples/jsm/loaders/collada/ColladaComposer.js +3044 -0
  89. package/examples/jsm/loaders/collada/ColladaParser.js +1977 -0
  90. package/examples/jsm/loaders/usd/USDAParser.js +450 -363
  91. package/examples/jsm/loaders/usd/USDCParser.js +1867 -6
  92. package/examples/jsm/loaders/usd/USDComposer.js +4594 -0
  93. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
  94. package/examples/jsm/materials/WoodNodeMaterial.js +11 -11
  95. package/examples/jsm/math/Octree.js +131 -1
  96. package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
  97. package/examples/jsm/misc/RollerCoaster.js +42 -4
  98. package/examples/jsm/misc/Volume.js +0 -1
  99. package/examples/jsm/misc/VolumeSlice.js +0 -1
  100. package/examples/jsm/modifiers/TessellateModifier.js +1 -1
  101. package/examples/jsm/objects/LensflareMesh.js +1 -1
  102. package/examples/jsm/objects/Reflector.js +73 -25
  103. package/examples/jsm/objects/Sky.js +90 -6
  104. package/examples/jsm/objects/SkyMesh.js +150 -16
  105. package/examples/jsm/objects/Water.js +4 -3
  106. package/examples/jsm/objects/Water2.js +5 -3
  107. package/examples/jsm/objects/WaterMesh.js +5 -7
  108. package/examples/jsm/physics/AmmoPhysics.js +12 -7
  109. package/examples/jsm/physics/JoltPhysics.js +10 -6
  110. package/examples/jsm/physics/RapierPhysics.js +9 -5
  111. package/examples/jsm/postprocessing/EffectComposer.js +7 -5
  112. package/examples/jsm/postprocessing/OutputPass.js +9 -0
  113. package/examples/jsm/postprocessing/RenderPass.js +10 -0
  114. package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
  115. package/examples/jsm/postprocessing/UnrealBloomPass.js +48 -18
  116. package/examples/jsm/renderers/CSS3DRenderer.js +1 -1
  117. package/examples/jsm/renderers/Projector.js +246 -28
  118. package/examples/jsm/renderers/SVGRenderer.js +174 -60
  119. package/examples/jsm/shaders/GTAOShader.js +19 -6
  120. package/examples/jsm/shaders/HalftoneShader.js +12 -1
  121. package/examples/jsm/shaders/PoissonDenoiseShader.js +6 -2
  122. package/examples/jsm/shaders/SAOShader.js +17 -4
  123. package/examples/jsm/shaders/SSAOShader.js +11 -1
  124. package/examples/jsm/shaders/SSRShader.js +6 -5
  125. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -4
  126. package/examples/jsm/shaders/VignetteShader.js +1 -1
  127. package/examples/jsm/transpiler/AST.js +44 -0
  128. package/examples/jsm/transpiler/GLSLDecoder.js +63 -6
  129. package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
  130. package/examples/jsm/transpiler/TSLEncoder.js +46 -3
  131. package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
  132. package/examples/jsm/transpiler/WGSLEncoder.js +27 -0
  133. package/examples/jsm/tsl/WebGLNodesHandler.js +605 -0
  134. package/examples/jsm/tsl/display/AfterImageNode.js +11 -1
  135. package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
  136. package/examples/jsm/tsl/display/AnamorphicNode.js +12 -1
  137. package/examples/jsm/tsl/display/BilateralBlurNode.js +374 -0
  138. package/examples/jsm/tsl/display/BloomNode.js +16 -6
  139. package/examples/jsm/tsl/display/CRT.js +150 -0
  140. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +3 -36
  141. package/examples/jsm/tsl/display/DenoiseNode.js +1 -1
  142. package/examples/jsm/tsl/display/DepthOfFieldNode.js +1 -1
  143. package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
  144. package/examples/jsm/tsl/display/FSR1Node.js +477 -0
  145. package/examples/jsm/tsl/display/FXAANode.js +2 -2
  146. package/examples/jsm/tsl/display/GTAONode.js +6 -4
  147. package/examples/jsm/tsl/display/GaussianBlurNode.js +21 -2
  148. package/examples/jsm/tsl/display/GodraysNode.js +615 -0
  149. package/examples/jsm/tsl/display/LensflareNode.js +1 -1
  150. package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
  151. package/examples/jsm/tsl/display/OutlineNode.js +69 -19
  152. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
  153. package/examples/jsm/tsl/display/PixelationPassNode.js +7 -6
  154. package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
  155. package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
  156. package/examples/jsm/tsl/display/SMAANode.js +2 -2
  157. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
  158. package/examples/jsm/tsl/display/SSGINode.js +8 -24
  159. package/examples/jsm/tsl/display/SSRNode.js +8 -8
  160. package/examples/jsm/tsl/display/SSSNode.js +6 -4
  161. package/examples/jsm/tsl/display/Shape.js +29 -0
  162. package/examples/jsm/tsl/display/SharpenNode.js +283 -0
  163. package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
  164. package/examples/jsm/tsl/display/StereoCompositePassNode.js +8 -1
  165. package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
  166. package/examples/jsm/tsl/display/TAAUNode.js +835 -0
  167. package/examples/jsm/tsl/display/TRAANode.js +315 -126
  168. package/examples/jsm/tsl/display/TransitionNode.js +1 -1
  169. package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
  170. package/examples/jsm/tsl/display/radialBlur.js +68 -0
  171. package/examples/jsm/tsl/lighting/DynamicLightsNode.js +300 -0
  172. package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +61 -0
  173. package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +111 -0
  174. package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +99 -0
  175. package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +134 -0
  176. package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +161 -0
  177. package/examples/jsm/tsl/math/Bayer.js +53 -3
  178. package/examples/jsm/utils/BufferGeometryUtils.js +2 -3
  179. package/examples/jsm/utils/ColorUtils.js +76 -0
  180. package/examples/jsm/utils/LDrawUtils.js +1 -1
  181. package/examples/jsm/utils/ShadowMapViewer.js +24 -10
  182. package/examples/jsm/utils/ShadowMapViewerGPU.js +1 -1
  183. package/examples/jsm/utils/SkeletonUtils.js +14 -8
  184. package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
  185. package/examples/jsm/webxr/XRHandMeshModel.js +36 -10
  186. package/examples/jsm/webxr/XRHandModelFactory.js +2 -1
  187. package/package.json +24 -30
  188. package/src/Three.Core.js +3 -1
  189. package/src/Three.TSL.js +25 -11
  190. package/src/Three.WebGPU.Nodes.js +5 -0
  191. package/src/Three.WebGPU.js +9 -0
  192. package/src/Three.js +1 -0
  193. package/src/animation/AnimationAction.js +12 -2
  194. package/src/animation/AnimationClip.js +1 -1
  195. package/src/animation/AnimationMixer.js +6 -0
  196. package/src/animation/AnimationUtils.js +1 -12
  197. package/src/animation/KeyframeTrack.js +47 -8
  198. package/src/animation/PropertyMixer.js +4 -4
  199. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  200. package/src/animation/tracks/ColorKeyframeTrack.js +1 -1
  201. package/src/animation/tracks/NumberKeyframeTrack.js +1 -1
  202. package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -1
  203. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  204. package/src/animation/tracks/VectorKeyframeTrack.js +1 -1
  205. package/src/audio/Audio.js +1 -1
  206. package/src/audio/AudioContext.js +2 -2
  207. package/src/audio/AudioListener.js +5 -3
  208. package/src/cameras/Camera.js +32 -2
  209. package/src/cameras/CubeCamera.js +20 -0
  210. package/src/constants.js +90 -5
  211. package/src/core/BufferAttribute.js +13 -1
  212. package/src/core/BufferGeometry.js +14 -2
  213. package/src/core/Clock.js +7 -0
  214. package/src/core/Object3D.js +52 -4
  215. package/src/core/Raycaster.js +2 -2
  216. package/src/core/RenderTarget.js +4 -4
  217. package/src/extras/PMREMGenerator.js +7 -18
  218. package/src/extras/TextureUtils.js +5 -1
  219. package/src/extras/curves/CatmullRomCurve3.js +3 -2
  220. package/src/geometries/ExtrudeGeometry.js +2 -2
  221. package/src/geometries/PolyhedronGeometry.js +1 -1
  222. package/src/geometries/TorusGeometry.js +8 -3
  223. package/src/helpers/CameraHelper.js +3 -0
  224. package/src/helpers/DirectionalLightHelper.js +4 -1
  225. package/src/helpers/HemisphereLightHelper.js +3 -0
  226. package/src/helpers/PointLightHelper.js +1 -25
  227. package/src/helpers/SpotLightHelper.js +3 -0
  228. package/src/lights/DirectionalLight.js +13 -0
  229. package/src/lights/HemisphereLight.js +10 -0
  230. package/src/lights/Light.js +1 -11
  231. package/src/lights/LightProbe.js +0 -15
  232. package/src/lights/LightShadow.js +15 -6
  233. package/src/lights/PointLight.js +15 -0
  234. package/src/lights/PointLightShadow.js +0 -86
  235. package/src/lights/SpotLight.js +22 -1
  236. package/src/lights/webgpu/IESSpotLight.js +2 -1
  237. package/src/loaders/AudioLoader.js +11 -1
  238. package/src/loaders/Cache.js +28 -0
  239. package/src/loaders/DataTextureLoader.js +6 -4
  240. package/src/loaders/FileLoader.js +2 -3
  241. package/src/loaders/ImageBitmapLoader.js +12 -9
  242. package/src/loaders/Loader.js +6 -0
  243. package/src/loaders/MaterialLoader.js +3 -2
  244. package/src/loaders/ObjectLoader.js +46 -6
  245. package/src/loaders/nodes/NodeLoader.js +2 -2
  246. package/src/loaders/nodes/NodeObjectLoader.js +18 -0
  247. package/src/materials/Material.js +2 -0
  248. package/src/materials/MeshLambertMaterial.js +9 -0
  249. package/src/materials/MeshPhongMaterial.js +9 -0
  250. package/src/materials/MeshToonMaterial.js +1 -1
  251. package/src/materials/ShaderMaterial.js +20 -1
  252. package/src/materials/nodes/Line2NodeMaterial.js +34 -7
  253. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +5 -2
  254. package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -4
  255. package/src/materials/nodes/NodeMaterial.js +45 -25
  256. package/src/materials/nodes/manager/NodeMaterialObserver.js +191 -86
  257. package/src/math/Line3.js +6 -5
  258. package/src/math/MathUtils.js +10 -10
  259. package/src/math/Matrix2.js +13 -9
  260. package/src/math/Matrix3.js +13 -9
  261. package/src/math/Matrix4.js +87 -74
  262. package/src/math/Plane.js +4 -3
  263. package/src/math/Quaternion.js +3 -29
  264. package/src/math/Sphere.js +1 -1
  265. package/src/math/Triangle.js +1 -1
  266. package/src/math/Vector2.js +11 -7
  267. package/src/math/Vector3.js +15 -13
  268. package/src/math/Vector4.js +13 -9
  269. package/src/math/interpolants/BezierInterpolant.js +108 -0
  270. package/src/nodes/Nodes.js +86 -68
  271. package/src/nodes/TSL.js +7 -7
  272. package/src/nodes/accessors/Arrays.js +1 -1
  273. package/src/nodes/accessors/BatchNode.js +10 -10
  274. package/src/nodes/accessors/Bitangent.js +5 -5
  275. package/src/nodes/accessors/BufferAttributeNode.js +107 -15
  276. package/src/nodes/accessors/BufferNode.js +29 -2
  277. package/src/nodes/accessors/Camera.js +149 -28
  278. package/src/nodes/accessors/ClippingNode.js +4 -4
  279. package/src/nodes/accessors/CubeTextureNode.js +27 -2
  280. package/src/nodes/accessors/InstanceNode.js +148 -43
  281. package/src/nodes/accessors/MaterialNode.js +9 -1
  282. package/src/nodes/accessors/MaterialProperties.js +2 -5
  283. package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
  284. package/src/nodes/accessors/ModelNode.js +1 -1
  285. package/src/nodes/accessors/Normal.js +11 -11
  286. package/src/nodes/accessors/Object3DNode.js +1 -1
  287. package/src/nodes/accessors/Position.js +34 -2
  288. package/src/nodes/accessors/ReferenceBaseNode.js +6 -6
  289. package/src/nodes/accessors/ReferenceNode.js +8 -8
  290. package/src/nodes/accessors/RendererReferenceNode.js +1 -2
  291. package/src/nodes/accessors/SceneProperties.js +47 -0
  292. package/src/nodes/accessors/SkinningNode.js +27 -26
  293. package/src/nodes/accessors/StorageBufferNode.js +14 -25
  294. package/src/nodes/accessors/StorageTextureNode.js +40 -9
  295. package/src/nodes/accessors/Tangent.js +4 -14
  296. package/src/nodes/accessors/Texture3DNode.js +32 -35
  297. package/src/nodes/accessors/TextureNode.js +67 -23
  298. package/src/nodes/accessors/UniformArrayNode.js +6 -4
  299. package/src/nodes/accessors/UserDataNode.js +1 -2
  300. package/src/nodes/accessors/VertexColorNode.js +1 -2
  301. package/src/nodes/code/FunctionCallNode.js +1 -1
  302. package/src/nodes/code/FunctionNode.js +2 -3
  303. package/src/nodes/core/ArrayNode.js +21 -2
  304. package/src/nodes/core/AssignNode.js +3 -3
  305. package/src/nodes/core/AttributeNode.js +3 -3
  306. package/src/nodes/core/BypassNode.js +1 -1
  307. package/src/nodes/core/ContextNode.js +104 -5
  308. package/src/nodes/core/IndexNode.js +2 -1
  309. package/src/nodes/core/InputNode.js +1 -1
  310. package/src/nodes/core/InspectorNode.js +1 -1
  311. package/src/nodes/core/IsolateNode.js +1 -1
  312. package/src/nodes/core/MRTNode.js +48 -2
  313. package/src/nodes/core/Node.js +112 -15
  314. package/src/nodes/core/NodeBuilder.js +284 -66
  315. package/src/nodes/core/NodeError.js +28 -0
  316. package/src/nodes/core/NodeFrame.js +12 -4
  317. package/src/nodes/core/NodeUtils.js +11 -9
  318. package/src/nodes/core/OutputStructNode.js +12 -10
  319. package/src/nodes/core/ParameterNode.js +4 -4
  320. package/src/nodes/core/PropertyNode.js +19 -3
  321. package/src/nodes/core/StackNode.js +66 -17
  322. package/src/nodes/core/StackTrace.js +139 -0
  323. package/src/nodes/core/StructNode.js +17 -3
  324. package/src/nodes/core/StructTypeNode.js +12 -18
  325. package/src/nodes/core/SubBuildNode.js +2 -2
  326. package/src/nodes/core/UniformGroupNode.js +36 -6
  327. package/src/nodes/core/UniformNode.js +21 -5
  328. package/src/nodes/core/VarNode.js +48 -23
  329. package/src/nodes/core/VaryingNode.js +2 -19
  330. package/src/nodes/display/BlendModes.js +0 -64
  331. package/src/nodes/display/ColorAdjustment.js +17 -0
  332. package/src/nodes/display/ColorSpaceNode.js +3 -3
  333. package/src/nodes/display/NormalMapNode.js +39 -4
  334. package/src/nodes/display/PassNode.js +125 -16
  335. package/src/nodes/display/RenderOutputNode.js +7 -7
  336. package/src/nodes/display/ScreenNode.js +4 -2
  337. package/src/nodes/display/ToneMappingNode.js +1 -1
  338. package/src/nodes/display/ToonOutlinePassNode.js +2 -2
  339. package/src/nodes/display/ViewportDepthNode.js +52 -4
  340. package/src/nodes/display/ViewportDepthTextureNode.js +11 -15
  341. package/src/nodes/display/ViewportTextureNode.js +39 -11
  342. package/src/nodes/fog/Fog.js +18 -35
  343. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +3 -3
  344. package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
  345. package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
  346. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +2 -2
  347. package/src/nodes/functions/PhysicalLightingModel.js +126 -45
  348. package/src/nodes/geometry/RangeNode.js +5 -3
  349. package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
  350. package/src/nodes/gpgpu/BarrierNode.js +9 -0
  351. package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -3
  352. package/src/nodes/gpgpu/ComputeNode.js +74 -48
  353. package/src/nodes/gpgpu/SubgroupFunctionNode.js +2 -2
  354. package/src/nodes/gpgpu/WorkgroupInfoNode.js +4 -4
  355. package/src/nodes/lighting/AnalyticLightNode.js +53 -0
  356. package/src/nodes/lighting/EnvironmentNode.js +28 -3
  357. package/src/nodes/lighting/LightsNode.js +7 -28
  358. package/src/nodes/lighting/PointShadowNode.js +162 -149
  359. package/src/nodes/lighting/ShadowFilterNode.js +53 -65
  360. package/src/nodes/lighting/ShadowNode.js +120 -42
  361. package/src/nodes/math/BitcastNode.js +1 -1
  362. package/src/nodes/math/BitcountNode.js +433 -0
  363. package/src/nodes/math/ConditionalNode.js +3 -3
  364. package/src/nodes/math/MathNode.js +76 -41
  365. package/src/nodes/math/OperatorNode.js +3 -2
  366. package/src/nodes/math/PackFloatNode.js +98 -0
  367. package/src/nodes/math/UnpackFloatNode.js +96 -0
  368. package/src/nodes/pmrem/PMREMNode.js +1 -1
  369. package/src/nodes/pmrem/PMREMUtils.js +9 -15
  370. package/src/nodes/tsl/TSLBase.js +1 -1
  371. package/src/nodes/tsl/TSLCore.js +38 -17
  372. package/src/nodes/utils/ArrayElementNode.js +14 -1
  373. package/src/nodes/utils/ConvertNode.js +1 -1
  374. package/src/nodes/utils/DebugNode.js +12 -12
  375. package/src/nodes/utils/EventNode.js +31 -2
  376. package/src/nodes/utils/FlipNode.js +1 -1
  377. package/src/nodes/utils/FunctionOverloadingNode.js +1 -1
  378. package/src/nodes/utils/JoinNode.js +3 -3
  379. package/src/nodes/utils/LoopNode.js +1 -1
  380. package/src/nodes/utils/MemberNode.js +2 -2
  381. package/src/nodes/utils/Packing.js +13 -1
  382. package/src/nodes/utils/PostProcessingUtils.js +33 -1
  383. package/src/nodes/utils/RTTNode.js +1 -1
  384. package/src/nodes/utils/ReflectorNode.js +3 -4
  385. package/src/nodes/utils/Remap.js +48 -0
  386. package/src/nodes/utils/RotateNode.js +1 -1
  387. package/src/nodes/utils/SampleNode.js +1 -1
  388. package/src/nodes/utils/SetNode.js +1 -1
  389. package/src/nodes/utils/SplitNode.js +1 -1
  390. package/src/nodes/utils/SpriteSheetUV.js +35 -0
  391. package/src/nodes/utils/UVUtils.js +28 -0
  392. package/src/objects/BatchedMesh.js +44 -16
  393. package/src/objects/InstancedMesh.js +30 -3
  394. package/src/objects/Line.js +1 -1
  395. package/src/objects/Mesh.js +1 -1
  396. package/src/objects/Points.js +1 -1
  397. package/src/objects/Skeleton.js +9 -0
  398. package/src/objects/SkinnedMesh.js +26 -9
  399. package/src/renderers/WebGLRenderer.js +329 -145
  400. package/src/renderers/common/Animation.js +3 -3
  401. package/src/renderers/common/Attributes.js +15 -1
  402. package/src/renderers/common/Backend.js +29 -8
  403. package/src/renderers/common/Background.js +26 -13
  404. package/src/renderers/common/BindGroup.js +1 -16
  405. package/src/renderers/common/Binding.js +11 -0
  406. package/src/renderers/common/Bindings.js +29 -14
  407. package/src/renderers/common/BlendMode.js +143 -0
  408. package/src/renderers/common/Buffer.js +40 -0
  409. package/src/renderers/common/BundleGroup.js +1 -1
  410. package/src/renderers/common/ChainMap.js +30 -6
  411. package/src/renderers/common/ComputePipeline.js +1 -1
  412. package/src/renderers/common/CubeRenderTarget.js +51 -7
  413. package/src/renderers/common/Geometries.js +29 -3
  414. package/src/renderers/common/Info.js +333 -4
  415. package/src/renderers/common/InspectorBase.js +6 -1
  416. package/src/renderers/common/Lighting.js +5 -21
  417. package/src/renderers/common/Pipelines.js +40 -7
  418. package/src/renderers/common/PostProcessing.js +8 -206
  419. package/src/renderers/common/ReadbackBuffer.js +78 -0
  420. package/src/renderers/common/RenderBundle.js +3 -1
  421. package/src/renderers/common/RenderBundles.js +7 -3
  422. package/src/renderers/common/RenderContext.js +16 -0
  423. package/src/renderers/common/RenderContexts.js +33 -49
  424. package/src/renderers/common/RenderLists.js +2 -1
  425. package/src/renderers/common/RenderObject.js +17 -5
  426. package/src/renderers/common/RenderObjectPipeline.js +40 -0
  427. package/src/renderers/common/RenderObjects.js +21 -5
  428. package/src/renderers/common/RenderPipeline.js +232 -17
  429. package/src/renderers/common/Renderer.js +481 -117
  430. package/src/renderers/common/Sampler.js +4 -4
  431. package/src/renderers/common/StorageBuffer.js +13 -1
  432. package/src/renderers/common/Textures.js +89 -4
  433. package/src/renderers/common/TimestampQueryPool.js +5 -3
  434. package/src/renderers/common/Uniform.js +8 -0
  435. package/src/renderers/common/UniformsGroup.js +62 -1
  436. package/src/renderers/common/XRManager.js +37 -29
  437. package/src/renderers/common/extras/PMREMGenerator.js +25 -23
  438. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  439. package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +242 -99
  440. package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
  441. package/src/renderers/common/nodes/NodeUniformBuffer.js +52 -0
  442. package/src/renderers/shaders/DFGLUTData.js +19 -34
  443. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
  444. package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
  445. package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
  446. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
  447. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
  448. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +0 -1
  449. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +8 -12
  450. package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +80 -0
  451. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +13 -2
  452. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
  453. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
  454. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +2 -0
  455. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
  456. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +112 -53
  457. package/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js +7 -0
  458. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
  459. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +0 -1
  460. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +225 -186
  461. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +12 -2
  462. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
  463. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  464. package/src/renderers/shaders/ShaderChunk.js +5 -3
  465. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +1 -2
  466. package/src/renderers/shaders/ShaderLib/depth.glsl.js +3 -0
  467. package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +1 -2
  468. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
  469. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
  470. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
  471. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
  472. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
  473. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
  474. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
  475. package/src/renderers/shaders/ShaderLib.js +7 -6
  476. package/src/renderers/shaders/UniformsLib.js +7 -5
  477. package/src/renderers/shaders/UniformsUtils.js +27 -5
  478. package/src/renderers/webgl/WebGLAnimation.js +2 -1
  479. package/src/renderers/webgl/WebGLBackground.js +15 -15
  480. package/src/renderers/webgl/WebGLBindingStates.js +99 -27
  481. package/src/renderers/webgl/WebGLBufferRenderer.js +0 -32
  482. package/src/renderers/webgl/WebGLCapabilities.js +9 -4
  483. package/src/renderers/webgl/WebGLEnvironments.js +228 -0
  484. package/src/renderers/webgl/WebGLGeometries.js +10 -7
  485. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +0 -32
  486. package/src/renderers/webgl/WebGLLights.js +18 -1
  487. package/src/renderers/webgl/WebGLMaterials.js +24 -13
  488. package/src/renderers/webgl/WebGLObjects.js +3 -1
  489. package/src/renderers/webgl/WebGLOutput.js +270 -0
  490. package/src/renderers/webgl/WebGLProgram.js +49 -109
  491. package/src/renderers/webgl/WebGLPrograms.js +63 -51
  492. package/src/renderers/webgl/WebGLRenderLists.js +15 -0
  493. package/src/renderers/webgl/WebGLRenderStates.js +13 -2
  494. package/src/renderers/webgl/WebGLShadowMap.js +188 -24
  495. package/src/renderers/webgl/WebGLState.js +75 -37
  496. package/src/renderers/webgl/WebGLTextures.js +215 -54
  497. package/src/renderers/webgl/WebGLUniforms.js +40 -3
  498. package/src/renderers/webgl/WebGLUniformsGroups.js +19 -0
  499. package/src/renderers/webgl/WebGLUtils.js +6 -2
  500. package/src/renderers/webgl-fallback/WebGLBackend.js +253 -82
  501. package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +0 -41
  502. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +173 -74
  503. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +53 -19
  504. package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +25 -0
  505. package/src/renderers/webgl-fallback/utils/WebGLState.js +223 -6
  506. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +68 -53
  507. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +10 -10
  508. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +6 -2
  509. package/src/renderers/webgpu/WebGPUBackend.js +260 -140
  510. package/src/renderers/webgpu/WebGPURenderer.js +2 -1
  511. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +366 -90
  512. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +107 -34
  513. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +357 -200
  514. package/src/renderers/webgpu/utils/WebGPUCapabilities.js +48 -0
  515. package/src/renderers/webgpu/utils/WebGPUConstants.js +10 -0
  516. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +61 -23
  517. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +152 -200
  518. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +156 -59
  519. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +7 -7
  520. package/src/renderers/webgpu/utils/WebGPUUtils.js +33 -11
  521. package/src/renderers/webxr/WebXRController.js +12 -0
  522. package/src/renderers/webxr/WebXRManager.js +4 -2
  523. package/src/textures/CubeDepthTexture.js +76 -0
  524. package/src/textures/HTMLTexture.js +74 -0
  525. package/src/textures/Source.js +2 -2
  526. package/src/textures/Texture.js +16 -5
  527. package/src/utils.js +280 -3
  528. package/examples/jsm/materials/MeshGouraudMaterial.js +0 -434
  529. package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
  530. package/examples/jsm/shaders/GodRaysShader.js +0 -333
  531. package/src/nodes/accessors/SceneNode.js +0 -145
  532. package/src/nodes/code/ScriptableNode.js +0 -726
  533. package/src/nodes/code/ScriptableValueNode.js +0 -253
  534. package/src/nodes/display/PosterizeNode.js +0 -65
  535. package/src/nodes/functions/BSDF/DFGApprox.js +0 -71
  536. package/src/nodes/utils/RemapNode.js +0 -125
  537. package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
  538. package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
  539. package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
@@ -0,0 +1,374 @@
1
+ import { RenderTarget, Vector2, NodeMaterial, RendererUtils, QuadMesh, TempNode, NodeUpdateType } from 'three/webgpu';
2
+ import { Fn, float, uv, uniform, convertToTexture, vec2, vec4, passTexture, luminance, abs, exp, max } from 'three/tsl';
3
+
4
+ const _quadMesh = /*@__PURE__*/ new QuadMesh();
5
+
6
+ let _rendererState;
7
+
8
+ /**
9
+ * Post processing node for creating a bilateral blur effect.
10
+ *
11
+ * Bilateral blur smooths an image while preserving sharp edges. Unlike a
12
+ * standard Gaussian blur which blurs everything equally, bilateral blur
13
+ * analyzes the intensity/color of neighboring pixels. If a neighbor is too
14
+ * different from the center pixel (indicating an edge), it is excluded
15
+ * from the blurring process.
16
+ *
17
+ * Reference: {@link https://en.wikipedia.org/wiki/Bilateral_filter}
18
+ *
19
+ * @augments TempNode
20
+ * @three_import import { bilateralBlur } from 'three/addons/tsl/display/BilateralBlurNode.js';
21
+ */
22
+ class BilateralBlurNode extends TempNode {
23
+
24
+ static get type() {
25
+
26
+ return 'BilateralBlurNode';
27
+
28
+ }
29
+
30
+ /**
31
+ * Constructs a new bilateral blur node.
32
+ *
33
+ * @param {TextureNode} textureNode - The texture node that represents the input of the effect.
34
+ * @param {Node<vec2|float>} directionNode - Defines the direction and radius of the blur.
35
+ * @param {number} sigma - Controls the spatial kernel of the blur filter. Higher values mean a wider blur radius.
36
+ * @param {number} sigmaColor - Controls the intensity kernel. Higher values allow more color difference to be blurred together.
37
+ */
38
+ constructor( textureNode, directionNode = null, sigma = 4, sigmaColor = 0.1 ) {
39
+
40
+ super( 'vec4' );
41
+
42
+ /**
43
+ * The texture node that represents the input of the effect.
44
+ *
45
+ * @type {TextureNode}
46
+ */
47
+ this.textureNode = textureNode;
48
+
49
+ /**
50
+ * Defines the direction and radius of the blur.
51
+ *
52
+ * @type {Node<vec2|float>}
53
+ */
54
+ this.directionNode = directionNode;
55
+
56
+ /**
57
+ * Controls the spatial kernel of the blur filter. Higher values mean a wider blur radius.
58
+ *
59
+ * @type {number}
60
+ */
61
+ this.sigma = sigma;
62
+
63
+ /**
64
+ * Controls the color/intensity kernel. Higher values allow more color difference
65
+ * to be blurred together. Lower values preserve edges more strictly.
66
+ *
67
+ * @type {number}
68
+ */
69
+ this.sigmaColor = sigmaColor;
70
+
71
+ /**
72
+ * A uniform node holding the inverse resolution value.
73
+ *
74
+ * @private
75
+ * @type {UniformNode<vec2>}
76
+ */
77
+ this._invSize = uniform( new Vector2() );
78
+
79
+ /**
80
+ * Bilateral blur is applied in two passes (horizontal, vertical).
81
+ * This node controls the direction of each pass.
82
+ *
83
+ * @private
84
+ * @type {UniformNode<vec2>}
85
+ */
86
+ this._passDirection = uniform( new Vector2() );
87
+
88
+ /**
89
+ * The render target used for the horizontal pass.
90
+ *
91
+ * @private
92
+ * @type {RenderTarget}
93
+ */
94
+ this._horizontalRT = new RenderTarget( 1, 1, { depthBuffer: false } );
95
+ this._horizontalRT.texture.name = 'BilateralBlurNode.horizontal';
96
+
97
+ /**
98
+ * The render target used for the vertical pass.
99
+ *
100
+ * @private
101
+ * @type {RenderTarget}
102
+ */
103
+ this._verticalRT = new RenderTarget( 1, 1, { depthBuffer: false } );
104
+ this._verticalRT.texture.name = 'BilateralBlurNode.vertical';
105
+
106
+ /**
107
+ * The result of the effect is represented as a separate texture node.
108
+ *
109
+ * @private
110
+ * @type {PassTextureNode}
111
+ */
112
+ this._textureNode = passTexture( this, this._verticalRT.texture );
113
+ this._textureNode.uvNode = textureNode.uvNode;
114
+
115
+ /**
116
+ * The material for the blur pass.
117
+ *
118
+ * @private
119
+ * @type {?NodeMaterial}
120
+ */
121
+ this._material = null;
122
+
123
+ /**
124
+ * The `updateBeforeType` is set to `NodeUpdateType.FRAME` since the node renders
125
+ * its effect once per frame in `updateBefore()`.
126
+ *
127
+ * @type {string}
128
+ * @default 'frame'
129
+ */
130
+ this.updateBeforeType = NodeUpdateType.FRAME;
131
+
132
+ /**
133
+ * The resolution scale.
134
+ *
135
+ * @type {number}
136
+ * @default 1
137
+ */
138
+ this.resolutionScale = 1;
139
+
140
+ }
141
+
142
+ /**
143
+ * Sets the size of the effect.
144
+ *
145
+ * @param {number} width - The width of the effect.
146
+ * @param {number} height - The height of the effect.
147
+ */
148
+ setSize( width, height ) {
149
+
150
+ width = Math.max( Math.round( width * this.resolutionScale ), 1 );
151
+ height = Math.max( Math.round( height * this.resolutionScale ), 1 );
152
+
153
+ this._invSize.value.set( 1 / width, 1 / height );
154
+ this._horizontalRT.setSize( width, height );
155
+ this._verticalRT.setSize( width, height );
156
+
157
+ }
158
+
159
+ /**
160
+ * This method is used to render the effect once per frame.
161
+ *
162
+ * @param {NodeFrame} frame - The current node frame.
163
+ */
164
+ updateBefore( frame ) {
165
+
166
+ const { renderer } = frame;
167
+
168
+ _rendererState = RendererUtils.resetRendererState( renderer, _rendererState );
169
+
170
+ //
171
+
172
+ const textureNode = this.textureNode;
173
+ const map = textureNode.value;
174
+
175
+ const currentTexture = textureNode.value;
176
+
177
+ _quadMesh.material = this._material;
178
+
179
+ this.setSize( map.image.width, map.image.height );
180
+
181
+ const textureType = map.type;
182
+
183
+ this._horizontalRT.texture.type = textureType;
184
+ this._verticalRT.texture.type = textureType;
185
+
186
+ // horizontal
187
+
188
+ renderer.setRenderTarget( this._horizontalRT );
189
+
190
+ this._passDirection.value.set( 1, 0 );
191
+
192
+ _quadMesh.name = 'Bilateral Blur [ Horizontal Pass ]';
193
+ _quadMesh.render( renderer );
194
+
195
+ // vertical
196
+
197
+ textureNode.value = this._horizontalRT.texture;
198
+ renderer.setRenderTarget( this._verticalRT );
199
+
200
+ this._passDirection.value.set( 0, 1 );
201
+
202
+ _quadMesh.name = 'Bilateral Blur [ Vertical Pass ]';
203
+ _quadMesh.render( renderer );
204
+
205
+ // restore
206
+
207
+ textureNode.value = currentTexture;
208
+
209
+ RendererUtils.restoreRendererState( renderer, _rendererState );
210
+
211
+ }
212
+
213
+ /**
214
+ * Returns the result of the effect as a texture node.
215
+ *
216
+ * @return {PassTextureNode} A texture node that represents the result of the effect.
217
+ */
218
+ getTextureNode() {
219
+
220
+ return this._textureNode;
221
+
222
+ }
223
+
224
+ /**
225
+ * This method is used to setup the effect's TSL code.
226
+ *
227
+ * @param {NodeBuilder} builder - The current node builder.
228
+ * @return {PassTextureNode}
229
+ */
230
+ setup( builder ) {
231
+
232
+ const textureNode = this.textureNode;
233
+
234
+ //
235
+
236
+ const uvNode = uv();
237
+ const directionNode = vec2( this.directionNode || 1 );
238
+
239
+ const sampleTexture = ( uv ) => textureNode.sample( uv );
240
+
241
+ const blur = Fn( () => {
242
+
243
+ const kernelSize = this.sigma * 2 + 3;
244
+ const spatialCoefficients = this._getSpatialCoefficients( kernelSize );
245
+
246
+ const invSize = this._invSize;
247
+ const direction = directionNode.mul( this._passDirection );
248
+
249
+ // Sample center pixel
250
+ const centerColor = sampleTexture( uvNode ).toVar();
251
+ const centerLuminance = luminance( centerColor.rgb ).toVar();
252
+
253
+ // Accumulate weighted samples
254
+ const weightSum = float( spatialCoefficients[ 0 ] ).toVar();
255
+ const colorSum = vec4( centerColor.mul( spatialCoefficients[ 0 ] ) ).toVar();
256
+
257
+ // Precompute color sigma factor: -0.5 / (sigmaColor^2)
258
+ const colorSigmaFactor = float( - 0.5 ).div( float( this.sigmaColor * this.sigmaColor ) ).toConst();
259
+
260
+ for ( let i = 1; i < kernelSize; i ++ ) {
261
+
262
+ const x = float( i );
263
+ const spatialWeight = float( spatialCoefficients[ i ] );
264
+
265
+ const uvOffset = vec2( direction.mul( invSize.mul( x ) ) ).toVar();
266
+
267
+ // Sample in both directions (+/-)
268
+ const sampleUv1 = uvNode.add( uvOffset );
269
+ const sampleUv2 = uvNode.sub( uvOffset );
270
+
271
+ const sample1 = sampleTexture( sampleUv1 );
272
+ const sample2 = sampleTexture( sampleUv2 );
273
+
274
+ // Compute luminance difference for edge detection
275
+ const lum1 = luminance( sample1.rgb );
276
+ const lum2 = luminance( sample2.rgb );
277
+
278
+ const diff1 = abs( lum1.sub( centerLuminance ) );
279
+ const diff2 = abs( lum2.sub( centerLuminance ) );
280
+
281
+ // Compute color-based weights using Gaussian function
282
+ const colorWeight1 = exp( diff1.mul( diff1 ).mul( colorSigmaFactor ) ).toVar();
283
+ const colorWeight2 = exp( diff2.mul( diff2 ).mul( colorSigmaFactor ) ).toVar();
284
+
285
+ // Combined bilateral weight = spatial weight * color weight
286
+ const bilateralWeight1 = spatialWeight.mul( colorWeight1 );
287
+ const bilateralWeight2 = spatialWeight.mul( colorWeight2 );
288
+
289
+ colorSum.addAssign( sample1.mul( bilateralWeight1 ) );
290
+ colorSum.addAssign( sample2.mul( bilateralWeight2 ) );
291
+
292
+ weightSum.addAssign( bilateralWeight1 );
293
+ weightSum.addAssign( bilateralWeight2 );
294
+
295
+ }
296
+
297
+ // Normalize by the total weight
298
+ return colorSum.div( max( weightSum, 0.0001 ) );
299
+
300
+ } );
301
+
302
+ //
303
+
304
+ const material = this._material || ( this._material = new NodeMaterial() );
305
+ material.fragmentNode = blur().context( builder.getSharedContext() );
306
+ material.name = 'Bilateral_blur';
307
+ material.needsUpdate = true;
308
+
309
+ //
310
+
311
+ const properties = builder.getNodeProperties( this );
312
+ properties.textureNode = textureNode;
313
+
314
+ //
315
+
316
+ return this._textureNode;
317
+
318
+ }
319
+
320
+ /**
321
+ * Frees internal resources. This method should be called
322
+ * when the effect is no longer required.
323
+ */
324
+ dispose() {
325
+
326
+ this._horizontalRT.dispose();
327
+ this._verticalRT.dispose();
328
+
329
+ if ( this._material !== null ) this._material.dispose();
330
+
331
+ }
332
+
333
+ /**
334
+ * Computes spatial (Gaussian) coefficients depending on the given kernel radius.
335
+ * These coefficients are used for the spatial component of the bilateral filter.
336
+ *
337
+ * @private
338
+ * @param {number} kernelRadius - The kernel radius.
339
+ * @return {Array<number>}
340
+ */
341
+ _getSpatialCoefficients( kernelRadius ) {
342
+
343
+ const coefficients = [];
344
+ const sigma = kernelRadius / 3;
345
+
346
+ for ( let i = 0; i < kernelRadius; i ++ ) {
347
+
348
+ coefficients.push( 0.39894 * Math.exp( - 0.5 * i * i / ( sigma * sigma ) ) / sigma );
349
+
350
+ }
351
+
352
+ return coefficients;
353
+
354
+ }
355
+
356
+ }
357
+
358
+ export default BilateralBlurNode;
359
+
360
+ /**
361
+ * TSL function for creating a bilateral blur node for post processing.
362
+ *
363
+ * Bilateral blur smooths an image while preserving sharp edges by considering
364
+ * both spatial distance and color/intensity differences between pixels.
365
+ *
366
+ * @tsl
367
+ * @function
368
+ * @param {Node<vec4>} node - The node that represents the input of the effect.
369
+ * @param {Node<vec2|float>} directionNode - Defines the direction and radius of the blur.
370
+ * @param {number} sigma - Controls the spatial kernel of the blur filter. Higher values mean a wider blur radius.
371
+ * @param {number} sigmaColor - Controls the intensity kernel. Higher values allow more color difference to be blurred together.
372
+ * @returns {BilateralBlurNode}
373
+ */
374
+ export const bilateralBlur = ( node, directionNode, sigma, sigmaColor ) => new BilateralBlurNode( convertToTexture( node ), directionNode, sigma, sigmaColor );
@@ -12,20 +12,20 @@ let _rendererState;
12
12
  /**
13
13
  * Post processing node for creating a bloom effect.
14
14
  * ```js
15
- * const postProcessing = new THREE.PostProcessing( renderer );
15
+ * const renderPipeline = new THREE.RenderPipeline( renderer );
16
16
  *
17
17
  * const scenePass = pass( scene, camera );
18
18
  * const scenePassColor = scenePass.getTextureNode( 'output' );
19
19
  *
20
20
  * const bloomPass = bloom( scenePassColor );
21
21
  *
22
- * postProcessing.outputNode = scenePassColor.add( bloomPass );
22
+ * renderPipeline.outputNode = scenePassColor.add( bloomPass );
23
23
  * ```
24
24
  * By default, the node affects the entire image. For a selective bloom,
25
25
  * use the `emissive` material property to control which objects should
26
26
  * contribute to bloom or not. This can be achieved via MRT.
27
27
  * ```js
28
- * const postProcessing = new THREE.PostProcessing( renderer );
28
+ * const renderPipeline = new THREE.RenderPipeline( renderer );
29
29
  *
30
30
  * const scenePass = pass( scene, camera );
31
31
  * scenePass.setMRT( mrt( {
@@ -37,7 +37,7 @@ let _rendererState;
37
37
  * const emissivePass = scenePass.getTextureNode( 'emissive' );
38
38
  *
39
39
  * const bloomPass = bloom( emissivePass );
40
- * postProcessing.outputNode = scenePassColor.add( bloomPass );
40
+ * renderPipeline.outputNode = scenePassColor.add( bloomPass );
41
41
  * ```
42
42
  * @augments TempNode
43
43
  * @three_import import { bloom } from 'three/addons/tsl/display/BloomNode.js';
@@ -77,7 +77,7 @@ class BloomNode extends TempNode {
77
77
  this.strength = uniform( strength );
78
78
 
79
79
  /**
80
- * The radius of the bloom.
80
+ * The radius of the bloom. Must be in the range `[0,1]`.
81
81
  *
82
82
  * @type {UniformNode<float>}
83
83
  */
@@ -443,11 +443,21 @@ class BloomNode extends TempNode {
443
443
 
444
444
  this._renderTargetBright.dispose();
445
445
 
446
+ if ( this._highPassFilterMaterial !== null ) this._highPassFilterMaterial.dispose();
447
+ if ( this._compositeMaterial !== null ) this._compositeMaterial.dispose();
448
+
449
+ for ( let i = 0; i < this._separableBlurMaterials.length; i ++ ) {
450
+
451
+ this._separableBlurMaterials[ i ].dispose();
452
+
453
+ }
454
+
446
455
  }
447
456
 
448
457
  /**
449
458
  * Create a separable blur material for the given kernel radius.
450
459
  *
460
+ * @private
451
461
  * @param {NodeBuilder} builder - The current node builder.
452
462
  * @param {number} kernelRadius - The kernel radius.
453
463
  * @return {NodeMaterial}
@@ -519,6 +529,6 @@ class BloomNode extends TempNode {
519
529
  * @param {number} [threshold=0] - The luminance threshold limits which bright areas contribute to the bloom effect.
520
530
  * @returns {BloomNode}
521
531
  */
522
- export const bloom = ( node, strength, radius, threshold ) => nodeObject( new BloomNode( nodeObject( node ), strength, radius, threshold ) );
532
+ export const bloom = ( node, strength, radius, threshold ) => new BloomNode( nodeObject( node ), strength, radius, threshold );
523
533
 
524
534
  export default BloomNode;
@@ -0,0 +1,150 @@
1
+ import { Fn, float, vec2, vec3, sin, screenUV, mix, clamp, dot, convertToTexture, time, uv, select } from 'three/tsl';
2
+ import { circle } from './Shape.js';
3
+
4
+ /**
5
+ * Creates barrel-distorted UV coordinates.
6
+ * The center of the screen appears to bulge outward (convex distortion).
7
+ *
8
+ * @tsl
9
+ * @function
10
+ * @param {Node<float>} [curvature=0.1] - The amount of curvature (0 = flat, 0.5 = very curved).
11
+ * @param {Node<vec2>} [coord=uv()] - The input UV coordinates.
12
+ * @return {Node<vec2>} The distorted UV coordinates.
13
+ */
14
+ export const barrelUV = Fn( ( [ curvature = float( 0.1 ), coord = uv() ] ) => {
15
+
16
+ // Center UV coordinates (-1 to 1)
17
+ const centered = coord.sub( 0.5 ).mul( 2.0 );
18
+
19
+ // Calculate squared distance from center
20
+ const r2 = dot( centered, centered );
21
+
22
+ // Barrel distortion: push center outward (bulge effect)
23
+ const distortion = float( 1.0 ).sub( r2.mul( curvature ) );
24
+
25
+ // Calculate scale to compensate for edge expansion
26
+ // At corners r² = 2, so we scale by the inverse of corner distortion
27
+ const cornerDistortion = float( 1.0 ).sub( curvature.mul( 2.0 ) );
28
+
29
+ // Apply distortion and compensate scale to keep edges aligned
30
+ const distorted = centered.div( distortion ).mul( cornerDistortion ).mul( 0.5 ).add( 0.5 );
31
+
32
+ return distorted;
33
+
34
+ } );
35
+
36
+ /**
37
+ * Checks if UV coordinates are inside the valid 0-1 range.
38
+ * Useful for masking areas inside the distorted screen.
39
+ *
40
+ * @tsl
41
+ * @function
42
+ * @param {Node<vec2>} coord - The UV coordinates to check.
43
+ * @return {Node<float>} 1.0 if inside bounds, 0.0 if outside.
44
+ */
45
+ export const barrelMask = Fn( ( [ coord ] ) => {
46
+
47
+ const outOfBounds = coord.x.lessThan( 0.0 )
48
+ .or( coord.x.greaterThan( 1.0 ) )
49
+ .or( coord.y.lessThan( 0.0 ) )
50
+ .or( coord.y.greaterThan( 1.0 ) );
51
+
52
+ return select( outOfBounds, float( 0.0 ), float( 1.0 ) );
53
+
54
+ } );
55
+
56
+ /**
57
+ * Applies color bleeding effect to simulate horizontal color smearing.
58
+ * Simulates the analog signal bleeding in CRT displays where colors
59
+ * "leak" into adjacent pixels horizontally.
60
+ *
61
+ * @tsl
62
+ * @function
63
+ * @param {Node} color - The input texture node.
64
+ * @param {Node<float>} [amount=0.002] - The amount of color bleeding (0-0.01).
65
+ * @return {Node<vec3>} The color with bleeding effect applied.
66
+ */
67
+ export const colorBleeding = Fn( ( [ color, amount = float( 0.002 ) ] ) => {
68
+
69
+ const inputTexture = convertToTexture( color );
70
+
71
+ // Get the original color
72
+ const original = inputTexture.sample( screenUV ).rgb;
73
+
74
+ // Sample colors from the left (simulating signal trailing)
75
+ const left1 = inputTexture.sample( screenUV.sub( vec2( amount, 0.0 ) ) ).rgb;
76
+ const left2 = inputTexture.sample( screenUV.sub( vec2( amount.mul( 2.0 ), 0.0 ) ) ).rgb;
77
+ const left3 = inputTexture.sample( screenUV.sub( vec2( amount.mul( 3.0 ), 0.0 ) ) ).rgb;
78
+
79
+ // Red bleeds more (travels further in analog signal)
80
+ const bleedR = original.r
81
+ .add( left1.r.mul( 0.4 ) )
82
+ .add( left2.r.mul( 0.2 ) )
83
+ .add( left3.r.mul( 0.1 ) );
84
+
85
+ // Green bleeds medium
86
+ const bleedG = original.g
87
+ .add( left1.g.mul( 0.25 ) )
88
+ .add( left2.g.mul( 0.1 ) );
89
+
90
+ // Blue bleeds least
91
+ const bleedB = original.b
92
+ .add( left1.b.mul( 0.15 ) );
93
+
94
+ // Normalize and clamp
95
+ const r = clamp( bleedR.div( 1.7 ), 0.0, 1.0 );
96
+ const g = clamp( bleedG.div( 1.35 ), 0.0, 1.0 );
97
+ const b = clamp( bleedB.div( 1.15 ), 0.0, 1.0 );
98
+
99
+ return vec3( r, g, b );
100
+
101
+ } );
102
+
103
+ /**
104
+ * Applies scanline effect to simulate CRT monitor horizontal lines with animation.
105
+ *
106
+ * @tsl
107
+ * @function
108
+ * @param {Node<vec3>} color - The input color.
109
+ * @param {Node<float>} [intensity=0.3] - The intensity of the scanlines (0-1).
110
+ * @param {Node<float>} [count=240] - The number of scanlines (typically matches vertical resolution).
111
+ * @param {Node<float>} [speed=0.0] - The scroll speed of scanlines (0 = static, 1 = normal CRT roll).
112
+ * @param {Node<vec2>} [coord=uv()] - The UV coordinates to use for scanlines.
113
+ * @return {Node<vec3>} The color with scanlines applied.
114
+ */
115
+ export const scanlines = Fn( ( [ color, intensity = float( 0.3 ), count = float( 240.0 ), speed = float( 0.0 ), coord = uv() ] ) => {
116
+
117
+ // Animate scanlines scrolling down (like CRT vertical sync roll)
118
+ const animatedY = coord.y.sub( time.mul( speed ) );
119
+
120
+ // Create scanline pattern
121
+ const scanline = sin( animatedY.mul( count ) );
122
+ const scanlineIntensity = scanline.mul( 0.5 ).add( 0.5 ).mul( intensity );
123
+
124
+ // Darken alternate lines
125
+ return color.mul( float( 1.0 ).sub( scanlineIntensity ) );
126
+
127
+ } );
128
+
129
+ /**
130
+ * Applies vignette effect to darken the edges of the screen.
131
+ *
132
+ * @tsl
133
+ * @function
134
+ * @param {Node<vec3>} color - The input color.
135
+ * @param {Node<float>} [intensity=0.4] - The intensity of the vignette (0-1).
136
+ * @param {Node<float>} [smoothness=0.5] - The smoothness of the vignette falloff.
137
+ * @param {Node<vec2>} [coord=uv()] - The UV coordinates to use for vignette calculation.
138
+ * @return {Node<vec3>} The color with vignette applied.
139
+ */
140
+ export const vignette = Fn( ( [ color, intensity = float( 0.4 ), smoothness = float( 0.5 ), coord = uv() ] ) => {
141
+
142
+ // Use circle for radial gradient (1.42 ≈ √2 covers full diagonal)
143
+ const mask = circle( float( 1.42 ), smoothness, coord );
144
+
145
+ // Apply vignette: center = 1, edges = (1 - intensity)
146
+ const vignetteAmount = mix( float( 1.0 ).sub( intensity ), float( 1.0 ), mask );
147
+
148
+ return color.mul( vignetteAmount );
149
+
150
+ } );
@@ -1,13 +1,11 @@
1
- import { Vector2, TempNode } from 'three/webgpu';
1
+ import { TempNode } from 'three/webgpu';
2
2
  import {
3
3
  nodeObject,
4
4
  Fn,
5
- uniform,
6
5
  convertToTexture,
7
6
  float,
8
7
  vec4,
9
8
  uv,
10
- NodeUpdateType,
11
9
  } from 'three/tsl';
12
10
 
13
11
  /**
@@ -45,15 +43,6 @@ class ChromaticAberrationNode extends TempNode {
45
43
  */
46
44
  this.textureNode = textureNode;
47
45
 
48
- /**
49
- * The `updateBeforeType` is set to `NodeUpdateType.FRAME` since the node updates
50
- * its internal uniforms once per frame in `updateBefore()`.
51
- *
52
- * @type {string}
53
- * @default 'frame'
54
- */
55
- this.updateBeforeType = NodeUpdateType.FRAME;
56
-
57
46
  /**
58
47
  * A node holding the strength of the effect.
59
48
  *
@@ -75,26 +64,6 @@ class ChromaticAberrationNode extends TempNode {
75
64
  */
76
65
  this.scaleNode = scaleNode;
77
66
 
78
- /**
79
- * A uniform node holding the inverse resolution value.
80
- *
81
- * @private
82
- * @type {UniformNode<vec2>}
83
- */
84
- this._invSize = uniform( new Vector2() );
85
-
86
- }
87
-
88
- /**
89
- * This method is used to update the effect's uniforms once per frame.
90
- *
91
- * @param {NodeFrame} frame - The current node frame.
92
- */
93
- updateBefore( /* frame */ ) {
94
-
95
- const map = this.textureNode.value;
96
- this._invSize.value.set( 1 / map.image.width, 1 / map.image.height );
97
-
98
67
  }
99
68
 
100
69
  /**
@@ -155,8 +124,7 @@ class ChromaticAberrationNode extends TempNode {
155
124
  { name: 'uv', type: 'vec2' },
156
125
  { name: 'strength', type: 'float' },
157
126
  { name: 'center', type: 'vec2' },
158
- { name: 'scale', type: 'float' },
159
- { name: 'invSize', type: 'vec2' }
127
+ { name: 'scale', type: 'float' }
160
128
  ]
161
129
  } );
162
130
 
@@ -166,8 +134,7 @@ class ChromaticAberrationNode extends TempNode {
166
134
  uvNode,
167
135
  this.strengthNode,
168
136
  this.centerNode,
169
- this.scaleNode,
170
- this._invSize
137
+ this.scaleNode
171
138
  );
172
139
 
173
140
  } );
@@ -331,4 +331,4 @@ function generateDefaultNoise( size = 64 ) {
331
331
  * @param {Camera} camera - The camera the scene is rendered with.
332
332
  * @returns {DenoiseNode}
333
333
  */
334
- export const denoise = ( node, depthNode, normalNode, camera ) => nodeObject( new DenoiseNode( convertToTexture( node ), nodeObject( depthNode ), nodeObject( normalNode ), camera ) );
334
+ export const denoise = ( node, depthNode, normalNode, camera ) => new DenoiseNode( convertToTexture( node ), nodeObject( depthNode ), nodeObject( normalNode ), camera );
@@ -551,4 +551,4 @@ export default DepthOfFieldNode;
551
551
  * @param {Node<float> | number} bokehScale - A unitless value for artistic purposes to adjust the size of the bokeh.
552
552
  * @returns {DepthOfFieldNode}
553
553
  */
554
- export const dof = ( node, viewZNode, focusDistance = 1, focalLength = 1, bokehScale = 1 ) => nodeObject( new DepthOfFieldNode( convertToTexture( node ), nodeObject( viewZNode ), nodeObject( focusDistance ), nodeObject( focalLength ), nodeObject( bokehScale ) ) );
554
+ export const dof = ( node, viewZNode, focusDistance = 1, focalLength = 1, bokehScale = 1 ) => new DepthOfFieldNode( convertToTexture( node ), nodeObject( viewZNode ), nodeObject( focusDistance ), nodeObject( focalLength ), nodeObject( bokehScale ) );
@@ -101,4 +101,4 @@ export default DotScreenNode;
101
101
  * @param {number} [scale=1] - The scale of the effect. A higher value means smaller dots.
102
102
  * @returns {DotScreenNode}
103
103
  */
104
- export const dotScreen = ( node, angle, scale ) => nodeObject( new DotScreenNode( nodeObject( node ), angle, scale ) );
104
+ export const dotScreen = ( node, angle, scale ) => new DotScreenNode( nodeObject( node ), angle, scale );