super-three 0.177.0 → 0.181.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 (501) hide show
  1. package/README.md +1 -1
  2. package/build/three.cjs +1994 -749
  3. package/build/three.core.js +1358 -506
  4. package/build/three.core.min.js +1 -1
  5. package/build/three.module.js +631 -247
  6. package/build/three.module.min.js +1 -1
  7. package/build/three.tsl.js +113 -33
  8. package/build/three.tsl.min.js +1 -1
  9. package/build/three.webgpu.js +9571 -3424
  10. package/build/three.webgpu.min.js +1 -1
  11. package/build/three.webgpu.nodes.js +9397 -3426
  12. package/build/three.webgpu.nodes.min.js +1 -1
  13. package/examples/fonts/MPLUSRounded1c/MPLUSRounded1c-Regular.typeface.json.zip +0 -0
  14. package/examples/fonts/MPLUSRounded1c/OFL.txt +91 -0
  15. package/examples/jsm/Addons.js +2 -3
  16. package/examples/jsm/animation/CCDIKSolver.js +1 -1
  17. package/examples/jsm/capabilities/WebGL.js +0 -27
  18. package/examples/jsm/capabilities/WebGPU.js +1 -1
  19. package/examples/jsm/controls/ArcballControls.js +9 -9
  20. package/examples/jsm/controls/DragControls.js +7 -57
  21. package/examples/jsm/controls/FirstPersonControls.js +3 -3
  22. package/examples/jsm/controls/FlyControls.js +1 -1
  23. package/examples/jsm/controls/OrbitControls.js +2 -2
  24. package/examples/jsm/controls/PointerLockControls.js +2 -10
  25. package/examples/jsm/controls/TrackballControls.js +1 -1
  26. package/examples/jsm/controls/TransformControls.js +62 -15
  27. package/examples/jsm/csm/CSMShadowNode.js +4 -4
  28. package/examples/jsm/effects/AsciiEffect.js +8 -8
  29. package/examples/jsm/environments/RoomEnvironment.js +8 -3
  30. package/examples/jsm/exporters/DRACOExporter.js +2 -2
  31. package/examples/jsm/exporters/EXRExporter.js +1 -1
  32. package/examples/jsm/exporters/GLTFExporter.js +33 -25
  33. package/examples/jsm/exporters/KTX2Exporter.js +4 -2
  34. package/examples/jsm/exporters/PLYExporter.js +1 -1
  35. package/examples/jsm/exporters/USDZExporter.js +683 -299
  36. package/examples/jsm/geometries/DecalGeometry.js +2 -2
  37. package/examples/jsm/geometries/ParametricGeometry.js +1 -1
  38. package/examples/jsm/geometries/RoundedBoxGeometry.js +47 -8
  39. package/examples/jsm/geometries/TeapotGeometry.js +2 -2
  40. package/examples/jsm/geometries/TextGeometry.js +3 -2
  41. package/examples/jsm/gpgpu/BitonicSort.js +715 -0
  42. package/examples/jsm/helpers/ViewHelper.js +43 -5
  43. package/examples/jsm/inspector/Inspector.js +427 -0
  44. package/examples/jsm/inspector/RendererInspector.js +415 -0
  45. package/examples/jsm/inspector/tabs/Console.js +204 -0
  46. package/examples/jsm/inspector/tabs/Parameters.js +332 -0
  47. package/examples/jsm/inspector/tabs/Performance.js +268 -0
  48. package/examples/jsm/inspector/tabs/Viewer.js +166 -0
  49. package/examples/jsm/inspector/ui/Graph.js +95 -0
  50. package/examples/jsm/inspector/ui/Item.js +170 -0
  51. package/examples/jsm/inspector/ui/List.js +75 -0
  52. package/examples/jsm/inspector/ui/Profiler.js +170 -0
  53. package/examples/jsm/inspector/ui/Style.js +654 -0
  54. package/examples/jsm/inspector/ui/Tab.js +46 -0
  55. package/examples/jsm/inspector/ui/Values.js +423 -0
  56. package/examples/jsm/inspector/ui/utils.js +56 -0
  57. package/examples/jsm/interactive/HTMLMesh.js +11 -13
  58. package/examples/jsm/interactive/InteractiveGroup.js +1 -1
  59. package/examples/jsm/interactive/SelectionBox.js +30 -0
  60. package/examples/jsm/libs/ktx-parse.module.js +1 -1
  61. package/examples/jsm/libs/meshopt_decoder.module.js +75 -58
  62. package/examples/jsm/lights/LightProbeGenerator.js +14 -3
  63. package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -1
  64. package/examples/jsm/lines/Line2.js +3 -3
  65. package/examples/jsm/lines/LineGeometry.js +1 -1
  66. package/examples/jsm/lines/LineSegments2.js +2 -2
  67. package/examples/jsm/lines/Wireframe.js +2 -2
  68. package/examples/jsm/lines/WireframeGeometry2.js +1 -1
  69. package/examples/jsm/lines/webgpu/LineSegments2.js +1 -1
  70. package/examples/jsm/lines/webgpu/Wireframe.js +1 -1
  71. package/examples/jsm/loaders/3MFLoader.js +1 -1
  72. package/examples/jsm/loaders/ColladaLoader.js +4 -4
  73. package/examples/jsm/loaders/DDSLoader.js +1 -1
  74. package/examples/jsm/loaders/DRACOLoader.js +73 -22
  75. package/examples/jsm/loaders/EXRLoader.js +210 -22
  76. package/examples/jsm/loaders/FBXLoader.js +4 -4
  77. package/examples/jsm/loaders/FontLoader.js +23 -5
  78. package/examples/jsm/loaders/GLTFLoader.js +14 -8
  79. package/examples/jsm/loaders/HDRCubeTextureLoader.js +5 -5
  80. package/examples/jsm/loaders/HDRLoader.js +486 -0
  81. package/examples/jsm/loaders/KTX2Loader.js +136 -49
  82. package/examples/jsm/loaders/KTXLoader.js +2 -2
  83. package/examples/jsm/loaders/LDrawLoader.js +1 -1
  84. package/examples/jsm/loaders/LUT3dlLoader.js +2 -2
  85. package/examples/jsm/loaders/LUTCubeLoader.js +1 -1
  86. package/examples/jsm/loaders/LWOLoader.js +2 -2
  87. package/examples/jsm/loaders/MaterialXLoader.js +233 -34
  88. package/examples/jsm/loaders/OBJLoader.js +1 -1
  89. package/examples/jsm/loaders/PDBLoader.js +1 -1
  90. package/examples/jsm/loaders/RGBELoader.js +7 -473
  91. package/examples/jsm/loaders/SVGLoader.js +2 -2
  92. package/examples/jsm/loaders/TTFLoader.js +13 -1
  93. package/examples/jsm/loaders/USDLoader.js +219 -0
  94. package/examples/jsm/loaders/USDZLoader.js +4 -892
  95. package/examples/jsm/loaders/UltraHDRLoader.js +2 -2
  96. package/examples/jsm/loaders/lwo/IFFParser.js +1 -1
  97. package/examples/jsm/loaders/usd/USDAParser.js +741 -0
  98. package/examples/jsm/loaders/usd/USDCParser.js +17 -0
  99. package/examples/jsm/materials/WoodNodeMaterial.js +533 -0
  100. package/examples/jsm/math/ColorSpaces.js +19 -1
  101. package/examples/jsm/math/ConvexHull.js +3 -3
  102. package/examples/jsm/math/ImprovedNoise.js +1 -1
  103. package/examples/jsm/math/Lut.js +2 -2
  104. package/examples/jsm/math/SimplexNoise.js +1 -1
  105. package/examples/jsm/misc/MD2CharacterComplex.js +1 -1
  106. package/examples/jsm/misc/ProgressiveLightMap.js +9 -3
  107. package/examples/jsm/misc/ProgressiveLightMapGPU.js +7 -1
  108. package/examples/jsm/misc/TubePainter.js +383 -40
  109. package/examples/jsm/misc/Volume.js +1 -1
  110. package/examples/jsm/modifiers/SimplifyModifier.js +1 -1
  111. package/examples/jsm/objects/LensflareMesh.js +3 -3
  112. package/examples/jsm/objects/ReflectorForSSRPass.js +1 -0
  113. package/examples/jsm/objects/Sky.js +1 -1
  114. package/examples/jsm/objects/SkyMesh.js +3 -3
  115. package/examples/jsm/objects/Water.js +3 -3
  116. package/examples/jsm/objects/WaterMesh.js +6 -6
  117. package/examples/jsm/physics/RapierPhysics.js +95 -16
  118. package/examples/jsm/postprocessing/GTAOPass.js +10 -9
  119. package/examples/jsm/postprocessing/GlitchPass.js +2 -2
  120. package/examples/jsm/postprocessing/OutlinePass.js +17 -17
  121. package/examples/jsm/postprocessing/SSAOPass.js +10 -9
  122. package/examples/jsm/postprocessing/SSRPass.js +37 -8
  123. package/examples/jsm/postprocessing/UnrealBloomPass.js +8 -6
  124. package/examples/jsm/renderers/CSS2DRenderer.js +16 -5
  125. package/examples/jsm/renderers/CSS3DRenderer.js +7 -6
  126. package/examples/jsm/renderers/SVGRenderer.js +1 -1
  127. package/examples/jsm/shaders/ACESFilmicToneMappingShader.js +1 -1
  128. package/examples/jsm/shaders/AfterimageShader.js +1 -1
  129. package/examples/jsm/shaders/BleachBypassShader.js +1 -1
  130. package/examples/jsm/shaders/BokehShader.js +1 -1
  131. package/examples/jsm/shaders/BokehShader2.js +1 -1
  132. package/examples/jsm/shaders/DotScreenShader.js +1 -1
  133. package/examples/jsm/shaders/FocusShader.js +1 -1
  134. package/examples/jsm/shaders/GTAOShader.js +2 -2
  135. package/examples/jsm/shaders/GodRaysShader.js +1 -1
  136. package/examples/jsm/shaders/KaleidoShader.js +1 -1
  137. package/examples/jsm/shaders/PoissonDenoiseShader.js +2 -2
  138. package/examples/jsm/shaders/SSRShader.js +1 -1
  139. package/examples/jsm/shaders/SepiaShader.js +1 -1
  140. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +1 -1
  141. package/examples/jsm/shaders/TriangleBlurShader.js +1 -1
  142. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +11 -2
  143. package/examples/jsm/shaders/VignetteShader.js +1 -1
  144. package/examples/jsm/transpiler/AST.js +381 -30
  145. package/examples/jsm/transpiler/GLSLDecoder.js +247 -104
  146. package/examples/jsm/transpiler/Linker.js +327 -0
  147. package/examples/jsm/transpiler/TSLEncoder.js +196 -92
  148. package/examples/jsm/transpiler/Transpiler.js +17 -1
  149. package/examples/jsm/transpiler/TranspilerUtils.js +29 -0
  150. package/examples/jsm/transpiler/WGSLEncoder.js +812 -0
  151. package/examples/jsm/tsl/display/AfterImageNode.js +26 -24
  152. package/examples/jsm/tsl/display/AnamorphicNode.js +28 -4
  153. package/examples/jsm/tsl/display/BloomNode.js +11 -6
  154. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +207 -0
  155. package/examples/jsm/tsl/display/DenoiseNode.js +2 -0
  156. package/examples/jsm/tsl/display/DepthOfFieldNode.js +446 -90
  157. package/examples/jsm/tsl/display/GTAONode.js +53 -5
  158. package/examples/jsm/tsl/display/GaussianBlurNode.js +55 -43
  159. package/examples/jsm/tsl/display/OutlineNode.js +13 -2
  160. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
  161. package/examples/jsm/tsl/display/SSGINode.js +654 -0
  162. package/examples/jsm/tsl/display/SSRNode.js +182 -65
  163. package/examples/jsm/tsl/display/SSSNode.js +488 -0
  164. package/examples/jsm/tsl/display/TRAANode.js +578 -0
  165. package/examples/jsm/tsl/display/boxBlur.js +65 -0
  166. package/examples/jsm/tsl/display/hashBlur.js +18 -20
  167. package/examples/jsm/tsl/lighting/TiledLightsNode.js +22 -2
  168. package/examples/jsm/utils/BufferGeometryUtils.js +1 -1
  169. package/examples/jsm/utils/ShadowMapViewerGPU.js +12 -5
  170. package/examples/jsm/webxr/OculusHandModel.js +1 -1
  171. package/examples/jsm/webxr/XRControllerModelFactory.js +1 -1
  172. package/examples/jsm/webxr/XRHandModelFactory.js +2 -6
  173. package/package.json +5 -10
  174. package/src/Three.Core.js +5 -2
  175. package/src/Three.TSL.js +112 -32
  176. package/src/Three.WebGPU.Nodes.js +2 -0
  177. package/src/Three.WebGPU.js +4 -0
  178. package/src/animation/AnimationClip.js +20 -4
  179. package/src/animation/AnimationMixer.js +3 -3
  180. package/src/animation/AnimationObjectGroup.js +2 -1
  181. package/src/animation/KeyframeTrack.js +8 -7
  182. package/src/animation/PropertyBinding.js +12 -11
  183. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  184. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  185. package/src/audio/Audio.js +10 -9
  186. package/src/audio/PositionalAudio.js +1 -1
  187. package/src/cameras/Camera.js +14 -0
  188. package/src/cameras/OrthographicCamera.js +2 -2
  189. package/src/cameras/PerspectiveCamera.js +2 -2
  190. package/src/cameras/StereoCamera.js +2 -2
  191. package/src/constants.js +13 -5
  192. package/src/core/BufferAttribute.js +3 -3
  193. package/src/core/BufferGeometry.js +10 -10
  194. package/src/core/Clock.js +2 -8
  195. package/src/core/EventDispatcher.js +1 -1
  196. package/src/core/GLBufferAttribute.js +13 -1
  197. package/src/core/InterleavedBuffer.js +1 -1
  198. package/src/core/InterleavedBufferAttribute.js +3 -2
  199. package/src/core/Object3D.js +4 -3
  200. package/src/core/Raycaster.js +2 -1
  201. package/src/core/RenderTarget.js +10 -1
  202. package/{examples/jsm/misc → src/core}/Timer.js +4 -42
  203. package/src/extras/Controls.js +5 -4
  204. package/src/extras/DataUtils.js +2 -1
  205. package/src/extras/Earcut.js +6 -0
  206. package/src/extras/ImageUtils.js +2 -2
  207. package/src/extras/PMREMGenerator.js +279 -55
  208. package/src/extras/TextureUtils.js +2 -1
  209. package/src/extras/core/Curve.js +2 -1
  210. package/src/extras/core/Interpolations.js +7 -1
  211. package/src/extras/core/Path.js +22 -22
  212. package/src/extras/core/ShapePath.js +4 -4
  213. package/src/extras/lib/earcut.js +8 -8
  214. package/src/geometries/BoxGeometry.js +1 -0
  215. package/src/geometries/CapsuleGeometry.js +1 -0
  216. package/src/geometries/CircleGeometry.js +1 -0
  217. package/src/geometries/ConeGeometry.js +1 -0
  218. package/src/geometries/CylinderGeometry.js +1 -0
  219. package/src/geometries/DodecahedronGeometry.js +1 -0
  220. package/src/geometries/ExtrudeGeometry.js +8 -6
  221. package/src/geometries/IcosahedronGeometry.js +1 -0
  222. package/src/geometries/LatheGeometry.js +1 -0
  223. package/src/geometries/OctahedronGeometry.js +1 -0
  224. package/src/geometries/PlaneGeometry.js +1 -0
  225. package/src/geometries/RingGeometry.js +1 -0
  226. package/src/geometries/ShapeGeometry.js +1 -0
  227. package/src/geometries/SphereGeometry.js +1 -0
  228. package/src/geometries/TetrahedronGeometry.js +1 -0
  229. package/src/geometries/TorusGeometry.js +1 -0
  230. package/src/geometries/TorusKnotGeometry.js +1 -0
  231. package/src/geometries/TubeGeometry.js +1 -0
  232. package/src/helpers/CameraHelper.js +42 -12
  233. package/src/helpers/SkeletonHelper.js +35 -6
  234. package/src/lights/LightShadow.js +21 -8
  235. package/src/lights/PointLightShadow.js +1 -1
  236. package/src/lights/webgpu/ProjectorLight.js +1 -1
  237. package/src/loaders/AnimationLoader.js +2 -1
  238. package/src/loaders/AudioLoader.js +2 -1
  239. package/src/loaders/BufferGeometryLoader.js +2 -2
  240. package/src/loaders/Cache.js +2 -2
  241. package/src/loaders/DataTextureLoader.js +1 -1
  242. package/src/loaders/FileLoader.js +29 -5
  243. package/src/loaders/ImageBitmapLoader.js +32 -8
  244. package/src/loaders/ImageLoader.js +56 -9
  245. package/src/loaders/Loader.js +17 -3
  246. package/src/loaders/LoadingManager.js +45 -0
  247. package/src/loaders/MaterialLoader.js +3 -2
  248. package/src/loaders/ObjectLoader.js +13 -13
  249. package/src/loaders/TextureLoader.js +1 -1
  250. package/src/loaders/nodes/NodeLoader.js +3 -2
  251. package/src/materials/Material.js +16 -3
  252. package/src/materials/MeshBasicMaterial.js +2 -1
  253. package/src/materials/MeshDepthMaterial.js +1 -0
  254. package/src/materials/MeshDistanceMaterial.js +1 -1
  255. package/src/materials/MeshLambertMaterial.js +2 -1
  256. package/src/materials/MeshMatcapMaterial.js +22 -0
  257. package/src/materials/MeshNormalMaterial.js +1 -0
  258. package/src/materials/MeshPhongMaterial.js +2 -1
  259. package/src/materials/MeshPhysicalMaterial.js +2 -1
  260. package/src/materials/MeshStandardMaterial.js +8 -7
  261. package/src/materials/MeshToonMaterial.js +1 -0
  262. package/src/materials/PointsMaterial.js +1 -1
  263. package/src/materials/ShaderMaterial.js +2 -2
  264. package/src/materials/nodes/Line2NodeMaterial.js +2 -10
  265. package/src/materials/nodes/MeshBasicNodeMaterial.js +4 -3
  266. package/src/materials/nodes/MeshMatcapNodeMaterial.js +1 -1
  267. package/src/materials/nodes/MeshNormalNodeMaterial.js +2 -2
  268. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +2 -1
  269. package/src/materials/nodes/MeshSSSNodeMaterial.js +3 -3
  270. package/src/materials/nodes/NodeMaterial.js +90 -27
  271. package/src/materials/nodes/PointsNodeMaterial.js +86 -28
  272. package/src/materials/nodes/SpriteNodeMaterial.js +3 -15
  273. package/src/materials/nodes/manager/NodeMaterialObserver.js +89 -3
  274. package/src/math/Color.js +6 -5
  275. package/src/math/ColorManagement.js +9 -3
  276. package/src/math/Cylindrical.js +1 -1
  277. package/src/math/Euler.js +2 -1
  278. package/src/math/Frustum.js +25 -9
  279. package/src/math/FrustumArray.js +10 -5
  280. package/src/math/Line3.js +129 -2
  281. package/src/math/MathUtils.js +13 -11
  282. package/src/math/Matrix2.js +1 -1
  283. package/src/math/Matrix3.js +2 -2
  284. package/src/math/Matrix4.js +55 -34
  285. package/src/math/Plane.js +1 -1
  286. package/src/math/Quaternion.js +69 -67
  287. package/src/math/Spherical.js +3 -3
  288. package/src/nodes/Nodes.js +6 -4
  289. package/src/nodes/TSL.js +9 -4
  290. package/src/nodes/accessors/AccessorsUtils.js +7 -8
  291. package/src/nodes/accessors/Bitangent.js +31 -25
  292. package/src/nodes/accessors/BufferNode.js +1 -1
  293. package/src/nodes/accessors/Camera.js +142 -16
  294. package/src/nodes/accessors/ClippingNode.js +6 -5
  295. package/src/nodes/accessors/CubeTextureNode.js +5 -4
  296. package/src/nodes/accessors/InstanceNode.js +25 -5
  297. package/src/nodes/accessors/Lights.js +10 -0
  298. package/src/nodes/accessors/Normal.js +97 -30
  299. package/src/nodes/accessors/Object3DNode.js +2 -2
  300. package/src/nodes/accessors/Position.js +25 -9
  301. package/src/nodes/accessors/ReferenceBaseNode.js +1 -1
  302. package/src/nodes/accessors/ReferenceNode.js +20 -4
  303. package/src/nodes/accessors/ReflectVector.js +3 -3
  304. package/src/nodes/accessors/SceneNode.js +3 -2
  305. package/src/nodes/accessors/StorageBufferNode.js +2 -1
  306. package/src/nodes/accessors/StorageTextureNode.js +23 -1
  307. package/src/nodes/accessors/Tangent.js +25 -17
  308. package/src/nodes/accessors/TangentUtils.js +46 -0
  309. package/src/nodes/accessors/Texture3DNode.js +14 -1
  310. package/src/nodes/accessors/TextureBicubic.js +21 -3
  311. package/src/nodes/accessors/TextureNode.js +142 -44
  312. package/src/nodes/accessors/UniformArrayNode.js +0 -16
  313. package/src/nodes/code/FunctionCallNode.js +24 -4
  314. package/src/nodes/code/FunctionNode.js +23 -0
  315. package/src/nodes/core/ArrayNode.js +13 -0
  316. package/src/nodes/core/AssignNode.js +6 -2
  317. package/src/nodes/core/AttributeNode.js +2 -1
  318. package/src/nodes/core/ContextNode.js +48 -10
  319. package/src/nodes/core/IndexNode.js +2 -2
  320. package/src/nodes/core/InputNode.js +2 -1
  321. package/src/nodes/core/InspectorNode.js +128 -0
  322. package/src/nodes/core/{CacheNode.js → IsolateNode.js} +36 -17
  323. package/src/nodes/core/Node.js +167 -34
  324. package/src/nodes/core/NodeBuilder.js +404 -120
  325. package/src/nodes/core/NodeFrame.js +21 -21
  326. package/src/nodes/core/NodeFunction.js +2 -1
  327. package/src/nodes/core/NodeParser.js +2 -1
  328. package/src/nodes/core/NodeUniform.js +1 -1
  329. package/src/nodes/core/NodeUtils.js +17 -88
  330. package/src/nodes/core/ParameterNode.js +31 -0
  331. package/src/nodes/core/PropertyNode.js +7 -0
  332. package/src/nodes/core/StackNode.js +77 -30
  333. package/src/nodes/core/StructNode.js +5 -5
  334. package/src/nodes/core/StructTypeNode.js +1 -0
  335. package/src/nodes/core/SubBuildNode.js +89 -0
  336. package/src/nodes/core/UniformNode.js +80 -14
  337. package/src/nodes/core/VarNode.js +142 -16
  338. package/src/nodes/core/VaryingNode.js +9 -6
  339. package/src/nodes/display/BlendModes.js +7 -6
  340. package/src/nodes/display/BumpMapNode.js +1 -1
  341. package/src/nodes/display/ColorAdjustment.js +1 -1
  342. package/src/nodes/display/FrontFacingNode.js +35 -7
  343. package/src/nodes/display/NormalMapNode.js +20 -50
  344. package/src/nodes/display/PassNode.js +206 -17
  345. package/src/nodes/display/RenderOutputNode.js +28 -2
  346. package/src/nodes/display/ScreenNode.js +44 -40
  347. package/src/nodes/display/ToneMappingNode.js +31 -4
  348. package/src/nodes/display/ToonOutlinePassNode.js +8 -0
  349. package/src/nodes/display/ViewportDepthTextureNode.js +16 -4
  350. package/src/nodes/display/ViewportSharedTextureNode.js +12 -0
  351. package/src/nodes/display/ViewportTextureNode.js +94 -4
  352. package/src/nodes/fog/Fog.js +3 -2
  353. package/src/nodes/functions/BSDF/BRDF_GGX.js +2 -6
  354. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +52 -0
  355. package/src/nodes/functions/BSDF/BRDF_Sheen.js +4 -4
  356. package/src/nodes/functions/BSDF/DFGApprox.js +60 -19
  357. package/src/nodes/functions/BasicLightingModel.js +2 -1
  358. package/src/nodes/functions/PhongLightingModel.js +3 -3
  359. package/src/nodes/functions/PhysicalLightingModel.js +19 -18
  360. package/src/nodes/functions/VolumetricLightingModel.js +5 -5
  361. package/src/nodes/functions/material/getGeometryRoughness.js +2 -2
  362. package/src/nodes/geometry/RangeNode.js +40 -4
  363. package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
  364. package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -1
  365. package/src/nodes/gpgpu/ComputeNode.js +81 -25
  366. package/src/nodes/gpgpu/SubgroupFunctionNode.js +455 -0
  367. package/src/nodes/gpgpu/WorkgroupInfoNode.js +29 -3
  368. package/src/nodes/lighting/EnvironmentNode.js +11 -11
  369. package/src/nodes/lighting/LightsNode.js +7 -8
  370. package/src/nodes/lighting/PointShadowNode.js +6 -0
  371. package/src/nodes/lighting/ProjectorLightNode.js +19 -6
  372. package/src/nodes/lighting/ShadowFilterNode.js +3 -1
  373. package/src/nodes/lighting/ShadowNode.js +77 -10
  374. package/src/nodes/materialx/MaterialXNodes.js +131 -2
  375. package/src/nodes/materialx/lib/mx_noise.js +165 -1
  376. package/src/nodes/math/BitcastNode.js +156 -0
  377. package/src/nodes/math/ConditionalNode.js +25 -27
  378. package/src/nodes/math/MathNode.js +106 -65
  379. package/src/nodes/math/OperatorNode.js +28 -43
  380. package/src/nodes/pmrem/PMREMUtils.js +117 -2
  381. package/src/nodes/shapes/Shapes.js +1 -1
  382. package/src/nodes/tsl/TSLBase.js +6 -2
  383. package/src/nodes/tsl/TSLCore.js +546 -186
  384. package/src/nodes/utils/DebugNode.js +3 -2
  385. package/src/nodes/utils/EquirectUV.js +27 -0
  386. package/src/nodes/utils/EventNode.js +119 -0
  387. package/src/nodes/utils/FunctionOverloadingNode.js +37 -19
  388. package/src/nodes/utils/JoinNode.js +6 -3
  389. package/src/nodes/utils/LoopNode.js +20 -41
  390. package/src/nodes/utils/MatcapUV.js +22 -0
  391. package/src/nodes/utils/MemberNode.js +59 -7
  392. package/src/nodes/utils/PostProcessingUtils.js +28 -1
  393. package/src/nodes/utils/RTTNode.js +33 -6
  394. package/src/nodes/utils/ReflectorNode.js +68 -10
  395. package/src/nodes/utils/SampleNode.js +91 -0
  396. package/src/nodes/utils/SplitNode.js +11 -0
  397. package/src/nodes/utils/Timer.js +0 -47
  398. package/src/nodes/utils/TriplanarTextures.js +65 -0
  399. package/src/objects/BatchedMesh.js +6 -4
  400. package/src/objects/LOD.js +1 -1
  401. package/src/objects/Line.js +2 -1
  402. package/src/objects/LineSegments.js +2 -1
  403. package/src/objects/Skeleton.js +3 -2
  404. package/src/objects/SkinnedMesh.js +3 -1
  405. package/src/objects/Sprite.js +4 -3
  406. package/src/renderers/WebGLRenderer.js +77 -66
  407. package/src/renderers/common/Animation.js +13 -1
  408. package/src/renderers/common/Attributes.js +1 -1
  409. package/src/renderers/common/Backend.js +108 -27
  410. package/src/renderers/common/Background.js +4 -3
  411. package/src/renderers/common/Bindings.js +76 -19
  412. package/src/renderers/common/CanvasTarget.js +341 -0
  413. package/src/renderers/common/ChainMap.js +1 -1
  414. package/src/renderers/common/Color4.js +2 -2
  415. package/src/renderers/common/CubeRenderTarget.js +1 -1
  416. package/src/renderers/common/DataMap.js +1 -1
  417. package/src/renderers/common/Geometries.js +26 -0
  418. package/src/renderers/common/Info.js +4 -2
  419. package/src/renderers/common/InspectorBase.js +146 -0
  420. package/src/renderers/common/Pipelines.js +1 -1
  421. package/src/renderers/common/PostProcessing.js +61 -25
  422. package/src/renderers/common/QuadMesh.js +7 -1
  423. package/src/renderers/common/RenderContext.js +2 -2
  424. package/src/renderers/common/RenderList.js +7 -3
  425. package/src/renderers/common/RenderObject.js +84 -5
  426. package/src/renderers/common/RenderObjects.js +1 -1
  427. package/src/renderers/common/Renderer.js +486 -255
  428. package/src/renderers/common/RendererUtils.js +9 -0
  429. package/src/renderers/common/SampledTexture.js +8 -68
  430. package/src/renderers/common/Sampler.js +117 -0
  431. package/src/renderers/common/Storage3DTexture.js +100 -0
  432. package/src/renderers/common/StorageArrayTexture.js +84 -0
  433. package/src/renderers/common/StorageTexture.js +27 -0
  434. package/src/renderers/common/Textures.js +138 -46
  435. package/src/renderers/common/TimestampQueryPool.js +65 -3
  436. package/src/renderers/common/UniformsGroup.js +2 -1
  437. package/src/renderers/common/XRManager.js +63 -24
  438. package/src/renderers/common/XRRenderTarget.js +21 -4
  439. package/src/renderers/common/extras/PMREMGenerator.js +161 -66
  440. package/src/renderers/common/nodes/NodeBuilderState.js +1 -1
  441. package/src/renderers/common/nodes/NodeLibrary.js +9 -7
  442. package/src/renderers/common/nodes/NodeSampledTexture.js +0 -12
  443. package/src/renderers/common/nodes/NodeSampler.js +13 -1
  444. package/src/renderers/common/nodes/Nodes.js +38 -16
  445. package/src/renderers/shaders/DFGLUTData.js +64 -0
  446. package/src/renderers/shaders/ShaderChunk/common.glsl.js +0 -12
  447. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +1 -1
  448. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +1 -1
  449. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +52 -18
  450. package/src/renderers/shaders/ShaderChunk/logdepthbuf_fragment.glsl.js +1 -1
  451. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_fragment.glsl.js +1 -1
  452. package/src/renderers/shaders/ShaderChunk/logdepthbuf_pars_vertex.glsl.js +1 -1
  453. package/src/renderers/shaders/ShaderChunk/logdepthbuf_vertex.glsl.js +1 -1
  454. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +21 -11
  455. package/src/renderers/shaders/ShaderLib/depth.glsl.js +11 -2
  456. package/src/renderers/shaders/UniformsLib.js +1 -0
  457. package/src/renderers/shaders/UniformsUtils.js +25 -4
  458. package/src/renderers/webgl/WebGLAttributes.js +4 -0
  459. package/src/renderers/webgl/WebGLCapabilities.js +4 -3
  460. package/src/renderers/webgl/WebGLExtensions.js +2 -25
  461. package/src/renderers/webgl/WebGLInfo.js +3 -1
  462. package/src/renderers/webgl/WebGLProgram.js +25 -18
  463. package/src/renderers/webgl/WebGLPrograms.js +9 -6
  464. package/src/renderers/webgl/WebGLShadowMap.js +13 -2
  465. package/src/renderers/webgl/WebGLState.js +17 -16
  466. package/src/renderers/webgl/WebGLTextures.js +38 -21
  467. package/src/renderers/webgl/WebGLUniformsGroups.js +5 -3
  468. package/src/renderers/webgl/WebGLUtils.js +3 -2
  469. package/src/renderers/webgl-fallback/WebGLBackend.js +245 -182
  470. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +184 -30
  471. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +4 -0
  472. package/src/renderers/webgl-fallback/utils/WebGLConstants.js +2 -3
  473. package/src/renderers/webgl-fallback/utils/WebGLState.js +9 -8
  474. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +171 -19
  475. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +51 -22
  476. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +3 -2
  477. package/src/renderers/webgpu/WebGPUBackend.js +205 -128
  478. package/src/renderers/webgpu/WebGPURenderer.Nodes.js +2 -1
  479. package/src/renderers/webgpu/WebGPURenderer.js +3 -2
  480. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +198 -121
  481. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +8 -1
  482. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +49 -33
  483. package/src/renderers/webgpu/utils/WebGPUConstants.js +14 -3
  484. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +56 -37
  485. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +6 -8
  486. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +266 -158
  487. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +32 -9
  488. package/src/renderers/webgpu/utils/WebGPUUtils.js +24 -19
  489. package/src/renderers/webxr/WebXRDepthSensing.js +6 -10
  490. package/src/renderers/webxr/WebXRManager.js +89 -13
  491. package/src/textures/ExternalTexture.js +56 -0
  492. package/src/textures/FramebufferTexture.js +2 -2
  493. package/src/textures/Source.js +14 -3
  494. package/src/textures/Texture.js +3 -2
  495. package/src/textures/VideoTexture.js +29 -2
  496. package/src/utils.js +67 -3
  497. package/examples/jsm/loaders/RGBMLoader.js +0 -1148
  498. package/examples/jsm/tsl/display/TRAAPassNode.js +0 -452
  499. package/src/nodes/utils/EquirectUVNode.js +0 -65
  500. package/src/nodes/utils/MatcapUVNode.js +0 -49
  501. package/src/nodes/utils/TriplanarTexturesNode.js +0 -148
