@unikia/upe-renderer 0.186.110 → 0.187.11

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 (506) hide show
  1. package/README.md +5 -7
  2. package/UPSTREAM.md +4 -4
  3. package/build/three.core.js +853 -277
  4. package/build/three.module.js +1098 -1280
  5. package/build/three.tsl.js +41938 -686
  6. package/build/three.webgpu.js +10604 -49055
  7. package/build/three.webgpu.nodes.js +9249 -5788
  8. package/examples/jsm/Addons.js +2 -0
  9. package/examples/jsm/animation/CCDIKSolver.js +17 -5
  10. package/examples/jsm/controls/FirstPersonControls.js +1 -1
  11. package/examples/jsm/controls/OrbitControls.js +27 -14
  12. package/examples/jsm/csm/CSMShader.js +74 -3
  13. package/examples/jsm/curves/CurveExtras.js +4 -4
  14. package/examples/jsm/curves/NURBSCurve.js +14 -0
  15. package/examples/jsm/exporters/EXRExporter.js +673 -16
  16. package/examples/jsm/exporters/GLTFExporter.js +4 -4
  17. package/examples/jsm/exporters/KTX2Exporter.js +1 -1
  18. package/examples/jsm/exporters/OBJExporter.js +48 -5
  19. package/examples/jsm/exporters/PLYExporter.js +22 -11
  20. package/examples/jsm/generators/CityGenerator.js +3 -2
  21. package/examples/jsm/generators/city/SkyscraperGenerator.js +63 -21
  22. package/examples/jsm/gpgpu/BitonicSort.js +30 -23
  23. package/examples/jsm/helpers/VertexTangentsHelper.js +1 -1
  24. package/examples/jsm/inspector/Extension.js +1 -1
  25. package/examples/jsm/inspector/Inspector.js +6 -46
  26. package/examples/jsm/inspector/RendererInspector.js +43 -8
  27. package/examples/jsm/inspector/Storage.js +49 -0
  28. package/examples/jsm/inspector/extensions/color-grading/ColorGrading.js +32 -27
  29. package/examples/jsm/inspector/tabs/Parameters.js +5 -1
  30. package/examples/jsm/inspector/tabs/Performance.js +22 -7
  31. package/examples/jsm/inspector/tabs/Settings.js +1 -1
  32. package/examples/jsm/inspector/tabs/Timeline.js +83 -7
  33. package/examples/jsm/inspector/tabs/Viewer.js +25 -10
  34. package/examples/jsm/inspector/ui/Profiler.js +1 -1
  35. package/examples/jsm/inspector/ui/Style.js +21 -53
  36. package/examples/jsm/inspector/ui/Values.js +28 -3
  37. package/examples/jsm/libs/fflate.module.js +83 -56
  38. package/examples/jsm/libs/mikktspace.README.md +27 -0
  39. package/examples/jsm/libs/mikktspace.module.js +721 -109
  40. package/examples/jsm/lighting/ClusteredLighting.js +100 -2
  41. package/examples/jsm/lighting/LightMapper.js +295 -0
  42. package/examples/jsm/lighting/LightProbeGrid.js +242 -139
  43. package/examples/jsm/lighting/LightProbeGridWebGL.js +30 -14
  44. package/examples/jsm/lighting/vxgi/VXGIConeTracer.js +54 -5
  45. package/examples/jsm/lighting/vxgi/VXGIIrradiance.js +43 -0
  46. package/examples/jsm/lighting/vxgi/VXGINode.js +13 -56
  47. package/examples/jsm/lighting/vxgi/VXGISceneCollector.js +316 -1
  48. package/examples/jsm/lighting/vxgi/VXGIVolume.js +69 -59
  49. package/examples/jsm/lights/SunLight.js +9 -4
  50. package/examples/jsm/lights/SunLightNode.js +3 -3
  51. package/examples/jsm/lines/LineMaterial.js +26 -10
  52. package/examples/jsm/loaders/3DMLoader.js +10 -1
  53. package/examples/jsm/loaders/3MFLoader.js +5 -1
  54. package/examples/jsm/loaders/AMFLoader.js +2 -0
  55. package/examples/jsm/loaders/BVHLoader.js +2 -0
  56. package/examples/jsm/loaders/ColladaLoader.js +8 -0
  57. package/examples/jsm/loaders/DDSLoader.js +1 -1
  58. package/examples/jsm/loaders/DRACOLoader.js +5 -1
  59. package/examples/jsm/loaders/EXRLoader.js +120 -104
  60. package/examples/jsm/loaders/FBXLoader.js +4 -0
  61. package/examples/jsm/loaders/FontLoader.js +2 -0
  62. package/examples/jsm/loaders/GCodeLoader.js +5 -9
  63. package/examples/jsm/loaders/GLTFLoader.js +112 -31
  64. package/examples/jsm/loaders/GaussianSplatPLYLoader.js +2 -0
  65. package/examples/jsm/loaders/HDRCubeTextureLoader.js +3 -0
  66. package/examples/jsm/loaders/IESLoader.js +46 -12
  67. package/examples/jsm/loaders/JXLLoader.js +159 -0
  68. package/examples/jsm/loaders/KMZLoader.js +6 -0
  69. package/examples/jsm/loaders/KSPLATLoader.js +2 -0
  70. package/examples/jsm/loaders/KTX2Loader.js +49 -4
  71. package/examples/jsm/loaders/KTXLoader.js +5 -3
  72. package/examples/jsm/loaders/LDrawLoader.js +15 -22
  73. package/examples/jsm/loaders/LUT3dlLoader.js +5 -1
  74. package/examples/jsm/loaders/LUTCubeLoader.js +6 -2
  75. package/examples/jsm/loaders/LUTImageLoader.js +2 -0
  76. package/examples/jsm/loaders/LWOLoader.js +6 -0
  77. package/examples/jsm/loaders/MD2Loader.js +2 -0
  78. package/examples/jsm/loaders/MDDLoader.js +4 -0
  79. package/examples/jsm/loaders/MTLLoader.js +8 -0
  80. package/examples/jsm/loaders/MaterialXLoader.js +57 -5
  81. package/examples/jsm/loaders/NRRDLoader.js +4 -2
  82. package/examples/jsm/loaders/OBJLoader.js +10 -4
  83. package/examples/jsm/loaders/PCDLoader.js +6 -2
  84. package/examples/jsm/loaders/PDBLoader.js +5 -3
  85. package/examples/jsm/loaders/PLYLoader.js +39 -15
  86. package/examples/jsm/loaders/PVRLoader.js +2 -2
  87. package/examples/jsm/loaders/SPLATLoader.js +2 -0
  88. package/examples/jsm/loaders/SPZLoader.js +2 -0
  89. package/examples/jsm/loaders/STLLoader.js +3 -1
  90. package/examples/jsm/loaders/SVGLoader.js +27 -49
  91. package/examples/jsm/loaders/TDSLoader.js +4 -0
  92. package/examples/jsm/loaders/TGALoader.js +6 -5
  93. package/examples/jsm/loaders/TTFLoader.js +2 -0
  94. package/examples/jsm/loaders/USDLoader.js +14 -0
  95. package/examples/jsm/loaders/UltraHDRLoader.js +2 -0
  96. package/examples/jsm/loaders/VOXLoader.js +3 -0
  97. package/examples/jsm/loaders/VRMLLoader.js +4 -0
  98. package/examples/jsm/loaders/VTKLoader.js +2 -0
  99. package/examples/jsm/loaders/XYZLoader.js +2 -0
  100. package/examples/jsm/loaders/collada/ColladaComposer.js +15 -8
  101. package/examples/jsm/loaders/materialx/MaterialXDocument.js +610 -138
  102. package/examples/jsm/loaders/materialx/MaterialXInterfaceValidation.js +12 -95
  103. package/examples/jsm/loaders/materialx/MaterialXLog.js +4 -0
  104. package/examples/jsm/loaders/materialx/MaterialXNodeDefs.js +99 -0
  105. package/examples/jsm/loaders/materialx/MaterialXNodeInterfaceRegistry.js +760 -1
  106. package/examples/jsm/loaders/materialx/MaterialXNodeLibrary.js +222 -372
  107. package/examples/jsm/loaders/materialx/MaterialXSurfaceMappings.js +163 -259
  108. package/examples/jsm/loaders/materialx/MaterialXUtils.js +25 -0
  109. package/examples/jsm/loaders/materialx/compile/MaterialXCompileRegistry.js +161 -159
  110. package/examples/jsm/loaders/usd/USDAParser.js +56 -47
  111. package/examples/jsm/loaders/usd/USDComposer.js +25 -30
  112. package/examples/jsm/math/ColorConverter.js +7 -3
  113. package/examples/jsm/math/Lut.js +2 -2
  114. package/examples/jsm/math/OBB.js +3 -3
  115. package/examples/jsm/math/Octree.js +20 -17
  116. package/examples/jsm/objects/GaussianSplat.js +5 -4
  117. package/examples/jsm/objects/Reflector.js +5 -0
  118. package/examples/jsm/objects/SkyMesh.js +14 -7
  119. package/examples/jsm/objects/Water2Mesh.js +2 -2
  120. package/examples/jsm/physics/RapierPhysics.js +2 -2
  121. package/examples/jsm/pipelines/MeshletDrawingPipeline.js +5571 -0
  122. package/examples/jsm/pipelines/VisibilityBufferDrawingPipeline.js +954 -0
  123. package/examples/jsm/postprocessing/BokehPass.js +1 -1
  124. package/examples/jsm/postprocessing/GTAOPass.js +26 -18
  125. package/examples/jsm/renderers/SVGRenderer.js +3 -2
  126. package/examples/jsm/shaders/GTAOShader.js +7 -4
  127. package/examples/jsm/shaders/PoissonDenoiseShader.js +1 -10
  128. package/examples/jsm/tsl/WebGLNodesHandler.js +21 -9
  129. package/examples/jsm/tsl/display/AfterImageNode.js +3 -3
  130. package/examples/jsm/tsl/display/BilateralBlurNode.js +3 -3
  131. package/examples/jsm/tsl/display/BloomNode.js +3 -3
  132. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +8 -19
  133. package/examples/jsm/tsl/display/DenoiseNode.js +5 -5
  134. package/examples/jsm/tsl/display/DepthOfFieldNode.js +3 -3
  135. package/examples/jsm/tsl/display/DotScreenNode.js +3 -3
  136. package/examples/jsm/tsl/display/FSR1Node.js +3 -3
  137. package/examples/jsm/tsl/display/FXAANode.js +3 -10
  138. package/examples/jsm/tsl/display/FilmNode.js +3 -3
  139. package/examples/jsm/tsl/display/GTAONode.js +33 -25
  140. package/examples/jsm/tsl/display/GaussianBlurNode.js +3 -3
  141. package/examples/jsm/tsl/display/GodraysNode.js +5 -19
  142. package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +8 -4
  143. package/examples/jsm/tsl/display/LensflareNode.js +3 -3
  144. package/examples/jsm/tsl/display/Lut3DNode.js +3 -3
  145. package/examples/jsm/tsl/display/OITPassNode.js +0 -11
  146. package/examples/jsm/tsl/display/OutlineNode.js +107 -5
  147. package/examples/jsm/tsl/display/PixelationPassNode.js +85 -193
  148. package/examples/jsm/tsl/display/RGBShiftNode.js +3 -3
  149. package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +23 -126
  150. package/examples/jsm/tsl/display/SMAANode.js +3 -3
  151. package/examples/jsm/tsl/display/SSAONode.js +6 -20
  152. package/examples/jsm/tsl/display/SSGINode.js +36 -29
  153. package/examples/jsm/tsl/display/SSRNode.js +135 -63
  154. package/examples/jsm/tsl/display/SSSNode.js +6 -20
  155. package/examples/jsm/tsl/display/SharpenNode.js +3 -3
  156. package/examples/jsm/tsl/display/SobelOperatorNode.js +3 -3
  157. package/examples/jsm/tsl/display/TAAUNode.js +10 -42
  158. package/examples/jsm/tsl/display/TRAANode.js +11 -43
  159. package/examples/jsm/tsl/display/TemporalReprojectNode.js +42 -47
  160. package/examples/jsm/tsl/display/TransitionNode.js +3 -3
  161. package/examples/jsm/tsl/display/lensDirt.js +30 -0
  162. package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +482 -121
  163. package/examples/jsm/tsl/lighting/DynamicLightsNode.js +41 -140
  164. package/examples/jsm/tsl/lighting/LightProbeGridNode.js +72 -25
  165. package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +6 -0
  166. package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +6 -0
  167. package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +6 -0
  168. package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +6 -0
  169. package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +6 -0
  170. package/examples/jsm/tsl/shadows/TileShadowNode.js +102 -14
  171. package/examples/jsm/tsl/utils/Raymarching.js +1 -1
  172. package/examples/jsm/tsl/utils/SoftParticles.js +5 -12
  173. package/examples/jsm/tsl/utils/SpecularHelpers.js +47 -70
  174. package/examples/jsm/tsl/utils/TAAUtils.js +6 -17
  175. package/examples/jsm/utils/BufferGeometryUtils.js +110 -88
  176. package/examples/jsm/utils/MeshletGeometryUtils.js +417 -0
  177. package/examples/jsm/utils/SceneOptimizer.js +2 -1
  178. package/examples/jsm/utils/SceneUtils.js +1 -1
  179. package/examples/jsm/utils/unwrapUVs.js +865 -0
  180. package/examples/jsm/webxr/XREstimatedLight.js +11 -4
  181. package/package.json +3 -3
  182. package/src/Three.TSL.js +2 -683
  183. package/src/Three.WebGPU.Nodes.js +2 -1
  184. package/src/Three.WebGPU.js +2 -1
  185. package/src/animation/AnimationAction.js +1 -1
  186. package/src/animation/AnimationUtils.js +1 -3
  187. package/src/animation/KeyframeTrack.js +19 -0
  188. package/src/cameras/ArrayCamera.js +12 -0
  189. package/src/cameras/CubeCamera.js +3 -3
  190. package/src/constants.js +1 -9
  191. package/src/core/BufferAttribute.js +57 -21
  192. package/src/core/BufferGeometry.js +5 -13
  193. package/src/core/Clock.js +1 -1
  194. package/src/core/InterleavedBuffer.js +28 -18
  195. package/src/core/InterleavedBufferAttribute.js +54 -20
  196. package/src/core/Object3D.js +19 -9
  197. package/src/core/Raycaster.js +2 -0
  198. package/src/core/RenderTarget.js +11 -5
  199. package/src/core/UniformsGroup.js +7 -3
  200. package/src/extras/PMREMGenerator.js +392 -685
  201. package/src/extras/core/Curve.js +4 -0
  202. package/src/extras/core/CurvePath.js +13 -0
  203. package/src/extras/core/ShapePath.js +1 -1
  204. package/src/geometries/EdgesGeometry.js +12 -10
  205. package/src/geometries/LatheGeometry.js +2 -0
  206. package/src/helpers/PolarGridHelper.js +1 -1
  207. package/src/lights/Light.js +11 -0
  208. package/src/lights/LightProbe.js +2 -0
  209. package/src/lights/LightShadow.js +2 -0
  210. package/src/loaders/AnimationLoader.js +2 -0
  211. package/src/loaders/AudioLoader.js +2 -0
  212. package/src/loaders/BufferGeometryLoader.js +2 -0
  213. package/src/loaders/CompressedTextureLoader.js +2 -0
  214. package/src/loaders/CubeTextureLoader.js +2 -0
  215. package/src/loaders/DataTextureLoader.js +2 -0
  216. package/src/loaders/FileLoader.js +2 -0
  217. package/src/loaders/ImageBitmapLoader.js +3 -1
  218. package/src/loaders/ImageLoader.js +1 -0
  219. package/src/loaders/Loader.js +47 -0
  220. package/src/loaders/MaterialLoader.js +2 -0
  221. package/src/loaders/ObjectLoader.js +27 -8
  222. package/src/loaders/TextureLoader.js +5 -3
  223. package/src/loaders/nodes/NodeLoader.js +2 -0
  224. package/src/materials/Material.js +21 -2
  225. package/src/materials/MeshDepthMaterial.js +1 -1
  226. package/src/materials/MeshDistanceMaterial.js +1 -1
  227. package/src/materials/MeshLambertMaterial.js +1 -1
  228. package/src/materials/MeshMatcapMaterial.js +1 -1
  229. package/src/materials/MeshNormalMaterial.js +1 -1
  230. package/src/materials/MeshPhongMaterial.js +1 -1
  231. package/src/materials/MeshPhysicalMaterial.js +90 -11
  232. package/src/materials/MeshStandardMaterial.js +1 -1
  233. package/src/materials/MeshToonMaterial.js +1 -1
  234. package/src/materials/nodes/Line2NodeMaterial.js +32 -10
  235. package/src/materials/nodes/MeshLambertNodeMaterial.js +13 -0
  236. package/src/materials/nodes/MeshPhongNodeMaterial.js +13 -0
  237. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +40 -5
  238. package/src/materials/nodes/MeshToonNodeMaterial.js +13 -0
  239. package/src/materials/nodes/NodeMaterial.js +36 -16
  240. package/src/materials/nodes/NodeMaterialInstance.js +193 -0
  241. package/src/materials/nodes/NodeMaterials.js +1 -0
  242. package/src/materials/nodes/PointsNodeMaterial.js +1 -1
  243. package/src/materials/nodes/SpriteNodeMaterial.js +3 -3
  244. package/src/materials/nodes/manager/NodeMaterialObserver.js +191 -22
  245. package/src/math/Box3.js +2 -2
  246. package/src/math/Color.js +8 -8
  247. package/src/math/ColorManagement.js +2 -21
  248. package/src/math/FrustumArray.js +12 -0
  249. package/src/math/Interpolant.js +1 -1
  250. package/src/math/Line3.js +2 -4
  251. package/src/math/MathUtils.js +33 -46
  252. package/src/math/Matrix2.js +1 -1
  253. package/src/math/Matrix3.js +1 -1
  254. package/src/math/Matrix4.js +1 -1
  255. package/src/math/Triangle.js +2 -1
  256. package/src/math/Vector2.js +1 -1
  257. package/src/math/Vector3.js +1 -1
  258. package/src/math/Vector4.js +1 -1
  259. package/src/nodes/Nodes.js +1 -0
  260. package/src/nodes/TSL.js +2 -0
  261. package/src/nodes/accessors/Arrays.js +1 -1
  262. package/src/nodes/accessors/Batch.js +29 -23
  263. package/src/nodes/accessors/BufferAttributeNode.js +21 -1
  264. package/src/nodes/accessors/BuiltinNode.js +6 -0
  265. package/src/nodes/accessors/Camera.js +100 -93
  266. package/src/nodes/accessors/ClippingNode.js +17 -6
  267. package/src/nodes/accessors/CubeTextureNode.js +12 -24
  268. package/src/nodes/accessors/Instance.js +198 -160
  269. package/src/nodes/accessors/Lights.js +19 -6
  270. package/src/nodes/accessors/MaterialNode.js +33 -4
  271. package/src/nodes/accessors/Morph.js +81 -22
  272. package/src/nodes/accessors/Normal.js +0 -42
  273. package/src/nodes/accessors/Object3DNode.js +6 -0
  274. package/src/nodes/accessors/PointUVNode.js +6 -0
  275. package/src/nodes/accessors/ReferenceAttributeNode.js +279 -0
  276. package/src/nodes/accessors/ReferenceBaseNode.js +6 -0
  277. package/src/nodes/accessors/ReferenceNode.js +6 -0
  278. package/src/nodes/accessors/Skinning.js +57 -52
  279. package/src/nodes/accessors/StorageBufferNode.js +3 -12
  280. package/src/nodes/accessors/TextureBicubic.js +30 -27
  281. package/src/nodes/accessors/TextureNode.js +164 -78
  282. package/src/nodes/accessors/TextureSizeNode.js +6 -0
  283. package/src/nodes/accessors/UniformArrayNode.js +8 -15
  284. package/src/nodes/accessors/VelocityNode.js +13 -8
  285. package/src/nodes/code/CodeNode.js +6 -0
  286. package/src/nodes/code/ExpressionNode.js +6 -0
  287. package/src/nodes/code/FunctionCallNode.js +3 -3
  288. package/src/nodes/code/FunctionNode.js +15 -13
  289. package/src/nodes/core/ArrayNode.js +3 -3
  290. package/src/nodes/core/AssignNode.js +10 -9
  291. package/src/nodes/core/AttributeNode.js +39 -0
  292. package/src/nodes/core/BypassNode.js +6 -0
  293. package/src/nodes/core/ConstNode.js +31 -1
  294. package/src/nodes/core/ContextNode.js +11 -6
  295. package/src/nodes/core/IndexNode.js +6 -0
  296. package/src/nodes/core/InputNode.js +6 -0
  297. package/src/nodes/core/InspectorNode.js +17 -31
  298. package/src/nodes/core/IsolateNode.js +8 -0
  299. package/src/nodes/core/Node.js +367 -67
  300. package/src/nodes/core/NodeBuilder.js +664 -222
  301. package/src/nodes/core/NodeUtils.js +25 -0
  302. package/src/nodes/core/NodeVar.js +10 -1
  303. package/src/nodes/core/OutputStructNode.js +6 -0
  304. package/src/nodes/core/OverrideContextNode.js +38 -37
  305. package/src/nodes/core/PropertyNode.js +14 -0
  306. package/src/nodes/core/StackNode.js +33 -21
  307. package/src/nodes/core/StructNode.js +6 -0
  308. package/src/nodes/core/StructTypeNode.js +6 -0
  309. package/src/nodes/core/SubBuildNode.js +8 -0
  310. package/src/nodes/core/TempNode.js +10 -35
  311. package/src/nodes/core/UniformGroupNode.js +6 -0
  312. package/src/nodes/core/VarNode.js +43 -135
  313. package/src/nodes/core/VaryingNode.js +33 -2
  314. package/src/nodes/display/BlendModes.js +5 -40
  315. package/src/nodes/display/BumpMapNode.js +17 -7
  316. package/src/nodes/display/ColorAdjustment.js +22 -10
  317. package/src/nodes/display/ColorSpaceFunctions.js +2 -14
  318. package/src/nodes/display/ColorSpaceNode.js +3 -3
  319. package/src/nodes/display/FrontFacingNode.js +6 -0
  320. package/src/nodes/display/NormalMapNode.js +3 -3
  321. package/src/nodes/display/PassNode.js +75 -16
  322. package/src/nodes/display/RenderOutputNode.js +22 -5
  323. package/src/nodes/display/ScreenNode.js +6 -0
  324. package/src/nodes/display/ToneMappingFunctions.js +9 -51
  325. package/src/nodes/display/ToneMappingNode.js +3 -3
  326. package/src/nodes/display/ToonOutlinePassNode.js +66 -2
  327. package/src/nodes/display/ViewportDepthNode.js +34 -4
  328. package/src/nodes/functions/BSDF/BRDF_EON.js +65 -0
  329. package/src/nodes/functions/BSDF/BRDF_GGX.js +5 -3
  330. package/src/nodes/functions/BSDF/BRDF_Sheen.js +2 -16
  331. package/src/nodes/functions/BSDF/D_GGX.js +1 -8
  332. package/src/nodes/functions/BSDF/D_GGX_Anisotropic.js +7 -10
  333. package/src/nodes/functions/BSDF/LTC.js +20 -47
  334. package/src/nodes/functions/BSDF/Schlick_to_F0.js +1 -9
  335. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +1 -9
  336. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +10 -13
  337. package/src/nodes/functions/PhysicalLightingModel.js +84 -51
  338. package/src/nodes/functions/VolumetricLightingModel.js +1 -1
  339. package/src/nodes/functions/material/getAlphaHashThreshold.js +3 -9
  340. package/src/nodes/functions/material/getParallaxCorrectNormal.js +10 -11
  341. package/src/nodes/functions/material/getRoughness.js +3 -1
  342. package/src/nodes/geometry/RangeNode.js +52 -69
  343. package/src/nodes/gpgpu/AtomicFunctionNode.js +11 -6
  344. package/src/nodes/gpgpu/BarrierNode.js +6 -0
  345. package/src/nodes/gpgpu/ComputeBuiltinNode.js +6 -0
  346. package/src/nodes/gpgpu/ComputeNode.js +6 -0
  347. package/src/nodes/gpgpu/SubgroupFunctionNode.js +38 -29
  348. package/src/nodes/gpgpu/WorkgroupInfoNode.js +6 -0
  349. package/src/nodes/lighting/AnalyticLightNode.js +7 -14
  350. package/src/nodes/lighting/BasicEnvironmentNode.js +5 -1
  351. package/src/nodes/lighting/EnvironmentNode.js +58 -8
  352. package/src/nodes/lighting/IESSpotLightNode.js +19 -4
  353. package/src/nodes/lighting/LightProbeNode.js +2 -1
  354. package/src/nodes/lighting/LightUtils.js +2 -2
  355. package/src/nodes/lighting/LightingNode.js +6 -0
  356. package/src/nodes/lighting/LightsNode.js +26 -32
  357. package/src/nodes/lighting/PointShadowNode.js +92 -48
  358. package/src/nodes/lighting/ProjectorLightNode.js +1 -1
  359. package/src/nodes/lighting/RectAreaLightNode.js +13 -14
  360. package/src/nodes/lighting/ShadowBaseNode.js +9 -17
  361. package/src/nodes/lighting/ShadowFilterNode.js +26 -3
  362. package/src/nodes/lighting/ShadowNode.js +13 -11
  363. package/src/nodes/materialx/MaterialXColor.js +2 -14
  364. package/src/nodes/materialx/MaterialXColorTransform.js +1 -7
  365. package/src/nodes/materialx/MaterialXNodes.js +8 -11
  366. package/src/nodes/materialx/MaterialXNoise.js +195 -454
  367. package/src/nodes/math/BitcastNode.js +5 -5
  368. package/src/nodes/math/BitcountNode.js +18 -46
  369. package/src/nodes/math/ConditionalNode.js +92 -22
  370. package/src/nodes/math/Hash.js +1 -1
  371. package/src/nodes/math/MathNode.js +86 -64
  372. package/src/nodes/math/MathUtils.js +2 -2
  373. package/src/nodes/math/OperatorNode.js +42 -59
  374. package/src/nodes/math/PackFloatNode.js +9 -9
  375. package/src/nodes/math/Packed4x8IntegerNode.js +20 -52
  376. package/src/nodes/math/TriNoise3D.js +3 -23
  377. package/src/nodes/math/UnpackFloatNode.js +9 -9
  378. package/src/nodes/pmrem/PMREMNode.js +38 -75
  379. package/src/nodes/pmrem/PMREMUtils.js +108 -272
  380. package/src/nodes/procedural/Checker.js +1 -1
  381. package/src/nodes/tsl/TSLCore.js +199 -74
  382. package/src/nodes/utils/ArrayElementNode.js +19 -1
  383. package/src/nodes/utils/CubeMapNode.js +3 -3
  384. package/src/nodes/utils/DebugNode.js +2 -2
  385. package/src/nodes/utils/EventNode.js +6 -0
  386. package/src/nodes/utils/FlipNode.js +3 -3
  387. package/src/nodes/utils/FunctionOverloadingNode.js +7 -1
  388. package/src/nodes/utils/JoinNode.js +3 -3
  389. package/src/nodes/utils/LoopNode.js +14 -9
  390. package/src/nodes/utils/MemberNode.js +18 -0
  391. package/src/nodes/utils/PostProcessingUtils.js +20 -25
  392. package/src/nodes/utils/RTTNode.js +2 -0
  393. package/src/nodes/utils/ReflectorNode.js +24 -0
  394. package/src/nodes/utils/RotateNode.js +3 -3
  395. package/src/nodes/utils/SampleNode.js +6 -0
  396. package/src/nodes/utils/SetNode.js +3 -3
  397. package/src/nodes/utils/SplitNode.js +6 -0
  398. package/src/nodes/utils/UVUtils.js +2 -2
  399. package/src/objects/BatchedMesh.js +146 -15
  400. package/src/objects/InstancedMesh.js +12 -4
  401. package/src/objects/Line.js +20 -0
  402. package/src/objects/Mesh.js +8 -0
  403. package/src/objects/Points.js +20 -0
  404. package/src/objects/Skeleton.js +26 -0
  405. package/src/objects/SkinnedMesh.js +3 -3
  406. package/src/objects/Sprite.js +10 -0
  407. package/src/renderers/WebGLRenderer.js +104 -70
  408. package/src/renderers/common/Animation.js +5 -1
  409. package/src/renderers/common/Attributes.js +67 -57
  410. package/src/renderers/common/Backend.js +78 -3
  411. package/src/renderers/common/BindGroup.js +11 -0
  412. package/src/renderers/common/Binding.js +0 -11
  413. package/src/renderers/common/Bindings.js +116 -10
  414. package/src/renderers/common/Buffer.js +1 -1
  415. package/src/renderers/common/ClippingContext.js +12 -1
  416. package/src/renderers/common/ComputePipeline.js +17 -1
  417. package/src/renderers/common/DirectRenderPipeline.js +7 -3
  418. package/src/renderers/common/Geometries.js +170 -132
  419. package/src/renderers/common/Info.js +1 -1
  420. package/src/renderers/common/InspectorBase.js +5 -5
  421. package/src/renderers/common/Lighting.js +59 -0
  422. package/src/renderers/common/Pipelines.js +26 -12
  423. package/src/renderers/common/ProgrammableStage.js +1 -17
  424. package/src/renderers/common/RenderContext.js +21 -0
  425. package/src/renderers/common/RenderContexts.js +13 -4
  426. package/src/renderers/common/RenderObject.js +111 -35
  427. package/src/renderers/common/RenderObjects.js +37 -19
  428. package/src/renderers/common/Renderer.js +537 -295
  429. package/src/renderers/common/RendererUtils.js +15 -0
  430. package/src/renderers/common/StandardDrawingPipeline.js +343 -0
  431. package/src/renderers/common/Storage3DTexture.js +11 -0
  432. package/src/renderers/common/StorageArrayTexture.js +10 -0
  433. package/src/renderers/common/StorageTexture.js +0 -9
  434. package/src/renderers/common/Textures.js +144 -37
  435. package/src/renderers/common/UniformsGroup.js +19 -0
  436. package/src/renderers/common/XRManager.js +10 -91
  437. package/src/renderers/common/extras/PMREMGenerator.js +298 -576
  438. package/src/renderers/common/nodes/NodeBuilderState.js +7 -5
  439. package/src/renderers/common/nodes/NodeLibrary.js +11 -35
  440. package/src/renderers/common/nodes/NodeManager.js +80 -31
  441. package/src/renderers/common/nodes/NodeSampledTexture.js +14 -0
  442. package/src/renderers/common/nodes/NodeSampler.js +14 -0
  443. package/src/renderers/common/nodes/NodeStorageBuffer.js +1 -1
  444. package/src/renderers/common/nodes/NodeUniformBuffer.js +1 -14
  445. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +13 -4
  446. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +8 -8
  447. package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +23 -11
  448. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +21 -2
  449. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +1 -1
  450. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +18 -2
  451. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +104 -7
  452. package/src/renderers/shaders/ShaderChunk/morphcolor_vertex.glsl.js +11 -2
  453. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +36 -20
  454. package/src/renderers/shaders/ShaderChunk/uv_pars_fragment.glsl.js +5 -0
  455. package/src/renderers/shaders/ShaderChunk/uv_pars_vertex.glsl.js +6 -0
  456. package/src/renderers/shaders/ShaderChunk/uv_vertex.glsl.js +5 -0
  457. package/src/renderers/shaders/ShaderChunk.js +0 -2
  458. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +4 -18
  459. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +0 -1
  460. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +0 -1
  461. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +8 -1
  462. package/src/renderers/shaders/ShaderLib.js +3 -0
  463. package/src/renderers/shaders/UniformsLib.js +4 -5
  464. package/src/renderers/webgl/WebGLBackground.js +3 -3
  465. package/src/renderers/webgl/WebGLBindingStates.js +4 -2
  466. package/src/renderers/webgl/WebGLCapabilities.js +7 -1
  467. package/src/renderers/webgl/WebGLEnvironments.js +2 -2
  468. package/src/renderers/webgl/WebGLGeometries.js +42 -14
  469. package/src/renderers/webgl/WebGLMaterials.js +15 -2
  470. package/src/renderers/webgl/WebGLOutput.js +37 -1
  471. package/src/renderers/webgl/WebGLProgram.js +13 -54
  472. package/src/renderers/webgl/WebGLPrograms.js +22 -8
  473. package/src/renderers/webgl/WebGLRenderStates.js +11 -8
  474. package/src/renderers/webgl/WebGLShadowMap.js +6 -4
  475. package/src/renderers/webgl/WebGLState.js +10 -6
  476. package/src/renderers/webgl/WebGLTextures.js +129 -77
  477. package/src/renderers/webgl/WebGLUniforms.js +44 -6
  478. package/src/renderers/webgl/WebGLUniformsGroups.js +75 -69
  479. package/src/renderers/webgl-fallback/WebGLBackend.js +206 -278
  480. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +154 -20
  481. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +45 -42
  482. package/src/renderers/webgl-fallback/utils/WebGLState.js +29 -4
  483. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +129 -49
  484. package/src/renderers/webgl-fallback/utils/WebGLVertexArrayUtils.js +346 -0
  485. package/src/renderers/webgpu/WebGPUBackend.js +140 -82
  486. package/src/renderers/webgpu/WebGPURenderer.js +1 -1
  487. package/src/renderers/webgpu/nodes/BasicNodeLibrary.js +10 -10
  488. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +10 -10
  489. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +135 -60
  490. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +128 -55
  491. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +1 -1
  492. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +15 -12
  493. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +55 -19
  494. package/src/renderers/webgpu/utils/WebGPUUtils.js +20 -3
  495. package/src/renderers/webxr/WebXRController.js +3 -3
  496. package/src/renderers/webxr/WebXRManager.js +5 -90
  497. package/src/scenes/Scene.js +4 -4
  498. package/src/textures/CompressedTexture.js +2 -2
  499. package/src/textures/DepthTexture.js +2 -2
  500. package/src/textures/FramebufferTexture.js +11 -0
  501. package/src/textures/Texture.js +29 -1
  502. package/src/textures/TextureSource.js +1 -1
  503. package/src/upe.js +1 -1
  504. package/src/utils.js +4 -4
  505. package/examples/jsm/libs/surfaceNet.js +0 -201
  506. package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +0 -186
