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
@@ -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,7 +20,6 @@ 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
 
@@ -31,11 +30,13 @@ 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';
34
- import { warn, error } from '../../utils.js';
33
+ import { warn, error, yieldToMain } from '../../utils.js';
35
34
 
36
35
  let _id = 0;
37
36
 
38
- const rendererCache = new WeakMap();
37
+ const _bindingGroupsCache = new WeakMap();
38
+
39
+ const sharedNodeData = new WeakMap();
39
40
 
40
41
  const typeFromArray = new Map( [
41
42
  [ Int8Array, 'int' ],
@@ -138,7 +139,10 @@ class NodeBuilder {
138
139
  this.nodes = [];
139
140
 
140
141
  /**
141
- * 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}.
142
146
  *
143
147
  * @type {Array<Node>}
144
148
  */
@@ -466,36 +470,26 @@ class NodeBuilder {
466
470
  }
467
471
 
468
472
  /**
469
- * Whether the material is opaque or not.
473
+ * Whether the material is using flat shading or not.
470
474
  *
471
- * @return {boolean} Whether the material is opaque or not.
475
+ * @returns {boolean} Whether the material is using flat shading or not.
472
476
  */
473
- isOpaque() {
474
-
475
- const material = this.material;
477
+ isFlatShading() {
476
478
 
477
- return material.transparent === false && material.blending === NormalBlending && material.alphaToCoverage === false;
479
+ return this.material.flatShading === true || this.geometry.hasAttribute( 'normal' ) === false;
478
480
 
479
481
  }
480
482
 
481
483
  /**
482
- * Returns the bind groups of the current renderer.
484
+ * Whether the material is opaque or not.
483
485
  *
484
- * @return {ChainMap} The cache.
486
+ * @return {boolean} Whether the material is opaque or not.
485
487
  */
486
- getBindGroupsCache() {
487
-
488
- let bindGroupsCache = rendererCache.get( this.renderer );
489
-
490
- if ( bindGroupsCache === undefined ) {
491
-
492
- bindGroupsCache = new ChainMap();
493
-
494
- rendererCache.set( this.renderer, bindGroupsCache );
488
+ isOpaque() {
495
489
 
496
- }
490
+ const material = this.material;
497
491
 
498
- return bindGroupsCache;
492
+ return material.transparent === false && material.blending === NormalBlending && material.alphaToCoverage === false;
499
493
 
500
494
  }
501
495
 
@@ -559,19 +553,21 @@ class NodeBuilder {
559
553
  */
560
554
  _getBindGroup( groupName, bindings ) {
561
555
 
562
- const bindGroupsCache = this.getBindGroupsCache();
556
+ const groupNode = bindings[ 0 ].groupNode;
563
557
 
564
- //
558
+ let sharedGroup = groupNode.shared;
559
+
560
+ if ( sharedGroup ) {
565
561
 
566
- const bindingsArray = [];
562
+ for ( let i = 1; i < bindings.length; i ++ ) {
567
563
 
568
- let sharedGroup = true;
564
+ if ( groupNode !== bindings[ i ].groupNode ) {
569
565
 
570
- for ( const binding of bindings ) {
566
+ sharedGroup = false;
571
567
 
572
- bindingsArray.push( binding );
568
+ }
573
569
 
574
- sharedGroup = sharedGroup && binding.groupNode.shared !== true;
570
+ }
575
571
 
576
572
  }
577
573
 
@@ -581,19 +577,59 @@ class NodeBuilder {
581
577
 
582
578
  if ( sharedGroup ) {
583
579
 
584
- 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 );
585
621
 
586
622
  if ( bindGroup === undefined ) {
587
623
 
588
- bindGroup = new BindGroup( groupName, bindingsArray, this.bindingsIndexes[ groupName ].group, bindingsArray );
624
+ bindGroup = new BindGroup( groupName, bindings );
589
625
 
590
- bindGroupsCache.set( bindingsArray, bindGroup );
626
+ bindingGroupsCache.set( cacheKey, bindGroup );
591
627
 
592
628
  }
593
629
 
594
630
  } else {
595
631
 
596
- bindGroup = new BindGroup( groupName, bindingsArray, this.bindingsIndexes[ groupName ].group, bindingsArray );
632
+ bindGroup = new BindGroup( groupName, bindings );
597
633
 
598
634
  }
599
635
 
@@ -651,7 +687,16 @@ class NodeBuilder {
651
687
  const uniforms = bindings[ shaderStage ][ groupName ];
652
688
 
653
689
  const groupUniforms = groups[ groupName ] || ( groups[ groupName ] = [] );
654
- 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
+ }
655
700
 
656
701
  }
657
702
 
@@ -691,8 +736,6 @@ class NodeBuilder {
691
736
  const bindingGroup = bindingsGroups[ i ];
692
737
  this.bindingsIndexes[ bindingGroup.name ].group = i;
693
738
 
694
- bindingGroup.index = i;
695
-
696
739
  }
697
740
 
698
741
  }
@@ -736,9 +779,16 @@ class NodeBuilder {
736
779
  */
737
780
  addSequentialNode( node ) {
738
781
 
739
- 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 ) {
786
+
787
+ if ( this.sequentialNodes.includes( node ) === false ) {
740
788
 
741
- this.sequentialNodes.push( node );
789
+ this.sequentialNodes.push( node );
790
+
791
+ }
742
792
 
743
793
  }
744
794
 
@@ -807,6 +857,17 @@ class NodeBuilder {
807
857
 
808
858
  }
809
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
+
810
871
  /**
811
872
  * Adds the given node to the internal node chain.
812
873
  * This is used to check recursive calls in node-graph.
@@ -951,8 +1012,13 @@ class NodeBuilder {
951
1012
  const context = { ...this.context };
952
1013
 
953
1014
  delete context.material;
1015
+ delete context.getUV;
1016
+ delete context.getOutput;
1017
+ delete context.getTextureLevel;
1018
+ delete context.getAO;
1019
+ delete context.getShadow;
954
1020
 
955
- return this.context;
1021
+ return context;
956
1022
 
957
1023
  }
958
1024
 
@@ -1224,9 +1290,9 @@ class NodeBuilder {
1224
1290
  if ( type === 'float' || type === 'int' || type === 'uint' ) value = 0;
1225
1291
  else if ( type === 'bool' ) value = false;
1226
1292
  else if ( type === 'color' ) value = new Color();
1227
- else if ( type === 'vec2' ) value = new Vector2();
1228
- else if ( type === 'vec3' ) value = new Vector3();
1229
- 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();
1230
1296
 
1231
1297
  }
1232
1298
 
@@ -1777,7 +1843,7 @@ class NodeBuilder {
1777
1843
  */
1778
1844
  getBufferAttributeFromNode( node, type ) {
1779
1845
 
1780
- const nodeData = this.getDataFromNode( node );
1846
+ const nodeData = this.getDataFromNode( node, 'vertex' );
1781
1847
 
1782
1848
  let bufferAttribute = nodeData.bufferAttribute;
1783
1849
 
@@ -2606,11 +2672,12 @@ class NodeBuilder {
2606
2672
  * Returns the variable definitions as a shader string for the given shader stage.
2607
2673
  *
2608
2674
  * @param {('vertex'|'fragment'|'compute'|'any')} shaderStage - The shader stage.
2675
+ * @param {boolean} [global=false] - Whether the variables are global.
2609
2676
  * @return {string} The variable code section.
2610
2677
  */
2611
- getVars( shaderStage ) {
2678
+ getVars( shaderStage, global = false ) {
2612
2679
 
2613
- let snippet = '';
2680
+ const snippets = [];
2614
2681
 
2615
2682
  const vars = this.vars[ shaderStage ];
2616
2683
 
@@ -2618,13 +2685,13 @@ class NodeBuilder {
2618
2685
 
2619
2686
  for ( const variable of vars ) {
2620
2687
 
2621
- snippet += `${ this.getVar( variable.type, variable.name ) }; `;
2688
+ snippets.push( `${ this.getVar( variable.type, variable.name, variable.count ) };` );
2622
2689
 
2623
2690
  }
2624
2691
 
2625
2692
  }
2626
2693
 
2627
- return snippet;
2694
+ return snippets.join( global ? '\n' : '\n\t' );
2628
2695
 
2629
2696
  }
2630
2697
 
@@ -2873,13 +2940,41 @@ class NodeBuilder {
2873
2940
  }
2874
2941
 
2875
2942
  /**
2876
- * Central build method which controls the build for the given object.
2877
- *
2878
- * @return {NodeBuilder} A reference to this node builder.
2943
+ * Prebuild the node builder.
2879
2944
  */
2880
- 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 >
2881
2962
 
2882
- const { object, material, renderer } = this;
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()`.' );
2972
+
2973
+ }
2974
+
2975
+ }
2976
+
2977
+ // < nodeMaterial >
2883
2978
 
2884
2979
  if ( material !== null ) {
2885
2980
 
@@ -2887,7 +2982,7 @@ class NodeBuilder {
2887
2982
 
2888
2983
  if ( nodeMaterial === null ) {
2889
2984
 
2890
- error( `NodeMaterial: Material "${ material.type }" is not compatible.` );
2985
+ error( `NodeBuilder: Material "${ material.type }" is not compatible.` );
2891
2986
 
2892
2987
  nodeMaterial = new NodeMaterial();
2893
2988
 
@@ -2901,6 +2996,77 @@ class NodeBuilder {
2901
2996
 
2902
2997
  }
2903
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
+
3010
+ // setup() -> stage 1: create possible new nodes and/or return an output reference node
3011
+ // analyze() -> stage 2: analyze nodes to possible optimization and validation
3012
+ // generate() -> stage 3: generate shader
3013
+
3014
+ for ( const buildStage of defaultBuildStages ) {
3015
+
3016
+ this.setBuildStage( buildStage );
3017
+
3018
+ if ( this.context.position && this.context.position.isNode ) {
3019
+
3020
+ this.flowNodeFromShaderStage( 'vertex', this.context.position );
3021
+
3022
+ }
3023
+
3024
+ for ( const shaderStage of shaderStages ) {
3025
+
3026
+ this.setShaderStage( shaderStage );
3027
+
3028
+ const flowNodes = this.flowNodes[ shaderStage ];
3029
+
3030
+ for ( const node of flowNodes ) {
3031
+
3032
+ if ( buildStage === 'generate' ) {
3033
+
3034
+ this.flowNode( node );
3035
+
3036
+ } else {
3037
+
3038
+ node.build( this );
3039
+
3040
+ }
3041
+
3042
+ }
3043
+
3044
+ }
3045
+
3046
+ }
3047
+
3048
+ this.setBuildStage( null );
3049
+ this.setShaderStage( null );
3050
+
3051
+ // stage 4: build code for a specific output
3052
+
3053
+ this.buildCode();
3054
+ this.buildUpdateNodes();
3055
+
3056
+ return this;
3057
+
3058
+ }
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
+
2904
3070
  // setup() -> stage 1: create possible new nodes and/or return an output reference node
2905
3071
  // analyze() -> stage 2: analyze nodes to possible optimization and validation
2906
3072
  // generate() -> stage 3: generate shader
@@ -2909,9 +3075,9 @@ class NodeBuilder {
2909
3075
 
2910
3076
  this.setBuildStage( buildStage );
2911
3077
 
2912
- if ( this.context.vertex && this.context.vertex.isNode ) {
3078
+ if ( this.context.position && this.context.position.isNode ) {
2913
3079
 
2914
- this.flowNodeFromShaderStage( 'vertex', this.context.vertex );
3080
+ this.flowNodeFromShaderStage( 'vertex', this.context.position );
2915
3081
 
2916
3082
  }
2917
3083
 
@@ -2935,6 +3101,9 @@ class NodeBuilder {
2935
3101
 
2936
3102
  }
2937
3103
 
3104
+ // Yield to main thread after each shader stage to prevent blocking
3105
+ await yieldToMain();
3106
+
2938
3107
  }
2939
3108
 
2940
3109
  }
@@ -2951,6 +3120,26 @@ class NodeBuilder {
2951
3120
 
2952
3121
  }
2953
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
+
2954
3143
  /**
2955
3144
  * Returns a uniform representation which is later used for UBO generation and rendering.
2956
3145
  *
@@ -2960,16 +3149,31 @@ class NodeBuilder {
2960
3149
  */
2961
3150
  getNodeUniform( uniformNode, type ) {
2962
3151
 
2963
- if ( type === 'float' || type === 'int' || type === 'uint' ) return new NumberNodeUniform( uniformNode );
2964
- if ( type === 'vec2' || type === 'ivec2' || type === 'uvec2' ) return new Vector2NodeUniform( uniformNode );
2965
- if ( type === 'vec3' || type === 'ivec3' || type === 'uvec3' ) return new Vector3NodeUniform( uniformNode );
2966
- if ( type === 'vec4' || type === 'ivec4' || type === 'uvec4' ) return new Vector4NodeUniform( uniformNode );
2967
- if ( type === 'color' ) return new ColorNodeUniform( uniformNode );
2968
- if ( type === 'mat2' ) return new Matrix2NodeUniform( uniformNode );
2969
- if ( type === 'mat3' ) return new Matrix3NodeUniform( uniformNode );
2970
- if ( type === 'mat4' ) return new Matrix4NodeUniform( uniformNode );
3152
+ const nodeData = this.getSharedDataFromNode( uniformNode );
3153
+
3154
+ let node = nodeData.cache;
2971
3155
 
2972
- throw new Error( `Uniform "${type}" not declared.` );
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;
3173
+
3174
+ }
3175
+
3176
+ return node;
2973
3177
 
2974
3178
  }
2975
3179
 
@@ -3076,6 +3280,20 @@ class NodeBuilder {
3076
3280
 
3077
3281
  }
3078
3282
 
3283
+ /**
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.
3288
+ */
3289
+ needsPreviousData() {
3290
+
3291
+ const mrt = this.renderer.getMRT();
3292
+
3293
+ return ( mrt && mrt.has( 'velocity' ) ) || getDataFromObject( this.object ).useVelocity === true;
3294
+
3295
+ }
3296
+
3079
3297
  }
3080
3298
 
3081
3299
  export default NodeBuilder;
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Custom error class for node-related errors, including stack trace information.
3
+ */
4
+ class NodeError extends Error {
5
+
6
+ constructor( message, stackTrace = null ) {
7
+
8
+ super( message );
9
+
10
+ /**
11
+ * The name of the error.
12
+ *
13
+ * @type {string}
14
+ */
15
+ this.name = 'NodeError';
16
+
17
+ /**
18
+ * The stack trace associated with the error.
19
+ *
20
+ * @type {?StackTrace}
21
+ */
22
+ this.stackTrace = stackTrace;
23
+
24
+ }
25
+
26
+ }
27
+
28
+ export default NodeError;
@@ -155,9 +155,13 @@ class NodeFrame {
155
155
 
156
156
  if ( nodeUpdateBeforeMap.frameId !== this.frameId ) {
157
157
 
158
- if ( node.updateBefore( this ) !== false ) {
158
+ const previousFrameId = nodeUpdateBeforeMap.frameId;
159
159
 
160
- nodeUpdateBeforeMap.frameId = this.frameId;
160
+ nodeUpdateBeforeMap.frameId = this.frameId;
161
+
162
+ if ( node.updateBefore( this ) === false ) {
163
+
164
+ nodeUpdateBeforeMap.frameId = previousFrameId;
161
165
 
162
166
  }
163
167
 
@@ -169,9 +173,13 @@ class NodeFrame {
169
173
 
170
174
  if ( nodeUpdateBeforeMap.renderId !== this.renderId ) {
171
175
 
172
- if ( node.updateBefore( this ) !== false ) {
176
+ const previousRenderId = nodeUpdateBeforeMap.renderId;
177
+
178
+ nodeUpdateBeforeMap.renderId = this.renderId;
179
+
180
+ if ( node.updateBefore( this ) === false ) {
173
181
 
174
- nodeUpdateBeforeMap.renderId = this.renderId;
182
+ nodeUpdateBeforeMap.renderId = previousRenderId;
175
183
 
176
184
  }
177
185
 
@@ -5,7 +5,9 @@ import { Matrix4 } from '../../math/Matrix4.js';
5
5
  import { Vector2 } from '../../math/Vector2.js';
6
6
  import { Vector3 } from '../../math/Vector3.js';
7
7
  import { Vector4 } from '../../math/Vector4.js';
8
+
8
9
  import { error } from '../../utils.js';
10
+ import StackTrace from '../core/StackTrace.js';
9
11
 
10
12
  // cyrb53 (c) 2018 bryc (github.com/bryc). License: Public domain. Attribution appreciated.
11
13
  // A fast and simple 64-bit (or 53-bit) string hash function with decent collision resistance.
@@ -16,7 +18,7 @@ function cyrb53( value, seed = 0 ) {
16
18
 
17
19
  let h1 = 0xdeadbeef ^ seed, h2 = 0x41c6ce57 ^ seed;
18
20
 
19
- if ( value instanceof Array ) {
21
+ if ( Array.isArray( value ) ) {
20
22
 
21
23
  for ( let i = 0, val; i < value.length; i ++ ) {
22
24
 
@@ -154,7 +156,7 @@ export function getLengthFromType( type ) {
154
156
  if ( /mat3/.test( type ) ) return 9;
155
157
  if ( /mat4/.test( type ) ) return 16;
156
158
 
157
- error( 'TSL: Unsupported type:', type );
159
+ error( `TSL: Unsupported type: ${ type }`, new StackTrace() );
158
160
 
159
161
  }
160
162
 
@@ -176,29 +178,29 @@ export function getMemoryLengthFromType( type ) {
176
178
  if ( /mat3/.test( type ) ) return 12;
177
179
  if ( /mat4/.test( type ) ) return 16;
178
180
 
179
- error( 'TSL: Unsupported type:', type );
181
+ error( `TSL: Unsupported type: ${ type }`, new StackTrace() );
180
182
 
181
183
  }
182
184
 
183
185
  /**
184
- * Returns the byte boundary for the given data type.
186
+ * Returns the alignment requirement for the given data type.
185
187
  *
186
188
  * @private
187
189
  * @method
188
190
  * @param {string} type - The data type.
189
- * @return {number} The byte boundary.
191
+ * @return {number} The alignment requirement in bytes.
190
192
  */
191
- export function getByteBoundaryFromType( type ) {
193
+ export function getAlignmentFromType( type ) {
192
194
 
193
195
  if ( /float|int|uint/.test( type ) ) return 4;
194
196
  if ( /vec2/.test( type ) ) return 8;
195
197
  if ( /vec3/.test( type ) ) return 16;
196
198
  if ( /vec4/.test( type ) ) return 16;
197
199
  if ( /mat2/.test( type ) ) return 8;
198
- if ( /mat3/.test( type ) ) return 48;
199
- if ( /mat4/.test( type ) ) return 64;
200
+ if ( /mat3/.test( type ) ) return 16;
201
+ if ( /mat4/.test( type ) ) return 16;
200
202
 
201
- error( 'TSL: Unsupported type:', type );
203
+ error( `TSL: Unsupported type: ${ type }`, new StackTrace() );
202
204
 
203
205
  }
204
206