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
@@ -1,5 +1,6 @@
1
1
  import TempNode from '../core/TempNode.js';
2
2
  import { addMethodChaining, nodeObject } from '../tsl/TSLCore.js';
3
+ import { log } from '../../utils.js';
3
4
 
4
5
  class DebugNode extends TempNode {
5
6
 
@@ -56,7 +57,7 @@ class DebugNode extends TempNode {
56
57
 
57
58
  } else {
58
59
 
59
- console.log( code );
60
+ log( code );
60
61
 
61
62
  }
62
63
 
@@ -77,6 +78,6 @@ export default DebugNode;
77
78
  * @param {?Function} [callback=null] - Optional callback function to handle the debug output.
78
79
  * @returns {DebugNode}
79
80
  */
80
- export const debug = ( node, callback = null ) => nodeObject( new DebugNode( nodeObject( node ), callback ) );
81
+ export const debug = ( node, callback = null ) => nodeObject( new DebugNode( nodeObject( node ), callback ) ).toStack();
81
82
 
82
83
  addMethodChaining( 'debug', debug );
@@ -0,0 +1,27 @@
1
+ import { positionWorldDirection } from '../accessors/Position.js';
2
+ import { Fn, vec2 } from '../tsl/TSLBase.js';
3
+
4
+ /**
5
+ * TSL function for creating an equirect uv node.
6
+ *
7
+ * Can be used to compute texture coordinates for projecting an
8
+ * equirectangular texture onto a mesh for using it as the scene's
9
+ * background.
10
+ *
11
+ * ```js
12
+ * scene.backgroundNode = texture( equirectTexture, equirectUV() );
13
+ * ```
14
+ *
15
+ * @tsl
16
+ * @function
17
+ * @param {?Node<vec3>} [dirNode=positionWorldDirection] - A direction vector for sampling which is by default `positionWorldDirection`.
18
+ * @returns {Node<vec2>}
19
+ */
20
+ export const equirectUV = /*@__PURE__*/ Fn( ( [ dir = positionWorldDirection ] ) => {
21
+
22
+ const u = dir.z.atan( dir.x ).mul( 1 / ( Math.PI * 2 ) ).add( 0.5 );
23
+ const v = dir.y.clamp( - 1.0, 1.0 ).asin().mul( 1 / Math.PI ).add( 0.5 );
24
+
25
+ return vec2( u, v );
26
+
27
+ } );
@@ -0,0 +1,119 @@
1
+ import Node from '../core/Node.js';
2
+ import { NodeUpdateType } from '../core/constants.js';
3
+ import { nodeObject } from '../tsl/TSLCore.js';
4
+
5
+ /**
6
+ * EventNode is a node that executes a callback during specific update phases.
7
+ *
8
+ * @augments Node
9
+ */
10
+ class EventNode extends Node {
11
+
12
+ static get type() {
13
+
14
+ return 'EventNode';
15
+
16
+ }
17
+
18
+ /**
19
+ * Creates an EventNode.
20
+ *
21
+ * @param {string} eventType - The type of event
22
+ * @param {Function} callback - The callback to execute on update.
23
+ */
24
+ constructor( eventType, callback ) {
25
+
26
+ super( 'void' );
27
+
28
+ this.eventType = eventType;
29
+ this.callback = callback;
30
+
31
+ if ( eventType === EventNode.OBJECT ) {
32
+
33
+ this.updateType = NodeUpdateType.OBJECT;
34
+
35
+ } else if ( eventType === EventNode.MATERIAL ) {
36
+
37
+ this.updateType = NodeUpdateType.RENDER;
38
+
39
+ } else if ( eventType === EventNode.BEFORE_OBJECT ) {
40
+
41
+ this.updateBeforeType = NodeUpdateType.OBJECT;
42
+
43
+ } else if ( eventType === EventNode.BEFORE_MATERIAL ) {
44
+
45
+ this.updateBeforeType = NodeUpdateType.RENDER;
46
+
47
+ }
48
+
49
+ }
50
+
51
+ update( frame ) {
52
+
53
+ this.callback( frame );
54
+
55
+ }
56
+
57
+ updateBefore( frame ) {
58
+
59
+ this.callback( frame );
60
+
61
+ }
62
+
63
+ }
64
+
65
+ EventNode.OBJECT = 'object';
66
+ EventNode.MATERIAL = 'material';
67
+ EventNode.BEFORE_OBJECT = 'beforeObject';
68
+ EventNode.BEFORE_MATERIAL = 'beforeMaterial';
69
+
70
+ export default EventNode;
71
+
72
+ /**
73
+ * Helper to create an EventNode and add it to the stack.
74
+ *
75
+ * @param {string} type - The event type.
76
+ * @param {Function} callback - The callback function.
77
+ * @returns {EventNode}
78
+ */
79
+ const createEvent = ( type, callback ) => nodeObject( new EventNode( type, callback ) ).toStack();
80
+
81
+ /**
82
+ * Creates an event that triggers a function every time an object (Mesh|Sprite) is rendered.
83
+ *
84
+ * The event will be bound to the declared TSL function `Fn()`; it must be declared within a `Fn()` or the JS function call must be inherited from one.
85
+ *
86
+ * @param {Function} callback - The callback function.
87
+ * @returns {EventNode}
88
+ */
89
+ export const OnObjectUpdate = ( callback ) => createEvent( EventNode.OBJECT, callback );
90
+
91
+ /**
92
+ * Creates an event that triggers a function when the first object that uses the material is rendered.
93
+ *
94
+ * The event will be bound to the declared TSL function `Fn()`; it must be declared within a `Fn()` or the JS function call must be inherited from one.
95
+ *
96
+ * @param {Function} callback - The callback function.
97
+ * @returns {EventNode}
98
+ */
99
+ export const OnMaterialUpdate = ( callback ) => createEvent( EventNode.MATERIAL, callback );
100
+
101
+ /**
102
+ * Creates an event that triggers a function before an object (Mesh|Sprite) is updated.
103
+ *
104
+ * The event will be bound to the declared TSL function `Fn()`; it must be declared within a `Fn()` or the JS function call must be inherited from one.
105
+ *
106
+ * @param {Function} callback - The callback function.
107
+ * @returns {EventNode}
108
+ */
109
+ export const OnBeforeObjectUpdate = ( callback ) => createEvent( EventNode.BEFORE_OBJECT, callback );
110
+
111
+ /**
112
+ * Creates an event that triggers a function before the material is updated.
113
+ *
114
+ * The event will be bound to the declared TSL function `Fn()`; it must be declared within a `Fn()` or the JS function call must be inherited from one.
115
+ *
116
+ * @param {Function} callback - The callback function.
117
+ * @returns {EventNode}
118
+ */
119
+ export const OnBeforeMaterialUpdate = ( callback ) => createEvent( EventNode.BEFORE_MATERIAL, callback );
@@ -46,7 +46,7 @@ class FunctionOverloadingNode extends Node {
46
46
  * @private
47
47
  * @type {ShaderCallNodeInternal}
48
48
  */
49
- this._candidateFnCall = null;
49
+ this._candidateFn = null;
50
50
 
51
51
  /**
52
52
  * This node is marked as global.
@@ -65,22 +65,30 @@ class FunctionOverloadingNode extends Node {
65
65
  * @param {NodeBuilder} builder - The current node builder.
66
66
  * @return {string} The node type.
67
67
  */
68
- getNodeType() {
68
+ getNodeType( builder ) {
69
69
 
70
- return this.functionNodes[ 0 ].shaderNode.layout.type;
70
+ const candidateFn = this.getCandidateFn( builder );
71
+
72
+ return candidateFn.shaderNode.layout.type;
71
73
 
72
74
  }
73
75
 
74
- setup( builder ) {
76
+ /**
77
+ * Returns the candidate function for the current parameters.
78
+ *
79
+ * @param {NodeBuilder} builder - The current node builder.
80
+ * @return {FunctionNode} The candidate function.
81
+ */
82
+ getCandidateFn( builder ) {
75
83
 
76
84
  const params = this.parametersNodes;
77
85
 
78
- let candidateFnCall = this._candidateFnCall;
86
+ let candidateFn = this._candidateFn;
79
87
 
80
- if ( candidateFnCall === null ) {
88
+ if ( candidateFn === null ) {
81
89
 
82
- let candidateFn = null;
83
- let candidateScore = - 1;
90
+ let bestCandidateFn = null;
91
+ let bestScore = - 1;
84
92
 
85
93
  for ( const functionNode of this.functionNodes ) {
86
94
 
@@ -97,7 +105,7 @@ class FunctionOverloadingNode extends Node {
97
105
 
98
106
  if ( params.length === inputs.length ) {
99
107
 
100
- let score = 0;
108
+ let currentScore = 0;
101
109
 
102
110
  for ( let i = 0; i < params.length; i ++ ) {
103
111
 
@@ -106,20 +114,16 @@ class FunctionOverloadingNode extends Node {
106
114
 
107
115
  if ( param.getNodeType( builder ) === input.type ) {
108
116
 
109
- score ++;
110
-
111
- } else {
112
-
113
- score = 0;
117
+ currentScore ++;
114
118
 
115
119
  }
116
120
 
117
121
  }
118
122
 
119
- if ( score > candidateScore ) {
123
+ if ( currentScore > bestScore ) {
120
124
 
121
- candidateFn = functionNode;
122
- candidateScore = score;
125
+ bestCandidateFn = functionNode;
126
+ bestScore = currentScore;
123
127
 
124
128
  }
125
129
 
@@ -127,11 +131,25 @@ class FunctionOverloadingNode extends Node {
127
131
 
128
132
  }
129
133
 
130
- this._candidateFnCall = candidateFnCall = candidateFn( ...params );
134
+ this._candidateFn = candidateFn = bestCandidateFn;
131
135
 
132
136
  }
133
137
 
134
- return candidateFnCall;
138
+ return candidateFn;
139
+
140
+ }
141
+
142
+ /**
143
+ * Sets up the node for the current parameters.
144
+ *
145
+ * @param {NodeBuilder} builder - The current node builder.
146
+ * @return {Node} The setup node.
147
+ */
148
+ setup( builder ) {
149
+
150
+ const candidateFn = this.getCandidateFn( builder );
151
+
152
+ return candidateFn( ...this.parametersNodes );
135
153
 
136
154
  }
137
155
 
@@ -1,4 +1,5 @@
1
1
  import TempNode from '../core/TempNode.js';
2
+ import { error } from '../../utils.js';
2
3
 
3
4
  /**
4
5
  * This module is part of the TSL core and usually not used in app level code.
@@ -70,7 +71,7 @@ class JoinNode extends TempNode {
70
71
 
71
72
  if ( length >= maxLength ) {
72
73
 
73
- console.error( `THREE.TSL: Length of parameters exceeds maximum length of function '${ type }()' type.` );
74
+ error( `TSL: Length of parameters exceeds maximum length of function '${ type }()' type.` );
74
75
  break;
75
76
 
76
77
  }
@@ -81,7 +82,7 @@ class JoinNode extends TempNode {
81
82
 
82
83
  if ( length + inputTypeLength > maxLength ) {
83
84
 
84
- console.error( `THREE.TSL: Length of '${ type }()' data exceeds maximum length of output type.` );
85
+ error( `TSL: Length of '${ type }()' data exceeds maximum length of output type.` );
85
86
 
86
87
  inputTypeLength = maxLength - length;
87
88
  inputType = builder.getTypeFromLength( inputTypeLength );
@@ -95,7 +96,9 @@ class JoinNode extends TempNode {
95
96
 
96
97
  if ( inputPrimitiveType !== primitiveType ) {
97
98
 
98
- inputSnippet = builder.format( inputSnippet, inputPrimitiveType, primitiveType );
99
+ const targetType = builder.getTypeFromLength( inputTypeLength, primitiveType );
100
+
101
+ inputSnippet = builder.format( inputSnippet, inputType, targetType );
99
102
 
100
103
  }
101
104
 
@@ -1,6 +1,7 @@
1
1
  import Node from '../core/Node.js';
2
2
  import { expression } from '../code/ExpressionNode.js';
3
- import { nodeObject, nodeArray, Fn } from '../tsl/TSLBase.js';
3
+ import { nodeArray, Fn } from '../tsl/TSLBase.js';
4
+ import { error } from '../../utils.js';
4
5
 
5
6
  /**
6
7
  * This module offers a variety of ways to implement loops in TSL. In it's basic form it's:
@@ -53,7 +54,7 @@ class LoopNode extends Node {
53
54
  */
54
55
  constructor( params = [] ) {
55
56
 
56
- super();
57
+ super( 'void' );
57
58
 
58
59
  this.params = params;
59
60
 
@@ -99,16 +100,20 @@ class LoopNode extends Node {
99
100
 
100
101
  }
101
102
 
102
- const stack = builder.addStack(); // TODO: cache() it
103
+ const stack = builder.addStack();
103
104
 
104
- properties.returnsNode = this.params[ this.params.length - 1 ]( inputs, builder );
105
+ const fnCall = this.params[ this.params.length - 1 ]( inputs );
106
+
107
+ properties.returnsNode = fnCall.context( { nodeLoop: fnCall } );
105
108
  properties.stackNode = stack;
106
109
 
107
110
  const baseParam = this.params[ 0 ];
108
111
 
109
112
  if ( baseParam.isNode !== true && typeof baseParam.update === 'function' ) {
110
113
 
111
- properties.updateNode = Fn( this.params[ 0 ].update )( inputs );
114
+ const fnUpdateCall = Fn( this.params[ 0 ].update )( inputs );
115
+
116
+ properties.updateNode = fnUpdateCall.context( { nodeLoop: fnUpdateCall } );
112
117
 
113
118
  }
114
119
 
@@ -118,26 +123,19 @@ class LoopNode extends Node {
118
123
 
119
124
  }
120
125
 
121
- /**
122
- * This method is overwritten since the node type is inferred based on the loop configuration.
123
- *
124
- * @param {NodeBuilder} builder - The current node builder.
125
- * @return {string} The node type.
126
- */
127
- getNodeType( builder ) {
128
-
129
- const { returnsNode } = this.getProperties( builder );
130
-
131
- return returnsNode ? returnsNode.getNodeType( builder ) : 'void';
132
-
133
- }
134
-
135
126
  setup( builder ) {
136
127
 
137
128
  // setup properties
138
129
 
139
130
  this.getProperties( builder );
140
131
 
132
+ if ( builder.fnCall ) {
133
+
134
+ const shaderNodeData = builder.getDataFromNode( builder.fnCall.shaderNode );
135
+ shaderNodeData.hasLoop = true;
136
+
137
+ }
138
+
141
139
  }
142
140
 
143
141
  generate( builder ) {
@@ -267,7 +265,7 @@ class LoopNode extends Node {
267
265
 
268
266
  } else {
269
267
 
270
- console.error( 'THREE.TSL: \'Loop( { update: ... } )\' is not a function, string or number.' );
268
+ error( 'TSL: \'Loop( { update: ... } )\' is not a function, string or number.' );
271
269
 
272
270
  updateSnippet = 'break /* invalid update */';
273
271
 
@@ -304,7 +302,7 @@ class LoopNode extends Node {
304
302
 
305
303
  const stackSnippet = stackNode.build( builder, 'void' );
306
304
 
307
- const returnsSnippet = properties.returnsNode ? properties.returnsNode.build( builder ) : '';
305
+ properties.returnsNode.build( builder, 'void' );
308
306
 
309
307
  builder.removeFlowTab().addFlowCode( '\n' + builder.tab + stackSnippet );
310
308
 
@@ -316,8 +314,6 @@ class LoopNode extends Node {
316
314
 
317
315
  builder.addFlowTab();
318
316
 
319
- return returnsSnippet;
320
-
321
317
  }
322
318
 
323
319
  }
@@ -332,7 +328,7 @@ export default LoopNode;
332
328
  * @param {...any} params - A list of parameters.
333
329
  * @returns {LoopNode}
334
330
  */
335
- export const Loop = ( ...params ) => nodeObject( new LoopNode( nodeArray( params, 'int' ) ) ).toStack();
331
+ export const Loop = ( ...params ) => new LoopNode( nodeArray( params, 'int' ) ).toStack();
336
332
 
337
333
  /**
338
334
  * TSL function for creating a `Continue()` expression.
@@ -351,20 +347,3 @@ export const Continue = () => expression( 'continue' ).toStack();
351
347
  * @returns {ExpressionNode}
352
348
  */
353
349
  export const Break = () => expression( 'break' ).toStack();
354
-
355
- // Deprecated
356
-
357
- /**
358
- * @tsl
359
- * @function
360
- * @deprecated since r168. Use {@link Loop} instead.
361
- *
362
- * @param {...any} params
363
- * @returns {LoopNode}
364
- */
365
- export const loop = ( ...params ) => { // @deprecated, r168
366
-
367
- console.warn( 'THREE.TSL: loop() has been renamed to Loop().' );
368
- return Loop( ...params );
369
-
370
- };
@@ -0,0 +1,22 @@
1
+ import { normalView } from '../accessors/Normal.js';
2
+ import { positionViewDirection } from '../accessors/Position.js';
3
+ import { Fn, vec2, vec3 } from '../tsl/TSLBase.js';
4
+
5
+ /**
6
+ * TSL function for creating a matcap uv node.
7
+ *
8
+ * Can be used to compute texture coordinates for projecting a
9
+ * matcap onto a mesh. Used by {@link MeshMatcapNodeMaterial}.
10
+ *
11
+ * @tsl
12
+ * @function
13
+ * @returns {Node<vec2>} The matcap UV coordinates.
14
+ */
15
+ export const matcapUV = /*@__PURE__*/ Fn( () => {
16
+
17
+ const x = vec3( positionViewDirection.z, 0, positionViewDirection.x.negate() ).normalize();
18
+ const y = positionViewDirection.cross( x );
19
+
20
+ return vec2( x.dot( normalView ), y.dot( normalView ) ).mul( 0.495 ).add( 0.5 ); // 0.495 to remove artifacts caused by undersized matcap disks
21
+
22
+ } ).once( [ 'NORMAL', 'VERTEX' ] )().toVar( 'matcapUV' );
@@ -1,4 +1,5 @@
1
1
  import Node from '../core/Node.js';
2
+ import { warn } from '../../utils.js';
2
3
 
3
4
  /**
4
5
  * Base class for representing member access on an object-like
@@ -15,21 +16,21 @@ class MemberNode extends Node {
15
16
  }
16
17
 
17
18
  /**
18
- * Constructs an array element node.
19
+ * Constructs a member node.
19
20
  *
20
- * @param {Node} node - The array-like node.
21
+ * @param {Node} structNode - The struct node.
21
22
  * @param {string} property - The property name.
22
23
  */
23
- constructor( node, property ) {
24
+ constructor( structNode, property ) {
24
25
 
25
26
  super();
26
27
 
27
28
  /**
28
- * The array-like node.
29
+ * The struct node.
29
30
  *
30
31
  * @type {Node}
31
32
  */
32
- this.node = node;
33
+ this.structNode = structNode;
33
34
 
34
35
  /**
35
36
  * The property name.
@@ -49,15 +50,66 @@ class MemberNode extends Node {
49
50
 
50
51
  }
51
52
 
53
+ hasMember( builder ) {
54
+
55
+ if ( this.structNode.isMemberNode ) {
56
+
57
+ if ( this.structNode.hasMember( builder ) === false ) {
58
+
59
+ return false;
60
+
61
+ }
62
+
63
+ }
64
+
65
+ return this.structNode.getMemberType( builder, this.property ) !== 'void';
66
+
67
+ }
68
+
52
69
  getNodeType( builder ) {
53
70
 
54
- return this.node.getMemberType( builder, this.property );
71
+ if ( this.hasMember( builder ) === false ) {
72
+
73
+ // default type if member does not exist
74
+
75
+ return 'float';
76
+
77
+ }
78
+
79
+ return this.structNode.getMemberType( builder, this.property );
80
+
81
+ }
82
+
83
+ getMemberType( builder, name ) {
84
+
85
+ if ( this.hasMember( builder ) === false ) {
86
+
87
+ // default type if member does not exist
88
+
89
+ return 'float';
90
+
91
+ }
92
+
93
+ const type = this.getNodeType( builder );
94
+ const struct = builder.getStructTypeNode( type );
95
+
96
+ return struct.getMemberType( builder, name );
55
97
 
56
98
  }
57
99
 
58
100
  generate( builder ) {
59
101
 
60
- const propertyName = this.node.build( builder );
102
+ if ( this.hasMember( builder ) === false ) {
103
+
104
+ warn( `TSL: Member "${ this.property }" does not exist in struct.` );
105
+
106
+ const type = this.getNodeType( builder );
107
+
108
+ return builder.generateConst( type );
109
+
110
+ }
111
+
112
+ const propertyName = this.structNode.build( builder );
61
113
 
62
114
  return propertyName + '.' + this.property;
63
115
 
@@ -1,4 +1,4 @@
1
- import { abs, cross, float, Fn, normalize, ivec2, sub, vec2, vec3, vec4 } from '../tsl/TSLBase.js';
1
+ import { abs, cross, float, Fn, normalize, ivec2, sub, vec2, vec3, vec4, fract, dot } from '../tsl/TSLBase.js';
2
2
  import { textureSize } from '../accessors/TextureSizeNode.js';
3
3
  import { textureLoad } from '../accessors/TextureNode.js';
4
4
  import { WebGPUCoordinateSystem } from '../../constants.js';
@@ -93,3 +93,30 @@ export const getNormalFromDepth = /*@__PURE__*/ Fn( ( [ uv, depthTexture, projec
93
93
  return normalize( cross( dpdx, dpdy ) );
94
94
 
95
95
  } );
96
+
97
+ /**
98
+ * Interleaved Gradient Noise (IGN) from Jimenez 2014.
99
+ *
100
+ * IGN has "low discrepancy" resulting in evenly distributed samples. It's superior compared to
101
+ * default white noise, blue noise or Bayer.
102
+ *
103
+ * References:
104
+ * - {@link https://www.iryoku.com/next-generation-post-processing-in-call-of-duty-advanced-warfare/}
105
+ * - {@link https://blog.demofox.org/2022/01/01/interleaved-gradient-noise-a-different-kind-of-low-discrepancy-sequence/}
106
+ *
107
+ * @tsl
108
+ * @function
109
+ * @param {Node<vec2>} position - The input position, usually screen coordinates.
110
+ * @return {Node<float>} The noise value.
111
+ */
112
+ export const interleavedGradientNoise = Fn( ( [ position ] ) => {
113
+
114
+ return fract( float( 52.9829189 ).mul( fract( dot( position, vec2( 0.06711056, 0.00583715 ) ) ) ) );
115
+
116
+ } ).setLayout( {
117
+ name: 'interleavedGradientNoise',
118
+ type: 'float',
119
+ inputs: [
120
+ { name: 'position', type: 'vec2' }
121
+ ]
122
+ } );
@@ -41,6 +41,15 @@ class RTTNode extends TextureNode {
41
41
 
42
42
  super( renderTarget.texture, uv() );
43
43
 
44
+ /**
45
+ * This flag can be used for type testing.
46
+ *
47
+ * @type {boolean}
48
+ * @readonly
49
+ * @default true
50
+ */
51
+ this.isRTTNode = true;
52
+
44
53
  /**
45
54
  * The node to render a texture with.
46
55
  *
@@ -131,7 +140,7 @@ class RTTNode extends TextureNode {
131
140
  * @readonly
132
141
  * @default true
133
142
  */
134
- get autoSize() {
143
+ get autoResize() {
135
144
 
136
145
  return this.width === null;
137
146
 
@@ -188,19 +197,37 @@ class RTTNode extends TextureNode {
188
197
 
189
198
  //
190
199
 
191
- if ( this.autoSize === true ) {
192
-
193
- this.pixelRatio = renderer.getPixelRatio();
200
+ if ( this.autoResize === true ) {
194
201
 
202
+ const pixelRatio = renderer.getPixelRatio();
195
203
  const size = renderer.getSize( _size );
196
204
 
197
- this.setSize( size.width, size.height );
205
+ const effectiveWidth = Math.floor( size.width * pixelRatio );
206
+ const effectiveHeight = Math.floor( size.height * pixelRatio );
207
+
208
+ if ( effectiveWidth !== this.renderTarget.width || effectiveHeight !== this.renderTarget.height ) {
209
+
210
+ this.renderTarget.setSize( effectiveWidth, effectiveHeight );
211
+
212
+ this.textureNeedsUpdate = true;
213
+
214
+ }
198
215
 
199
216
  }
200
217
 
201
218
  //
202
219
 
220
+ let name = 'RTT';
221
+
222
+ if ( this.node.name ) {
223
+
224
+ name = this.node.name + ' [ ' + name + ' ]';
225
+
226
+ }
227
+
228
+
203
229
  this._quadMesh.material.fragmentNode = this._rttNode;
230
+ this._quadMesh.name = name;
204
231
 
205
232
  //
206
233
 
@@ -254,7 +281,7 @@ export const rtt = ( node, ...params ) => nodeObject( new RTTNode( nodeObject( n
254
281
  */
255
282
  export const convertToTexture = ( node, ...params ) => {
256
283
 
257
- if ( node.isTextureNode ) return node;
284
+ if ( node.isSampleNode || node.isTextureNode ) return node;
258
285
  if ( node.isPassNode ) return node.getTextureNode();
259
286
 
260
287
  return rtt( node, ...params );