@@ -2,7 +2,7 @@ import { NodeUpdateType } from './constants.js';
2
2
  import { hash, hashArray, hashString } from './NodeUtils.js';
3
3
 
4
4
  import { EventDispatcher } from '../../core/EventDispatcher.js';
5
- import { MathUtils } from '../../math/MathUtils.js';
5
+ import { generateUUID } from '../../math/MathUtils.js';
6
6
  import { warn, error } from '../../utils.js';
7
7
 
8
8
  import StackTrace from './StackTrace.js';
@@ -103,6 +103,15 @@ class Node extends EventDispatcher {
103
103
  */
104
104
  this.parents = false;
105
105
 
106
+ /**
107
+ * Whether this node can be assigned. It is generated as an expression,
108
+ * unless it is assigned, in which case it is declared as a variable where it was created.
109
+ *
110
+ * @type {boolean}
111
+ * @default false
112
+ */
113
+ this.assignable = false;
114
+
106
115
  /**
107
116
  * This flag can be used for type testing.
108
117
  *
@@ -114,7 +123,7 @@ class Node extends EventDispatcher {
114
123
 
115
124
  // private
116
125
 
117
- this._beforeNodes = null;
126
+ this._inspectorNode = null;
118
127
 
119
128
  /**
120
129
  * The cache key of this node.
@@ -167,6 +176,257 @@ class Node extends EventDispatcher {
167
176
 
168
177
  }
169
178
 
179
+ /**
180
+ * Whether this node allows caching its result in a temporary variable.
181
+ * Caching is enabled by default. Override this method to disable it.
182
+ *
183
+ * @param {NodeBuilder} builder - The current node builder.
184
+ * @return {boolean} Whether temporary caching is allowed.
185
+ */
186
+ isCacheable( /*builder*/ ) {
187
+
188
+ return true;
189
+
190
+ }
191
+
192
+ /**
193
+ * Makes this node assignable and adds it to the current stack,
194
+ * so it can be declared where it was created if it is assigned later.
195
+ * Only use it with nodes that are not shared, see {@link Node#assignable}.
196
+ *
197
+ * @return {Node} A reference to this node.
198
+ */
199
+ toAssignable() {
200
+
201
+ this.assignable = true;
202
+
203
+ return this.toStack();
204
+
205
+ }
206
+
207
+ /**
208
+ * Checks if this node is assignable without a forced declaration.
209
+ *
210
+ * @param {NodeBuilder} builder - The node builder.
211
+ * @returns {boolean} Whether this node is assignable without a forced declaration.
212
+ */
213
+ isAssignable( builder ) {
214
+
215
+ const data = builder.getDataFromNode( this );
216
+
217
+ if ( data.forceDeclaration === true ) return false;
218
+
219
+ return this.assignable;
220
+
221
+ }
222
+
223
+ /**
224
+ * Checks if this node is the target of an assignment.
225
+ *
226
+ * @param {NodeBuilder} builder - The node builder.
227
+ * @returns {boolean} Whether this node is assigned.
228
+ */
229
+ isAssign( builder ) {
230
+
231
+ const data = builder.getDataFromNode( this );
232
+
233
+ return data.assign;
234
+
235
+ }
236
+
237
+ /**
238
+ * Declares the assignable node before the loops where it is used if it has no stack, and
239
+ * decides if a value that cannot be cached must be evaluated once at its declaration.
240
+ *
241
+ * @private
242
+ * @param {NodeBuilder} builder - The current node builder.
243
+ * @param {Object} data - The node data.
244
+ * @param {Node} [valueNode=this] - The node that defines the value of the assignable node.
245
+ */
246
+ _updateAssignable( builder, data, valueNode = this ) {
247
+
248
+ const nodeLoop = builder.context.nodeLoop;
249
+
250
+ if ( data.stack === undefined && builder.buildStage === 'setup' ) {
251
+
252
+ // A node outside of the stacks of this build, e.g. created outside of a function, is declared
253
+ // before the outermost loop where its value does not change, otherwise every iteration would repeat it.
254
+ data.stack = builder.declareBeforeBlock( this );
255
+
256
+ } else if ( this.assignable === true && nodeLoop && builder.buildStage === 'analyze' ) {
257
+
258
+ if ( valueNode.isCacheable( builder ) === false && builder.isDeterministic( valueNode ) === false ) {
259
+
260
+ // A value that cannot be cached, e.g. a function call, is evaluated once at its declaration
261
+ // if it is used in a loop that runs after it, otherwise the loop would repeat it.
262
+ const declarationIndex = builder.activeStacks.indexOf( data.stack );
263
+ const loopIndex = builder.activeStacks.indexOf( builder.getDataFromNode( nodeLoop ).stack );
264
+
265
+ if ( declarationIndex !== - 1 && loopIndex >= declarationIndex ) data.forceDeclaration = true;
266
+
267
+ }
268
+
269
+ }
270
+
271
+ }
272
+
273
+ /**
274
+ * Whether `build()` declares this assignable node as a variable when it is assigned.
275
+ * Nodes that wrap an assignable value, like {@link VarNode}, declare it themselves.
276
+ *
277
+ * @private
278
+ * @return {boolean} Whether `build()` declares the assignable node.
279
+ */
280
+ _declaresAssignable() {
281
+
282
+ return true;
283
+
284
+ }
285
+
286
+ /**
287
+ * Declares a variable for this node in the current flow, initialized with the given snippet.
288
+ *
289
+ * @private
290
+ * @param {NodeBuilder} builder - The current node builder.
291
+ * @param {string} snippet - The initial value.
292
+ * @param {string} type - The variable type.
293
+ * @param {boolean} readOnly - Whether the variable is read-only.
294
+ * @param {string} property - The node data property that holds the variable.
295
+ * @return {string} The property name of the variable.
296
+ */
297
+ _declareVariable( builder, snippet, type, readOnly, property ) {
298
+
299
+ const nodeVar = builder.getVarFromNode( this, null, type, undefined, readOnly, true, property );
300
+ const propertyName = builder.getPropertyName( nodeVar );
301
+ const declarationPrefix = readOnly
302
+ ? builder.generateLetStatement( nodeVar.type, propertyName, nodeVar.count )
303
+ : builder.generateVarStatement( nodeVar.type, propertyName, nodeVar.count );
304
+
305
+ builder.addLineFlowCode( `${ declarationPrefix } = ${ snippet }`, this );
306
+
307
+ return propertyName;
308
+
309
+ }
310
+
311
+ /**
312
+ * Whether this assignable node must be declared as a variable, because it is assigned
313
+ * or must be evaluated once at its declaration.
314
+ *
315
+ * @private
316
+ * @param {NodeBuilder} builder - The current node builder.
317
+ * @param {Object} nodeData - The node data.
318
+ * @return {boolean} Whether the assignable node is a variable.
319
+ */
320
+ _isVariable( builder, nodeData ) {
321
+
322
+ return ( nodeData.assign === true || nodeData.forceDeclaration === true ) && this.getNodeType( builder ) !== 'void';
323
+
324
+ }
325
+
326
+ /**
327
+ * Generates an assignable node as a variable. The variable is declared the first
328
+ * time it is generated, which is its stack position, and then referenced by name.
329
+ *
330
+ * @private
331
+ * @param {NodeBuilder} builder - The current node builder.
332
+ * @param {Object} nodeData - The node data.
333
+ * @param {?string} output - The output type.
334
+ * @return {string} The generated shader string.
335
+ */
336
+ _buildVariable( builder, nodeData, output ) {
337
+
338
+ const nodeType = this.getNodeType( builder );
339
+ const type = builder.getVectorType( nodeType );
340
+
341
+ if ( nodeData.propertyName === undefined ) {
342
+
343
+ const snippet = this.generate.length < 2
344
+ ? builder.format( this.generate( builder ) || '', nodeType, type )
345
+ : this.generate( builder, type ) || '';
346
+
347
+ nodeData.propertyName = this._declareVariable( builder, snippet, type, false, 'variable' );
348
+
349
+ }
350
+
351
+ return builder.format( nodeData.propertyName, type, output );
352
+
353
+ }
354
+
355
+ /**
356
+ * Whether the generated value is a variable declared in the scope of the function,
357
+ * so it keeps its value after the block where it was generated, e.g. a {@link VarNode}.
358
+ *
359
+ * @private
360
+ * @return {boolean} Whether the generated value is a variable of the function scope.
361
+ */
362
+ _isFunctionScope() {
363
+
364
+ return false;
365
+
366
+ }
367
+
368
+ /**
369
+ * A generated value is only visible in the block where it was declared and in its inner blocks.
370
+ * A variable of the function scope is also visible in a later block of the same parent and guard,
371
+ * e.g. a second `if ( c )` of an immutable condition `c`, since that block only runs if its block ran.
372
+ * This method discards the generated value if it is not visible in the current block.
373
+ *
374
+ * @private
375
+ * @param {NodeBuilder} builder - The current node builder.
376
+ * @param {Object} nodeData - The node data.
377
+ */
378
+ _checkFlowBlock( builder, nodeData ) {
379
+
380
+ if ( nodeData.flowBlock !== undefined ) {
381
+
382
+ const { guard, parent } = nodeData.flowBlock;
383
+ const isFunctionScope = guard !== undefined && this._isFunctionScope();
384
+
385
+ let flowBlock = builder.flowBlock;
386
+
387
+ while ( flowBlock !== null && flowBlock !== nodeData.flowBlock ) {
388
+
389
+ if ( isFunctionScope && flowBlock.guard === guard && flowBlock.parent === parent ) break;
390
+
391
+ flowBlock = flowBlock.parent;
392
+
393
+ }
394
+
395
+ if ( flowBlock === null ) {
396
+
397
+ nodeData.flowBlock = undefined;
398
+ nodeData.propertyName = undefined;
399
+ nodeData.snippet = undefined;
400
+ nodeData.generated = undefined;
401
+
402
+ }
403
+
404
+ }
405
+
406
+ }
407
+
408
+ /**
409
+ * Keeps the block where a value was generated, so it is only reused where it is visible.
410
+ * A global node is a declaration visible in any block, unless it emitted code in this block.
411
+ *
412
+ * @private
413
+ * @param {NodeBuilder} builder - The current node builder.
414
+ * @param {Object} nodeData - The node data.
415
+ * @param {boolean} isCached - Whether the value was generated before.
416
+ * @param {number} flowCodeLength - The length of the flow code before the value was generated.
417
+ */
418
+ _setFlowBlock( builder, nodeData, isCached, flowCodeLength ) {
419
+
420
+ const isLocal = this.isGlobal( builder ) === false || builder.flow.code.length !== flowCodeLength;
421
+
422
+ if ( isCached === false && ( nodeData.propertyName !== undefined || nodeData.snippet !== undefined ) && isLocal && builder.flowBlock !== null ) {
423
+
424
+ nodeData.flowBlock = builder.flowBlock;
425
+
426
+ }
427
+
428
+ }
429
+
170
430
  /**
171
431
  * Set this property to `true` when the node should be regenerated.
172
432
  *
@@ -194,7 +454,7 @@ class Node extends EventDispatcher {
194
454
 
195
455
  if ( this._uuid === null ) {
196
456
 
197
- this._uuid = MathUtils.generateUUID();
457
+ this._uuid = generateUUID();
198
458
 
199
459
  }
200
460
 
@@ -311,19 +571,23 @@ class Node extends EventDispatcher {
311
571
  }
312
572
 
313
573
  /**
314
- * Generator function that can be used to iterate over the child nodes.
574
+ * Returns the child nodes of this node.
315
575
  *
316
- * @generator
317
- * @yields {Node} A child node.
576
+ * @return {Array<Node>} The child nodes.
318
577
  */
319
- * getChildren() {
578
+ getChildren() {
579
+
580
+ const children = this._getChildren();
581
+ const nodes = [];
320
582
 
321
- for ( const { childNode } of this._getChildren() ) {
583
+ for ( let i = 0; i < children.length; i ++ ) {
322
584
 
323
- yield childNode;
585
+ nodes.push( children[ i ].childNode );
324
586
 
325
587
  }
326
588
 
589
+ return nodes;
590
+
327
591
  }
328
592
 
329
593
  /**
@@ -374,12 +638,19 @@ class Node extends EventDispatcher {
374
638
  // avoid circular references
375
639
  ignores.add( this );
376
640
 
377
- for ( const property of Object.getOwnPropertyNames( this ) ) {
641
+ const properties = Object.getOwnPropertyNames( this );
642
+
643
+ for ( let p = 0; p < properties.length; p ++ ) {
644
+
645
+ const property = properties[ p ];
646
+
647
+ // Ignore private properties.
648
+ if ( property.charCodeAt( 0 ) === 95 ) continue;
378
649
 
379
650
  const object = this[ property ];
380
651
 
381
- // Ignore private properties and ignored nodes.
382
- if ( property.startsWith( '_' ) === true || ignores.has( object ) ) continue;
652
+ // Ignore primitives and ignored nodes.
653
+ if ( object === null || ( typeof object !== 'object' && typeof object !== 'function' ) || ignores.has( object ) ) continue;
383
654
 
384
655
  if ( Array.isArray( object ) === true ) {
385
656
 
@@ -657,23 +928,26 @@ class Node extends EventDispatcher {
657
928
 
658
929
  if ( callback ) {
659
930
 
931
+ // the overrides are cached per callback, nested contexts can override the same node with different nodes
932
+
660
933
  const nodeData = builder.getDataFromNode( this );
934
+ const overrides = nodeData.overrides || ( nodeData.overrides = new Map() );
661
935
 
662
- if ( nodeData.isOverwritten !== true ) {
936
+ if ( overrides.has( callback ) === false ) {
663
937
 
664
- nodeData.isOverwritten = true;
938
+ // avoid recursive override calls
939
+
940
+ overrides.set( callback, null );
665
941
 
666
942
  // cancel the override for use the same node inside the callback
667
943
 
668
944
  sharedNode = callback( builder ).overrideNode( this, null );
669
945
 
670
- nodeData.sharedNode = sharedNode;
946
+ overrides.set( callback, sharedNode );
671
947
 
672
948
  } else {
673
949
 
674
- // avoid recursive override calls
675
-
676
- sharedNode = nodeData.sharedNode;
950
+ sharedNode = overrides.get( callback );
677
951
 
678
952
  }
679
953
 
@@ -825,13 +1099,20 @@ class Node extends EventDispatcher {
825
1099
 
826
1100
  }
827
1101
 
828
- before( node ) {
1102
+ /**
1103
+ * Registers the inspector node added with `toInspector()` in the builder, so it is updated every frame.
1104
+ * Nodes that override `build()` without always calling `super.build()` must call this method.
1105
+ *
1106
+ * @private
1107
+ * @param {NodeBuilder} builder - The current node builder.
1108
+ */
1109
+ _setupInspector( builder ) {
829
1110
 
830
- if ( this._beforeNodes === null ) this._beforeNodes = [];
1111
+ if ( this._inspectorNode !== null && builder.buildStage === 'setup' ) {
831
1112
 
832
- this._beforeNodes.push( node );
1113
+ builder.addNode( this._inspectorNode );
833
1114
 
834
- return this;
1115
+ }
835
1116
 
836
1117
  }
837
1118
 
@@ -847,6 +1128,8 @@ class Node extends EventDispatcher {
847
1128
  */
848
1129
  build( builder, output = null ) {
849
1130
 
1131
+ this._setupInspector( builder );
1132
+
850
1133
  const refNode = this.getShared( builder );
851
1134
 
852
1135
  if ( this !== refNode ) {
@@ -857,26 +1140,11 @@ class Node extends EventDispatcher {
857
1140
 
858
1141
  //
859
1142
 
860
- if ( this._beforeNodes !== null ) {
861
-
862
- const currentBeforeNodes = this._beforeNodes;
863
-
864
- this._beforeNodes = null;
865
-
866
- for ( const beforeNode of currentBeforeNodes ) {
867
-
868
- beforeNode.build( builder, output );
869
-
870
- }
871
-
872
- this._beforeNodes = currentBeforeNodes;
873
-
874
- }
1143
+ const nodeData = builder.getDataFromNode( this );
875
1144
 
876
- //
1145
+ if ( this.assignable === true && this._declaresAssignable() ) this._updateAssignable( builder, nodeData );
877
1146
 
878
- const nodeData = builder.getDataFromNode( this );
879
- nodeData.buildStages = nodeData.buildStages || {};
1147
+ nodeData.buildStages = nodeData.buildStages || { setup: false, analyze: false, generate: false };
880
1148
  nodeData.buildStages[ builder.buildStage ] = true;
881
1149
 
882
1150
  const parentBuildStage = _parentBuildStage[ builder.buildStage ];
@@ -960,62 +1228,94 @@ class Node extends EventDispatcher {
960
1228
 
961
1229
  } else if ( buildStage === 'generate' ) {
962
1230
 
963
- // If generate has just one argument, it means the output type is not required.
964
- // This means that the node does not handle output conversions internally,
965
- // so the value is stored in a cache and the builder handles the conversion
966
- // for all requested output types.
1231
+ this._checkFlowBlock( builder, nodeData );
967
1232
 
968
- const isGenerateOnce = this.generate.length < 2;
1233
+ const isCached = nodeData.propertyName !== undefined || nodeData.snippet !== undefined;
1234
+ const flowCodeLength = builder.flow.code.length;
969
1235
 
970
- if ( isGenerateOnce ) {
1236
+ // References must be generated directly, even if a cached value exists.
1237
+ const allowedCache = this.isCacheable( builder ) && builder.isReference( output ) === false;
1238
+ const type = allowedCache ? builder.getVectorType( this.getNodeType( builder, output ) ) : null;
1239
+ const cacheResult = allowedCache && type !== 'void' && output !== 'void' && nodeData.usageCount > 1;
1240
+ const generateOutput = cacheResult ? type : output;
971
1241
 
972
- const type = this.getNodeType( builder );
973
- const nodeData = builder.getDataFromNode( this );
1242
+ if ( this.assignable === true && this._declaresAssignable() && this._isVariable( builder, nodeData ) ) {
1243
+
1244
+ result = this._buildVariable( builder, nodeData, output );
1245
+
1246
+ } else if ( allowedCache && nodeData.propertyName !== undefined ) {
1247
+
1248
+ result = builder.format( nodeData.propertyName, type, output );
1249
+
1250
+ } else {
1251
+
1252
+ // If generate has just one argument, it means the output type is not required.
1253
+ // This means that the node does not handle output conversions internally,
1254
+ // so the value is stored in a cache and the builder handles the conversion
1255
+ // for all requested output types.
1256
+
1257
+ const isGenerateOnce = this.generate.length < 2;
1258
+
1259
+ if ( isGenerateOnce ) {
974
1260
 
975
- result = nodeData.snippet;
1261
+ const type = this.getNodeType( builder );
976
1262
 
977
- if ( result === undefined ) {
1263
+ result = nodeData.snippet;
978
1264
 
979
- if ( nodeData.generated === undefined ) {
1265
+ if ( result === undefined ) {
980
1266
 
981
- nodeData.generated = true;
1267
+ if ( nodeData.generated === undefined ) {
982
1268
 
983
- result = this.generate( builder ) || '';
1269
+ nodeData.generated = true;
984
1270
 
985
- nodeData.snippet = result;
1271
+ result = this.generate( builder ) || '';
986
1272
 
987
- } else {
1273
+ nodeData.snippet = result;
988
1274
 
989
- warn( 'Node: Recursion detected.', this );
1275
+ } else {
990
1276
 
991
- result = '/* Recursion detected. */';
1277
+ warn( 'Node: Recursion detected.', this );
1278
+
1279
+ result = '/* Recursion detected. */';
1280
+
1281
+ }
992
1282
 
993
1283
  }
994
1284
 
995
- } else if ( nodeData.flowCodes !== undefined && builder.context.nodeBlock !== undefined ) {
1285
+ result = builder.format( result, type, generateOutput );
996
1286
 
997
- builder.addFlowCodeHierarchy( this, builder.context.nodeBlock );
1287
+ } else {
1288
+
1289
+ result = this.generate( builder, generateOutput ) || '';
998
1290
 
999
1291
  }
1000
1292
 
1001
- result = builder.format( result, type, output );
1293
+ if ( result === '' && generateOutput !== null && generateOutput !== 'void' && generateOutput !== 'OutputType' ) {
1002
1294
 
1003
- } else {
1295
+ // if no snippet is generated, return a default value
1004
1296
 
1005
- result = this.generate( builder, output ) || '';
1297
+ error( `TSL: Invalid generated code, expected a "${ generateOutput }".` );
1006
1298
 
1007
- }
1299
+ result = builder.generateConst( generateOutput );
1300
+
1301
+ }
1008
1302
 
1009
- if ( result === '' && output !== null && output !== 'void' && output !== 'OutputType' ) {
1303
+ if ( cacheResult ) {
1010
1304
 
1011
- // if no snippet is generated, return a default value
1305
+ // Use a dedicated property, the node may already own a variable.
1306
+ const propertyName = this._declareVariable( builder, result, type, nodeData.assign !== true, 'cacheVariable' );
1012
1307
 
1013
- error( `TSL: Invalid generated code, expected a "${ output }".` );
1308
+ nodeData.snippet = result;
1309
+ nodeData.propertyName = propertyName;
1014
1310
 
1015
- result = builder.generateConst( output );
1311
+ result = builder.format( propertyName, type, output );
1312
+
1313
+ }
1016
1314
 
1017
1315
  }
1018
1316
 
1317
+ this._setFlowBlock( builder, nodeData, isCached, flowCodeLength );
1318
+
1019
1319
  }
1020
1320
 
1021
1321
  builder.removeChain( this );