super-three 0.171.0 → 0.173.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 (455) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +1 -1
  3. package/build/three.cjs +594 -427
  4. package/build/three.core.js +515 -81
  5. package/build/three.core.min.js +2 -2
  6. package/build/three.module.js +79 -350
  7. package/build/three.module.min.js +2 -2
  8. package/build/three.tsl.js +20 -7
  9. package/build/three.tsl.min.js +2 -2
  10. package/build/three.webgpu.js +29362 -3427
  11. package/build/three.webgpu.min.js +2 -2
  12. package/build/three.webgpu.nodes.js +29361 -3427
  13. package/build/three.webgpu.nodes.min.js +2 -2
  14. package/examples/jsm/Addons.js +0 -5
  15. package/examples/jsm/animation/CCDIKSolver.js +9 -7
  16. package/examples/jsm/capabilities/WebGPU.js +1 -1
  17. package/examples/jsm/controls/ArcballControls.js +48 -37
  18. package/examples/jsm/controls/OrbitControls.js +5 -4
  19. package/examples/jsm/csm/CSMShadowNode.js +16 -11
  20. package/examples/jsm/curves/NURBSCurve.js +1 -1
  21. package/examples/jsm/curves/NURBSUtils.js +3 -0
  22. package/examples/jsm/effects/OutlineEffect.js +1 -1
  23. package/examples/jsm/exporters/GLTFExporter.js +34 -29
  24. package/examples/jsm/exporters/KTX2Exporter.js +1 -1
  25. package/examples/jsm/exporters/PLYExporter.js +2 -2
  26. package/examples/jsm/geometries/TextGeometry.js +1 -12
  27. package/examples/jsm/helpers/TextureHelperGPU.js +15 -5
  28. package/examples/jsm/helpers/VertexNormalsHelper.js +2 -0
  29. package/examples/jsm/interactive/InteractiveGroup.js +108 -51
  30. package/examples/jsm/libs/demuxer_mp4.js +109 -0
  31. package/examples/jsm/lights/LightProbeGenerator.js +3 -3
  32. package/examples/jsm/lines/webgpu/LineSegments2.js +15 -6
  33. package/examples/jsm/loaders/3MFLoader.js +6 -3
  34. package/examples/jsm/loaders/BVHLoader.js +1 -1
  35. package/examples/jsm/loaders/ColladaLoader.js +5 -5
  36. package/examples/jsm/loaders/DDSLoader.js +42 -0
  37. package/examples/jsm/loaders/GCodeLoader.js +4 -2
  38. package/examples/jsm/loaders/GLTFLoader.js +22 -4
  39. package/examples/jsm/loaders/KTX2Loader.js +6 -1
  40. package/examples/jsm/loaders/KTXLoader.js +4 -4
  41. package/examples/jsm/loaders/LDrawLoader.js +1 -1
  42. package/examples/jsm/loaders/LottieLoader.js +1 -1
  43. package/examples/jsm/loaders/MTLLoader.js +1 -0
  44. package/examples/jsm/loaders/NRRDLoader.js +1 -1
  45. package/examples/jsm/loaders/PLYLoader.js +7 -7
  46. package/examples/jsm/loaders/PVRLoader.js +1 -1
  47. package/examples/jsm/loaders/SVGLoader.js +2 -2
  48. package/examples/jsm/loaders/TDSLoader.js +1 -2
  49. package/examples/jsm/loaders/VRMLLoader.js +7 -7
  50. package/examples/jsm/loaders/lwo/IFFParser.js +4 -4
  51. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +1 -1
  52. package/examples/jsm/materials/MeshGouraudMaterial.js +2 -0
  53. package/examples/jsm/math/ConvexHull.js +1 -1
  54. package/examples/jsm/math/OBB.js +17 -0
  55. package/examples/jsm/misc/GPUComputationRenderer.js +6 -7
  56. package/examples/jsm/misc/ProgressiveLightMap.js +4 -3
  57. package/examples/jsm/misc/ProgressiveLightMapGPU.js +14 -13
  58. package/examples/jsm/misc/Volume.js +27 -17
  59. package/examples/jsm/misc/VolumeSlice.js +7 -5
  60. package/examples/jsm/modifiers/CurveModifier.js +10 -8
  61. package/examples/jsm/modifiers/CurveModifierGPU.js +9 -7
  62. package/examples/jsm/modifiers/SimplifyModifier.js +2 -2
  63. package/examples/jsm/objects/GroundedSkybox.js +4 -4
  64. package/examples/jsm/objects/Sky.js +2 -2
  65. package/examples/jsm/objects/SkyMesh.js +3 -3
  66. package/examples/jsm/objects/Water2.js +1 -1
  67. package/examples/jsm/objects/Water2Mesh.js +2 -2
  68. package/examples/jsm/objects/WaterMesh.js +29 -24
  69. package/examples/jsm/physics/JoltPhysics.js +7 -7
  70. package/examples/jsm/physics/RapierPhysics.js +4 -4
  71. package/examples/jsm/postprocessing/BloomPass.js +2 -2
  72. package/examples/jsm/postprocessing/EffectComposer.js +1 -2
  73. package/examples/jsm/postprocessing/OutlinePass.js +4 -4
  74. package/examples/jsm/postprocessing/OutputPass.js +2 -0
  75. package/examples/jsm/postprocessing/SAOPass.js +1 -2
  76. package/examples/jsm/postprocessing/SMAAPass.js +1 -3
  77. package/examples/jsm/postprocessing/SSAOPass.js +2 -4
  78. package/examples/jsm/postprocessing/SSRPass.js +2 -4
  79. package/examples/jsm/postprocessing/UnrealBloomPass.js +2 -2
  80. package/examples/jsm/renderers/SVGRenderer.js +6 -4
  81. package/examples/jsm/shaders/BokehShader2.js +1 -1
  82. package/examples/jsm/shaders/GodRaysShader.js +3 -3
  83. package/examples/jsm/shaders/OutputShader.js +5 -1
  84. package/examples/jsm/shaders/SobelOperatorShader.js +1 -1
  85. package/examples/jsm/transpiler/GLSLDecoder.js +2 -2
  86. package/examples/jsm/transpiler/TSLEncoder.js +2 -0
  87. package/examples/jsm/tsl/display/AfterImageNode.js +93 -4
  88. package/examples/jsm/tsl/display/AnaglyphPassNode.js +46 -2
  89. package/examples/jsm/tsl/display/AnamorphicNode.js +118 -5
  90. package/examples/jsm/tsl/display/BleachBypass.js +10 -0
  91. package/examples/jsm/tsl/display/BloomNode.js +233 -26
  92. package/examples/jsm/tsl/display/DenoiseNode.js +141 -25
  93. package/examples/jsm/tsl/display/DepthOfFieldNode.js +80 -1
  94. package/examples/jsm/tsl/display/DotScreenNode.js +50 -5
  95. package/examples/jsm/tsl/display/FXAANode.js +52 -3
  96. package/examples/jsm/tsl/display/FilmNode.js +47 -1
  97. package/examples/jsm/tsl/display/GTAONode.js +210 -14
  98. package/examples/jsm/tsl/display/GaussianBlurNode.js +152 -8
  99. package/examples/jsm/tsl/display/LensflareNode.js +131 -13
  100. package/examples/jsm/tsl/display/Lut3DNode.js +55 -1
  101. package/examples/jsm/tsl/display/MotionBlur.js +12 -2
  102. package/examples/jsm/tsl/display/OutlineNode.js +343 -26
  103. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +36 -2
  104. package/examples/jsm/tsl/display/PixelationPassNode.js +142 -9
  105. package/examples/jsm/tsl/display/RGBShiftNode.js +49 -2
  106. package/examples/jsm/tsl/display/SMAANode.js +187 -46
  107. package/examples/jsm/tsl/display/SSAAPassNode.js +110 -25
  108. package/examples/jsm/tsl/display/SSRNode.js +194 -21
  109. package/examples/jsm/tsl/display/Sepia.js +9 -0
  110. package/examples/jsm/tsl/display/SobelOperatorNode.js +54 -4
  111. package/examples/jsm/tsl/display/StereoCompositePassNode.js +79 -3
  112. package/examples/jsm/tsl/display/StereoPassNode.js +41 -3
  113. package/examples/jsm/tsl/display/TRAAPassNode.js +116 -21
  114. package/examples/jsm/tsl/display/TransitionNode.js +71 -6
  115. package/examples/jsm/tsl/display/hashBlur.js +14 -3
  116. package/examples/jsm/tsl/lighting/TiledLightsNode.js +40 -34
  117. package/examples/jsm/utils/BufferGeometryUtils.js +1 -1
  118. package/examples/jsm/utils/CameraUtils.js +4 -1
  119. package/examples/jsm/utils/GeometryUtils.js +22 -19
  120. package/examples/jsm/utils/SceneUtils.js +2 -2
  121. package/examples/jsm/webxr/XRControllerModelFactory.js +6 -1
  122. package/examples/jsm/webxr/XREstimatedLight.js +1 -1
  123. package/package.json +8 -3
  124. package/src/Three.Core.js +4 -0
  125. package/src/Three.Legacy.js +0 -21
  126. package/src/Three.TSL.js +18 -5
  127. package/src/Three.WebGPU.Nodes.js +2 -2
  128. package/src/Three.WebGPU.js +2 -2
  129. package/src/animation/PropertyBinding.js +2 -2
  130. package/src/cameras/ArrayCamera.js +1 -0
  131. package/src/cameras/PerspectiveCamera.js +18 -2
  132. package/src/constants.js +6 -1
  133. package/src/core/BufferAttribute.js +4 -0
  134. package/src/core/EventDispatcher.js +8 -6
  135. package/src/core/RenderTarget.js +18 -0
  136. package/src/core/RenderTarget3D.js +22 -0
  137. package/src/core/RenderTargetArray.js +22 -0
  138. package/src/extras/Earcut.js +1 -1
  139. package/src/extras/ImageUtils.js +1 -11
  140. package/src/extras/PMREMGenerator.js +20 -0
  141. package/src/extras/TextureUtils.js +6 -0
  142. package/src/helpers/CameraHelper.js +16 -13
  143. package/src/loaders/nodes/NodeLoader.js +59 -0
  144. package/src/loaders/nodes/NodeMaterialLoader.js +45 -0
  145. package/src/loaders/nodes/NodeObjectLoader.js +61 -0
  146. package/src/materials/nodes/Line2NodeMaterial.js +128 -34
  147. package/src/materials/nodes/LineBasicNodeMaterial.js +17 -2
  148. package/src/materials/nodes/LineDashedNodeMaterial.js +78 -5
  149. package/src/materials/nodes/MeshBasicNodeMaterial.js +56 -0
  150. package/src/materials/nodes/MeshLambertNodeMaterial.js +35 -0
  151. package/src/materials/nodes/MeshMatcapNodeMaterial.js +22 -2
  152. package/src/materials/nodes/MeshNormalNodeMaterial.js +21 -2
  153. package/src/materials/nodes/MeshPhongNodeMaterial.js +64 -1
  154. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +269 -0
  155. package/src/materials/nodes/MeshSSSNodeMaterial.js +97 -6
  156. package/src/materials/nodes/MeshStandardNodeMaterial.js +78 -0
  157. package/src/materials/nodes/MeshToonNodeMaterial.js +28 -0
  158. package/src/materials/nodes/NodeMaterial.js +476 -23
  159. package/src/materials/nodes/NodeMaterials.js +0 -1
  160. package/src/materials/nodes/PointsNodeMaterial.js +121 -10
  161. package/src/materials/nodes/ShadowNodeMaterial.js +29 -0
  162. package/src/materials/nodes/SpriteNodeMaterial.js +78 -20
  163. package/src/materials/nodes/VolumeNodeMaterial.js +80 -4
  164. package/src/materials/nodes/manager/NodeMaterialObserver.js +95 -0
  165. package/src/nodes/Nodes.js +5 -6
  166. package/src/nodes/TSL.js +6 -3
  167. package/src/nodes/accessors/AccessorsUtils.js +27 -0
  168. package/src/nodes/accessors/Arrays.js +47 -6
  169. package/src/nodes/accessors/BatchNode.js +42 -6
  170. package/src/nodes/accessors/Bitangent.js +37 -0
  171. package/src/nodes/accessors/BufferAttributeNode.js +178 -5
  172. package/src/nodes/accessors/BufferNode.js +63 -0
  173. package/src/nodes/accessors/BuiltinNode.js +38 -0
  174. package/src/nodes/accessors/Camera.js +113 -3
  175. package/src/nodes/accessors/ClippingNode.js +71 -2
  176. package/src/nodes/accessors/CubeTextureNode.js +64 -0
  177. package/src/nodes/accessors/InstanceNode.js +85 -2
  178. package/src/nodes/accessors/InstancedMeshNode.js +28 -3
  179. package/src/nodes/accessors/Lights.js +50 -1
  180. package/src/nodes/accessors/MaterialNode.js +306 -12
  181. package/src/nodes/accessors/MaterialProperties.js +7 -0
  182. package/src/nodes/accessors/MaterialReferenceNode.js +53 -13
  183. package/src/nodes/accessors/ModelNode.js +100 -5
  184. package/src/nodes/accessors/ModelViewProjectionNode.js +10 -38
  185. package/src/nodes/accessors/MorphNode.js +48 -4
  186. package/src/nodes/accessors/Normal.js +65 -5
  187. package/src/nodes/accessors/Object3DNode.js +101 -1
  188. package/src/nodes/accessors/PointUVNode.js +26 -0
  189. package/src/nodes/accessors/Position.js +56 -7
  190. package/src/nodes/accessors/ReferenceBaseNode.js +186 -0
  191. package/src/nodes/accessors/ReferenceNode.js +201 -2
  192. package/src/nodes/accessors/ReflectVector.js +24 -0
  193. package/src/nodes/accessors/RendererReferenceNode.js +46 -1
  194. package/src/nodes/accessors/SceneNode.js +54 -0
  195. package/src/nodes/accessors/SkinningNode.js +127 -1
  196. package/src/nodes/accessors/StorageBufferNode.js +209 -8
  197. package/src/nodes/accessors/StorageTextureNode.js +118 -0
  198. package/src/nodes/accessors/Tangent.js +38 -2
  199. package/src/nodes/accessors/Texture3DNode.js +91 -7
  200. package/src/nodes/accessors/TextureBicubic.js +12 -2
  201. package/src/nodes/accessors/TextureNode.js +316 -10
  202. package/src/nodes/accessors/TextureSizeNode.js +42 -0
  203. package/src/nodes/accessors/UV.js +10 -1
  204. package/src/nodes/accessors/UniformArrayNode.js +231 -25
  205. package/src/nodes/accessors/UserDataNode.js +46 -0
  206. package/src/nodes/accessors/VelocityNode.js +80 -0
  207. package/src/nodes/accessors/VertexColorNode.js +39 -2
  208. package/src/nodes/code/CodeNode.js +95 -1
  209. package/src/nodes/code/ExpressionNode.js +28 -0
  210. package/src/nodes/code/FunctionCallNode.js +37 -0
  211. package/src/nodes/code/FunctionNode.js +45 -0
  212. package/src/nodes/code/ScriptableNode.js +223 -1
  213. package/src/nodes/code/ScriptableValueNode.js +85 -1
  214. package/src/nodes/core/ArrayNode.js +125 -0
  215. package/src/nodes/core/AssignNode.js +48 -2
  216. package/src/nodes/core/AttributeNode.js +43 -0
  217. package/src/nodes/core/BypassNode.js +47 -2
  218. package/src/nodes/core/CacheNode.js +53 -2
  219. package/src/nodes/core/ConstNode.js +32 -0
  220. package/src/nodes/core/ContextNode.js +65 -0
  221. package/src/nodes/core/IndexNode.js +68 -7
  222. package/src/nodes/core/InputNode.js +48 -0
  223. package/src/nodes/core/LightingModel.js +60 -0
  224. package/src/nodes/core/MRTNode.js +66 -0
  225. package/src/nodes/core/Node.js +350 -12
  226. package/src/nodes/core/NodeAttribute.js +38 -0
  227. package/src/nodes/core/NodeBuilder.js +1166 -26
  228. package/src/nodes/core/NodeCache.js +41 -2
  229. package/src/nodes/core/NodeCode.js +31 -0
  230. package/src/nodes/core/NodeFrame.js +123 -2
  231. package/src/nodes/core/NodeFunction.js +46 -0
  232. package/src/nodes/core/NodeFunctionInput.js +44 -0
  233. package/src/nodes/core/NodeParser.js +11 -0
  234. package/src/nodes/core/NodeUniform.js +52 -0
  235. package/src/nodes/core/NodeUtils.js +152 -1
  236. package/src/nodes/core/NodeVar.js +47 -1
  237. package/src/nodes/core/NodeVarying.js +28 -0
  238. package/src/nodes/core/OutputStructNode.js +51 -10
  239. package/src/nodes/core/ParameterNode.js +28 -0
  240. package/src/nodes/core/PropertyNode.js +232 -0
  241. package/src/nodes/core/StackNode.js +98 -1
  242. package/src/nodes/core/StructNode.js +121 -0
  243. package/src/nodes/core/StructType.js +13 -0
  244. package/src/nodes/core/StructTypeNode.js +105 -6
  245. package/src/nodes/core/TempNode.js +31 -5
  246. package/src/nodes/core/UniformGroupNode.js +82 -7
  247. package/src/nodes/core/UniformNode.js +66 -0
  248. package/src/nodes/core/VarNode.js +146 -7
  249. package/src/nodes/core/VaryingNode.js +100 -3
  250. package/src/nodes/core/constants.js +36 -0
  251. package/src/nodes/display/BlendModes.js +88 -1
  252. package/src/nodes/display/BumpMapNode.js +37 -0
  253. package/src/nodes/display/ColorAdjustment.js +53 -11
  254. package/src/nodes/display/ColorSpaceFunctions.js +16 -0
  255. package/src/nodes/display/ColorSpaceNode.js +82 -0
  256. package/src/nodes/display/FrontFacingNode.js +29 -0
  257. package/src/nodes/display/NormalMapNode.js +43 -0
  258. package/src/nodes/display/PassNode.js +300 -7
  259. package/src/nodes/display/PosterizeNode.js +33 -0
  260. package/src/nodes/display/RenderOutputNode.js +66 -1
  261. package/src/nodes/display/ScreenNode.js +96 -0
  262. package/src/nodes/display/ToneMappingFunctions.js +58 -10
  263. package/src/nodes/display/ToneMappingNode.js +55 -2
  264. package/src/nodes/display/ToonOutlinePassNode.js +73 -0
  265. package/src/nodes/display/ViewportDepthNode.js +122 -8
  266. package/src/nodes/display/ViewportDepthTextureNode.js +23 -0
  267. package/src/nodes/display/ViewportSharedTextureNode.js +23 -0
  268. package/src/nodes/display/ViewportTextureNode.js +57 -0
  269. package/src/nodes/fog/Fog.js +110 -0
  270. package/src/nodes/functions/BasicLightingModel.js +24 -0
  271. package/src/nodes/functions/PhongLightingModel.js +34 -2
  272. package/src/nodes/functions/PhysicalLightingModel.js +167 -8
  273. package/src/nodes/functions/ShadowMaskModel.js +23 -0
  274. package/src/nodes/functions/ToonLightingModel.js +20 -0
  275. package/src/nodes/functions/material/getAlphaHashThreshold.js +1 -3
  276. package/src/nodes/functions/material/getParallaxCorrectNormal.js +16 -1
  277. package/src/nodes/geometry/RangeNode.js +54 -2
  278. package/src/nodes/gpgpu/AtomicFunctionNode.js +174 -2
  279. package/src/nodes/gpgpu/BarrierNode.js +47 -0
  280. package/src/nodes/gpgpu/ComputeBuiltinNode.js +134 -0
  281. package/src/nodes/gpgpu/ComputeNode.js +106 -2
  282. package/src/nodes/gpgpu/WorkgroupInfoNode.js +115 -6
  283. package/src/nodes/lighting/AONode.js +18 -0
  284. package/src/nodes/lighting/AmbientLightNode.js +10 -0
  285. package/src/nodes/lighting/AnalyticLightNode.js +97 -2
  286. package/src/nodes/lighting/BasicEnvironmentNode.js +19 -0
  287. package/src/nodes/lighting/BasicLightMapNode.js +17 -0
  288. package/src/nodes/lighting/DirectionalLightNode.js +10 -0
  289. package/src/nodes/lighting/EnvironmentNode.js +18 -0
  290. package/src/nodes/lighting/HemisphereLightNode.js +31 -0
  291. package/src/nodes/lighting/IESSpotLightNode.js +11 -0
  292. package/src/nodes/lighting/IrradianceNode.js +17 -0
  293. package/src/nodes/lighting/LightProbeNode.js +20 -0
  294. package/src/nodes/lighting/LightUtils.js +12 -0
  295. package/src/nodes/lighting/LightingContextNode.js +48 -0
  296. package/src/nodes/lighting/LightingNode.js +15 -6
  297. package/src/nodes/lighting/LightsNode.js +132 -1
  298. package/src/nodes/lighting/PointLightNode.js +32 -1
  299. package/src/nodes/lighting/PointShadowNode.js +54 -1
  300. package/src/nodes/lighting/RectAreaLightNode.js +44 -6
  301. package/src/nodes/lighting/ShadowBaseNode.js +93 -0
  302. package/src/nodes/lighting/ShadowNode.js +241 -35
  303. package/src/nodes/lighting/SpotLightNode.js +43 -0
  304. package/src/nodes/math/ConditionalNode.js +78 -4
  305. package/src/nodes/math/Hash.js +9 -0
  306. package/src/nodes/math/MathNode.js +627 -11
  307. package/src/nodes/math/MathUtils.js +45 -1
  308. package/src/nodes/math/OperatorNode.js +329 -18
  309. package/src/nodes/math/TriNoise3D.js +18 -7
  310. package/src/nodes/parsers/GLSLNodeFunction.js +16 -0
  311. package/src/nodes/parsers/GLSLNodeParser.js +11 -0
  312. package/src/nodes/pmrem/PMREMNode.js +133 -0
  313. package/src/nodes/pmrem/PMREMUtils.js +2 -2
  314. package/src/nodes/procedural/Checker.js +9 -0
  315. package/src/nodes/shapes/Shapes.js +33 -0
  316. package/src/nodes/tsl/TSLBase.js +3 -2
  317. package/src/nodes/tsl/TSLCore.js +22 -2
  318. package/src/nodes/utils/ArrayElementNode.js +39 -3
  319. package/src/nodes/utils/ConvertNode.js +31 -0
  320. package/src/nodes/utils/CubeMapNode.js +78 -0
  321. package/src/nodes/utils/Discard.js +16 -0
  322. package/src/nodes/utils/EquirectUVNode.js +31 -1
  323. package/src/nodes/utils/FlipNode.js +38 -0
  324. package/src/nodes/utils/FunctionOverloadingNode.js +53 -1
  325. package/src/nodes/utils/JoinNode.js +25 -0
  326. package/src/nodes/utils/LoopNode.js +82 -2
  327. package/src/nodes/utils/MatcapUVNode.js +17 -0
  328. package/src/nodes/utils/MaxMipLevelNode.js +49 -0
  329. package/src/nodes/utils/MemberNode.js +68 -0
  330. package/src/nodes/utils/Oscillators.js +33 -0
  331. package/src/nodes/utils/Packing.js +17 -0
  332. package/src/nodes/utils/PostProcessingUtils.js +28 -23
  333. package/src/nodes/utils/RTTNode.js +123 -2
  334. package/src/nodes/utils/ReflectorNode.js +174 -4
  335. package/src/nodes/utils/RemapNode.js +79 -0
  336. package/src/nodes/utils/RotateNode.js +41 -0
  337. package/src/nodes/utils/SetNode.js +44 -1
  338. package/src/nodes/utils/SplitNode.js +55 -3
  339. package/src/nodes/utils/SpriteSheetUVNode.js +46 -0
  340. package/src/nodes/utils/SpriteUtils.js +17 -0
  341. package/src/nodes/utils/StorageArrayElementNode.js +54 -0
  342. package/src/nodes/utils/Timer.js +40 -0
  343. package/src/nodes/utils/TriplanarTexturesNode.js +84 -0
  344. package/src/nodes/utils/UVUtils.js +20 -0
  345. package/src/nodes/utils/ViewportUtils.js +13 -0
  346. package/src/objects/BatchedMesh.js +2 -3
  347. package/src/objects/ClippingGroup.js +49 -0
  348. package/src/objects/Line.js +6 -6
  349. package/src/renderers/WebGLRenderer.js +30 -4
  350. package/src/renderers/common/Animation.js +85 -0
  351. package/src/renderers/common/Attributes.js +36 -0
  352. package/src/renderers/common/Backend.js +502 -44
  353. package/src/renderers/common/Background.js +48 -1
  354. package/src/renderers/common/BindGroup.js +43 -0
  355. package/src/renderers/common/Binding.js +35 -0
  356. package/src/renderers/common/Bindings.js +93 -1
  357. package/src/renderers/common/Buffer.js +49 -0
  358. package/src/renderers/common/BufferUtils.js +27 -0
  359. package/src/renderers/common/BundleGroup.js +57 -0
  360. package/src/renderers/common/ChainMap.js +45 -6
  361. package/src/renderers/common/ClippingContext.js +108 -15
  362. package/src/renderers/common/Color4.js +40 -0
  363. package/src/renderers/common/ComputePipeline.js +24 -0
  364. package/src/renderers/common/CubeRenderTarget.js +13 -0
  365. package/src/renderers/common/DataMap.js +37 -1
  366. package/src/renderers/common/Geometries.js +91 -14
  367. package/src/renderers/common/IndirectStorageBufferAttribute.js +25 -2
  368. package/src/renderers/common/Info.js +78 -35
  369. package/src/renderers/common/Lighting.js +34 -6
  370. package/src/renderers/common/Pipeline.js +22 -0
  371. package/src/renderers/common/Pipelines.js +148 -5
  372. package/src/renderers/common/PostProcessing.js +99 -11
  373. package/src/renderers/common/ProgrammableStage.js +60 -2
  374. package/src/renderers/common/QuadMesh.js +54 -5
  375. package/src/renderers/common/RenderBundle.js +14 -8
  376. package/src/renderers/common/RenderBundles.js +39 -10
  377. package/src/renderers/common/RenderContext.js +201 -2
  378. package/src/renderers/common/RenderContexts.js +59 -6
  379. package/src/renderers/common/RenderList.js +178 -0
  380. package/src/renderers/common/RenderLists.js +40 -3
  381. package/src/renderers/common/RenderObject.js +400 -17
  382. package/src/renderers/common/RenderObjects.js +103 -7
  383. package/src/renderers/common/RenderPipeline.js +24 -0
  384. package/src/renderers/common/Renderer.js +1170 -86
  385. package/src/renderers/common/RendererUtils.js +193 -0
  386. package/src/renderers/common/SampledTexture.js +120 -0
  387. package/src/renderers/common/Sampler.js +30 -0
  388. package/src/renderers/common/StorageBuffer.js +24 -0
  389. package/src/renderers/common/StorageBufferAttribute.js +31 -2
  390. package/src/renderers/common/StorageInstancedBufferAttribute.js +31 -2
  391. package/src/renderers/common/StorageTexture.js +38 -0
  392. package/src/renderers/common/Textures.js +97 -7
  393. package/src/renderers/common/TimestampQueryPool.js +39 -0
  394. package/src/renderers/common/Uniform.js +225 -3
  395. package/src/renderers/common/UniformBuffer.js +19 -0
  396. package/src/renderers/common/UniformsGroup.js +141 -2
  397. package/src/renderers/common/XRManager.js +1193 -0
  398. package/src/renderers/common/XRRenderTarget.js +74 -0
  399. package/src/renderers/common/extras/PMREMGenerator.js +76 -10
  400. package/src/renderers/common/nodes/NodeBuilderState.js +99 -5
  401. package/src/renderers/common/nodes/NodeLibrary.js +89 -0
  402. package/src/renderers/common/nodes/NodeSampledTexture.js +90 -2
  403. package/src/renderers/common/nodes/NodeSampler.js +28 -0
  404. package/src/renderers/common/nodes/NodeStorageBuffer.js +35 -0
  405. package/src/renderers/common/nodes/NodeUniform.js +243 -2
  406. package/src/renderers/common/nodes/NodeUniformBuffer.js +29 -0
  407. package/src/renderers/common/nodes/NodeUniformsGroup.js +31 -18
  408. package/src/renderers/common/nodes/Nodes.js +352 -78
  409. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +2 -2
  410. package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +7 -7
  411. package/src/renderers/webgl/WebGLBackground.js +4 -0
  412. package/src/renderers/webgl-fallback/WebGLBackend.js +819 -116
  413. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +347 -18
  414. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +58 -1
  415. package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +28 -0
  416. package/src/renderers/webgl-fallback/utils/WebGLExtensions.js +45 -0
  417. package/src/renderers/webgl-fallback/utils/WebGLState.js +323 -11
  418. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +168 -22
  419. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +359 -0
  420. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +43 -0
  421. package/src/renderers/webgpu/WebGPUBackend.js +578 -164
  422. package/src/renderers/webgpu/WebGPURenderer.Nodes.js +36 -0
  423. package/src/renderers/webgpu/WebGPURenderer.js +36 -0
  424. package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +20 -8
  425. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +21 -8
  426. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +674 -52
  427. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +17 -0
  428. package/src/renderers/webgpu/nodes/WGSLNodeParser.js +11 -0
  429. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +95 -14
  430. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +94 -1
  431. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +102 -3
  432. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +98 -1
  433. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +262 -18
  434. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +274 -0
  435. package/src/renderers/webgpu/utils/WebGPUUtils.js +116 -4
  436. package/src/renderers/webxr/WebXRDepthSensing.js +1 -1
  437. package/src/renderers/webxr/WebXRManager.js +19 -2
  438. package/src/textures/Data3DTexture.js +2 -2
  439. package/src/textures/Texture.js +4 -0
  440. package/src/textures/VideoFrameTexture.js +35 -0
  441. package/examples/jsm/animation/MMDAnimationHelper.js +0 -1209
  442. package/examples/jsm/animation/MMDPhysics.js +0 -1408
  443. package/examples/jsm/exporters/MMDExporter.js +0 -223
  444. package/examples/jsm/geometries/InstancedPointsGeometry.js +0 -176
  445. package/examples/jsm/libs/mmdparser.module.js +0 -11530
  446. package/examples/jsm/loaders/MMDLoader.js +0 -2298
  447. package/examples/jsm/objects/InstancedPoints.js +0 -19
  448. package/examples/jsm/shaders/MMDToonShader.js +0 -134
  449. package/src/materials/nodes/InstancedPointsNodeMaterial.js +0 -156
  450. package/src/nodes/accessors/InstancedPointsMaterialNode.js +0 -24
  451. package/src/nodes/core/UniformGroup.js +0 -13
  452. package/src/nodes/fog/FogExp2Node.js +0 -35
  453. package/src/nodes/fog/FogNode.js +0 -50
  454. package/src/nodes/fog/FogRangeNode.js +0 -36
  455. package/src/renderers/common/PostProcessingUtils.js +0 -86
