@gnsx/three 0.185.16 → 0.186.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 (418) hide show
  1. package/build/three.cjs +10 -82600
  2. package/build/three.core.js +1309 -807
  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/src/utils.js +6 -79
  411. package/build/three.core.min.js +0 -6
  412. package/build/three.module.min.js +0 -6
  413. package/build/three.tsl.min.js +0 -6
  414. package/build/three.webgpu.min.js +0 -6
  415. package/build/three.webgpu.nodes.min.js +0 -6
  416. package/examples/jsm/libs/ecsy.module.js +0 -1792
  417. package/examples/jsm/loaders/LottieLoader.js +0 -130
  418. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +0 -52
@@ -1,8 +1,10 @@
1
1
  import { Fn, int, uint, float, vec2, vec3, vec4, If } from '../tsl/TSLBase.js';
2
- import { cos, sin, abs, max, exp2, log2, clamp, fract, mix, floor, normalize, cross, dot, sqrt } from '../math/MathNode.js';
2
+ import { cos, sin, abs, min, max, exp, exp2, log, log2, clamp, fract, mix, floor, normalize, cross, dot, sqrt } from '../math/MathNode.js';
3
3
  import { mul } from '../math/OperatorNode.js';
4
4
  import { select } from '../math/ConditionalNode.js';
5
- import { Loop, Break } from '../utils/LoopNode.js';
5
+ import { Loop } from '../utils/LoopNode.js';
6
+
7
+ const GOLDEN_ANGLE = 2.399963229728653;
6
8
 
7
9
  // These defines must match with PMREMGenerator
8
10
 
@@ -143,53 +145,6 @@ const roughnessToMip = /*@__PURE__*/ Fn( ( [ roughness ] ) => {
143
145
  ]
144
146
  } );
145
147
 
146
- // RH coordinate system; PMREM face-indexing convention
147
- export const getDirection = /*@__PURE__*/ Fn( ( [ uv_immutable, face ] ) => {
148
-
149
- const uv = uv_immutable.toVar();
150
- uv.assign( mul( 2.0, uv ).sub( 1.0 ) );
151
- const direction = vec3( uv, 1.0 ).toVar();
152
-
153
- If( face.equal( 0.0 ), () => {
154
-
155
- direction.assign( direction.zyx ); // ( 1, v, u ) pos x
156
-
157
- } ).ElseIf( face.equal( 1.0 ), () => {
158
-
159
- direction.assign( direction.xzy );
160
- direction.xz.mulAssign( - 1.0 ); // ( -u, 1, -v ) pos y
161
-
162
- } ).ElseIf( face.equal( 2.0 ), () => {
163
-
164
- direction.x.mulAssign( - 1.0 ); // ( -u, v, 1 ) pos z
165
-
166
- } ).ElseIf( face.equal( 3.0 ), () => {
167
-
168
- direction.assign( direction.zyx );
169
- direction.xz.mulAssign( - 1.0 ); // ( -1, v, -u ) neg x
170
-
171
- } ).ElseIf( face.equal( 4.0 ), () => {
172
-
173
- direction.assign( direction.xzy );
174
- direction.xy.mulAssign( - 1.0 ); // ( -u, -1, v ) neg y
175
-
176
- } ).ElseIf( face.equal( 5.0 ), () => {
177
-
178
- direction.z.mulAssign( - 1.0 ); // ( u, v, -1 ) neg zS
179
-
180
- } );
181
-
182
- return direction;
183
-
184
- } ).setLayout( {
185
- name: 'getDirection',
186
- type: 'vec3',
187
- inputs: [
188
- { name: 'uv', type: 'vec2' },
189
- { name: 'face', type: 'float' }
190
- ]
191
- } );
192
-
193
148
  //
194
149
 
