@gnsx/three 0.185.16 → 0.186.1

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 (417) hide show
  1. package/build/three.cjs +10 -82600
  2. package/build/three.core.js +1303 -728
  3. package/build/three.module.js +439 -338
  4. package/build/three.tsl.js +74 -44
  5. package/build/three.webgpu.js +6036 -2184
  6. package/build/three.webgpu.nodes.js +6020 -2184
  7. package/examples/jsm/Addons.js +6 -6
  8. package/examples/jsm/controls/ArcballControls.js +1 -1
  9. package/examples/jsm/controls/FirstPersonControls.js +44 -20
  10. package/examples/jsm/controls/OrbitControls.js +9 -0
  11. package/examples/jsm/controls/TrackballControls.js +109 -4
  12. package/examples/jsm/csm/CSMShadowNode.js +13 -0
  13. package/examples/jsm/exporters/GLTFExporter.js +23 -7
  14. package/examples/jsm/exporters/USDZExporter.js +2 -2
  15. package/examples/jsm/generators/CityGenerator.js +377 -45
  16. package/examples/jsm/generators/ForestGenerator.js +12 -12
  17. package/examples/jsm/generators/TerrainGenerator.js +49 -37
  18. package/examples/jsm/generators/TreeGenerator.js +70 -76
  19. package/examples/jsm/generators/city/BenchGenerator.js +127 -0
  20. package/examples/jsm/generators/city/CarGenerator.js +479 -0
  21. package/examples/jsm/generators/city/CityGeneratorUtils.js +31 -0
  22. package/examples/jsm/generators/city/HydrantGenerator.js +106 -0
  23. package/examples/jsm/generators/city/InstancedMeshGenerator.js +86 -0
  24. package/examples/jsm/generators/city/PersonGenerator.js +447 -0
  25. package/examples/jsm/generators/city/SidewalkGenerator.js +33 -38
  26. package/examples/jsm/generators/city/SkyscraperGenerator.js +448 -48
  27. package/examples/jsm/generators/city/StreetTreeGenerator.js +231 -0
  28. package/examples/jsm/generators/city/StreetlightGenerator.js +100 -0
  29. package/examples/jsm/generators/city/TrafficlightGenerator.js +106 -0
  30. package/examples/jsm/generators/city/TrashcanGenerator.js +100 -0
  31. package/examples/jsm/geometries/BoxLineGeometry.js +1 -1
  32. package/examples/jsm/geometries/ParametricGeometry.js +1 -1
  33. package/examples/jsm/geometries/RoundedBoxGeometry.js +1 -1
  34. package/examples/jsm/gpgpu/CountingSort.js +271 -0
  35. package/examples/jsm/helpers/LightProbeGridHelper.js +60 -239
  36. package/examples/jsm/helpers/LightProbeGridHelperWebGL.js +221 -0
  37. package/examples/jsm/inspector/Extension.js +94 -0
  38. package/examples/jsm/inspector/Inspector.js +145 -41
  39. package/examples/jsm/inspector/RendererInspector.js +100 -52
  40. package/examples/jsm/inspector/extensions/color-grading/ColorGrading.js +2609 -0
  41. package/examples/jsm/inspector/extensions/color-grading/ColorWheel.js +352 -0
  42. package/examples/jsm/inspector/extensions/color-grading/CurveEditor.js +599 -0
  43. package/examples/jsm/inspector/extensions/color-grading/LUT3DStyle.js +1201 -0
  44. package/examples/jsm/inspector/extensions/color-grading/LUTMath.js +788 -0
  45. package/examples/jsm/inspector/extensions/color-grading/modules/BrightnessModule.js +72 -0
  46. package/examples/jsm/inspector/extensions/color-grading/modules/ColorWheelModule.js +112 -0
  47. package/examples/jsm/inspector/extensions/color-grading/modules/ContrastModule.js +82 -0
  48. package/examples/jsm/inspector/extensions/color-grading/modules/CurvesModule.js +109 -0
  49. package/examples/jsm/inspector/extensions/color-grading/modules/ExposureHueModule.js +110 -0
  50. package/examples/jsm/inspector/extensions/color-grading/modules/ExposureModule.js +73 -0
  51. package/examples/jsm/inspector/extensions/color-grading/modules/HueModule.js +78 -0
  52. package/examples/jsm/inspector/extensions/color-grading/modules/ImportedCubeModule.js +89 -0
  53. package/examples/jsm/inspector/extensions/color-grading/modules/Module.js +285 -0
  54. package/examples/jsm/inspector/extensions/color-grading/modules/OutputModule.js +101 -0
  55. package/examples/jsm/inspector/extensions/color-grading/modules/RendererModule.js +225 -0
  56. package/examples/jsm/inspector/extensions/color-grading/modules/SatVibranceModule.js +102 -0
  57. package/examples/jsm/inspector/extensions/color-grading/modules/SaturationModule.js +76 -0
  58. package/examples/jsm/inspector/extensions/color-grading/modules/VibranceModule.js +76 -0
  59. package/examples/jsm/inspector/extensions/color-grading/modules/WhiteBalanceModule.js +86 -0
  60. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +26 -31
  61. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +1 -0
  62. package/examples/jsm/inspector/tabs/Memory.js +0 -2
  63. package/examples/jsm/inspector/tabs/Settings.js +4 -0
  64. package/examples/jsm/inspector/tabs/Timeline.js +223 -171
  65. package/examples/jsm/inspector/tabs/Viewer.js +515 -21
  66. package/examples/jsm/inspector/ui/List.js +15 -9
  67. package/examples/jsm/inspector/ui/Profiler.js +170 -14
  68. package/examples/jsm/inspector/ui/Style.js +269 -23
  69. package/examples/jsm/inspector/ui/Tab.js +2 -0
  70. package/examples/jsm/inspector/ui/Values.js +14 -2
  71. package/examples/jsm/interactive/HTMLMesh.js +19 -3
  72. package/examples/jsm/lighting/LightProbeGrid.js +484 -889
  73. package/examples/jsm/lighting/LightProbeGridUtils.js +107 -0
  74. package/examples/jsm/lighting/LightProbeGridWebGL.js +841 -0
  75. package/examples/jsm/lighting/vxgi/VXGIConeTracer.js +194 -0
  76. package/examples/jsm/lighting/vxgi/VXGINode.js +660 -0
  77. package/examples/jsm/lighting/vxgi/VXGISceneCollector.js +478 -0
  78. package/examples/jsm/lighting/vxgi/VXGIVolume.js +1430 -0
  79. package/examples/jsm/lights/SunLight.js +95 -0
  80. package/examples/jsm/lights/SunLightNode.js +56 -0
  81. package/examples/jsm/lights/SunLightShadow.js +319 -0
  82. package/examples/jsm/lights/SunShadowNode.js +312 -0
  83. package/examples/jsm/loaders/3DMLoader.js +150 -49
  84. package/examples/jsm/loaders/3MFLoader.js +202 -1
  85. package/examples/jsm/loaders/FBXLoader.js +81 -5
  86. package/examples/jsm/loaders/GLTFGaussianSplatLoaderExtension.js +330 -0
  87. package/examples/jsm/loaders/GLTFLoader.js +79 -14
  88. package/examples/jsm/loaders/GaussianSplatPLYLoader.js +386 -0
  89. package/examples/jsm/loaders/KSPLATLoader.js +463 -0
  90. package/examples/jsm/loaders/MaterialXLoader.js +111 -1010
  91. package/examples/jsm/loaders/PCDLoader.js +1 -1
  92. package/examples/jsm/loaders/SPLATLoader.js +139 -0
  93. package/examples/jsm/loaders/SPZLoader.js +561 -0
  94. package/examples/jsm/loaders/materialx/MaterialXArchive.js +108 -0
  95. package/examples/jsm/loaders/materialx/MaterialXDocument.js +878 -0
  96. package/examples/jsm/loaders/materialx/MaterialXHextile.js +183 -0
  97. package/examples/jsm/loaders/materialx/MaterialXInterfaceValidation.js +376 -0
  98. package/examples/jsm/loaders/materialx/MaterialXLog.js +75 -0
  99. package/examples/jsm/loaders/materialx/MaterialXNodeInterfaceRegistry.js +4 -0
  100. package/examples/jsm/loaders/materialx/MaterialXNodeLibrary.js +1021 -0
  101. package/examples/jsm/loaders/materialx/MaterialXSurfaceMappings.js +661 -0
  102. package/examples/jsm/loaders/materialx/MaterialXUtils.js +57 -0
  103. package/examples/jsm/loaders/materialx/compile/MaterialXCompileRegistry.js +997 -0
  104. package/examples/jsm/loaders/materialx/parse/MaterialXParser.js +28 -0
  105. package/examples/jsm/loaders/usd/USDAParser.js +15 -2
  106. package/examples/jsm/loaders/usd/USDCParser.js +1 -4
  107. package/examples/jsm/loaders/usd/USDComposer.js +80 -42
  108. package/examples/jsm/materials/WoodNodeMaterial.js +6 -108
  109. package/examples/jsm/misc/RollerCoaster.js +2 -2
  110. package/examples/jsm/misc/SculptGL.LICENSE.txt +21 -0
  111. package/examples/jsm/misc/Sculptor.js +1679 -0
  112. package/examples/jsm/misc/SculptorMesh.js +1504 -0
  113. package/examples/jsm/misc/SculptorTools.js +1180 -0
  114. package/examples/jsm/misc/SculptorUtils.js +345 -0
  115. package/examples/jsm/misc/TubePainter.js +28 -16
  116. package/examples/jsm/misc/VolumeSlice.js +24 -24
  117. package/examples/jsm/modifiers/SimplifyModifier.js +63 -556
  118. package/examples/jsm/objects/GaussianSplat.js +1039 -0
  119. package/examples/jsm/objects/Sky.js +66 -45
  120. package/examples/jsm/objects/SkyMesh.js +70 -51
  121. package/examples/jsm/physics/JoltPhysics.js +1 -1
  122. package/examples/jsm/postprocessing/AfterimagePass.js +4 -2
  123. package/examples/jsm/postprocessing/BloomPass.js +2 -2
  124. package/examples/jsm/postprocessing/GTAOPass.js +1 -1
  125. package/examples/jsm/postprocessing/OutlinePass.js +5 -5
  126. package/examples/jsm/postprocessing/SAOPass.js +1 -1
  127. package/examples/jsm/postprocessing/SSAOPass.js +1 -1
  128. package/examples/jsm/postprocessing/SSRPass.js +4 -2
  129. package/examples/jsm/postprocessing/SavePass.js +1 -1
  130. package/examples/jsm/postprocessing/TAARenderPass.js +1 -1
  131. package/examples/jsm/postprocessing/UnrealBloomPass.js +30 -13
  132. package/examples/jsm/renderers/CSS2DRenderer.js +29 -5
  133. package/examples/jsm/shaders/DepthLimitedBlurShader.js +4 -1
  134. package/examples/jsm/shaders/ExposureShader.js +1 -1
  135. package/examples/jsm/shaders/FilmShader.js +2 -1
  136. package/examples/jsm/transpiler/AST.js +21 -2
  137. package/examples/jsm/transpiler/GLSLDecoder.js +498 -8
  138. package/examples/jsm/transpiler/TSLEncoder.js +82 -10
  139. package/examples/jsm/transpiler/WGSLEncoder.js +33 -4
  140. package/examples/jsm/tsl/WebGLNodesHandler.js +29 -39
  141. package/examples/jsm/tsl/display/AfterImageNode.js +2 -0
  142. package/examples/jsm/tsl/display/AnaglyphPassNode.js +3 -2
  143. package/examples/jsm/tsl/display/BilateralBlurNode.js +5 -2
  144. package/examples/jsm/tsl/display/BloomNode.js +55 -30
  145. package/examples/jsm/tsl/display/DenoiseNode.js +21 -1
  146. package/examples/jsm/tsl/display/DepthOfFieldNode.js +24 -6
  147. package/examples/jsm/tsl/display/DotScreenNode.js +11 -11
  148. package/examples/jsm/tsl/display/FSR1Node.js +8 -4
  149. package/examples/jsm/tsl/display/GTAONode.js +199 -86
  150. package/examples/jsm/tsl/display/GaussianBlurNode.js +65 -52
  151. package/examples/jsm/tsl/display/GodraysNode.js +5 -2
  152. package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +2 -2
  153. package/examples/jsm/tsl/display/LensflareNode.js +5 -2
  154. package/examples/jsm/tsl/display/OITPassNode.js +352 -0
  155. package/examples/jsm/tsl/display/OutlineNode.js +2 -0
  156. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +3 -2
  157. package/examples/jsm/tsl/display/RGBShiftNode.js +9 -9
  158. package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +7 -4
  159. package/examples/jsm/tsl/display/RetroPassNode.js +1 -1
  160. package/examples/jsm/tsl/display/SMAANode.js +22 -61
  161. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -4
  162. package/examples/jsm/tsl/display/SSAONode.js +436 -0
  163. package/examples/jsm/tsl/display/SSGINode.js +5 -2
  164. package/examples/jsm/tsl/display/SSRNode.js +7 -2
  165. package/examples/jsm/tsl/display/SSSNode.js +5 -2
  166. package/examples/jsm/tsl/display/SharpenNode.js +5 -4
  167. package/examples/jsm/tsl/display/StereoCompositePassNode.js +1 -3
  168. package/examples/jsm/tsl/display/StereoPassNode.js +1 -3
  169. package/examples/jsm/tsl/display/TAAUNode.js +22 -125
  170. package/examples/jsm/tsl/display/TRAANode.js +16 -142
  171. package/examples/jsm/tsl/display/TemporalReprojectNode.js +21 -15
  172. package/examples/jsm/tsl/display/depthAwareBlur.js +63 -0
  173. package/examples/jsm/tsl/display/hashBlur.js +3 -2
  174. package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +38 -27
  175. package/examples/jsm/tsl/lighting/LightProbeGridNode.js +136 -0
  176. package/examples/jsm/tsl/math/voronoiNoise.js +112 -0
  177. package/examples/jsm/tsl/shadows/TileShadowNode.js +4 -6
  178. package/examples/jsm/tsl/utils/Raymarching.js +5 -5
  179. package/examples/jsm/tsl/utils/SoftParticles.js +60 -0
  180. package/examples/jsm/tsl/utils/TAAUtils.js +195 -0
  181. package/examples/jsm/utils/BufferGeometryUtils.js +14 -14
  182. package/examples/jsm/utils/GaussianSplatUtils.js +229 -0
  183. package/examples/jsm/utils/WebGLTextureUtils.js +1 -1
  184. package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
  185. package/examples/jsm/webxr/WebGLXRFallback.js +2 -16
  186. package/examples/jsm/webxr/XRControllerModelFactory.js +16 -4
  187. package/package.json +9 -16
  188. package/src/Three.Core.js +2 -1
  189. package/src/Three.TSL.js +73 -43
  190. package/src/Three.WebGPU.Nodes.js +1 -0
  191. package/src/Three.WebGPU.js +1 -0
  192. package/src/animation/AnimationClip.js +15 -2
  193. package/src/animation/AnimationObjectGroup.js +18 -6
  194. package/src/animation/AnimationUtils.js +26 -0
  195. package/src/animation/KeyframeTrack.js +37 -0
  196. package/src/constants.js +23 -1
  197. package/src/core/BufferAttribute.js +3 -2
  198. package/src/core/BufferGeometry.js +1 -1
  199. package/src/core/InterleavedBuffer.js +5 -1
  200. package/src/core/Object3D.js +40 -12
  201. package/src/core/Raycaster.js +4 -0
  202. package/src/core/RenderTarget.js +99 -9
  203. package/src/core/RenderTarget3D.js +12 -8
  204. package/src/extras/Controls.js +0 -8
  205. package/src/extras/PMREMGenerator.js +99 -205
  206. package/src/geometries/TorusGeometry.js +1 -1
  207. package/src/helpers/ArrowHelper.js +2 -0
  208. package/src/helpers/AxesHelper.js +2 -0
  209. package/src/helpers/Box3Helper.js +2 -0
  210. package/src/helpers/BoxHelper.js +2 -0
  211. package/src/helpers/CameraHelper.js +2 -0
  212. package/src/helpers/DirectionalLightHelper.js +2 -0
  213. package/src/helpers/GridHelper.js +2 -0
  214. package/src/helpers/HemisphereLightHelper.js +2 -0
  215. package/src/helpers/PlaneHelper.js +2 -0
  216. package/src/helpers/PointLightHelper.js +2 -0
  217. package/src/helpers/PolarGridHelper.js +2 -0
  218. package/src/helpers/SkeletonHelper.js +2 -0
  219. package/src/helpers/SpotLightHelper.js +2 -0
  220. package/src/lights/Light.js +0 -10
  221. package/src/lights/LightShadow.js +43 -12
  222. package/src/lights/SpotLightShadow.js +18 -0
  223. package/src/loaders/BufferGeometryLoader.js +5 -0
  224. package/src/loaders/ImageBitmapLoader.js +3 -1
  225. package/src/loaders/ObjectLoader.js +8 -5
  226. package/src/materials/Material.js +80 -57
  227. package/src/materials/MeshPhysicalMaterial.js +32 -0
  228. package/src/materials/nodes/Line2NodeMaterial.js +17 -8
  229. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +42 -5
  230. package/src/materials/nodes/NodeMaterial.js +19 -13
  231. package/src/materials/nodes/PointsNodeMaterial.js +2 -1
  232. package/src/materials/nodes/manager/NodeMaterialObserver.js +282 -55
  233. package/src/math/Frustum.js +9 -0
  234. package/src/math/FrustumArray.js +1 -1
  235. package/src/math/MathUtils.js +5 -3
  236. package/src/math/Matrix4.js +2 -9
  237. package/src/math/Plane.js +30 -1
  238. package/src/math/Quaternion.js +0 -10
  239. package/src/math/Ray.js +95 -45
  240. package/src/math/Triangle.js +0 -2
  241. package/src/math/Vector3.js +2 -2
  242. package/src/math/Vector4.js +0 -4
  243. package/src/math/interpolants/BezierInterpolant.js +36 -23
  244. package/src/nodes/Nodes.js +2 -0
  245. package/src/nodes/TSL.js +11 -3
  246. package/src/nodes/accessors/Batch.js +85 -13
  247. package/src/nodes/accessors/BufferAttributeNode.js +1 -1
  248. package/src/nodes/accessors/BuiltinNode.js +1 -1
  249. package/src/nodes/accessors/Instance.js +19 -18
  250. package/src/nodes/accessors/MaterialNode.js +9 -0
  251. package/src/nodes/accessors/ModelNode.js +85 -9
  252. package/src/nodes/accessors/ReferenceBaseNode.js +1 -70
  253. package/src/nodes/accessors/ReferenceElementNode.js +72 -0
  254. package/src/nodes/accessors/ReferenceNode.js +1 -70
  255. package/src/nodes/accessors/Skinning.js +124 -12
  256. package/src/nodes/accessors/StorageTextureNode.js +7 -3
  257. package/src/nodes/accessors/Texture3DNode.js +1 -1
  258. package/src/nodes/accessors/TextureNode.js +51 -21
  259. package/src/nodes/accessors/TextureSizeNode.js +4 -2
  260. package/src/nodes/accessors/UniformArrayNode.js +30 -5
  261. package/src/nodes/code/CodeNode.js +1 -1
  262. package/src/nodes/code/FunctionNode.js +12 -2
  263. package/src/nodes/core/ArrayNode.js +2 -2
  264. package/src/nodes/core/ContextNode.js +57 -4
  265. package/src/nodes/core/IndexNode.js +69 -4
  266. package/src/nodes/core/InspectorNode.js +2 -2
  267. package/src/nodes/core/MRTNode.js +44 -2
  268. package/src/nodes/core/Node.js +6 -3
  269. package/src/nodes/core/NodeBuilder.js +65 -50
  270. package/src/nodes/core/NodeFrame.js +11 -3
  271. package/src/nodes/core/NodeUtils.js +88 -0
  272. package/src/nodes/core/PropertyNode.js +8 -0
  273. package/src/nodes/core/StackNode.js +0 -1
  274. package/src/nodes/core/StructNode.js +4 -3
  275. package/src/nodes/core/UniformGroupNode.js +3 -2
  276. package/src/nodes/core/UniformNode.js +26 -12
  277. package/src/nodes/core/VarNode.js +0 -1
  278. package/src/nodes/display/BumpMapNode.js +2 -2
  279. package/src/nodes/display/ColorAdjustment.js +1 -1
  280. package/src/nodes/display/PassNode.js +76 -15
  281. package/src/nodes/display/ScreenNode.js +22 -65
  282. package/src/nodes/fog/Fog.js +4 -4
  283. package/src/nodes/functions/BSDF/BRDF_GGX.js +6 -6
  284. package/src/nodes/functions/BSDF/BRDF_Sheen.js +1 -1
  285. package/src/nodes/functions/BSDF/DFGLUT.js +2 -1
  286. package/src/nodes/functions/BSDF/LTC.js +1 -1
  287. package/src/nodes/functions/PhongLightingModel.js +1 -1
  288. package/src/nodes/functions/PhysicalLightingModel.js +83 -25
  289. package/src/nodes/functions/ToonLightingModel.js +2 -2
  290. package/src/nodes/functions/material/getParallaxCorrectNormal.js +3 -3
  291. package/src/nodes/gpgpu/AtomicFunctionNode.js +64 -13
  292. package/src/nodes/gpgpu/BarrierNode.js +13 -4
  293. package/src/nodes/gpgpu/ComputeBuiltinNode.js +1 -1
  294. package/src/nodes/gpgpu/ComputeNode.js +20 -17
  295. package/src/nodes/gpgpu/SubgroupFunctionNode.js +165 -37
  296. package/src/nodes/gpgpu/WorkgroupInfoNode.js +44 -6
  297. package/src/nodes/lighting/EnvironmentNode.js +40 -4
  298. package/src/nodes/lighting/LightsNode.js +20 -4
  299. package/src/nodes/lighting/ShadowBaseNode.js +158 -1
  300. package/src/nodes/lighting/ShadowFilterNode.js +2 -106
  301. package/src/nodes/lighting/ShadowNode.js +22 -91
  302. package/src/nodes/materialx/{lib/mx_hsv.js → MaterialXColor.js} +3 -6
  303. package/src/nodes/materialx/{lib/mx_transform_color.js → MaterialXColorTransform.js} +3 -6
  304. package/src/nodes/materialx/MaterialXCore.js +37 -0
  305. package/src/nodes/materialx/MaterialXNodes.js +64 -72
  306. package/src/nodes/materialx/{lib/mx_noise.js → MaterialXNoise.js} +426 -197
  307. package/src/nodes/math/BitcountNode.js +24 -4
  308. package/src/nodes/math/MathNode.js +4 -4
  309. package/src/nodes/math/MathUtils.js +15 -4
  310. package/src/nodes/math/OperatorNode.js +2 -2
  311. package/src/nodes/math/PackFloatNode.js +29 -1
  312. package/src/nodes/math/Packed4x8IntegerNode.js +433 -0
  313. package/src/nodes/math/UnpackFloatNode.js +30 -2
  314. package/src/nodes/parsers/GLSLNodeFunction.js +1 -1
  315. package/src/nodes/pmrem/PMREMNode.js +1 -1
  316. package/src/nodes/pmrem/PMREMUtils.js +31 -74
  317. package/src/nodes/shapes/Shapes.js +1 -1
  318. package/src/nodes/tsl/TSLCore.js +1 -31
  319. package/src/nodes/utils/EventNode.js +75 -0
  320. package/src/nodes/utils/LoopNode.js +54 -13
  321. package/src/nodes/utils/PostProcessingUtils.js +23 -2
  322. package/src/nodes/utils/RTTNode.js +97 -32
  323. package/src/nodes/utils/ReflectorNode.js +8 -4
  324. package/src/nodes/utils/RotateNode.js +85 -8
  325. package/src/nodes/utils/SpriteUtils.js +58 -23
  326. package/src/objects/BatchedMesh.js +6 -0
  327. package/src/objects/InstancedMesh.js +1 -1
  328. package/src/objects/LOD.js +1 -1
  329. package/src/objects/Line.js +12 -0
  330. package/src/objects/Mesh.js +12 -0
  331. package/src/objects/Points.js +12 -0
  332. package/src/objects/Sprite.js +12 -0
  333. package/src/renderers/WebGLRenderer.js +93 -27
  334. package/src/renderers/common/Animation.js +12 -2
  335. package/src/renderers/common/Backend.js +38 -10
  336. package/src/renderers/common/BindGroup.js +0 -1
  337. package/src/renderers/common/Bindings.js +50 -4
  338. package/src/renderers/common/BundleGroup.js +4 -0
  339. package/src/renderers/common/ClippingContext.js +11 -1
  340. package/src/renderers/common/Color4.js +9 -0
  341. package/src/renderers/common/Constants.js +0 -5
  342. package/src/renderers/common/DirectRenderPipeline.js +233 -0
  343. package/src/renderers/common/Geometries.js +24 -3
  344. package/src/renderers/common/Info.js +3 -3
  345. package/src/renderers/common/InspectorBase.js +37 -8
  346. package/src/renderers/common/Lighting.js +11 -4
  347. package/src/renderers/common/Pipelines.js +6 -4
  348. package/src/renderers/common/QuadMesh.js +16 -2
  349. package/src/renderers/common/RenderContext.js +8 -0
  350. package/src/renderers/common/RenderList.js +53 -19
  351. package/src/renderers/common/RenderLists.js +58 -11
  352. package/src/renderers/common/RenderObject.js +14 -0
  353. package/src/renderers/common/RenderObjects.js +14 -9
  354. package/src/renderers/common/RenderPipeline.js +52 -44
  355. package/src/renderers/common/Renderer.js +226 -55
  356. package/src/renderers/common/Storage3DTexture.js +16 -0
  357. package/src/renderers/common/Textures.js +3 -3
  358. package/src/renderers/common/XRManager.js +79 -72
  359. package/src/renderers/common/extras/PMREMGenerator.js +76 -144
  360. package/src/renderers/common/nodes/NodeManager.js +144 -6
  361. package/src/renderers/common/nodes/NodeStorageBuffer.js +3 -1
  362. package/src/renderers/common/nodes/NodeUniformBuffer.js +3 -1
  363. package/src/renderers/shaders/DFGLUTData.js +2 -1
  364. package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +4 -2
  365. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +48 -0
  366. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +53 -4
  367. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +20 -2
  368. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +20 -0
  369. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +6 -0
  370. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +61 -57
  371. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +82 -0
  372. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl.js +9 -0
  373. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +8 -1
  374. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +15 -0
  375. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -0
  376. package/src/renderers/shaders/ShaderLib.js +1 -0
  377. package/src/renderers/shaders/UniformsLib.js +16 -0
  378. package/src/renderers/webgl/WebGLAnimation.js +2 -2
  379. package/src/renderers/webgl/WebGLCapabilities.js +2 -2
  380. package/src/renderers/webgl/WebGLLights.js +74 -4
  381. package/src/renderers/webgl/WebGLMaterials.js +6 -0
  382. package/src/renderers/webgl/WebGLOutput.js +36 -24
  383. package/src/renderers/webgl/WebGLProgram.js +3 -0
  384. package/src/renderers/webgl/WebGLPrograms.js +8 -0
  385. package/src/renderers/webgl/WebGLRenderLists.js +6 -10
  386. package/src/renderers/webgl/WebGLShadowMap.js +47 -44
  387. package/src/renderers/webgl/WebGLTextures.js +7 -7
  388. package/src/renderers/webgl-fallback/WebGLBackend.js +153 -45
  389. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +83 -29
  390. package/src/renderers/webgl-fallback/utils/WebGLState.js +163 -17
  391. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +32 -5
  392. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +11 -4
  393. package/src/renderers/webgpu/WebGPUBackend.js +513 -145
  394. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +99 -20
  395. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +2 -1
  396. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +3 -12
  397. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +24 -14
  398. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +80 -14
  399. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +62 -7
  400. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +9 -3
  401. package/src/renderers/webgpu/utils/WebGPUUtils.js +16 -4
  402. package/src/renderers/webxr/WebXRManager.js +25 -2
  403. package/src/scenes/Scene.js +3 -3
  404. package/src/textures/CompressedArrayTexture.js +16 -0
  405. package/src/textures/Data3DTexture.js +16 -0
  406. package/src/textures/DataArrayTexture.js +16 -0
  407. package/src/textures/DepthTexture.js +3 -3
  408. package/src/textures/Texture.js +3 -3
  409. package/src/textures/{Source.js → TextureSource.js} +39 -8
  410. package/build/three.core.min.js +0 -6
  411. package/build/three.module.min.js +0 -6
  412. package/build/three.tsl.min.js +0 -6
  413. package/build/three.webgpu.min.js +0 -6
  414. package/build/three.webgpu.nodes.min.js +0 -6
  415. package/examples/jsm/libs/ecsy.module.js +0 -1792
  416. package/examples/jsm/loaders/LottieLoader.js +0 -130
  417. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +0 -52
