@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
@@ -9,6 +9,7 @@ import { Settings } from './tabs/Settings.js';
9
9
  import { Viewer } from './tabs/Viewer.js';
10
10
  import { Timeline } from './tabs/Timeline.js';
11
11
  import { setText } from './ui/utils.js';
12
+ import { getItem, setItem } from './Storage.js';
12
13
 
13
14
  import { setConsoleFunction, getConsoleFunction, REVISION } from 'three/webgpu';
14
15
 
@@ -467,9 +468,9 @@ class Inspector extends RendererInspector {
467
468
 
468
469
  data.cpu = this.getAverageDeltaTime( data, 'cpu' );
469
470
  data.gpu = this.getAverageDeltaTime( data, 'gpu' );
470
- data.total = data.cpu + data.gpu;
471
471
 
472
- // children
472
+ // children: the CPU time of a render or compute call includes the calls nested in it, the GPU time of each
473
+ // pass is measured separately
473
474
 
474
475
  for ( const child of stats.children ) {
475
476
 
@@ -477,12 +478,12 @@ class Inspector extends RendererInspector {
477
478
 
478
479
  const childData = this.getStatsData( child.cid );
479
480
 
480
- data.cpu += childData.cpu;
481
481
  data.gpu += childData.gpu;
482
- data.total += childData.total;
483
482
 
484
483
  }
485
484
 
485
+ data.total = data.cpu + data.gpu;
486
+
486
487
  }
487
488
 
488
489
  getNodes() {
@@ -566,9 +567,8 @@ class Inspector extends RendererInspector {
566
567
 
567
568
  }
568
569
 
569
- // improve stats using previous frame
570
+ // the time since the last frame which rendered, see RendererInspector.finish()
570
571
 
571
- frame.deltaTime = frame.startTime - previousFrame.startTime;
572
572
  frame.miscellaneous = frame.deltaTime - frame.total;
573
573
 
574
574
  if ( frame.miscellaneous < 0 ) {
@@ -641,44 +641,4 @@ class Inspector extends RendererInspector {
641
641
 
642
642
  }
643
643
 
644
- function getItem( id ) {
645
-
646
- const data = JSON.parse( localStorage.getItem( 'threejs-inspector' ) || '{}' );
647
-
648
- if ( data.version !== REVISION ||
649
- data.settings && ( data.settings.storage === 'url' && data.settings.url !== location.href ) ) {
650
-
651
- localStorage.removeItem( 'threejs-inspector' );
652
-
653
- return {};
654
-
655
- }
656
-
657
- return data[ id ] || {};
658
-
659
- }
660
-
661
- function setItem( id, state ) {
662
-
663
- const data = JSON.parse( localStorage.getItem( 'threejs-inspector' ) || '{}' );
664
-
665
- if ( state === null ) {
666
-
667
- delete data[ id ];
668
-
669
- } else {
670
-
671
- data[ id ] = state;
672
-
673
- }
674
-
675
- data.settings = data.settings || {};
676
- data.settings.url = data.settings.url || location.href;
677
- data.settings.storage = data.settings.storage || 'url';
678
- data.version = REVISION;
679
-
680
- localStorage.setItem( 'threejs-inspector', JSON.stringify( data ) );
681
-
682
- }
683
-
684
644
  export { Inspector, getItem, setItem };
@@ -69,6 +69,14 @@ class ComputeStats extends ObjectStats {
69
69
 
70
70
  }
71
71
 
72
+ // returns true if the frame of the animation loop rendered or computed
73
+
74
+ function isRenderedFrame( frame ) {
75
+
76
+ return frame.renders.length > 0 || frame.computes.length > 0;
77
+
78
+ }
79
+
72
80
  export class RendererInspector extends InspectorBase {
73
81
 
74
82
  constructor() {
@@ -87,11 +95,13 @@ export class RendererInspector extends InspectorBase {
87
95
  this.maxFrames = 512;
88
96
 
89
97
  this._lastFinishTime = 0;
98
+ this._lastRenderedFinishTime = 0;
90
99
  this._resolveTimestampPromise = null;
91
100
  this._rAFId = null;
92
101
 
93
102
  this.overdraw = false;
94
103
  this._overdrawMaterial = null;
104
+ this._renderingOverdraw = false;
95
105
 
96
106
  this.isRendererInspector = true;
97
107
 
@@ -123,7 +133,22 @@ export class RendererInspector extends InspectorBase {
123
133
 
124
134
  const frame = this.currentFrame;
125
135
  frame.finishTime = now;
126
- frame.deltaTime = now - ( this._lastFinishTime > 0 ? this._lastFinishTime : now );
136
+
137
+ // frames of the animation loop which didn't render or compute, like frames skipped by the application
138
+ // while the GPU is busy, are not frames of the application: the time is measured since the last frame
139
+ // which rendered
140
+
141
+ if ( isRenderedFrame( frame ) ) {
142
+
143
+ frame.deltaTime = now - ( this._lastRenderedFinishTime > 0 ? this._lastRenderedFinishTime : now );
144
+
145
+ this._lastRenderedFinishTime = now;
146
+
147
+ } else {
148
+
149
+ frame.deltaTime = now - ( this._lastFinishTime > 0 ? this._lastFinishTime : now );
150
+
151
+ }
127
152
 
128
153
  this.addFrame( frame );
129
154
 
@@ -139,12 +164,6 @@ export class RendererInspector extends InspectorBase {
139
164
 
140
165
  this._lastFinishTime = now;
141
166
 
142
- if ( this.overdraw === true ) {
143
-
144
- this._renderOverdraw();
145
-
146
- }
147
-
148
167
  }
149
168
 
150
169
  _renderOverdraw() {
@@ -179,14 +198,20 @@ export class RendererInspector extends InspectorBase {
179
198
 
180
199
  scene.overrideMaterial = this._overdrawMaterial;
181
200
 
201
+ this._renderingOverdraw = true;
202
+
182
203
  renderer.render( scene, camera );
183
204
 
205
+ this._renderingOverdraw = false;
206
+
184
207
  RendererUtils.restoreRendererAndSceneState( renderer, scene, state );
185
208
 
186
209
  }
187
210
 
188
211
  _getFPS() {
189
212
 
213
+ // only the frames which rendered or computed are counted, within the last second
214
+
190
215
  let frameSum = 0;
191
216
  let timeSum = 0;
192
217
 
@@ -194,6 +219,8 @@ export class RendererInspector extends InspectorBase {
194
219
 
195
220
  const frame = this.frames[ i ];
196
221
 
222
+ if ( isRenderedFrame( frame ) === false ) continue;
223
+
197
224
  frameSum ++;
198
225
  timeSum += frame.deltaTime;
199
226
 
@@ -201,7 +228,7 @@ export class RendererInspector extends InspectorBase {
201
228
 
202
229
  }
203
230
 
204
- return ( frameSum * 1000 ) / timeSum;
231
+ return timeSum > 0 ? ( frameSum * 1000 ) / timeSum : 0;
205
232
 
206
233
  }
207
234
 
@@ -562,6 +589,14 @@ export class RendererInspector extends InspectorBase {
562
589
  this.currentContext = currentRender.parent;
563
590
  this.currentRender = currentRender.parent && currentRender.parent.isRenderStats ? currentRender.parent : null;
564
591
 
592
+ // draw over each top-level render to the canvas, the frame finishes only at the start of the next one
593
+
594
+ if ( this.overdraw === true && this._renderingOverdraw === false && currentRender.parent === frame && this.getRenderer().getRenderTarget() === null ) {
595
+
596
+ this._renderOverdraw();
597
+
598
+ }
599
+
565
600
  }
566
601
 
567
602
  dispose() {
@@ -0,0 +1,49 @@
1
+ import { REVISION } from 'three/webgpu';
2
+
3
+ const STORAGE_KEY = 'threejs-inspector';
4
+
5
+ function getItem( id ) {
6
+
7
+ if ( typeof localStorage === 'undefined' ) return {};
8
+
9
+ const data = JSON.parse( localStorage.getItem( STORAGE_KEY ) || '{}' );
10
+
11
+ if ( data.version !== REVISION ||
12
+ data.settings && ( data.settings.storage === 'url' && data.settings.url !== location.href ) ) {
13
+
14
+ localStorage.removeItem( STORAGE_KEY );
15
+
16
+ return {};
17
+
18
+ }
19
+
20
+ return data[ id ] || {};
21
+
22
+ }
23
+
24
+ function setItem( id, state ) {
25
+
26
+ if ( typeof localStorage === 'undefined' ) return;
27
+
28
+ const data = JSON.parse( localStorage.getItem( STORAGE_KEY ) || '{}' );
29
+
30
+ if ( state === null ) {
31
+
32
+ delete data[ id ];
33
+
34
+ } else {
35
+
36
+ data[ id ] = state;
37
+
38
+ }
39
+
40
+ data.settings = data.settings || {};
41
+ data.settings.url = data.settings.url || location.href;
42
+ data.settings.storage = data.settings.storage || 'url';
43
+ data.version = REVISION;
44
+
45
+ localStorage.setItem( STORAGE_KEY, JSON.stringify( data ) );
46
+
47
+ }
48
+
49
+ export { getItem, setItem };
@@ -521,13 +521,6 @@ export class ColorGrading extends Extension {
521
521
  this.selectedToneMapping = comp.params.toneMapping;
522
522
  if ( this.sceneGradingEnabled ) {
523
523
 
524
- const renderer = this.inspector ? this.inspector.getRenderer() : null;
525
- if ( renderer ) {
526
-
527
- renderer.toneMappingExposure = comp.params.exposure;
528
-
529
- }
530
-
531
524
  this._applyLiveGrading();
532
525
 
533
526
  }
@@ -1616,7 +1609,7 @@ export class ColorGrading extends Extension {
1616
1609
 
1617
1610
  generate3DLUTData( size = this.lutSize, buffer = null ) {
1618
1611
 
1619
- if ( buffer === null ) {
1612
+ if ( buffer === null || buffer.length !== size * size * size * 4 ) {
1620
1613
 
1621
1614
  buffer = new Float32Array( size * size * size * 4 );
1622
1615
 
@@ -1656,9 +1649,10 @@ export class ColorGrading extends Extension {
1656
1649
 
1657
1650
  }
1658
1651
 
1659
- buffer[ idx ++ ] = _pixel[ 0 ];
1660
- buffer[ idx ++ ] = _pixel[ 1 ];
1661
- buffer[ idx ++ ] = _pixel[ 2 ];
1652
+ // Share the same output range with the 8-bit PNG export.
1653
+ buffer[ idx ++ ] = Math.max( 0, Math.min( 1, _pixel[ 0 ] ) );
1654
+ buffer[ idx ++ ] = Math.max( 0, Math.min( 1, _pixel[ 1 ] ) );
1655
+ buffer[ idx ++ ] = Math.max( 0, Math.min( 1, _pixel[ 2 ] ) );
1662
1656
  buffer[ idx ++ ] = 1.0;
1663
1657
 
1664
1658
  }
@@ -1785,6 +1779,7 @@ export class ColorGrading extends Extension {
1785
1779
  modulesData[ id ] = {
1786
1780
  type: modType,
1787
1781
  mode: mode,
1782
+ enabled: comp.enabled,
1788
1783
  params: JSON.parse( JSON.stringify( comp.params ) )
1789
1784
  };
1790
1785
 
@@ -1926,6 +1921,7 @@ export class ColorGrading extends Extension {
1926
1921
 
1927
1922
  if ( typeof json.lutSize === 'number' ) {
1928
1923
 
1924
+ this._lutSizeChanged = this._lutSizeChanged || this.lutSize !== json.lutSize;
1929
1925
  this.lutSize = json.lutSize;
1930
1926
  if ( this.lutSizeSelect ) {
1931
1927
 
@@ -1956,6 +1952,8 @@ export class ColorGrading extends Extension {
1956
1952
 
1957
1953
  if ( json.modules && typeof json.modules === 'object' ) {
1958
1954
 
1955
+ const pipelineOrder = [ ...this.pipelineOrder ];
1956
+
1959
1957
  this.modulesMap.forEach( ( comp, id ) => {
1960
1958
 
1961
1959
  if ( id !== 'renderer' && id !== 'output' && ! this.pipelineOrder.includes( id ) ) {
@@ -2008,8 +2006,14 @@ export class ColorGrading extends Extension {
2008
2006
 
2009
2007
  }
2010
2008
 
2009
+ const comp = this.modulesMap.get( id );
2010
+ if ( comp ) comp.enabled = mData.enabled !== false;
2011
+
2011
2012
  } );
2012
2013
 
2014
+ // Creating missing cards must not append duplicate or inactive steps.
2015
+ this.pipelineOrder = pipelineOrder;
2016
+
2013
2017
  } else if ( params ) {
2014
2018
 
2015
2019
  const isWBActive = ( params.temperature !== undefined && params.temperature !== 0 ) || ( params.tint !== undefined && params.tint !== 0 );
@@ -2297,8 +2301,6 @@ export class ColorGrading extends Extension {
2297
2301
 
2298
2302
  init( inspector ) {
2299
2303
 
2300
- super.init( inspector );
2301
-
2302
2304
  LUT3DStyle.init( inspector.nonce );
2303
2305
 
2304
2306
  const renderer = inspector.getRenderer();
@@ -2313,10 +2315,14 @@ export class ColorGrading extends Extension {
2313
2315
  rendererComp.defaultExposure = defaultExp;
2314
2316
  rendererComp.params.toneMapping = defaultTM;
2315
2317
  rendererComp.params.exposure = defaultExp;
2318
+ this.selectedToneMapping = defaultTM;
2316
2319
  rendererComp.updateUI();
2317
2320
 
2318
2321
  }
2319
2322
 
2323
+ // Restore saved settings after initializing the renderer defaults.
2324
+ super.init( inspector );
2325
+
2320
2326
  this.onOrientationChange();
2321
2327
  this.onLayoutChange();
2322
2328
 
@@ -2403,6 +2409,8 @@ export class ColorGrading extends Extension {
2403
2409
 
2404
2410
  _applyLiveGrading() {
2405
2411
 
2412
+ this._lutSizeChanged = this._lutSizeChanged || ( this.lutTexture !== null && this.lutTexture.image.width !== this.lutSize );
2413
+
2406
2414
  if ( ! this.lutTexture || this._lutSizeChanged || this._lutNeedsUpdate ) {
2407
2415
 
2408
2416
  const buffer = ( this.lutTexture && this.lutTexture.image && ! this._lutSizeChanged ) ? this.lutTexture.image.data : null;
@@ -2485,24 +2493,15 @@ export class ColorGrading extends Extension {
2485
2493
  this._originalPipelineSettings = {
2486
2494
  outputNode: renderPipeline.outputNode,
2487
2495
  outputColorTransform: renderPipeline.outputColorTransform,
2488
- rendererToneMapping: renderer.toneMapping
2496
+ rendererToneMapping: renderer.toneMapping,
2497
+ rendererExposure: renderer.toneMappingExposure
2489
2498
  };
2490
2499
 
2491
- if ( renderer.toneMapping !== undefined ) {
2492
-
2493
- this.selectedToneMapping = renderer.toneMapping;
2494
- const rendererComp = this.modulesMap.get( 'renderer' );
2495
- if ( rendererComp ) {
2496
-
2497
- rendererComp.fromJSON( { params: { toneMapping: this.selectedToneMapping } } );
2498
-
2499
- }
2500
-
2501
- }
2502
-
2503
2500
  }
2504
2501
 
2505
2502
  renderer.toneMapping = this.selectedToneMapping;
2503
+ const rendererComp = this.modulesMap.get( 'renderer' );
2504
+ if ( rendererComp ) renderer.toneMappingExposure = rendererComp.params.exposure;
2506
2505
  renderPipeline.outputColorTransform = false;
2507
2506
 
2508
2507
  let inputNode = this._originalPipelineSettings.outputNode;
@@ -2515,7 +2514,7 @@ export class ColorGrading extends Extension {
2515
2514
 
2516
2515
  if ( inputNode ) {
2517
2516
 
2518
- const outputPass = renderOutput( inputNode, this.selectedToneMapping );
2517
+ const outputPass = this._originalPipelineSettings.outputColorTransform ? renderOutput( inputNode, this.selectedToneMapping ) : inputNode;
2519
2518
  this.lutPassNode = lut3D( outputPass, texture3D( this.lutTexture ), this.lutSize, 1.0 );
2520
2519
 
2521
2520
  renderPipeline.outputNode = this.lutPassNode;
@@ -2546,6 +2545,12 @@ export class ColorGrading extends Extension {
2546
2545
 
2547
2546
  }
2548
2547
 
2548
+ if ( renderer && this._originalPipelineSettings.rendererExposure !== undefined ) {
2549
+
2550
+ renderer.toneMappingExposure = this._originalPipelineSettings.rendererExposure;
2551
+
2552
+ }
2553
+
2549
2554
  this._originalPipelineSettings = null;
2550
2555
 
2551
2556
  }
@@ -103,8 +103,12 @@ class ParametersGroup {
103
103
 
104
104
  _addParameter( object, property, editor, subItem ) {
105
105
 
106
+ subItem.data[ 0 ].title = property;
107
+
106
108
  editor.name = ( name ) => {
107
109
 
110
+ subItem.data[ 0 ].title = name;
111
+
108
112
  if ( subItem.data[ 0 ].childNodes.length > 0 && subItem.data[ 0 ].firstChild.nodeType === 3 /* Node.TEXT_NODE */ ) {
109
113
 
110
114
  subItem.data[ 0 ].firstChild.textContent = name;
@@ -410,7 +414,7 @@ class Parameters extends Tab {
410
414
 
411
415
  const paramList = new List( 'Property', 'Value' );
412
416
  paramList.domElement.classList.add( 'parameters' );
413
- paramList.setGridStyle( '.5fr 1fr' );
417
+ paramList.setGridStyle( 'minmax(0, .5fr) minmax(0, 1fr)' );
414
418
  paramList.domElement.style.minWidth = '300px';
415
419
 
416
420
  const scrollWrapper = document.createElement( 'div' );
@@ -80,7 +80,7 @@ class Performance extends Tab {
80
80
 
81
81
  }
82
82
 
83
- resolveStats( inspector, stats ) {
83
+ resolveStats( inspector, stats, budget = Infinity ) {
84
84
 
85
85
  const data = inspector.getStatsData( stats.cid );
86
86
 
@@ -139,10 +139,15 @@ class Performance extends Tab {
139
139
 
140
140
  }
141
141
 
142
+ // A row never shows more GPU time than its parent, see updateText()
143
+
144
+ const displayGpu = stats.gpuNotAvailable === true ? 0 : Math.min( data.gpu, budget );
145
+ const displayTotal = data.cpu + displayGpu;
146
+
142
147
  setText( item.data[ 0 ], name );
143
148
  setText( item.data[ 1 ], data.cpu.toFixed( 2 ) );
144
- setText( item.data[ 2 ], stats.gpuNotAvailable === true ? '-' : data.gpu.toFixed( 2 ) );
145
- setText( item.data[ 3 ], data.total.toFixed( 2 ) );
149
+ setText( item.data[ 2 ], stats.gpuNotAvailable === true ? '-' : displayGpu.toFixed( 2 ) );
150
+ setText( item.data[ 3 ], displayTotal.toFixed( 2 ) );
146
151
 
147
152
  //
148
153
 
@@ -150,9 +155,11 @@ class Performance extends Tab {
150
155
 
151
156
  this.currentItem = item;
152
157
 
158
+ const childBudget = stats.gpuNotAvailable === true ? budget : displayGpu;
159
+
153
160
  for ( const child of stats.children ) {
154
161
 
155
- this.resolveStats( inspector, child );
162
+ this.resolveStats( inspector, child, childBudget );
156
163
 
157
164
  }
158
165
 
@@ -226,11 +233,19 @@ class Performance extends Tab {
226
233
  const oldFrameItems = new Map( this.frameItems );
227
234
 
228
235
  this.frameItems.clear();
236
+
237
+ // GPU timestamps can sum to more than the frame time when the GPU overlaps passes, so cap the display at
238
+ // the frame time, and cap each row at its parent's value
239
+
240
+ const hasTimestamp = inspector.getRenderer().backend.hasTimestamp;
241
+ const gpuBudget = hasTimestamp ? Math.min( frame.gpu, frame.deltaTime ) : 0;
242
+ const totalDisplay = frame.cpu + gpuBudget;
243
+
229
244
  this.currentItem = this.frameStats;
230
245
 
231
246
  for ( const child of frame.children ) {
232
247
 
233
- this.resolveStats( inspector, child );
248
+ this.resolveStats( inspector, child, gpuBudget );
234
249
 
235
250
  }
236
251
 
@@ -263,8 +278,8 @@ class Performance extends Tab {
263
278
  //
264
279
 
265
280
  setText( this.frameStats.data[ 1 ], frame.cpu.toFixed( 2 ) );
266
- setText( this.frameStats.data[ 2 ], inspector.getRenderer().backend.hasTimestamp ? frame.gpu.toFixed( 2 ) : '-' );
267
- setText( this.frameStats.data[ 3 ], frame.total.toFixed( 2 ) );
281
+ setText( this.frameStats.data[ 2 ], hasTimestamp ? gpuBudget.toFixed( 2 ) : '-' );
282
+ setText( this.frameStats.data[ 3 ], totalDisplay.toFixed( 2 ) );
268
283
 
269
284
  //
270
285
 
@@ -1,6 +1,6 @@
1
1
  import { Parameters } from './Parameters.js';
2
2
  import { WebGPURenderer, WebGLBackend, Node } from 'three/webgpu';
3
- import { getItem, setItem } from '../Inspector.js';
3
+ import { getItem, setItem } from '../Storage.js';
4
4
 
5
5
  const _extensions = [
6
6
  {
@@ -1,6 +1,6 @@
1
1
  import { Tab } from '../ui/Tab.js';
2
2
  import { Graph } from '../ui/Graph.js';
3
- import { getItem, setItem } from '../Inspector.js';
3
+ import { getItem, setItem } from '../Storage.js';
4
4
  import { info } from '../ui/utils.js';
5
5
  import {
6
6
  ByteType,
@@ -618,6 +618,8 @@ class Timeline extends Tab {
618
618
 
619
619
  if ( this.currentFrame ) {
620
620
 
621
+ this.resolveIndirectTriangles( this.currentFrame );
622
+
621
623
  this.currentFrame.fps = this.renderer.inspector ? this.renderer.inspector.fps : 0;
622
624
 
623
625
  if ( ! isFinite( this.currentFrame.fps ) ) {
@@ -657,7 +659,7 @@ class Timeline extends Tab {
657
659
 
658
660
  }
659
661
 
660
- this.currentFrame = { id: frameNumber, calls: [], fps: 0, triangles: 0 };
662
+ this.currentFrame = { id: frameNumber, calls: [], fps: 0, triangles: 0, indirectDraws: [] };
661
663
  this.frames.push( this.currentFrame );
662
664
 
663
665
  if ( this.frames.length > LIMIT ) {
@@ -681,6 +683,16 @@ class Timeline extends Tab {
681
683
 
682
684
  this.currentFrame.triangles += details.triangles;
683
685
 
686
+ } else if ( details.indirect === true ) {
687
+
688
+ const renderObject = args[ 0 ];
689
+
690
+ this.currentFrame.indirectDraws.push( {
691
+ details,
692
+ attribute: renderObject.getIndirect(),
693
+ offset: renderObject.getIndirectOffset()
694
+ } );
695
+
684
696
  }
685
697
 
686
698
  }
@@ -713,6 +725,8 @@ class Timeline extends Tab {
713
725
 
714
726
  if ( this.currentFrame ) {
715
727
 
728
+ this.resolveIndirectTriangles( this.currentFrame );
729
+
716
730
  this.currentFrame.fps = this.renderer.inspector ? this.renderer.inspector.fps : 0;
717
731
 
718
732
  }
@@ -721,6 +735,58 @@ class Timeline extends Tab {
721
735
 
722
736
  }
723
737
 
738
+ resolveIndirectTriangles( frame ) {
739
+
740
+ const draws = frame.indirectDraws;
741
+
742
+ if ( ! draws || draws.length === 0 ) return;
743
+
744
+ frame.indirectDraws = null;
745
+
746
+ // the draw arguments live on the GPU: [ vertexCount | indexCount, instanceCount, ... ]. the buffer is read
747
+ // once per frame, after the frame was submitted and before the next one changes it
748
+
749
+ const readbacks = new Map();
750
+
751
+ for ( const draw of draws ) {
752
+
753
+ if ( readbacks.has( draw.attribute ) === false ) {
754
+
755
+ readbacks.set( draw.attribute, this.renderer.getArrayBufferAsync( draw.attribute ) );
756
+
757
+ }
758
+
759
+ }
760
+
761
+ Promise.all( draws.map( ( draw ) => readbacks.get( draw.attribute ) ) ).then( ( buffers ) => {
762
+
763
+ for ( let i = 0; i < draws.length; i ++ ) {
764
+
765
+ const draw = draws[ i ];
766
+ const data = new Uint32Array( buffers[ i ] );
767
+ const offsets = Array.isArray( draw.offset ) ? draw.offset : [ draw.offset ];
768
+
769
+ let triangles = 0;
770
+
771
+ for ( const offset of offsets ) {
772
+
773
+ const index = offset / 4;
774
+
775
+ triangles += Math.floor( data[ index ] / 3 ) * data[ index + 1 ];
776
+
777
+ }
778
+
779
+ draw.details.triangles = triangles;
780
+ frame.triangles += triangles;
781
+
782
+ }
783
+
784
+ if ( this.isRecording === false && this.frames.includes( frame ) ) this.renderSlider();
785
+
786
+ } );
787
+
788
+ }
789
+
724
790
  clear() {
725
791
 
726
792
  this.frames = [];
@@ -871,14 +937,24 @@ class Timeline extends Tab {
871
937
 
872
938
  if ( renderObject.object.isMesh || renderObject.object.isSprite ) {
873
939
 
874
- details.triangles = drawParams.vertexCount / 3;
940
+ // the WebGL backend doesn't support indirect draws, it draws with the parameters of the geometry
941
+
942
+ if ( this.renderer.backend.isWebGPUBackend === true && renderObject.getIndirect() !== null ) {
875
943
 
876
- if ( renderObject.object.count > 1 ) {
944
+ details.indirect = true;
877
945
 
878
- details.instance = renderObject.object.count;
946
+ } else {
879
947
 
880
- details[ 'triangles per instance' ] = details.triangles;
881
- details.triangles *= details.instance;
948
+ details.triangles = drawParams.vertexCount / 3;
949
+
950
+ if ( renderObject.object.count > 1 ) {
951
+
952
+ details.instance = renderObject.object.count;
953
+
954
+ details[ 'triangles per instance' ] = details.triangles;
955
+ details.triangles *= details.instance;
956
+
957
+ }
882
958
 
883
959
  }
884
960