super-three 0.177.0 → 0.181.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 (501) hide show
  1. package/README.md +1 -1
  2. package/build/three.cjs +1994 -749
  3. package/build/three.core.js +1358 -506
  4. package/build/three.core.min.js +1 -1
  5. package/build/three.module.js +631 -247
  6. package/build/three.module.min.js +1 -1
  7. package/build/three.tsl.js +113 -33
  8. package/build/three.tsl.min.js +1 -1
  9. package/build/three.webgpu.js +9571 -3424
  10. package/build/three.webgpu.min.js +1 -1
  11. package/build/three.webgpu.nodes.js +9397 -3426
  12. package/build/three.webgpu.nodes.min.js +1 -1
  13. package/examples/fonts/MPLUSRounded1c/MPLUSRounded1c-Regular.typeface.json.zip +0 -0
  14. package/examples/fonts/MPLUSRounded1c/OFL.txt +91 -0
  15. package/examples/jsm/Addons.js +2 -3
  16. package/examples/jsm/animation/CCDIKSolver.js +1 -1
  17. package/examples/jsm/capabilities/WebGL.js +0 -27
  18. package/examples/jsm/capabilities/WebGPU.js +1 -1
  19. package/examples/jsm/controls/ArcballControls.js +9 -9
  20. package/examples/jsm/controls/DragControls.js +7 -57
  21. package/examples/jsm/controls/FirstPersonControls.js +3 -3
  22. package/examples/jsm/controls/FlyControls.js +1 -1
  23. package/examples/jsm/controls/OrbitControls.js +2 -2
  24. package/examples/jsm/controls/PointerLockControls.js +2 -10
  25. package/examples/jsm/controls/TrackballControls.js +1 -1
  26. package/examples/jsm/controls/TransformControls.js +62 -15
  27. package/examples/jsm/csm/CSMShadowNode.js +4 -4
  28. package/examples/jsm/effects/AsciiEffect.js +8 -8
  29. package/examples/jsm/environments/RoomEnvironment.js +8 -3
  30. package/examples/jsm/exporters/DRACOExporter.js +2 -2
  31. package/examples/jsm/exporters/EXRExporter.js +1 -1
  32. package/examples/jsm/exporters/GLTFExporter.js +33 -25
  33. package/examples/jsm/exporters/KTX2Exporter.js +4 -2
  34. package/examples/jsm/exporters/PLYExporter.js +1 -1
  35. package/examples/jsm/exporters/USDZExporter.js +683 -299
  36. package/examples/jsm/geometries/DecalGeometry.js +2 -2
  37. package/examples/jsm/geometries/ParametricGeometry.js +1 -1
  38. package/examples/jsm/geometries/RoundedBoxGeometry.js +47 -8
  39. package/examples/jsm/geometries/TeapotGeometry.js +2 -2
  40. package/examples/jsm/geometries/TextGeometry.js +3 -2
  41. package/examples/jsm/gpgpu/BitonicSort.js +715 -0
  42. package/examples/jsm/helpers/ViewHelper.js +43 -5
  43. package/examples/jsm/inspector/Inspector.js +427 -0
  44. package/examples/jsm/inspector/RendererInspector.js +415 -0
  45. package/examples/jsm/inspector/tabs/Console.js +204 -0
  46. package/examples/jsm/inspector/tabs/Parameters.js +332 -0
  47. package/examples/jsm/inspector/tabs/Performance.js +268 -0
  48. package/examples/jsm/inspector/tabs/Viewer.js +166 -0
  49. package/examples/jsm/inspector/ui/Graph.js +95 -0
  50. package/examples/jsm/inspector/ui/Item.js +170 -0
  51. package/examples/jsm/inspector/ui/List.js +75 -0
  52. package/examples/jsm/inspector/ui/Profiler.js +170 -0
  53. package/examples/jsm/inspector/ui/Style.js +654 -0
  54. package/examples/jsm/inspector/ui/Tab.js +46 -0
  55. package/examples/jsm/inspector/ui/Values.js +423 -0
  56. package/examples/jsm/inspector/ui/utils.js +56 -0
  57. package/examples/jsm/interactive/HTMLMesh.js +11 -13
  58. package/examples/jsm/interactive/InteractiveGroup.js +1 -1
  59. package/examples/jsm/interactive/SelectionBox.js +30 -0
  60. package/examples/jsm/libs/ktx-parse.module.js +1 -1
  61. package/examples/jsm/libs/meshopt_decoder.module.js +75 -58
  62. package/examples/jsm/lights/LightProbeGenerator.js +14 -3
  63. package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -1
  64. package/examples/jsm/lines/Line2.js +3 -3
  65. package/examples/jsm/lines/LineGeometry.js +1 -1
  66. package/examples/jsm/lines/LineSegments2.js +2 -2
  67. package/examples/jsm/lines/Wireframe.js +2 -2
  68. package/examples/jsm/lines/WireframeGeometry2.js +1 -1
  69. package/examples/jsm/lines/webgpu/LineSegments2.js +1 -1
  70. package/examples/jsm/lines/webgpu/Wireframe.js +1 -1
  71. package/examples/jsm/loaders/3MFLoader.js +1 -1
  72. package/examples/jsm/loaders/ColladaLoader.js +4 -4
  73. package/examples/jsm/loaders/DDSLoader.js +1 -1
  74. package/examples/jsm/loaders/DRACOLoader.js +73 -22
  75. package/examples/jsm/loaders/EXRLoader.js +210 -22
  76. package/examples/jsm/loaders/FBXLoader.js +4 -4
  77. package/examples/jsm/loaders/FontLoader.js +23 -5
  78. package/examples/jsm/loaders/GLTFLoader.js +14 -8
  79. package/examples/jsm/loaders/HDRCubeTextureLoader.js +5 -5
  80. package/examples/jsm/loaders/HDRLoader.js +486 -0
  81. package/examples/jsm/loaders/KTX2Loader.js +136 -49
  82. package/examples/jsm/loaders/KTXLoader.js +2 -2
  83. package/examples/jsm/loaders/LDrawLoader.js +1 -1
  84. package/examples/jsm/loaders/LUT3dlLoader.js +2 -2
  85. package/examples/jsm/loaders/LUTCubeLoader.js +1 -1
  86. package/examples/jsm/loaders/LWOLoader.js +2 -2
  87. package/examples/jsm/loaders/MaterialXLoader.js +233 -34
  88. package/examples/jsm/loaders/OBJLoader.js +1 -1
  89. package/examples/jsm/loaders/PDBLoader.js +1 -1
  90. package/examples/jsm/loaders/RGBELoader.js +7 -473
  91. package/examples/jsm/loaders/SVGLoader.js +2 -2
  92. package/examples/jsm/loaders/TTFLoader.js +13 -1
  93. package/examples/jsm/loaders/USDLoader.js +219 -0
  94. package/examples/jsm/loaders/USDZLoader.js +4 -892
  95. package/examples/jsm/loaders/UltraHDRLoader.js +2 -2
  96. package/examples/jsm/loaders/lwo/IFFParser.js +1 -1
  97. package/examples/jsm/loaders/usd/USDAParser.js +741 -0
  98. package/examples/jsm/loaders/usd/USDCParser.js +17 -0
  99. package/examples/jsm/materials/WoodNodeMaterial.js +533 -0
  100. package/examples/jsm/math/ColorSpaces.js +19 -1
  101. package/examples/jsm/math/ConvexHull.js +3 -3
  102. package/examples/jsm/math/ImprovedNoise.js +1 -1
  103. package/examples/jsm/math/Lut.js +2 -2
  104. package/examples/jsm/math/SimplexNoise.js +1 -1
  105. package/examples/jsm/misc/MD2CharacterComplex.js +1 -1
  106. package/examples/jsm/misc/ProgressiveLightMap.js +9 -3
  107. package/examples/jsm/misc/ProgressiveLightMapGPU.js +7 -1
  108. package/examples/jsm/misc/TubePainter.js +383 -40
  109. package/examples/jsm/misc/Volume.js +1 -1
  110. package/examples/jsm/modifiers/SimplifyModifier.js +1 -1
  111. package/examples/jsm/objects/LensflareMesh.js +3 -3
  112. package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
  113. package/examples/jsm/objects/Sky.js +1 -1
  114. package/examples/jsm/objects/SkyMesh.js +3 -3
  115. package/examples/jsm/objects/Water.js +3 -3
  116. package/examples/jsm/objects/WaterMesh.js +6 -6
  117. package/examples/jsm/physics/RapierPhysics.js +95 -16
  118. package/examples/jsm/postprocessing/GTAOPass.js +10 -9
  119. package/examples/jsm/postprocessing/GlitchPass.js +2 -2
  120. package/examples/jsm/postprocessing/OutlinePass.js +17 -17
  121. package/examples/jsm/postprocessing/SSAOPass.js +10 -9
  122. package/examples/jsm/postprocessing/SSRPass.js +37 -8
  123. package/examples/jsm/postprocessing/UnrealBloomPass.js +8 -6
  124. package/examples/jsm/renderers/CSS2DRenderer.js +16 -5
  125. package/examples/jsm/renderers/CSS3DRenderer.js +7 -6
  126. package/examples/jsm/renderers/SVGRenderer.js +1 -1
  127. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +1 -1
  128. package/examples/jsm/shaders/AfterimageShader.js +1 -1
  129. package/examples/jsm/shaders/BleachBypassShader.js +1 -1
  130. package/examples/jsm/shaders/BokehShader.js +1 -1
  131. package/examples/jsm/shaders/BokehShader2.js +1 -1
  132. package/examples/jsm/shaders/DotScreenShader.js +1 -1
  133. package/examples/jsm/shaders/FocusShader.js +1 -1
  134. package/examples/jsm/shaders/GTAOShader.js +2 -2
  135. package/examples/jsm/shaders/GodRaysShader.js +1 -1
  136. package/examples/jsm/shaders/KaleidoShader.js +1 -1
  137. package/examples/jsm/shaders/PoissonDenoiseShader.js +2 -2
  138. package/examples/jsm/shaders/SSRShader.js +1 -1
  139. package/examples/jsm/shaders/SepiaShader.js +1 -1
  140. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +1 -1
  141. package/examples/jsm/shaders/TriangleBlurShader.js +1 -1
  142. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +11 -2
  143. package/examples/jsm/shaders/VignetteShader.js +1 -1
  144. package/examples/jsm/transpiler/AST.js +381 -30
  145. package/examples/jsm/transpiler/GLSLDecoder.js +247 -104
  146. package/examples/jsm/transpiler/Linker.js +327 -0
  147. package/examples/jsm/transpiler/TSLEncoder.js +196 -92
  148. package/examples/jsm/transpiler/Transpiler.js +17 -1
  149. package/examples/jsm/transpiler/TranspilerUtils.js +29 -0
  150. package/examples/jsm/transpiler/WGSLEncoder.js +812 -0
  151. package/examples/jsm/tsl/display/AfterImageNode.js +26 -24
  152. package/examples/jsm/tsl/display/AnamorphicNode.js +28 -4
  153. package/examples/jsm/tsl/display/BloomNode.js +11 -6
  154. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +207 -0
  155. package/examples/jsm/tsl/display/DenoiseNode.js +2 -0
  156. package/examples/jsm/tsl/display/DepthOfFieldNode.js +446 -90
  157. package/examples/jsm/tsl/display/GTAONode.js +53 -5
  158. package/examples/jsm/tsl/display/GaussianBlurNode.js +55 -43
  159. package/examples/jsm/tsl/display/OutlineNode.js +13 -2
  160. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
  161. package/examples/jsm/tsl/display/SSGINode.js +654 -0
  162. package/examples/jsm/tsl/display/SSRNode.js +182 -65
  163. package/examples/jsm/tsl/display/SSSNode.js +488 -0
  164. package/examples/jsm/tsl/display/TRAANode.js +578 -0
  165. package/examples/jsm/tsl/display/boxBlur.js +65 -0
  166. package/examples/jsm/tsl/display/hashBlur.js +18 -20
  167. package/examples/jsm/tsl/lighting/TiledLightsNode.js +22 -2
  168. package/examples/jsm/utils/BufferGeometryUtils.js +1 -1
  169. package/examples/jsm/utils/ShadowMapViewerGPU.js +12 -5
  170. package/examples/jsm/webxr/OculusHandModel.js +1 -1
  171. package/examples/jsm/webxr/XRControllerModelFactory.js +1 -1
  172. package/examples/jsm/webxr/XRHandModelFactory.js +2 -6
  173. package/package.json +5 -10
  174. package/src/Three.Core.js +5 -2
  175. package/src/Three.TSL.js +112 -32
  176. package/src/Three.WebGPU.Nodes.js +2 -0
  177. package/src/Three.WebGPU.js +4 -0
  178. package/src/animation/AnimationClip.js +20 -4
  179. package/src/animation/AnimationMixer.js +3 -3
  180. package/src/animation/AnimationObjectGroup.js +2 -1
  181. package/src/animation/KeyframeTrack.js +8 -7
  182. package/src/animation/PropertyBinding.js +12 -11
  183. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  184. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  185. package/src/audio/Audio.js +10 -9
  186. package/src/audio/PositionalAudio.js +1 -1
  187. package/src/cameras/Camera.js +14 -0
  188. package/src/cameras/OrthographicCamera.js +2 -2
  189. package/src/cameras/PerspectiveCamera.js +2 -2
  190. package/src/cameras/StereoCamera.js +2 -2
  191. package/src/constants.js +13 -5
  192. package/src/core/BufferAttribute.js +3 -3
  193. package/src/core/BufferGeometry.js +10 -10
  194. package/src/core/Clock.js +2 -8
  195. package/src/core/EventDispatcher.js +1 -1
  196. package/src/core/GLBufferAttribute.js +13 -1
  197. package/src/core/InterleavedBuffer.js +1 -1
  198. package/src/core/InterleavedBufferAttribute.js +3 -2
  199. package/src/core/Object3D.js +4 -3
  200. package/src/core/Raycaster.js +2 -1
  201. package/src/core/RenderTarget.js +10 -1
  202. package/{examples/jsm/misc → src/core}/Timer.js +4 -42
  203. package/src/extras/Controls.js +5 -4
  204. package/src/extras/DataUtils.js +2 -1
  205. package/src/extras/Earcut.js +6 -0
  206. package/src/extras/ImageUtils.js +2 -2
  207. package/src/extras/PMREMGenerator.js +279 -55
  208. package/src/extras/TextureUtils.js +2 -1
  209. package/src/extras/core/Curve.js +2 -1
  210. package/src/extras/core/Interpolations.js +7 -1
  211. package/src/extras/core/Path.js +22 -22
  212. package/src/extras/core/ShapePath.js +4 -4
  213. package/src/extras/lib/earcut.js +8 -8
  214. package/src/geometries/BoxGeometry.js +1 -0
  215. package/src/geometries/CapsuleGeometry.js +1 -0
  216. package/src/geometries/CircleGeometry.js +1 -0
  217. package/src/geometries/ConeGeometry.js +1 -0
  218. package/src/geometries/CylinderGeometry.js +1 -0
  219. package/src/geometries/DodecahedronGeometry.js +1 -0
  220. package/src/geometries/ExtrudeGeometry.js +8 -6
  221. package/src/geometries/IcosahedronGeometry.js +1 -0
  222. package/src/geometries/LatheGeometry.js +1 -0
  223. package/src/geometries/OctahedronGeometry.js +1 -0
  224. package/src/geometries/PlaneGeometry.js +1 -0
  225. package/src/geometries/RingGeometry.js +1 -0
  226. package/src/geometries/ShapeGeometry.js +1 -0
  227. package/src/geometries/SphereGeometry.js +1 -0
  228. package/src/geometries/TetrahedronGeometry.js +1 -0
  229. package/src/geometries/TorusGeometry.js +1 -0
  230. package/src/geometries/TorusKnotGeometry.js +1 -0
  231. package/src/geometries/TubeGeometry.js +1 -0
  232. package/src/helpers/CameraHelper.js +42 -12
  233. package/src/helpers/SkeletonHelper.js +35 -6
  234. package/src/lights/LightShadow.js +21 -8
  235. package/src/lights/PointLightShadow.js +1 -1
  236. package/src/lights/webgpu/ProjectorLight.js +1 -1
  237. package/src/loaders/AnimationLoader.js +2 -1
  238. package/src/loaders/AudioLoader.js +2 -1
  239. package/src/loaders/BufferGeometryLoader.js +2 -2
  240. package/src/loaders/Cache.js +2 -2
  241. package/src/loaders/DataTextureLoader.js +1 -1
  242. package/src/loaders/FileLoader.js +29 -5
  243. package/src/loaders/ImageBitmapLoader.js +32 -8
  244. package/src/loaders/ImageLoader.js +56 -9
  245. package/src/loaders/Loader.js +17 -3
  246. package/src/loaders/LoadingManager.js +45 -0
  247. package/src/loaders/MaterialLoader.js +3 -2
  248. package/src/loaders/ObjectLoader.js +13 -13
  249. package/src/loaders/TextureLoader.js +1 -1
  250. package/src/loaders/nodes/NodeLoader.js +3 -2
  251. package/src/materials/Material.js +16 -3
  252. package/src/materials/MeshBasicMaterial.js +2 -1
  253. package/src/materials/MeshDepthMaterial.js +1 -0
  254. package/src/materials/MeshDistanceMaterial.js +1 -1
  255. package/src/materials/MeshLambertMaterial.js +2 -1
  256. package/src/materials/MeshMatcapMaterial.js +22 -0
  257. package/src/materials/MeshNormalMaterial.js +1 -0
  258. package/src/materials/MeshPhongMaterial.js +2 -1
  259. package/src/materials/MeshPhysicalMaterial.js +2 -1
  260. package/src/materials/MeshStandardMaterial.js +8 -7
  261. package/src/materials/MeshToonMaterial.js +1 -0
  262. package/src/materials/PointsMaterial.js +1 -1
  263. package/src/materials/ShaderMaterial.js +2 -2
  264. package/src/materials/nodes/Line2NodeMaterial.js +2 -10
  265. package/src/materials/nodes/MeshBasicNodeMaterial.js +4 -3
  266. package/src/materials/nodes/MeshMatcapNodeMaterial.js +1 -1
  267. package/src/materials/nodes/MeshNormalNodeMaterial.js +2 -2
  268. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +2 -1
  269. package/src/materials/nodes/MeshSSSNodeMaterial.js +3 -3
  270. package/src/materials/nodes/NodeMaterial.js +90 -27
  271. package/src/materials/nodes/PointsNodeMaterial.js +86 -28
  272. package/src/materials/nodes/SpriteNodeMaterial.js +3 -15
  273. package/src/materials/nodes/manager/NodeMaterialObserver.js +89 -3
  274. package/src/math/Color.js +6 -5
  275. package/src/math/ColorManagement.js +9 -3
  276. package/src/math/Cylindrical.js +1 -1
  277. package/src/math/Euler.js +2 -1
  278. package/src/math/Frustum.js +25 -9
  279. package/src/math/FrustumArray.js +10 -5
  280. package/src/math/Line3.js +129 -2
  281. package/src/math/MathUtils.js +13 -11
  282. package/src/math/Matrix2.js +1 -1
  283. package/src/math/Matrix3.js +2 -2
  284. package/src/math/Matrix4.js +55 -34
  285. package/src/math/Plane.js +1 -1
  286. package/src/math/Quaternion.js +69 -67
  287. package/src/math/Spherical.js +3 -3
  288. package/src/nodes/Nodes.js +6 -4
  289. package/src/nodes/TSL.js +9 -4
  290. package/src/nodes/accessors/AccessorsUtils.js +7 -8
  291. package/src/nodes/accessors/Bitangent.js +31 -25
  292. package/src/nodes/accessors/BufferNode.js +1 -1
  293. package/src/nodes/accessors/Camera.js +142 -16
  294. package/src/nodes/accessors/ClippingNode.js +6 -5
  295. package/src/nodes/accessors/CubeTextureNode.js +5 -4
  296. package/src/nodes/accessors/InstanceNode.js +25 -5
  297. package/src/nodes/accessors/Lights.js +10 -0
  298. package/src/nodes/accessors/Normal.js +97 -30
  299. package/src/nodes/accessors/Object3DNode.js +2 -2
  300. package/src/nodes/accessors/Position.js +25 -9
  301. package/src/nodes/accessors/ReferenceBaseNode.js +1 -1
  302. package/src/nodes/accessors/ReferenceNode.js +20 -4
  303. package/src/nodes/accessors/ReflectVector.js +3 -3
  304. package/src/nodes/accessors/SceneNode.js +3 -2
  305. package/src/nodes/accessors/StorageBufferNode.js +2 -1
  306. package/src/nodes/accessors/StorageTextureNode.js +23 -1
  307. package/src/nodes/accessors/Tangent.js +25 -17
  308. package/src/nodes/accessors/TangentUtils.js +46 -0
  309. package/src/nodes/accessors/Texture3DNode.js +14 -1
  310. package/src/nodes/accessors/TextureBicubic.js +21 -3
  311. package/src/nodes/accessors/TextureNode.js +142 -44
  312. package/src/nodes/accessors/UniformArrayNode.js +0 -16
  313. package/src/nodes/code/FunctionCallNode.js +24 -4
  314. package/src/nodes/code/FunctionNode.js +23 -0
  315. package/src/nodes/core/ArrayNode.js +13 -0
  316. package/src/nodes/core/AssignNode.js +6 -2
  317. package/src/nodes/core/AttributeNode.js +2 -1
  318. package/src/nodes/core/ContextNode.js +48 -10
  319. package/src/nodes/core/IndexNode.js +2 -2
  320. package/src/nodes/core/InputNode.js +2 -1
  321. package/src/nodes/core/InspectorNode.js +128 -0
  322. package/src/nodes/core/{CacheNode.js → IsolateNode.js} +36 -17
  323. package/src/nodes/core/Node.js +167 -34
  324. package/src/nodes/core/NodeBuilder.js +404 -120
  325. package/src/nodes/core/NodeFrame.js +21 -21
  326. package/src/nodes/core/NodeFunction.js +2 -1
  327. package/src/nodes/core/NodeParser.js +2 -1
  328. package/src/nodes/core/NodeUniform.js +1 -1
  329. package/src/nodes/core/NodeUtils.js +17 -88
  330. package/src/nodes/core/ParameterNode.js +31 -0
  331. package/src/nodes/core/PropertyNode.js +7 -0
  332. package/src/nodes/core/StackNode.js +77 -30
  333. package/src/nodes/core/StructNode.js +5 -5
  334. package/src/nodes/core/StructTypeNode.js +1 -0
  335. package/src/nodes/core/SubBuildNode.js +89 -0
  336. package/src/nodes/core/UniformNode.js +80 -14
  337. package/src/nodes/core/VarNode.js +142 -16
  338. package/src/nodes/core/VaryingNode.js +9 -6
  339. package/src/nodes/display/BlendModes.js +7 -6
  340. package/src/nodes/display/BumpMapNode.js +1 -1
  341. package/src/nodes/display/ColorAdjustment.js +1 -1
  342. package/src/nodes/display/FrontFacingNode.js +35 -7
  343. package/src/nodes/display/NormalMapNode.js +20 -50
  344. package/src/nodes/display/PassNode.js +206 -17
  345. package/src/nodes/display/RenderOutputNode.js +28 -2
  346. package/src/nodes/display/ScreenNode.js +44 -40
  347. package/src/nodes/display/ToneMappingNode.js +31 -4
  348. package/src/nodes/display/ToonOutlinePassNode.js +8 -0
  349. package/src/nodes/display/ViewportDepthTextureNode.js +16 -4
  350. package/src/nodes/display/ViewportSharedTextureNode.js +12 -0
  351. package/src/nodes/display/ViewportTextureNode.js +94 -4
  352. package/src/nodes/fog/Fog.js +3 -2
  353. package/src/nodes/functions/BSDF/BRDF_GGX.js +2 -6
  354. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +52 -0
  355. package/src/nodes/functions/BSDF/BRDF_Sheen.js +4 -4
  356. package/src/nodes/functions/BSDF/DFGApprox.js +60 -19
  357. package/src/nodes/functions/BasicLightingModel.js +2 -1
  358. package/src/nodes/functions/PhongLightingModel.js +3 -3
  359. package/src/nodes/functions/PhysicalLightingModel.js +19 -18
  360. package/src/nodes/functions/VolumetricLightingModel.js +5 -5
  361. package/src/nodes/functions/material/getGeometryRoughness.js +2 -2
  362. package/src/nodes/geometry/RangeNode.js +40 -4
  363. package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
  364. package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -1
  365. package/src/nodes/gpgpu/ComputeNode.js +81 -25
  366. package/src/nodes/gpgpu/SubgroupFunctionNode.js +455 -0
  367. package/src/nodes/gpgpu/WorkgroupInfoNode.js +29 -3
  368. package/src/nodes/lighting/EnvironmentNode.js +11 -11
  369. package/src/nodes/lighting/LightsNode.js +7 -8
  370. package/src/nodes/lighting/PointShadowNode.js +6 -0
  371. package/src/nodes/lighting/ProjectorLightNode.js +19 -6
  372. package/src/nodes/lighting/ShadowFilterNode.js +3 -1
  373. package/src/nodes/lighting/ShadowNode.js +77 -10
  374. package/src/nodes/materialx/MaterialXNodes.js +131 -2
  375. package/src/nodes/materialx/lib/mx_noise.js +165 -1
  376. package/src/nodes/math/BitcastNode.js +156 -0
  377. package/src/nodes/math/ConditionalNode.js +25 -27
  378. package/src/nodes/math/MathNode.js +106 -65
  379. package/src/nodes/math/OperatorNode.js +28 -43
  380. package/src/nodes/pmrem/PMREMUtils.js +117 -2
  381. package/src/nodes/shapes/Shapes.js +1 -1
  382. package/src/nodes/tsl/TSLBase.js +6 -2
  383. package/src/nodes/tsl/TSLCore.js +546 -186
  384. package/src/nodes/utils/DebugNode.js +3 -2
  385. package/src/nodes/utils/EquirectUV.js +27 -0
  386. package/src/nodes/utils/EventNode.js +119 -0
  387. package/src/nodes/utils/FunctionOverloadingNode.js +37 -19
  388. package/src/nodes/utils/JoinNode.js +6 -3
  389. package/src/nodes/utils/LoopNode.js +20 -41
  390. package/src/nodes/utils/MatcapUV.js +22 -0
  391. package/src/nodes/utils/MemberNode.js +59 -7
  392. package/src/nodes/utils/PostProcessingUtils.js +28 -1
  393. package/src/nodes/utils/RTTNode.js +33 -6
  394. package/src/nodes/utils/ReflectorNode.js +68 -10
  395. package/src/nodes/utils/SampleNode.js +91 -0
  396. package/src/nodes/utils/SplitNode.js +11 -0
  397. package/src/nodes/utils/Timer.js +0 -47
  398. package/src/nodes/utils/TriplanarTextures.js +65 -0
  399. package/src/objects/BatchedMesh.js +6 -4
  400. package/src/objects/LOD.js +1 -1
  401. package/src/objects/Line.js +2 -1
  402. package/src/objects/LineSegments.js +2 -1
  403. package/src/objects/Skeleton.js +3 -2
  404. package/src/objects/SkinnedMesh.js +3 -1
  405. package/src/objects/Sprite.js +4 -3
  406. package/src/renderers/WebGLRenderer.js +77 -66
  407. package/src/renderers/common/Animation.js +13 -1
  408. package/src/renderers/common/Attributes.js +1 -1
  409. package/src/renderers/common/Backend.js +108 -27
  410. package/src/renderers/common/Background.js +4 -3
  411. package/src/renderers/common/Bindings.js +76 -19
  412. package/src/renderers/common/CanvasTarget.js +341 -0
  413. package/src/renderers/common/ChainMap.js +1 -1
  414. package/src/renderers/common/Color4.js +2 -2
  415. package/src/renderers/common/CubeRenderTarget.js +1 -1
  416. package/src/renderers/common/DataMap.js +1 -1
  417. package/src/renderers/common/Geometries.js +26 -0
  418. package/src/renderers/common/Info.js +4 -2
  419. package/src/renderers/common/InspectorBase.js +146 -0
  420. package/src/renderers/common/Pipelines.js +1 -1
  421. package/src/renderers/common/PostProcessing.js +61 -25
  422. package/src/renderers/common/QuadMesh.js +7 -1
  423. package/src/renderers/common/RenderContext.js +2 -2
  424. package/src/renderers/common/RenderList.js +7 -3
  425. package/src/renderers/common/RenderObject.js +84 -5
  426. package/src/renderers/common/RenderObjects.js +1 -1
  427. package/src/renderers/common/Renderer.js +486 -255
  428. package/src/renderers/common/RendererUtils.js +9 -0
  429. package/src/renderers/common/SampledTexture.js +8 -68
  430. package/src/renderers/common/Sampler.js +117 -0
  431. package/src/renderers/common/Storage3DTexture.js +100 -0
  432. package/src/renderers/common/StorageArrayTexture.js +84 -0
  433. package/src/renderers/common/StorageTexture.js +27 -0
  434. package/src/renderers/common/Textures.js +138 -46
  435. package/src/renderers/common/TimestampQueryPool.js +65 -3
  436. package/src/renderers/common/UniformsGroup.js +2 -1
  437. package/src/renderers/common/XRManager.js +63 -24
  438. package/src/renderers/common/XRRenderTarget.js +21 -4
  439. package/src/renderers/common/extras/PMREMGenerator.js +161 -66
  440. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  441. package/src/renderers/common/nodes/NodeLibrary.js +9 -7
  442. package/src/renderers/common/nodes/NodeSampledTexture.js +0 -12
  443. package/src/renderers/common/nodes/NodeSampler.js +13 -1
  444. package/src/renderers/common/nodes/Nodes.js +38 -16
  445. package/src/renderers/shaders/DFGLUTData.js +64 -0
  446. package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -12
  447. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +1 -1
  448. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +1 -1
  449. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +52 -18
  450. package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +1 -1
  451. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
  452. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +1 -1
  453. package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +1 -1
  454. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +21 -11
  455. package/src/renderers/shaders/ShaderLib/depth.glsl.js +11 -2
  456. package/src/renderers/shaders/UniformsLib.js +1 -0
  457. package/src/renderers/shaders/UniformsUtils.js +25 -4
  458. package/src/renderers/webgl/WebGLAttributes.js +4 -0
  459. package/src/renderers/webgl/WebGLCapabilities.js +4 -3
  460. package/src/renderers/webgl/WebGLExtensions.js +2 -25
  461. package/src/renderers/webgl/WebGLInfo.js +3 -1
  462. package/src/renderers/webgl/WebGLProgram.js +25 -18
  463. package/src/renderers/webgl/WebGLPrograms.js +9 -6
  464. package/src/renderers/webgl/WebGLShadowMap.js +13 -2
  465. package/src/renderers/webgl/WebGLState.js +17 -16
  466. package/src/renderers/webgl/WebGLTextures.js +38 -21
  467. package/src/renderers/webgl/WebGLUniformsGroups.js +5 -3
  468. package/src/renderers/webgl/WebGLUtils.js +3 -2
  469. package/src/renderers/webgl-fallback/WebGLBackend.js +245 -182
  470. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +184 -30
  471. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +4 -0
  472. package/src/renderers/webgl-fallback/utils/WebGLConstants.js +2 -3
  473. package/src/renderers/webgl-fallback/utils/WebGLState.js +9 -8
  474. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +171 -19
  475. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +51 -22
  476. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +3 -2
  477. package/src/renderers/webgpu/WebGPUBackend.js +205 -128
  478. package/src/renderers/webgpu/WebGPURenderer.Nodes.js +2 -1
  479. package/src/renderers/webgpu/WebGPURenderer.js +3 -2
  480. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +198 -121
  481. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +8 -1
  482. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +49 -33
  483. package/src/renderers/webgpu/utils/WebGPUConstants.js +14 -3
  484. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +56 -37
  485. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +6 -8
  486. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +266 -158
  487. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +32 -9
  488. package/src/renderers/webgpu/utils/WebGPUUtils.js +24 -19
  489. package/src/renderers/webxr/WebXRDepthSensing.js +6 -10
  490. package/src/renderers/webxr/WebXRManager.js +89 -13
  491. package/src/textures/ExternalTexture.js +56 -0
  492. package/src/textures/FramebufferTexture.js +2 -2
  493. package/src/textures/Source.js +14 -3
  494. package/src/textures/Texture.js +3 -2
  495. package/src/textures/VideoTexture.js +29 -2
  496. package/src/utils.js +67 -3
  497. package/examples/jsm/loaders/RGBMLoader.js +0 -1148
  498. package/examples/jsm/tsl/display/TRAAPassNode.js +0 -452
  499. package/src/nodes/utils/EquirectUVNode.js +0 -65
  500. package/src/nodes/utils/MatcapUVNode.js +0 -49
  501. package/src/nodes/utils/TriplanarTexturesNode.js +0 -148