@@ -260,7 +260,8 @@ class StorageTextureNode extends TextureNode {
260
260
 
261
261
  const textureProperty = super.generate( builder, 'property' );
262
262
  const uvSnippet = uvNode.build( builder, this.value.is3DTexture === true ? 'uvec3' : 'uvec2' );
263
- const storeSnippet = storeNode.build( builder, 'vec4' );
263
+ const storeType = builder.getTypeFromLength( 4, builder.getComponentTypeFromTexture( this.value ) );
264
+ const storeSnippet = storeNode.build( builder, storeType );
264
265
  const depthSnippet = depthNode ? depthNode.build( builder, 'int' ) : null;
265
266
 
266
267
  const snippet = builder.generateTextureStore( this.value, textureProperty, uvSnippet, depthSnippet, storeSnippet );
@@ -297,11 +298,14 @@ export const storageTexture = /*@__PURE__*/ nodeProxy( StorageTextureNode ).setP
297
298
 
298
299
 
299
300
  /**
300
- * TODO: Explain difference to `storageTexture()`.
301
+ * TSL function for storing a value in a storage texture.
302
+ *
303
+ * Unlike {@link storageTexture}, this function also accepts an existing storage
304
+ * texture node and is intended for performing the store operation itself.
301
305
  *
302
306
  * @tsl
303
307
  * @function
304
- * @param {StorageTexture|StorageTextureNode} value - The storage texture.
308
+ * @param {StorageTexture|StorageTextureNode} value - The storage texture or storage texture node.
305
309
  * @param {Node<vec2|vec3>} uvNode - The uv node.
306
310
  * @param {?Node} [storeNode=null] - The value node that should be stored in the texture.
307
311
  * @returns {StorageTextureNode}
@@ -1,7 +1,7 @@
1
1
  import TextureNode from './TextureNode.js';
2
2
  import { nodeProxy, vec3, Fn, If } from '../tsl/TSLBase.js';
3
3
 
4
- const normal = Fn( ( { texture, uv } ) => {
4
+ const normal = /*@__PURE__*/ Fn( ( { texture, uv } ) => {
5
5
 
6
6
  const epsilon = 0.0001;
7
7
 
@@ -7,6 +7,7 @@ import { maxMipLevel } from '../utils/MaxMipLevelNode.js';
7
7
  import { nodeProxy, vec3, nodeObject, int, Fn } from '../tsl/TSLBase.js';
8
8
  import { step } from '../math/MathNode.js';
9
9
  import { NodeUpdateType } from '../core/constants.js';
10
+ import { getTextureType } from '../core/NodeUtils.js';
10
11
 
11
12
  import { Compatibility, GreaterCompare, GreaterEqualCompare, IntType, LessCompare, LessEqualCompare, NearestFilter, UnsignedIntType } from '../../constants.js';
12
13
 
@@ -179,6 +180,15 @@ class TextureNode extends UniformNode {
179
180
  */
180
181
  this._flipYUniform = null;
181
182
 
183
+ /**
184
+ * Whether the node is used as a comparison sampler, e.g. via `samplerComparison()`.
185
+ *
186
+ * @private
187
+ * @type {boolean}
188
+ * @default false
189
+ */
190
+ this._samplerComparison = false;
191
+
182
192
  this.setUpdateMatrix( uvNode === null );
183
193
 
184
194
  }
@@ -228,25 +238,13 @@ class TextureNode extends UniformNode {
228
238
  */
229
239
  generateNodeType( /*builder*/ ) {
230
240
 
231
- if ( this.value.isDepthTexture === true ) {
232
-
233
- if ( this.gatherNode === null ) return 'float';
241
+ if ( this.gatherNode !== null ) {
234
242
 
235
243
  return 'vec4';
236
244
 
237
245
  }
238
246
 
239
- if ( this.value.type === UnsignedIntType ) {
240
-
241
- return 'uvec4';
242
-
243
- } else if ( this.value.type === IntType ) {
244
-
245
- return 'ivec4';
246
-
247
- }
248
-
249
- return 'vec4';
247
+ return getTextureType( this.value );
250
248
 
251
249
  }
252
250
 
@@ -576,6 +574,18 @@ class TextureNode extends UniformNode {
576
574
 
577
575
  if ( /^sampler/.test( output ) ) {
578
576
 
577
+ if ( output === 'samplerComparison' ) {
578
+
579
+ this._samplerComparison = true;
580
+
581
+ // texture nodes with the same texture share a single uniform so it's
582
+ // important to set the flag on the node the binding refers to as well
583
+
584
+ const sharedNode = this.getSharedNode( builder );
585
+ sharedNode._samplerComparison = true;
586
+
587
+ }
588
+
579
589
  return textureProperty + '_sampler';
580
590
 
581
591
  } else if ( builder.isReference( output ) ) {
@@ -586,7 +596,7 @@ class TextureNode extends UniformNode {
586
596
 
587
597
  const nodeData = builder.getDataFromNode( this );
588
598
 
589
- let nodeType = this.getNodeType( builder );
599
+ const nodeType = this.getNodeType( builder );
590
600
 
591
601
  let propertyName = nodeData.propertyName;
592
602
 
@@ -605,12 +615,6 @@ class TextureNode extends UniformNode {
605
615
  const offsetSnippet = offsetNode ? this.generateOffset( builder, offsetNode ) : null;
606
616
  const flipYSnippet = this._flipYUniform ? this._flipYUniform.build( builder, 'bool' ) : null;
607
617
 
608
- if ( gatherSnippet ) {
609
-
610
- nodeType = 'vec4';
611
-
612
- }
613
-
614
618
  let finalDepthSnippet = depthSnippet;
615
619
 
616
620
  if ( finalDepthSnippet === null && texture.isArrayTexture && this.isTexture3DNode !== true ) {
@@ -625,6 +629,20 @@ class TextureNode extends UniformNode {
625
629
 
626
630
  let snippet = this.generateSnippet( builder, textureProperty, uvSnippet, levelSnippet, biasSnippet, finalDepthSnippet, compareSnippet, gradSnippet, gatherSnippet, offsetSnippet, flipYSnippet );
627
631
 
632
+ let snippetType;
633
+
634
+ if ( texture.isDepthTexture === true && gatherSnippet === null ) {
635
+
636
+ snippetType = 'float';
637
+
638
+ } else {
639
+
640
+ snippetType = texture.type === UnsignedIntType ? 'uvec4' : ( texture.type === IntType ? 'ivec4' : 'vec4' );
641
+
642
+ }
643
+
644
+ snippet = builder.format( snippet, snippetType, nodeType );
645
+
628
646
  if ( compareStepSnippet !== null ) {
629
647
 
630
648
  const compareFunction = texture.compareFunction;
@@ -846,6 +864,18 @@ class TextureNode extends UniformNode {
846
864
 
847
865
  }
848
866
 
867
+ /**
868
+ * Returns `true` if the texture is sampled with a depth comparison,
869
+ * meaning the node must be bound with a comparison sampler.
870
+ *
871
+ * @return {boolean} Whether comparison sampling is used or not.
872
+ */
873
+ isSampleCompare() {
874
+
875
+ return this.compareNode !== null || this._samplerComparison === true;
876
+
877
+ }
878
+
849
879
  /**
850
880
  * Samples the texture by defining a depth node.
851
881
  *
@@ -52,12 +52,14 @@ class TextureSizeNode extends Node {
52
52
 
53
53
  }
54
54
 
55
- generate( builder, output ) {
55
+ generate( builder ) {
56
56
 
57
57
  const textureProperty = this.textureNode.build( builder, 'property' );
58
58
  const level = this.levelNode === null ? '0' : this.levelNode.build( builder, 'int' );
59
59
 
60
- return builder.format( `${ builder.getMethod( 'textureDimensions' ) }( ${ textureProperty }, ${ level } )`, this.getNodeType( builder ), output );
60
+ const snippet = builder.generateTextureSize( this.textureNode.value, textureProperty, level );
61
+
62
+ return builder.format( snippet, this.getNodeType( builder ) );
61
63
 
62
64
  }
63
65
 
@@ -186,13 +186,38 @@ class UniformArrayNode extends BufferNode {
186
186
 
187
187
  }
188
188
 
189
+ update( /*frame*/ ) {
190
+
191
+ this.updateBuffer();
192
+
193
+ }
194
+
189
195
  /**
190
- * The update makes sure to correctly transfer the data from the (complex) objects
191
- * in the array to the internal, correctly padded value buffer.
196
+ * Composes a user-defined update with the buffer transfer.
192
197
  *
193
- * @param {NodeFrame} frame - A reference to the current node frame.
198
+ * @param {Function} callback - The update function.
199
+ * @param {string} updateType - The update type.
200
+ * @return {UniformArrayNode} A reference to this node.
194
201
  */
195
- update( /*frame*/ ) {
202
+ onUpdate( callback, updateType ) {
203
+
204
+ callback = callback.bind( this );
205
+
206
+ return super.onUpdate( ( frame, self ) => {
207
+
208
+ callback( frame, self );
209
+
210
+ this.updateBuffer();
211
+
212
+ }, updateType );
213
+
214
+ }
215
+
216
+ /**
217
+ * The method makes sure to correctly transfer the data from the (complex) objects
218
+ * in the array to the internal, correctly padded value buffer.
219
+ */
220
+ updateBuffer() {
196
221
 
197
222
  const { array, value } = this;
198
223
 
@@ -315,7 +340,7 @@ class UniformArrayNode extends BufferNode {
315
340
  this.bufferCount = length;
316
341
  this.bufferType = paddedType;
317
342
 
318
- this.update(); // initialize the buffer values
343
+ this.updateBuffer(); // initialize the buffer values
319
344
 
320
345
  return super.setup( builder );
321
346
 
@@ -102,7 +102,7 @@ class CodeNode extends Node {
102
102
 
103
103
  for ( const include of includes ) {
104
104
 
105
- include.build( builder );
105
+ include.build( builder, 'void' );
106
106
 
107
107
  }
108
108
 
@@ -126,9 +126,19 @@ class FunctionNode extends CodeNode {
126
126
 
127
127
  if ( name !== '' ) {
128
128
 
129
- // use a custom property name
129
+ const nodeData = builder.getDataFromNode( this );
130
130
 
131
- nodeCode.name = name;
131
+ if ( nodeData.declarationRegistered !== true ) {
132
+
133
+ // use a custom property name
134
+
135
+ nodeCode.name = name;
136
+
137
+ builder.registerDeclaration( nodeCode );
138
+
139
+ nodeData.declarationRegistered = true;
140
+
141
+ }
132
142
 
133
143
  }
134
144
 
@@ -154,7 +154,7 @@ export const array = ( ...params ) => {
154
154
 
155
155
  if ( params.length === 1 ) {
156
156
 
157
- const values = params[ 0 ];
157
+ const values = params[ 0 ].map( ( value ) => nodeObject( value ) );
158
158
 
159
159
  node = new ArrayNode( null, values.length, values );
160
160
 
@@ -167,7 +167,7 @@ export const array = ( ...params ) => {
167
167
 
168
168
  }
169
169
 
170
- return nodeObject( node );
170
+ return node;
171
171
 
172
172
  };
173
173
 
@@ -123,11 +123,17 @@ class ContextNode extends Node {
123
123
 
124
124
  analyze( builder ) {
125
125
 
126
- const previousContext = builder.addContext( this.value );
126
+ const usageCount = builder.increaseUsage( this );
127
127
 
128
- this.node.build( builder );
128
+ if ( usageCount === 1 ) {
129
129
 
130
- builder.setContext( previousContext );
130
+ const previousContext = builder.addContext( this.value );
131
+
132
+ this.node.build( builder, this );
133
+
134
+ builder.setContext( previousContext );
135
+
136
+ }
131
137
 
132
138
  }
133
139
 
@@ -135,10 +141,12 @@ class ContextNode extends Node {
135
141
 
136
142
  const previousContext = builder.addContext( this.value );
137
143
 
138
- this.node.build( builder );
144
+ const node = this.node.build( builder );
139
145
 
140
146
  builder.setContext( previousContext );
141
147
 
148
+ return node;
149
+
142
150
  }
143
151
 
144
152
  generate( builder, output ) {
@@ -257,6 +265,50 @@ export function builtinAOContext( aoNode, node = null ) {
257
265
 
258
266
  }
259
267
 
268
+ /**
269
+ * TSL function for defining a built-in global illumination context for a given node. The AO node
270
+ * modulates the indirect lighting of the materials, the GI node is added to their irradiance
271
+ * without being modulated by the AO since it already accounts for occlusion.
272
+ *
273
+ * @tsl
274
+ * @function
275
+ * @param {Node<float>} aoNode - The ambient occlusion value node to apply.
276
+ * @param {Node<vec3>} giNode - The indirect diffuse irradiance node to add.
277
+ * @param {Node} [node=null] - The node whose context should be modified.
278
+ * @returns {ContextNode}
279
+ */
280
+ export function builtinGIContext( aoNode, giNode, node = null ) {
281
+
282
+ // the lighting models multiply the whole indirect diffuse term by the AO, which would occlude
283
+ // the GI a second time. Dividing the GI by the AO cancels that out so only the environment
284
+ // lighting is modulated.
285
+
286
+ const ao = aoNode.max( 1e-3 );
287
+
288
+ return context( node, {
289
+
290
+ getAO: ( inputNode, { material } ) => {
291
+
292
+ if ( material.transparent === true ) return inputNode;
293
+
294
+ return inputNode !== null ? inputNode.mul( ao ) : ao;
295
+
296
+ },
297
+
298
+ getGI: ( inputNode, { material } ) => {
299
+
300
+ if ( material.transparent === true ) return inputNode;
301
+
302
+ const gi = giNode.div( ao );
303
+
304
+ return inputNode !== null ? inputNode.add( gi ) : gi;
305
+
306
+ }
307
+
308
+ } );
309
+
310
+ }
311
+
260
312
  /**
261
313
  * TSL function for defining a label context value for a given node.
262
314
  *
@@ -281,3 +333,4 @@ addMethodChaining( 'uniformFlow', uniformFlow );
281
333
  addMethodChaining( 'setName', setName );
282
334
  addMethodChaining( 'builtinShadowContext', ( node, shadowNode, light ) => builtinShadowContext( shadowNode, light, node ) );
283
335
  addMethodChaining( 'builtinAOContext', ( node, aoValue ) => builtinAOContext( aoValue, node ) );
336
+ addMethodChaining( 'builtinGIContext', ( node, aoValue, giValue ) => builtinGIContext( aoValue, giValue, node ) );
@@ -9,7 +9,7 @@ import { varying } from './VaryingNode.js';
9
9
  * - `vertexIndex`: The index of a vertex within a mesh.
10
10
  * - `instanceIndex`: The index of either a mesh instance or an invocation of a compute shader.
11
11
  * - `drawIndex`: The index of a draw call.
12
- * - `invocationLocalIndex`: The index of a compute invocation within the scope of a workgroup load.
12
+ * - `invocationLocalIndex`: The index of a compute invocation within the scope of a workgroup.
13
13
  * - `invocationSubgroupIndex`: The index of a compute invocation within the scope of a subgroup.
14
14
  * - `subgroupIndex`: The index of a compute invocation's subgroup within its workgroup.
15
15
  *
@@ -26,7 +26,7 @@ class IndexNode extends Node {
26
26
  /**
27
27
  * Constructs a new index node.
28
28
  *
29
- * @param {('vertex'|'instance'|'subgroup'|'invocationLocal'|'invocationGlobal'|'invocationSubgroup'|'draw')} scope - The scope of the index node.
29
+ * @param {('vertex'|'instance'|'subgroup'|'invocationLocal'|'invocationSubgroup'|'draw')} scope - The scope of the index node.
30
30
  */
31
31
  constructor( scope ) {
32
32
 
@@ -125,7 +125,29 @@ export default IndexNode;
125
125
  export const vertexIndex = /*@__PURE__*/ nodeImmutable( IndexNode, IndexNode.VERTEX );
126
126
 
127
127
  /**
128
- * TSL object that represents the index of either a mesh instance or an invocation of a compute shader.
128
+ * TSL object that contextually represents specific index data depending on the shader stage.
129
+ *
130
+ * Within the vertex and fragment stages, `instanceIndex` will represent the index of the current mesh instance being evaluated by the shader.
131
+ * In these stages, use `instanceIndex` to modify a mesh based on its instance or to select per-instance data.
132
+ *
133
+ * ```js
134
+ * // instanceIndex will equal the current mesh's instance index between 0-500
135
+ * const material = new THREE.BasicNodeMaterial();
136
+ * material.positionNode = vec3( instanceIndex.mod( 10 ), instanceIndex.div( 10 ), 0 );
137
+ * const mesh = new THREE.InstancedMesh( geometry, material, 500 );
138
+ * ```
139
+ *
140
+ * Within the compute stage, `instanceIndex` will represent the global index of a compute invocation within the 3-dimensional compute workgroup load.
141
+ * In this stage, use `instanceIndex` to modify or select data at a given index within a buffer, or derive values from the index itself.
142
+ *
143
+ * ```js
144
+ * // instanceIndex will equal value between 0 - 255
145
+ * const computeFn = Fn() => {
146
+ *
147
+ * storageBuffer.element( instanceIndex ).assign( instanceIndex );
148
+ *
149
+ * } )().compute( 255 )
150
+ * ```
129
151
  *
130
152
  * @tsl
131
153
  * @type {IndexNode}
@@ -134,6 +156,21 @@ export const instanceIndex = /*@__PURE__*/ nodeImmutable( IndexNode, IndexNode.I
134
156
 
135
157
  /**
136
158
  * TSL object that represents the index of the subgroup the current compute invocation belongs to.
159
+ * Subgroup indices are local to the workgroups to which they belong.
160
+ *
161
+ * ```js
162
+ * // Execute 12 compute threads with a workgroup size of 9. Example assumes a subgroup size of 3.
163
+ * const computeFn = Fn( () => {
164
+ *
165
+ * storageBufferOne.element( instanceIndex ).assign( subgroupIndex );
166
+ * storageBufferTwo.element( instanceIndex ).assign( workgroupId.x );
167
+ *
168
+ * } )().compute( 12, [ 9 ] );
169
+ *
170
+ * // instanceIndex = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ];
171
+ * // Buffer One ( Subgroup Index ) = [ 0, 0, 0, 1, 1, 1, 2, 2, 2, 0, 0, 0 ];
172
+ * // Buffer Two ( Workgroup ID ) = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1 ];
173
+ * ```
137
174
  *
138
175
  * @tsl
139
176
  * @type {IndexNode}
@@ -143,13 +180,41 @@ export const subgroupIndex = /*@__PURE__*/ nodeImmutable( IndexNode, IndexNode.S
143
180
  /**
144
181
  * TSL object that represents the index of a compute invocation within the scope of a subgroup.
145
182
  *
183
+ * ```js
184
+ * // Execute 12 compute threads with a workgroup size of 12. Example assumes a subgroup size of 3.
185
+ * const computeFn = Fn( () => {
186
+ *
187
+ * storageBufferOne.element( instanceIndex ).assign( invocationSubgroupIndex );
188
+ * storageBufferTwo.element( instanceIndex ).assign( subgroupIndex );
189
+ *
190
+ * } )().compute( 12, [ 12 ] );
191
+ *
192
+ * // instanceIndex = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ];
193
+ * // Buffer One ( Invocation Subgroup Index ) = [ 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2 ];
194
+ * // Buffer Two ( Subgroup Index ) = [ 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3 ];
195
+ * ```
196
+ *
146
197
  * @tsl
147
198
  * @type {IndexNode}
148
199
  */
149
200
  export const invocationSubgroupIndex = /*@__PURE__*/ nodeImmutable( IndexNode, IndexNode.INVOCATION_SUBGROUP );
150
201
 
151
202
  /**
152
- * TSL object that represents the index of a compute invocation within the scope of a workgroup load.
203
+ * TSL object that represents the index of a compute invocation within the scope of a workgroup.
204
+ *
205
+ * ```js
206
+ * // Execute 12 compute threads with a workgroup size of 4.
207
+ * const computeFn = Fn( () => {
208
+ *
209
+ * storageBufferOne.element( instanceIndex ).assign( invocationLocalIndex );
210
+ * storageBufferTwo.element( instanceIndex ).assign( workgroupId.x );
211
+ *
212
+ * } )().compute( 12, [ 4 ] );
213
+ *
214
+ * // instanceIndex = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ];
215
+ * // Buffer One ( Invocation Local Index ) = [ 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3 ];
216
+ * // Buffer Two ( Workgroup ID ) = [ 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2 ];
217
+ * ```
153
218
  *
154
219
  * @tsl
155
220
  * @type {IndexNode}
@@ -117,7 +117,7 @@ export default InspectorNode;
117
117
  * @param {Function|null} [callback=null] - Optional callback to modify the node during setup.
118
118
  * @returns {Node} The inspector node.
119
119
  */
120
- export function inspector( node, name = '', callback = null ) {
120
+ export function inspect( node, name = '', callback = null ) {
121
121
 
122
122
  node = nodeObject( node );
123
123
 
@@ -125,4 +125,4 @@ export function inspector( node, name = '', callback = null ) {
125
125
 
126
126
  }
127
127
 
128
- addMethodChaining( 'toInspector', inspector );
128
+ addMethodChaining( 'toInspector', inspect );
@@ -2,6 +2,7 @@ import OutputStructNode from './OutputStructNode.js';
2
2
  import { nodeProxy } from '../tsl/TSLBase.js';
3
3
  import { MaterialBlending, NoBlending } from '../../constants.js';
4
4
  import BlendMode from '../../renderers/common/BlendMode.js';
5
+ import Color4 from '../../renderers/common/Color4.js';
5
6
 
6
7
  // Predefined blend modes for MRT nodes.
7
8
  const _noBlending = /**@__PURE__*/ new BlendMode( NoBlending );
@@ -78,6 +79,13 @@ class MRTNode extends OutputStructNode {
78
79
  output: _materialBlending
79
80
  };
80
81
 
82
+ /**
83
+ * A dictionary storing the clear colors for each output.
84
+ *
85
+ * @type {Object<string, Color4>}
86
+ */
87
+ this.clearColors = {};
88
+
81
89
  /**
82
90
  * This flag can be used for type testing.
83
91
  *
@@ -116,6 +124,38 @@ class MRTNode extends OutputStructNode {
116
124
 
117
125
  }
118
126
 
127
+ /**
128
+ * Sets the clear color for the given output name.
129
+ *
130
+ * @param {string} name - The name of the output.
131
+ * @param {number|string|Color} color - The clear color.
132
+ * @param {number} [alpha=1] - The clear alpha.
133
+ * @return {MRTNode} The current MRT node.
134
+ */
135
+ setClearColor( name, color, alpha = 1 ) {
136
+
137
+ const clearColor = this.clearColors[ name ] || ( this.clearColors[ name ] = new Color4() );
138
+
139
+ clearColor.set( color );
140
+ clearColor.a = alpha;
141
+
142
+ return this;
143
+
144
+ }
145
+
146
+ /**
147
+ * Returns the clear color for the given output name.
148
+ *
149
+ * @param {string} name - The name of the output.
150
+ * @return {?Color4} The clear color. Returns `null` if no clear color is defined
151
+ * which means the renderer's default clear policy is applied.
152
+ */
153
+ getClearColor( name ) {
154
+
155
+ return this.clearColors[ name ] || null;
156
+
157
+ }
158
+
119
159
  /**
120
160
  * Returns `true` if the MRT node has an output with the given name.
121
161
  *
@@ -149,10 +189,12 @@ class MRTNode extends OutputStructNode {
149
189
  merge( mrtNode ) {
150
190
 
151
191
  const outputs = { ...this.outputNodes, ...mrtNode.outputNodes };
152
- const blendings = { ...this.blendModes, ...mrtNode.blendModes };
192
+ const blendModes = { ...this.blendModes, ...mrtNode.blendModes };
193
+ const clearColors = { ...this.clearColors, ...mrtNode.clearColors };
153
194
 
154
195
  const mrtTarget = mrt( outputs );
155
- mrtTarget.blendings = blendings;
196
+ mrtTarget.blendModes = blendModes;
197
+ mrtTarget.clearColors = clearColors;
156
198
 
157
199
  return mrtTarget;
158
200
 
@@ -501,9 +501,10 @@ class Node extends EventDispatcher {
501
501
  /**
502
502
  * Returns the update type of {@link Node#update}.
503
503
  *
504
+ * @param {NodeFrame} [frame] - The current node frame.
504
505
  * @return {NodeUpdateType} The update type.
505
506
  */
506
- getUpdateType() {
507
+ getUpdateType( /*frame*/ ) {
507
508
 
508
509
  return this.updateType;
509
510
 
@@ -512,9 +513,10 @@ class Node extends EventDispatcher {
512
513
  /**
513
514
  * Returns the update type of {@link Node#updateBefore}.
514
515
  *
516
+ * @param {NodeFrame} [frame] - The current node frame.
515
517
  * @return {NodeUpdateType} The update type.
516
518
  */
517
- getUpdateBeforeType() {
519
+ getUpdateBeforeType( /*frame*/ ) {
518
520
 
519
521
  return this.updateBeforeType;
520
522
 
@@ -523,9 +525,10 @@ class Node extends EventDispatcher {
523
525
  /**
524
526
  * Returns the update type of {@link Node#updateAfter}.
525
527
  *
528
+ * @param {NodeFrame} [frame] - The current node frame.
526
529
  * @return {NodeUpdateType} The update type.
527
530
  */
528
- getUpdateAfterType() {
531
+ getUpdateAfterType( /*frame*/ ) {
529
532
 
530
533
  return this.updateAfterType;
531
534