@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
@@ -15,10 +15,8 @@ class ProgrammableStage {
15
15
  * @param {string} code - The shader code.
16
16
  * @param {('vertex'|'fragment'|'compute')} stage - The type of stage.
17
17
  * @param {string} name - The name of the shader.
18
- * @param {?Array<Object>} [transforms=null] - The transforms (only relevant for compute stages with WebGL 2 which uses Transform Feedback).
19
- * @param {?Array<Object>} [attributes=null] - The attributes (only relevant for compute stages with WebGL 2 which uses Transform Feedback).
20
18
  */
21
- constructor( code, stage, name, transforms = null, attributes = null ) {
19
+ constructor( code, stage, name ) {
22
20
 
23
21
  /**
24
22
  * The id of the programmable stage.
@@ -49,20 +47,6 @@ class ProgrammableStage {
49
47
  */
50
48
  this.name = name;
51
49
 
52
- /**
53
- * The transforms (only relevant for compute stages with WebGL 2 which uses Transform Feedback).
54
- *
55
- * @type {?Array<Object>}
56
- */
57
- this.transforms = transforms;
58
-
59
- /**
60
- * The attributes (only relevant for compute stages with WebGL 2 which uses Transform Feedback).
61
- *
62
- * @type {?Array<Object>}
63
- */
64
- this.attributes = attributes;
65
-
66
50
  /**
67
51
  * How often the programmable stage is currently in use.
68
52
  *
@@ -25,6 +25,27 @@ class RenderContext {
25
25
  */
26
26
  this.id = _id ++;
27
27
 
28
+ /**
29
+ * Identifies the attachment and MRT configuration of the context.
30
+ * Unlike the ID, it is the same for the contexts of all renderer
31
+ * call depths, so render objects use it in their cache key. That way,
32
+ * the shaders built by `compileAsync()` are also used by nested render
33
+ * calls like the scene pass of a render pipeline.
34
+ *
35
+ * @type {string}
36
+ * @default ''
37
+ */
38
+ this.stateKey = '';
39
+
40
+ /**
41
+ * Cached sub-camera frustums shared by render-list and backend culling.
42
+ * Kept per context so nested renders do not overwrite the active frustums.
43
+ *
44
+ * @type {?FrustumArray}
45
+ * @default null
46
+ */
47
+ this.frustumArray = null;
48
+
28
49
  /**
29
50
  * The MRT configuration.
30
51
  *
@@ -36,9 +36,10 @@ class RenderContexts {
36
36
  * @param {?RenderTarget} [renderTarget=null] - The active render target.
37
37
  * @param {?MRTNode} [mrt=null] - The MRT configuration
38
38
  * @param {?number} [callDepth=0] - The call depth of the renderer.
39
+ * @param {?Camera} [camera=null] - The camera of the render call.
39
40
  * @return {RenderContext} The render context.
40
41
  */
41
- get( renderTarget = null, mrt = null, callDepth = 0 ) {
42
+ get( renderTarget = null, mrt = null, callDepth = 0, camera = null ) {
42
43
 
43
44
  //
44
45
 
@@ -50,8 +51,8 @@ class RenderContexts {
50
51
 
51
52
  } else {
52
53
 
53
- const format = renderTarget.texture.format;
54
- const type = renderTarget.texture.type;
54
+ const format = renderTarget.texture?.format;
55
+ const type = renderTarget.texture?.type;
55
56
  const count = renderTarget.textures.length;
56
57
 
57
58
  attachmentState = `${ count }:${ format }:${ type }:${ renderTarget.samples }:${ renderTarget.depthBuffer }:${ renderTarget.stencilBuffer }`;
@@ -64,7 +65,14 @@ class RenderContexts {
64
65
 
65
66
  //
66
67
 
67
- const renderStateKey = attachmentState + '-' + mrtState + '-' + callDepth;
68
+ // materials check the camera type at build time, so camera types must not share render objects
69
+
70
+ const cameraState = camera?.isOrthographicCamera === true ? 'orthographic' : 'perspective';
71
+
72
+ //
73
+
74
+ const stateKey = attachmentState + '-' + mrtState + '-' + cameraState;
75
+ const renderStateKey = stateKey + '-' + callDepth; // one render context per call depth keeps the bindings of nested renders separate
68
76
 
69
77
  let renderState = this._renderContexts[ renderStateKey ];
70
78
 
@@ -72,6 +80,7 @@ class RenderContexts {
72
80
 
73
81
  renderState = new RenderContext();
74
82
  renderState.mrt = mrt;
83
+ renderState.stateKey = stateKey;
75
84
 
76
85
  this._renderContexts[ renderStateKey ] = renderState;
77
86
 
@@ -1,7 +1,9 @@
1
- import { hash, hashString } from '../../nodes/core/NodeUtils.js';
1
+ import { hashArray, hashString } from '../../nodes/core/NodeUtils.js';
2
2
 
3
3
  let _id = 0;
4
4
  const _protoKeysCache = new WeakMap();
5
+ const _cacheKeyValues = [ 0, 0, 0, 0, 0 ];
6
+ const _enumProperties = [ 'side', 'blending', 'combine', 'normalMapType' ];
5
7
 
6
8
  function getKeys( obj ) {
7
9
 
@@ -44,6 +46,21 @@ function getKeys( obj ) {
44
46
 
45
47
  }
46
48
 
49
+ /**
50
+ * Returns a key for the kind of the given instance data: none, attribute or storage.
51
+ *
52
+ * @private
53
+ * @param {?BufferAttribute} attribute - The instance data.
54
+ * @return {string} The key.
55
+ */
56
+ function getInstanceDataKey( attribute ) {
57
+
58
+ if ( attribute === null || attribute === undefined ) return '-';
59
+
60
+ return attribute.isStorageInstancedBufferAttribute === true ? 's' : 'a';
61
+
62
+ }
63
+
47
64
  /**
48
65
  * A render object is the renderer's representation of single entity that gets drawn
49
66
  * with a draw command. There is no unique mapping of render objects to 3D objects in the
@@ -154,6 +171,14 @@ class RenderObject {
154
171
  */
155
172
  this.geometry = object.geometry;
156
173
 
174
+ /**
175
+ * The geometry's version. Incremented whenever the geometry is updated.
176
+ *
177
+ * @type {number}
178
+ * @default 0
179
+ */
180
+ this.geometryVersion = 0;
181
+
157
182
  /**
158
183
  * The render object's version.
159
184
  *
@@ -262,6 +287,13 @@ class RenderObject {
262
287
  */
263
288
  this.initialCacheKey = this.getCacheKey();
264
289
 
290
+ /**
291
+ * The initial geometry cache key.
292
+ *
293
+ * @type {string}
294
+ */
295
+ this.initialGeometryCacheKey = this.getGeometryCacheKey();
296
+
265
297
  /**
266
298
  * The node builder state.
267
299
  *
@@ -299,6 +331,13 @@ class RenderObject {
299
331
  */
300
332
  this._sourceMaterial = renderer._currentSourceMaterial;
301
333
 
334
+ /**
335
+ * The version of the source material this render object was validated against.
336
+ *
337
+ * @type {number}
338
+ */
339
+ this.sourceMaterialVersion = this._sourceMaterial !== null ? this._sourceMaterial.version : 0;
340
+
302
341
  /**
303
342
  * An event listener which is defined by `RenderObjects`. It performs
304
343
  * clean up tasks when `dispose()` on this render object.
@@ -336,6 +375,9 @@ class RenderObject {
336
375
  */
337
376
  this.onGeometryDispose = () => {
338
377
 
378
+ this._geometries.deleteNodeAttributes( this );
379
+ this._geometries.deleteVertexState( this );
380
+
339
381
  // clear geometry cache attributes
340
382
 
341
383
  this.attributes = null;
@@ -355,10 +397,25 @@ class RenderObject {
355
397
 
356
398
  };
357
399
 
400
+ /**
401
+ * An event listener which is executed when `dispose()` is called on
402
+ * the lights node of this render object, e.g. when the lighting system
403
+ * of the renderer is disposed.
404
+ *
405
+ * @method
406
+ */
407
+ this.onLightsNodeDispose = () => {
408
+
409
+ this.dispose();
410
+
411
+ };
412
+
358
413
  this.object.addEventListener( 'dispose', this.onObjectDispose );
359
414
  this.material.addEventListener( 'dispose', this.onMaterialDispose );
360
415
  this.geometry.addEventListener( 'dispose', this.onGeometryDispose );
361
416
 
417
+ this.lightsNode.addEventListener( 'dispose', this.onLightsNodeDispose );
418
+
362
419
  if ( this._sourceMaterial !== null ) {
363
420
 
364
421
  this._sourceMaterial.addEventListener( 'dispose', this.onMaterialDispose );
@@ -435,7 +492,7 @@ class RenderObject {
435
492
  */
436
493
  getBindings() {
437
494
 
438
- return this._bindings || ( this._bindings = this.getNodeBuilderState().createBindings() );
495
+ return this._bindings || ( this._bindings = this.getNodeBuilderState().createBindings( this.renderer._bindings, this.context ) );
439
496
 
440
497
  }
441
498
 
@@ -499,6 +556,12 @@ class RenderObject {
499
556
  */
500
557
  getChainArray() {
501
558
 
559
+ if ( this._sourceMaterial !== null ) {
560
+
561
+ return [ this.object, this.material, this.context, this.lightsNode, this._sourceMaterial ];
562
+
563
+ }
564
+
502
565
  return [ this.object, this.material, this.context, this.lightsNode ];
503
566
 
504
567
  }
@@ -511,10 +574,19 @@ class RenderObject {
511
574
  */
512
575
  setGeometry( geometry ) {
513
576
 
577
+ // exchanging the geometry means we must move the dipose handler to the new geometry
578
+
579
+ this.geometry.removeEventListener( 'dispose', this.onGeometryDispose );
580
+
514
581
  this.geometry = geometry;
582
+
583
+ this.geometry.addEventListener( 'dispose', this.onGeometryDispose );
584
+
515
585
  this.attributes = null;
516
586
  this.attributesId = null;
517
587
 
588
+ this.geometryVersion ++;
589
+
518
590
  }
519
591
 
520
592
  /**
@@ -542,7 +614,7 @@ class RenderObject {
542
614
  if ( nodeAttribute.node && nodeAttribute.node.attribute ) {
543
615
 
544
616
  // node attribute
545
- attribute = nodeAttribute.node.attribute;
617
+ attribute = nodeAttribute.node.getObjectAttribute( this.object );
546
618
 
547
619
  } else {
548
620
 
@@ -696,8 +768,6 @@ class RenderObject {
696
768
 
697
769
  cacheKey += name + ',';
698
770
 
699
- if ( attribute.data ) cacheKey += attribute.data.stride + ',';
700
- if ( attribute.offset ) cacheKey += attribute.offset + ',';
701
771
  if ( attribute.itemSize ) cacheKey += attribute.itemSize + ',';
702
772
  if ( attribute.normalized ) cacheKey += 'n,';
703
773
 
@@ -723,12 +793,6 @@ class RenderObject {
723
793
 
724
794
  }
725
795
 
726
- if ( geometry.index ) {
727
-
728
- cacheKey += 'index,';
729
-
730
- }
731
-
732
796
  return cacheKey;
733
797
 
734
798
  }
@@ -742,13 +806,13 @@ class RenderObject {
742
806
  */
743
807
  getMaterialCacheKey() {
744
808
 
745
- const { object, material, renderer } = this;
809
+ const { object, material, renderer, scene } = this;
746
810
 
747
- let cacheKey = material.customProgramCacheKey();
811
+ let cacheKey = this._nodes.getCustomProgramCacheKey( material, scene );
748
812
 
749
813
  for ( const property of getKeys( material ) ) {
750
814
 
751
- if ( /^(is[A-Z]|_)|^(visible|version|uuid|name|opacity|userData)$/.test( property ) ) continue;
815
+ if ( /^(is[A-Z]|_)|^(visible|version|uuid|name|opacity|userData|iridescenceThicknessRange)$/.test( property ) ) continue;
752
816
 
753
817
  const value = material[ property ];
754
818
 
@@ -762,10 +826,9 @@ class RenderObject {
762
826
 
763
827
  if ( type === 'number' ) {
764
828
 
765
- if ( property === 'side' ) {
829
+ if ( _enumProperties.includes( property ) ) {
766
830
 
767
- // `side` is an enum (FrontSide/BackSide/DoubleSide) that changes code
768
- // generation, so its exact value must be preserved.
831
+ // retain enums since their exact value matters
769
832
 
770
833
  valueKey = String( value );
771
834
 
@@ -784,6 +847,7 @@ class RenderObject {
784
847
  if ( value.isTexture ) {
785
848
 
786
849
  valueKey += value.mapping;
850
+ valueKey += value.channel;
787
851
 
788
852
  // WebGPU must honor the sampler data because they are part of the bindings
789
853
 
@@ -843,7 +907,13 @@ class RenderObject {
843
907
 
844
908
  }
845
909
 
846
- if ( object.isInstancedMesh || object.count > 1 ) {
910
+ if ( object.isInstancedMesh ) {
911
+
912
+ const { instanceMatrix, instanceColor, morphTexture } = object;
913
+
914
+ cacheKey += getInstanceDataKey( instanceMatrix ) + getInstanceDataKey( instanceColor ) + ( morphTexture !== null ? 'm' : '' ) + ',';
915
+
916
+ } else if ( object.count > 1 ) {
847
917
 
848
918
  // TODO: https://github.com/mrdoob/three.js/pull/29066#issuecomment-2269400850
849
919
 
@@ -851,7 +921,7 @@ class RenderObject {
851
921
 
852
922
  }
853
923
 
854
- cacheKey += this.context.id + ',';
924
+ cacheKey += this.context.stateKey + ',';
855
925
 
856
926
  cacheKey += object.receiveShadow + ',';
857
927
 
@@ -889,6 +959,18 @@ class RenderObject {
889
959
 
890
960
  }
891
961
 
962
+ for ( const { node } of this.getNodeBuilderState().nodeAttributes ) {
963
+
964
+ if ( node && node.attribute ) {
965
+
966
+ const attribute = node.getObjectAttribute( this.object );
967
+
968
+ if ( attribute && this.attributes.includes( attribute ) === false ) return true;
969
+
970
+ }
971
+
972
+ }
973
+
892
974
  }
893
975
 
894
976
  return false;
@@ -925,32 +1007,24 @@ class RenderObject {
925
1007
  */
926
1008
  getDynamicCacheKey() {
927
1009
 
928
- let cacheKey = 0;
1010
+ let environmentKey = 0;
929
1011
 
930
1012
  // `Nodes.getCacheKey()` returns an environment cache key which is not relevant when
931
1013
  // the renderer is inside a shadow pass.
932
1014
 
933
1015
  if ( this.material.isShadowPassMaterial !== true ) {
934
1016
 
935
- cacheKey = this._nodes.getCacheKey( this.scene, this.lightsNode );
936
-
937
- }
938
-
939
- if ( this.camera.isArrayCamera ) {
940
-
941
- cacheKey = hash( cacheKey, this.camera.cameras.length );
1017
+ environmentKey = this._nodes.getCacheKey( this.scene, this.lightsNode );
942
1018
 
943
1019
  }
944
1020
 
945
- if ( this.object.receiveShadow ) {
1021
+ _cacheKeyValues[ 0 ] = environmentKey;
1022
+ _cacheKeyValues[ 1 ] = this.camera.isArrayCamera ? this.camera.cameras.length : 0;
1023
+ _cacheKeyValues[ 2 ] = this.object.receiveShadow ? 1 : 0;
1024
+ _cacheKeyValues[ 3 ] = this.renderer.contextNode.id;
1025
+ _cacheKeyValues[ 4 ] = this.renderer.contextNode.version;
946
1026
 
947
- cacheKey = hash( cacheKey, 1 );
948
-
949
- }
950
-
951
- cacheKey = hash( cacheKey, this.renderer.contextNode.id, this.renderer.contextNode.version );
952
-
953
- return cacheKey;
1027
+ return hashArray( _cacheKeyValues );
954
1028
 
955
1029
  }
956
1030
 
@@ -974,6 +1048,8 @@ class RenderObject {
974
1048
  this.material.removeEventListener( 'dispose', this.onMaterialDispose );
975
1049
  this.geometry.removeEventListener( 'dispose', this.onGeometryDispose );
976
1050
 
1051
+ this.lightsNode.removeEventListener( 'dispose', this.onLightsNodeDispose );
1052
+
977
1053
  if ( this._sourceMaterial !== null ) {
978
1054
 
979
1055
  this._sourceMaterial.removeEventListener( 'dispose', this.onMaterialDispose );
@@ -1,7 +1,8 @@
1
1
  import ChainMap from './ChainMap.js';
2
2
  import RenderObject from './RenderObject.js';
3
3
 
4
- const _chainKeys = [];
4
+ const _chainKeys = [ null, null, null, null ];
5
+ const _overrideChainKeys = [ null, null, null, null, null ];
5
6
 
6
7
  /**
7
8
  * This module manages the render objects of the renderer.
@@ -100,42 +101,59 @@ class RenderObjects {
100
101
 
101
102
  const chainMap = this.getChainMap( passId );
102
103
 
104
+ const sourceMaterial = this.renderer._currentSourceMaterial;
105
+ const sourceMaterialVersion = sourceMaterial !== null ? sourceMaterial.version : 0;
106
+
103
107
  // set chain keys
104
108
 
105
- _chainKeys[ 0 ] = object;
106
- _chainKeys[ 1 ] = material;
107
- _chainKeys[ 2 ] = renderContext;
108
- _chainKeys[ 3 ] = lightsNode;
109
+ const chainKeys = sourceMaterial !== null ? _overrideChainKeys : _chainKeys;
110
+
111
+ chainKeys[ 0 ] = object;
112
+ chainKeys[ 1 ] = material;
113
+ chainKeys[ 2 ] = renderContext;
114
+ chainKeys[ 3 ] = lightsNode;
115
+
116
+ if ( sourceMaterial !== null ) chainKeys[ 4 ] = sourceMaterial;
109
117
 
110
118
  //
111
119
 
112
- let renderObject = chainMap.get( _chainKeys );
120
+ let renderObject = chainMap.get( chainKeys );
113
121
 
114
122
  if ( renderObject === undefined ) {
115
123
 
116
124
  renderObject = this.createRenderObject( this.nodes, this.geometries, this.renderer, object, material, scene, camera, lightsNode, renderContext, clippingContext, passId );
117
125
 
118
- chainMap.set( _chainKeys, renderObject );
126
+ chainMap.set( chainKeys, renderObject );
119
127
 
120
128
  } else {
121
129
 
130
+ let force = false;
131
+
122
132
  // update references
123
133
 
124
134
  renderObject.camera = camera;
125
135
 
126
- //
136
+ // clipping and geometry updates
127
137
 
128
138
  renderObject.updateClipping( clippingContext );
129
139
 
130
140
  if ( renderObject.needsGeometryUpdate ) {
131
141
 
132
- this.geometries.removeUser( renderObject, renderObject.geometry );
133
142
  renderObject.setGeometry( object.geometry );
134
- this.geometries.addUser( renderObject, object.geometry );
143
+
144
+ // structural change, force into rebuild
145
+
146
+ if ( renderObject.initialGeometryCacheKey !== renderObject.getGeometryCacheKey() ) {
147
+
148
+ force = true;
149
+
150
+ }
135
151
 
136
152
  }
137
153
 
138
- if ( renderObject.version !== material.version || renderObject.needsUpdate ) {
154
+ // check if a new render object (rebuild) is required
155
+
156
+ if ( renderObject.version !== material.version || renderObject.sourceMaterialVersion !== sourceMaterialVersion || renderObject.needsUpdate || force ) {
139
157
 
140
158
  if ( renderObject.initialCacheKey !== renderObject.getCacheKey() ) {
141
159
 
@@ -146,6 +164,7 @@ class RenderObjects {
146
164
  } else {
147
165
 
148
166
  renderObject.version = material.version;
167
+ renderObject.sourceMaterialVersion = sourceMaterialVersion;
149
168
 
150
169
  }
151
170
 
@@ -155,10 +174,12 @@ class RenderObjects {
155
174
 
156
175
  // reset chain array
157
176
 
158
- _chainKeys[ 0 ] = null;
159
- _chainKeys[ 1 ] = null;
160
- _chainKeys[ 2 ] = null;
161
- _chainKeys[ 3 ] = null;
177
+ chainKeys[ 0 ] = null;
178
+ chainKeys[ 1 ] = null;
179
+ chainKeys[ 2 ] = null;
180
+ chainKeys[ 3 ] = null;
181
+
182
+ if ( sourceMaterial !== null ) chainKeys[ 4 ] = null;
162
183
 
163
184
  //
164
185
 
@@ -219,6 +240,7 @@ class RenderObjects {
219
240
 
220
241
  renderObject.onDispose = () => {
221
242
 
243
+ this.geometries.deleteVertexState( renderObject );
222
244
  this.pipelines.delete( renderObject );
223
245
  this.bindings.deleteForRender( renderObject );
224
246
  this.nodes.delete( renderObject );
@@ -227,14 +249,10 @@ class RenderObjects {
227
249
 
228
250
  this._renderObjects.delete( renderObject );
229
251
 
230
- this.geometries.removeUser( renderObject, renderObject.geometry );
231
-
232
252
  };
233
253
 
234
254
  this._renderObjects.add( renderObject );
235
255
 
236
- this.geometries.addUser( renderObject, renderObject.geometry );
237
-
238
256
  return renderObject;
239
257
 
240
258
  }