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 BRDF_Lambert from './BSDF/BRDF_Lambert.js';
2
2
  import BRDF_GGX from './BSDF/BRDF_GGX.js';
3
+ import BRDF_GGX_Multiscatter from './BSDF/BRDF_GGX_Multiscatter.js';
3
4
  import DFGApprox from './BSDF/DFGApprox.js';
4
5
  import EnvironmentBRDF from './BSDF/EnvironmentBRDF.js';
5
6
  import F_Schlick from './BSDF/F_Schlick.js';
@@ -8,7 +9,7 @@ import BRDF_Sheen from './BSDF/BRDF_Sheen.js';
8
9
  import { LTC_Evaluate, LTC_Uv } from './BSDF/LTC.js';
9
10
  import LightingModel from '../core/LightingModel.js';
10
11
  import { diffuseColor, specularColor, specularF90, roughness, clearcoat, clearcoatRoughness, sheen, sheenRoughness, iridescence, iridescenceIOR, iridescenceThickness, ior, thickness, transmission, attenuationDistance, attenuationColor, dispersion } from '../core/PropertyNode.js';
11
- import { transformedNormalView, transformedClearcoatNormalView, transformedNormalWorld } from '../accessors/Normal.js';
12
+ import { normalView, clearcoatNormalView, normalWorld } from '../accessors/Normal.js';
12
13
  import { positionViewDirection, positionView, positionWorld } from '../accessors/Position.js';
13
14
  import { Fn, float, vec2, vec3, vec4, mat3, If } from '../tsl/TSLBase.js';
14
15
  import { select } from '../math/ConditionalNode.js';
@@ -18,7 +19,7 @@ import { cameraPosition, cameraProjectionMatrix, cameraViewMatrix } from '../acc
18
19
  import { modelWorldMatrix } from '../accessors/ModelNode.js';
19
20
  import { screenSize } from '../display/ScreenNode.js';
20
21
  import { viewportMipTexture } from '../display/ViewportTextureNode.js';
21
- import { textureBicubic } from '../accessors/TextureBicubic.js';
22
+ import { textureBicubicLevel } from '../accessors/TextureBicubic.js';
22
23
  import { Loop } from '../utils/LoopNode.js';
23
24
  import { BackSide } from '../../constants.js';
24
25
 
@@ -80,7 +81,7 @@ const getTransmissionSample = /*@__PURE__*/ Fn( ( [ fragCoord, roughness, ior ],
80
81
 
81
82
  const lod = log2( screenSize.x ).mul( applyIorToRoughness( roughness, ior ) );
82
83
 
83
- return textureBicubic( transmissionSample, lod );
84
+ return textureBicubicLevel( transmissionSample, lod );
84
85
 
85
86
  } );
86
87
 