@@ -0,0 +1,578 @@
1
+ import { HalfFloatType, Vector2, RenderTarget, RendererUtils, QuadMesh, NodeMaterial, TempNode, NodeUpdateType, Matrix4, DepthTexture } from 'three/webgpu';
2
+ import { add, float, If, Loop, int, Fn, min, max, clamp, nodeObject, texture, uniform, uv, vec2, vec4, luminance, convertToTexture, passTexture, velocity, getViewPosition, length } from 'three/tsl';
3
+
4
+ const _quadMesh = /*@__PURE__*/ new QuadMesh();
5
+ const _size = /*@__PURE__*/ new Vector2();
6
+
7
+ let _rendererState;
8
+
9
+
10
+ /**
11
+ * A special node that applies TRAA (Temporal Reprojection Anti-Aliasing).
12
+ *
13
+ * References:
14
+ * - {@link https://alextardif.com/TAA.html}
15
+ * - {@link https://www.elopezr.com/temporal-aa-and-the-quest-for-the-holy-trail/}
16
+ *
17
+ * @augments TempNode
18
+ * @three_import import { traa } from 'three/addons/tsl/display/TRAANode.js';
19
+ */
20
+ class TRAANode extends TempNode {
21
+
22
+ static get type() {
23
+
24
+ return 'TRAANode';
25
+
26
+ }
27
+
28
+ /**
29
+ * Constructs a new TRAA node.
30
+ *
31
+ * @param {TextureNode} beautyNode - The texture node that represents the input of the effect.
32
+ * @param {TextureNode} depthNode - A node that represents the scene's depth.
33
+ * @param {TextureNode} velocityNode - A node that represents the scene's velocity.
34
+ * @param {Camera} camera - The camera the scene is rendered with.
35
+ */
36
+ constructor( beautyNode, depthNode, velocityNode, camera ) {
37
+
38
+ super( 'vec4' );
39
+
40
+ /**
41
+ * This flag can be used for type testing.
42
+ *
43
+ * @type {boolean}
44
+ * @readonly
45
+ * @default true
46
+ */
47
+ this.isTRAANode = true;
48
+
49
+ /**
50
+ * The `updateBeforeType` is set to `NodeUpdateType.FRAME` since the node renders
51
+ * its effect once per frame in `updateBefore()`.
52
+ *
53
+ * @type {string}
54
+ * @default 'frame'
55
+ */
56
+ this.updateBeforeType = NodeUpdateType.FRAME;
57
+
58
+ /**
59
+ * The texture node that represents the input of the effect.
60
+ *
61
+ * @type {TextureNode}
62
+ */
63
+ this.beautyNode = beautyNode;
64
+
65
+ /**
66
+ * A node that represents the scene's velocity.
67
+ *
68
+ * @type {TextureNode}
69
+ */
70
+ this.depthNode = depthNode;
71
+
72
+ /**
73
+ * A node that represents the scene's velocity.
74
+ *
75
+ * @type {TextureNode}
76
+ */
77
+ this.velocityNode = velocityNode;
78
+
79
+ /**
80
+ * The camera the scene is rendered with.
81
+ *
82
+ * @type {Camera}
83
+ */
84
+ this.camera = camera;
85
+
86
+ /**
87
+ * The jitter index selects the current camera offset value.
88
+ *
89
+ * @private
90
+ * @type {number}
91
+ * @default 0
92
+ */
93
+ this._jitterIndex = 0;
94
+
95
+ /**
96
+ * A uniform node holding the inverse resolution value.
97
+ *
98
+ * @private
99
+ * @type {UniformNode<vec2>}
100
+ */
101
+ this._invSize = uniform( new Vector2() );
102
+
103
+ /**
104
+ * A uniform node holding the camera world matrix.
105
+ *
106
+ * @private
107
+ * @type {UniformNode<mat4>}
108
+ */
109
+ this._cameraWorldMatrix = uniform( new Matrix4() );
110
+
111
+ /**
112
+ * A uniform node holding the camera projection matrix inverse.
113
+ *
114
+ * @private
115
+ * @type {UniformNode<mat4>}
116
+ */
117
+ this._cameraProjectionMatrixInverse = uniform( new Matrix4() );
118
+
119
+ /**
120
+ * A uniform node holding the previous frame's view matrix.
121
+ *
122
+ * @private
123
+ * @type {UniformNode<mat4>}
124
+ */
125
+ this._previousCameraWorldMatrix = uniform( new Matrix4() );
126
+
127
+ /**
128
+ * A uniform node holding the previous frame's projection matrix inverse.
129
+ *
130
+ * @private
131
+ * @type {UniformNode<mat4>}
132
+ */
133
+ this._previousCameraProjectionMatrixInverse = uniform( new Matrix4() );
134
+
135
+ /**
136
+ * The render target that represents the history of frame data.
137
+ *
138
+ * @private
139
+ * @type {?RenderTarget}
140
+ */
141
+ this._historyRenderTarget = new RenderTarget( 1, 1, { depthBuffer: false, type: HalfFloatType, depthTexture: new DepthTexture() } );
142
+ this._historyRenderTarget.texture.name = 'TRAANode.history';
143
+
144
+ /**
145
+ * The render target for the resolve.
146
+ *
147
+ * @private
148
+ * @type {?RenderTarget}
149
+ */
150
+ this._resolveRenderTarget = new RenderTarget( 1, 1, { depthBuffer: false, type: HalfFloatType } );
151
+ this._resolveRenderTarget.texture.name = 'TRAANode.resolve';
152
+
153
+ /**
154
+ * Material used for the resolve step.
155
+ *
156
+ * @private
157
+ * @type {NodeMaterial}
158
+ */
159
+ this._resolveMaterial = new NodeMaterial();
160
+ this._resolveMaterial.name = 'TRAA.resolve';
161
+
162
+ /**
163
+ * The result of the effect is represented as a separate texture node.
164
+ *
165
+ * @private
166
+ * @type {PassTextureNode}
167
+ */
168
+ this._textureNode = passTexture( this, this._resolveRenderTarget.texture );
169
+
170
+ /**
171
+ * Used to save the original/unjittered projection matrix.
172
+ *
173
+ * @private
174
+ * @type {Matrix4}
175
+ */
176
+ this._originalProjectionMatrix = new Matrix4();
177
+
178
+ /**
179
+ * A texture node for the previous depth buffer.
180
+ *
181
+ * @private
182
+ * @type {TextureNode}
183
+ */
184
+ this._previousDepthNode = texture( new DepthTexture( 1, 1 ) );
185
+
186
+ /**
187
+ * Sync the post processing stack with the TRAA node.
188
+ * @private
189
+ * @type {boolean}
190
+ */
191
+ this._needsPostProcessingSync = false;
192
+
193
+ }
194
+
195
+ /**
196
+ * Returns the result of the effect as a texture node.
197
+ *
198
+ * @return {PassTextureNode} A texture node that represents the result of the effect.
199
+ */
200
+ getTextureNode() {
201
+
202
+ return this._textureNode;
203
+
204
+ }
205
+
206
+ /**
207
+ * Sets the size of the effect.
208
+ *
209
+ * @param {number} width - The width of the effect.
210
+ * @param {number} height - The height of the effect.
211
+ */
212
+ setSize( width, height ) {
213
+
214
+ this._historyRenderTarget.setSize( width, height );
215
+ this._resolveRenderTarget.setSize( width, height );
216
+
217
+ this._invSize.value.set( 1 / width, 1 / height );
218
+
219
+ }
220
+
221
+ /**
222
+ * Defines the TRAA's current jitter as a view offset
223
+ * to the scene's camera.
224
+ *
225
+ * @param {number} width - The width of the effect.
226
+ * @param {number} height - The height of the effect.
227
+ */
228
+ setViewOffset( width, height ) {
229
+
230
+ // save original/unjittered projection matrix for velocity pass
231
+
232
+ this.camera.updateProjectionMatrix();
233
+ this._originalProjectionMatrix.copy( this.camera.projectionMatrix );
234
+
235
+ velocity.setProjectionMatrix( this._originalProjectionMatrix );
236
+
237
+ //
238
+
239
+ const viewOffset = {
240
+
241
+ fullWidth: width,
242
+ fullHeight: height,
243
+ offsetX: 0,
244
+ offsetY: 0,
245
+ width: width,
246
+ height: height
247
+
248
+ };
249
+
250
+ const jitterOffset = _JitterVectors[ this._jitterIndex ];
251
+
252
+ this.camera.setViewOffset(
253
+
254
+ viewOffset.fullWidth, viewOffset.fullHeight,
255
+
256
+ viewOffset.offsetX + jitterOffset[ 0 ] * 0.0625, viewOffset.offsetY + jitterOffset[ 1 ] * 0.0625, // 0.0625 = 1 / 16
257
+
258
+ viewOffset.width, viewOffset.height
259
+
260
+ );
261
+
262
+ }
263
+
264
+ /**
265
+ * Clears the view offset from the scene's camera.
266
+ */
267
+ clearViewOffset() {
268
+
269
+ this.camera.clearViewOffset();
270
+
271
+ velocity.setProjectionMatrix( null );
272
+
273
+ // update jitter index
274
+
275
+ this._jitterIndex ++;
276
+ this._jitterIndex = this._jitterIndex % ( _JitterVectors.length - 1 );
277
+
278
+ }
279
+
280
+ /**
281
+ * This method is used to render the effect once per frame.
282
+ *
283
+ * @param {NodeFrame} frame - The current node frame.
284
+ */
285
+ updateBefore( frame ) {
286
+
287
+ const { renderer } = frame;
288
+
289
+ // store previous frame matrices before updating current ones
290
+
291
+ this._previousCameraWorldMatrix.value.copy( this._cameraWorldMatrix.value );
292
+ this._previousCameraProjectionMatrixInverse.value.copy( this._cameraProjectionMatrixInverse.value );
293
+
294
+ // update camera matrices uniforms
295
+
296
+ this._cameraWorldMatrix.value.copy( this.camera.matrixWorld );
297
+ this._cameraProjectionMatrixInverse.value.copy( this.camera.projectionMatrixInverse );
298
+
299
+ // keep the TRAA in sync with the dimensions of the beauty node
300
+
301
+ const beautyRenderTarget = ( this.beautyNode.isRTTNode ) ? this.beautyNode.renderTarget : this.beautyNode.passNode.renderTarget;
302
+
303
+ const width = beautyRenderTarget.texture.width;
304
+ const height = beautyRenderTarget.texture.height;
305
+
306
+ //
307
+
308
+ if ( this._needsPostProcessingSync === true ) {
309
+
310
+ this.setViewOffset( width, height );
311
+
312
+ this._needsPostProcessingSync = false;
313
+
314
+ }
315
+
316
+ _rendererState = RendererUtils.resetRendererState( renderer, _rendererState );
317
+
318
+ //
319
+
320
+ const needsRestart = this._historyRenderTarget.width !== width || this._historyRenderTarget.height !== height;
321
+ this.setSize( width, height );
322
+
323
+ // every time when the dimensions change we need fresh history data
324
+
325
+ if ( needsRestart === true ) {
326
+
327
+ // bind and clear render target to make sure they are initialized after the resize which triggers a dispose()
328
+
329
+ renderer.setRenderTarget( this._historyRenderTarget );
330
+ renderer.clear();
331
+
332
+ renderer.setRenderTarget( this._resolveRenderTarget );
333
+ renderer.clear();
334
+
335
+ // make sure to reset the history with the contents of the beauty buffer otherwise subsequent frames after the
336
+ // resize will fade from a darker color to the correct one because the history was cleared with black.
337
+
338
+ renderer.copyTextureToTexture( beautyRenderTarget.texture, this._historyRenderTarget.texture );
339
+
340
+ }
341
+
342
+ // resolve
343
+
344
+ renderer.setRenderTarget( this._resolveRenderTarget );
345
+ _quadMesh.material = this._resolveMaterial;
346
+ _quadMesh.name = 'TRAA';
347
+ _quadMesh.render( renderer );
348
+ renderer.setRenderTarget( null );
349
+
350
+ // update history
351
+
352
+ renderer.copyTextureToTexture( this._resolveRenderTarget.texture, this._historyRenderTarget.texture );
353
+
354
+ // Copy current depth to previous depth buffer
355
+
356
+ const size = renderer.getDrawingBufferSize( _size );
357
+
358
+ // only allow the depth copy if the dimensions of the history render target match with the drawing
359
+ // render buffer and thus the depth texture of the scene. For some reasons, there are timing issues
360
+ // with WebGPU resulting in different size of the drawing buffer and the beauty render target when
361
+ // resizing the browser window. This does not happen with the WebGL backend
362
+
363
+ if ( this._historyRenderTarget.height === size.height && this._historyRenderTarget.width === size.width ) {
364
+
365
+ const currentDepth = this.depthNode.value;
366
+ renderer.copyTextureToTexture( currentDepth, this._historyRenderTarget.depthTexture );
367
+ this._previousDepthNode.value = this._historyRenderTarget.depthTexture;
368
+
369
+ }
370
+
371
+ // restore
372
+
373
+ RendererUtils.restoreRendererState( renderer, _rendererState );
374
+
375
+ }
376
+
377
+ /**
378
+ * This method is used to setup the effect's render targets and TSL code.
379
+ *
380
+ * @param {NodeBuilder} builder - The current node builder.
381
+ * @return {PassTextureNode}
382
+ */
383
+ setup( builder ) {
384
+
385
+ const postProcessing = builder.context.postProcessing;
386
+
387
+ if ( postProcessing ) {
388
+
389
+ this._needsPostProcessingSync = true;
390
+
391
+ postProcessing.context.onBeforePostProcessing = () => {
392
+
393
+ const size = builder.renderer.getDrawingBufferSize( _size );
394
+ this.setViewOffset( size.width, size.height );
395
+
396
+ };
397
+
398
+ postProcessing.context.onAfterPostProcessing = () => {
399
+
400
+ this.clearViewOffset();
401
+
402
+ };
403
+
404
+ }
405
+
406
+ const historyTexture = texture( this._historyRenderTarget.texture );
407
+ const sampleTexture = this.beautyNode;
408
+ const depthTexture = this.depthNode;
409
+ const velocityTexture = this.velocityNode;
410
+
411
+ const resolve = Fn( () => {
412
+
413
+ const uvNode = uv();
414
+
415
+ const minColor = vec4( 10000 ).toVar();
416
+ const maxColor = vec4( - 10000 ).toVar();
417
+ const closestDepth = float( 1 ).toVar();
418
+ const farthestDepth = float( 0 ).toVar();
419
+ const closestDepthPixelPosition = vec2( 0 ).toVar();
420
+
421
+ // sample a 3x3 neighborhood to create a box in color space
422
+ // clamping the history color with the resulting min/max colors mitigates ghosting
423
+
424
+ Loop( { start: int( - 1 ), end: int( 1 ), type: 'int', condition: '<=', name: 'x' }, ( { x } ) => {
425
+
426
+ Loop( { start: int( - 1 ), end: int( 1 ), type: 'int', condition: '<=', name: 'y' }, ( { y } ) => {
427
+
428
+ const uvNeighbor = uvNode.add( vec2( float( x ), float( y ) ).mul( this._invSize ) ).toVar();
429
+ const colorNeighbor = max( vec4( 0 ), sampleTexture.sample( uvNeighbor ) ).toVar(); // use max() to avoid propagate garbage values
430
+
431
+ minColor.assign( min( minColor, colorNeighbor ) );
432
+ maxColor.assign( max( maxColor, colorNeighbor ) );
433
+
434
+ const currentDepth = depthTexture.sample( uvNeighbor ).r.toVar();
435
+
436
+ // find the sample position of the closest depth in the neighborhood (used for velocity)
437
+
438
+ If( currentDepth.lessThan( closestDepth ), () => {
439
+
440
+ closestDepth.assign( currentDepth );
441
+ closestDepthPixelPosition.assign( uvNeighbor );
442
+
443
+ } );
444
+
445
+ // find the farthest depth in the neighborhood (used to preserve edge anti-aliasing)
446
+
447
+ If( currentDepth.greaterThan( farthestDepth ), () => {
448
+
449
+ farthestDepth.assign( currentDepth );
450
+
451
+ } );
452
+
453
+ } );
454
+
455
+ } );
456
+
457
+ // sampling/reprojection
458
+
459
+ const offset = velocityTexture.sample( closestDepthPixelPosition ).xy.mul( vec2( 0.5, - 0.5 ) ); // NDC to uv offset
460
+
461
+ const currentColor = sampleTexture.sample( uvNode );
462
+ const historyColor = historyTexture.sample( uvNode.sub( offset ) );
463
+
464
+ // clamping
465
+
466
+ const clampedHistoryColor = clamp( historyColor, minColor, maxColor );
467
+
468
+ // calculate current frame world position
469
+
470
+ const currentDepth = depthTexture.sample( uvNode ).r;
471
+ const currentViewPosition = getViewPosition( uvNode, currentDepth, this._cameraProjectionMatrixInverse );
472
+ const currentWorldPosition = this._cameraWorldMatrix.mul( vec4( currentViewPosition, 1.0 ) ).xyz;
473
+
474
+ // calculate previous frame world position from history UV and previous depth
475
+
476
+ const historyUV = uvNode.sub( offset );
477
+ const previousDepth = this._previousDepthNode.sample( historyUV ).r;
478
+ const previousViewPosition = getViewPosition( historyUV, previousDepth, this._previousCameraProjectionMatrixInverse );
479
+ const previousWorldPosition = this._previousCameraWorldMatrix.mul( vec4( previousViewPosition, 1.0 ) ).xyz;
480
+
481
+ // calculate difference in world positions
482
+
483
+ const worldPositionDifference = length( currentWorldPosition.sub( previousWorldPosition ) ).toVar();
484
+ worldPositionDifference.assign( min( max( worldPositionDifference.sub( 1.0 ), 0.0 ), 1.0 ) );
485
+
486
+ // Adaptive blend weights based on velocity magnitude suggested by CLAUDE in #32133
487
+ // Higher velocity or position difference = more weight on current frame to reduce ghosting
488
+
489
+ const velocityMagnitude = length( offset ).toConst();
490
+ const motionFactor = max( worldPositionDifference.mul( 0.5 ), velocityMagnitude.mul( 10.0 ) ).toVar();
491
+ motionFactor.assign( min( motionFactor, 1.0 ) );
492
+
493
+ const currentWeight = float( 0.05 ).add( motionFactor.mul( 0.25 ) ).toVar();
494
+ const historyWeight = currentWeight.oneMinus().toVar();
495
+
496
+ // zero out history weight if world positions are different (indicating motion) except on edges.
497
+ // note that the constants 0.00001 and 0.5 were suggested by CLAUDE in #32133
498
+
499
+ const isEdge = farthestDepth.sub( closestDepth ).greaterThan( 0.00001 );
500
+ const strongDisocclusion = worldPositionDifference.greaterThan( 0.5 ).and( isEdge.not() );
501
+
502
+ If( strongDisocclusion, () => {
503
+
504
+ currentWeight.assign( 1.0 );
505
+ historyWeight.assign( 0.0 );
506
+
507
+ } );
508
+
509
+ // flicker reduction based on luminance weighing
510
+
511
+ const compressedCurrent = currentColor.mul( float( 1 ).div( ( max( currentColor.r, currentColor.g, currentColor.b ).add( 1.0 ) ) ) );
512
+ const compressedHistory = clampedHistoryColor.mul( float( 1 ).div( ( max( clampedHistoryColor.r, clampedHistoryColor.g, clampedHistoryColor.b ).add( 1.0 ) ) ) );
513
+
514
+ const luminanceCurrent = luminance( compressedCurrent.rgb );
515
+ const luminanceHistory = luminance( compressedHistory.rgb );
516
+
517
+ currentWeight.mulAssign( float( 1.0 ).div( luminanceCurrent.add( 1 ) ) );
518
+ historyWeight.mulAssign( float( 1.0 ).div( luminanceHistory.add( 1 ) ) );
519
+
520
+ const smoothedOutput = add( currentColor.mul( currentWeight ), clampedHistoryColor.mul( historyWeight ) ).div( max( currentWeight.add( historyWeight ), 0.00001 ) ).toVar();
521
+
522
+ return smoothedOutput;
523
+
524
+ } );
525
+
526
+ // materials
527
+
528
+ this._resolveMaterial.colorNode = resolve();
529
+
530
+ return this._textureNode;
531
+
532
+ }
533
+
534
+ /**
535
+ * Frees internal resources. This method should be called
536
+ * when the effect is no longer required.
537
+ */
538
+ dispose() {
539
+
540
+ this._historyRenderTarget.dispose();
541
+ this._resolveRenderTarget.dispose();
542
+
543
+ this._resolveMaterial.dispose();
544
+
545
+ }
546
+
547
+ }
548
+
549
+ export default TRAANode;
550
+
551
+ // These jitter vectors are specified in integers because it is easier.
552
+ // I am assuming a [-8,8) integer grid, but it needs to be mapped onto [-0.5,0.5)
553
+ // before being used, thus these integers need to be scaled by 1/16.
554
+ //
555
+ // Sample patterns reference: https://msdn.microsoft.com/en-us/library/windows/desktop/ff476218%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396
556
+ const _JitterVectors = [
557
+ [ - 4, - 7 ], [ - 7, - 5 ], [ - 3, - 5 ], [ - 5, - 4 ],
558
+ [ - 1, - 4 ], [ - 2, - 2 ], [ - 6, - 1 ], [ - 4, 0 ],
559
+ [ - 7, 1 ], [ - 1, 2 ], [ - 6, 3 ], [ - 3, 3 ],
560
+ [ - 7, 6 ], [ - 3, 6 ], [ - 5, 7 ], [ - 1, 7 ],
561
+ [ 5, - 7 ], [ 1, - 6 ], [ 6, - 5 ], [ 4, - 4 ],
562
+ [ 2, - 3 ], [ 7, - 2 ], [ 1, - 1 ], [ 4, - 1 ],
563
+ [ 2, 1 ], [ 6, 2 ], [ 0, 4 ], [ 4, 4 ],
564
+ [ 2, 5 ], [ 7, 5 ], [ 5, 6 ], [ 3, 7 ]
565
+ ];
566
+
567
+ /**
568
+ * TSL function for creating a TRAA node for Temporal Reprojection Anti-Aliasing.
569
+ *
570
+ * @tsl
571
+ * @function
572
+ * @param {TextureNode} beautyNode - The texture node that represents the input of the effect.
573
+ * @param {TextureNode} depthNode - A node that represents the scene's depth.
574
+ * @param {TextureNode} velocityNode - A node that represents the scene's velocity.
575
+ * @param {Camera} camera - The camera the scene is rendered with.
576
+ * @returns {TRAANode}
577
+ */
578
+ export const traa = ( beautyNode, depthNode, velocityNode, camera ) => nodeObject( new TRAANode( convertToTexture( beautyNode ), depthNode, velocityNode, camera ) );
@@ -0,0 +1,65 @@
1
+ import { Fn, vec2, uv, Loop, vec4, premultiplyAlpha, unpremultiplyAlpha, max, int, textureSize, nodeObject, convertToTexture } from 'three/tsl';
2
+
3
+ /**
4
+ * Applies a box blur effect to the given texture node.
5
+ *
6
+ * Compared to Gaussian blur, box blur produces a more blocky result but with better performance when correctly
7
+ * configured. It is intended for mobile devices or performance restricted use cases where Gaussian is too heavy.
8
+ *
9
+ * The (kernel) `size` parameter should be small (1, 2 or 3) since it determines the number of samples based on (size * 2 + 1)^2.
10
+ * This implementation uses a single pass approach so the kernel is not applied as a separable filter. That means larger
11
+ * kernels won't perform well. Use Gaussian instead if you need a more high-quality blur.
12
+ *
13
+ * To produce wider blurs, increase the `separation` parameter instead which has no influence on the performance.
14
+ *
15
+ * Reference: {@link https://github.com/lettier/3d-game-shaders-for-beginners/blob/master/demonstration/shaders/fragment/box-blur.frag}.
16
+ *
17
+ * @tsl
18
+ * @function
19
+ * @param {Node<vec4>} textureNode - The texture node that should be blurred.
20
+ * @param {Object} [options={}] - Additional options for the hash blur effect.
21
+ * @param {Node<int>} [options.size=int(1)] - Controls the blur's kernel. For performant results, the range should within [1, 3].
22
+ * @param {Node<int>} [options.separation=int(1)] - Spreads out the blur without having to sample additional fragments. Ranges from [1, Infinity].
23
+ * @param {boolean} [options.premultipliedAlpha=false] - Whether to use premultiplied alpha for the blur effect.
24
+ * @return {Node<vec4>} The blurred texture node.
25
+ */
26
+ export const boxBlur = /*#__PURE__*/ Fn( ( [ textureNode, options = {} ] ) => {
27
+
28
+ textureNode = convertToTexture( textureNode );
29
+
30
+ const size = nodeObject( options.size ) || int( 1 );
31
+ const separation = nodeObject( options.separation ) || int( 1 );
32
+ const premultipliedAlpha = options.premultipliedAlpha || false;
33
+
34
+ const tap = ( uv ) => {
35
+
36
+ const sample = textureNode.sample( uv );
37
+
38
+ return premultipliedAlpha ? premultiplyAlpha( sample ) : sample;
39
+
40
+ };
41
+
42
+ const targetUV = textureNode.uvNode || uv();
43
+
44
+ const result = vec4( 0 );
45
+ const sep = max( separation, 1 );
46
+ const count = int( 0 );
47
+ const pixelStep = vec2( 1 ).div( textureSize( textureNode ) );
48
+
49
+ Loop( { start: size.negate(), end: size, name: 'i', condition: '<=' }, ( { i } ) => {
50
+
51
+ Loop( { start: size.negate(), end: size, name: 'j', condition: '<=' }, ( { j } ) => {
52
+
53
+ const uvs = targetUV.add( vec2( i, j ).mul( pixelStep ).mul( sep ) );
54
+ result.addAssign( tap( uvs ) );
55
+ count.addAssign( 1 );
56
+
57
+ } );
58
+
59
+ } );
60
+
61
+ result.divAssign( count );
62
+
63
+ return premultipliedAlpha ? unpremultiplyAlpha( result ) : result;
64
+
65
+ } );