super-three 0.181.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 (539) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +3 -4
  3. package/build/three.cjs +13152 -11354
  4. package/build/three.core.js +12319 -11539
  5. package/build/three.core.min.js +2 -2
  6. package/build/three.module.js +1808 -781
  7. package/build/three.module.min.js +2 -2
  8. package/build/three.tsl.js +27 -13
  9. package/build/three.tsl.min.js +2 -2
  10. package/build/three.webgpu.js +10523 -6263
  11. package/build/three.webgpu.min.js +2 -2
  12. package/build/three.webgpu.nodes.js +10484 -6262
  13. package/build/three.webgpu.nodes.min.js +2 -2
  14. package/examples/jsm/Addons.js +11 -3
  15. package/examples/jsm/animation/CCDIKSolver.js +7 -3
  16. package/examples/jsm/controls/ArcballControls.js +7 -4
  17. package/examples/jsm/controls/DragControls.js +2 -2
  18. package/examples/jsm/controls/FirstPersonControls.js +58 -54
  19. package/examples/jsm/controls/FlyControls.js +4 -0
  20. package/examples/jsm/controls/MapControls.js +55 -1
  21. package/examples/jsm/controls/OrbitControls.js +111 -8
  22. package/examples/jsm/controls/TrackballControls.js +8 -8
  23. package/examples/jsm/controls/TransformControls.js +34 -2
  24. package/examples/jsm/csm/CSM.js +2 -1
  25. package/examples/jsm/csm/CSMShadowNode.js +6 -2
  26. package/examples/jsm/effects/AnaglyphEffect.js +102 -7
  27. package/examples/jsm/environments/ColorEnvironment.js +59 -0
  28. package/examples/jsm/environments/RoomEnvironment.js +3 -0
  29. package/examples/jsm/exporters/EXRExporter.js +1 -1
  30. package/examples/jsm/exporters/GLTFExporter.js +152 -9
  31. package/examples/jsm/exporters/USDZExporter.js +22 -3
  32. package/examples/jsm/geometries/DecalGeometry.js +1 -1
  33. package/examples/jsm/geometries/TextGeometry.js +18 -0
  34. package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
  35. package/examples/jsm/helpers/LightProbeGridHelper.js +221 -0
  36. package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -1
  37. package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
  38. package/examples/jsm/helpers/ViewHelper.js +67 -8
  39. package/examples/jsm/inspector/Extension.js +13 -0
  40. package/examples/jsm/inspector/Inspector.js +203 -88
  41. package/examples/jsm/inspector/RendererInspector.js +14 -4
  42. package/examples/jsm/inspector/extensions/extensions.json +6 -0
  43. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +916 -0
  44. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +281 -0
  45. package/examples/jsm/inspector/tabs/Console.js +41 -7
  46. package/examples/jsm/inspector/tabs/Memory.js +128 -0
  47. package/examples/jsm/inspector/tabs/Parameters.js +51 -3
  48. package/examples/jsm/inspector/tabs/Performance.js +4 -4
  49. package/examples/jsm/inspector/tabs/Settings.js +264 -0
  50. package/examples/jsm/inspector/tabs/Timeline.js +1611 -0
  51. package/examples/jsm/inspector/tabs/Viewer.js +107 -5
  52. package/examples/jsm/inspector/ui/Graph.js +2 -2
  53. package/examples/jsm/inspector/ui/List.js +1 -1
  54. package/examples/jsm/inspector/ui/Profiler.js +1936 -34
  55. package/examples/jsm/inspector/ui/Style.js +1044 -31
  56. package/examples/jsm/inspector/ui/Tab.js +222 -3
  57. package/examples/jsm/inspector/ui/Values.js +55 -2
  58. package/examples/jsm/inspector/ui/utils.js +13 -0
  59. package/examples/jsm/interaction/InteractionManager.js +226 -0
  60. package/examples/jsm/libs/meshopt_decoder.module.js +9 -8
  61. package/examples/jsm/lighting/DynamicLighting.js +82 -0
  62. package/examples/jsm/lighting/LightProbeGrid.js +651 -0
  63. package/examples/jsm/lines/LineMaterial.js +7 -1
  64. package/examples/jsm/loaders/3DMLoader.js +5 -4
  65. package/examples/jsm/loaders/3MFLoader.js +2 -2
  66. package/examples/jsm/loaders/AMFLoader.js +2 -2
  67. package/examples/jsm/loaders/ColladaLoader.js +24 -4026
  68. package/examples/jsm/loaders/DRACOLoader.js +5 -5
  69. package/examples/jsm/loaders/EXRLoader.js +687 -48
  70. package/examples/jsm/loaders/FBXLoader.js +235 -37
  71. package/examples/jsm/loaders/GCodeLoader.js +34 -8
  72. package/examples/jsm/loaders/GLTFLoader.js +146 -178
  73. package/examples/jsm/loaders/HDRLoader.js +1 -2
  74. package/examples/jsm/loaders/KMZLoader.js +5 -5
  75. package/examples/jsm/loaders/KTX2Loader.js +27 -5
  76. package/examples/jsm/loaders/LDrawLoader.js +41 -50
  77. package/examples/jsm/loaders/LWOLoader.js +7 -39
  78. package/examples/jsm/loaders/NRRDLoader.js +2 -2
  79. package/examples/jsm/loaders/PCDLoader.js +4 -2
  80. package/examples/jsm/loaders/SVGLoader.js +2 -2
  81. package/examples/jsm/loaders/TDSLoader.js +0 -2
  82. package/examples/jsm/loaders/TGALoader.js +0 -2
  83. package/examples/jsm/loaders/USDLoader.js +100 -40
  84. package/examples/jsm/loaders/UltraHDRLoader.js +285 -160
  85. package/examples/jsm/loaders/VOXLoader.js +660 -117
  86. package/examples/jsm/loaders/VRMLLoader.js +79 -2
  87. package/examples/jsm/loaders/VTKLoader.js +42 -25
  88. package/examples/jsm/loaders/collada/ColladaComposer.js +3044 -0
  89. package/examples/jsm/loaders/collada/ColladaParser.js +1977 -0
  90. package/examples/jsm/loaders/usd/USDAParser.js +450 -363
  91. package/examples/jsm/loaders/usd/USDCParser.js +1867 -6
  92. package/examples/jsm/loaders/usd/USDComposer.js +4594 -0
  93. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
  94. package/examples/jsm/materials/WoodNodeMaterial.js +11 -11
  95. package/examples/jsm/math/Octree.js +131 -1
  96. package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
  97. package/examples/jsm/misc/RollerCoaster.js +42 -4
  98. package/examples/jsm/misc/Volume.js +0 -1
  99. package/examples/jsm/misc/VolumeSlice.js +0 -1
  100. package/examples/jsm/modifiers/TessellateModifier.js +1 -1
  101. package/examples/jsm/objects/LensflareMesh.js +1 -1
  102. package/examples/jsm/objects/Reflector.js +73 -25
  103. package/examples/jsm/objects/Sky.js +90 -6
  104. package/examples/jsm/objects/SkyMesh.js +150 -16
  105. package/examples/jsm/objects/Water.js +4 -3
  106. package/examples/jsm/objects/Water2.js +5 -3
  107. package/examples/jsm/objects/WaterMesh.js +5 -7
  108. package/examples/jsm/physics/AmmoPhysics.js +12 -7
  109. package/examples/jsm/physics/JoltPhysics.js +10 -6
  110. package/examples/jsm/physics/RapierPhysics.js +9 -5
  111. package/examples/jsm/postprocessing/EffectComposer.js +7 -5
  112. package/examples/jsm/postprocessing/OutputPass.js +9 -0
  113. package/examples/jsm/postprocessing/RenderPass.js +10 -0
  114. package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
  115. package/examples/jsm/postprocessing/UnrealBloomPass.js +48 -18
  116. package/examples/jsm/renderers/CSS3DRenderer.js +1 -1
  117. package/examples/jsm/renderers/Projector.js +246 -28
  118. package/examples/jsm/renderers/SVGRenderer.js +174 -60
  119. package/examples/jsm/shaders/GTAOShader.js +19 -6
  120. package/examples/jsm/shaders/HalftoneShader.js +12 -1
  121. package/examples/jsm/shaders/PoissonDenoiseShader.js +6 -2
  122. package/examples/jsm/shaders/SAOShader.js +17 -4
  123. package/examples/jsm/shaders/SSAOShader.js +11 -1
  124. package/examples/jsm/shaders/SSRShader.js +6 -5
  125. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -4
  126. package/examples/jsm/shaders/VignetteShader.js +1 -1
  127. package/examples/jsm/transpiler/AST.js +44 -0
  128. package/examples/jsm/transpiler/GLSLDecoder.js +63 -6
  129. package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
  130. package/examples/jsm/transpiler/TSLEncoder.js +46 -3
  131. package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
  132. package/examples/jsm/transpiler/WGSLEncoder.js +27 -0
  133. package/examples/jsm/tsl/WebGLNodesHandler.js +605 -0
  134. package/examples/jsm/tsl/display/AfterImageNode.js +11 -1
  135. package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
  136. package/examples/jsm/tsl/display/AnamorphicNode.js +12 -1
  137. package/examples/jsm/tsl/display/BilateralBlurNode.js +374 -0
  138. package/examples/jsm/tsl/display/BloomNode.js +16 -6
  139. package/examples/jsm/tsl/display/CRT.js +150 -0
  140. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +3 -36
  141. package/examples/jsm/tsl/display/DenoiseNode.js +1 -1
  142. package/examples/jsm/tsl/display/DepthOfFieldNode.js +1 -1
  143. package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
  144. package/examples/jsm/tsl/display/FSR1Node.js +477 -0
  145. package/examples/jsm/tsl/display/FXAANode.js +2 -2
  146. package/examples/jsm/tsl/display/GTAONode.js +6 -4
  147. package/examples/jsm/tsl/display/GaussianBlurNode.js +21 -2
  148. package/examples/jsm/tsl/display/GodraysNode.js +615 -0
  149. package/examples/jsm/tsl/display/LensflareNode.js +1 -1
  150. package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
  151. package/examples/jsm/tsl/display/OutlineNode.js +69 -19
  152. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
  153. package/examples/jsm/tsl/display/PixelationPassNode.js +7 -6
  154. package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
  155. package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
  156. package/examples/jsm/tsl/display/SMAANode.js +2 -2
  157. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
  158. package/examples/jsm/tsl/display/SSGINode.js +8 -24
  159. package/examples/jsm/tsl/display/SSRNode.js +8 -8
  160. package/examples/jsm/tsl/display/SSSNode.js +6 -4
  161. package/examples/jsm/tsl/display/Shape.js +29 -0
  162. package/examples/jsm/tsl/display/SharpenNode.js +283 -0
  163. package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
  164. package/examples/jsm/tsl/display/StereoCompositePassNode.js +8 -1
  165. package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
  166. package/examples/jsm/tsl/display/TAAUNode.js +835 -0
  167. package/examples/jsm/tsl/display/TRAANode.js +315 -126
  168. package/examples/jsm/tsl/display/TransitionNode.js +1 -1
  169. package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
  170. package/examples/jsm/tsl/display/radialBlur.js +68 -0
  171. package/examples/jsm/tsl/lighting/DynamicLightsNode.js +300 -0
  172. package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +61 -0
  173. package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +111 -0
  174. package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +99 -0
  175. package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +134 -0
  176. package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +161 -0
  177. package/examples/jsm/tsl/math/Bayer.js +53 -3
  178. package/examples/jsm/utils/BufferGeometryUtils.js +2 -3
  179. package/examples/jsm/utils/ColorUtils.js +76 -0
  180. package/examples/jsm/utils/LDrawUtils.js +1 -1
  181. package/examples/jsm/utils/ShadowMapViewer.js +24 -10
  182. package/examples/jsm/utils/ShadowMapViewerGPU.js +1 -1
  183. package/examples/jsm/utils/SkeletonUtils.js +14 -8
  184. package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
  185. package/examples/jsm/webxr/XRHandMeshModel.js +36 -10
  186. package/examples/jsm/webxr/XRHandModelFactory.js +2 -1
  187. package/package.json +24 -30
  188. package/src/Three.Core.js +3 -1
  189. package/src/Three.TSL.js +25 -11
  190. package/src/Three.WebGPU.Nodes.js +5 -0
  191. package/src/Three.WebGPU.js +9 -0
  192. package/src/Three.js +1 -0
  193. package/src/animation/AnimationAction.js +12 -2
  194. package/src/animation/AnimationClip.js +1 -1
  195. package/src/animation/AnimationMixer.js +6 -0
  196. package/src/animation/AnimationUtils.js +1 -12
  197. package/src/animation/KeyframeTrack.js +47 -8
  198. package/src/animation/PropertyMixer.js +4 -4
  199. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  200. package/src/animation/tracks/ColorKeyframeTrack.js +1 -1
  201. package/src/animation/tracks/NumberKeyframeTrack.js +1 -1
  202. package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -1
  203. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  204. package/src/animation/tracks/VectorKeyframeTrack.js +1 -1
  205. package/src/audio/Audio.js +1 -1
  206. package/src/audio/AudioContext.js +2 -2
  207. package/src/audio/AudioListener.js +5 -3
  208. package/src/cameras/Camera.js +32 -2
  209. package/src/cameras/CubeCamera.js +20 -0
  210. package/src/constants.js +90 -5
  211. package/src/core/BufferAttribute.js +13 -1
  212. package/src/core/BufferGeometry.js +14 -2
  213. package/src/core/Clock.js +7 -0
  214. package/src/core/Object3D.js +52 -4
  215. package/src/core/Raycaster.js +2 -2
  216. package/src/core/RenderTarget.js +4 -4
  217. package/src/extras/PMREMGenerator.js +7 -18
  218. package/src/extras/TextureUtils.js +5 -1
  219. package/src/extras/curves/CatmullRomCurve3.js +3 -2
  220. package/src/geometries/ExtrudeGeometry.js +2 -2
  221. package/src/geometries/PolyhedronGeometry.js +1 -1
  222. package/src/geometries/TorusGeometry.js +8 -3
  223. package/src/helpers/CameraHelper.js +3 -0
  224. package/src/helpers/DirectionalLightHelper.js +4 -1
  225. package/src/helpers/HemisphereLightHelper.js +3 -0
  226. package/src/helpers/PointLightHelper.js +1 -25
  227. package/src/helpers/SpotLightHelper.js +3 -0
  228. package/src/lights/DirectionalLight.js +13 -0
  229. package/src/lights/HemisphereLight.js +10 -0
  230. package/src/lights/Light.js +1 -11
  231. package/src/lights/LightProbe.js +0 -15
  232. package/src/lights/LightShadow.js +15 -6
  233. package/src/lights/PointLight.js +15 -0
  234. package/src/lights/PointLightShadow.js +0 -86
  235. package/src/lights/SpotLight.js +22 -1
  236. package/src/lights/webgpu/IESSpotLight.js +2 -1
  237. package/src/loaders/AudioLoader.js +11 -1
  238. package/src/loaders/Cache.js +28 -0
  239. package/src/loaders/DataTextureLoader.js +6 -4
  240. package/src/loaders/FileLoader.js +2 -3
  241. package/src/loaders/ImageBitmapLoader.js +12 -9
  242. package/src/loaders/Loader.js +6 -0
  243. package/src/loaders/MaterialLoader.js +3 -2
  244. package/src/loaders/ObjectLoader.js +46 -6
  245. package/src/loaders/nodes/NodeLoader.js +2 -2
  246. package/src/loaders/nodes/NodeObjectLoader.js +18 -0
  247. package/src/materials/Material.js +2 -0
  248. package/src/materials/MeshLambertMaterial.js +9 -0
  249. package/src/materials/MeshPhongMaterial.js +9 -0
  250. package/src/materials/MeshToonMaterial.js +1 -1
  251. package/src/materials/ShaderMaterial.js +20 -1
  252. package/src/materials/nodes/Line2NodeMaterial.js +34 -7
  253. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +5 -2
  254. package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -4
  255. package/src/materials/nodes/NodeMaterial.js +45 -25
  256. package/src/materials/nodes/manager/NodeMaterialObserver.js +191 -86
  257. package/src/math/Line3.js +6 -5
  258. package/src/math/MathUtils.js +10 -10
  259. package/src/math/Matrix2.js +13 -9
  260. package/src/math/Matrix3.js +13 -9
  261. package/src/math/Matrix4.js +87 -74
  262. package/src/math/Plane.js +4 -3
  263. package/src/math/Quaternion.js +3 -29
  264. package/src/math/Sphere.js +1 -1
  265. package/src/math/Triangle.js +1 -1
  266. package/src/math/Vector2.js +11 -7
  267. package/src/math/Vector3.js +15 -13
  268. package/src/math/Vector4.js +13 -9
  269. package/src/math/interpolants/BezierInterpolant.js +108 -0
  270. package/src/nodes/Nodes.js +86 -68
  271. package/src/nodes/TSL.js +7 -7
  272. package/src/nodes/accessors/Arrays.js +1 -1
  273. package/src/nodes/accessors/BatchNode.js +10 -10
  274. package/src/nodes/accessors/Bitangent.js +5 -5
  275. package/src/nodes/accessors/BufferAttributeNode.js +107 -15
  276. package/src/nodes/accessors/BufferNode.js +29 -2
  277. package/src/nodes/accessors/Camera.js +149 -28
  278. package/src/nodes/accessors/ClippingNode.js +4 -4
  279. package/src/nodes/accessors/CubeTextureNode.js +27 -2
  280. package/src/nodes/accessors/InstanceNode.js +148 -43
  281. package/src/nodes/accessors/MaterialNode.js +9 -1
  282. package/src/nodes/accessors/MaterialProperties.js +2 -5
  283. package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
  284. package/src/nodes/accessors/ModelNode.js +1 -1
  285. package/src/nodes/accessors/Normal.js +11 -11
  286. package/src/nodes/accessors/Object3DNode.js +1 -1
  287. package/src/nodes/accessors/Position.js +34 -2
  288. package/src/nodes/accessors/ReferenceBaseNode.js +6 -6
  289. package/src/nodes/accessors/ReferenceNode.js +8 -8
  290. package/src/nodes/accessors/RendererReferenceNode.js +1 -2
  291. package/src/nodes/accessors/SceneProperties.js +47 -0
  292. package/src/nodes/accessors/SkinningNode.js +27 -26
  293. package/src/nodes/accessors/StorageBufferNode.js +14 -25
  294. package/src/nodes/accessors/StorageTextureNode.js +40 -9
  295. package/src/nodes/accessors/Tangent.js +4 -14
  296. package/src/nodes/accessors/Texture3DNode.js +32 -35
  297. package/src/nodes/accessors/TextureNode.js +67 -23
  298. package/src/nodes/accessors/UniformArrayNode.js +6 -4
  299. package/src/nodes/accessors/UserDataNode.js +1 -2
  300. package/src/nodes/accessors/VertexColorNode.js +1 -2
  301. package/src/nodes/code/FunctionCallNode.js +1 -1
  302. package/src/nodes/code/FunctionNode.js +2 -3
  303. package/src/nodes/core/ArrayNode.js +21 -2
  304. package/src/nodes/core/AssignNode.js +3 -3
  305. package/src/nodes/core/AttributeNode.js +3 -3
  306. package/src/nodes/core/BypassNode.js +1 -1
  307. package/src/nodes/core/ContextNode.js +104 -5
  308. package/src/nodes/core/IndexNode.js +2 -1
  309. package/src/nodes/core/InputNode.js +1 -1
  310. package/src/nodes/core/InspectorNode.js +1 -1
  311. package/src/nodes/core/IsolateNode.js +1 -1
  312. package/src/nodes/core/MRTNode.js +48 -2
  313. package/src/nodes/core/Node.js +112 -15
  314. package/src/nodes/core/NodeBuilder.js +284 -66
  315. package/src/nodes/core/NodeError.js +28 -0
  316. package/src/nodes/core/NodeFrame.js +12 -4
  317. package/src/nodes/core/NodeUtils.js +11 -9
  318. package/src/nodes/core/OutputStructNode.js +12 -10
  319. package/src/nodes/core/ParameterNode.js +4 -4
  320. package/src/nodes/core/PropertyNode.js +19 -3
  321. package/src/nodes/core/StackNode.js +66 -17
  322. package/src/nodes/core/StackTrace.js +139 -0
  323. package/src/nodes/core/StructNode.js +17 -3
  324. package/src/nodes/core/StructTypeNode.js +12 -18
  325. package/src/nodes/core/SubBuildNode.js +2 -2
  326. package/src/nodes/core/UniformGroupNode.js +36 -6
  327. package/src/nodes/core/UniformNode.js +21 -5
  328. package/src/nodes/core/VarNode.js +48 -23
  329. package/src/nodes/core/VaryingNode.js +2 -19
  330. package/src/nodes/display/BlendModes.js +0 -64
  331. package/src/nodes/display/ColorAdjustment.js +17 -0
  332. package/src/nodes/display/ColorSpaceNode.js +3 -3
  333. package/src/nodes/display/NormalMapNode.js +39 -4
  334. package/src/nodes/display/PassNode.js +125 -16
  335. package/src/nodes/display/RenderOutputNode.js +7 -7
  336. package/src/nodes/display/ScreenNode.js +4 -2
  337. package/src/nodes/display/ToneMappingNode.js +1 -1
  338. package/src/nodes/display/ToonOutlinePassNode.js +2 -2
  339. package/src/nodes/display/ViewportDepthNode.js +52 -4
  340. package/src/nodes/display/ViewportDepthTextureNode.js +11 -15
  341. package/src/nodes/display/ViewportTextureNode.js +39 -11
  342. package/src/nodes/fog/Fog.js +18 -35
  343. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +3 -3
  344. package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
  345. package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
  346. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +2 -2
  347. package/src/nodes/functions/PhysicalLightingModel.js +126 -45
  348. package/src/nodes/geometry/RangeNode.js +5 -3
  349. package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
  350. package/src/nodes/gpgpu/BarrierNode.js +9 -0
  351. package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -3
  352. package/src/nodes/gpgpu/ComputeNode.js +74 -48
  353. package/src/nodes/gpgpu/SubgroupFunctionNode.js +2 -2
  354. package/src/nodes/gpgpu/WorkgroupInfoNode.js +4 -4
  355. package/src/nodes/lighting/AnalyticLightNode.js +53 -0
  356. package/src/nodes/lighting/EnvironmentNode.js +28 -3
  357. package/src/nodes/lighting/LightsNode.js +7 -28
  358. package/src/nodes/lighting/PointShadowNode.js +162 -149
  359. package/src/nodes/lighting/ShadowFilterNode.js +53 -65
  360. package/src/nodes/lighting/ShadowNode.js +120 -42
  361. package/src/nodes/math/BitcastNode.js +1 -1
  362. package/src/nodes/math/BitcountNode.js +433 -0
  363. package/src/nodes/math/ConditionalNode.js +3 -3
  364. package/src/nodes/math/MathNode.js +76 -41
  365. package/src/nodes/math/OperatorNode.js +3 -2
  366. package/src/nodes/math/PackFloatNode.js +98 -0
  367. package/src/nodes/math/UnpackFloatNode.js +96 -0
  368. package/src/nodes/pmrem/PMREMNode.js +1 -1
  369. package/src/nodes/pmrem/PMREMUtils.js +9 -15
  370. package/src/nodes/tsl/TSLBase.js +1 -1
  371. package/src/nodes/tsl/TSLCore.js +38 -17
  372. package/src/nodes/utils/ArrayElementNode.js +14 -1
  373. package/src/nodes/utils/ConvertNode.js +1 -1
  374. package/src/nodes/utils/DebugNode.js +12 -12
  375. package/src/nodes/utils/EventNode.js +31 -2
  376. package/src/nodes/utils/FlipNode.js +1 -1
  377. package/src/nodes/utils/FunctionOverloadingNode.js +1 -1
  378. package/src/nodes/utils/JoinNode.js +3 -3
  379. package/src/nodes/utils/LoopNode.js +1 -1
  380. package/src/nodes/utils/MemberNode.js +2 -2
  381. package/src/nodes/utils/Packing.js +13 -1
  382. package/src/nodes/utils/PostProcessingUtils.js +33 -1
  383. package/src/nodes/utils/RTTNode.js +1 -1
  384. package/src/nodes/utils/ReflectorNode.js +3 -4
  385. package/src/nodes/utils/Remap.js +48 -0
  386. package/src/nodes/utils/RotateNode.js +1 -1
  387. package/src/nodes/utils/SampleNode.js +1 -1
  388. package/src/nodes/utils/SetNode.js +1 -1
  389. package/src/nodes/utils/SplitNode.js +1 -1
  390. package/src/nodes/utils/SpriteSheetUV.js +35 -0
  391. package/src/nodes/utils/UVUtils.js +28 -0
  392. package/src/objects/BatchedMesh.js +44 -16
  393. package/src/objects/InstancedMesh.js +30 -3
  394. package/src/objects/Line.js +1 -1
  395. package/src/objects/Mesh.js +1 -1
  396. package/src/objects/Points.js +1 -1
  397. package/src/objects/Skeleton.js +9 -0
  398. package/src/objects/SkinnedMesh.js +26 -9
  399. package/src/renderers/WebGLRenderer.js +329 -145
  400. package/src/renderers/common/Animation.js +3 -3
  401. package/src/renderers/common/Attributes.js +15 -1
  402. package/src/renderers/common/Backend.js +29 -8
  403. package/src/renderers/common/Background.js +26 -13
  404. package/src/renderers/common/BindGroup.js +1 -16
  405. package/src/renderers/common/Binding.js +11 -0
  406. package/src/renderers/common/Bindings.js +29 -14
  407. package/src/renderers/common/BlendMode.js +143 -0
  408. package/src/renderers/common/Buffer.js +40 -0
  409. package/src/renderers/common/BundleGroup.js +1 -1
  410. package/src/renderers/common/ChainMap.js +30 -6
  411. package/src/renderers/common/ComputePipeline.js +1 -1
  412. package/src/renderers/common/CubeRenderTarget.js +51 -7
  413. package/src/renderers/common/Geometries.js +29 -3
  414. package/src/renderers/common/Info.js +333 -4
  415. package/src/renderers/common/InspectorBase.js +6 -1
  416. package/src/renderers/common/Lighting.js +5 -21
  417. package/src/renderers/common/Pipelines.js +40 -7
  418. package/src/renderers/common/PostProcessing.js +8 -206
  419. package/src/renderers/common/ReadbackBuffer.js +78 -0
  420. package/src/renderers/common/RenderBundle.js +3 -1
  421. package/src/renderers/common/RenderBundles.js +7 -3
  422. package/src/renderers/common/RenderContext.js +16 -0
  423. package/src/renderers/common/RenderContexts.js +33 -49
  424. package/src/renderers/common/RenderLists.js +2 -1
  425. package/src/renderers/common/RenderObject.js +17 -5
  426. package/src/renderers/common/RenderObjectPipeline.js +40 -0
  427. package/src/renderers/common/RenderObjects.js +21 -5
  428. package/src/renderers/common/RenderPipeline.js +232 -17
  429. package/src/renderers/common/Renderer.js +481 -117
  430. package/src/renderers/common/Sampler.js +4 -4
  431. package/src/renderers/common/StorageBuffer.js +13 -1
  432. package/src/renderers/common/Textures.js +89 -4
  433. package/src/renderers/common/TimestampQueryPool.js +5 -3
  434. package/src/renderers/common/Uniform.js +8 -0
  435. package/src/renderers/common/UniformsGroup.js +62 -1
  436. package/src/renderers/common/XRManager.js +37 -29
  437. package/src/renderers/common/extras/PMREMGenerator.js +25 -23
  438. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  439. package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +242 -99
  440. package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
  441. package/src/renderers/common/nodes/NodeUniformBuffer.js +52 -0
  442. package/src/renderers/shaders/DFGLUTData.js +19 -34
  443. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
  444. package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
  445. package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
  446. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
  447. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
  448. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +0 -1
  449. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +8 -12
  450. package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +80 -0
  451. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +13 -2
  452. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
  453. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
  454. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +2 -0
  455. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
  456. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +112 -53
  457. package/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js +7 -0
  458. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
  459. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +0 -1
  460. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +225 -186
  461. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +12 -2
  462. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
  463. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  464. package/src/renderers/shaders/ShaderChunk.js +5 -3
  465. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +1 -2
  466. package/src/renderers/shaders/ShaderLib/depth.glsl.js +3 -0
  467. package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +1 -2
  468. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
  469. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
  470. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
  471. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
  472. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
  473. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
  474. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
  475. package/src/renderers/shaders/ShaderLib.js +7 -6
  476. package/src/renderers/shaders/UniformsLib.js +7 -5
  477. package/src/renderers/shaders/UniformsUtils.js +27 -5
  478. package/src/renderers/webgl/WebGLAnimation.js +2 -1
  479. package/src/renderers/webgl/WebGLBackground.js +15 -15
  480. package/src/renderers/webgl/WebGLBindingStates.js +99 -27
  481. package/src/renderers/webgl/WebGLBufferRenderer.js +0 -32
  482. package/src/renderers/webgl/WebGLCapabilities.js +9 -4
  483. package/src/renderers/webgl/WebGLEnvironments.js +228 -0
  484. package/src/renderers/webgl/WebGLGeometries.js +10 -7
  485. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +0 -32
  486. package/src/renderers/webgl/WebGLLights.js +18 -1
  487. package/src/renderers/webgl/WebGLMaterials.js +24 -13
  488. package/src/renderers/webgl/WebGLObjects.js +3 -1
  489. package/src/renderers/webgl/WebGLOutput.js +270 -0
  490. package/src/renderers/webgl/WebGLProgram.js +49 -109
  491. package/src/renderers/webgl/WebGLPrograms.js +63 -51
  492. package/src/renderers/webgl/WebGLRenderLists.js +15 -0
  493. package/src/renderers/webgl/WebGLRenderStates.js +13 -2
  494. package/src/renderers/webgl/WebGLShadowMap.js +188 -24
  495. package/src/renderers/webgl/WebGLState.js +75 -37
  496. package/src/renderers/webgl/WebGLTextures.js +215 -54
  497. package/src/renderers/webgl/WebGLUniforms.js +40 -3
  498. package/src/renderers/webgl/WebGLUniformsGroups.js +19 -0
  499. package/src/renderers/webgl/WebGLUtils.js +6 -2
  500. package/src/renderers/webgl-fallback/WebGLBackend.js +253 -82
  501. package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +0 -41
  502. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +173 -74
  503. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +53 -19
  504. package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +25 -0
  505. package/src/renderers/webgl-fallback/utils/WebGLState.js +223 -6
  506. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +68 -53
  507. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +10 -10
  508. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +6 -2
  509. package/src/renderers/webgpu/WebGPUBackend.js +260 -140
  510. package/src/renderers/webgpu/WebGPURenderer.js +2 -1
  511. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +366 -90
  512. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +107 -34
  513. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +357 -200
  514. package/src/renderers/webgpu/utils/WebGPUCapabilities.js +48 -0
  515. package/src/renderers/webgpu/utils/WebGPUConstants.js +10 -0
  516. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +61 -23
  517. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +152 -200
  518. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +156 -59
  519. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +7 -7
  520. package/src/renderers/webgpu/utils/WebGPUUtils.js +33 -11
  521. package/src/renderers/webxr/WebXRController.js +12 -0
  522. package/src/renderers/webxr/WebXRManager.js +4 -2
  523. package/src/textures/CubeDepthTexture.js +76 -0
  524. package/src/textures/HTMLTexture.js +74 -0
  525. package/src/textures/Source.js +2 -2
  526. package/src/textures/Texture.js +16 -5
  527. package/src/utils.js +280 -3
  528. package/examples/jsm/materials/MeshGouraudMaterial.js +0 -434
  529. package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
  530. package/examples/jsm/shaders/GodRaysShader.js +0 -333
  531. package/src/nodes/accessors/SceneNode.js +0 -145
  532. package/src/nodes/code/ScriptableNode.js +0 -726
  533. package/src/nodes/code/ScriptableValueNode.js +0 -253
  534. package/src/nodes/display/PosterizeNode.js +0 -65
  535. package/src/nodes/functions/BSDF/DFGApprox.js +0 -71
  536. package/src/nodes/utils/RemapNode.js +0 -125
  537. package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
  538. package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
  539. package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