195
150
  export const textureCubeUV = /*@__PURE__*/ Fn( ( [ envMap, sampleDir_immutable, roughness_immutable, CUBEUV_TEXEL_WIDTH, CUBEUV_TEXEL_HEIGHT, CUBEUV_MAX_MIP ] ) => {
@@ -241,49 +196,51 @@ const bilinearCubeUV = /*@__PURE__*/ Fn( ( [ envMap, direction_immutable, mipInt
241
196
 
242
197
  } );
243
198
 
244
- const getSample = /*@__PURE__*/ Fn( ( { envMap, mipInt, outputDirection, theta, axis, CUBEUV_TEXEL_WIDTH, CUBEUV_TEXEL_HEIGHT, CUBEUV_MAX_MIP } ) => {
245
-
246
- const cosTheta = cos( theta );
199
+ // Gaussian blur along a golden-angle spiral, importance-sampled by stratified
200
+ // inverse-CDF so every sample carries equal Gaussian weight.
201
+ export const sphericalGaussianBlur = /*@__PURE__*/ Fn( ( { SAMPLES, sigma, outputDirection, mipInt, envMap, CUBEUV_TEXEL_WIDTH, CUBEUV_TEXEL_HEIGHT, CUBEUV_MAX_MIP } ) => {
247
202
 
248
- // Rodrigues' axis-angle rotation
249
- const sampleDirection = outputDirection.mul( cosTheta )
250
- .add( axis.cross( outputDirection ).mul( sin( theta ) ) )
251
- .add( axis.mul( axis.dot( outputDirection ).mul( cosTheta.oneMinus() ) ) );
203
+ const color = vec3( 0.0 ).toVar();
252
204
 
253
- return bilinearCubeUV( envMap, sampleDirection, mipInt, CUBEUV_TEXEL_WIDTH, CUBEUV_TEXEL_HEIGHT, CUBEUV_MAX_MIP );
205
+ If( sigma.equal( 0.0 ), () => {
254
206
 
255
- } );
256
-
257
- export const blur = /*@__PURE__*/ Fn( ( { n, latitudinal, poleAxis, outputDirection, weights, samples, dTheta, mipInt, envMap, CUBEUV_TEXEL_WIDTH, CUBEUV_TEXEL_HEIGHT, CUBEUV_MAX_MIP } ) => {
207
+ color.assign( bilinearCubeUV( envMap, outputDirection, mipInt, CUBEUV_TEXEL_WIDTH, CUBEUV_TEXEL_HEIGHT, CUBEUV_MAX_MIP ) );
258
208
 
259
- const axis = vec3( select( latitudinal, poleAxis, cross( poleAxis, outputDirection ) ) ).toVar();
209
+ } ).Else( () => {
260
210
 
261
- If( axis.equal( vec3( 0.0 ) ), () => {
211
+ const up = select( abs( outputDirection.z ).lessThan( 0.999 ), vec3( 0.0, 0.0, 1.0 ), vec3( 1.0, 0.0, 0.0 ) );
212
+ const tangent = normalize( cross( up, outputDirection ) ).toVar();
213
+ const bitangent = cross( outputDirection, tangent ).toVar();
262
214
 
263
- axis.assign( vec3( outputDirection.z, 0.0, outputDirection.x.negate() ) );
215
+ // Truncate the kernel at three standard deviations or at the antipode.
216
+ const thetaMax = min( sigma.mul( 3.0 ), Math.PI );
217
+ const truncation = exp( thetaMax.mul( thetaMax ).mul( - 0.5 ).div( sigma.mul( sigma ) ) ).oneMinus().toVar();
264
218
 
265
- } );
219
+ const accumWeight = float( 0.0 ).toVar();
266
220
 
267
- axis.assign( normalize( axis ) );
221
+ Loop( { start: int( 0 ), end: SAMPLES }, ( { i } ) => {
268
222
 
269
- const gl_FragColor = vec3().toVar();
270
- gl_FragColor.addAssign( weights.element( 0 ).mul( getSample( { theta: 0.0, axis, outputDirection, mipInt, envMap, CUBEUV_TEXEL_WIDTH, CUBEUV_TEXEL_HEIGHT, CUBEUV_MAX_MIP } ) ) );
223
+ // Stratified inverse-CDF sampling of the Gaussian, placed on a golden-angle spiral.
224
+ const stratum = float( i ).add( 0.5 ).div( float( SAMPLES ) );
225
+ const theta = sigma.mul( sqrt( log( stratum.mul( truncation ).oneMinus() ).mul( - 2.0 ) ) ).toVar();
226
+ const phi = float( i ).mul( GOLDEN_ANGLE ).toVar();
271
227
 
272
- Loop( { start: int( 1 ), end: n }, ( { i } ) => {
228
+ const offset = tangent.mul( cos( phi ) ).add( bitangent.mul( sin( phi ) ) );
229
+ const sampleDirection = outputDirection.mul( cos( theta ) ).add( offset.mul( sin( theta ) ) );
273
230
 
274
- If( i.greaterThanEqual( samples ), () => {
231
+ // Correct the planar sample density to solid angle.
232
+ const weight = sin( theta ).div( theta ).toVar();
275
233
 
276
- Break();
234
+ color.addAssign( bilinearCubeUV( envMap, sampleDirection, mipInt, CUBEUV_TEXEL_WIDTH, CUBEUV_TEXEL_HEIGHT, CUBEUV_MAX_MIP ).mul( weight ) );
235
+ accumWeight.addAssign( weight );
277
236
 
278
237
  } );
279
238
 
280
- const theta = float( dTheta.mul( float( i ) ) ).toVar();
281
- gl_FragColor.addAssign( weights.element( i ).mul( getSample( { theta: theta.mul( - 1.0 ), axis, outputDirection, mipInt, envMap, CUBEUV_TEXEL_WIDTH, CUBEUV_TEXEL_HEIGHT, CUBEUV_MAX_MIP } ) ) );
282
- gl_FragColor.addAssign( weights.element( i ).mul( getSample( { theta, axis, outputDirection, mipInt, envMap, CUBEUV_TEXEL_WIDTH, CUBEUV_TEXEL_HEIGHT, CUBEUV_MAX_MIP } ) ) );
239
+ color.divAssign( accumWeight );
283
240
 
284
241
  } );
285
242
 
286
- return vec4( gl_FragColor, 1 );
243
+ return vec4( color, 1.0 );
287
244
 
288
245
  } );
289
246
 
@@ -10,7 +10,7 @@ import { uv } from '../accessors/UV.js';
10
10
  * @param {Node<vec2>} coord - The uv to generate the circle.
11
11
  * @return {Node<float>} The circle shape.
12
12
  */
13
- export const shapeCircle = Fn( ( [ coord = uv() ], { renderer, material } ) => {
13
+ export const shapeCircle = /*@__PURE__*/ Fn( ( [ coord = uv() ], { renderer, material } ) => {
14
14
 
15
15
  const len2 = lengthSq( coord.mul( 2 ).sub( 1 ) );
16
16
 
@@ -8,7 +8,7 @@ import FlipNode from '../utils/FlipNode.js';
8
8
  import ConstNode from '../core/ConstNode.js';
9
9
  import MemberNode from '../utils/MemberNode.js';
10
10
  import StackTrace from '../core/StackTrace.js';
11
- import { getValueFromType, getValueType } from '../core/NodeUtils.js';
11
+ import { getValueFromType, getValueType, isArrayAsParameter } from '../core/NodeUtils.js';
12
12
  import { warn, error } from '../../utils.js';
13
13
 
14
14
  let currentStack = null;
@@ -703,12 +703,6 @@ class ShaderCallNodeInternal extends Node {
703
703
 
704
704
  }
705
705
 
706
- function isArrayAsParameter( params ) {
707
-
708
- return params[ 0 ] && ( params[ 0 ].isNode || Object.getPrototypeOf( params[ 0 ] ) !== Object.prototype );
709
-
710
- }
711
-
712
706
  function getLayoutParameters( params ) {
713
707
 
714
708
  let output;
@@ -1269,27 +1263,3 @@ export const split = ( node, channels ) => new SplitNode( nodeObject( node ), ch
1269
1263
 
1270
1264
  addMethodChaining( 'element', element );
1271
1265
  addMethodChaining( 'convert', convert );
1272
-
1273
- // deprecated
1274
-
1275
- /**
1276
- * @tsl
1277
- * @function
1278
- * @deprecated since r176. Use {@link Stack} instead.
1279
- *
1280
- * @param {Node} node - The node to add.
1281
- * @returns {Function}
1282
- */
1283
- export const append = ( node ) => { // @deprecated, r176
1284
-
1285
- warn( 'TSL: append() has been renamed to Stack().', new StackTrace() );
1286
- return Stack( node );
1287
-
1288
- };
1289
-
1290
- addMethodChaining( 'append', ( node ) => { // @deprecated, r176
1291
-
1292
- warn( 'TSL: .append() has been renamed to .toStack().', new StackTrace() );
1293
- return Stack( node );
1294
-
1295
- } );
@@ -39,6 +39,10 @@ class EventNode extends Node {
39
39
 
40
40
  this.updateType = NodeUpdateType.FRAME;
41
41
 
42
+ } else if ( eventType === EventNode.AFTER_OBJECT ) {
43
+
44
+ this.updateAfterType = NodeUpdateType.OBJECT;
45
+
42
46
  } else if ( eventType === EventNode.BEFORE_OBJECT ) {
43
47
 
44
48
  this.updateBeforeType = NodeUpdateType.OBJECT;
@@ -55,6 +59,36 @@ class EventNode extends Node {
55
59
 
56
60
  }
57
61
 
62
+ setup( builder ) {
63
+
64
+ const { eventType, callback } = this;
65
+
66
+ if ( eventType === EventNode.BEFORE_RENDER_PIPELINE ) {
67
+
68
+ const callbacks = builder.context.onBeforePipelineCallbacks;
69
+
70
+ if ( callbacks ) {
71
+
72
+ callbacks.push( callback );
73
+
74
+ }
75
+
76
+ } else if ( eventType === EventNode.AFTER_RENDER_PIPELINE ) {
77
+
78
+ const callbacks = builder.context.onAfterPipelineCallbacks;
79
+
80
+ if ( callbacks ) {
81
+
82
+ callbacks.push( callback );
83
+
84
+ }
85
+
86
+ }
87
+
88
+ return super.setup( builder );
89
+
90
+ }
91
+
58
92
  update( frame ) {
59
93
 
60
94
  this.callback( frame );
@@ -67,14 +101,23 @@ class EventNode extends Node {
67
101
 
68
102
  }
69
103
 
104
+ updateAfter( frame ) {
105
+
106
+ this.callback( frame );
107
+
108
+ }
109
+
70
110
  }
71
111
 
72
112
  EventNode.OBJECT = 'object';
73
113
  EventNode.MATERIAL = 'material';
74
114
  EventNode.FRAME = 'frame';
115
+ EventNode.AFTER_OBJECT = 'afterObject';
75
116
  EventNode.BEFORE_OBJECT = 'beforeObject';
76
117
  EventNode.BEFORE_MATERIAL = 'beforeMaterial';
77
118
  EventNode.BEFORE_FRAME = 'beforeFrame';
119
+ EventNode.BEFORE_RENDER_PIPELINE = 'beforeRenderPipeline';
120
+ EventNode.AFTER_RENDER_PIPELINE = 'afterRenderPipeline';
78
121
 
79
122
  export default EventNode;
80
123
 
@@ -117,6 +160,16 @@ export const OnMaterialUpdate = ( callback ) => createEvent( EventNode.MATERIAL,
117
160
  */
118
161
  export const OnFrameUpdate = ( callback ) => createEvent( EventNode.FRAME, callback );
119
162
 
163
+ /**
164
+ * Creates an event that triggers a function every time an object (Mesh|Sprite) has been rendered.
165
+ *
166
+ * The event will be bound to the declared TSL function `Fn()`; it must be declared within a `Fn()` or the JS function call must be inherited from one.
167
+ *
168
+ * @param {Function} callback - The callback function.
169
+ * @returns {EventNode}
170
+ */
171
+ export const OnAfterObjectUpdate = ( callback ) => createEvent( EventNode.AFTER_OBJECT, callback );
172
+
120
173
  /**
121
174
  * Creates an event that triggers a function before an object (Mesh|Sprite) is updated.
122
175
  *
@@ -146,3 +199,25 @@ export const OnBeforeMaterialUpdate = ( callback ) => createEvent( EventNode.BEF
146
199
  * @returns {EventNode}
147
200
  */
148
201
  export const OnBeforeFrameUpdate = ( callback ) => createEvent( EventNode.BEFORE_FRAME, callback );
202
+
203
+ /**
204
+ * Creates an event that triggers a function before the render pipeline is rendered.
205
+ *
206
+ * The node must be part of a node chain that is used as the output of a `RenderPipeline`,
207
+ * otherwise the event is ignored.
208
+ *
209
+ * @param {Function} callback - The callback function.
210
+ * @returns {EventNode}
211
+ */
212
+ export const OnBeforeRenderPipeline = ( callback ) => createEvent( EventNode.BEFORE_RENDER_PIPELINE, callback );
213
+
214
+ /**
215
+ * Creates an event that triggers a function after the render pipeline is rendered.
216
+ *
217
+ * The node must be part of a node chain that is used as the output of a `RenderPipeline`,
218
+ * otherwise the event is ignored.
219
+ *
220
+ * @param {Function} callback - The callback function.
221
+ * @returns {EventNode}
222
+ */
223
+ export const OnAfterRenderPipeline = ( callback ) => createEvent( EventNode.AFTER_RENDER_PIPELINE, callback );
@@ -1,6 +1,6 @@
1
1
  import Node from '../core/Node.js';
2
2
  import { expression } from '../code/ExpressionNode.js';
3
- import { nodeArray, Fn } from '../tsl/TSLBase.js';
3
+ import { nodeArray, Fn, bool } from '../tsl/TSLBase.js';
4
4
  import { error } from '../../utils.js';
5
5
 
6
6
  /**
@@ -36,7 +36,7 @@ import { error } from '../../utils.js';
36
36
  *
37
37
  * } );
38
38
  * ```
39
- * The module also provides `Break()` and `Continue()` TSL expression for loop control.
39
+ * The module also provides `Break()` and `Continue()` TSL expressions for loop control.
40
40
  * @augments Node
41
41
  */
42
42
  class LoopNode extends Node {
@@ -50,7 +50,7 @@ class LoopNode extends Node {
50
50
  /**
51
51
  * Constructs a new loop node.
52
52
  *
53
- * @param {Array<any>} params - Depending on the loop type, array holds different parameterization values for the loop.
53
+ * @param {Array<LoopNode~Params|loopBodyCallback>} params - Any number of loop parameters followed by the loop body.
54
54
  */
55
55
  constructor( params = [] ) {
56
56
 
@@ -88,10 +88,11 @@ class LoopNode extends Node {
88
88
  //
89
89
 
90
90
  const inputs = {};
91
+ const params = this._getInternalParams();
91
92
 
92
- for ( let i = 0, l = this.params.length - 1; i < l; i ++ ) {
93
+ for ( let i = 0, l = params.length - 1; i < l; i ++ ) {
93
94
 
94
- const param = this.params[ i ];
95
+ const param = params[ i ];
95
96
 
96
97
  const name = ( param.isNode !== true && param.name ) || this.getVarName( i );
97
98
  const type = ( param.isNode !== true && param.type ) || 'int';
@@ -102,16 +103,16 @@ class LoopNode extends Node {
102
103
 
103
104
  const stack = builder.addStack();
104
105
 
105
- const fnCall = this.params[ this.params.length - 1 ]( inputs );
106
+ const fnCall = params[ params.length - 1 ]( inputs );
106
107
 
107
108
  properties.returnsNode = fnCall.context( { nodeLoop: fnCall } );
108
109
  properties.stackNode = stack;
109
110
 
110
- const baseParam = this.params[ 0 ];
111
+ const baseParam = params[ 0 ];
111
112
 
112
113
  if ( baseParam.isNode !== true && typeof baseParam.update === 'function' ) {
113
114
 
114
- const fnUpdateCall = Fn( this.params[ 0 ].update )( inputs );
115
+ const fnUpdateCall = Fn( baseParam.update )( inputs );
115
116
 
116
117
  properties.updateNode = fnUpdateCall.context( { nodeLoop: fnUpdateCall } );
117
118
 
@@ -123,6 +124,20 @@ class LoopNode extends Node {
123
124
 
124
125
  }
125
126
 
127
+ _getInternalParams() {
128
+
129
+ const params = this.params;
130
+
131
+ if ( typeof params[ 0 ] === 'function' ) {
132
+
133
+ return [ bool( true ), params[ 0 ] ];
134
+
135
+ }
136
+
137
+ return params;
138
+
139
+ }
140
+
126
141
  setup( builder ) {
127
142
 
128
143
  // setup properties
@@ -142,7 +157,7 @@ class LoopNode extends Node {
142
157
 
143
158
  const properties = this.getProperties( builder );
144
159
 
145
- const params = this.params;
160
+ const params = this._getInternalParams();
146
161
  const stackNode = properties.stackNode;
147
162
 
148
163
  for ( let i = 0, l = params.length - 1; i < l; i ++ ) {
@@ -306,7 +321,7 @@ class LoopNode extends Node {
306
321
 
307
322
  builder.removeFlowTab().addFlowCode( '\n' + builder.tab + stackSnippet );
308
323
 
309
- for ( let i = 0, l = this.params.length - 1; i < l; i ++ ) {
324
+ for ( let i = 0, l = params.length - 1; i < l; i ++ ) {
310
325
 
311
326
  builder.addFlowCode( ( i === 0 ? '' : builder.tab ) + '}\n\n' ).removeFlowTab();
312
327
 
@@ -325,13 +340,13 @@ export default LoopNode;
325
340
  *
326
341
  * @tsl
327
342
  * @function
328
- * @param {...any} params - A list of parameters.
343
+ * @param {...(LoopNode~Params|loopBodyCallback)} params - Any number of loop parameters followed by the loop body.
329
344
  * @returns {LoopNode}
330
345
  */
331
346
  export const Loop = ( ...params ) => new LoopNode( nodeArray( params, 'int' ) ).toStack();
332
347
 
333
348
  /**
334
- * TSL function for creating a `Continue()` expression.
349
+ * TSL function for inserting a `continue` expression into the shader.
335
350
  *
336
351
  * @tsl
337
352
  * @function
@@ -340,10 +355,36 @@ export const Loop = ( ...params ) => new LoopNode( nodeArray( params, 'int' ) ).
340
355
  export const Continue = () => expression( 'continue' ).toStack();
341
356
 
342
357
  /**
343
- * TSL function for creating a `Break()` expression.
358
+ * TSL function for inserting a `break` expression into the shader.
344
359
  *
345
360
  * @tsl
346
361
  * @function
347
362
  * @returns {ExpressionNode}
348
363
  */
349
364
  export const Break = () => expression( 'break' ).toStack();
365
+
366
+ /**
367
+ * The parameters of a loop. A number or int/uint node defines the loop's end value,
368
+ * a bool node defines a `while` loop and an object allows a more detailed configuration.
369
+ *
370
+ * @typedef {number|Node<int>|Node<uint>|Node<bool>|LoopNode~ObjectParams} LoopNode~Params
371
+ */
372
+
373
+ /**
374
+ * A detailed loop configuration.
375
+ *
376
+ * @typedef {Object} LoopNode~ObjectParams
377
+ * @property {number|Node<int>|Node<uint>} [start=0] - The initial value of the loop variable.
378
+ * @property {number|Node<int>|Node<uint>} [end] - The value the loop variable is compared against. If omitted, the loop counts down from `start - 1` to `0`.
379
+ * @property {string} [name] - The name of the loop variable. Defaults to `i`, `j`, `k` and so on.
380
+ * @property {string} [type='int'] - The data type of the loop variable.
381
+ * @property {('<'|'<='|'>'|'>=')} [condition] - The comparison operator. The loop runs as long as the comparison is true. Inferred from `start` and `end` if not set.
382
+ * @property {string|number|Function|Node} [update] - Defines how the loop variable is updated after each iteration. Inferred from `condition` and `type` if not set.
383
+ */
384
+
385
+ /**
386
+ * The loop body.
387
+ *
388
+ * @callback loopBodyCallback
389
+ * @param {Object<string, Node>} inputs - The loop variables of the current `Loop()` call, keyed by their name.
390
+ */
@@ -54,6 +54,27 @@ export const getScreenPosition = /*@__PURE__*/ Fn( ( [ viewPosition, projectionM
54
54
 
55
55
  } );
56
56
 
57
+ /**
58
+ * Converts a clip-space position into a screen position expressed as uv coordinates.
59
+ *
60
+ * @tsl
61
+ * @function
62
+ * @param {Node<vec4>} clipPosition - The position in clip space.
63
+ * @return {Node<vec2>} The screen position expressed as uv coordinates.
64
+ */
65
+ export const getScreenPositionFromClip = /*@__PURE__*/ Fn( ( [ clipPosition ] ) => {
66
+
67
+ const screen = clipPosition.xy.div( clipPosition.w ).mul( 0.5 ).add( 0.5 ).toVar();
68
+ return vec2( screen.x, screen.y.oneMinus() );
69
+
70
+ } ).setLayout( {
71
+ name: 'getScreenPositionFromClip',
72
+ type: 'vec2',
73
+ inputs: [
74
+ { name: 'clipPosition', type: 'vec4' }
75
+ ]
76
+ } );
77
+
57
78
  /**
58
79
  * Computes a normal vector based on depth data. Can be used as a fallback when no normal render
59
80
  * target is available or if flat surface normals are required.
@@ -110,7 +131,7 @@ export const getNormalFromDepth = /*@__PURE__*/ Fn( ( [ uv, depthTexture, projec
110
131
  * @param {Node<vec2>} position - The input position, usually screen coordinates.
111
132
  * @return {Node<float>} The noise value.
112
133
  */
113
- export const interleavedGradientNoise = Fn( ( [ position ] ) => {
134
+ export const interleavedGradientNoise = /*@__PURE__*/ Fn( ( [ position ] ) => {
114
135
 
115
136
  return fract( float( 52.9829189 ).mul( fract( dot( position, vec2( 0.06711056, 0.00583715 ) ) ) ) );
116
137
 
@@ -136,7 +157,7 @@ export const interleavedGradientNoise = Fn( ( [ position ] ) => {
136
157
  * @param {Node<float>} phi - Rotation angle in radians (typically from IGN * 2π).
137
158
  * @return {Node<vec2>} A 2D point on the unit disk.
138
159
  */
139
- export const vogelDiskSample = Fn( ( [ sampleIndex, samplesCount, phi ] ) => {
160
+ export const vogelDiskSample = /*@__PURE__*/ Fn( ( [ sampleIndex, samplesCount, phi ] ) => {
140
161
 
141
162
  const goldenAngle = float( 2.399963229728653 ); // 2π * (2 - φ) where φ is golden ratio
142
163
  const r = sqrt( float( sampleIndex ).add( 0.5 ).div( float( samplesCount ) ) );