@plastic-software/three 0.179.0 → 0.181.1

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