@@ -42,11 +42,17 @@ class OutputStructNode extends Node {
42
42
 
43
43
  }
44
44
 
45
- getNodeType( builder ) {
45
+ generateNodeType( /*builder*/ ) {
46
46
 
47
- const properties = builder.getNodeProperties( this );
47
+ return 'OutputType';
48
48
 
49
- if ( properties.membersLayout === undefined ) {
49
+ }
50
+
51
+ generate( builder ) {
52
+
53
+ const nodeData = builder.getDataFromNode( this );
54
+
55
+ if ( nodeData.membersLayout === undefined ) {
50
56
 
51
57
  const members = this.members;
52
58
  const membersLayout = [];
@@ -60,16 +66,12 @@ class OutputStructNode extends Node {
60
66
 
61
67
  }
62
68
 
63
- properties.membersLayout = membersLayout;
64
- properties.structType = builder.getOutputStructTypeFromNode( this, properties.membersLayout );
69
+ nodeData.membersLayout = membersLayout;
70
+ nodeData.structType = builder.getOutputStructTypeFromNode( this, nodeData.membersLayout );
65
71
 
66
72
  }
67
73
 
68
- return properties.structType.name;
69
-
70
- }
71
-
72
- generate( builder ) {
74
+ //
73
75
 
74
76
  const propertyName = builder.getOutputStructName();
75
77
  const members = this.members;
@@ -1,5 +1,5 @@
1
- import { nodeObject } from '../tsl/TSLBase.js';
2
1
  import { error } from '../../utils.js';
2
+ import StackTrace from '../core/StackTrace.js';
3
3
  import PropertyNode from './PropertyNode.js';
4
4
 
5
5
  /**
@@ -56,7 +56,7 @@ class ParameterNode extends PropertyNode {
56
56
 
57
57
  } else {
58
58
 
59
- error( `TSL: Member "${ name }" not found in struct "${ type }".` );
59
+ error( `TSL: Member "${ name }" not found in struct "${ type }".`, new StackTrace() );
60
60
 
61
61
  memberType = 'float';
62
62
 
@@ -68,7 +68,7 @@ class ParameterNode extends PropertyNode {
68
68
 
69
69
  getHash() {
70
70
 
71
- return this.uuid;
71
+ return String( this.id );
72
72
 
73
73
  }
74
74
 
@@ -91,4 +91,4 @@ export default ParameterNode;
91
91
  * @param {?string} name - The name of the parameter in the shader.
92
92
  * @returns {ParameterNode}
93
93
  */
94
- export const parameter = ( type, name ) => nodeObject( new ParameterNode( type, name ) );
94
+ export const parameter = ( type, name ) => new ParameterNode( type, name );
@@ -1,5 +1,5 @@
1
1
  import Node from './Node.js';
2
- import { nodeImmutable, nodeObject } from '../tsl/TSLCore.js';
2
+ import { nodeImmutable } from '../tsl/TSLCore.js';
3
3
  import { hashString } from './NodeUtils.js';
4
4
 
5
5
  /**
@@ -113,7 +113,7 @@ export default PropertyNode;
113
113
  * @param {?string} [name=null] - The name of the property in the shader.
114
114
  * @returns {PropertyNode}
115
115
  */
116
- export const property = ( type, name ) => nodeObject( new PropertyNode( type, name ) );
116
+ export const property = ( type, name ) => new PropertyNode( type, name );
117
117
 
118
118
  /**
119
119
  * TSL function for creating a varying property node.
@@ -124,7 +124,7 @@ export const property = ( type, name ) => nodeObject( new PropertyNode( type, na
124
124
  * @param {?string} [name=null] - The name of the varying in the shader.
125
125
  * @returns {PropertyNode}
126
126
  */
127
- export const varyingProperty = ( type, name ) => nodeObject( new PropertyNode( type, name, true ) );
127
+ export const varyingProperty = ( type, name ) => new PropertyNode( type, name, true );
128
128
 
129
129
  /**
130
130
  * TSL object that represents the shader variable `DiffuseColor`.
@@ -134,6 +134,14 @@ export const varyingProperty = ( type, name ) => nodeObject( new PropertyNode( t
134
134
  */
135
135
  export const diffuseColor = /*@__PURE__*/ nodeImmutable( PropertyNode, 'vec4', 'DiffuseColor' );
136
136
 
137
+ /**
138
+ * TSL object that represents the shader variable `DiffuseContribution`.
139
+ *
140
+ * @tsl
141
+ * @type {PropertyNode<vec3>}
142
+ */
143
+ export const diffuseContribution = /*@__PURE__*/ nodeImmutable( PropertyNode, 'vec3', 'DiffuseContribution' );
144
+
137
145
  /**
138
146
  * TSL object that represents the shader variable `EmissiveColor`.
139
147
  *
@@ -254,6 +262,14 @@ export const anisotropyB = /*@__PURE__*/ nodeImmutable( PropertyNode, 'vec3', 'A
254
262
  */
255
263
  export const specularColor = /*@__PURE__*/ nodeImmutable( PropertyNode, 'color', 'SpecularColor' );
256
264
 
265
+ /**
266
+ * TSL object that represents the shader variable `SpecularColorBlended`.
267
+ *
268
+ * @tsl
269
+ * @type {PropertyNode<color>}
270
+ */
271
+ export const specularColorBlended = /*@__PURE__*/ nodeImmutable( PropertyNode, 'color', 'SpecularColorBlended' );
272
+
257
273
  /**
258
274
  * TSL object that represents the shader variable `SpecularF90`.
259
275
  *
@@ -1,4 +1,5 @@
1
1
  import Node from './Node.js';
2
+ import StackTrace from '../core/StackTrace.js';
2
3
  import { select } from '../math/ConditionalNode.js';
3
4
  import { ShaderNode, nodeProxy, getCurrentStack, setCurrentStack, nodeObject } from '../tsl/TSLBase.js';
4
5
  import { error } from '../../utils.js';
@@ -68,6 +69,15 @@ class StackNode extends Node {
68
69
  */
69
70
  this._expressionNode = null;
70
71
 
72
+ /**
73
+ * The current node being processed.
74
+ *
75
+ * @private
76
+ * @type {Node}
77
+ * @default null
78
+ */
79
+ this._currentNode = null;
80
+
71
81
  /**
72
82
  * This flag can be used for type testing.
73
83
  *
@@ -81,19 +91,19 @@ class StackNode extends Node {
81
91
 
82
92
  getElementType( builder ) {
83
93
 
84
- return this.hasOutput ? this.outputNode.getElementType( builder ) : 'void';
94
+ return this.hasOutput( builder ) ? this.outputNode.getElementType( builder ) : 'void';
85
95
 
86
96
  }
87
97
 
88
- getNodeType( builder ) {
98
+ generateNodeType( builder ) {
89
99
 
90
- return this.hasOutput ? this.outputNode.getNodeType( builder ) : 'void';
100
+ return this.hasOutput( builder ) ? this.outputNode.getNodeType( builder ) : 'void';
91
101
 
92
102
  }
93
103
 
94
104
  getMemberType( builder, name ) {
95
105
 
96
- return this.hasOutput ? this.outputNode.getMemberType( builder, name ) : 'void';
106
+ return this.hasOutput( builder ) ? this.outputNode.getMemberType( builder, name ) : 'void';
97
107
 
98
108
  }
99
109
 
@@ -101,23 +111,38 @@ class StackNode extends Node {
101
111
  * Adds a node to this stack.
102
112
  *
103
113
  * @param {Node} node - The node to add.
114
+ * @param {number} [index=this.nodes.length] - The index where the node should be added.
104
115
  * @return {StackNode} A reference to this stack node.
105
116
  */
106
- addToStack( node ) {
117
+ addToStack( node, index = this.nodes.length ) {
107
118
 
108
119
  if ( node.isNode !== true ) {
109
120
 
110
- error( 'TSL: Invalid node added to stack.' );
121
+ error( 'TSL: Invalid node added to stack.', new StackTrace() );
111
122
  return this;
112
123
 
113
124
  }
114
125
 
115
- this.nodes.push( node );
126
+ this.nodes.splice( index, 0, node );
116
127
 
117
128
  return this;
118
129
 
119
130
  }
120
131
 
132
+ /**
133
+ * Adds a node to the stack before the current node.
134
+ *
135
+ * @param {Node} node - The node to add.
136
+ * @return {StackNode} A reference to this stack node.
137
+ */
138
+ addToStackBefore( node ) {
139
+
140
+ const index = this._currentNode ? this.nodes.indexOf( this._currentNode ) : 0;
141
+
142
+ return this.addToStack( node, index );
143
+
144
+ }
145
+
121
146
  /**
122
147
  * Represent an `if` statement in TSL.
123
148
  *
@@ -205,7 +230,7 @@ class StackNode extends Node {
205
230
 
206
231
  } else {
207
232
 
208
- error( 'TSL: Invalid parameter length. Case() requires at least two parameters.' );
233
+ error( 'TSL: Invalid parameter length. Case() requires at least two parameters.', new StackTrace() );
209
234
 
210
235
  }
211
236
 
@@ -267,7 +292,7 @@ class StackNode extends Node {
267
292
 
268
293
  for ( const childNode of this.getChildren() ) {
269
294
 
270
- if ( childNode.isVarNode && childNode.intent === true ) {
295
+ if ( childNode.isVarNode && childNode.isIntent( builder ) ) {
271
296
 
272
297
  if ( childNode.isAssign( builder ) !== true ) {
273
298
 
@@ -287,9 +312,9 @@ class StackNode extends Node {
287
312
 
288
313
  }
289
314
 
290
- get hasOutput() {
315
+ hasOutput( builder ) {
291
316
 
292
- return this.outputNode && this.outputNode.isNode;
317
+ return this.outputNode && this.outputNode.isNode && this.outputNode.getNodeType( builder ) !== 'void';
293
318
 
294
319
  }
295
320
 
@@ -297,19 +322,23 @@ class StackNode extends Node {
297
322
 
298
323
  const previousStack = getCurrentStack();
299
324
 
325
+ const buildStage = builder.buildStage;
326
+
300
327
  setCurrentStack( this );
301
328
 
302
329
  builder.setActiveStack( this );
303
330
 
304
- const buildStage = builder.buildStage;
331
+ //
305
332
 
306
- for ( const node of this.nodes ) {
333
+ const buildNode = ( node ) => {
307
334
 
308
- if ( node.isVarNode && node.intent === true ) {
335
+ this._currentNode = node;
336
+
337
+ if ( node.isVarNode && node.isIntent( builder ) ) {
309
338
 
310
339
  if ( node.isAssign( builder ) !== true ) {
311
340
 
312
- continue;
341
+ return;
313
342
 
314
343
  }
315
344
 
@@ -330,7 +359,7 @@ class StackNode extends Node {
330
359
 
331
360
  if ( node.isVarNode && parents && parents.length === 1 && parents[ 0 ] && parents[ 0 ].isStackNode ) {
332
361
 
333
- continue; // skip var nodes that are only used in .toVarying()
362
+ return; // skip var nodes that are only used in .toVarying()
334
363
 
335
364
  }
336
365
 
@@ -338,13 +367,33 @@ class StackNode extends Node {
338
367
 
339
368
  }
340
369
 
370
+ };
371
+
372
+ //
373
+
374
+ const nodes = [ ...this.nodes ];
375
+
376
+ for ( const node of nodes ) {
377
+
378
+ buildNode( node );
379
+
380
+ }
381
+
382
+ this._currentNode = null;
383
+
384
+ const newNodes = this.nodes.filter( ( node ) => nodes.indexOf( node ) === - 1 );
385
+
386
+ for ( const node of newNodes ) {
387
+
388
+ buildNode( node );
389
+
341
390
  }
342
391
 
343
392
  //
344
393
 
345
394
  let result;
346
395
 
347
- if ( this.hasOutput ) {
396
+ if ( this.hasOutput( builder ) ) {
348
397
 
349
398
  result = this.outputNode.build( builder, ...params );
350
399
 
@@ -0,0 +1,139 @@
1
+ // Pre-compiled RegExp patterns for ignored files
2
+ const IGNORED_FILES = [
3
+ /^StackTrace\.js$/,
4
+ /^TSLCore\.js$/,
5
+ /^.*Node\.js$/,
6
+ /^three\.webgpu.*\.js$/
7
+ ];
8
+
9
+ /**
10
+ * Parses the stack trace and filters out ignored files.
11
+ * Returns an array with function name, file, line, and column.
12
+ */
13
+ function getFilteredStack( stack ) {
14
+
15
+ // Pattern to extract function name, file, line, and column from different browsers
16
+ // Chrome: "at functionName (file.js:1:2)" or "at file.js:1:2"
17
+ // Firefox: "functionName@file.js:1:2"
18
+ const regex = /(?:at\s+(.+?)\s+\()?(?:(.+?)@)?([^@\s()]+):(\d+):(\d+)/;
19
+
20
+ return stack.split( '\n' )
21
+ .map( line => {
22
+
23
+ const match = line.match( regex );
24
+ if ( ! match ) return null; // Skip if line format is invalid
25
+
26
+ // Chrome: match[1], Firefox: match[2]
27
+ const fn = match[ 1 ] || match[ 2 ] || '';
28
+ const file = match[ 3 ].split( '?' )[ 0 ]; // Clean file name (Vite/HMR)
29
+ const lineNum = parseInt( match[ 4 ], 10 );
30
+ const column = parseInt( match[ 5 ], 10 );
31
+
32
+ // Extract only the filename from full path
33
+ const fileName = file.split( '/' ).pop();
34
+
35
+ return {
36
+ fn: fn,
37
+ file: fileName,
38
+ line: lineNum,
39
+ column: column
40
+ };
41
+
42
+ } )
43
+ .filter( frame => {
44
+
45
+ // Only keep frames that are valid and not in the ignore list
46
+ return frame && ! IGNORED_FILES.some( regex => regex.test( frame.file ) );
47
+
48
+ } );
49
+
50
+ }
51
+
52
+ /**
53
+ * Class representing a stack trace for debugging purposes.
54
+ */
55
+ class StackTrace {
56
+
57
+ /**
58
+ * Creates a StackTrace instance by capturing and filtering the current stack trace.
59
+ *
60
+ * @param {Error|string|null} stackMessage - An optional stack trace to use instead of capturing a new one.
61
+ */
62
+ constructor( stackMessage = null ) {
63
+
64
+ /**
65
+ * This flag can be used for type testing.
66
+ *
67
+ * @type {boolean}
68
+ * @readonly
69
+ * @default true
70
+ */
71
+ this.isStackTrace = true;
72
+
73
+ /**
74
+ * The stack trace.
75
+ *
76
+ * @type {Array<{fn: string, file: string, line: number, column: number}>}
77
+ */
78
+ this.stack = getFilteredStack( stackMessage ? stackMessage : new Error().stack );
79
+
80
+ }
81
+
82
+ /**
83
+ * Returns a formatted location string of the top stack frame.
84
+ *
85
+ * @returns {string} The formatted stack trace message.
86
+ */
87
+ getLocation() {
88
+
89
+ if ( this.stack.length === 0 ) {
90
+
91
+ return '[Unknown location]';
92
+
93
+ }
94
+
95
+ const mainStack = this.stack[ 0 ];
96
+
97
+ const fn = mainStack.fn;
98
+ const fnName = fn ? `"${ fn }()" at ` : '';
99
+
100
+ return `${fnName}"${mainStack.file}:${mainStack.line}"`; // :${mainStack.column}
101
+
102
+ }
103
+
104
+ /**
105
+ * Returns the full error message including the stack trace.
106
+ *
107
+ * @param {string} message - The error message.
108
+ * @returns {string} The full error message with stack trace.
109
+ */
110
+ getError( message ) {
111
+
112
+ if ( this.stack.length === 0 ) {
113
+
114
+ return message;
115
+
116
+ }
117
+
118
+ // Output: "Error: message\n at functionName (file.js:line:column)"
119
+ const stackString = this.stack.map( frame => {
120
+
121
+ const location = `${ frame.file }:${ frame.line }:${ frame.column }`;
122
+
123
+ if ( frame.fn ) {
124
+
125
+ return ` at ${ frame.fn } (${ location })`;
126
+
127
+ }
128
+
129
+ return ` at ${ location }`;
130
+
131
+ } ).join( '\n' );
132
+
133
+ return `${ message }\n${ stackString }`;
134
+
135
+ }
136
+
137
+ }
138
+
139
+ export default StackTrace;
@@ -1,6 +1,5 @@
1
1
  import Node from './Node.js';
2
2
  import StructTypeNode from './StructTypeNode.js';
3
- import { nodeObject } from '../tsl/TSLCore.js';
4
3
 
5
4
  /**
6
5
  * StructNode allows to create custom structures with multiple members.
@@ -41,7 +40,7 @@ class StructNode extends Node {
41
40
 
42
41
  }
43
42
 
44
- getNodeType( builder ) {
43
+ generateNodeType( builder ) {
45
44
 
46
45
  return this.structTypeNode.getNodeType( builder );
47
46
 
@@ -53,6 +52,21 @@ class StructNode extends Node {
53
52
 
54
53
  }
55
54
 
55
+ _getChildren() {
56
+
57
+ // Ensure struct type is the last child for correct code generation order
58
+
59
+ const children = super._getChildren();
60
+
61
+ const structTypeProperty = children.find( child => child.childNode === this.structTypeNode );
62
+
63
+ children.splice( children.indexOf( structTypeProperty ), 1 );
64
+ children.push( structTypeProperty );
65
+
66
+ return children;
67
+
68
+ }
69
+
56
70
  generate( builder ) {
57
71
 
58
72
  const nodeVar = builder.getVarFromNode( this );
@@ -108,7 +122,7 @@ export const struct = ( membersLayout, name = null ) => {
108
122
 
109
123
  }
110
124
 
111
- return nodeObject( new StructNode( structLayout, values ) );
125
+ return new StructNode( structLayout, values );
112
126
 
113
127
  };
114
128
 
@@ -1,6 +1,6 @@
1
1
 
2
2
  import Node from './Node.js';
3
- import { getByteBoundaryFromType, getMemoryLengthFromType } from './NodeUtils.js';
3
+ import { getAlignmentFromType, getMemoryLengthFromType } from './NodeUtils.js';
4
4
 
5
5
  /**
6
6
  * Generates a layout for struct members.
@@ -86,29 +86,23 @@ class StructTypeNode extends Node {
86
86
  */
87
87
  getLength() {
88
88
 
89
- const GPU_CHUNK_BYTES = 8;
90
89
  const BYTES_PER_ELEMENT = Float32Array.BYTES_PER_ELEMENT;
91
-
92
- let offset = 0; // global buffer offset in bytes
90
+ let maxAlignment = 1; // maximum alignment value in this struct
91
+ let offset = 0; // global buffer offset in 4 byte elements
93
92
 
94
93
  for ( const member of this.membersLayout ) {
95
94
 
96
95
  const type = member.type;
97
96
 
98
- const itemSize = getMemoryLengthFromType( type ) * BYTES_PER_ELEMENT;
99
- const boundary = getByteBoundaryFromType( type );
100
-
101
- const chunkOffset = offset % GPU_CHUNK_BYTES; // offset in the current chunk
102
- const chunkPadding = chunkOffset % boundary; // required padding to match boundary
103
- const chunkStart = chunkOffset + chunkPadding; // start position in the current chunk for the data
104
-
105
- offset += chunkPadding;
97
+ const itemSize = getMemoryLengthFromType( type );
98
+ const alignment = getAlignmentFromType( type ) / BYTES_PER_ELEMENT;
99
+ maxAlignment = Math.max( maxAlignment, alignment );
106
100
 
107
- // Check for chunk overflow
108
- if ( chunkStart !== 0 && ( GPU_CHUNK_BYTES - chunkStart ) < itemSize ) {
101
+ const chunkOffset = offset % maxAlignment; // offset in the current chunk of maxAlignment elements
102
+ const overhang = chunkOffset % alignment; // distance from the last aligned offset
103
+ if ( overhang !== 0 ) {
109
104
 
110
- // Add padding to the end of the chunk
111
- offset += ( GPU_CHUNK_BYTES - chunkStart );
105
+ offset += alignment - overhang; // move to next aligned offset
112
106
 
113
107
  }
114
108
 
@@ -116,7 +110,7 @@ class StructTypeNode extends Node {
116
110
 
117
111
  }
118
112
 
119
- return ( Math.ceil( offset / GPU_CHUNK_BYTES ) * GPU_CHUNK_BYTES ) / BYTES_PER_ELEMENT;
113
+ return ( Math.ceil( offset / maxAlignment ) * maxAlignment ); // ensure length is a multiple of maxAlignment
120
114
 
121
115
  }
122
116
 
@@ -128,7 +122,7 @@ class StructTypeNode extends Node {
128
122
 
129
123
  }
130
124
 
131
- getNodeType( builder ) {
125
+ generateNodeType( builder ) {
132
126
 
133
127
  const structType = builder.getStructTypeFromNode( this, this.membersLayout, this.name );
134
128
 
@@ -46,7 +46,7 @@ class SubBuildNode extends Node {
46
46
 
47
47
  }
48
48
 
49
- getNodeType( builder ) {
49
+ generateNodeType( builder ) {
50
50
 
51
51
  if ( this.nodeType !== null ) return this.nodeType;
52
52
 
@@ -86,4 +86,4 @@ export default SubBuildNode;
86
86
  * @param {?string} [type=null] - The type of the node, if known.
87
87
  * @returns {Node} A node object wrapping the SubBuildNode instance.
88
88
  */
89
- export const subBuild = ( node, name, type = null ) => nodeObject( new SubBuildNode( nodeObject( node ), name, type ) );
89
+ export const subBuild = ( node, name, type = null ) => new SubBuildNode( nodeObject( node ), name, type );
@@ -1,4 +1,5 @@
1
1
  import Node from './Node.js';
2
+ import { NodeUpdateType } from './constants.js';
2
3
 
3
4
  /**
4
5
  * This node can be used to group single instances of {@link UniformNode}
@@ -27,8 +28,9 @@ class UniformGroupNode extends Node {
27
28
  * @param {string} name - The name of the uniform group node.
28
29
  * @param {boolean} [shared=false] - Whether this uniform group node is shared or not.
29
30
  * @param {number} [order=1] - Influences the internal sorting.
31
+ * @param {string|null} [updateType=null] - The update type of the uniform group node.
30
32
  */
31
- constructor( name, shared = false, order = 1 ) {
33
+ constructor( name, shared = false, order = 1, updateType = null ) {
32
34
 
33
35
  super( 'string' );
34
36
 
@@ -56,6 +58,14 @@ class UniformGroupNode extends Node {
56
58
  */
57
59
  this.order = order;
58
60
 
61
+ /**
62
+ * The update type of the uniform group node.
63
+ *
64
+ * @type {string|null}
65
+ * @default null
66
+ */
67
+ this.updateType = updateType;
68
+
59
69
  /**
60
70
  * This flag can be used for type testing.
61
71
  *
@@ -67,6 +77,21 @@ class UniformGroupNode extends Node {
67
77
 
68
78
  }
69
79
 
80
+ /**
81
+ * Marks the uniform group node as needing an update.
82
+ * This will trigger the necessary updates in the rendering process.
83
+ */
84
+ update() {
85
+
86
+ this.needsUpdate = true;
87
+
88
+ }
89
+
90
+ /**
91
+ * Serializes the uniform group node to a JSON object.
92
+ *
93
+ * @param {Object} data - The object to store the serialized data.
94
+ */
70
95
  serialize( data ) {
71
96
 
72
97
  super.serialize( data );
@@ -77,6 +102,11 @@ class UniformGroupNode extends Node {
77
102
 
78
103
  }
79
104
 
105
+ /**
106
+ * Deserializes the uniform group node from a JSON object.
107
+ *
108
+ * @param {Object} data - The object containing the serialized data.
109
+ */
80
110
  deserialize( data ) {
81
111
 
82
112
  super.deserialize( data );
@@ -99,7 +129,7 @@ export default UniformGroupNode;
99
129
  * @param {string} name - The name of the uniform group node.
100
130
  * @returns {UniformGroupNode}
101
131
  */
102
- export const uniformGroup = ( name ) => new UniformGroupNode( name );
132
+ export const uniformGroup = ( name, order = 1, updateType = null ) => new UniformGroupNode( name, false, order, updateType );
103
133
 
104
134
  /**
105
135
  * TSL function for creating a shared uniform group node with the given name and order.
@@ -110,7 +140,7 @@ export const uniformGroup = ( name ) => new UniformGroupNode( name );
110
140
  * @param {number} [order=0] - Influences the internal sorting.
111
141
  * @returns {UniformGroupNode}
112
142
  */
113
- export const sharedUniformGroup = ( name, order = 0 ) => new UniformGroupNode( name, true, order );
143
+ export const sharedUniformGroup = ( name, order = 0, updateType = null ) => new UniformGroupNode( name, true, order, updateType );
114
144
 
115
145
  /**
116
146
  * TSL object that represents a shared uniform group node which is updated once per frame.
@@ -118,7 +148,7 @@ export const sharedUniformGroup = ( name, order = 0 ) => new UniformGroupNode( n
118
148
  * @tsl
119
149
  * @type {UniformGroupNode}
120
150
  */
121
- export const frameGroup = /*@__PURE__*/ sharedUniformGroup( 'frame' );
151
+ export const frameGroup = /*@__PURE__*/ sharedUniformGroup( 'frame', 0, NodeUpdateType.FRAME );
122
152
 
123
153
  /**
124
154
  * TSL object that represents a shared uniform group node which is updated once per render.
@@ -126,7 +156,7 @@ export const frameGroup = /*@__PURE__*/ sharedUniformGroup( 'frame' );
126
156
  * @tsl
127
157
  * @type {UniformGroupNode}
128
158
  */
129
- export const renderGroup = /*@__PURE__*/ sharedUniformGroup( 'render' );
159
+ export const renderGroup = /*@__PURE__*/ sharedUniformGroup( 'render', 0, NodeUpdateType.RENDER );
130
160
 
131
161
  /**
132
162
  * TSL object that represents a uniform group node which is updated once per object.
@@ -134,4 +164,4 @@ export const renderGroup = /*@__PURE__*/ sharedUniformGroup( 'render' );
134
164
  * @tsl
135
165
  * @type {UniformGroupNode}
136
166
  */
137
- export const objectGroup = /*@__PURE__*/ uniformGroup( 'object' );
167
+ export const objectGroup = /*@__PURE__*/ uniformGroup( 'object', 1, NodeUpdateType.OBJECT );