@@ -1,5 +1,41 @@
1
+
1
2
  import Node from './Node.js';
3
+ import { getLengthFromType } from './NodeUtils.js';
4
+
5
+ /** @module StructTypeNode **/
6
+
7
+ /**
8
+ * Generates a layout for struct members.
9
+ * This function takes an object representing struct members and returns an array of member layouts.
10
+ * Each member layout includes the member's name, type, and whether it is atomic.
11
+ *
12
+ * @param {Object.<string, string|Object>} members - An object where keys are member names and values are either types (as strings) or objects with type and atomic properties.
13
+ * @returns {Array.<{name: string, type: string, atomic: boolean}>} An array of member layouts.
14
+ */
15
+ function getMembersLayout( members ) {
16
+
17
+ return Object.entries( members ).map( ( [ name, value ] ) => {
18
+
19
+ if ( typeof value === 'string' ) {
20
+
21
+ return { name, type: value, atomic: false };
22
+
23
+ }
24
+
25
+ return { name, type: value.type, atomic: value.atomic || false };
2
26
 
27
+ } );
28
+
29
+ }
30
+
31
+ /**
32
+ * Represents a struct type node in the node-based system.
33
+ * This class is used to define and manage the layout and types of struct members.
34
+ * It extends the base Node class and provides methods to get the length of the struct,
35
+ * retrieve member types, and generate the struct type for a builder.
36
+ *
37
+ * @augments Node
38
+ */
3
39
  class StructTypeNode extends Node {
4
40
 
5
41
  static get type() {
@@ -8,18 +44,81 @@ class StructTypeNode extends Node {
8
44
 
9
45
  }
10
46
 
11
- constructor( types ) {
47
+ /**
48
+ * Creates an instance of StructTypeNode.
49
+ *
50
+ * @param {Object} membersLayout - The layout of the members for the struct.
51
+ * @param {string} [name=null] - The optional name of the struct.
52
+ */
53
+ constructor( membersLayout, name = null ) {
54
+
55
+ super( 'struct' );
56
+
57
+ /**
58
+ * The layout of the members for the struct
59
+ *
60
+ * @type {Array.<{name: string, type: string, atomic: boolean}>}
61
+ */
62
+ this.membersLayout = getMembersLayout( membersLayout );
63
+
64
+ /**
65
+ * The name of the struct.
66
+ *
67
+ * @type {String}
68
+ * @default null
69
+ */
70
+ this.name = name;
71
+
72
+ /**
73
+ * This flag can be used for type testing.
74
+ *
75
+ * @type {Boolean}
76
+ * @readonly
77
+ * @default true
78
+ */
79
+ this.isStructLayoutNode = true;
80
+
81
+ }
82
+
83
+ /**
84
+ * Returns the length of the struct.
85
+ * The length is calculated by summing the lengths of the struct's members.
86
+ *
87
+ * @returns {Number} The length of the struct.
88
+ */
89
+ getLength() {
90
+
91
+ let length = 0;
92
+
93
+ for ( const member of this.membersLayout ) {
94
+
95
+ length += getLengthFromType( member.type );
96
+
97
+ }
98
+
99
+ return length;
100
+
101
+ }
102
+
103
+ getMemberType( builder, name ) {
104
+
105
+ const member = this.membersLayout.find( m => m.name === name );
106
+
107
+ return member ? member.type : 'void';
108
+
109
+ }
110
+
111
+ getNodeType( builder ) {
12
112
 
13
- super();
113
+ const structType = builder.getStructTypeFromNode( this, this.membersLayout, this.name );
14
114
 
15
- this.types = types;
16
- this.isStructTypeNode = true;
115
+ return structType.name;
17
116
 
18
117
  }
19
118
 
20
- getMemberTypes() {
119
+ generate( builder ) {
21
120
 
22
- return this.types;
121
+ return this.getNodeType( builder );
23
122
 
24
123
  }
25
124
 
@@ -1,5 +1,13 @@
1
1
  import Node from './Node.js';
2
2
 
3
+ /**
4
+ * This module uses cache management to create temporary variables
5
+ * if the node is used more than once to prevent duplicate calculations.
6
+ *
7
+ * The class acts as a base class for many other nodes types.
8
+ *
9
+ * @augments Node
10
+ */
3
11
  class TempNode extends Node {
4
12
 
5
13
  static get type() {
@@ -8,14 +16,32 @@ class TempNode extends Node {
8
16
 
9
17
  }
10
18
 
11
- constructor( type ) {
12
-
13
- super( type );
14
-
19
+ /**
20
+ * Constructs a temp node.
21
+ *
22
+ * @param {String?} nodeType - The node type.
23
+ */
24
+ constructor( nodeType = null ) {
25
+
26
+ super( nodeType );
27
+
28
+ /**
29
+ * This flag can be used for type testing.
30
+ *
31
+ * @type {Boolean}
32
+ * @readonly
33
+ * @default true
34
+ */
15
35
  this.isTempNode = true;
16
36
 
17
37
  }
18
38
 
39
+ /**
40
+ * Whether this node is used more than once in context of other nodes.
41
+ *
42
+ * @param {NodeBuilder} builder - The node builder.
43
+ * @return {Boolean} A flag that indicates if there is more than one dependency to other nodes.
44
+ */
19
45
  hasDependencies( builder ) {
20
46
 
21
47
  return builder.getDataFromNode( this ).usageCount > 1;
@@ -42,7 +68,7 @@ class TempNode extends Node {
42
68
  const nodeVar = builder.getVarFromNode( this, null, type );
43
69
  const propertyName = builder.getPropertyName( nodeVar );
44
70
 
45
- builder.addLineFlowCode( `${propertyName} = ${snippet}`, this );
71
+ builder.addLineFlowCode( `${ propertyName } = ${ snippet }`, this );
46
72
 
47
73
  nodeData.snippet = snippet;
48
74
  nodeData.propertyName = propertyName;
@@ -1,5 +1,20 @@
1
1
  import Node from './Node.js';
2
2
 
3
+ /** @module UniformGroupNode **/
4
+
5
+ /**
6
+ * This node can be used to group single instances of {@link UniformNode}
7
+ * and manage them as a uniform buffer.
8
+ *
9
+ * In most cases, the predefined nodes `objectGroup`, `renderGroup` and `frameGroup`
10
+ * will be used when defining the {@link UniformNode#groupNode} property.
11
+ *
12
+ * - `objectGroup`: Uniform buffer per object.
13
+ * - `renderGroup`: Shared uniform buffer, updated once per render call.
14
+ * - `frameGroup`: Shared uniform buffer, updated once per frame.
15
+ *
16
+ * @augments Node
17
+ */
3
18
  class UniformGroupNode extends Node {
4
19
 
5
20
  static get type() {
@@ -8,22 +23,49 @@ class UniformGroupNode extends Node {
8
23
 
9
24
  }
10
25
 
26
+ /**
27
+ * Constructs a new uniform group node.
28
+ *
29
+ * @param {String} name - The name of the uniform group node.
30
+ * @param {Boolean} [shared=false] - Whether this uniform group node is shared or not.
31
+ * @param {Number} [order=1] - Influences the internal sorting.
32
+ */
11
33
  constructor( name, shared = false, order = 1 ) {
12
34
 
13
35
  super( 'string' );
14
36
 
37
+ /**
38
+ * The name of the uniform group node.
39
+ *
40
+ * @type {String}
41
+ */
15
42
  this.name = name;
16
- this.version = 0;
17
43
 
44
+ /**
45
+ * Whether this uniform group node is shared or not.
46
+ *
47
+ * @type {Boolean}
48
+ * @default false
49
+ */
18
50
  this.shared = shared;
19
- this.order = order;
20
- this.isUniformGroup = true;
21
51
 
22
- }
23
-
24
- set needsUpdate( value ) {
52
+ /**
53
+ * Influences the internal sorting.
54
+ * TODO: Add details when this property should be changed.
55
+ *
56
+ * @type {Number}
57
+ * @default 1
58
+ */
59
+ this.order = order;
25
60
 
26
- if ( value === true ) this.version ++;
61
+ /**
62
+ * This flag can be used for type testing.
63
+ *
64
+ * @type {Boolean}
65
+ * @readonly
66
+ * @default true
67
+ */
68
+ this.isUniformGroup = true;
27
69
 
28
70
  }
29
71
 
@@ -51,9 +93,42 @@ class UniformGroupNode extends Node {
51
93
 
52
94
  export default UniformGroupNode;
53
95
 
96
+ /**
97
+ * TSL function for creating a uniform group node with the given name.
98
+ *
99
+ * @function
100
+ * @param {String} name - The name of the uniform group node.
101
+ * @returns {UniformGroupNode}
102
+ */
54
103
  export const uniformGroup = ( name ) => new UniformGroupNode( name );
104
+
105
+ /**
106
+ * TSL function for creating a shared uniform group node with the given name and order.
107
+ *
108
+ * @function
109
+ * @param {String} name - The name of the uniform group node.
110
+ * @param {Number} [order=0] - Influences the internal sorting.
111
+ * @returns {UniformGroupNode}
112
+ */
55
113
  export const sharedUniformGroup = ( name, order = 0 ) => new UniformGroupNode( name, true, order );
56
114
 
115
+ /**
116
+ * TSL object that represents a shared uniform group node which is updated once per frame.
117
+ *
118
+ * @type {UniformGroupNode}
119
+ */
57
120
  export const frameGroup = /*@__PURE__*/ sharedUniformGroup( 'frame' );
121
+
122
+ /**
123
+ * TSL object that represents a shared uniform group node which is updated once per render.
124
+ *
125
+ * @type {UniformGroupNode}
126
+ */
58
127
  export const renderGroup = /*@__PURE__*/ sharedUniformGroup( 'render' );
128
+
129
+ /**
130
+ * TSL object that represents a uniform group node which is updated once per object.
131
+ *
132
+ * @type {UniformGroupNode}
133
+ */
59
134
  export const objectGroup = /*@__PURE__*/ uniformGroup( 'object' );
@@ -2,6 +2,13 @@ import InputNode from './InputNode.js';
2
2
  import { objectGroup } from './UniformGroupNode.js';
3
3
  import { nodeObject, getConstNodeType } from '../tsl/TSLCore.js';
4
4
 
5
+ /** @module UniformNode **/
6
+
7
+ /**
8
+ * Class for representing a uniform.
9
+ *
10
+ * @augments InputNode
11
+ */
5
12
  class UniformNode extends InputNode {
6
13
 
7
14
  static get type() {
@@ -10,17 +17,50 @@ class UniformNode extends InputNode {
10
17
 
11
18
  }
12
19
 
20
+ /**
21
+ * Constructs a new uniform node.
22
+ *
23
+ * @param {Any} value - The value of this node. Usually a JS primitive or three.js object (vector, matrix, color, texture).
24
+ * @param {String?} nodeType - The node type. If no explicit type is defined, the node tries to derive the type from its value.
25
+ */
13
26
  constructor( value, nodeType = null ) {
14
27
 
15
28
  super( value, nodeType );
16
29
 
30
+ /**
31
+ * This flag can be used for type testing.
32
+ *
33
+ * @type {Boolean}
34
+ * @readonly
35
+ * @default true
36
+ */
17
37
  this.isUniformNode = true;
18
38
 
39
+ /**
40
+ * The name or label of the uniform.
41
+ *
42
+ * @type {String}
43
+ * @default ''
44
+ */
19
45
  this.name = '';
46
+
47
+ /**
48
+ * The uniform group of this uniform. By default, uniforms are
49
+ * managed per object but they might belong to a shared group
50
+ * which is updated per frame or render call.
51
+ *
52
+ * @type {UniformGroupNode}
53
+ */
20
54
  this.groupNode = objectGroup;
21
55
 
22
56
  }
23
57
 
58
+ /**
59
+ * Sets the {@link UniformNode#name} property.
60
+ *
61
+ * @param {String} name - The name of the uniform.
62
+ * @return {UniformNode} A reference to this node.
63
+ */
24
64
  label( name ) {
25
65
 
26
66
  this.name = name;
@@ -29,6 +69,12 @@ class UniformNode extends InputNode {
29
69
 
30
70
  }
31
71
 
72
+ /**
73
+ * Sets the {@link UniformNode#groupNode} property.
74
+ *
75
+ * @param {UniformGroupNode} group - The uniform group.
76
+ * @return {UniformNode} A reference to this node.
77
+ */
32
78
  setGroup( group ) {
33
79
 
34
80
  this.groupNode = group;
@@ -37,12 +83,24 @@ class UniformNode extends InputNode {
37
83
 
38
84
  }
39
85
 
86
+ /**
87
+ * Returns the {@link UniformNode#groupNode}.
88
+ *
89
+ * @return {UniformGroupNode} The uniform group.
90
+ */
40
91
  getGroup() {
41
92
 
42
93
  return this.groupNode;
43
94
 
44
95
  }
45
96
 
97
+ /**
98
+ * By default, this method returns the result of {@link Node#getHash} but derived
99
+ * classes might overwrite this method with a different implementation.
100
+ *
101
+ * @param {NodeBuilder} builder - The current node builder.
102
+ * @return {String} The uniform hash.
103
+ */
46
104
  getUniformHash( builder ) {
47
105
 
48
106
  return this.getHash( builder );
@@ -100,6 +158,14 @@ class UniformNode extends InputNode {
100
158
 
101
159
  export default UniformNode;
102
160
 
161
+ /**
162
+ * TSL function for creating a uniform node.
163
+ *
164
+ * @function
165
+ * @param {Any} arg1 - The value of this node. Usually a JS primitive or three.js object (vector, matrix, color, texture).
166
+ * @param {String?} arg2 - The node type. If no explicit type is defined, the node tries to derive the type from its value.
167
+ * @returns {UniformNode}
168
+ */
103
169
  export const uniform = ( arg1, arg2 ) => {
104
170
 
105
171
  const nodeType = getConstNodeType( arg2 || arg1 );
@@ -1,6 +1,18 @@
1
1
  import Node from './Node.js';
2
2
  import { addMethodChaining, nodeProxy } from '../tsl/TSLCore.js';
3
3
 
4
+ /** @module VarNode **/
5
+
6
+ /**
7
+ * Class for representing shader variables as nodes. Variables are created from
8
+ * existing nodes like the following:
9
+ *
10
+ * ```js
11
+ * const depth = sampleDepth( uvNode ).toVar( 'depth' );
12
+ * ```
13
+ *
14
+ * @augments Node
15
+ */
4
16
  class VarNode extends Node {
5
17
 
6
18
  static get type() {
@@ -9,17 +21,59 @@ class VarNode extends Node {
9
21
 
10
22
  }
11
23
 
12
- constructor( node, name = null ) {
24
+ /**
25
+ * Constructs a new variable node.
26
+ *
27
+ * @param {Node} node - The node for which a variable should be created.
28
+ * @param {String?} name - The name of the variable in the shader.
29
+ * @param {Boolean?} readOnly - The read-only flag.
30
+ */
31
+ constructor( node, name = null, readOnly = false ) {
13
32
 
14
33
  super();
15
34
 
35
+ /**
36
+ * The node for which a variable should be created.
37
+ *
38
+ * @type {Node}
39
+ */
16
40
  this.node = node;
41
+
42
+ /**
43
+ * The name of the variable in the shader. If no name is defined,
44
+ * the node system auto-generates one.
45
+ *
46
+ * @type {String?}
47
+ * @default null
48
+ */
17
49
  this.name = name;
18
50
 
51
+ /**
52
+ * `VarNode` sets this property to `true` by default.
53
+ *
54
+ * @type {Boolean}
55
+ * @default true
56
+ */
19
57
  this.global = true;
20
58
 
59
+ /**
60
+ * This flag can be used for type testing.
61
+ *
62
+ * @type {Boolean}
63
+ * @readonly
64
+ * @default true
65
+ */
21
66
  this.isVarNode = true;
22
67
 
68
+ /**
69
+ *
70
+ * The read-only flag.
71
+ *
72
+ * @type {Boolean}
73
+ * @default false
74
+ */
75
+ this.readOnly = readOnly;
76
+
23
77
  }
24
78
 
25
79
  getHash( builder ) {
@@ -28,6 +82,18 @@ class VarNode extends Node {
28
82
 
29
83
  }
30
84
 
85
+ getMemberType( builder, name ) {
86
+
87
+ return this.node.getMemberType( builder, name );
88
+
89
+ }
90
+
91
+ getElementType( builder ) {
92
+
93
+ return this.node.getElementType( builder );
94
+
95
+ }
96
+
31
97
  getNodeType( builder ) {
32
98
 
33
99
  return this.node.getNodeType( builder );
@@ -36,15 +102,50 @@ class VarNode extends Node {
36
102
 
37
103
  generate( builder ) {
38
104
 
39
- const { node, name } = this;
105
+ const { node, name, readOnly } = this;
106
+ const { renderer } = builder;
107
+
108
+ const isWebGPUBackend = renderer.backend.isWebGPUBackend === true;
109
+
110
+ let isDeterministic = false;
111
+ let shouldTreatAsReadOnly = false;
112
+
113
+ if ( readOnly ) {
40
114
 
41
- const nodeVar = builder.getVarFromNode( this, name, builder.getVectorType( this.getNodeType( builder ) ) );
115
+ isDeterministic = builder.isDeterministic( node );
116
+
117
+ shouldTreatAsReadOnly = isWebGPUBackend ? readOnly : isDeterministic;
118
+
119
+ }
120
+
121
+ const vectorType = builder.getVectorType( this.getNodeType( builder ) );
122
+ const snippet = node.build( builder, vectorType );
123
+
124
+ const nodeVar = builder.getVarFromNode( this, name, vectorType, undefined, shouldTreatAsReadOnly );
42
125
 
43
126
  const propertyName = builder.getPropertyName( nodeVar );
44
127
 
45
- const snippet = node.build( builder, nodeVar.type );
128
+ let declarationPrefix = propertyName;
129
+
130
+ if ( shouldTreatAsReadOnly ) {
131
+
132
+ if ( isWebGPUBackend ) {
133
+
134
+ declarationPrefix = isDeterministic
135
+ ? `const ${ propertyName }`
136
+ : `let ${ propertyName }`;
137
+
138
+ } else {
139
+
140
+ const count = builder.getArrayCount( node );
141
+
142
+ declarationPrefix = `const ${ builder.getVar( nodeVar.type, propertyName, count ) }`;
143
+
144
+ }
145
+
146
+ }
46
147
 
47
- builder.addLineFlowCode( `${propertyName} = ${snippet}`, this );
148
+ builder.addLineFlowCode( `${ declarationPrefix } = ${ snippet }`, this );
48
149
 
49
150
  return propertyName;
50
151
 
@@ -54,15 +155,53 @@ class VarNode extends Node {
54
155
 
55
156
  export default VarNode;
56
157
 
158
+ /**
159
+ * TSL function for creating a var node.
160
+ *
161
+ * @function
162
+ * @param {Node} node - The node for which a variable should be created.
163
+ * @param {String?} name - The name of the variable in the shader.
164
+ * @returns {VarNode}
165
+ */
57
166
  const createVar = /*@__PURE__*/ nodeProxy( VarNode );
58
167
 
59
- addMethodChaining( 'toVar', ( ...params ) => createVar( ...params ).append() );
168
+ /**
169
+ * TSL function for creating a var node.
170
+ *
171
+ * @function
172
+ * @param {Node} node - The node for which a variable should be created.
173
+ * @param {String?} name - The name of the variable in the shader.
174
+ * @returns {VarNode}
175
+ */
176
+ export const Var = ( node, name = null ) => createVar( node, name ).append();
177
+
178
+ /**
179
+ * TSL function for creating a const node.
180
+ *
181
+ * @function
182
+ * @param {Node} node - The node for which a constant should be created.
183
+ * @param {String?} name - The name of the constant in the shader.
184
+ * @returns {VarNode}
185
+ */
186
+ export const Const = ( node, name = null ) => createVar( node, name, true ).append();
187
+
188
+ // Method chaining
189
+
190
+ addMethodChaining( 'toVar', Var );
191
+ addMethodChaining( 'toConst', Const );
60
192
 
61
193
  // Deprecated
62
194
 
195
+ /**
196
+ * @function
197
+ * @deprecated since r170. Use `Var( node )` or `node.toVar()` instead.
198
+ *
199
+ * @param {Any} node
200
+ * @returns {VarNode}
201
+ */
63
202
  export const temp = ( node ) => { // @deprecated, r170
64
203
 
65
- console.warn( 'TSL: "temp" is deprecated. Use ".toVar()" instead.' );
204
+ console.warn( 'TSL: "temp( node )" is deprecated. Use "Var( node )" or "node.toVar()" instead.' );
66
205
 
67
206
  return createVar( node );
68
207