@@ -8,16 +8,19 @@ import FlipNode from '../utils/FlipNode.js';
8
8
  import ConstNode from '../core/ConstNode.js';
9
9
  import MemberNode from '../utils/MemberNode.js';
10
10
  import { getValueFromType, getValueType } from '../core/NodeUtils.js';
11
+ import { warn, error } from '../../utils.js';
11
12
 
12
13
  let currentStack = null;
13
14
 
14
15
  const NodeElements = new Map();
15
16
 
17
+ // Extend Node Class for TSL using prototype
18
+
16
19
  export function addMethodChaining( name, nodeElement ) {
17
20
 
18
21
  if ( NodeElements.has( name ) ) {
19
22
 
20
- console.warn( `THREE.TSL: Redefinition of method chaining '${ name }'.` );
23
+ warn( `TSL: Redefinition of method chaining '${ name }'.` );
21
24
  return;
22
25
 
23
26
  }
@@ -26,148 +29,274 @@ export function addMethodChaining( name, nodeElement ) {
26
29
 
27
30
  NodeElements.set( name, nodeElement );
28
31
 
32
+ if ( name !== 'assign' ) {
33
+
34
+ // Changing Node prototype to add method chaining
35
+
36
+ Node.prototype[ name ] = function ( ...params ) {
37
+
38
+ //if ( name === 'toVarIntent' ) return this;
39
+
40
+ return this.isStackNode ? this.addToStack( nodeElement( ...params ) ) : nodeElement( this, ...params );
41
+
42
+ };
43
+
44
+ // Adding assign method chaining
45
+
46
+ Node.prototype[ name + 'Assign' ] = function ( ...params ) {
47
+
48
+ return this.isStackNode ? this.assign( params[ 0 ], nodeElement( ...params ) ) : this.assign( nodeElement( this, ...params ) );
49
+
50
+ };
51
+
52
+ }
53
+
29
54
  }
30
55
 
31
56
  const parseSwizzle = ( props ) => props.replace( /r|s/g, 'x' ).replace( /g|t/g, 'y' ).replace( /b|p/g, 'z' ).replace( /a|q/g, 'w' );
32
57
  const parseSwizzleAndSort = ( props ) => parseSwizzle( props ).split( '' ).sort().join( '' );
33
58
 
34
- const shaderNodeHandler = {
59
+ Node.prototype.assign = function ( ...params ) {
60
+
61
+ if ( this.isStackNode !== true ) {
62
+
63
+ if ( currentStack !== null ) {
64
+
65
+ currentStack.assign( this, ...params );
66
+
67
+ } else {
68
+
69
+ error( 'TSL: No stack defined for assign operation. Make sure the assign is inside a Fn().' );
35
70
 
36
- setup( NodeClosure, params ) {
71
+ }
72
+
73
+ return this;
37
74
 
38
- const inputs = params.shift();
75
+ } else {
39
76
 
40
- return NodeClosure( nodeObjects( inputs ), ...params );
77
+ const nodeElement = NodeElements.get( 'assign' );
41
78
 
42
- },
79
+ return this.addToStack( nodeElement( ...params ) );
43
80
 
44
- get( node, prop, nodeObj ) {
81
+ }
45
82
 
46
- if ( typeof prop === 'string' && node[ prop ] === undefined ) {
83
+ };
47
84
 
48
- if ( node.isStackNode !== true && prop === 'assign' ) {
85
+ Node.prototype.toVarIntent = function () {
49
86
 
50
- return ( ...params ) => {
87
+ return this;
51
88
 
52
- currentStack.assign( nodeObj, ...params );
89
+ };
53
90
 
54
- return nodeObj;
91
+ Node.prototype.get = function ( value ) {
55
92
 
56
- };
93
+ return new MemberNode( this, value );
94
+
95
+ };
96
+
97
+ // Cache prototype for TSL
98
+
99
+ const proto = {};
100
+
101
+ // Set swizzle properties for xyzw, rgba, and stpq.
102
+
103
+ function setProtoSwizzle( property, altA, altB ) {
104
+
105
+ // swizzle properties
106
+
107
+ proto[ property ] = proto[ altA ] = proto[ altB ] = {
108
+
109
+ get() {
57
110
 
58
- } else if ( NodeElements.has( prop ) ) {
111
+ this._cache = this._cache || {};
59
112
 
60
- const nodeElement = NodeElements.get( prop );
113
+ //
61
114
 
62
- return node.isStackNode ? ( ...params ) => nodeObj.add( nodeElement( ...params ) ) : ( ...params ) => nodeElement( nodeObj, ...params );
115
+ let split = this._cache[ property ];
63
116
 
64
- } else if ( prop === 'self' ) {
117
+ if ( split === undefined ) {
65
118
 
66
- return node;
119
+ split = new SplitNode( this, property );
67
120
 
68
- } else if ( prop.endsWith( 'Assign' ) && NodeElements.has( prop.slice( 0, prop.length - 'Assign'.length ) ) ) {
121
+ this._cache[ property ] = split;
69
122
 
70
- const nodeElement = NodeElements.get( prop.slice( 0, prop.length - 'Assign'.length ) );
123
+ }
124
+
125
+ return split;
126
+
127
+ },
128
+
129
+ set( value ) {
130
+
131
+ this[ property ].assign( nodeObject( value ) );
71
132
 
72
- return node.isStackNode ? ( ...params ) => nodeObj.assign( params[ 0 ], nodeElement( ...params ) ) : ( ...params ) => nodeObj.assign( nodeElement( nodeObj, ...params ) );
133
+ }
73
134
 
74
- } else if ( /^[xyzwrgbastpq]{1,4}$/.test( prop ) === true ) {
135
+ };
75
136
 
76
- // accessing properties ( swizzle )
137
+ // set properties ( swizzle ) and sort to xyzw sequence
77
138
 
78
- prop = parseSwizzle( prop );
139
+ const propUpper = property.toUpperCase();
140
+ const altAUpper = altA.toUpperCase();
141
+ const altBUpper = altB.toUpperCase();
79
142
 
80
- return nodeObject( new SplitNode( nodeObj, prop ) );
143
+ // Set methods for swizzle properties
81
144
 
82
- } else if ( /^set[XYZWRGBASTPQ]{1,4}$/.test( prop ) === true ) {
145
+ Node.prototype[ 'set' + propUpper ] = Node.prototype[ 'set' + altAUpper ] = Node.prototype[ 'set' + altBUpper ] = function ( value ) {
83
146
 
84
- // set properties ( swizzle ) and sort to xyzw sequence
147
+ const swizzle = parseSwizzleAndSort( property );
85
148
 
86
- prop = parseSwizzleAndSort( prop.slice( 3 ).toLowerCase() );
149
+ return new SetNode( this, swizzle, nodeObject( value ) );
87
150
 
88
- return ( value ) => nodeObject( new SetNode( node, prop, nodeObject( value ) ) );
151
+ };
89
152
 
90
- } else if ( /^flip[XYZWRGBASTPQ]{1,4}$/.test( prop ) === true ) {
153
+ // Set methods for flip properties
91
154
 
92
- // set properties ( swizzle ) and sort to xyzw sequence
155
+ Node.prototype[ 'flip' + propUpper ] = Node.prototype[ 'flip' + altAUpper ] = Node.prototype[ 'flip' + altBUpper ] = function () {
93
156
 
94
- prop = parseSwizzleAndSort( prop.slice( 4 ).toLowerCase() );
157
+ const swizzle = parseSwizzleAndSort( property );
95
158
 
96
- return () => nodeObject( new FlipNode( nodeObject( node ), prop ) );
159
+ return new FlipNode( this, swizzle );
97
160
 
98
- } else if ( prop === 'width' || prop === 'height' || prop === 'depth' ) {
161
+ };
99
162
 
100
- // accessing property
163
+ }
101
164
 
102
- if ( prop === 'width' ) prop = 'x';
103
- else if ( prop === 'height' ) prop = 'y';
104
- else if ( prop === 'depth' ) prop = 'z';
165
+ const swizzleA = [ 'x', 'y', 'z', 'w' ];
166
+ const swizzleB = [ 'r', 'g', 'b', 'a' ];
167
+ const swizzleC = [ 's', 't', 'p', 'q' ];
105
168
 
106
- return nodeObject( new SplitNode( node, prop ) );
169
+ for ( let a = 0; a < 4; a ++ ) {
107
170
 
108
- } else if ( /^\d+$/.test( prop ) === true ) {
171
+ let prop = swizzleA[ a ];
172
+ let altA = swizzleB[ a ];
173
+ let altB = swizzleC[ a ];
109
174
 
110
- // accessing array
175
+ setProtoSwizzle( prop, altA, altB );
111
176
 
112
- return nodeObject( new ArrayElementNode( nodeObj, new ConstNode( Number( prop ), 'uint' ) ) );
177
+ for ( let b = 0; b < 4; b ++ ) {
113
178
 
114
- } else if ( /^get$/.test( prop ) === true ) {
179
+ prop = swizzleA[ a ] + swizzleA[ b ];
180
+ altA = swizzleB[ a ] + swizzleB[ b ];
181
+ altB = swizzleC[ a ] + swizzleC[ b ];
115
182
 
116
- // accessing properties
183
+ setProtoSwizzle( prop, altA, altB );
117
184
 
118
- return ( value ) => nodeObject( new MemberNode( nodeObj, value ) );
185
+ for ( let c = 0; c < 4; c ++ ) {
186
+
187
+ prop = swizzleA[ a ] + swizzleA[ b ] + swizzleA[ c ];
188
+ altA = swizzleB[ a ] + swizzleB[ b ] + swizzleB[ c ];
189
+ altB = swizzleC[ a ] + swizzleC[ b ] + swizzleC[ c ];
190
+
191
+ setProtoSwizzle( prop, altA, altB );
192
+
193
+ for ( let d = 0; d < 4; d ++ ) {
194
+
195
+ prop = swizzleA[ a ] + swizzleA[ b ] + swizzleA[ c ] + swizzleA[ d ];
196
+ altA = swizzleB[ a ] + swizzleB[ b ] + swizzleB[ c ] + swizzleB[ d ];
197
+ altB = swizzleC[ a ] + swizzleC[ b ] + swizzleC[ c ] + swizzleC[ d ];
198
+
199
+ setProtoSwizzle( prop, altA, altB );
119
200
 
120
201
  }
121
202
 
122
203
  }
123
204
 
124
- return Reflect.get( node, prop, nodeObj );
205
+ }
206
+
207
+ }
208
+
209
+ // Set/get static properties for array elements (0-31).
125
210
 
126
- },
211
+ for ( let i = 0; i < 32; i ++ ) {
127
212
 
128
- set( node, prop, value, nodeObj ) {
213
+ proto[ i ] = {
129
214
 
130
- if ( typeof prop === 'string' && node[ prop ] === undefined ) {
215
+ get() {
131
216
 
132
- // setting properties
217
+ this._cache = this._cache || {};
133
218
 
134
- if ( /^[xyzwrgbastpq]{1,4}$/.test( prop ) === true || prop === 'width' || prop === 'height' || prop === 'depth' || /^\d+$/.test( prop ) === true ) {
219
+ //
135
220
 
136
- nodeObj[ prop ].assign( value );
221
+ let element = this._cache[ i ];
137
222
 
138
- return true;
223
+ if ( element === undefined ) {
224
+
225
+ element = new ArrayElementNode( this, new ConstNode( i, 'uint' ) );
226
+
227
+ this._cache[ i ] = element;
139
228
 
140
229
  }
141
230
 
231
+ return element;
232
+
233
+ },
234
+
235
+ set( value ) {
236
+
237
+ this[ i ].assign( nodeObject( value ) );
238
+
142
239
  }
143
240
 
144
- return Reflect.set( node, prop, value, nodeObj );
241
+ };
145
242
 
146
- }
243
+ }
147
244
 
148
- };
245
+ /*
246
+ // Set properties for width, height, and depth.
149
247
 
150
- const nodeObjectsCacheMap = new WeakMap();
151
- const nodeBuilderFunctionsCacheMap = new WeakMap();
248
+ function setProtoProperty( property, target ) {
152
249
 
153
- const ShaderNodeObject = function ( obj, altType = null ) {
250
+ proto[ property ] = {
154
251
 
155
- const type = getValueType( obj );
252
+ get() {
156
253
 
157
- if ( type === 'node' ) {
254
+ this._cache = this._cache || {};
255
+
256
+ //
158
257
 
159
- let nodeObject = nodeObjectsCacheMap.get( obj );
258
+ let split = this._cache[ target ];
160
259
 
161
- if ( nodeObject === undefined ) {
260
+ if ( split === undefined ) {
261
+
262
+ split = new SplitNode( this, target );
263
+
264
+ this._cache[ target ] = split;
265
+
266
+ }
162
267
 
163
- nodeObject = new Proxy( obj, shaderNodeHandler );
268
+ return split;
164
269
 
165
- nodeObjectsCacheMap.set( obj, nodeObject );
166
- nodeObjectsCacheMap.set( nodeObject, nodeObject );
270
+ },
271
+
272
+ set( value ) {
273
+
274
+ this[ target ].assign( nodeObject( value ) );
167
275
 
168
276
  }
169
277
 
170
- return nodeObject;
278
+ };
279
+
280
+ }
281
+
282
+ setProtoProperty( 'width', 'x' );
283
+ setProtoProperty( 'height', 'y' );
284
+ setProtoProperty( 'depth', 'z' );
285
+ */
286
+
287
+ Object.defineProperties( Node.prototype, proto );
288
+
289
+ // --- FINISH ---
290
+
291
+ const nodeBuilderFunctionsCacheMap = new WeakMap();
292
+
293
+ const ShaderNodeObject = function ( obj, altType = null ) {
294
+
295
+ const type = getValueType( obj );
296
+
297
+ if ( type === 'node' ) {
298
+
299
+ return obj;
171
300
 
172
301
  } else if ( ( altType === null && ( type === 'float' || type === 'boolean' ) ) || ( type && type !== 'shader' && type !== 'string' ) ) {
173
302
 
@@ -175,7 +304,7 @@ const ShaderNodeObject = function ( obj, altType = null ) {
175
304
 
176
305
  } else if ( type === 'shader' ) {
177
306
 
178
- return Fn( obj );
307
+ return obj.isFn ? obj : Fn( obj );
179
308
 
180
309
  }
181
310
 
@@ -211,7 +340,28 @@ const ShaderNodeArray = function ( array, altType = null ) {
211
340
 
212
341
  const ShaderNodeProxy = function ( NodeClass, scope = null, factor = null, settings = null ) {
213
342
 
214
- const assignNode = ( node ) => nodeObject( settings !== null ? Object.assign( node, settings ) : node );
343
+ function assignNode( node ) {
344
+
345
+ if ( settings !== null ) {
346
+
347
+ node = nodeObject( Object.assign( node, settings ) );
348
+
349
+ if ( settings.intent === true ) {
350
+
351
+ node = node.toVarIntent();
352
+
353
+ }
354
+
355
+ } else {
356
+
357
+ node = nodeObject( node );
358
+
359
+ }
360
+
361
+ return node;
362
+
363
+
364
+ }
215
365
 
216
366
  let fn, name = scope, minParams, maxParams;
217
367
 
@@ -224,13 +374,13 @@ const ShaderNodeProxy = function ( NodeClass, scope = null, factor = null, setti
224
374
 
225
375
  if ( minParams !== undefined && params.length < minParams ) {
226
376
 
227
- console.error( `THREE.TSL: "${ tslName }" parameter length is less than minimum required.` );
377
+ error( `TSL: "${ tslName }" parameter length is less than minimum required.` );
228
378
 
229
379
  return params.concat( new Array( minParams - params.length ).fill( 0 ) );
230
380
 
231
381
  } else if ( maxParams !== undefined && params.length > maxParams ) {
232
382
 
233
- console.error( `THREE.TSL: "${ tslName }" parameter length exceeds limit.` );
383
+ error( `TSL: "${ tslName }" parameter length exceeds limit.` );
234
384
 
235
385
  return params.slice( 0, maxParams );
236
386
 
@@ -297,12 +447,12 @@ const ShaderNodeImmutable = function ( NodeClass, ...params ) {
297
447
 
298
448
  class ShaderCallNodeInternal extends Node {
299
449
 
300
- constructor( shaderNode, inputNodes ) {
450
+ constructor( shaderNode, rawInputs ) {
301
451
 
302
452
  super();
303
453
 
304
454
  this.shaderNode = shaderNode;
305
- this.inputNodes = inputNodes;
455
+ this.rawInputs = rawInputs;
306
456
 
307
457
  this.isShaderCallNodeInternal = true;
308
458
 
@@ -314,6 +464,12 @@ class ShaderCallNodeInternal extends Node {
314
464
 
315
465
  }
316
466
 
467
+ getElementType( builder ) {
468
+
469
+ return this.getOutputNode( builder ).getElementType( builder );
470
+
471
+ }
472
+
317
473
  getMemberType( builder, name ) {
318
474
 
319
475
  return this.getOutputNode( builder ).getMemberType( builder, name );
@@ -322,19 +478,27 @@ class ShaderCallNodeInternal extends Node {
322
478
 
323
479
  call( builder ) {
324
480
 
325
- const { shaderNode, inputNodes } = this;
481
+ const { shaderNode, rawInputs } = this;
326
482
 
327
483
  const properties = builder.getNodeProperties( shaderNode );
328
- const onceNS = shaderNode.namespace && shaderNode.namespace === builder.namespace ? builder.getNamespace( 'once' ) : 'once';
329
484
 
330
- if ( properties[ onceNS ] ) {
485
+ const subBuild = builder.getClosestSubBuild( shaderNode.subBuilds ) || '';
486
+ const subBuildProperty = subBuild || 'default';
331
487
 
332
- return properties[ onceNS ];
488
+ if ( properties[ subBuildProperty ] ) {
489
+
490
+ return properties[ subBuildProperty ];
333
491
 
334
492
  }
335
493
 
336
494
  //
337
495
 
496
+ const previousSubBuildFn = builder.subBuildFn;
497
+ const previousFnCall = builder.fnCall;
498
+
499
+ builder.subBuildFn = subBuild;
500
+ builder.fnCall = this;
501
+
338
502
  let result = null;
339
503
 
340
504
  if ( shaderNode.layout ) {
@@ -361,20 +525,59 @@ class ShaderCallNodeInternal extends Node {
361
525
 
362
526
  builder.addInclude( functionNode );
363
527
 
364
- result = nodeObject( functionNode.call( inputNodes ) );
528
+ //
529
+
530
+ const inputs = rawInputs ? getLayoutParameters( rawInputs ) : null;
531
+
532
+ result = nodeObject( functionNode.call( inputs ) );
365
533
 
366
534
  } else {
367
535
 
536
+ const secureNodeBuilder = new Proxy( builder, {
537
+
538
+ get: ( target, property, receiver ) => {
539
+
540
+ let value;
541
+
542
+ if ( Symbol.iterator === property ) {
543
+
544
+ value = function* () {
545
+
546
+ yield undefined;
547
+
548
+ };
549
+
550
+ } else {
551
+
552
+ value = Reflect.get( target, property, receiver );
553
+
554
+ }
555
+
556
+ return value;
557
+
558
+ }
559
+
560
+ } );
561
+
562
+ //
563
+
564
+ const inputs = rawInputs ? getProxyParameters( rawInputs ) : null;
565
+
566
+ const hasParameters = Array.isArray( rawInputs ) ? rawInputs.length > 0 : rawInputs !== null;
567
+
368
568
  const jsFunc = shaderNode.jsFunc;
369
- const outputNode = inputNodes !== null || jsFunc.length > 1 ? jsFunc( inputNodes || [], builder ) : jsFunc( builder );
569
+ const outputNode = hasParameters || jsFunc.length > 1 ? jsFunc( inputs, secureNodeBuilder ) : jsFunc( secureNodeBuilder );
370
570
 
371
571
  result = nodeObject( outputNode );
372
572
 
373
573
  }
374
574
 
575
+ builder.subBuildFn = previousSubBuildFn;
576
+ builder.fnCall = previousFnCall;
577
+
375
578
  if ( shaderNode.once ) {
376
579
 
377
- properties[ onceNS ] = result;
580
+ properties[ subBuildProperty ] = result;
378
581
 
379
582
  }
380
583
 
@@ -395,11 +598,12 @@ class ShaderCallNodeInternal extends Node {
395
598
  getOutputNode( builder ) {
396
599
 
397
600
  const properties = builder.getNodeProperties( this );
398
- const outputNamespace = builder.getOutputNamespace();
601
+ const subBuildOutput = builder.getSubBuildOutput( this );
399
602
 
400
- properties[ outputNamespace ] = properties[ outputNamespace ] || this.setupOutput( builder );
603
+ properties[ subBuildOutput ] = properties[ subBuildOutput ] || this.setupOutput( builder );
604
+ properties[ subBuildOutput ].subBuild = builder.getClosestSubBuild( this );
401
605
 
402
- return properties[ outputNamespace ];
606
+ return properties[ subBuildOutput ];
403
607
 
404
608
  }
405
609
 
@@ -410,23 +614,49 @@ class ShaderCallNodeInternal extends Node {
410
614
  const buildStage = builder.getBuildStage();
411
615
  const properties = builder.getNodeProperties( this );
412
616
 
413
- const outputNamespace = builder.getOutputNamespace();
617
+ const subBuildOutput = builder.getSubBuildOutput( this );
414
618
  const outputNode = this.getOutputNode( builder );
415
619
 
620
+ const previousFnCall = builder.fnCall;
621
+
622
+ builder.fnCall = this;
623
+
416
624
  if ( buildStage === 'setup' ) {
417
625
 
418
- const initializedNamespace = builder.getNamespace( 'initialized' );
626
+ const subBuildInitialized = builder.getSubBuildProperty( 'initialized', this );
627
+
628
+ if ( properties[ subBuildInitialized ] !== true ) {
629
+
630
+ properties[ subBuildInitialized ] = true;
631
+
632
+ properties[ subBuildOutput ] = this.getOutputNode( builder );
633
+ properties[ subBuildOutput ].build( builder );
634
+
635
+ // If the shaderNode has subBuilds, add them to the chaining nodes
636
+ // so they can be built later in the build process.
637
+
638
+ if ( this.shaderNode.subBuilds ) {
639
+
640
+ for ( const node of builder.chaining ) {
419
641
 
420
- if ( properties[ initializedNamespace ] !== true ) {
642
+ const nodeData = builder.getDataFromNode( node, 'any' );
643
+ nodeData.subBuilds = nodeData.subBuilds || new Set();
421
644
 
422
- properties[ initializedNamespace ] = true;
645
+ for ( const subBuild of this.shaderNode.subBuilds ) {
423
646
 
424
- properties[ outputNamespace ] = this.getOutputNode( builder );
425
- properties[ outputNamespace ].build( builder );
647
+ nodeData.subBuilds.add( subBuild );
648
+
649
+ }
650
+
651
+ //builder.getDataFromNode( node ).subBuilds = nodeData.subBuilds;
652
+
653
+ }
654
+
655
+ }
426
656
 
427
657
  }
428
658
 
429
- result = properties[ outputNamespace ];
659
+ result = properties[ subBuildOutput ];
430
660
 
431
661
  } else if ( buildStage === 'analyze' ) {
432
662
 
@@ -438,12 +668,118 @@ class ShaderCallNodeInternal extends Node {
438
668
 
439
669
  }
440
670
 
671
+ builder.fnCall = previousFnCall;
672
+
441
673
  return result;
442
674
 
443
675
  }
444
676
 
445
677
  }
446
678
 
679
+ function getLayoutParameters( params ) {
680
+
681
+ let output;
682
+
683
+ nodeObjects( params );
684
+
685
+ const isArrayAsParameter = params[ 0 ] && ( params[ 0 ].isNode || Object.getPrototypeOf( params[ 0 ] ) !== Object.prototype );
686
+
687
+ if ( isArrayAsParameter ) {
688
+
689
+ output = [ ...params ];
690
+
691
+ } else {
692
+
693
+ output = params[ 0 ];
694
+
695
+ }
696
+
697
+ return output;
698
+
699
+ }
700
+
701
+ function getProxyParameters( params ) {
702
+
703
+ let index = 0;
704
+
705
+ nodeObjects( params );
706
+
707
+ return new Proxy( params, {
708
+
709
+ get: ( target, property, receiver ) => {
710
+
711
+ let value;
712
+
713
+ if ( property === 'length' ) {
714
+
715
+ value = params.length;
716
+
717
+ return value;
718
+
719
+ }
720
+
721
+ if ( Symbol.iterator === property ) {
722
+
723
+ value = function* () {
724
+
725
+ for ( const inputNode of params ) {
726
+
727
+ yield nodeObject( inputNode );
728
+
729
+ }
730
+
731
+ };
732
+
733
+ } else {
734
+
735
+ if ( params.length > 0 ) {
736
+
737
+ if ( Object.getPrototypeOf( params[ 0 ] ) === Object.prototype ) {
738
+
739
+ const objectTarget = params[ 0 ];
740
+
741
+ if ( objectTarget[ property ] === undefined ) {
742
+
743
+ value = objectTarget[ index ++ ];
744
+
745
+ } else {
746
+
747
+ value = Reflect.get( objectTarget, property, receiver );
748
+
749
+ }
750
+
751
+ } else if ( params[ 0 ] instanceof Node ) {
752
+
753
+ if ( params[ property ] === undefined ) {
754
+
755
+ value = params[ index ++ ];
756
+
757
+ } else {
758
+
759
+ value = Reflect.get( params, property, receiver );
760
+
761
+ }
762
+
763
+ }
764
+
765
+ } else {
766
+
767
+ value = Reflect.get( target, property, receiver );
768
+
769
+ }
770
+
771
+ value = nodeObject( value );
772
+
773
+ }
774
+
775
+ return value;
776
+
777
+ }
778
+
779
+ } );
780
+
781
+ }
782
+
447
783
  class ShaderNodeInternal extends Node {
448
784
 
449
785
  constructor( jsFunc, nodeType ) {
@@ -456,7 +792,6 @@ class ShaderNodeInternal extends Node {
456
792
  this.global = true;
457
793
 
458
794
  this.once = false;
459
- this.namespace = null;
460
795
 
461
796
  }
462
797
 
@@ -468,11 +803,15 @@ class ShaderNodeInternal extends Node {
468
803
 
469
804
  }
470
805
 
471
- call( inputs = null ) {
806
+ getLayout() {
472
807
 
473
- nodeObjects( inputs );
808
+ return this.layout;
474
809
 
475
- return nodeObject( new ShaderCallNodeInternal( this, inputs ) );
810
+ }
811
+
812
+ call( rawInputs = null ) {
813
+
814
+ return new ShaderCallNodeInternal( this, rawInputs );
476
815
 
477
816
  }
478
817
 
@@ -524,25 +863,29 @@ const getConstNode = ( value, type ) => {
524
863
 
525
864
  };
526
865
 
527
- const safeGetNodeType = ( node ) => {
866
+ const ConvertType = function ( type, cacheMap = null ) {
528
867
 
529
- try {
868
+ return ( ...params ) => {
530
869
 
531
- return node.getNodeType();
870
+ for ( const param of params ) {
532
871
 
533
- } catch ( _ ) {
872
+ if ( param === undefined ) {
534
873
 
535
- return undefined;
874
+ error( `TSL: Invalid parameter for the type "${ type }".` );
536
875
 
537
- }
876
+ return nodeObject( new ConstNode( 0, type ) );
538
877
 
539
- };
878
+ }
540
879
 
541
- const ConvertType = function ( type, cacheMap = null ) {
880
+ }
542
881
 
543
- return ( ...params ) => {
882
+ if ( params.length === 0 || ( ! [ 'bool', 'float', 'int', 'uint' ].includes( type ) && params.every( param => {
883
+
884
+ const paramType = typeof param;
885
+
886
+ return paramType !== 'object' && paramType !== 'function';
544
887
 
545
- if ( params.length === 0 || ( ! [ 'bool', 'float', 'int', 'uint' ].includes( type ) && params.every( param => typeof param !== 'object' ) ) ) {
888
+ } ) ) ) {
546
889
 
547
890
  params = [ getValueFromType( type, ...params ) ];
548
891
 
@@ -550,20 +893,20 @@ const ConvertType = function ( type, cacheMap = null ) {
550
893
 
551
894
  if ( params.length === 1 && cacheMap !== null && cacheMap.has( params[ 0 ] ) ) {
552
895
 
553
- return nodeObject( cacheMap.get( params[ 0 ] ) );
896
+ return nodeObjectIntent( cacheMap.get( params[ 0 ] ) );
554
897
 
555
898
  }
556
899
 
557
900
  if ( params.length === 1 ) {
558
901
 
559
902
  const node = getConstNode( params[ 0 ], type );
560
- if ( safeGetNodeType( node ) === type ) return nodeObject( node );
561
- return nodeObject( new ConvertNode( node, type ) );
903
+ if ( node.nodeType === type ) return nodeObjectIntent( node );
904
+ return nodeObjectIntent( new ConvertNode( node, type ) );
562
905
 
563
906
  }
564
907
 
565
908
  const nodes = params.map( param => getConstNode( param ) );
566
- return nodeObject( new JoinNode( nodes, type ) );
909
+ return nodeObjectIntent( new JoinNode( nodes, type ) );
567
910
 
568
911
  };
569
912
 
@@ -581,129 +924,161 @@ export const getConstNodeType = ( value ) => ( value !== undefined && value !==
581
924
 
582
925
  export function ShaderNode( jsFunc, nodeType ) {
583
926
 
584
- return new Proxy( new ShaderNodeInternal( jsFunc, nodeType ), shaderNodeHandler );
927
+ return new ShaderNodeInternal( jsFunc, nodeType );
585
928
 
586
929
  }
587
930
 
588
931
  export const nodeObject = ( val, altType = null ) => /* new */ ShaderNodeObject( val, altType );
932
+ export const nodeObjectIntent = ( val, altType = null ) => /* new */ nodeObject( val, altType ).toVarIntent();
589
933
  export const nodeObjects = ( val, altType = null ) => new ShaderNodeObjects( val, altType );
590
934
  export const nodeArray = ( val, altType = null ) => new ShaderNodeArray( val, altType );
591
- export const nodeProxy = ( ...params ) => new ShaderNodeProxy( ...params );
592
- export const nodeImmutable = ( ...params ) => new ShaderNodeImmutable( ...params );
935
+ export const nodeProxy = ( NodeClass, scope = null, factor = null, settings = null ) => new ShaderNodeProxy( NodeClass, scope, factor, settings );
936
+ export const nodeImmutable = ( NodeClass, ...params ) => new ShaderNodeImmutable( NodeClass, ...params );
937
+ export const nodeProxyIntent = ( NodeClass, scope = null, factor = null, settings = {} ) => new ShaderNodeProxy( NodeClass, scope, factor, { ...settings, intent: true } );
593
938
 
594
939
  let fnId = 0;
595
940
 
596
- export const Fn = ( jsFunc, layout = null ) => {
941
+ class FnNode extends Node {
597
942
 
598
- let nodeType = null;
943
+ constructor( jsFunc, layout = null ) {
599
944
 
600
- if ( layout !== null ) {
945
+ super();
601
946
 
602
- if ( typeof layout === 'object' ) {
947
+ let nodeType = null;
603
948
 
604
- nodeType = layout.return;
949
+ if ( layout !== null ) {
605
950
 
606
- } else {
951
+ if ( typeof layout === 'object' ) {
607
952
 
608
- if ( typeof layout === 'string' ) {
609
-
610
- nodeType = layout;
953
+ nodeType = layout.return;
611
954
 
612
955
  } else {
613
956
 
614
- console.error( 'THREE.TSL: Invalid layout type.' );
957
+ if ( typeof layout === 'string' ) {
958
+
959
+ nodeType = layout;
960
+
961
+ } else {
962
+
963
+ error( 'TSL: Invalid layout type.' );
964
+
965
+ }
966
+
967
+ layout = null;
615
968
 
616
969
  }
617
970
 
618
- layout = null;
971
+ }
972
+
973
+ this.shaderNode = new ShaderNode( jsFunc, nodeType );
974
+
975
+ if ( layout !== null ) {
976
+
977
+ this.setLayout( layout );
619
978
 
620
979
  }
621
980
 
981
+ this.isFn = true;
982
+
622
983
  }
623
984
 
624
- const shaderNode = new ShaderNode( jsFunc, nodeType );
985
+ setLayout( layout ) {
625
986
 
626
- const fn = ( ...params ) => {
987
+ const nodeType = this.shaderNode.nodeType;
627
988
 
628
- let inputs;
989
+ if ( typeof layout.inputs !== 'object' ) {
629
990
 
630
- nodeObjects( params );
991
+ const fullLayout = {
992
+ name: 'fn' + fnId ++,
993
+ type: nodeType,
994
+ inputs: []
995
+ };
631
996
 
632
- const isArrayAsParameter = params[ 0 ] && ( params[ 0 ].isNode || Object.getPrototypeOf( params[ 0 ] ) !== Object.prototype );
997
+ for ( const name in layout ) {
633
998
 
634
- if ( isArrayAsParameter ) {
999
+ if ( name === 'return' ) continue;
635
1000
 
636
- inputs = [ ...params ];
1001
+ fullLayout.inputs.push( {
1002
+ name: name,
1003
+ type: layout[ name ]
1004
+ } );
637
1005
 
638
- } else {
1006
+ }
639
1007
 
640
- inputs = params[ 0 ];
1008
+ layout = fullLayout;
641
1009
 
642
1010
  }
643
1011
 
644
- const fnCall = shaderNode.call( inputs );
1012
+ this.shaderNode.setLayout( layout );
645
1013
 
646
- if ( nodeType === 'void' ) fnCall.toStack();
1014
+ return this;
647
1015
 
648
- return fnCall;
1016
+ }
649
1017
 
650
- };
1018
+ getNodeType( builder ) {
651
1019
 
652
- fn.shaderNode = shaderNode;
653
- fn.id = shaderNode.id;
1020
+ return this.shaderNode.getNodeType( builder ) || 'float';
654
1021
 
655
- fn.getNodeType = ( ...params ) => shaderNode.getNodeType( ...params );
656
- fn.getCacheKey = ( ...params ) => shaderNode.getCacheKey( ...params );
1022
+ }
657
1023
 
658
- fn.setLayout = ( layout ) => {
1024
+ call( ...params ) {
659
1025
 
660
- shaderNode.setLayout( layout );
1026
+ const fnCall = this.shaderNode.call( params );
661
1027
 
662
- return fn;
1028
+ if ( this.shaderNode.nodeType === 'void' ) fnCall.toStack();
663
1029
 
664
- };
1030
+ return fnCall.toVarIntent();
665
1031
 
666
- fn.once = ( namespace = null ) => {
1032
+ }
667
1033
 
668
- shaderNode.once = true;
669
- shaderNode.namespace = namespace;
1034
+ once( subBuilds = null ) {
670
1035
 
671
- return fn;
1036
+ this.shaderNode.once = true;
1037
+ this.shaderNode.subBuilds = subBuilds;
672
1038
 
673
- };
1039
+ return this;
674
1040
 
675
- if ( layout !== null ) {
1041
+ }
676
1042
 
677
- if ( typeof layout.inputs !== 'object' ) {
1043
+ generate( builder ) {
678
1044
 
679
- const fullLayout = {
680
- name: 'fn' + fnId ++,
681
- type: nodeType,
682
- inputs: []
683
- };
1045
+ const type = this.getNodeType( builder );
684
1046
 
685
- for ( const name in layout ) {
1047
+ error( 'TSL: "Fn()" was declared but not invoked. Try calling it like "Fn()( ...params )".' );
686
1048
 
687
- if ( name === 'return' ) continue;
1049
+ return builder.generateConst( type );
688
1050
 
689
- fullLayout.inputs.push( {
690
- name: name,
691
- type: layout[ name ]
692
- } );
1051
+ }
693
1052
 
694
- }
1053
+ }
695
1054
 
696
- layout = fullLayout;
1055
+ export function Fn( jsFunc, layout = null ) {
697
1056
 
698
- }
1057
+ const instance = new FnNode( jsFunc, layout );
699
1058
 
700
- fn.setLayout( layout );
1059
+ return new Proxy( () => {}, {
701
1060
 
702
- }
1061
+ apply( target, thisArg, params ) {
703
1062
 
704
- return fn;
1063
+ return instance.call( ...params );
705
1064
 
706
- };
1065
+ },
1066
+
1067
+ get( target, prop, receiver ) {
1068
+
1069
+ return Reflect.get( instance, prop, receiver );
1070
+
1071
+ },
1072
+
1073
+ set( target, prop, value, receiver ) {
1074
+
1075
+ return Reflect.set( instance, prop, value, receiver );
1076
+
1077
+ }
1078
+
1079
+ } );
1080
+
1081
+ }
707
1082
 
708
1083
  //
709
1084
 
@@ -760,7 +1135,7 @@ export const Switch = ( ...params ) => currentStack.Switch( ...params );
760
1135
  */
761
1136
  export function Stack( node ) {
762
1137
 
763
- if ( currentStack ) currentStack.add( node );
1138
+ if ( currentStack ) currentStack.addToStack( node );
764
1139
 
765
1140
  return node;
766
1141
 
@@ -841,29 +1216,14 @@ addMethodChaining( 'convert', convert );
841
1216
  */
842
1217
  export const append = ( node ) => { // @deprecated, r176
843
1218
 
844
- console.warn( 'THREE.TSL: append() has been renamed to Stack().' );
1219
+ warn( 'TSL: append() has been renamed to Stack().' );
845
1220
  return Stack( node );
846
1221
 
847
1222
  };
848
1223
 
849
1224
  addMethodChaining( 'append', ( node ) => { // @deprecated, r176
850
1225
 
851
- console.warn( 'THREE.TSL: .append() has been renamed to .toStack().' );
1226
+ warn( 'TSL: .append() has been renamed to .toStack().' );
852
1227
  return Stack( node );
853
1228
 
854
1229
  } );
855
-
856
- /**
857
- * @tsl
858
- * @function
859
- * @deprecated since r168. Use {@link Fn} instead.
860
- *
861
- * @param {...any} params
862
- * @returns {Function}
863
- */
864
- export const tslFn = ( ...params ) => { // @deprecated, r168
865
-
866
- console.warn( 'THREE.TSL: tslFn() has been renamed to Fn().' );
867
- return Fn( ...params );
868
-
869
- };