@@ -494,7 +495,7 @@ class PhysicalLightingModel extends LightingModel {
494
495
 
495
496
  if ( this.iridescence === true ) {
496
497
 
497
- const dotNVi = transformedNormalView.dot( positionViewDirection ).clamp();
498
+ const dotNVi = normalView.dot( positionViewDirection ).clamp();
498
499
 
499
500
  this.iridescenceFresnel = evalIridescence( {
500
501
  outsideIOR: float( 1.0 ),
@@ -512,7 +513,7 @@ class PhysicalLightingModel extends LightingModel {
512
513
 
513
514
  const position = positionWorld;
514
515
  const v = cameraPosition.sub( positionWorld ).normalize(); // TODO: Create Node for this, same issue in MaterialX
515
- const n = transformedNormalWorld;
516
+ const n = normalWorld;
516
517
 
517
518
  const context = builder.context;
518
519
 
@@ -550,7 +551,7 @@ class PhysicalLightingModel extends LightingModel {
550
551
 
551
552
  computeMultiscattering( singleScatter, multiScatter, specularF90 ) {
552
553
 
553
- const dotNV = transformedNormalView.dot( positionViewDirection ).clamp(); // @ TODO: Move to core dotNV
554
+ const dotNV = normalView.dot( positionViewDirection ).clamp(); // @ TODO: Move to core dotNV
554
555
 
555
556
  const fab = DFGApprox( { roughness, dotNV } );
556
557
 
@@ -561,7 +562,7 @@ class PhysicalLightingModel extends LightingModel {
561
562
  const Ess = fab.x.add( fab.y );
562
563
  const Ems = Ess.oneMinus();
563
564
 
564
- const Favg = specularColor.add( specularColor.oneMinus().mul( 0.047619 ) ); // 1/21
565
+ const Favg = Fr.add( Fr.oneMinus().mul( 0.047619 ) ); // 1/21
565
566
  const Fms = FssEss.mul( Favg ).div( Ems.mul( Favg ).oneMinus() );
566
567
 
567
568
  singleScatter.addAssign( FssEss );
@@ -575,9 +576,9 @@ class PhysicalLightingModel extends LightingModel {
575
576
  * @param {Object} lightData - The light data.
576
577
  * @param {NodeBuilder} builder - The current node builder.
577
578
  */
578
- direct( { lightDirection, lightColor, reflectedLight } ) {
579
+ direct( { lightDirection, lightColor, reflectedLight }, /* builder */ ) {
579
580
 
580
- const dotNL = transformedNormalView.dot( lightDirection ).clamp();
581
+ const dotNL = normalView.dot( lightDirection ).clamp();
581
582
  const irradiance = dotNL.mul( lightColor );
582
583
 
583
584
  if ( this.sheen === true ) {
@@ -588,16 +589,16 @@ class PhysicalLightingModel extends LightingModel {
588
589
 
589
590
  if ( this.clearcoat === true ) {
590
591
 
591
- const dotNLcc = transformedClearcoatNormalView.dot( lightDirection ).clamp();
592
+ const dotNLcc = clearcoatNormalView.dot( lightDirection ).clamp();
592
593
  const ccIrradiance = dotNLcc.mul( lightColor );
593
594
 
594
- this.clearcoatSpecularDirect.addAssign( ccIrradiance.mul( BRDF_GGX( { lightDirection, f0: clearcoatF0, f90: clearcoatF90, roughness: clearcoatRoughness, normalView: transformedClearcoatNormalView } ) ) );
595
+ this.clearcoatSpecularDirect.addAssign( ccIrradiance.mul( BRDF_GGX( { lightDirection, f0: clearcoatF0, f90: clearcoatF90, roughness: clearcoatRoughness, normalView: clearcoatNormalView } ) ) );
595
596
 
596
597
  }
597
598
 
598
599
  reflectedLight.directDiffuse.addAssign( irradiance.mul( BRDF_Lambert( { diffuseColor: diffuseColor.rgb } ) ) );
599
600
 
600
- reflectedLight.directSpecular.addAssign( irradiance.mul( BRDF_GGX( { lightDirection, f0: specularColor, f90: 1, roughness, iridescence: this.iridescence, f: this.iridescenceFresnel, USE_IRIDESCENCE: this.iridescence, USE_ANISOTROPY: this.anisotropy } ) ) );
601
+ reflectedLight.directSpecular.addAssign( irradiance.mul( BRDF_GGX_Multiscatter( { lightDirection, f0: specularColor, f90: 1, roughness, f: this.iridescenceFresnel, USE_IRIDESCENCE: this.iridescence, USE_ANISOTROPY: this.anisotropy } ) ) );
601
602
 
602
603
  }
603
604
 
@@ -608,14 +609,14 @@ class PhysicalLightingModel extends LightingModel {
608
609
  * @param {Object} input - The input data.
609
610
  * @param {NodeBuilder} builder - The current node builder.
610
611
  */
611
- directRectArea( { lightColor, lightPosition, halfWidth, halfHeight, reflectedLight, ltc_1, ltc_2 } ) {
612
+ directRectArea( { lightColor, lightPosition, halfWidth, halfHeight, reflectedLight, ltc_1, ltc_2 }, /* builder */ ) {
612
613
 
613
614
  const p0 = lightPosition.add( halfWidth ).sub( halfHeight ); // counterclockwise; light shines in local neg z direction
614
615
  const p1 = lightPosition.sub( halfWidth ).sub( halfHeight );
615
616
  const p2 = lightPosition.sub( halfWidth ).add( halfHeight );
616
617
  const p3 = lightPosition.add( halfWidth ).add( halfHeight );
617
618
 
618
- const N = transformedNormalView;
619
+ const N = normalView;
619
620
  const V = positionViewDirection;
620
621
  const P = positionView.toVar();
621
622
 
@@ -680,7 +681,7 @@ class PhysicalLightingModel extends LightingModel {
680
681
  this.sheenSpecularIndirect.addAssign( iblIrradiance.mul(
681
682
  sheen,
682
683
  IBLSheenBRDF( {
683
- normal: transformedNormalView,
684
+ normal: normalView,
684
685
  viewDir: positionViewDirection,
685
686
  roughness: sheenRoughness
686
687
  } )
@@ -690,7 +691,7 @@ class PhysicalLightingModel extends LightingModel {
690
691
 
691
692
  if ( this.clearcoat === true ) {
692
693
 
693
- const dotNVcc = transformedClearcoatNormalView.dot( positionViewDirection ).clamp();
694
+ const dotNVcc = clearcoatNormalView.dot( positionViewDirection ).clamp();
694
695
 
695
696
  const clearcoatEnv = EnvironmentBRDF( {
696
697
  dotNV: dotNVcc,
@@ -731,7 +732,7 @@ class PhysicalLightingModel extends LightingModel {
731
732
 
732
733
  const { ambientOcclusion, reflectedLight } = builder.context;
733
734
 
734
- const dotNV = transformedNormalView.dot( positionViewDirection ).clamp(); // @ TODO: Move to core dotNV
735
+ const dotNV = normalView.dot( positionViewDirection ).clamp(); // @ TODO: Move to core dotNV
735
736
 
736
737
  const aoNV = dotNV.add( ambientOcclusion );
737
738
  const aoExp = roughness.mul( - 16.0 ).oneMinus().negate().exp2();
@@ -766,7 +767,7 @@ class PhysicalLightingModel extends LightingModel {
766
767
 
767
768
  if ( this.clearcoat === true ) {
768
769
 
769
- const dotNVcc = transformedClearcoatNormalView.dot( positionViewDirection ).clamp();
770
+ const dotNVcc = clearcoatNormalView.dot( positionViewDirection ).clamp();
770
771
 
771
772
  const Fcc = F_Schlick( {
772
773
  dotVH: dotNVcc,
@@ -30,7 +30,7 @@ class VolumetricLightingModel extends LightingModel {
30
30
 
31
31
  start( builder ) {
32
32
 
33
- const { material, context } = builder;
33
+ const { material } = builder;
34
34
 
35
35
  const startPos = property( 'vec3' );
36
36
  const endPos = property( 'vec3' );
@@ -79,13 +79,13 @@ class VolumetricLightingModel extends LightingModel {
79
79
 
80
80
  linearDepthRay.assign( linearDepth( viewZToPerspectiveDepth( positionViewRay.z, cameraNear, cameraFar ) ) );
81
81
 
82
- context.sceneDepthNode = linearDepth( material.depthNode ).toVar();
82
+ builder.context.sceneDepthNode = linearDepth( material.depthNode ).toVar();
83
83
 
84
84
  }
85
85
 
86
- context.positionWorld = positionRay;
87
- context.shadowPositionWorld = positionRay;
88
- context.positionView = positionViewRay;
86
+ builder.context.positionWorld = positionRay;
87
+ builder.context.shadowPositionWorld = positionRay;
88
+ builder.context.positionView = positionViewRay;
89
89
 
90
90
  scatteringDensity.assign( 0 );
91
91
 
@@ -1,4 +1,4 @@
1
- import { normalView } from '../../accessors/Normal.js';
1
+ import { normalViewGeometry } from '../../accessors/Normal.js';
2
2
  import { float, Fn } from '../../tsl/TSLBase.js';
3
3
 
4
4
  const getGeometryRoughness = /*@__PURE__*/ Fn( ( builder ) => {
@@ -9,7 +9,7 @@ const getGeometryRoughness = /*@__PURE__*/ Fn( ( builder ) => {
9
9
 
10
10
  }
11
11
 
12
- const dxy = normalView.dFdx().abs().max( normalView.dFdy().abs() );
12
+ const dxy = normalViewGeometry.dFdx().abs().max( normalViewGeometry.dFdy().abs() );
13
13
  const geometryRoughness = dxy.x.max( dxy.y ).max( dxy.z );
14
14
 
15
15
  return geometryRoughness;
@@ -67,8 +67,11 @@ class RangeNode extends Node {
67
67
  */
68
68
  getVectorLength( builder ) {
69
69
 
70
- const minLength = builder.getTypeLength( getValueType( this.minNode.value ) );
71
- const maxLength = builder.getTypeLength( getValueType( this.maxNode.value ) );
70
+ const minNode = this.getConstNode( this.minNode );
71
+ const maxNode = this.getConstNode( this.maxNode );
72
+
73
+ const minLength = builder.getTypeLength( getValueType( minNode.value ) );
74
+ const maxLength = builder.getTypeLength( getValueType( maxNode.value ) );
72
75
 
73
76
  return minLength > maxLength ? minLength : maxLength;
74
77
 
@@ -86,6 +89,36 @@ class RangeNode extends Node {
86
89
 
87
90
  }
88
91
 
92
+ /**
93
+ * Returns a constant node from the given node by traversing it.
94
+ *
95
+ * @param {Node} node - The node to traverse.
96
+ * @returns {Node} The constant node, if found.
97
+ */
98
+ getConstNode( node ) {
99
+
100
+ let output = null;
101
+
102
+ node.traverse( n => {
103
+
104
+ if ( n.isConstNode === true ) {
105
+
106
+ output = n;
107
+
108
+ }
109
+
110
+ } );
111
+
112
+ if ( output === null ) {
113
+
114
+ throw new Error( 'THREE.TSL: No "ConstNode" found in node graph.' );
115
+
116
+ }
117
+
118
+ return output;
119
+
120
+ }
121
+
89
122
  setup( builder ) {
90
123
 
91
124
  const object = builder.object;
@@ -94,8 +127,11 @@ class RangeNode extends Node {
94
127
 
95
128
  if ( object.count > 1 ) {
96
129
 
97
- const minValue = this.minNode.value;
98
- const maxValue = this.maxNode.value;
130
+ const minNode = this.getConstNode( this.minNode );
131
+ const maxNode = this.getConstNode( this.maxNode );
132
+
133
+ const minValue = minNode.value;
134
+ const maxValue = maxNode.value;
99
135
 
100
136
  const minLength = builder.getTypeLength( getValueType( minValue ) );
101
137
  const maxLength = builder.getTypeLength( getValueType( maxValue ) );
@@ -113,7 +113,7 @@ class AtomicFunctionNode extends Node {
113
113
  }
114
114
 
115
115
  const methodSnippet = `${ builder.getMethod( method, type ) }( ${ params.join( ', ' ) } )`;
116
- const isVoid = parents.length === 1 && parents[ 0 ].isStackNode === true;
116
+ const isVoid = parents ? ( parents.length === 1 && parents[ 0 ].isStackNode === true ) : false;
117
117
 
118
118
  if ( isVoid ) {
119
119
 
@@ -1,5 +1,6 @@
1
1
  import Node from '../core/Node.js';
2
2
  import { nodeObject } from '../tsl/TSLBase.js';
3
+ import { warn } from '../../utils.js';
3
4
 
4
5
  /**
5
6
  * `ComputeBuiltinNode` represents a compute-scope builtin value that expose information
@@ -110,7 +111,7 @@ class ComputeBuiltinNode extends Node {
110
111
 
111
112
  } else {
112
113
 
113
- console.warn( `ComputeBuiltinNode: Compute built-in value ${builtinName} can not be accessed in the ${builder.shaderStage} stage` );
114
+ warn( `ComputeBuiltinNode: Compute built-in value ${builtinName} can not be accessed in the ${builder.shaderStage} stage` );
114
115
  return builder.generateConst( nodeType );
115
116
 
116
117
  }
@@ -1,6 +1,7 @@
1
1
  import Node from '../core/Node.js';
2
2
  import { NodeUpdateType } from '../core/constants.js';
3
3
  import { addMethodChaining, nodeObject } from '../tsl/TSLCore.js';
4
+ import { warn, error } from '../../utils.js';
4
5
 
5
6
  /**
6
7
  * TODO
@@ -19,10 +20,9 @@ class ComputeNode extends Node {
19
20
  * Constructs a new compute node.
20
21
  *
21
22
  * @param {Node} computeNode - TODO
22
- * @param {number} count - TODO.
23
- * @param {Array<number>} [workgroupSize=[64]] - TODO.
23
+ * @param {Array<number>} workgroupSize - TODO.
24
24
  */
25
- constructor( computeNode, count, workgroupSize = [ 64 ] ) {
25
+ constructor( computeNode, workgroupSize ) {
26
26
 
27
27
  super( 'void' );
28
28
 
@@ -42,27 +42,21 @@ class ComputeNode extends Node {
42
42
  */
43
43
  this.computeNode = computeNode;
44
44
 
45
- /**
46
- * TODO
47
- *
48
- * @type {number}
49
- */
50
- this.count = count;
51
45
 
52
46
  /**
53
47
  * TODO
54
48
  *
55
49
  * @type {Array<number>}
56
- * @default [64]
50
+ * @default [ 64 ]
57
51
  */
58
52
  this.workgroupSize = workgroupSize;
59
53
 
60
54
  /**
61
55
  * TODO
62
56
  *
63
- * @type {number}
57
+ * @type {number|Array<number>}
64
58
  */
65
- this.dispatchCount = 0;
59
+ this.count = null;
66
60
 
67
61
  /**
68
62
  * TODO
@@ -95,7 +89,30 @@ class ComputeNode extends Node {
95
89
  */
96
90
  this.onInitFunction = null;
97
91
 
98
- this.updateDispatchCount();
92
+ }
93
+
94
+ /**
95
+ * TODO
96
+ *
97
+ * @param {number|Array<number>} count - Array with [ x, y, z ] values for dispatch or a single number for the count
98
+ * @return {ComputeNode}
99
+ */
100
+ setCount( count ) {
101
+
102
+ this.count = count;
103
+
104
+ return this;
105
+
106
+ }
107
+
108
+ /**
109
+ * TODO
110
+ *
111
+ * @return {number|Array<number>}
112
+ */
113
+ getCount() {
114
+
115
+ return this.count;
99
116
 
100
117
  }
101
118
 
@@ -114,7 +131,7 @@ class ComputeNode extends Node {
114
131
  * @param {string} name - The name of the uniform.
115
132
  * @return {ComputeNode} A reference to this node.
116
133
  */
117
- label( name ) {
134
+ setName( name ) {
118
135
 
119
136
  this.name = name;
120
137
 
@@ -123,18 +140,17 @@ class ComputeNode extends Node {
123
140
  }
124
141
 
125
142
  /**
126
- * TODO
143
+ * Sets the {@link ComputeNode#name} property.
144
+ *
145
+ * @deprecated
146
+ * @param {string} name - The name of the uniform.
147
+ * @return {ComputeNode} A reference to this node.
127
148
  */
128
- updateDispatchCount() {
129
-
130
- const { count, workgroupSize } = this;
131
-
132
- let size = workgroupSize[ 0 ];
149
+ label( name ) {
133
150
 
134
- for ( let i = 1; i < workgroupSize.length; i ++ )
135
- size *= workgroupSize[ i ];
151
+ warn( 'TSL: "label()" has been deprecated. Use "setName()" instead.' ); // @deprecated r179
136
152
 
137
- this.dispatchCount = Math.ceil( count / size );
153
+ return this.setName( name );
138
154
 
139
155
  }
140
156
 
@@ -213,16 +229,56 @@ class ComputeNode extends Node {
213
229
 
214
230
  export default ComputeNode;
215
231
 
232
+ /**
233
+ * TSL function for creating a compute kernel node.
234
+ *
235
+ * @tsl
236
+ * @function
237
+ * @param {Node} node - TODO
238
+ * @param {Array<number>} [workgroupSize=[64]] - TODO.
239
+ * @returns {AtomicFunctionNode}
240
+ */
241
+ export const computeKernel = ( node, workgroupSize = [ 64 ] ) => {
242
+
243
+ if ( workgroupSize.length === 0 || workgroupSize.length > 3 ) {
244
+
245
+ error( 'TSL: compute() workgroupSize must have 1, 2, or 3 elements' );
246
+
247
+ }
248
+
249
+ for ( let i = 0; i < workgroupSize.length; i ++ ) {
250
+
251
+ const val = workgroupSize[ i ];
252
+
253
+ if ( typeof val !== 'number' || val <= 0 || ! Number.isInteger( val ) ) {
254
+
255
+ error( `TSL: compute() workgroupSize element at index [ ${ i } ] must be a positive integer` );
256
+
257
+ }
258
+
259
+ }
260
+
261
+ // Implicit fill-up to [ x, y, z ] with 1s, just like WGSL treats @workgroup_size when fewer dimensions are specified
262
+
263
+ while ( workgroupSize.length < 3 ) workgroupSize.push( 1 );
264
+
265
+ //
266
+
267
+ return nodeObject( new ComputeNode( nodeObject( node ), workgroupSize ) );
268
+
269
+ };
270
+
216
271
  /**
217
272
  * TSL function for creating a compute node.
218
273
  *
219
274
  * @tsl
220
275
  * @function
221
276
  * @param {Node} node - TODO
222
- * @param {number} count - TODO.
277
+ * @param {number|Array<number>} count - TODO.
223
278
  * @param {Array<number>} [workgroupSize=[64]] - TODO.
224
279
  * @returns {AtomicFunctionNode}
225
280
  */
226
- export const compute = ( node, count, workgroupSize ) => nodeObject( new ComputeNode( nodeObject( node ), count, workgroupSize ) );
281
+ export const compute = ( node, count, workgroupSize ) => computeKernel( node, workgroupSize ).setCount( count );
227
282
 
228
283
  addMethodChaining( 'compute', compute );
284
+ addMethodChaining( 'computeKernel', computeKernel );