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
@@ -1,5 +1,6 @@
1
1
  import Node from './Node.js';
2
2
  import { addMethodChaining, nodeProxy } from '../tsl/TSLCore.js';
3
+ import { warn } from '../../utils.js';
3
4
 
4
5
  /**
5
6
  * This node can be used as a context management component for another node.
@@ -78,11 +79,22 @@ class ContextNode extends Node {
78
79
 
79
80
  }
80
81
 
81
- analyze( builder ) {
82
+ /**
83
+ * This method is overwritten to ensure it returns the member type of {@link ContextNode#node}.
84
+ *
85
+ * @param {NodeBuilder} builder - The current node builder.
86
+ * @param {string} name - The member name.
87
+ * @returns {string} The member type.
88
+ */
89
+ getMemberType( builder, name ) {
90
+
91
+ return this.node.getMemberType( builder, name );
82
92
 
83
- const previousContext = builder.getContext();
93
+ }
84
94
 
85
- builder.setContext( { ...builder.context, ...this.value } );
95
+ analyze( builder ) {
96
+
97
+ const previousContext = builder.addContext( this.value );
86
98
 
87
99
  this.node.build( builder );
88
100
 
@@ -92,9 +104,7 @@ class ContextNode extends Node {
92
104
 
93
105
  setup( builder ) {
94
106
 
95
- const previousContext = builder.getContext();
96
-
97
- builder.setContext( { ...builder.context, ...this.value } );
107
+ const previousContext = builder.addContext( this.value );
98
108
 
99
109
  this.node.build( builder );
100
110
 
@@ -104,9 +114,7 @@ class ContextNode extends Node {
104
114
 
105
115
  generate( builder, output ) {
106
116
 
107
- const previousContext = builder.getContext();
108
-
109
- builder.setContext( { ...builder.context, ...this.value } );
117
+ const previousContext = builder.addContext( this.value );
110
118
 
111
119
  const snippet = this.node.build( builder, output );
112
120
 
@@ -131,16 +139,46 @@ export default ContextNode;
131
139
  */
132
140
  export const context = /*@__PURE__*/ nodeProxy( ContextNode ).setParameterLength( 1, 2 );
133
141
 
142
+ /**
143
+ * TSL function for defining a uniformFlow context value for a given node.
144
+ *
145
+ * @tsl
146
+ * @function
147
+ * @param {Node} node - The node whose dependencies should all execute within a uniform control-flow path.
148
+ * @returns {ContextNode}
149
+ */
150
+ export const uniformFlow = ( node ) => context( node, { uniformFlow: true } );
151
+
152
+ /**
153
+ * TSL function for defining a name for the context value for a given node.
154
+ *
155
+ * @tsl
156
+ * @function
157
+ * @param {Node} node - The node whose context should be modified.
158
+ * @param {string} name - The name to set.
159
+ * @returns {ContextNode}
160
+ */
161
+ export const setName = ( node, name ) => context( node, { nodeName: name } );
162
+
134
163
  /**
135
164
  * TSL function for defining a label context value for a given node.
136
165
  *
137
166
  * @tsl
138
167
  * @function
168
+ * @deprecated
139
169
  * @param {Node} node - The node whose context should be modified.
140
170
  * @param {string} name - The name/label to set.
141
171
  * @returns {ContextNode}
142
172
  */
143
- export const label = ( node, name ) => context( node, { label: name } );
173
+ export function label( node, name ) {
174
+
175
+ warn( 'TSL: "label()" has been deprecated. Use "setName()" instead.' ); // @deprecated r179
176
+
177
+ return setName( node, name );
178
+
179
+ }
144
180
 
145
181
  addMethodChaining( 'context', context );
146
182
  addMethodChaining( 'label', label );
183
+ addMethodChaining( 'uniformFlow', uniformFlow );
184
+ addMethodChaining( 'setName', setName );
@@ -10,7 +10,7 @@ import { nodeImmutable, varying } from '../tsl/TSLBase.js';
10
10
  * - `drawIndex`: The index of a draw call.
11
11
  * - `invocationLocalIndex`: The index of a compute invocation within the scope of a workgroup load.
12
12
  * - `invocationSubgroupIndex`: The index of a compute invocation within the scope of a subgroup.
13
- * - `subgroupIndex`: The index of the subgroup the current compute invocation belongs to.
13
+ * - `subgroupIndex`: The index of a compute invocation's subgroup within its workgroup.
14
14
  *
15
15
  * @augments Node
16
16
  */
@@ -25,7 +25,7 @@ class IndexNode extends Node {
25
25
  /**
26
26
  * Constructs a new index node.
27
27
  *
28
- * @param {('vertex'|'instance'|'subgroup'|'invocationLocal'|'invocationSubgroup'|'draw')} scope - The scope of the index node.
28
+ * @param {('vertex'|'instance'|'subgroup'|'invocationLocal'|'invocationGlobal'|'invocationSubgroup'|'draw')} scope - The scope of the index node.
29
29
  */
30
30
  constructor( scope ) {
31
31
 
@@ -1,5 +1,6 @@
1
1
  import Node from './Node.js';
2
2
  import { getValueType, getValueFromType, arrayBufferToBase64 } from './NodeUtils.js';
3
+ import { warn } from '../../utils.js';
3
4
 
4
5
  /**
5
6
  * Base class for representing data input nodes.
@@ -126,7 +127,7 @@ class InputNode extends Node {
126
127
 
127
128
  generate( /*builder, output*/ ) {
128
129
 
129
- console.warn( 'Abstract function.' );
130
+ warn( 'Abstract function.' );
130
131
 
131
132
  }
132
133
 
@@ -0,0 +1,128 @@
1
+ import Node from './Node.js';
2
+ import InspectorBase from '../../renderers/common/InspectorBase.js';
3
+ import { addMethodChaining, nodeObject } from '../tsl/TSLCore.js';
4
+ import { NodeUpdateType } from './constants.js';
5
+ import { warnOnce } from '../../utils.js';
6
+
7
+ /**
8
+ * InspectorNode is a wrapper node that allows inspection of node values during rendering.
9
+ * It can be used to debug or analyze node outputs in the rendering pipeline.
10
+ *
11
+ * @augments Node
12
+ */
13
+ class InspectorNode extends Node {
14
+
15
+ /**
16
+ * Returns the type of the node.
17
+ *
18
+ * @returns {string}
19
+ */
20
+ static get type() {
21
+
22
+ return 'InspectorNode';
23
+
24
+ }
25
+
26
+ /**
27
+ * Creates an InspectorNode.
28
+ *
29
+ * @param {Node} node - The node to inspect.
30
+ * @param {string} [name=''] - Optional name for the inspector node.
31
+ * @param {Function|null} [callback=null] - Optional callback to modify the node during setup.
32
+ */
33
+ constructor( node, name = '', callback = null ) {
34
+
35
+ super();
36
+
37
+ this.node = node;
38
+ this.name = name;
39
+ this.callback = callback;
40
+
41
+ this.updateType = NodeUpdateType.FRAME;
42
+
43
+ this.isInspectorNode = true;
44
+
45
+ }
46
+
47
+ /**
48
+ * Returns the name of the inspector node.
49
+ *
50
+ * @returns {string}
51
+ */
52
+ getName() {
53
+
54
+ return this.name || this.node.name;
55
+
56
+ }
57
+
58
+ /**
59
+ * Updates the inspector node, allowing inspection of the wrapped node.
60
+ *
61
+ * @param {NodeFrame} frame - A reference to the current node frame.
62
+ */
63
+ update( frame ) {
64
+
65
+ frame.renderer.inspector.inspect( this );
66
+
67
+ }
68
+
69
+ /**
70
+ * Returns the type of the wrapped node.
71
+ *
72
+ * @param {NodeBuilder} builder - The node builder.
73
+ * @returns {string}
74
+ */
75
+ getNodeType( builder ) {
76
+
77
+ return this.node.getNodeType( builder );
78
+
79
+ }
80
+
81
+ /**
82
+ * Sets up the inspector node.
83
+ *
84
+ * @param {NodeBuilder} builder - The node builder.
85
+ * @returns {Node} The setup node.
86
+ */
87
+ setup( builder ) {
88
+
89
+ let node = this.node;
90
+
91
+ if ( builder.context.inspector === true && this.callback !== null ) {
92
+
93
+ node = this.callback( node );
94
+
95
+ }
96
+
97
+ if ( builder.renderer.backend.isWebGPUBackend !== true && builder.renderer.inspector.constructor !== InspectorBase ) {
98
+
99
+ warnOnce( 'TSL: ".toInspector()" is only available with WebGPU.' );
100
+
101
+ }
102
+
103
+ return node;
104
+
105
+ }
106
+
107
+ }
108
+
109
+ export default InspectorNode;
110
+
111
+ /**
112
+ * Creates an inspector node to wrap around a given node for inspection purposes.
113
+ *
114
+ * @tsl
115
+ * @param {Node} node - The node to inspect.
116
+ * @param {string} [name=''] - Optional name for the inspector node.
117
+ * @param {Function|null} [callback=null] - Optional callback to modify the node during setup.
118
+ * @returns {Node} The inspector node.
119
+ */
120
+ export function inspector( node, name = '', callback = null ) {
121
+
122
+ node = nodeObject( node );
123
+
124
+ return node.before( new InspectorNode( node, name, callback ) );
125
+
126
+ }
127
+
128
+ addMethodChaining( 'toInspector', inspector );
@@ -1,5 +1,6 @@
1
1
  import Node from './Node.js';
2
2
  import { addMethodChaining, nodeObject } from '../tsl/TSLCore.js';
3
+ import { warn } from '../../utils.js';
3
4
 
4
5
  /**
5
6
  * This node can be used as a cache management component for another node.
@@ -8,11 +9,11 @@ import { addMethodChaining, nodeObject } from '../tsl/TSLCore.js';
8
9
  *
9
10
  * @augments Node
10
11
  */
11
- class CacheNode extends Node {
12
+ class IsolateNode extends Node {
12
13
 
13
14
  static get type() {
14
15
 
15
- return 'CacheNode';
16
+ return 'IsolateNode';
16
17
 
17
18
  }
18
19
 
@@ -48,7 +49,7 @@ class CacheNode extends Node {
48
49
  * @readonly
49
50
  * @default true
50
51
  */
51
- this.isCacheNode = true;
52
+ this.isIsolateNode = true;
52
53
 
53
54
  }
54
55
 
@@ -82,9 +83,23 @@ class CacheNode extends Node {
82
83
 
83
84
  }
84
85
 
86
+ setParent( parent ) {
87
+
88
+ this.parent = parent;
89
+
90
+ return this;
91
+
92
+ }
93
+
94
+ getParent() {
95
+
96
+ return this.parent;
97
+
98
+ }
99
+
85
100
  }
86
101
 
87
- export default CacheNode;
102
+ export default IsolateNode;
88
103
 
89
104
  /**
90
105
  * TSL function for creating a cache node.
@@ -92,23 +107,27 @@ export default CacheNode;
92
107
  * @tsl
93
108
  * @function
94
109
  * @param {Node} node - The node that should be cached.
95
- * @param {boolean} [parent] - Whether this node refers to a shared parent cache or not.
96
- * @returns {CacheNode}
110
+ * @returns {IsolateNode}
97
111
  */
98
- export const cache = ( node, parent ) => nodeObject( new CacheNode( nodeObject( node ), parent ) );
112
+ export const isolate = ( node ) => new IsolateNode( nodeObject( node ) );
99
113
 
100
114
  /**
101
- * Assigns a namespace to the given node by updating its context.
102
- *
103
- * Important for TSL functions that use `.once( namespace )` to ensure that the namespace will run twice,
104
- * once when the node is build in the specific namespace and once when the node is built in the others namespace.
105
- *
106
- * This is useful for nodes like `positionWorld` that need to be re-updated if used in `material.positionNode` and outside of it in the same material.
115
+ * TSL function for creating a cache node.
107
116
  *
108
- * @param {Object} node - The node to which the namespace will be assigned.
109
- * @param {string} namespace - The namespace to be assigned to the node.
110
- * @returns {Object} The updated node with the new namespace in its context.
117
+ * @tsl
118
+ * @function
119
+ * @deprecated
120
+ * @param {Node} node - The node that should be cached.
121
+ * @param {boolean} [parent=true] - Whether this node refers to a shared parent cache or not.
122
+ * @returns {IsolateNode}
111
123
  */
112
- export const namespace = ( node, namespace ) => node.context( { namespace } );
124
+ export function cache( node, parent = true ) {
125
+
126
+ warn( 'TSL: "cache()" has been deprecated. Use "isolate()" instead.' ); // @deprecated r181
127
+
128
+ return isolate( node ).setParent( parent );
129
+
130
+ }
113
131
 
114
132
  addMethodChaining( 'cache', cache );
133
+ addMethodChaining( 'isolate', isolate );
@@ -1,8 +1,9 @@
1
1
  import { NodeUpdateType } from './constants.js';
2
- import { getNodeChildren, getCacheKey, hash } from './NodeUtils.js';
2
+ import { hash, hashArray, hashString } from './NodeUtils.js';
3
3
 
4
4
  import { EventDispatcher } from '../../core/EventDispatcher.js';
5
5
  import { MathUtils } from '../../math/MathUtils.js';
6
+ import { warn, error } from '../../utils.js';
6
7
 
7
8
  const _parentBuildStage = {
8
9
  analyze: 'setup',
@@ -82,6 +83,14 @@ class Node extends EventDispatcher {
82
83
  */
83
84
  this.version = 0;
84
85
 
86
+ /**
87
+ * The name of the node.
88
+ *
89
+ * @type {string}
90
+ * @default ''
91
+ */
92
+ this.name = '';
93
+
85
94
  /**
86
95
  * Whether this node is global or not. This property is relevant for the internal
87
96
  * node caching system. All nodes which should be declared just once should
@@ -111,6 +120,8 @@ class Node extends EventDispatcher {
111
120
 
112
121
  // private
113
122
 
123
+ this._beforeNodes = null;
124
+
114
125
  /**
115
126
  * The cache key of this node.
116
127
  *
@@ -172,7 +183,7 @@ class Node extends EventDispatcher {
172
183
  onUpdate( callback, updateType ) {
173
184
 
174
185
  this.updateType = updateType;
175
- this.update = callback.bind( this.getSelf() );
186
+ this.update = callback.bind( this );
176
187
 
177
188
  return this;
178
189
 
@@ -225,26 +236,12 @@ class Node extends EventDispatcher {
225
236
  */
226
237
  onReference( callback ) {
227
238
 
228
- this.updateReference = callback.bind( this.getSelf() );
239
+ this.updateReference = callback.bind( this );
229
240
 
230
241
  return this;
231
242
 
232
243
  }
233
244
 
234
- /**
235
- * The `this` reference might point to a Proxy so this method can be used
236
- * to get the reference to the actual node instance.
237
- *
238
- * @return {Node} A reference to the node.
239
- */
240
- getSelf() {
241
-
242
- // Returns non-node object.
243
-
244
- return this.self || this;
245
-
246
- }
247
-
248
245
  /**
249
246
  * Nodes might refer to other objects like materials. This method allows to dynamically update the reference
250
247
  * to such objects based on a given state (e.g. the current node frame or builder).
@@ -280,7 +277,7 @@ class Node extends EventDispatcher {
280
277
  */
281
278
  * getChildren() {
282
279
 
283
- for ( const { childNode } of getNodeChildren( this ) ) {
280
+ for ( const { childNode } of this._getChildren() ) {
284
281
 
285
282
  yield childNode;
286
283
 
@@ -322,19 +319,100 @@ class Node extends EventDispatcher {
322
319
 
323
320
  }
324
321
 
322
+ /**
323
+ * Returns the child nodes of this node.
324
+ *
325
+ * @private
326
+ * @param {Set<Node>} [ignores=new Set()] - A set of nodes to ignore during the search to avoid circular references.
327
+ * @returns {Array<Object>} An array of objects describing the child nodes.
328
+ */
329
+ _getChildren( ignores = new Set() ) {
330
+
331
+ const children = [];
332
+
333
+ // avoid circular references
334
+ ignores.add( this );
335
+
336
+ for ( const property of Object.getOwnPropertyNames( this ) ) {
337
+
338
+ const object = this[ property ];
339
+
340
+ // Ignore private properties and ignored nodes.
341
+ if ( property.startsWith( '_' ) === true || ignores.has( object ) ) continue;
342
+
343
+ if ( Array.isArray( object ) === true ) {
344
+
345
+ for ( let i = 0; i < object.length; i ++ ) {
346
+
347
+ const child = object[ i ];
348
+
349
+ if ( child && child.isNode === true ) {
350
+
351
+ children.push( { property, index: i, childNode: child } );
352
+
353
+ }
354
+
355
+ }
356
+
357
+ } else if ( object && object.isNode === true ) {
358
+
359
+ children.push( { property, childNode: object } );
360
+
361
+ } else if ( object && Object.getPrototypeOf( object ) === Object.prototype ) {
362
+
363
+ for ( const subProperty in object ) {
364
+
365
+ // Ignore private sub-properties.
366
+ if ( subProperty.startsWith( '_' ) === true ) continue;
367
+
368
+ const child = object[ subProperty ];
369
+
370
+ if ( child && child.isNode === true ) {
371
+
372
+ children.push( { property, index: subProperty, childNode: child } );
373
+
374
+ }
375
+
376
+ }
377
+
378
+ }
379
+
380
+ }
381
+
382
+ //
383
+
384
+ return children;
385
+
386
+ }
387
+
325
388
  /**
326
389
  * Returns the cache key for this node.
327
390
  *
328
391
  * @param {boolean} [force=false] - When set to `true`, a recomputation of the cache key is forced.
392
+ * @param {Set<Node>} [ignores=null] - A set of nodes to ignore during the computation of the cache key.
329
393
  * @return {number} The cache key of the node.
330
394
  */
331
- getCacheKey( force = false ) {
395
+ getCacheKey( force = false, ignores = null ) {
332
396
 
333
397
  force = force || this.version !== this._cacheKeyVersion;
334
398
 
335
399
  if ( force === true || this._cacheKey === null ) {
336
400
 
337
- this._cacheKey = hash( getCacheKey( this, force ), this.customCacheKey() );
401
+ if ( ignores === null ) ignores = new Set();
402
+
403
+ //
404
+
405
+ const values = [];
406
+
407
+ for ( const { property, childNode } of this._getChildren( ignores ) ) {
408
+
409
+ values.push( hashString( property.slice( 0, - 4 ) ), childNode.getCacheKey( force, ignores ) );
410
+
411
+ }
412
+
413
+ //
414
+
415
+ this._cacheKey = hash( hashArray( values ), this.customCacheKey() );
338
416
  this._cacheKeyVersion = this.version;
339
417
 
340
418
  }
@@ -350,7 +428,7 @@ class Node extends EventDispatcher {
350
428
  */
351
429
  customCacheKey() {
352
430
 
353
- return 0;
431
+ return this.id;
354
432
 
355
433
  }
356
434
 
@@ -480,10 +558,22 @@ class Node extends EventDispatcher {
480
558
 
481
559
  }
482
560
 
561
+ /**
562
+ * Returns the number of elements in the node array.
563
+ *
564
+ * @param {NodeBuilder} builder - The current node builder.
565
+ * @return {?number} The number of elements in the node array.
566
+ */
567
+ getArrayCount( /*builder*/ ) {
568
+
569
+ return null;
570
+
571
+ }
572
+
483
573
  /**
484
574
  * Represents the setup stage which is the first step of the build process, see {@link Node#build} method.
485
- * This method is often overwritten in derived modules to prepare the node which is used as the output/result.
486
- * The output node must be returned in the `return` statement.
575
+ * This method is often overwritten in derived modules to prepare the node which is used as a node's output/result.
576
+ * If an output node is prepared, then it must be returned in the `return` statement of the derived module's setup function.
487
577
  *
488
578
  * @param {NodeBuilder} builder - The current node builder.
489
579
  * @return {?Node} The output node.
@@ -551,7 +641,7 @@ class Node extends EventDispatcher {
551
641
  * This state builds the output node and returns the resulting shader string.
552
642
  *
553
643
  * @param {NodeBuilder} builder - The current node builder.
554
- * @param {?string} output - Can be used to define the output type.
644
+ * @param {?string} [output] - Can be used to define the output type.
555
645
  * @return {?string} The generated shader string.
556
646
  */
557
647
  generate( builder, output ) {
@@ -576,7 +666,7 @@ class Node extends EventDispatcher {
576
666
  */
577
667
  updateBefore( /*frame*/ ) {
578
668
 
579
- console.warn( 'Abstract function.' );
669
+ warn( 'Abstract function.' );
580
670
 
581
671
  }
582
672
 
@@ -590,7 +680,7 @@ class Node extends EventDispatcher {
590
680
  */
591
681
  updateAfter( /*frame*/ ) {
592
682
 
593
- console.warn( 'Abstract function.' );
683
+ warn( 'Abstract function.' );
594
684
 
595
685
  }
596
686
 
@@ -604,7 +694,17 @@ class Node extends EventDispatcher {
604
694
  */
605
695
  update( /*frame*/ ) {
606
696
 
607
- console.warn( 'Abstract function.' );
697
+ warn( 'Abstract function.' );
698
+
699
+ }
700
+
701
+ before( node ) {
702
+
703
+ if ( this._beforeNodes === null ) this._beforeNodes = [];
704
+
705
+ this._beforeNodes.push( node );
706
+
707
+ return this;
608
708
 
609
709
  }
610
710
 
@@ -615,8 +715,8 @@ class Node extends EventDispatcher {
615
715
  * - **generate**: Generates the shader code for the node. Returns the generated shader string.
616
716
  *
617
717
  * @param {NodeBuilder} builder - The current node builder.
618
- * @param {string|Node|null} [output=null] - Can be used to define the output type.
619
- * @return {Node|string|null} The result of the build process, depending on the build stage.
718
+ * @param {?(string|Node)} [output=null] - Can be used to define the output type.
719
+ * @return {?(Node|string)} The result of the build process, depending on the build stage.
620
720
  */
621
721
  build( builder, output = null ) {
622
722
 
@@ -630,6 +730,24 @@ class Node extends EventDispatcher {
630
730
 
631
731
  //
632
732
 
733
+ if ( this._beforeNodes !== null ) {
734
+
735
+ const currentBeforeNodes = this._beforeNodes;
736
+
737
+ this._beforeNodes = null;
738
+
739
+ for ( const beforeNode of currentBeforeNodes ) {
740
+
741
+ beforeNode.build( builder, output );
742
+
743
+ }
744
+
745
+ this._beforeNodes = currentBeforeNodes;
746
+
747
+ }
748
+
749
+ //
750
+
633
751
  const nodeData = builder.getDataFromNode( this );
634
752
  nodeData.buildStages = nodeData.buildStages || {};
635
753
  nodeData.buildStages[ builder.buildStage ] = true;
@@ -712,7 +830,12 @@ class Node extends EventDispatcher {
712
830
 
713
831
  } else if ( buildStage === 'generate' ) {
714
832
 
715
- const isGenerateOnce = this.generate.length === 1;
833
+ // If generate has just one argument, it means the output type is not required.
834
+ // This means that the node does not handle output conversions internally,
835
+ // so the value is stored in a cache and the builder handles the conversion
836
+ // for all requested output types.
837
+
838
+ const isGenerateOnce = this.generate.length < 2;
716
839
 
717
840
  if ( isGenerateOnce ) {
718
841
 
@@ -733,9 +856,9 @@ class Node extends EventDispatcher {
733
856
 
734
857
  } else {
735
858
 
736
- console.warn( 'THREE.Node: Recursion detected.', this );
859
+ warn( 'Node: Recursion detected.', this );
737
860
 
738
- result = '';
861
+ result = '/* Recursion detected. */';
739
862
 
740
863
  }
741
864
 
@@ -753,6 +876,16 @@ class Node extends EventDispatcher {
753
876
 
754
877
  }
755
878
 
879
+ if ( result === '' && output !== null && output !== 'void' && output !== 'OutputType' ) {
880
+
881
+ // if no snippet is generated, return a default value
882
+
883
+ error( `TSL: Invalid generated code, expected a "${ output }".` );
884
+
885
+ result = builder.generateConst( output );
886
+
887
+ }
888
+
756
889
  }
757
890
 
758
891
  builder.removeChain( this );
@@ -765,11 +898,11 @@ class Node extends EventDispatcher {
765
898
  /**
766
899
  * Returns the child nodes as a JSON object.
767
900
  *
768
- * @return {Array<Object>} An iterable list of serialized child objects as JSON.
901
+ * @return {Generator<Object>} An iterable list of serialized child objects as JSON.
769
902
  */
770
903
  getSerializeChildren() {
771
904
 
772
- return getNodeChildren( this );
905
+ return this._getChildren();
773
906
 
774
907
  }
775
908