super-three 0.179.0 → 0.184.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 (696) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +3 -4
  3. package/build/three.cjs +14522 -12207
  4. package/build/three.core.js +12005 -10954
  5. package/build/three.core.min.js +2 -2
  6. package/build/three.module.js +2270 -1005
  7. package/build/three.module.min.js +2 -2
  8. package/build/three.tsl.js +63 -18
  9. package/build/three.tsl.min.js +2 -2
  10. package/build/three.webgpu.js +16573 -7890
  11. package/build/three.webgpu.min.js +2 -2
  12. package/build/three.webgpu.nodes.js +16533 -7888
  13. package/build/three.webgpu.nodes.min.js +2 -2
  14. package/examples/fonts/MPLUSRounded1c/MPLUSRounded1c-Regular.typeface.json.zip +0 -0
  15. package/examples/fonts/MPLUSRounded1c/OFL.txt +91 -0
  16. package/examples/jsm/Addons.js +12 -4
  17. package/examples/jsm/animation/CCDIKSolver.js +8 -4
  18. package/examples/jsm/controls/ArcballControls.js +15 -12
  19. package/examples/jsm/controls/DragControls.js +9 -59
  20. package/examples/jsm/controls/FirstPersonControls.js +61 -57
  21. package/examples/jsm/controls/FlyControls.js +5 -1
  22. package/examples/jsm/controls/MapControls.js +55 -1
  23. package/examples/jsm/controls/OrbitControls.js +113 -10
  24. package/examples/jsm/controls/PointerLockControls.js +2 -10
  25. package/examples/jsm/controls/TrackballControls.js +9 -9
  26. package/examples/jsm/controls/TransformControls.js +35 -3
  27. package/examples/jsm/csm/CSM.js +2 -1
  28. package/examples/jsm/csm/CSMShadowNode.js +6 -2
  29. package/examples/jsm/effects/AnaglyphEffect.js +102 -7
  30. package/examples/jsm/effects/AsciiEffect.js +8 -8
  31. package/examples/jsm/environments/ColorEnvironment.js +59 -0
  32. package/examples/jsm/environments/RoomEnvironment.js +3 -0
  33. package/examples/jsm/exporters/DRACOExporter.js +2 -2
  34. package/examples/jsm/exporters/EXRExporter.js +2 -2
  35. package/examples/jsm/exporters/GLTFExporter.js +185 -34
  36. package/examples/jsm/exporters/KTX2Exporter.js +4 -2
  37. package/examples/jsm/exporters/PLYExporter.js +1 -1
  38. package/examples/jsm/exporters/USDZExporter.js +31 -5
  39. package/examples/jsm/geometries/DecalGeometry.js +3 -3
  40. package/examples/jsm/geometries/ParametricGeometry.js +1 -1
  41. package/examples/jsm/geometries/TeapotGeometry.js +2 -2
  42. package/examples/jsm/geometries/TextGeometry.js +21 -2
  43. package/examples/jsm/gpgpu/BitonicSort.js +715 -0
  44. package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
  45. package/examples/jsm/helpers/LightProbeGridHelper.js +221 -0
  46. package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -1
  47. package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
  48. package/examples/jsm/helpers/ViewHelper.js +110 -13
  49. package/examples/jsm/inspector/Extension.js +13 -0
  50. package/examples/jsm/inspector/Inspector.js +542 -0
  51. package/examples/jsm/inspector/RendererInspector.js +425 -0
  52. package/examples/jsm/inspector/extensions/extensions.json +6 -0
  53. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +916 -0
  54. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +281 -0
  55. package/examples/jsm/inspector/tabs/Console.js +238 -0
  56. package/examples/jsm/inspector/tabs/Memory.js +128 -0
  57. package/examples/jsm/inspector/tabs/Parameters.js +380 -0
  58. package/examples/jsm/inspector/tabs/Performance.js +268 -0
  59. package/examples/jsm/inspector/tabs/Settings.js +264 -0
  60. package/examples/jsm/inspector/tabs/Timeline.js +1611 -0
  61. package/examples/jsm/inspector/tabs/Viewer.js +268 -0
  62. package/examples/jsm/inspector/ui/Graph.js +95 -0
  63. package/examples/jsm/inspector/ui/Item.js +170 -0
  64. package/examples/jsm/inspector/ui/List.js +75 -0
  65. package/examples/jsm/inspector/ui/Profiler.js +2072 -0
  66. package/examples/jsm/inspector/ui/Style.js +1667 -0
  67. package/examples/jsm/inspector/ui/Tab.js +265 -0
  68. package/examples/jsm/inspector/ui/Values.js +476 -0
  69. package/examples/jsm/inspector/ui/utils.js +69 -0
  70. package/examples/jsm/interaction/InteractionManager.js +226 -0
  71. package/examples/jsm/interactive/HTMLMesh.js +6 -10
  72. package/examples/jsm/interactive/InteractiveGroup.js +1 -1
  73. package/examples/jsm/interactive/SelectionBox.js +30 -0
  74. package/examples/jsm/libs/ktx-parse.module.js +1 -1
  75. package/examples/jsm/libs/meshopt_decoder.module.js +9 -8
  76. package/examples/jsm/lighting/DynamicLighting.js +82 -0
  77. package/examples/jsm/lighting/LightProbeGrid.js +651 -0
  78. package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -1
  79. package/examples/jsm/lines/Line2.js +3 -3
  80. package/examples/jsm/lines/LineGeometry.js +1 -1
  81. package/examples/jsm/lines/LineMaterial.js +7 -1
  82. package/examples/jsm/lines/LineSegments2.js +2 -2
  83. package/examples/jsm/lines/Wireframe.js +2 -2
  84. package/examples/jsm/lines/WireframeGeometry2.js +1 -1
  85. package/examples/jsm/lines/webgpu/LineSegments2.js +1 -1
  86. package/examples/jsm/lines/webgpu/Wireframe.js +1 -1
  87. package/examples/jsm/loaders/3DMLoader.js +5 -4
  88. package/examples/jsm/loaders/3MFLoader.js +3 -3
  89. package/examples/jsm/loaders/AMFLoader.js +2 -2
  90. package/examples/jsm/loaders/ColladaLoader.js +27 -4029
  91. package/examples/jsm/loaders/DDSLoader.js +1 -1
  92. package/examples/jsm/loaders/DRACOLoader.js +73 -22
  93. package/examples/jsm/loaders/EXRLoader.js +692 -53
  94. package/examples/jsm/loaders/FBXLoader.js +237 -39
  95. package/examples/jsm/loaders/FontLoader.js +23 -5
  96. package/examples/jsm/loaders/GCodeLoader.js +34 -8
  97. package/examples/jsm/loaders/GLTFLoader.js +159 -185
  98. package/examples/jsm/loaders/HDRCubeTextureLoader.js +5 -5
  99. package/examples/jsm/loaders/HDRLoader.js +485 -0
  100. package/examples/jsm/loaders/KMZLoader.js +5 -5
  101. package/examples/jsm/loaders/KTX2Loader.js +162 -53
  102. package/examples/jsm/loaders/KTXLoader.js +2 -2
  103. package/examples/jsm/loaders/LDrawLoader.js +41 -50
  104. package/examples/jsm/loaders/LUT3dlLoader.js +2 -2
  105. package/examples/jsm/loaders/LUTCubeLoader.js +1 -1
  106. package/examples/jsm/loaders/LWOLoader.js +9 -41
  107. package/examples/jsm/loaders/MaterialXLoader.js +22 -5
  108. package/examples/jsm/loaders/NRRDLoader.js +2 -2
  109. package/examples/jsm/loaders/OBJLoader.js +1 -1
  110. package/examples/jsm/loaders/PCDLoader.js +4 -2
  111. package/examples/jsm/loaders/PDBLoader.js +1 -1
  112. package/examples/jsm/loaders/RGBELoader.js +7 -473
  113. package/examples/jsm/loaders/SVGLoader.js +4 -4
  114. package/examples/jsm/loaders/TDSLoader.js +0 -2
  115. package/examples/jsm/loaders/TGALoader.js +0 -2
  116. package/examples/jsm/loaders/TTFLoader.js +4 -4
  117. package/examples/jsm/loaders/USDLoader.js +100 -40
  118. package/examples/jsm/loaders/UltraHDRLoader.js +287 -162
  119. package/examples/jsm/loaders/VOXLoader.js +660 -117
  120. package/examples/jsm/loaders/VRMLLoader.js +79 -2
  121. package/examples/jsm/loaders/VTKLoader.js +42 -25
  122. package/examples/jsm/loaders/collada/ColladaComposer.js +3044 -0
  123. package/examples/jsm/loaders/collada/ColladaParser.js +1977 -0
  124. package/examples/jsm/loaders/lwo/IFFParser.js +1 -1
  125. package/examples/jsm/loaders/usd/USDAParser.js +450 -363
  126. package/examples/jsm/loaders/usd/USDCParser.js +1867 -6
  127. package/examples/jsm/loaders/usd/USDComposer.js +4594 -0
  128. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
  129. package/examples/jsm/materials/WoodNodeMaterial.js +533 -0
  130. package/examples/jsm/math/ColorSpaces.js +19 -1
  131. package/examples/jsm/math/ConvexHull.js +3 -3
  132. package/examples/jsm/math/ImprovedNoise.js +1 -1
  133. package/examples/jsm/math/Lut.js +2 -2
  134. package/examples/jsm/math/Octree.js +131 -1
  135. package/examples/jsm/math/SimplexNoise.js +1 -1
  136. package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
  137. package/examples/jsm/misc/MD2CharacterComplex.js +1 -1
  138. package/examples/jsm/misc/ProgressiveLightMap.js +9 -3
  139. package/examples/jsm/misc/ProgressiveLightMapGPU.js +7 -1
  140. package/examples/jsm/misc/RollerCoaster.js +42 -4
  141. package/examples/jsm/misc/TubePainter.js +383 -40
  142. package/examples/jsm/misc/Volume.js +1 -2
  143. package/examples/jsm/misc/VolumeSlice.js +0 -1
  144. package/examples/jsm/modifiers/SimplifyModifier.js +1 -1
  145. package/examples/jsm/modifiers/TessellateModifier.js +1 -1
  146. package/examples/jsm/objects/LensflareMesh.js +1 -1
  147. package/examples/jsm/objects/Reflector.js +73 -25
  148. package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
  149. package/examples/jsm/objects/Sky.js +91 -7
  150. package/examples/jsm/objects/SkyMesh.js +151 -17
  151. package/examples/jsm/objects/Water.js +7 -6
  152. package/examples/jsm/objects/Water2.js +5 -3
  153. package/examples/jsm/objects/WaterMesh.js +11 -13
  154. package/examples/jsm/physics/AmmoPhysics.js +12 -7
  155. package/examples/jsm/physics/JoltPhysics.js +10 -6
  156. package/examples/jsm/physics/RapierPhysics.js +9 -5
  157. package/examples/jsm/postprocessing/EffectComposer.js +7 -5
  158. package/examples/jsm/postprocessing/GlitchPass.js +2 -2
  159. package/examples/jsm/postprocessing/OutlinePass.js +1 -1
  160. package/examples/jsm/postprocessing/OutputPass.js +9 -0
  161. package/examples/jsm/postprocessing/RenderPass.js +10 -0
  162. package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
  163. package/examples/jsm/postprocessing/SSRPass.js +37 -8
  164. package/examples/jsm/postprocessing/UnrealBloomPass.js +56 -24
  165. package/examples/jsm/renderers/CSS2DRenderer.js +16 -5
  166. package/examples/jsm/renderers/CSS3DRenderer.js +8 -7
  167. package/examples/jsm/renderers/Projector.js +246 -28
  168. package/examples/jsm/renderers/SVGRenderer.js +175 -61
  169. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +1 -1
  170. package/examples/jsm/shaders/AfterimageShader.js +1 -1
  171. package/examples/jsm/shaders/BleachBypassShader.js +1 -1
  172. package/examples/jsm/shaders/BokehShader.js +1 -1
  173. package/examples/jsm/shaders/BokehShader2.js +1 -1
  174. package/examples/jsm/shaders/DotScreenShader.js +1 -1
  175. package/examples/jsm/shaders/FocusShader.js +1 -1
  176. package/examples/jsm/shaders/GTAOShader.js +21 -8
  177. package/examples/jsm/shaders/HalftoneShader.js +12 -1
  178. package/examples/jsm/shaders/KaleidoShader.js +1 -1
  179. package/examples/jsm/shaders/PoissonDenoiseShader.js +8 -4
  180. package/examples/jsm/shaders/SAOShader.js +17 -4
  181. package/examples/jsm/shaders/SSAOShader.js +11 -1
  182. package/examples/jsm/shaders/SSRShader.js +7 -6
  183. package/examples/jsm/shaders/SepiaShader.js +1 -1
  184. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +1 -1
  185. package/examples/jsm/shaders/TriangleBlurShader.js +1 -1
  186. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +3 -5
  187. package/examples/jsm/shaders/VignetteShader.js +1 -1
  188. package/examples/jsm/transpiler/AST.js +44 -0
  189. package/examples/jsm/transpiler/GLSLDecoder.js +85 -25
  190. package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
  191. package/examples/jsm/transpiler/TSLEncoder.js +52 -10
  192. package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
  193. package/examples/jsm/transpiler/WGSLEncoder.js +51 -0
  194. package/examples/jsm/tsl/WebGLNodesHandler.js +605 -0
  195. package/examples/jsm/tsl/display/AfterImageNode.js +36 -24
  196. package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
  197. package/examples/jsm/tsl/display/AnamorphicNode.js +40 -5
  198. package/examples/jsm/tsl/display/BilateralBlurNode.js +374 -0
  199. package/examples/jsm/tsl/display/BloomNode.js +23 -9
  200. package/examples/jsm/tsl/display/CRT.js +150 -0
  201. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +5 -37
  202. package/examples/jsm/tsl/display/DenoiseNode.js +3 -1
  203. package/examples/jsm/tsl/display/DepthOfFieldNode.js +446 -90
  204. package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
  205. package/examples/jsm/tsl/display/FSR1Node.js +477 -0
  206. package/examples/jsm/tsl/display/FXAANode.js +2 -2
  207. package/examples/jsm/tsl/display/GTAONode.js +59 -9
  208. package/examples/jsm/tsl/display/GaussianBlurNode.js +68 -35
  209. package/examples/jsm/tsl/display/GodraysNode.js +615 -0
  210. package/examples/jsm/tsl/display/LensflareNode.js +1 -1
  211. package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
  212. package/examples/jsm/tsl/display/OutlineNode.js +81 -20
  213. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
  214. package/examples/jsm/tsl/display/PixelationPassNode.js +7 -6
  215. package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
  216. package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
  217. package/examples/jsm/tsl/display/SMAANode.js +2 -2
  218. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
  219. package/examples/jsm/tsl/display/SSGINode.js +638 -0
  220. package/examples/jsm/tsl/display/SSRNode.js +186 -69
  221. package/examples/jsm/tsl/display/SSSNode.js +490 -0
  222. package/examples/jsm/tsl/display/Shape.js +29 -0
  223. package/examples/jsm/tsl/display/SharpenNode.js +283 -0
  224. package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
  225. package/examples/jsm/tsl/display/StereoCompositePassNode.js +8 -1
  226. package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
  227. package/examples/jsm/tsl/display/TAAUNode.js +835 -0
  228. package/examples/jsm/tsl/display/TRAANode.js +381 -75
  229. package/examples/jsm/tsl/display/TransitionNode.js +1 -1
  230. package/examples/jsm/tsl/display/boxBlur.js +65 -0
  231. package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
  232. package/examples/jsm/tsl/display/hashBlur.js +16 -18
  233. package/examples/jsm/tsl/display/radialBlur.js +68 -0
  234. package/examples/jsm/tsl/lighting/DynamicLightsNode.js +300 -0
  235. package/examples/jsm/tsl/lighting/TiledLightsNode.js +21 -1
  236. package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +61 -0
  237. package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +111 -0
  238. package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +99 -0
  239. package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +134 -0
  240. package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +161 -0
  241. package/examples/jsm/tsl/math/Bayer.js +53 -3
  242. package/examples/jsm/utils/BufferGeometryUtils.js +3 -4
  243. package/examples/jsm/utils/ColorUtils.js +76 -0
  244. package/examples/jsm/utils/LDrawUtils.js +1 -1
  245. package/examples/jsm/utils/ShadowMapViewer.js +24 -10
  246. package/examples/jsm/utils/ShadowMapViewerGPU.js +13 -6
  247. package/examples/jsm/utils/SkeletonUtils.js +14 -8
  248. package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
  249. package/examples/jsm/webxr/OculusHandModel.js +1 -1
  250. package/examples/jsm/webxr/XRControllerModelFactory.js +1 -1
  251. package/examples/jsm/webxr/XRHandMeshModel.js +36 -10
  252. package/examples/jsm/webxr/XRHandModelFactory.js +4 -7
  253. package/package.json +27 -38
  254. package/src/Three.Core.js +7 -3
  255. package/src/Three.TSL.js +61 -16
  256. package/src/Three.WebGPU.Nodes.js +7 -0
  257. package/src/Three.WebGPU.js +11 -0
  258. package/src/Three.js +1 -0
  259. package/src/animation/AnimationAction.js +12 -2
  260. package/src/animation/AnimationClip.js +21 -5
  261. package/src/animation/AnimationMixer.js +9 -3
  262. package/src/animation/AnimationObjectGroup.js +2 -1
  263. package/src/animation/AnimationUtils.js +1 -12
  264. package/src/animation/KeyframeTrack.js +54 -14
  265. package/src/animation/PropertyBinding.js +12 -11
  266. package/src/animation/PropertyMixer.js +4 -4
  267. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  268. package/src/animation/tracks/ColorKeyframeTrack.js +1 -1
  269. package/src/animation/tracks/NumberKeyframeTrack.js +1 -1
  270. package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -1
  271. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  272. package/src/animation/tracks/VectorKeyframeTrack.js +1 -1
  273. package/src/audio/Audio.js +11 -10
  274. package/src/audio/AudioContext.js +2 -2
  275. package/src/audio/AudioListener.js +5 -3
  276. package/src/audio/PositionalAudio.js +1 -1
  277. package/src/cameras/Camera.js +32 -2
  278. package/src/cameras/CubeCamera.js +20 -0
  279. package/src/cameras/OrthographicCamera.js +1 -1
  280. package/src/cameras/PerspectiveCamera.js +1 -1
  281. package/src/cameras/StereoCamera.js +2 -2
  282. package/src/constants.js +100 -7
  283. package/src/core/BufferAttribute.js +13 -1
  284. package/src/core/BufferGeometry.js +24 -12
  285. package/src/core/Clock.js +7 -0
  286. package/src/core/EventDispatcher.js +1 -1
  287. package/src/core/InterleavedBuffer.js +1 -1
  288. package/src/core/InterleavedBufferAttribute.js +3 -2
  289. package/src/core/Object3D.js +55 -6
  290. package/src/core/Raycaster.js +4 -3
  291. package/src/core/RenderTarget.js +14 -5
  292. package/src/extras/Controls.js +5 -4
  293. package/src/extras/DataUtils.js +2 -1
  294. package/src/extras/Earcut.js +6 -0
  295. package/src/extras/ImageUtils.js +2 -2
  296. package/src/extras/PMREMGenerator.js +259 -57
  297. package/src/extras/TextureUtils.js +6 -1
  298. package/src/extras/core/Curve.js +2 -1
  299. package/src/extras/core/Interpolations.js +7 -1
  300. package/src/extras/core/ShapePath.js +4 -4
  301. package/src/extras/curves/CatmullRomCurve3.js +3 -2
  302. package/src/extras/lib/earcut.js +8 -8
  303. package/src/geometries/BoxGeometry.js +1 -0
  304. package/src/geometries/CapsuleGeometry.js +1 -0
  305. package/src/geometries/CircleGeometry.js +1 -0
  306. package/src/geometries/ConeGeometry.js +1 -0
  307. package/src/geometries/CylinderGeometry.js +1 -0
  308. package/src/geometries/DodecahedronGeometry.js +1 -0
  309. package/src/geometries/ExtrudeGeometry.js +10 -8
  310. package/src/geometries/IcosahedronGeometry.js +1 -0
  311. package/src/geometries/LatheGeometry.js +1 -0
  312. package/src/geometries/OctahedronGeometry.js +1 -0
  313. package/src/geometries/PlaneGeometry.js +1 -0
  314. package/src/geometries/PolyhedronGeometry.js +1 -1
  315. package/src/geometries/RingGeometry.js +1 -0
  316. package/src/geometries/ShapeGeometry.js +1 -0
  317. package/src/geometries/SphereGeometry.js +1 -0
  318. package/src/geometries/TetrahedronGeometry.js +1 -0
  319. package/src/geometries/TorusGeometry.js +9 -3
  320. package/src/geometries/TorusKnotGeometry.js +1 -0
  321. package/src/geometries/TubeGeometry.js +1 -0
  322. package/src/helpers/CameraHelper.js +4 -1
  323. package/src/helpers/DirectionalLightHelper.js +4 -1
  324. package/src/helpers/HemisphereLightHelper.js +3 -0
  325. package/src/helpers/PointLightHelper.js +1 -25
  326. package/src/helpers/SpotLightHelper.js +3 -0
  327. package/src/lights/DirectionalLight.js +13 -0
  328. package/src/lights/HemisphereLight.js +10 -0
  329. package/src/lights/Light.js +1 -11
  330. package/src/lights/LightProbe.js +0 -15
  331. package/src/lights/LightShadow.js +15 -6
  332. package/src/lights/PointLight.js +15 -0
  333. package/src/lights/PointLightShadow.js +0 -86
  334. package/src/lights/SpotLight.js +22 -1
  335. package/src/lights/webgpu/IESSpotLight.js +2 -1
  336. package/src/lights/webgpu/ProjectorLight.js +1 -1
  337. package/src/loaders/AnimationLoader.js +2 -1
  338. package/src/loaders/AudioLoader.js +13 -2
  339. package/src/loaders/BufferGeometryLoader.js +2 -2
  340. package/src/loaders/Cache.js +30 -2
  341. package/src/loaders/DataTextureLoader.js +6 -4
  342. package/src/loaders/FileLoader.js +4 -4
  343. package/src/loaders/ImageBitmapLoader.js +17 -13
  344. package/src/loaders/ImageLoader.js +1 -1
  345. package/src/loaders/Loader.js +9 -3
  346. package/src/loaders/LoadingManager.js +25 -3
  347. package/src/loaders/MaterialLoader.js +6 -4
  348. package/src/loaders/ObjectLoader.js +57 -17
  349. package/src/loaders/TextureLoader.js +1 -1
  350. package/src/loaders/nodes/NodeLoader.js +5 -4
  351. package/src/loaders/nodes/NodeObjectLoader.js +18 -0
  352. package/src/materials/Material.js +18 -3
  353. package/src/materials/MeshBasicMaterial.js +1 -0
  354. package/src/materials/MeshDepthMaterial.js +1 -0
  355. package/src/materials/MeshDistanceMaterial.js +1 -1
  356. package/src/materials/MeshLambertMaterial.js +11 -1
  357. package/src/materials/MeshMatcapMaterial.js +22 -0
  358. package/src/materials/MeshNormalMaterial.js +1 -0
  359. package/src/materials/MeshPhongMaterial.js +11 -1
  360. package/src/materials/MeshPhysicalMaterial.js +2 -1
  361. package/src/materials/MeshStandardMaterial.js +8 -7
  362. package/src/materials/MeshToonMaterial.js +2 -1
  363. package/src/materials/PointsMaterial.js +1 -1
  364. package/src/materials/ShaderMaterial.js +22 -3
  365. package/src/materials/nodes/Line2NodeMaterial.js +36 -9
  366. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +5 -2
  367. package/src/materials/nodes/MeshSSSNodeMaterial.js +1 -1
  368. package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -4
  369. package/src/materials/nodes/NodeMaterial.js +95 -35
  370. package/src/materials/nodes/PointsNodeMaterial.js +81 -28
  371. package/src/materials/nodes/SpriteNodeMaterial.js +3 -15
  372. package/src/materials/nodes/manager/NodeMaterialObserver.js +194 -88
  373. package/src/math/Color.js +6 -5
  374. package/src/math/ColorManagement.js +9 -3
  375. package/src/math/Cylindrical.js +1 -1
  376. package/src/math/Euler.js +2 -1
  377. package/src/math/Line3.js +6 -5
  378. package/src/math/MathUtils.js +23 -21
  379. package/src/math/Matrix2.js +14 -10
  380. package/src/math/Matrix3.js +15 -11
  381. package/src/math/Matrix4.js +94 -81
  382. package/src/math/Plane.js +5 -4
  383. package/src/math/Quaternion.js +60 -84
  384. package/src/math/Sphere.js +1 -1
  385. package/src/math/Spherical.js +1 -1
  386. package/src/math/Triangle.js +1 -1
  387. package/src/math/Vector2.js +11 -7
  388. package/src/math/Vector3.js +15 -13
  389. package/src/math/Vector4.js +13 -9
  390. package/src/math/interpolants/BezierInterpolant.js +108 -0
  391. package/src/nodes/Nodes.js +86 -65
  392. package/src/nodes/TSL.js +11 -8
  393. package/src/nodes/accessors/Arrays.js +1 -1
  394. package/src/nodes/accessors/BatchNode.js +10 -10
  395. package/src/nodes/accessors/Bitangent.js +5 -5
  396. package/src/nodes/accessors/BufferAttributeNode.js +107 -15
  397. package/src/nodes/accessors/BufferNode.js +30 -3
  398. package/src/nodes/accessors/Camera.js +260 -13
  399. package/src/nodes/accessors/ClippingNode.js +10 -9
  400. package/src/nodes/accessors/CubeTextureNode.js +32 -6
  401. package/src/nodes/accessors/InstanceNode.js +164 -39
  402. package/src/nodes/accessors/Lights.js +10 -0
  403. package/src/nodes/accessors/MaterialNode.js +9 -1
  404. package/src/nodes/accessors/MaterialProperties.js +2 -5
  405. package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
  406. package/src/nodes/accessors/ModelNode.js +1 -1
  407. package/src/nodes/accessors/Normal.js +16 -15
  408. package/src/nodes/accessors/Object3DNode.js +2 -2
  409. package/src/nodes/accessors/Position.js +51 -3
  410. package/src/nodes/accessors/ReferenceBaseNode.js +7 -7
  411. package/src/nodes/accessors/ReferenceNode.js +11 -10
  412. package/src/nodes/accessors/RendererReferenceNode.js +1 -2
  413. package/src/nodes/accessors/SceneProperties.js +47 -0
  414. package/src/nodes/accessors/SkinningNode.js +27 -26
  415. package/src/nodes/accessors/StorageBufferNode.js +14 -24
  416. package/src/nodes/accessors/StorageTextureNode.js +62 -9
  417. package/src/nodes/accessors/Tangent.js +4 -14
  418. package/src/nodes/accessors/Texture3DNode.js +41 -31
  419. package/src/nodes/accessors/TextureNode.js +193 -63
  420. package/src/nodes/accessors/UniformArrayNode.js +6 -4
  421. package/src/nodes/accessors/UserDataNode.js +1 -2
  422. package/src/nodes/accessors/VertexColorNode.js +1 -2
  423. package/src/nodes/code/FunctionCallNode.js +25 -5
  424. package/src/nodes/code/FunctionNode.js +25 -3
  425. package/src/nodes/core/ArrayNode.js +22 -2
  426. package/src/nodes/core/AssignNode.js +6 -5
  427. package/src/nodes/core/AttributeNode.js +5 -4
  428. package/src/nodes/core/BypassNode.js +1 -1
  429. package/src/nodes/core/ContextNode.js +133 -15
  430. package/src/nodes/core/IndexNode.js +4 -3
  431. package/src/nodes/core/InputNode.js +3 -2
  432. package/src/nodes/core/InspectorNode.js +128 -0
  433. package/src/nodes/core/{CacheNode.js → IsolateNode.js} +41 -8
  434. package/src/nodes/core/MRTNode.js +48 -2
  435. package/src/nodes/core/Node.js +264 -46
  436. package/src/nodes/core/NodeBuilder.js +453 -87
  437. package/src/nodes/core/NodeError.js +28 -0
  438. package/src/nodes/core/NodeFrame.js +31 -23
  439. package/src/nodes/core/NodeFunction.js +2 -1
  440. package/src/nodes/core/NodeParser.js +2 -1
  441. package/src/nodes/core/NodeUniform.js +1 -1
  442. package/src/nodes/core/NodeUtils.js +25 -97
  443. package/src/nodes/core/OutputStructNode.js +12 -10
  444. package/src/nodes/core/ParameterNode.js +34 -3
  445. package/src/nodes/core/PropertyNode.js +26 -3
  446. package/src/nodes/core/StackNode.js +99 -23
  447. package/src/nodes/core/StackTrace.js +139 -0
  448. package/src/nodes/core/StructNode.js +22 -8
  449. package/src/nodes/core/StructTypeNode.js +13 -18
  450. package/src/nodes/core/SubBuildNode.js +4 -4
  451. package/src/nodes/core/UniformGroupNode.js +36 -6
  452. package/src/nodes/core/UniformNode.js +37 -13
  453. package/src/nodes/core/VarNode.js +96 -34
  454. package/src/nodes/core/VaryingNode.js +2 -18
  455. package/src/nodes/display/BlendModes.js +0 -63
  456. package/src/nodes/display/BumpMapNode.js +1 -1
  457. package/src/nodes/display/ColorAdjustment.js +18 -1
  458. package/src/nodes/display/ColorSpaceNode.js +3 -3
  459. package/src/nodes/display/FrontFacingNode.js +4 -8
  460. package/src/nodes/display/NormalMapNode.js +41 -5
  461. package/src/nodes/display/PassNode.js +175 -25
  462. package/src/nodes/display/RenderOutputNode.js +35 -9
  463. package/src/nodes/display/ScreenNode.js +47 -15
  464. package/src/nodes/display/ToneMappingNode.js +32 -5
  465. package/src/nodes/display/ToonOutlinePassNode.js +10 -2
  466. package/src/nodes/display/ViewportDepthNode.js +52 -4
  467. package/src/nodes/display/ViewportDepthTextureNode.js +14 -6
  468. package/src/nodes/display/ViewportSharedTextureNode.js +12 -0
  469. package/src/nodes/display/ViewportTextureNode.js +72 -14
  470. package/src/nodes/fog/Fog.js +18 -34
  471. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +52 -0
  472. package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
  473. package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
  474. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +2 -2
  475. package/src/nodes/functions/BasicLightingModel.js +2 -1
  476. package/src/nodes/functions/PhysicalLightingModel.js +128 -46
  477. package/src/nodes/functions/VolumetricLightingModel.js +5 -5
  478. package/src/nodes/geometry/RangeNode.js +44 -6
  479. package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
  480. package/src/nodes/gpgpu/BarrierNode.js +9 -0
  481. package/src/nodes/gpgpu/ComputeBuiltinNode.js +4 -4
  482. package/src/nodes/gpgpu/ComputeNode.js +76 -38
  483. package/src/nodes/gpgpu/SubgroupFunctionNode.js +455 -0
  484. package/src/nodes/gpgpu/WorkgroupInfoNode.js +5 -4
  485. package/src/nodes/lighting/AnalyticLightNode.js +53 -0
  486. package/src/nodes/lighting/EnvironmentNode.js +34 -9
  487. package/src/nodes/lighting/LightsNode.js +10 -32
  488. package/src/nodes/lighting/PointShadowNode.js +167 -148
  489. package/src/nodes/lighting/ShadowFilterNode.js +55 -65
  490. package/src/nodes/lighting/ShadowNode.js +189 -44
  491. package/src/nodes/math/BitcastNode.js +156 -0
  492. package/src/nodes/math/BitcountNode.js +433 -0
  493. package/src/nodes/math/ConditionalNode.js +25 -8
  494. package/src/nodes/math/MathNode.js +98 -57
  495. package/src/nodes/math/OperatorNode.js +8 -5
  496. package/src/nodes/math/PackFloatNode.js +98 -0
  497. package/src/nodes/math/UnpackFloatNode.js +96 -0
  498. package/src/nodes/pmrem/PMREMNode.js +1 -1
  499. package/src/nodes/pmrem/PMREMUtils.js +111 -2
  500. package/src/nodes/shapes/Shapes.js +1 -1
  501. package/src/nodes/tsl/TSLBase.js +6 -3
  502. package/src/nodes/tsl/TSLCore.js +488 -166
  503. package/src/nodes/utils/ArrayElementNode.js +14 -1
  504. package/src/nodes/utils/ConvertNode.js +1 -1
  505. package/src/nodes/utils/DebugNode.js +14 -13
  506. package/src/nodes/utils/EventNode.js +67 -2
  507. package/src/nodes/utils/FlipNode.js +1 -1
  508. package/src/nodes/utils/FunctionOverloadingNode.js +37 -19
  509. package/src/nodes/utils/JoinNode.js +7 -4
  510. package/src/nodes/utils/LoopNode.js +20 -24
  511. package/src/nodes/utils/MemberNode.js +60 -8
  512. package/src/nodes/utils/Packing.js +13 -1
  513. package/src/nodes/utils/PostProcessingUtils.js +60 -1
  514. package/src/nodes/utils/RTTNode.js +14 -4
  515. package/src/nodes/utils/ReflectorNode.js +61 -11
  516. package/src/nodes/utils/Remap.js +48 -0
  517. package/src/nodes/utils/RotateNode.js +1 -1
  518. package/src/nodes/utils/SampleNode.js +12 -2
  519. package/src/nodes/utils/SetNode.js +1 -1
  520. package/src/nodes/utils/SplitNode.js +12 -1
  521. package/src/nodes/utils/SpriteSheetUV.js +35 -0
  522. package/src/nodes/utils/Timer.js +0 -47
  523. package/src/nodes/utils/UVUtils.js +28 -0
  524. package/src/objects/BatchedMesh.js +46 -18
  525. package/src/objects/InstancedMesh.js +30 -3
  526. package/src/objects/LOD.js +1 -1
  527. package/src/objects/Line.js +3 -2
  528. package/src/objects/LineSegments.js +2 -1
  529. package/src/objects/Mesh.js +1 -1
  530. package/src/objects/Points.js +1 -1
  531. package/src/objects/Skeleton.js +12 -2
  532. package/src/objects/SkinnedMesh.js +29 -10
  533. package/src/objects/Sprite.js +4 -3
  534. package/src/renderers/WebGLRenderer.js +372 -179
  535. package/src/renderers/common/Animation.js +16 -4
  536. package/src/renderers/common/Attributes.js +16 -2
  537. package/src/renderers/common/Backend.js +137 -35
  538. package/src/renderers/common/Background.js +28 -14
  539. package/src/renderers/common/BindGroup.js +1 -16
  540. package/src/renderers/common/Binding.js +11 -0
  541. package/src/renderers/common/Bindings.js +83 -12
  542. package/src/renderers/common/BlendMode.js +143 -0
  543. package/src/renderers/common/Buffer.js +40 -0
  544. package/src/renderers/common/BundleGroup.js +1 -1
  545. package/src/renderers/common/CanvasTarget.js +341 -0
  546. package/src/renderers/common/ChainMap.js +30 -6
  547. package/src/renderers/common/ComputePipeline.js +1 -1
  548. package/src/renderers/common/CubeRenderTarget.js +51 -7
  549. package/src/renderers/common/DataMap.js +1 -1
  550. package/src/renderers/common/Geometries.js +55 -3
  551. package/src/renderers/common/Info.js +337 -6
  552. package/src/renderers/common/InspectorBase.js +151 -0
  553. package/src/renderers/common/Lighting.js +5 -21
  554. package/src/renderers/common/Pipelines.js +41 -8
  555. package/src/renderers/common/PostProcessing.js +9 -226
  556. package/src/renderers/common/QuadMesh.js +7 -1
  557. package/src/renderers/common/ReadbackBuffer.js +78 -0
  558. package/src/renderers/common/RenderBundle.js +3 -1
  559. package/src/renderers/common/RenderBundles.js +7 -3
  560. package/src/renderers/common/RenderContext.js +18 -2
  561. package/src/renderers/common/RenderContexts.js +33 -49
  562. package/src/renderers/common/RenderList.js +7 -3
  563. package/src/renderers/common/RenderLists.js +2 -1
  564. package/src/renderers/common/RenderObject.js +32 -6
  565. package/src/renderers/common/RenderObjectPipeline.js +40 -0
  566. package/src/renderers/common/RenderObjects.js +22 -6
  567. package/src/renderers/common/RenderPipeline.js +232 -17
  568. package/src/renderers/common/Renderer.js +927 -335
  569. package/src/renderers/common/RendererUtils.js +9 -0
  570. package/src/renderers/common/SampledTexture.js +9 -1
  571. package/src/renderers/common/Sampler.js +52 -14
  572. package/src/renderers/common/StorageBuffer.js +13 -1
  573. package/src/renderers/common/StorageTexture.js +9 -1
  574. package/src/renderers/common/Textures.js +208 -47
  575. package/src/renderers/common/TimestampQueryPool.js +70 -6
  576. package/src/renderers/common/Uniform.js +8 -0
  577. package/src/renderers/common/UniformsGroup.js +64 -2
  578. package/src/renderers/common/XRManager.js +79 -51
  579. package/src/renderers/common/extras/PMREMGenerator.js +176 -79
  580. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  581. package/src/renderers/common/nodes/NodeLibrary.js +9 -7
  582. package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +260 -95
  583. package/src/renderers/common/nodes/NodeSampler.js +13 -1
  584. package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
  585. package/src/renderers/common/nodes/NodeUniformBuffer.js +52 -0
  586. package/src/renderers/shaders/DFGLUTData.js +49 -0
  587. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
  588. package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
  589. package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
  590. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
  591. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
  592. package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -12
  593. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +1 -2
  594. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +8 -12
  595. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +1 -1
  596. package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +80 -0
  597. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +13 -2
  598. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
  599. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
  600. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +2 -0
  601. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
  602. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +152 -59
  603. package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +1 -1
  604. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
  605. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +1 -1
  606. package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +1 -1
  607. package/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js +7 -0
  608. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
  609. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +0 -1
  610. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +221 -190
  611. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +12 -2
  612. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
  613. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  614. package/src/renderers/shaders/ShaderChunk.js +5 -3
  615. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +1 -2
  616. package/src/renderers/shaders/ShaderLib/depth.glsl.js +4 -1
  617. package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +1 -2
  618. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
  619. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
  620. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
  621. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
  622. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
  623. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
  624. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
  625. package/src/renderers/shaders/ShaderLib.js +7 -6
  626. package/src/renderers/shaders/UniformsLib.js +8 -5
  627. package/src/renderers/shaders/UniformsUtils.js +52 -9
  628. package/src/renderers/webgl/WebGLAnimation.js +2 -1
  629. package/src/renderers/webgl/WebGLBackground.js +15 -15
  630. package/src/renderers/webgl/WebGLBindingStates.js +99 -27
  631. package/src/renderers/webgl/WebGLBufferRenderer.js +0 -32
  632. package/src/renderers/webgl/WebGLCapabilities.js +11 -5
  633. package/src/renderers/webgl/WebGLEnvironments.js +228 -0
  634. package/src/renderers/webgl/WebGLExtensions.js +2 -25
  635. package/src/renderers/webgl/WebGLGeometries.js +10 -7
  636. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +0 -32
  637. package/src/renderers/webgl/WebGLInfo.js +3 -1
  638. package/src/renderers/webgl/WebGLLights.js +18 -1
  639. package/src/renderers/webgl/WebGLMaterials.js +24 -13
  640. package/src/renderers/webgl/WebGLObjects.js +3 -1
  641. package/src/renderers/webgl/WebGLOutput.js +270 -0
  642. package/src/renderers/webgl/WebGLProgram.js +63 -122
  643. package/src/renderers/webgl/WebGLPrograms.js +65 -52
  644. package/src/renderers/webgl/WebGLRenderLists.js +15 -0
  645. package/src/renderers/webgl/WebGLRenderStates.js +13 -2
  646. package/src/renderers/webgl/WebGLShadowMap.js +191 -26
  647. package/src/renderers/webgl/WebGLState.js +79 -40
  648. package/src/renderers/webgl/WebGLTextures.js +234 -68
  649. package/src/renderers/webgl/WebGLUniforms.js +40 -3
  650. package/src/renderers/webgl/WebGLUniformsGroups.js +24 -3
  651. package/src/renderers/webgl/WebGLUtils.js +8 -3
  652. package/src/renderers/webgl-fallback/WebGLBackend.js +438 -235
  653. package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +0 -41
  654. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +339 -84
  655. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +53 -19
  656. package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +25 -0
  657. package/src/renderers/webgl-fallback/utils/WebGLConstants.js +2 -3
  658. package/src/renderers/webgl-fallback/utils/WebGLState.js +229 -11
  659. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +237 -72
  660. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +56 -27
  661. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +8 -3
  662. package/src/renderers/webgpu/WebGPUBackend.js +403 -253
  663. package/src/renderers/webgpu/WebGPURenderer.Nodes.js +2 -1
  664. package/src/renderers/webgpu/WebGPURenderer.js +5 -3
  665. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +491 -123
  666. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +108 -34
  667. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +360 -201
  668. package/src/renderers/webgpu/utils/WebGPUCapabilities.js +48 -0
  669. package/src/renderers/webgpu/utils/WebGPUConstants.js +17 -2
  670. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +111 -54
  671. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +155 -205
  672. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +407 -149
  673. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +36 -13
  674. package/src/renderers/webgpu/utils/WebGPUUtils.js +55 -13
  675. package/src/renderers/webxr/WebXRController.js +12 -0
  676. package/src/renderers/webxr/WebXRManager.js +45 -29
  677. package/src/textures/CubeDepthTexture.js +76 -0
  678. package/src/textures/ExternalTexture.js +15 -4
  679. package/src/textures/HTMLTexture.js +74 -0
  680. package/src/textures/Source.js +5 -4
  681. package/src/textures/Texture.js +19 -7
  682. package/src/textures/VideoTexture.js +2 -3
  683. package/src/utils.js +344 -3
  684. package/examples/jsm/loaders/RGBMLoader.js +0 -1148
  685. package/examples/jsm/materials/MeshGouraudMaterial.js +0 -434
  686. package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
  687. package/examples/jsm/shaders/GodRaysShader.js +0 -333
  688. package/src/nodes/accessors/SceneNode.js +0 -144
  689. package/src/nodes/code/ScriptableNode.js +0 -726
  690. package/src/nodes/code/ScriptableValueNode.js +0 -253
  691. package/src/nodes/display/PosterizeNode.js +0 -65
  692. package/src/nodes/functions/BSDF/DFGApprox.js +0 -30
  693. package/src/nodes/utils/RemapNode.js +0 -125
  694. package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
  695. package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
  696. package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
