@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
@@ -41,42 +41,46 @@ function getWireframeId( geometry ) {
41
41
  */
42
42
  function getWireframeIndex( geometry ) {
43
43
 
44
- const indices = [];
45
-
46
44
  const geometryIndex = geometry.index;
47
45
  const geometryPosition = geometry.attributes.position;
46
+ const count = geometryIndex !== null ? geometryIndex.array.length : ( geometryPosition.array.length / 3 ) - 1;
47
+
48
+ const IndexBufferAttribute = geometryPosition.count >= 65535 ? Uint32BufferAttribute : Uint16BufferAttribute;
49
+ const attribute = new IndexBufferAttribute( Math.ceil( count / 3 ) * 6, 1 );
50
+ const indices = attribute.array;
48
51
 
49
52
  if ( geometryIndex !== null ) {
50
53
 
51
54
  const array = geometryIndex.array;
52
55
 
53
- for ( let i = 0, l = array.length; i < l; i += 3 ) {
56
+ for ( let i = 0, j = 0; i < count; i += 3 ) {
54
57
 
55
58
  const a = array[ i + 0 ];
56
59
  const b = array[ i + 1 ];
57
60
  const c = array[ i + 2 ];
58
61
 
59
- indices.push( a, b, b, c, c, a );
62
+ indices[ j ++ ] = a; indices[ j ++ ] = b;
63
+ indices[ j ++ ] = b; indices[ j ++ ] = c;
64
+ indices[ j ++ ] = c; indices[ j ++ ] = a;
60
65
 
61
66
  }
62
67
 
63
68
  } else {
64
69
 
65
- const array = geometryPosition.array;
66
-
67
- for ( let i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {
70
+ for ( let i = 0, j = 0; i < count; i += 3 ) {
68
71
 
69
72
  const a = i + 0;
70
73
  const b = i + 1;
71
74
  const c = i + 2;
72
75
 
73
- indices.push( a, b, b, c, c, a );
76
+ indices[ j ++ ] = a; indices[ j ++ ] = b;
77
+ indices[ j ++ ] = b; indices[ j ++ ] = c;
78
+ indices[ j ++ ] = c; indices[ j ++ ] = a;
74
79
 
75
80
  }
76
81
 
77
82
  }
78
83
 
79
- const attribute = new ( geometryPosition.count >= 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );
80
84
  attribute.version = getWireframeVersion( geometry );
81
85
  attribute.__id = getWireframeId( geometry );
82
86
 
@@ -84,6 +88,69 @@ function getWireframeIndex( geometry ) {
84
88
 
85
89
  }
86
90
 
91
+ /**
92
+ * What of each instanced mesh's instance attribute is on the GPU: the version it was last sent at,
93
+ * and how many of its values were sent.
94
+ *
95
+ * @private
96
+ * @type {WeakMap<BufferAttribute, {version: number, end: number}>}
97
+ */
98
+ const _sentInstances = /*@__PURE__*/ new WeakMap();
99
+
100
+ /**
101
+ * Limits what goes to the GPU of an instanced mesh's `instanceMatrix` or `instanceColor` to the
102
+ * instances it draws (`count`), not its whole capacity: a change flagged without update ranges
103
+ * sends that prefix, so a culler refilling the first few hundred of thousands of slots sends those.
104
+ * When the mesh comes to draw more, the rest goes up before the draw, as it stands then.
105
+ *
106
+ * @private
107
+ * @param {BufferAttribute} attribute - The instance attribute.
108
+ * @param {InstancedMesh} mesh - The mesh drawing with it.
109
+ */
110
+ function sendDrawnInstances( attribute, mesh ) {
111
+
112
+ const length = attribute.array.length;
113
+ const drawn = Math.min( mesh.count, attribute.count ) * attribute.itemSize;
114
+
115
+ let sent = _sentInstances.get( attribute );
116
+
117
+ if ( sent === undefined ) {
118
+
119
+ // The first upload sends all of it.
120
+ _sentInstances.set( attribute, { version: attribute.version, end: length } );
121
+ return;
122
+
123
+ }
124
+
125
+ if ( sent.version !== attribute.version ) {
126
+
127
+ sent.version = attribute.version;
128
+
129
+ if ( attribute.updateRanges.length > 0 ) return;
130
+
131
+ if ( drawn < length ) {
132
+
133
+ // The drawn prefix; with nothing drawn, an empty range rather than none (which sends all).
134
+ attribute.addUpdateRange( 0, drawn );
135
+ sent.end = drawn;
136
+
137
+ } else {
138
+
139
+ sent.end = length;
140
+
141
+ }
142
+
143
+ } else if ( sent.end < drawn ) {
144
+
145
+ attribute.clearUpdateRanges();
146
+ attribute.addUpdateRange( sent.end, drawn - sent.end );
147
+ sent.end = drawn;
148
+ sent.version = ++ attribute.version;
149
+
150
+ }
151
+
152
+ }
153
+
87
154
  /**
88
155
  * This renderer module manages geometries.
89
156
  *
@@ -95,13 +162,21 @@ class Geometries extends DataMap {
95
162
  /**
96
163
  * Constructs a new geometry management component.
97
164
  *
165
+ * @param {Backend} backend - The renderer's backend.
98
166
  * @param {Attributes} attributes - Renderer component for managing attributes.
99
167
  * @param {Info} info - Renderer component for managing metrics and monitoring data.
100
168
  */
101
- constructor( attributes, info ) {
169
+ constructor( backend, attributes, info ) {
102
170
 
103
171
  super();
104
172
 
173
+ /**
174
+ * The renderer's backend.
175
+ *
176
+ * @type {Backend}
177
+ */
178
+ this.backend = backend;
179
+
105
180
  /**
106
181
  * Renderer component for managing attributes.
107
182
  *
@@ -132,34 +207,32 @@ class Geometries extends DataMap {
132
207
  this.attributeCall = new WeakMap();
133
208
 
134
209
  /**
135
- * Stores the event listeners attached to geometries.
210
+ * Stores weak references to the geometries with attached
211
+ * `dispose` event listeners.
136
212
  *
137
213
  * @private
138
- * @type {Map<BufferGeometry,Function>}
214
+ * @type {Set<WeakRef<BufferGeometry>>}
139
215
  */
140
- this._geometryDisposeListeners = new Map();
216
+ this._tracked = new Set();
141
217
 
142
218
  /**
143
- * The render objects drawing each geometry, kept as render objects are made, change geometry
144
- * and are disposed (never per draw), so disposing a geometry frees the node attributes of
145
- * every render object drawing it.
219
+ * Removes weak references from `_tracked` when their geometry
220
+ * has been garbage collected without an explicit `dispose()`.
146
221
  *
147
222
  * @private
148
- * @type {WeakMap<BufferGeometry,Set<RenderObject>>}
223
+ * @type {FinalizationRegistry}
149
224
  */
150
- this._users = new WeakMap();
225
+ this._registry = new FinalizationRegistry( ( ref ) => this._tracked.delete( ref ) );
151
226
 
152
227
  }
153
228
 
154
229
  /**
155
- * Returns `true` if the given render object has an initialized geometry.
230
+ * Returns `true` if the given geometry is initialized.
156
231
  *
157
- * @param {RenderObject} renderObject - The render object.
158
- * @return {boolean} Whether if the given render object has an initialized geometry or not.
232
+ * @param {BufferGeometry} geometry - The geometry.
233
+ * @return {boolean} Whether if the given geometry is initialized or not.
159
234
  */
160
- has( renderObject ) {
161
-
162
- const geometry = renderObject.geometry;
235
+ has( geometry ) {
163
236
 
164
237
  return super.has( geometry ) && this.get( geometry ).initialized === true;
165
238
 
@@ -172,37 +245,28 @@ class Geometries extends DataMap {
172
245
  */
173
246
  updateForRender( renderObject ) {
174
247
 
175
- if ( this.has( renderObject ) === false ) this.initGeometry( renderObject );
248
+ const geometry = renderObject.geometry;
249
+
250
+ if ( this.has( geometry ) === false ) this.initGeometry( geometry );
176
251
 
177
252
  this.updateAttributes( renderObject );
178
253
 
179
254
  }
180
255
 
181
256
  /**
182
- * Initializes the geometry of the given render object.
257
+ * Initializes the given geometry.
183
258
  *
184
- * @param {RenderObject} renderObject - The render object.
259
+ * @param {BufferGeometry} geometry - The geometry.
185
260
  */
186
- initGeometry( renderObject ) {
261
+ initGeometry( geometry ) {
187
262
 
188
- const geometry = renderObject.geometry;
189
263
  const geometryData = this.get( geometry );
190
264
 
191
265
  geometryData.initialized = true;
192
266
 
193
267
  this.info.memory.geometries ++;
194
268
 
195
- // A geometry set up again keeps a single listener.
196
-
197
- const previous = this._geometryDisposeListeners.get( geometry );
198
-
199
- if ( previous !== undefined ) geometry.removeEventListener( 'dispose', previous );
200
-
201
- // The listener holds the geometry and nothing drawn with it: holding the first render object
202
- // (as three.js did) kept that object, and through its parents its whole scene, alive for as
203
- // long as a shared geometry lived.
204
-
205
- const onDispose = () => {
269
+ geometryData.onDispose = () => {
206
270
 
207
271
  this.info.memory.geometries --;
208
272
 
@@ -220,7 +284,7 @@ class Geometries extends DataMap {
220
284
 
221
285
  for ( const attribute of Object.values( geometry.attributes ) ) {
222
286
 
223
- this.attributes.delete( attribute );
287
+ this.attributes.delete( this.backend.getBufferAttribute( attribute ) );
224
288
 
225
289
  }
226
290
 
@@ -234,81 +298,24 @@ class Geometries extends DataMap {
234
298
 
235
299
  }
236
300
 
237
- // node attributes of the render objects drawing this geometry (`BufferAttribute.dispose()`
238
- // and `Renderer.releaseObject()` free them one by one)
239
-
240
- const users = this._users.get( geometry );
241
-
242
- if ( users !== undefined ) {
243
-
244
- const currentAttributes = new Set( Object.values( geometry.attributes ) );
245
-
246
- for ( const renderObject of users ) {
247
-
248
- // drawn ones only (render objects clear their attribute list on this same event,
249
- // so it's built again from their node state)
250
-
251
- if ( ! renderObject._nodeBuilderState ) continue;
252
-
253
- for ( const attribute of renderObject.getAttributes() ) {
254
-
255
- if ( currentAttributes.has( attribute ) === false ) {
256
-
257
- this.attributes.delete( attribute );
258
-
259
- }
260
-
261
- }
262
-
263
- }
264
-
265
- }
266
-
267
301
  //
268
302
 
269
- geometry.removeEventListener( 'dispose', onDispose );
303
+ geometry.removeEventListener( 'dispose', geometryData.onDispose );
270
304
 
271
- this._geometryDisposeListeners.delete( geometry );
305
+ this._tracked.delete( geometryData.ref );
306
+ this._registry.unregister( geometryData.ref );
272
307
 
273
308
  this.delete( geometry );
274
309
 
275
310
  };
276
311
 
277
- geometry.addEventListener( 'dispose', onDispose );
312
+ geometry.addEventListener( 'dispose', geometryData.onDispose );
278
313
 
279
314
  // see #31798 why tracking separate remove listeners is required right now
280
- // TODO: Re-evaluate how onDispose() is managed in this component
281
- this._geometryDisposeListeners.set( geometry, onDispose );
282
-
283
- }
284
-
285
- /**
286
- * Records that a render object draws a geometry.
287
- *
288
- * @param {RenderObject} renderObject - The render object.
289
- * @param {BufferGeometry} geometry - The geometry it draws.
290
- */
291
- addUser( renderObject, geometry ) {
292
-
293
- let users = this._users.get( geometry );
315
+ geometryData.ref = new WeakRef( geometry );
294
316
 
295
- if ( users === undefined ) this._users.set( geometry, users = new Set() );
296
-
297
- users.add( renderObject );
298
-
299
- }
300
-
301
- /**
302
- * Records that a render object no longer draws a geometry.
303
- *
304
- * @param {RenderObject} renderObject - The render object.
305
- * @param {BufferGeometry} geometry - The geometry it drew.
306
- */
307
- removeUser( renderObject, geometry ) {
308
-
309
- const users = this._users.get( geometry );
310
-
311
- if ( users !== undefined ) users.delete( renderObject );
317
+ this._tracked.add( geometryData.ref );
318
+ this._registry.register( geometry, geometryData.ref, geometryData.ref );
312
319
 
313
320
  }
314
321
 
@@ -322,6 +329,7 @@ class Geometries extends DataMap {
322
329
  // attributes
323
330
 
324
331
  const attributes = renderObject.getAttributes();
332
+ const object = renderObject.object;
325
333
 
326
334
  for ( const attribute of attributes ) {
327
335
 
@@ -331,6 +339,14 @@ class Geometries extends DataMap {
331
339
 
332
340
  } else {
333
341
 
342
+ if ( object.isInstancedMesh === true ) {
343
+
344
+ const bufferAttribute = this.backend.getBufferAttribute( attribute );
345
+
346
+ if ( bufferAttribute === object.instanceMatrix || bufferAttribute === object.instanceColor ) sendDrawnInstances( bufferAttribute, object );
347
+
348
+ }
349
+
334
350
  this.updateAttribute( attribute, AttributeType.VERTEX );
335
351
 
336
352
  }
@@ -369,33 +385,13 @@ class Geometries extends DataMap {
369
385
 
370
386
  const callId = this.info.render.calls;
371
387
 
372
- if ( ! attribute.isInterleavedBufferAttribute ) {
373
-
374
- if ( this.attributeCall.get( attribute ) !== callId ) {
375
-
376
- this.attributes.update( attribute, type );
377
-
378
- this.attributeCall.set( attribute, callId );
379
-
380
- }
381
-
382
- } else {
383
-
384
- if ( this.attributeCall.get( attribute ) === undefined ) {
385
-
386
- this.attributes.update( attribute, type );
388
+ const bufferAttribute = this.backend.getBufferAttribute( attribute );
387
389
 
388
- this.attributeCall.set( attribute, callId );
390
+ if ( this.attributeCall.get( bufferAttribute ) !== callId ) {
389
391
 
390
- } else if ( this.attributeCall.get( attribute.data ) !== callId ) {
392
+ this.attributes.update( bufferAttribute, type );
391
393
 
392
- this.attributes.update( attribute, type );
393
-
394
- this.attributeCall.set( attribute.data, callId );
395
-
396
- this.attributeCall.set( attribute, callId );
397
-
398
- }
394
+ this.attributeCall.set( bufferAttribute, callId );
399
395
 
400
396
  }
401
397
 
@@ -468,15 +464,57 @@ class Geometries extends DataMap {
468
464
 
469
465
  }
470
466
 
467
+ /**
468
+ * Deletes the attributes that are defined via nodes and not on geometry level.
469
+ *
470
+ * @param {RenderObject} renderObject - The render object.
471
+ */
472
+ deleteNodeAttributes( renderObject ) {
473
+
474
+ const currentAttributes = new Set( Object.values( renderObject.geometry.attributes ) );
475
+
476
+ for ( const attribute of renderObject.getAttributes() ) {
477
+
478
+ if ( currentAttributes.has( attribute ) === false ) {
479
+
480
+ this.attributes.delete( this.backend.getBufferAttribute( attribute ) );
481
+
482
+ }
483
+
484
+ }
485
+
486
+ }
487
+
488
+ /**
489
+ * Deletes the vertex state for the given render object.
490
+ *
491
+ * @param {RenderObject} renderObject - The render object.
492
+ */
493
+ deleteVertexState( renderObject ) {
494
+
495
+ this.backend.deleteVertexState( renderObject );
496
+
497
+ }
498
+
499
+ /**
500
+ * Frees internal resources.
501
+ */
471
502
  dispose() {
472
503
 
473
- for ( const [ geometry, onDispose ] of this._geometryDisposeListeners.entries() ) {
504
+ for ( const ref of this._tracked ) {
505
+
506
+ const geometry = ref.deref();
474
507
 
475
- geometry.removeEventListener( 'dispose', onDispose );
508
+ if ( geometry === undefined ) continue;
509
+
510
+ const geometryData = this.get( geometry );
511
+ geometryData.onDispose();
476
512
 
477
513
  }
478
514
 
479
- this._geometryDisposeListeners.clear();
515
+ this._tracked.clear();
516
+
517
+ super.dispose();
480
518
 
481
519
  }
482
520
 
@@ -479,7 +479,7 @@ class Info {
479
479
  let size = width * height * depth * bytesPerPixel;
480
480
  const mipmaps = texture.mipmaps;
481
481
 
482
- if ( mipmaps && mipmaps.length > 0 ) {
482
+ if ( mipmaps.length > 0 ) {
483
483
 
484
484
  let mipmapSize = 0;
485
485
  for ( let i = 0; i < mipmaps.length; i ++ ) {
@@ -1,7 +1,7 @@
1
1
  import { EventDispatcher } from '../../core/EventDispatcher.js';
2
2
 
3
3
  /**
4
- * InspectorBase is the base class for all inspectors.
4
+ * InspectorBase is the base class for all inspectors. Can only be used with {@link WebGPURenderer}.
5
5
  *
6
6
  * @augments EventDispatcher
7
7
  */
@@ -17,7 +17,7 @@ class InspectorBase extends EventDispatcher {
17
17
  /**
18
18
  * The renderer associated with this inspector.
19
19
  *
20
- * @type {WebGLRenderer}
20
+ * @type {Renderer}
21
21
  * @private
22
22
  */
23
23
  this._renderer = null;
@@ -61,7 +61,7 @@ class InspectorBase extends EventDispatcher {
61
61
  /**
62
62
  * Sets the renderer for this inspector.
63
63
  *
64
- * @param {WebGLRenderer} renderer - The renderer to associate with this inspector.
64
+ * @param {Renderer} renderer - The renderer to associate with this inspector.
65
65
  * @return {InspectorBase} This inspector instance.
66
66
  */
67
67
  setRenderer( renderer ) {
@@ -75,7 +75,7 @@ class InspectorBase extends EventDispatcher {
75
75
  /**
76
76
  * Returns the renderer associated with this inspector.
77
77
  *
78
- * @return {WebGLRenderer} The associated renderer.
78
+ * @return {Renderer} The associated renderer.
79
79
  */
80
80
  getRenderer() {
81
81
 
@@ -138,7 +138,7 @@ class InspectorBase extends EventDispatcher {
138
138
  * @param {string} uid - A unique identifier for the render context.
139
139
  * @param {Scene} scene - The scene being rendered.
140
140
  * @param {Camera} camera - The camera being used for rendering.
141
- * @param {?WebGLRenderTarget} renderTarget - The render target, if any.
141
+ * @param {?RenderTarget} renderTarget - The render target, if any.
142
142
  */
143
143
  beginRender( /*uid, scene, camera, renderTarget*/ ) { }
144
144
 
@@ -42,6 +42,24 @@ class Lighting {
42
42
  */
43
43
  this._lightsNodeMap = new WeakMap();
44
44
 
45
+ /**
46
+ * Weak references to the lights nodes created by this lighting manager, so they
47
+ * can be disposed with {@link Lighting#dispose} without keeping scenes alive.
48
+ *
49
+ * @private
50
+ * @type {Set<WeakRef<LightsNode>>}
51
+ */
52
+ this._tracked = new Set();
53
+
54
+ /**
55
+ * Removes weak references from `_tracked` when their lights node has been
56
+ * garbage collected without an explicit `dispose()`.
57
+ *
58
+ * @private
59
+ * @type {FinalizationRegistry}
60
+ */
61
+ this._registry = new FinalizationRegistry( ( ref ) => this._tracked.delete( ref ) );
62
+
45
63
  }
46
64
 
47
65
  /**
@@ -73,6 +91,7 @@ class Lighting {
73
91
 
74
92
  node = this.createNode();
75
93
  this._lightsNodeMap.set( scene, node );
94
+ this._track( node );
76
95
 
77
96
  }
78
97
 
@@ -80,6 +99,22 @@ class Lighting {
80
99
 
81
100
  }
82
101
 
102
+ /**
103
+ * Tracks the given lights node so it is disposed with {@link Lighting#dispose}.
104
+ * Subclasses creating additional lights nodes should track them as well.
105
+ *
106
+ * @private
107
+ * @param {LightsNode} node - The lights node.
108
+ */
109
+ _track( node ) {
110
+
111
+ const ref = new WeakRef( node );
112
+
113
+ this._tracked.add( ref );
114
+ this._registry.register( node, ref, ref );
115
+
116
+ }
117
+
83
118
  /**
84
119
  * Saves the current lights of the scene's lights node so they can be restored
85
120
  * in {@link Lighting#finishRender}. Must be paired with a `finishRender()` call
@@ -107,6 +142,30 @@ class Lighting {
107
142
 
108
143
  }
109
144
 
145
+ /**
146
+ * Frees the resources of the lights nodes created by this lighting manager. Called by
147
+ * the renderer when it is disposed, or by the app after replacing the lighting system.
148
+ * The lighting manager must not be used for rendering anymore after this call.
149
+ */
150
+ dispose() {
151
+
152
+ for ( const ref of this._tracked ) {
153
+
154
+ const node = ref.deref();
155
+
156
+ if ( node !== undefined ) {
157
+
158
+ this._registry.unregister( ref );
159
+ node.dispose();
160
+
161
+ }
162
+
163
+ }
164
+
165
+ this._tracked.clear();
166
+
167
+ }
168
+
110
169
  }
111
170
 
112
171
  export default Lighting;
@@ -111,9 +111,7 @@ class Pipelines extends DataMap {
111
111
 
112
112
  if ( stageCompute === undefined ) {
113
113
 
114
- if ( previousPipeline && previousPipeline.computeProgram.usedTimes === 0 ) this._releaseProgram( previousPipeline.computeProgram );
115
-
116
- stageCompute = new ProgrammableStage( nodeBuilderState.computeShader, 'compute', computeNode.name, nodeBuilderState.transforms, nodeBuilderState.nodeAttributes );
114
+ stageCompute = new ProgrammableStage( nodeBuilderState.computeShader, 'compute', computeNode.name );
117
115
  this.programs.compute.set( nodeBuilderState.computeShader, stageCompute );
118
116
 
119
117
  backend.createProgram( stageCompute );
@@ -129,8 +127,6 @@ class Pipelines extends DataMap {
129
127
 
130
128
  if ( pipeline === undefined ) {
131
129
 
132
- if ( previousPipeline && previousPipeline.usedTimes === 0 ) this._releasePipeline( previousPipeline );
133
-
134
130
  pipeline = this._getComputePipeline( computeNode, stageCompute, cacheKey, bindings, promises );
135
131
 
136
132
  }
@@ -140,6 +136,15 @@ class Pipelines extends DataMap {
140
136
  pipeline.usedTimes ++;
141
137
  stageCompute.usedTimes ++;
142
138
 
139
+ // release previous pipeline and program if they are not used anymore
140
+
141
+ if ( previousPipeline ) {
142
+
143
+ if ( previousPipeline.usedTimes === 0 ) this._releasePipeline( previousPipeline );
144
+ if ( previousPipeline.computeProgram.usedTimes === 0 ) this._releaseProgram( previousPipeline.computeProgram );
145
+
146
+ }
147
+
143
148
  //
144
149
 
145
150
  data.version = computeNode.version;
@@ -188,8 +193,6 @@ class Pipelines extends DataMap {
188
193
 
189
194
  if ( stageVertex === undefined ) {
190
195
 
191
- if ( previousPipeline && previousPipeline.vertexProgram.usedTimes === 0 ) this._releaseProgram( previousPipeline.vertexProgram );
192
-
193
196
  stageVertex = new ProgrammableStage( nodeBuilderState.vertexShader, 'vertex', name );
194
197
  this.programs.vertex.set( nodeBuilderState.vertexShader, stageVertex );
195
198
 
@@ -202,8 +205,6 @@ class Pipelines extends DataMap {
202
205
 
203
206
  if ( stageFragment === undefined ) {
204
207
 
205
- if ( previousPipeline && previousPipeline.fragmentProgram.usedTimes === 0 ) this._releaseProgram( previousPipeline.fragmentProgram );
206
-
207
208
  stageFragment = new ProgrammableStage( nodeBuilderState.fragmentShader, 'fragment', name );
208
209
  this.programs.fragment.set( nodeBuilderState.fragmentShader, stageFragment );
209
210
 
@@ -220,8 +221,6 @@ class Pipelines extends DataMap {
220
221
 
221
222
  if ( pipeline === undefined ) {
222
223
 
223
- if ( previousPipeline && previousPipeline.usedTimes === 0 ) this._releasePipeline( previousPipeline );
224
-
225
224
  pipeline = this._getRenderPipeline( renderObject, stageVertex, stageFragment, cacheKey, promises );
226
225
 
227
226
  } else {
@@ -236,6 +235,16 @@ class Pipelines extends DataMap {
236
235
  stageVertex.usedTimes ++;
237
236
  stageFragment.usedTimes ++;
238
237
 
238
+ // release previous pipeline and programs if they are not used anymore
239
+
240
+ if ( previousPipeline ) {
241
+
242
+ if ( previousPipeline.usedTimes === 0 ) this._releasePipeline( previousPipeline );
243
+ if ( previousPipeline.vertexProgram.usedTimes === 0 ) this._releaseProgram( previousPipeline.vertexProgram );
244
+ if ( previousPipeline.fragmentProgram.usedTimes === 0 ) this._releaseProgram( previousPipeline.fragmentProgram );
245
+
246
+ }
247
+
239
248
  //
240
249
 
241
250
  data.pipeline = pipeline;
@@ -356,7 +365,9 @@ class Pipelines extends DataMap {
356
365
 
357
366
  if ( pipeline === undefined ) {
358
367
 
359
- pipeline = new ComputePipeline( cacheKey, stageCompute );
368
+ const { transforms, nodeAttributes } = this.nodes.getForCompute( computeNode );
369
+
370
+ pipeline = new ComputePipeline( cacheKey, stageCompute, transforms, nodeAttributes );
360
371
 
361
372
  this.caches.set( cacheKey, pipeline );
362
373
 
@@ -444,6 +455,8 @@ class Pipelines extends DataMap {
444
455
  */
445
456
  _releasePipeline( pipeline ) {
446
457
 
458
+ this.backend.destroyPipeline( pipeline );
459
+
447
460
  this.caches.delete( pipeline.cacheKey );
448
461
 
449
462
  }
@@ -461,6 +474,7 @@ class Pipelines extends DataMap {
461
474
 
462
475
  this.programs[ stage ].delete( code );
463
476
 
477
+ this.backend.destroyProgram( program );
464
478
  this.info.destroyProgram( program );
465
479
 
466
480
  }