@@ -8,7 +8,7 @@ import ParameterNode from './ParameterNode.js';
8
8
  import StructType from './StructType.js';
9
9
  import FunctionNode from '../code/FunctionNode.js';
10
10
  import NodeMaterial from '../../materials/nodes/NodeMaterial.js';
11
- import { getTypeFromLength } from './NodeUtils.js';
11
+ import { getDataFromObject, getTypeFromLength, hashString } from './NodeUtils.js';
12
12
  import { NodeUpdateType, defaultBuildStages, shaderStages } from './constants.js';
13
13
 
14
14
  import {
@@ -20,19 +20,23 @@ import { stack } from './StackNode.js';
20
20
  import { getCurrentStack, setCurrentStack } from '../tsl/TSLBase.js';
21
21
 
22
22
  import CubeRenderTarget from '../../renderers/common/CubeRenderTarget.js';
23
- import ChainMap from '../../renderers/common/ChainMap.js';
24
23
 
25
24
  import BindGroup from '../../renderers/common/BindGroup.js';
26
25
 
27
- import { REVISION, IntType, UnsignedIntType, LinearFilter, LinearMipmapNearestFilter, NearestMipmapLinearFilter, LinearMipmapLinearFilter } from '../../constants.js';
26
+ import { REVISION, IntType, UnsignedIntType, LinearFilter, LinearMipmapNearestFilter, NearestMipmapLinearFilter, LinearMipmapLinearFilter, NormalBlending } from '../../constants.js';
28
27
  import { RenderTarget } from '../../core/RenderTarget.js';
29
28
  import { Color } from '../../math/Color.js';
30
29
  import { Vector2 } from '../../math/Vector2.js';
31
30
  import { Vector3 } from '../../math/Vector3.js';
32
31
  import { Vector4 } from '../../math/Vector4.js';
33
32
  import { Float16BufferAttribute } from '../../core/BufferAttribute.js';
33
+ import { warn, error, yieldToMain } from '../../utils.js';
34
34
 
35
- const rendererCache = new WeakMap();
35
+ let _id = 0;
36
+
37
+ const _bindingGroupsCache = new WeakMap();
38
+
39
+ const sharedNodeData = new WeakMap();
36
40
 
37
41
  const typeFromArray = new Map( [
38
42
  [ Int8Array, 'int' ],
@@ -135,7 +139,10 @@ class NodeBuilder {
135
139
  this.nodes = [];
136
140
 
137
141
  /**
138
- * A list of all sequential nodes.
142
+ * A list of all nodes the builder is processing in sequential order.
143
+ *
144
+ * This is used to determine the update order of nodes, which is important for
145
+ * {@link NodeUpdateType#UPDATE_BEFORE} and {@link NodeUpdateType#UPDATE_AFTER}.
139
146
  *
140
147
  * @type {Array<Node>}
141
148
  */
@@ -259,6 +266,13 @@ class NodeBuilder {
259
266
  */
260
267
  this.structs = { vertex: [], fragment: [], compute: [], index: 0 };
261
268
 
269
+ /**
270
+ * This dictionary holds the types of the builder.
271
+ *
272
+ * @type {Object}
273
+ */
274
+ this.types = { vertex: [], fragment: [], compute: [], index: 0 };
275
+
262
276
  /**
263
277
  * This dictionary holds the bindings for each shader stage.
264
278
  *
@@ -427,13 +441,13 @@ class NodeBuilder {
427
441
  */
428
442
  this.subBuildLayers = [];
429
443
 
444
+
430
445
  /**
431
- * The current stack of nodes.
446
+ * The active stack nodes.
432
447
  *
433
- * @type {?StackNode}
434
- * @default null
448
+ * @type {Array<StackNode>}
435
449
  */
436
- this.currentStack = null;
450
+ this.activeStacks = [];
437
451
 
438
452
  /**
439
453
  * The current sub-build TSL function(Fn).
@@ -443,26 +457,39 @@ class NodeBuilder {
443
457
  */
444
458
  this.subBuildFn = null;
445
459
 
460
+ /**
461
+ * The current TSL function(Fn) call node.
462
+ *
463
+ * @type {?Node}
464
+ * @default null
465
+ */
466
+ this.fnCall = null;
467
+
468
+ Object.defineProperty( this, 'id', { value: _id ++ } );
469
+
446
470
  }
447
471
 
448
472
  /**
449
- * Returns the bind groups of the current renderer.
473
+ * Whether the material is using flat shading or not.
450
474
  *
451
- * @return {ChainMap} The cache.
475
+ * @returns {boolean} Whether the material is using flat shading or not.
452
476
  */
453
- getBindGroupsCache() {
454
-
455
- let bindGroupsCache = rendererCache.get( this.renderer );
477
+ isFlatShading() {
456
478
 
457
- if ( bindGroupsCache === undefined ) {
479
+ return this.material.flatShading === true || this.geometry.hasAttribute( 'normal' ) === false;
458
480
 
459
- bindGroupsCache = new ChainMap();
481
+ }
460
482
 
461
- rendererCache.set( this.renderer, bindGroupsCache );
483
+ /**
484
+ * Whether the material is opaque or not.
485
+ *
486
+ * @return {boolean} Whether the material is opaque or not.
487
+ */
488
+ isOpaque() {
462
489
 
463
- }
490
+ const material = this.material;
464
491
 
465
- return bindGroupsCache;
492
+ return material.transparent === false && material.blending === NormalBlending && material.alphaToCoverage === false;
466
493
 
467
494
  }
468
495
 
@@ -526,19 +553,21 @@ class NodeBuilder {
526
553
  */
527
554
  _getBindGroup( groupName, bindings ) {
528
555
 
529
- const bindGroupsCache = this.getBindGroupsCache();
556
+ const groupNode = bindings[ 0 ].groupNode;
530
557
 
531
- //
558
+ let sharedGroup = groupNode.shared;
532
559
 
533
- const bindingsArray = [];
560
+ if ( sharedGroup ) {
561
+
562
+ for ( let i = 1; i < bindings.length; i ++ ) {
534
563
 
535
- let sharedGroup = true;
564
+ if ( groupNode !== bindings[ i ].groupNode ) {
536
565
 
537
- for ( const binding of bindings ) {
566
+ sharedGroup = false;
538
567
 
539
- bindingsArray.push( binding );
568
+ }
540
569
 
541
- sharedGroup = sharedGroup && binding.groupNode.shared !== true;
570
+ }
542
571
 
543
572
  }
544
573
 
@@ -548,19 +577,59 @@ class NodeBuilder {
548
577
 
549
578
  if ( sharedGroup ) {
550
579
 
551
- bindGroup = bindGroupsCache.get( bindingsArray );
580
+ let cacheKeyString = '';
581
+
582
+ for ( const binding of bindings ) {
583
+
584
+ if ( binding.isNodeUniformsGroup ) {
585
+
586
+ binding.uniforms.sort( ( a, b ) => a.nodeUniform.node.id - b.nodeUniform.node.id );
587
+
588
+ for ( const uniform of binding.uniforms ) {
589
+
590
+ cacheKeyString += uniform.nodeUniform.node.id;
591
+
592
+ }
593
+
594
+ } else {
595
+
596
+ cacheKeyString += binding.nodeUniform.id;
597
+
598
+ }
599
+
600
+ }
601
+
602
+ // TODO: Remove this hack ._currentRenderContext
603
+
604
+ const currentContext = this.renderer._currentRenderContext || this.renderer; // use renderer as fallback until we have a compute context
605
+
606
+ let bindingGroupsCache = _bindingGroupsCache.get( currentContext );
607
+
608
+ if ( bindingGroupsCache === undefined ) {
609
+
610
+ bindingGroupsCache = new Map();
611
+
612
+ _bindingGroupsCache.set( currentContext, bindingGroupsCache );
613
+
614
+ }
615
+
616
+ //
617
+
618
+ const cacheKey = hashString( cacheKeyString );
619
+
620
+ bindGroup = bindingGroupsCache.get( cacheKey );
552
621
 
553
622
  if ( bindGroup === undefined ) {
554
623
 
555
- bindGroup = new BindGroup( groupName, bindingsArray, this.bindingsIndexes[ groupName ].group, bindingsArray );
624
+ bindGroup = new BindGroup( groupName, bindings );
556
625
 
557
- bindGroupsCache.set( bindingsArray, bindGroup );
626
+ bindingGroupsCache.set( cacheKey, bindGroup );
558
627
 
559
628
  }
560
629
 
561
630
  } else {
562
631
 
563
- bindGroup = new BindGroup( groupName, bindingsArray, this.bindingsIndexes[ groupName ].group, bindingsArray );
632
+ bindGroup = new BindGroup( groupName, bindings );
564
633
 
565
634
  }
566
635
 
@@ -618,7 +687,16 @@ class NodeBuilder {
618
687
  const uniforms = bindings[ shaderStage ][ groupName ];
619
688
 
620
689
  const groupUniforms = groups[ groupName ] || ( groups[ groupName ] = [] );
621
- groupUniforms.push( ...uniforms );
690
+
691
+ for ( const uniform of uniforms ) {
692
+
693
+ if ( groupUniforms.includes( uniform ) === false ) {
694
+
695
+ groupUniforms.push( uniform );
696
+
697
+ }
698
+
699
+ }
622
700
 
623
701
  }
624
702
 
@@ -658,8 +736,6 @@ class NodeBuilder {
658
736
  const bindingGroup = bindingsGroups[ i ];
659
737
  this.bindingsIndexes[ bindingGroup.name ].group = i;
660
738
 
661
- bindingGroup.index = i;
662
-
663
739
  }
664
740
 
665
741
  }
@@ -703,9 +779,16 @@ class NodeBuilder {
703
779
  */
704
780
  addSequentialNode( node ) {
705
781
 
706
- if ( this.sequentialNodes.includes( node ) === false ) {
782
+ const updateBeforeType = node.getUpdateBeforeType();
783
+ const updateAfterType = node.getUpdateAfterType();
784
+
785
+ if ( updateBeforeType !== NodeUpdateType.NONE || updateAfterType !== NodeUpdateType.NONE ) {
707
786
 
708
- this.sequentialNodes.push( node );
787
+ if ( this.sequentialNodes.includes( node ) === false ) {
788
+
789
+ this.sequentialNodes.push( node );
790
+
791
+ }
709
792
 
710
793
  }
711
794
 
@@ -722,7 +805,7 @@ class NodeBuilder {
722
805
 
723
806
  if ( updateType !== NodeUpdateType.NONE ) {
724
807
 
725
- this.updateNodes.push( node.getSelf() );
808
+ this.updateNodes.push( node );
726
809
 
727
810
  }
728
811
 
@@ -735,13 +818,13 @@ class NodeBuilder {
735
818
 
736
819
  if ( updateBeforeType !== NodeUpdateType.NONE ) {
737
820
 
738
- this.updateBeforeNodes.push( node.getSelf() );
821
+ this.updateBeforeNodes.push( node );
739
822
 
740
823
  }
741
824
 
742
825
  if ( updateAfterType !== NodeUpdateType.NONE ) {
743
826
 
744
- this.updateAfterNodes.push( node.getSelf() );
827
+ this.updateAfterNodes.push( node );
745
828
 
746
829
  }
747
830
 
@@ -774,6 +857,17 @@ class NodeBuilder {
774
857
 
775
858
  }
776
859
 
860
+ /**
861
+ * Returns the maximum number of bytes available for uniform buffers.
862
+ *
863
+ * @return {number} The maximum number of bytes available for uniform buffers.
864
+ */
865
+ getUniformBufferLimit() {
866
+
867
+ return this.renderer.backend.capabilities.getUniformBufferLimit();
868
+
869
+ }
870
+
777
871
  /**
778
872
  * Adds the given node to the internal node chain.
779
873
  * This is used to check recursive calls in node-graph.
@@ -785,7 +879,7 @@ class NodeBuilder {
785
879
  /*
786
880
  if ( this.chaining.indexOf( node ) !== - 1 ) {
787
881
 
788
- console.warn( 'Recursive node: ', node );
882
+ warn( 'Recursive node: ', node );
789
883
 
790
884
  }
791
885
  */
@@ -826,6 +920,22 @@ class NodeBuilder {
826
920
 
827
921
  }
828
922
 
923
+ /**
924
+ * Returns the native snippet for a ternary operation. E.g. GLSL would output
925
+ * a ternary op as `cond ? x : y` whereas WGSL would output it as `select(y, x, cond)`
926
+ *
927
+ * @abstract
928
+ * @param {string} condSnippet - The condition determining which expression gets resolved.
929
+ * @param {string} ifSnippet - The expression to resolve to if the condition is true.
930
+ * @param {string} elseSnippet - The expression to resolve to if the condition is false.
931
+ * @return {string} The resolved method name.
932
+ */
933
+ getTernary( /* condSnippet, ifSnippet, elseSnippet*/ ) {
934
+
935
+ return null;
936
+
937
+ }
938
+
829
939
  /**
830
940
  * Returns a node for the given hash, see {@link NodeBuilder#setHashNode}.
831
941
  *
@@ -875,6 +985,22 @@ class NodeBuilder {
875
985
 
876
986
  }
877
987
 
988
+ /**
989
+ * Adds context data to the builder's current context.
990
+ *
991
+ * @param {Object} context - The context to add.
992
+ * @return {Object} The previous context.
993
+ */
994
+ addContext( context ) {
995
+
996
+ const previousContext = this.getContext();
997
+
998
+ this.setContext( { ...this.context, ...context } );
999
+
1000
+ return previousContext;
1001
+
1002
+ }
1003
+
878
1004
  /**
879
1005
  * Gets a context used in shader construction that can be shared across different materials.
880
1006
  * This is necessary since the renderer cache can reuse shaders generated in one material and use them in another.
@@ -886,8 +1012,13 @@ class NodeBuilder {
886
1012
  const context = { ...this.context };
887
1013
 
888
1014
  delete context.material;
1015
+ delete context.getUV;
1016
+ delete context.getOutput;
1017
+ delete context.getTextureLevel;
1018
+ delete context.getAO;
1019
+ delete context.getShadow;
889
1020
 
890
- return this.context;
1021
+ return context;
891
1022
 
892
1023
  }
893
1024
 
@@ -950,19 +1081,20 @@ class NodeBuilder {
950
1081
  */
951
1082
  getVertexIndex() {
952
1083
 
953
- console.warn( 'Abstract function.' );
1084
+ warn( 'Abstract function.' );
954
1085
 
955
1086
  }
956
1087
 
957
1088
  /**
958
- * Returns the instanceIndex input variable as a native shader string.
1089
+ * Contextually returns either the vertex stage instance index builtin
1090
+ * or the linearized index of an compute invocation within a grid of workgroups.
959
1091
  *
960
1092
  * @abstract
961
1093
  * @return {string} The instanceIndex shader string.
962
1094
  */
963
1095
  getInstanceIndex() {
964
1096
 
965
- console.warn( 'Abstract function.' );
1097
+ warn( 'Abstract function.' );
966
1098
 
967
1099
  }
968
1100
 
@@ -975,7 +1107,7 @@ class NodeBuilder {
975
1107
  */
976
1108
  getDrawIndex() {
977
1109
 
978
- console.warn( 'Abstract function.' );
1110
+ warn( 'Abstract function.' );
979
1111
 
980
1112
  }
981
1113
 
@@ -987,7 +1119,7 @@ class NodeBuilder {
987
1119
  */
988
1120
  getFrontFacing() {
989
1121
 
990
- console.warn( 'Abstract function.' );
1122
+ warn( 'Abstract function.' );
991
1123
 
992
1124
  }
993
1125
 
@@ -999,7 +1131,7 @@ class NodeBuilder {
999
1131
  */
1000
1132
  getFragCoord() {
1001
1133
 
1002
- console.warn( 'Abstract function.' );
1134
+ warn( 'Abstract function.' );
1003
1135
 
1004
1136
  }
1005
1137
 
@@ -1042,7 +1174,7 @@ class NodeBuilder {
1042
1174
  */
1043
1175
  generateTexture( /* texture, textureProperty, uvSnippet */ ) {
1044
1176
 
1045
- console.warn( 'Abstract function.' );
1177
+ warn( 'Abstract function.' );
1046
1178
 
1047
1179
  }
1048
1180
 
@@ -1059,7 +1191,7 @@ class NodeBuilder {
1059
1191
  */
1060
1192
  generateTextureLod( /* texture, textureProperty, uvSnippet, depthSnippet, levelSnippet */ ) {
1061
1193
 
1062
- console.warn( 'Abstract function.' );
1194
+ warn( 'Abstract function.' );
1063
1195
 
1064
1196
  }
1065
1197
 
@@ -1144,7 +1276,6 @@ class NodeBuilder {
1144
1276
 
1145
1277
  }
1146
1278
 
1147
-
1148
1279
  /**
1149
1280
  * Generates the shader string for the given type and value.
1150
1281
  *
@@ -1159,9 +1290,9 @@ class NodeBuilder {
1159
1290
  if ( type === 'float' || type === 'int' || type === 'uint' ) value = 0;
1160
1291
  else if ( type === 'bool' ) value = false;
1161
1292
  else if ( type === 'color' ) value = new Color();
1162
- else if ( type === 'vec2' ) value = new Vector2();
1163
- else if ( type === 'vec3' ) value = new Vector3();
1164
- else if ( type === 'vec4' ) value = new Vector4();
1293
+ else if ( type === 'vec2' || type === 'uvec2' || type === 'ivec2' ) value = new Vector2();
1294
+ else if ( type === 'vec3' || type === 'uvec3' || type === 'ivec3' ) value = new Vector3();
1295
+ else if ( type === 'vec4' || type === 'uvec4' || type === 'ivec4' ) value = new Vector4();
1165
1296
 
1166
1297
  }
1167
1298
 
@@ -1544,6 +1675,58 @@ class NodeBuilder {
1544
1675
 
1545
1676
  }
1546
1677
 
1678
+ /**
1679
+ * Adds an active stack to the internal stack.
1680
+ *
1681
+ * @param {StackNode} stack - The stack node to add.
1682
+ */
1683
+ setActiveStack( stack ) {
1684
+
1685
+ this.activeStacks.push( stack );
1686
+
1687
+ }
1688
+
1689
+ /**
1690
+ * Removes the active stack from the internal stack.
1691
+ *
1692
+ * @param {StackNode} stack - The stack node to remove.
1693
+ */
1694
+ removeActiveStack( stack ) {
1695
+
1696
+ if ( this.activeStacks[ this.activeStacks.length - 1 ] === stack ) {
1697
+
1698
+ this.activeStacks.pop();
1699
+
1700
+ } else {
1701
+
1702
+ throw new Error( 'NodeBuilder: Invalid active stack removal.' );
1703
+
1704
+ }
1705
+
1706
+ }
1707
+
1708
+ /**
1709
+ * Returns the active stack.
1710
+ *
1711
+ * @return {StackNode} The active stack.
1712
+ */
1713
+ getActiveStack() {
1714
+
1715
+ return this.activeStacks[ this.activeStacks.length - 1 ];
1716
+
1717
+ }
1718
+
1719
+ /**
1720
+ * Returns the base stack.
1721
+ *
1722
+ * @return {StackNode} The base stack.
1723
+ */
1724
+ getBaseStack() {
1725
+
1726
+ return this.activeStacks[ 0 ];
1727
+
1728
+ }
1729
+
1547
1730
  /**
1548
1731
  * Adds a stack node to the internal stack.
1549
1732
  *
@@ -1553,7 +1736,9 @@ class NodeBuilder {
1553
1736
 
1554
1737
  this.stack = stack( this.stack );
1555
1738
 
1556
- this.stacks.push( getCurrentStack() || this.stack );
1739
+ const previousStack = getCurrentStack();
1740
+
1741
+ this.stacks.push( previousStack );
1557
1742
  setCurrentStack( this.stack );
1558
1743
 
1559
1744
  return this.stack;
@@ -1568,6 +1753,14 @@ class NodeBuilder {
1568
1753
  removeStack() {
1569
1754
 
1570
1755
  const lastStack = this.stack;
1756
+
1757
+ for ( const node of lastStack.nodes ) {
1758
+
1759
+ const nodeData = this.getDataFromNode( node );
1760
+ nodeData.stack = lastStack;
1761
+
1762
+ }
1763
+
1571
1764
  this.stack = lastStack.parent;
1572
1765
 
1573
1766
  setCurrentStack( this.stacks.pop() );
@@ -1624,6 +1817,11 @@ class NodeBuilder {
1624
1817
  /**
1625
1818
  * Returns the properties for the given node and shader stage.
1626
1819
  *
1820
+ * Properties are typically used within a build stage to reference a node's
1821
+ * child node or nodes manually assigned to the properties in a separate build stage.
1822
+ * A typical usage pattern for defining nodes manually would be assigning dependency nodes
1823
+ * to the current node's properties in the setup stage and building those properties in the generate stage.
1824
+ *
1627
1825
  * @param {Node} node - The node to get the properties for.
1628
1826
  * @param {('vertex'|'fragment'|'compute'|'any')} [shaderStage='any'] - The shader stage.
1629
1827
  * @return {Object} The node properties.
@@ -1645,7 +1843,7 @@ class NodeBuilder {
1645
1843
  */
1646
1844
  getBufferAttributeFromNode( node, type ) {
1647
1845
 
1648
- const nodeData = this.getDataFromNode( node );
1846
+ const nodeData = this.getDataFromNode( node, 'vertex' );
1649
1847
 
1650
1848
  let bufferAttribute = nodeData.bufferAttribute;
1651
1849
 
@@ -1665,6 +1863,20 @@ class NodeBuilder {
1665
1863
 
1666
1864
  }
1667
1865
 
1866
+ /**
1867
+ * Returns an instance of {@link StructType} for the given struct name and shader stage
1868
+ * or null if not found.
1869
+ *
1870
+ * @param {string} name - The name of the struct.
1871
+ * @param {('vertex'|'fragment'|'compute'|'any')} [shaderStage=this.shaderStage] - The shader stage.
1872
+ * @return {?StructType} The struct type or null if not found.
1873
+ */
1874
+ getStructTypeNode( name, shaderStage = this.shaderStage ) {
1875
+
1876
+ return this.types[ shaderStage ][ name ] || null;
1877
+
1878
+ }
1879
+
1668
1880
  /**
1669
1881
  * Returns an instance of {@link StructType} for the given output struct node.
1670
1882
  *
@@ -1689,6 +1901,7 @@ class NodeBuilder {
1689
1901
  structType = new StructType( name, membersLayout );
1690
1902
 
1691
1903
  this.structs[ shaderStage ].push( structType );
1904
+ this.types[ shaderStage ][ name ] = node;
1692
1905
 
1693
1906
  nodeData.structType = structType;
1694
1907
 
@@ -1932,7 +2145,7 @@ class NodeBuilder {
1932
2145
 
1933
2146
  node.name = name;
1934
2147
 
1935
- console.warn( `THREE.TSL: Declaration name '${ property }' of '${ node.type }' already in use. Renamed to '${ name }'.` );
2148
+ warn( `TSL: Declaration name '${ property }' of '${ node.type }' already in use. Renamed to '${ name }'.` );
1936
2149
 
1937
2150
  }
1938
2151
 
@@ -2219,10 +2432,16 @@ class NodeBuilder {
2219
2432
  /**
2220
2433
  * Executes the node in a specific build stage.
2221
2434
  *
2435
+ * This function can be used to arbitrarily execute the specified build stage
2436
+ * outside of the standard build process. For instance, if a node's type depends
2437
+ * on properties created by the 'setup' stage, then flowBuildStage(node, 'setup')
2438
+ * can be used to execute the setup build stage and access its generated nodes
2439
+ * before the standard build process begins.
2440
+ *
2222
2441
  * @param {Node} node - The node to execute.
2223
2442
  * @param {string} buildStage - The build stage to execute the node in.
2224
- * @param {Node|string|null} output - Expected output type. For example 'vec3'.
2225
- * @return {Node|string|null} The result of the node build.
2443
+ * @param {?(Node|string)} [output=null] - Expected output type. For example 'vec3'.
2444
+ * @return {?(Node|string)} The result of the node build.
2226
2445
  */
2227
2446
  flowBuildStage( node, buildStage, output = null ) {
2228
2447
 
@@ -2309,7 +2528,7 @@ class NodeBuilder {
2309
2528
  */
2310
2529
  buildFunctionCode( /* shaderNode */ ) {
2311
2530
 
2312
- console.warn( 'Abstract function.' );
2531
+ warn( 'Abstract function.' );
2313
2532
 
2314
2533
  }
2315
2534
 
@@ -2348,7 +2567,7 @@ class NodeBuilder {
2348
2567
  * @param {Node} node - The node to execute.
2349
2568
  * @param {?string} output - Expected output type. For example 'vec3'.
2350
2569
  * @param {?string} propertyName - The property name to assign the result.
2351
- * @return {Object|Node|null} The code flow or node.build() result.
2570
+ * @return {?(Object|Node)} The code flow or node.build() result.
2352
2571
  */
2353
2572
  flowNodeFromShaderStage( shaderStage, node, output = null, propertyName = null ) {
2354
2573
 
@@ -2418,7 +2637,7 @@ class NodeBuilder {
2418
2637
  */
2419
2638
  getAttributes( /*shaderStage*/ ) {
2420
2639
 
2421
- console.warn( 'Abstract function.' );
2640
+ warn( 'Abstract function.' );
2422
2641
 
2423
2642
  }
2424
2643
 
@@ -2431,7 +2650,7 @@ class NodeBuilder {
2431
2650
  */
2432
2651
  getVaryings( /*shaderStage*/ ) {
2433
2652
 
2434
- console.warn( 'Abstract function.' );
2653
+ warn( 'Abstract function.' );
2435
2654
 
2436
2655
  }
2437
2656
 
@@ -2453,11 +2672,12 @@ class NodeBuilder {
2453
2672
  * Returns the variable definitions as a shader string for the given shader stage.
2454
2673
  *
2455
2674
  * @param {('vertex'|'fragment'|'compute'|'any')} shaderStage - The shader stage.
2675
+ * @param {boolean} [global=false] - Whether the variables are global.
2456
2676
  * @return {string} The variable code section.
2457
2677
  */
2458
- getVars( shaderStage ) {
2678
+ getVars( shaderStage, global = false ) {
2459
2679
 
2460
- let snippet = '';
2680
+ const snippets = [];
2461
2681
 
2462
2682
  const vars = this.vars[ shaderStage ];
2463
2683
 
@@ -2465,13 +2685,13 @@ class NodeBuilder {
2465
2685
 
2466
2686
  for ( const variable of vars ) {
2467
2687
 
2468
- snippet += `${ this.getVar( variable.type, variable.name ) }; `;
2688
+ snippets.push( `${ this.getVar( variable.type, variable.name, variable.count ) };` );
2469
2689
 
2470
2690
  }
2471
2691
 
2472
2692
  }
2473
2693
 
2474
- return snippet;
2694
+ return snippets.join( global ? '\n' : '\n\t' );
2475
2695
 
2476
2696
  }
2477
2697
 
@@ -2484,7 +2704,7 @@ class NodeBuilder {
2484
2704
  */
2485
2705
  getUniforms( /*shaderStage*/ ) {
2486
2706
 
2487
- console.warn( 'Abstract function.' );
2707
+ warn( 'Abstract function.' );
2488
2708
 
2489
2709
  }
2490
2710
 
@@ -2576,7 +2796,7 @@ class NodeBuilder {
2576
2796
  */
2577
2797
  buildCode() {
2578
2798
 
2579
- console.warn( 'Abstract function.' );
2799
+ warn( 'Abstract function.' );
2580
2800
 
2581
2801
  }
2582
2802
 
@@ -2616,7 +2836,7 @@ class NodeBuilder {
2616
2836
  /**
2617
2837
  * Returns the closest sub-build layer for the given data.
2618
2838
  *
2619
- * @param {Node|Set|Array} data - The data to get the closest sub-build layer from.
2839
+ * @param {Node|Set<string>|Array<string>} data - The data to get the closest sub-build layer from.
2620
2840
  * @return {?string} The closest sub-build name or null if none found.
2621
2841
  */
2622
2842
  getClosestSubBuild( data ) {
@@ -2720,13 +2940,41 @@ class NodeBuilder {
2720
2940
  }
2721
2941
 
2722
2942
  /**
2723
- * Central build method which controls the build for the given object.
2724
- *
2725
- * @return {NodeBuilder} A reference to this node builder.
2943
+ * Prebuild the node builder.
2726
2944
  */
2727
- build() {
2945
+ prebuild() {
2946
+
2947
+ const { object, renderer, material } = this;
2948
+
2949
+ // < renderer.contextNode >
2950
+
2951
+ if ( renderer.contextNode.isContextNode === true ) {
2952
+
2953
+ this.context = { ...this.context, ...renderer.contextNode.getFlowContextData() };
2954
+
2955
+ } else {
2956
+
2957
+ error( 'NodeBuilder: "renderer.contextNode" must be an instance of `context()`.' );
2958
+
2959
+ }
2960
+
2961
+ // < material.contextNode >
2962
+
2963
+ if ( material && material.contextNode ) {
2964
+
2965
+ if ( material.contextNode.isContextNode === true ) {
2966
+
2967
+ this.context = { ...this.context, ...material.contextNode.getFlowContextData() };
2968
+
2969
+ } else {
2970
+
2971
+ error( 'NodeBuilder: "material.contextNode" must be an instance of `context()`.' );
2728
2972
 
2729
- const { object, material, renderer } = this;
2973
+ }
2974
+
2975
+ }
2976
+
2977
+ // < nodeMaterial >
2730
2978
 
2731
2979
  if ( material !== null ) {
2732
2980
 
@@ -2734,7 +2982,7 @@ class NodeBuilder {
2734
2982
 
2735
2983
  if ( nodeMaterial === null ) {
2736
2984
 
2737
- console.error( `NodeMaterial: Material "${ material.type }" is not compatible.` );
2985
+ error( `NodeBuilder: Material "${ material.type }" is not compatible.` );
2738
2986
 
2739
2987
  nodeMaterial = new NodeMaterial();
2740
2988
 
@@ -2748,6 +2996,17 @@ class NodeBuilder {
2748
2996
 
2749
2997
  }
2750
2998
 
2999
+ }
3000
+
3001
+ /**
3002
+ * Central build method which controls the build for the given object.
3003
+ *
3004
+ * @return {NodeBuilder} A reference to this node builder.
3005
+ */
3006
+ build() {
3007
+
3008
+ this.prebuild();
3009
+
2751
3010
  // setup() -> stage 1: create possible new nodes and/or return an output reference node
2752
3011
  // analyze() -> stage 2: analyze nodes to possible optimization and validation
2753
3012
  // generate() -> stage 3: generate shader
@@ -2756,9 +3015,9 @@ class NodeBuilder {
2756
3015
 
2757
3016
  this.setBuildStage( buildStage );
2758
3017
 
2759
- if ( this.context.vertex && this.context.vertex.isNode ) {
3018
+ if ( this.context.position && this.context.position.isNode ) {
2760
3019
 
2761
- this.flowNodeFromShaderStage( 'vertex', this.context.vertex );
3020
+ this.flowNodeFromShaderStage( 'vertex', this.context.position );
2762
3021
 
2763
3022
  }
2764
3023
 
@@ -2798,6 +3057,89 @@ class NodeBuilder {
2798
3057
 
2799
3058
  }
2800
3059
 
3060
+ /**
3061
+ * Async version of build() that yields to main thread between shader stages.
3062
+ * Use this in compileAsync() to prevent blocking the main thread.
3063
+ *
3064
+ * @return {Promise<NodeBuilder>} A promise that resolves to this node builder.
3065
+ */
3066
+ async buildAsync() {
3067
+
3068
+ this.prebuild();
3069
+
3070
+ // setup() -> stage 1: create possible new nodes and/or return an output reference node
3071
+ // analyze() -> stage 2: analyze nodes to possible optimization and validation
3072
+ // generate() -> stage 3: generate shader
3073
+
3074
+ for ( const buildStage of defaultBuildStages ) {
3075
+
3076
+ this.setBuildStage( buildStage );
3077
+
3078
+ if ( this.context.position && this.context.position.isNode ) {
3079
+
3080
+ this.flowNodeFromShaderStage( 'vertex', this.context.position );
3081
+
3082
+ }
3083
+
3084
+ for ( const shaderStage of shaderStages ) {
3085
+
3086
+ this.setShaderStage( shaderStage );
3087
+
3088
+ const flowNodes = this.flowNodes[ shaderStage ];
3089
+
3090
+ for ( const node of flowNodes ) {
3091
+
3092
+ if ( buildStage === 'generate' ) {
3093
+
3094
+ this.flowNode( node );
3095
+
3096
+ } else {
3097
+
3098
+ node.build( this );
3099
+
3100
+ }
3101
+
3102
+ }
3103
+
3104
+ // Yield to main thread after each shader stage to prevent blocking
3105
+ await yieldToMain();
3106
+
3107
+ }
3108
+
3109
+ }
3110
+
3111
+ this.setBuildStage( null );
3112
+ this.setShaderStage( null );
3113
+
3114
+ // stage 4: build code for a specific output
3115
+
3116
+ this.buildCode();
3117
+ this.buildUpdateNodes();
3118
+
3119
+ return this;
3120
+
3121
+ }
3122
+
3123
+ /**
3124
+ * Returns shared data object for the given node.
3125
+ *
3126
+ * @param {Node} node - The node to get shared data from.
3127
+ * @return {Object} The shared data.
3128
+ */
3129
+ getSharedDataFromNode( node ) {
3130
+
3131
+ let data = sharedNodeData.get( node );
3132
+
3133
+ if ( data === undefined ) {
3134
+
3135
+ data = {};
3136
+
3137
+ }
3138
+
3139
+ return data;
3140
+
3141
+ }
3142
+
2801
3143
  /**
2802
3144
  * Returns a uniform representation which is later used for UBO generation and rendering.
2803
3145
  *
@@ -2807,16 +3149,31 @@ class NodeBuilder {
2807
3149
  */
2808
3150
  getNodeUniform( uniformNode, type ) {
2809
3151
 
2810
- if ( type === 'float' || type === 'int' || type === 'uint' ) return new NumberNodeUniform( uniformNode );
2811
- if ( type === 'vec2' || type === 'ivec2' || type === 'uvec2' ) return new Vector2NodeUniform( uniformNode );
2812
- if ( type === 'vec3' || type === 'ivec3' || type === 'uvec3' ) return new Vector3NodeUniform( uniformNode );
2813
- if ( type === 'vec4' || type === 'ivec4' || type === 'uvec4' ) return new Vector4NodeUniform( uniformNode );
2814
- if ( type === 'color' ) return new ColorNodeUniform( uniformNode );
2815
- if ( type === 'mat2' ) return new Matrix2NodeUniform( uniformNode );
2816
- if ( type === 'mat3' ) return new Matrix3NodeUniform( uniformNode );
2817
- if ( type === 'mat4' ) return new Matrix4NodeUniform( uniformNode );
3152
+ const nodeData = this.getSharedDataFromNode( uniformNode );
3153
+
3154
+ let node = nodeData.cache;
3155
+
3156
+ if ( node === undefined ) {
3157
+
3158
+ if ( type === 'float' || type === 'int' || type === 'uint' ) node = new NumberNodeUniform( uniformNode );
3159
+ else if ( type === 'vec2' || type === 'ivec2' || type === 'uvec2' ) node = new Vector2NodeUniform( uniformNode );
3160
+ else if ( type === 'vec3' || type === 'ivec3' || type === 'uvec3' ) node = new Vector3NodeUniform( uniformNode );
3161
+ else if ( type === 'vec4' || type === 'ivec4' || type === 'uvec4' ) node = new Vector4NodeUniform( uniformNode );
3162
+ else if ( type === 'color' ) node = new ColorNodeUniform( uniformNode );
3163
+ else if ( type === 'mat2' ) node = new Matrix2NodeUniform( uniformNode );
3164
+ else if ( type === 'mat3' ) node = new Matrix3NodeUniform( uniformNode );
3165
+ else if ( type === 'mat4' ) node = new Matrix4NodeUniform( uniformNode );
3166
+ else {
3167
+
3168
+ throw new Error( `Uniform "${ type }" not implemented.` );
3169
+
3170
+ }
3171
+
3172
+ nodeData.cache = node;
2818
3173
 
2819
- throw new Error( `Uniform "${type}" not declared.` );
3174
+ }
3175
+
3176
+ return node;
2820
3177
 
2821
3178
  }
2822
3179
 
@@ -2924,9 +3281,18 @@ class NodeBuilder {
2924
3281
  }
2925
3282
 
2926
3283
  /**
2927
- * Prevents the node builder from being used as an iterable in TSL.Fn(), avoiding potential runtime errors.
3284
+ * Returns `true` if data from the previous frame are required. Relevant
3285
+ * when computing motion vectors with {@link VelocityNode}.
3286
+ *
3287
+ * @return {boolean} Whether data from the previous frame are required or not.
2928
3288
  */
2929
- *[ Symbol.iterator ]() { }
3289
+ needsPreviousData() {
3290
+
3291
+ const mrt = this.renderer.getMRT();
3292
+
3293
+ return ( mrt && mrt.has( 'velocity' ) ) || getDataFromObject( this.object ).useVelocity === true;
3294
+
3295
+ }
2930
3296
 
2931
3297
  }
2932
3298