@gnsx/three 0.185.16 → 0.186.1

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 (417) hide show
  1. package/build/three.cjs +10 -82600
  2. package/build/three.core.js +1303 -728
  3. package/build/three.module.js +439 -338
  4. package/build/three.tsl.js +74 -44
  5. package/build/three.webgpu.js +6036 -2184
  6. package/build/three.webgpu.nodes.js +6020 -2184
  7. package/examples/jsm/Addons.js +6 -6
  8. package/examples/jsm/controls/ArcballControls.js +1 -1
  9. package/examples/jsm/controls/FirstPersonControls.js +44 -20
  10. package/examples/jsm/controls/OrbitControls.js +9 -0
  11. package/examples/jsm/controls/TrackballControls.js +109 -4
  12. package/examples/jsm/csm/CSMShadowNode.js +13 -0
  13. package/examples/jsm/exporters/GLTFExporter.js +23 -7
  14. package/examples/jsm/exporters/USDZExporter.js +2 -2
  15. package/examples/jsm/generators/CityGenerator.js +377 -45
  16. package/examples/jsm/generators/ForestGenerator.js +12 -12
  17. package/examples/jsm/generators/TerrainGenerator.js +49 -37
  18. package/examples/jsm/generators/TreeGenerator.js +70 -76
  19. package/examples/jsm/generators/city/BenchGenerator.js +127 -0
  20. package/examples/jsm/generators/city/CarGenerator.js +479 -0
  21. package/examples/jsm/generators/city/CityGeneratorUtils.js +31 -0
  22. package/examples/jsm/generators/city/HydrantGenerator.js +106 -0
  23. package/examples/jsm/generators/city/InstancedMeshGenerator.js +86 -0
  24. package/examples/jsm/generators/city/PersonGenerator.js +447 -0
  25. package/examples/jsm/generators/city/SidewalkGenerator.js +33 -38
  26. package/examples/jsm/generators/city/SkyscraperGenerator.js +448 -48
  27. package/examples/jsm/generators/city/StreetTreeGenerator.js +231 -0
  28. package/examples/jsm/generators/city/StreetlightGenerator.js +100 -0
  29. package/examples/jsm/generators/city/TrafficlightGenerator.js +106 -0
  30. package/examples/jsm/generators/city/TrashcanGenerator.js +100 -0
  31. package/examples/jsm/geometries/BoxLineGeometry.js +1 -1
  32. package/examples/jsm/geometries/ParametricGeometry.js +1 -1
  33. package/examples/jsm/geometries/RoundedBoxGeometry.js +1 -1
  34. package/examples/jsm/gpgpu/CountingSort.js +271 -0
  35. package/examples/jsm/helpers/LightProbeGridHelper.js +60 -239
  36. package/examples/jsm/helpers/LightProbeGridHelperWebGL.js +221 -0
  37. package/examples/jsm/inspector/Extension.js +94 -0
  38. package/examples/jsm/inspector/Inspector.js +145 -41
  39. package/examples/jsm/inspector/RendererInspector.js +100 -52
  40. package/examples/jsm/inspector/extensions/color-grading/ColorGrading.js +2609 -0
  41. package/examples/jsm/inspector/extensions/color-grading/ColorWheel.js +352 -0
  42. package/examples/jsm/inspector/extensions/color-grading/CurveEditor.js +599 -0
  43. package/examples/jsm/inspector/extensions/color-grading/LUT3DStyle.js +1201 -0
  44. package/examples/jsm/inspector/extensions/color-grading/LUTMath.js +788 -0
  45. package/examples/jsm/inspector/extensions/color-grading/modules/BrightnessModule.js +72 -0
  46. package/examples/jsm/inspector/extensions/color-grading/modules/ColorWheelModule.js +112 -0
  47. package/examples/jsm/inspector/extensions/color-grading/modules/ContrastModule.js +82 -0
  48. package/examples/jsm/inspector/extensions/color-grading/modules/CurvesModule.js +109 -0
  49. package/examples/jsm/inspector/extensions/color-grading/modules/ExposureHueModule.js +110 -0
  50. package/examples/jsm/inspector/extensions/color-grading/modules/ExposureModule.js +73 -0
  51. package/examples/jsm/inspector/extensions/color-grading/modules/HueModule.js +78 -0
  52. package/examples/jsm/inspector/extensions/color-grading/modules/ImportedCubeModule.js +89 -0
  53. package/examples/jsm/inspector/extensions/color-grading/modules/Module.js +285 -0
  54. package/examples/jsm/inspector/extensions/color-grading/modules/OutputModule.js +101 -0
  55. package/examples/jsm/inspector/extensions/color-grading/modules/RendererModule.js +225 -0
  56. package/examples/jsm/inspector/extensions/color-grading/modules/SatVibranceModule.js +102 -0
  57. package/examples/jsm/inspector/extensions/color-grading/modules/SaturationModule.js +76 -0
  58. package/examples/jsm/inspector/extensions/color-grading/modules/VibranceModule.js +76 -0
  59. package/examples/jsm/inspector/extensions/color-grading/modules/WhiteBalanceModule.js +86 -0
  60. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +26 -31
  61. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +1 -0
  62. package/examples/jsm/inspector/tabs/Memory.js +0 -2
  63. package/examples/jsm/inspector/tabs/Settings.js +4 -0
  64. package/examples/jsm/inspector/tabs/Timeline.js +223 -171
  65. package/examples/jsm/inspector/tabs/Viewer.js +515 -21
  66. package/examples/jsm/inspector/ui/List.js +15 -9
  67. package/examples/jsm/inspector/ui/Profiler.js +170 -14
  68. package/examples/jsm/inspector/ui/Style.js +269 -23
  69. package/examples/jsm/inspector/ui/Tab.js +2 -0
  70. package/examples/jsm/inspector/ui/Values.js +14 -2
  71. package/examples/jsm/interactive/HTMLMesh.js +19 -3
  72. package/examples/jsm/lighting/LightProbeGrid.js +484 -889
  73. package/examples/jsm/lighting/LightProbeGridUtils.js +107 -0
  74. package/examples/jsm/lighting/LightProbeGridWebGL.js +841 -0
  75. package/examples/jsm/lighting/vxgi/VXGIConeTracer.js +194 -0
  76. package/examples/jsm/lighting/vxgi/VXGINode.js +660 -0
  77. package/examples/jsm/lighting/vxgi/VXGISceneCollector.js +478 -0
  78. package/examples/jsm/lighting/vxgi/VXGIVolume.js +1430 -0
  79. package/examples/jsm/lights/SunLight.js +95 -0
  80. package/examples/jsm/lights/SunLightNode.js +56 -0
  81. package/examples/jsm/lights/SunLightShadow.js +319 -0
  82. package/examples/jsm/lights/SunShadowNode.js +312 -0
  83. package/examples/jsm/loaders/3DMLoader.js +150 -49
  84. package/examples/jsm/loaders/3MFLoader.js +202 -1
  85. package/examples/jsm/loaders/FBXLoader.js +81 -5
  86. package/examples/jsm/loaders/GLTFGaussianSplatLoaderExtension.js +330 -0
  87. package/examples/jsm/loaders/GLTFLoader.js +79 -14
  88. package/examples/jsm/loaders/GaussianSplatPLYLoader.js +386 -0
  89. package/examples/jsm/loaders/KSPLATLoader.js +463 -0
  90. package/examples/jsm/loaders/MaterialXLoader.js +111 -1010
  91. package/examples/jsm/loaders/PCDLoader.js +1 -1
  92. package/examples/jsm/loaders/SPLATLoader.js +139 -0
  93. package/examples/jsm/loaders/SPZLoader.js +561 -0
  94. package/examples/jsm/loaders/materialx/MaterialXArchive.js +108 -0
  95. package/examples/jsm/loaders/materialx/MaterialXDocument.js +878 -0
  96. package/examples/jsm/loaders/materialx/MaterialXHextile.js +183 -0
  97. package/examples/jsm/loaders/materialx/MaterialXInterfaceValidation.js +376 -0
  98. package/examples/jsm/loaders/materialx/MaterialXLog.js +75 -0
  99. package/examples/jsm/loaders/materialx/MaterialXNodeInterfaceRegistry.js +4 -0
  100. package/examples/jsm/loaders/materialx/MaterialXNodeLibrary.js +1021 -0
  101. package/examples/jsm/loaders/materialx/MaterialXSurfaceMappings.js +661 -0
  102. package/examples/jsm/loaders/materialx/MaterialXUtils.js +57 -0
  103. package/examples/jsm/loaders/materialx/compile/MaterialXCompileRegistry.js +997 -0
  104. package/examples/jsm/loaders/materialx/parse/MaterialXParser.js +28 -0
  105. package/examples/jsm/loaders/usd/USDAParser.js +15 -2
  106. package/examples/jsm/loaders/usd/USDCParser.js +1 -4
  107. package/examples/jsm/loaders/usd/USDComposer.js +80 -42
  108. package/examples/jsm/materials/WoodNodeMaterial.js +6 -108
  109. package/examples/jsm/misc/RollerCoaster.js +2 -2
  110. package/examples/jsm/misc/SculptGL.LICENSE.txt +21 -0
  111. package/examples/jsm/misc/Sculptor.js +1679 -0
  112. package/examples/jsm/misc/SculptorMesh.js +1504 -0
  113. package/examples/jsm/misc/SculptorTools.js +1180 -0
  114. package/examples/jsm/misc/SculptorUtils.js +345 -0
  115. package/examples/jsm/misc/TubePainter.js +28 -16
  116. package/examples/jsm/misc/VolumeSlice.js +24 -24
  117. package/examples/jsm/modifiers/SimplifyModifier.js +63 -556
  118. package/examples/jsm/objects/GaussianSplat.js +1039 -0
  119. package/examples/jsm/objects/Sky.js +66 -45
  120. package/examples/jsm/objects/SkyMesh.js +70 -51
  121. package/examples/jsm/physics/JoltPhysics.js +1 -1
  122. package/examples/jsm/postprocessing/AfterimagePass.js +4 -2
  123. package/examples/jsm/postprocessing/BloomPass.js +2 -2
  124. package/examples/jsm/postprocessing/GTAOPass.js +1 -1
  125. package/examples/jsm/postprocessing/OutlinePass.js +5 -5
  126. package/examples/jsm/postprocessing/SAOPass.js +1 -1
  127. package/examples/jsm/postprocessing/SSAOPass.js +1 -1
  128. package/examples/jsm/postprocessing/SSRPass.js +4 -2
  129. package/examples/jsm/postprocessing/SavePass.js +1 -1
  130. package/examples/jsm/postprocessing/TAARenderPass.js +1 -1
  131. package/examples/jsm/postprocessing/UnrealBloomPass.js +30 -13
  132. package/examples/jsm/renderers/CSS2DRenderer.js +29 -5
  133. package/examples/jsm/shaders/DepthLimitedBlurShader.js +4 -1
  134. package/examples/jsm/shaders/ExposureShader.js +1 -1
  135. package/examples/jsm/shaders/FilmShader.js +2 -1
  136. package/examples/jsm/transpiler/AST.js +21 -2
  137. package/examples/jsm/transpiler/GLSLDecoder.js +498 -8
  138. package/examples/jsm/transpiler/TSLEncoder.js +82 -10
  139. package/examples/jsm/transpiler/WGSLEncoder.js +33 -4
  140. package/examples/jsm/tsl/WebGLNodesHandler.js +29 -39
  141. package/examples/jsm/tsl/display/AfterImageNode.js +2 -0
  142. package/examples/jsm/tsl/display/AnaglyphPassNode.js +3 -2
  143. package/examples/jsm/tsl/display/BilateralBlurNode.js +5 -2
  144. package/examples/jsm/tsl/display/BloomNode.js +55 -30
  145. package/examples/jsm/tsl/display/DenoiseNode.js +21 -1
  146. package/examples/jsm/tsl/display/DepthOfFieldNode.js +24 -6
  147. package/examples/jsm/tsl/display/DotScreenNode.js +11 -11
  148. package/examples/jsm/tsl/display/FSR1Node.js +8 -4
  149. package/examples/jsm/tsl/display/GTAONode.js +199 -86
  150. package/examples/jsm/tsl/display/GaussianBlurNode.js +65 -52
  151. package/examples/jsm/tsl/display/GodraysNode.js +5 -2
  152. package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +2 -2
  153. package/examples/jsm/tsl/display/LensflareNode.js +5 -2
  154. package/examples/jsm/tsl/display/OITPassNode.js +352 -0
  155. package/examples/jsm/tsl/display/OutlineNode.js +2 -0
  156. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +3 -2
  157. package/examples/jsm/tsl/display/RGBShiftNode.js +9 -9
  158. package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +7 -4
  159. package/examples/jsm/tsl/display/RetroPassNode.js +1 -1
  160. package/examples/jsm/tsl/display/SMAANode.js +22 -61
  161. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -4
  162. package/examples/jsm/tsl/display/SSAONode.js +436 -0
  163. package/examples/jsm/tsl/display/SSGINode.js +5 -2
  164. package/examples/jsm/tsl/display/SSRNode.js +7 -2
  165. package/examples/jsm/tsl/display/SSSNode.js +5 -2
  166. package/examples/jsm/tsl/display/SharpenNode.js +5 -4
  167. package/examples/jsm/tsl/display/StereoCompositePassNode.js +1 -3
  168. package/examples/jsm/tsl/display/StereoPassNode.js +1 -3
  169. package/examples/jsm/tsl/display/TAAUNode.js +22 -125
  170. package/examples/jsm/tsl/display/TRAANode.js +16 -142
  171. package/examples/jsm/tsl/display/TemporalReprojectNode.js +21 -15
  172. package/examples/jsm/tsl/display/depthAwareBlur.js +63 -0
  173. package/examples/jsm/tsl/display/hashBlur.js +3 -2
  174. package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +38 -27
  175. package/examples/jsm/tsl/lighting/LightProbeGridNode.js +136 -0
  176. package/examples/jsm/tsl/math/voronoiNoise.js +112 -0
  177. package/examples/jsm/tsl/shadows/TileShadowNode.js +4 -6
  178. package/examples/jsm/tsl/utils/Raymarching.js +5 -5
  179. package/examples/jsm/tsl/utils/SoftParticles.js +60 -0
  180. package/examples/jsm/tsl/utils/TAAUtils.js +195 -0
  181. package/examples/jsm/utils/BufferGeometryUtils.js +14 -14
  182. package/examples/jsm/utils/GaussianSplatUtils.js +229 -0
  183. package/examples/jsm/utils/WebGLTextureUtils.js +1 -1
  184. package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
  185. package/examples/jsm/webxr/WebGLXRFallback.js +2 -16
  186. package/examples/jsm/webxr/XRControllerModelFactory.js +16 -4
  187. package/package.json +9 -16
  188. package/src/Three.Core.js +2 -1
  189. package/src/Three.TSL.js +73 -43
  190. package/src/Three.WebGPU.Nodes.js +1 -0
  191. package/src/Three.WebGPU.js +1 -0
  192. package/src/animation/AnimationClip.js +15 -2
  193. package/src/animation/AnimationObjectGroup.js +18 -6
  194. package/src/animation/AnimationUtils.js +26 -0
  195. package/src/animation/KeyframeTrack.js +37 -0
  196. package/src/constants.js +23 -1
  197. package/src/core/BufferAttribute.js +3 -2
  198. package/src/core/BufferGeometry.js +1 -1
  199. package/src/core/InterleavedBuffer.js +5 -1
  200. package/src/core/Object3D.js +40 -12
  201. package/src/core/Raycaster.js +4 -0
  202. package/src/core/RenderTarget.js +99 -9
  203. package/src/core/RenderTarget3D.js +12 -8
  204. package/src/extras/Controls.js +0 -8
  205. package/src/extras/PMREMGenerator.js +99 -205
  206. package/src/geometries/TorusGeometry.js +1 -1
  207. package/src/helpers/ArrowHelper.js +2 -0
  208. package/src/helpers/AxesHelper.js +2 -0
  209. package/src/helpers/Box3Helper.js +2 -0
  210. package/src/helpers/BoxHelper.js +2 -0
  211. package/src/helpers/CameraHelper.js +2 -0
  212. package/src/helpers/DirectionalLightHelper.js +2 -0
  213. package/src/helpers/GridHelper.js +2 -0
  214. package/src/helpers/HemisphereLightHelper.js +2 -0
  215. package/src/helpers/PlaneHelper.js +2 -0
  216. package/src/helpers/PointLightHelper.js +2 -0
  217. package/src/helpers/PolarGridHelper.js +2 -0
  218. package/src/helpers/SkeletonHelper.js +2 -0
  219. package/src/helpers/SpotLightHelper.js +2 -0
  220. package/src/lights/Light.js +0 -10
  221. package/src/lights/LightShadow.js +43 -12
  222. package/src/lights/SpotLightShadow.js +18 -0
  223. package/src/loaders/BufferGeometryLoader.js +5 -0
  224. package/src/loaders/ImageBitmapLoader.js +3 -1
  225. package/src/loaders/ObjectLoader.js +8 -5
  226. package/src/materials/Material.js +80 -57
  227. package/src/materials/MeshPhysicalMaterial.js +32 -0
  228. package/src/materials/nodes/Line2NodeMaterial.js +17 -8
  229. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +42 -5
  230. package/src/materials/nodes/NodeMaterial.js +19 -13
  231. package/src/materials/nodes/PointsNodeMaterial.js +2 -1
  232. package/src/materials/nodes/manager/NodeMaterialObserver.js +282 -55
  233. package/src/math/Frustum.js +9 -0
  234. package/src/math/FrustumArray.js +1 -1
  235. package/src/math/MathUtils.js +5 -3
  236. package/src/math/Matrix4.js +2 -9
  237. package/src/math/Plane.js +30 -1
  238. package/src/math/Quaternion.js +0 -10
  239. package/src/math/Ray.js +95 -45
  240. package/src/math/Triangle.js +0 -2
  241. package/src/math/Vector3.js +2 -2
  242. package/src/math/Vector4.js +0 -4
  243. package/src/math/interpolants/BezierInterpolant.js +36 -23
  244. package/src/nodes/Nodes.js +2 -0
  245. package/src/nodes/TSL.js +11 -3
  246. package/src/nodes/accessors/Batch.js +85 -13
  247. package/src/nodes/accessors/BufferAttributeNode.js +1 -1
  248. package/src/nodes/accessors/BuiltinNode.js +1 -1
  249. package/src/nodes/accessors/Instance.js +19 -18
  250. package/src/nodes/accessors/MaterialNode.js +9 -0
  251. package/src/nodes/accessors/ModelNode.js +85 -9
  252. package/src/nodes/accessors/ReferenceBaseNode.js +1 -70
  253. package/src/nodes/accessors/ReferenceElementNode.js +72 -0
  254. package/src/nodes/accessors/ReferenceNode.js +1 -70
  255. package/src/nodes/accessors/Skinning.js +124 -12
  256. package/src/nodes/accessors/StorageTextureNode.js +7 -3
  257. package/src/nodes/accessors/Texture3DNode.js +1 -1
  258. package/src/nodes/accessors/TextureNode.js +51 -21
  259. package/src/nodes/accessors/TextureSizeNode.js +4 -2
  260. package/src/nodes/accessors/UniformArrayNode.js +30 -5
  261. package/src/nodes/code/CodeNode.js +1 -1
  262. package/src/nodes/code/FunctionNode.js +12 -2
  263. package/src/nodes/core/ArrayNode.js +2 -2
  264. package/src/nodes/core/ContextNode.js +57 -4
  265. package/src/nodes/core/IndexNode.js +69 -4
  266. package/src/nodes/core/InspectorNode.js +2 -2
  267. package/src/nodes/core/MRTNode.js +44 -2
  268. package/src/nodes/core/Node.js +6 -3
  269. package/src/nodes/core/NodeBuilder.js +65 -50
  270. package/src/nodes/core/NodeFrame.js +11 -3
  271. package/src/nodes/core/NodeUtils.js +88 -0
  272. package/src/nodes/core/PropertyNode.js +8 -0
  273. package/src/nodes/core/StackNode.js +0 -1
  274. package/src/nodes/core/StructNode.js +4 -3
  275. package/src/nodes/core/UniformGroupNode.js +3 -2
  276. package/src/nodes/core/UniformNode.js +26 -12
  277. package/src/nodes/core/VarNode.js +0 -1
  278. package/src/nodes/display/BumpMapNode.js +2 -2
  279. package/src/nodes/display/ColorAdjustment.js +1 -1
  280. package/src/nodes/display/PassNode.js +76 -15
  281. package/src/nodes/display/ScreenNode.js +22 -65
  282. package/src/nodes/fog/Fog.js +4 -4
  283. package/src/nodes/functions/BSDF/BRDF_GGX.js +6 -6
  284. package/src/nodes/functions/BSDF/BRDF_Sheen.js +1 -1
  285. package/src/nodes/functions/BSDF/DFGLUT.js +2 -1
  286. package/src/nodes/functions/BSDF/LTC.js +1 -1
  287. package/src/nodes/functions/PhongLightingModel.js +1 -1
  288. package/src/nodes/functions/PhysicalLightingModel.js +83 -25
  289. package/src/nodes/functions/ToonLightingModel.js +2 -2
  290. package/src/nodes/functions/material/getParallaxCorrectNormal.js +3 -3
  291. package/src/nodes/gpgpu/AtomicFunctionNode.js +64 -13
  292. package/src/nodes/gpgpu/BarrierNode.js +13 -4
  293. package/src/nodes/gpgpu/ComputeBuiltinNode.js +1 -1
  294. package/src/nodes/gpgpu/ComputeNode.js +20 -17
  295. package/src/nodes/gpgpu/SubgroupFunctionNode.js +165 -37
  296. package/src/nodes/gpgpu/WorkgroupInfoNode.js +44 -6
  297. package/src/nodes/lighting/EnvironmentNode.js +40 -4
  298. package/src/nodes/lighting/LightsNode.js +20 -4
  299. package/src/nodes/lighting/ShadowBaseNode.js +158 -1
  300. package/src/nodes/lighting/ShadowFilterNode.js +2 -106
  301. package/src/nodes/lighting/ShadowNode.js +22 -91
  302. package/src/nodes/materialx/{lib/mx_hsv.js → MaterialXColor.js} +3 -6
  303. package/src/nodes/materialx/{lib/mx_transform_color.js → MaterialXColorTransform.js} +3 -6
  304. package/src/nodes/materialx/MaterialXCore.js +37 -0
  305. package/src/nodes/materialx/MaterialXNodes.js +64 -72
  306. package/src/nodes/materialx/{lib/mx_noise.js → MaterialXNoise.js} +426 -197
  307. package/src/nodes/math/BitcountNode.js +24 -4
  308. package/src/nodes/math/MathNode.js +4 -4
  309. package/src/nodes/math/MathUtils.js +15 -4
  310. package/src/nodes/math/OperatorNode.js +2 -2
  311. package/src/nodes/math/PackFloatNode.js +29 -1
  312. package/src/nodes/math/Packed4x8IntegerNode.js +433 -0
  313. package/src/nodes/math/UnpackFloatNode.js +30 -2
  314. package/src/nodes/parsers/GLSLNodeFunction.js +1 -1
  315. package/src/nodes/pmrem/PMREMNode.js +1 -1
  316. package/src/nodes/pmrem/PMREMUtils.js +31 -74
  317. package/src/nodes/shapes/Shapes.js +1 -1
  318. package/src/nodes/tsl/TSLCore.js +1 -31
  319. package/src/nodes/utils/EventNode.js +75 -0
  320. package/src/nodes/utils/LoopNode.js +54 -13
  321. package/src/nodes/utils/PostProcessingUtils.js +23 -2
  322. package/src/nodes/utils/RTTNode.js +97 -32
  323. package/src/nodes/utils/ReflectorNode.js +8 -4
  324. package/src/nodes/utils/RotateNode.js +85 -8
  325. package/src/nodes/utils/SpriteUtils.js +58 -23
  326. package/src/objects/BatchedMesh.js +6 -0
  327. package/src/objects/InstancedMesh.js +1 -1
  328. package/src/objects/LOD.js +1 -1
  329. package/src/objects/Line.js +12 -0
  330. package/src/objects/Mesh.js +12 -0
  331. package/src/objects/Points.js +12 -0
  332. package/src/objects/Sprite.js +12 -0
  333. package/src/renderers/WebGLRenderer.js +93 -27
  334. package/src/renderers/common/Animation.js +12 -2
  335. package/src/renderers/common/Backend.js +38 -10
  336. package/src/renderers/common/BindGroup.js +0 -1
  337. package/src/renderers/common/Bindings.js +50 -4
  338. package/src/renderers/common/BundleGroup.js +4 -0
  339. package/src/renderers/common/ClippingContext.js +11 -1
  340. package/src/renderers/common/Color4.js +9 -0
  341. package/src/renderers/common/Constants.js +0 -5
  342. package/src/renderers/common/DirectRenderPipeline.js +233 -0
  343. package/src/renderers/common/Geometries.js +24 -3
  344. package/src/renderers/common/Info.js +3 -3
  345. package/src/renderers/common/InspectorBase.js +37 -8
  346. package/src/renderers/common/Lighting.js +11 -4
  347. package/src/renderers/common/Pipelines.js +6 -4
  348. package/src/renderers/common/QuadMesh.js +16 -2
  349. package/src/renderers/common/RenderContext.js +8 -0
  350. package/src/renderers/common/RenderList.js +53 -19
  351. package/src/renderers/common/RenderLists.js +58 -11
  352. package/src/renderers/common/RenderObject.js +14 -0
  353. package/src/renderers/common/RenderObjects.js +14 -9
  354. package/src/renderers/common/RenderPipeline.js +52 -44
  355. package/src/renderers/common/Renderer.js +226 -55
  356. package/src/renderers/common/Storage3DTexture.js +16 -0
  357. package/src/renderers/common/Textures.js +3 -3
  358. package/src/renderers/common/XRManager.js +79 -72
  359. package/src/renderers/common/extras/PMREMGenerator.js +76 -144
  360. package/src/renderers/common/nodes/NodeManager.js +144 -6
  361. package/src/renderers/common/nodes/NodeStorageBuffer.js +3 -1
  362. package/src/renderers/common/nodes/NodeUniformBuffer.js +3 -1
  363. package/src/renderers/shaders/DFGLUTData.js +2 -1
  364. package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +4 -2
  365. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +48 -0
  366. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +53 -4
  367. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +20 -2
  368. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +20 -0
  369. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +6 -0
  370. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +61 -57
  371. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +82 -0
  372. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl.js +9 -0
  373. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +8 -1
  374. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +15 -0
  375. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -0
  376. package/src/renderers/shaders/ShaderLib.js +1 -0
  377. package/src/renderers/shaders/UniformsLib.js +16 -0
  378. package/src/renderers/webgl/WebGLAnimation.js +2 -2
  379. package/src/renderers/webgl/WebGLCapabilities.js +2 -2
  380. package/src/renderers/webgl/WebGLLights.js +74 -4
  381. package/src/renderers/webgl/WebGLMaterials.js +6 -0
  382. package/src/renderers/webgl/WebGLOutput.js +36 -24
  383. package/src/renderers/webgl/WebGLProgram.js +3 -0
  384. package/src/renderers/webgl/WebGLPrograms.js +8 -0
  385. package/src/renderers/webgl/WebGLRenderLists.js +6 -10
  386. package/src/renderers/webgl/WebGLShadowMap.js +47 -44
  387. package/src/renderers/webgl/WebGLTextures.js +7 -7
  388. package/src/renderers/webgl-fallback/WebGLBackend.js +153 -45
  389. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +83 -29
  390. package/src/renderers/webgl-fallback/utils/WebGLState.js +163 -17
  391. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +32 -5
  392. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +11 -4
  393. package/src/renderers/webgpu/WebGPUBackend.js +513 -145
  394. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +99 -20
  395. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +2 -1
  396. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +3 -12
  397. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +24 -14
  398. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +80 -14
  399. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +62 -7
  400. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +9 -3
  401. package/src/renderers/webgpu/utils/WebGPUUtils.js +16 -4
  402. package/src/renderers/webxr/WebXRManager.js +25 -2
  403. package/src/scenes/Scene.js +3 -3
  404. package/src/textures/CompressedArrayTexture.js +16 -0
  405. package/src/textures/Data3DTexture.js +16 -0
  406. package/src/textures/DataArrayTexture.js +16 -0
  407. package/src/textures/DepthTexture.js +3 -3
  408. package/src/textures/Texture.js +3 -3
  409. package/src/textures/{Source.js → TextureSource.js} +39 -8
  410. package/build/three.core.min.js +0 -6
  411. package/build/three.module.min.js +0 -6
  412. package/build/three.tsl.min.js +0 -6
  413. package/build/three.webgpu.min.js +0 -6
  414. package/build/three.webgpu.nodes.min.js +0 -6
  415. package/examples/jsm/libs/ecsy.module.js +0 -1792
  416. package/examples/jsm/loaders/LottieLoader.js +0 -130
  417. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +0 -52
@@ -0,0 +1,221 @@
1
+ import {
2
+ InstancedBufferAttribute,
3
+ InstancedMesh,
4
+ Matrix4,
5
+ ShaderMaterial,
6
+ SphereGeometry,
7
+ Vector3
8
+ } from '@gnsx/three';
9
+
10
+ /**
11
+ * Visualizes an {@link LightProbeGridWebGL} by rendering a sphere at each
12
+ * probe position, shaded with the probe's L2 spherical harmonics.
13
+ *
14
+ * Uses a single `InstancedMesh` draw call for all probes.
15
+ *
16
+ * ```js
17
+ * const helper = new LightProbeGridHelperWebGL( probes );
18
+ * scene.add( helper );
19
+ * ```
20
+ *
21
+ * @augments InstancedMesh
22
+ * @three_import import { LightProbeGridHelperWebGL } from 'three/addons/helpers/LightProbeGridHelperWebGL.js';
23
+ */
24
+ class LightProbeGridHelperWebGL extends InstancedMesh {
25
+
26
+ /**
27
+ * Constructs a new irradiance probe grid helper.
28
+ *
29
+ * @param {LightProbeGridWebGL} probes - The probe grid to visualize.
30
+ * @param {number} [sphereSize=0.12] - The radius of each probe sphere.
31
+ */
32
+ constructor( probes, sphereSize = 0.12 ) {
33
+
34
+ const geometry = new SphereGeometry( sphereSize, 16, 16 );
35
+
36
+ const material = new ShaderMaterial( {
37
+
38
+ uniforms: {
39
+
40
+ probesSH: { value: null },
41
+ probesResolution: { value: new Vector3() },
42
+
43
+ },
44
+
45
+ vertexShader: /* glsl */`
46
+
47
+ attribute vec3 instanceUVW;
48
+
49
+ varying vec3 vWorldNormal;
50
+ varying vec3 vUVW;
51
+
52
+ void main() {
53
+
54
+ vUVW = instanceUVW;
55
+ vWorldNormal = normalize( mat3( modelMatrix ) * normal );
56
+ gl_Position = projectionMatrix * modelViewMatrix * instanceMatrix * vec4( position, 1.0 );
57
+
58
+ }
59
+
60
+ `,
61
+
62
+ fragmentShader: /* glsl */`
63
+
64
+ precision highp sampler3D;
65
+
66
+ uniform sampler3D probesSH;
67
+ uniform vec3 probesResolution;
68
+
69
+ varying vec3 vWorldNormal;
70
+ varying vec3 vUVW;
71
+
72
+ void main() {
73
+
74
+ // Atlas UV mapping — must match lightprobes_pars_fragment.glsl.js
75
+ float nz = probesResolution.z;
76
+ float paddedSlices = nz + 2.0;
77
+ float atlasDepth = 7.0 * paddedSlices;
78
+ float uvZBase = vUVW.z * nz + 1.0;
79
+
80
+ vec4 s0 = texture( probesSH, vec3( vUVW.xy, ( uvZBase ) / atlasDepth ) );
81
+ vec4 s1 = texture( probesSH, vec3( vUVW.xy, ( uvZBase + paddedSlices ) / atlasDepth ) );
82
+ vec4 s2 = texture( probesSH, vec3( vUVW.xy, ( uvZBase + 2.0 * paddedSlices ) / atlasDepth ) );
83
+ vec4 s3 = texture( probesSH, vec3( vUVW.xy, ( uvZBase + 3.0 * paddedSlices ) / atlasDepth ) );
84
+ vec4 s4 = texture( probesSH, vec3( vUVW.xy, ( uvZBase + 4.0 * paddedSlices ) / atlasDepth ) );
85
+ vec4 s5 = texture( probesSH, vec3( vUVW.xy, ( uvZBase + 5.0 * paddedSlices ) / atlasDepth ) );
86
+ vec4 s6 = texture( probesSH, vec3( vUVW.xy, ( uvZBase + 6.0 * paddedSlices ) / atlasDepth ) );
87
+
88
+ // Unpack 9 vec3 SH L2 coefficients
89
+
90
+ vec3 c0 = s0.xyz;
91
+ vec3 c1 = vec3( s0.w, s1.xy );
92
+ vec3 c2 = vec3( s1.zw, s2.x );
93
+ vec3 c3 = s2.yzw;
94
+ vec3 c4 = s3.xyz;
95
+ vec3 c5 = vec3( s3.w, s4.xy );
96
+ vec3 c6 = vec3( s4.zw, s5.x );
97
+ vec3 c7 = s5.yzw;
98
+ vec3 c8 = s6.xyz;
99
+
100
+ vec3 n = normalize( vWorldNormal );
101
+
102
+ float x = n.x, y = n.y, z = n.z;
103
+
104
+ // band 0
105
+ vec3 result = c0 * 0.886227;
106
+
107
+ // band 1,
108
+ result += c1 * 2.0 * 0.511664 * y;
109
+ result += c2 * 2.0 * 0.511664 * z;
110
+ result += c3 * 2.0 * 0.511664 * x;
111
+
112
+ // band 2,
113
+ result += c4 * 2.0 * 0.429043 * x * y;
114
+ result += c5 * 2.0 * 0.429043 * y * z;
115
+ result += c6 * ( 0.743125 * z * z - 0.247708 );
116
+ result += c7 * 2.0 * 0.429043 * x * z;
117
+ result += c8 * 0.429043 * ( x * x - y * y );
118
+
119
+ gl_FragColor = vec4( max( result, vec3( 0.0 ) ), 1.0 );
120
+
121
+ #include <tonemapping_fragment>
122
+ #include <colorspace_fragment>
123
+
124
+ }
125
+
126
+ `
127
+
128
+ } );
129
+
130
+ const res = probes.resolution;
131
+ const count = res.x * res.y * res.z;
132
+
133
+ super( geometry, material, count );
134
+
135
+ /**
136
+ * The probe grid to visualize.
137
+ *
138
+ * @type {LightProbeGridWebGL}
139
+ */
140
+ this.probes = probes;
141
+
142
+ this.type = 'LightProbeGridHelperWebGL';
143
+
144
+ this.update();
145
+
146
+ }
147
+
148
+ /**
149
+ * Rebuilds instance matrices and UVW attributes from the current probe grid.
150
+ * Call this after changing `probes` or after re-baking.
151
+ */
152
+ update() {
153
+
154
+ const probes = this.probes;
155
+ const res = probes.resolution;
156
+ const count = res.x * res.y * res.z;
157
+
158
+ // Resize instance matrix buffer if needed
159
+
160
+ if ( this.instanceMatrix.count !== count ) {
161
+
162
+ this.instanceMatrix = new InstancedBufferAttribute( new Float32Array( count * 16 ), 16 );
163
+
164
+ }
165
+
166
+ this.count = count;
167
+
168
+ const uvwArray = new Float32Array( count * 3 );
169
+ const matrix = new Matrix4();
170
+ const probePos = new Vector3();
171
+
172
+ let i = 0;
173
+
174
+ for ( let iz = 0; iz < res.z; iz ++ ) {
175
+
176
+ for ( let iy = 0; iy < res.y; iy ++ ) {
177
+
178
+ for ( let ix = 0; ix < res.x; ix ++ ) {
179
+
180
+ // Remap to texel centers (must match lightprobes_pars_fragment.glsl.js)
181
+ uvwArray[ i * 3 ] = ( ix + 0.5 ) / res.x;
182
+ uvwArray[ i * 3 + 1 ] = ( iy + 0.5 ) / res.y;
183
+ uvwArray[ i * 3 + 2 ] = ( iz + 0.5 ) / res.z;
184
+
185
+ probes.getProbePosition( ix, iy, iz, probePos );
186
+ matrix.makeTranslation( probePos.x, probePos.y, probePos.z );
187
+ this.setMatrixAt( i, matrix );
188
+
189
+ i ++;
190
+
191
+ }
192
+
193
+ }
194
+
195
+ }
196
+
197
+ this.instanceMatrix.needsUpdate = true;
198
+
199
+ this.geometry.setAttribute( 'instanceUVW', new InstancedBufferAttribute( uvwArray, 3 ) );
200
+
201
+ // Update texture uniforms
202
+
203
+ this.material.uniforms.probesSH.value = probes.texture;
204
+ this.material.uniforms.probesResolution.value.copy( probes.resolution );
205
+
206
+ }
207
+
208
+ /**
209
+ * Frees the GPU-related resources allocated by this instance. Call this
210
+ * method whenever this instance is no longer used in your app.
211
+ */
212
+ dispose() {
213
+
214
+ this.geometry.dispose();
215
+ this.material.dispose();
216
+
217
+ }
218
+
219
+ }
220
+
221
+ export { LightProbeGridHelperWebGL };
@@ -1,4 +1,5 @@
1
1
  import { Tab } from '@gnsx/three/addons/inspector/ui/Tab.js';
2
+ import { getItem, setItem } from './Inspector.js';
2
3
 
3
4
  export class Extension extends Tab {
4
5
 
@@ -10,4 +11,97 @@ export class Extension extends Tab {
10
11
 
11
12
  }
12
13
 
14
+ init( inspector ) {
15
+
16
+ super.init( inspector );
17
+
18
+ if ( this._handleLayout && this._inspector ) {
19
+
20
+ this._inspector.removeEventListener( 'orientationchange', this._handleLayout );
21
+ this._inspector.removeEventListener( 'layoutchange', this._handleLayout );
22
+ this._inspector.removeEventListener( 'resize', this._handleLayout );
23
+ window.removeEventListener( 'resize', this._handleLayout );
24
+
25
+ }
26
+
27
+ this._inspector = inspector;
28
+
29
+ this._handleLayout = ( event ) => {
30
+
31
+ this.onOrientationChange( event );
32
+ this.onLayoutChange( event );
33
+
34
+ };
35
+
36
+ if ( inspector ) {
37
+
38
+ inspector.addEventListener( 'orientationchange', this._handleLayout );
39
+ inspector.addEventListener( 'layoutchange', this._handleLayout );
40
+ inspector.addEventListener( 'resize', this._handleLayout );
41
+
42
+ }
43
+
44
+ window.addEventListener( 'resize', this._handleLayout );
45
+
46
+ const data = getItem( this.name );
47
+
48
+ if ( Object.keys( data ).length > 0 ) {
49
+
50
+ this.deserialize( data );
51
+
52
+ }
53
+
54
+ }
55
+
56
+ serialize() {
57
+
58
+ return {};
59
+
60
+ }
61
+
62
+ deserialize( /* data */ ) {
63
+
64
+ }
65
+
66
+ save() {
67
+
68
+ const data = this.serialize();
69
+
70
+ if ( data === null || ( typeof data === 'object' && Object.keys( data ).length === 0 ) ) {
71
+
72
+ setItem( this.name, null );
73
+
74
+ } else {
75
+
76
+ setItem( this.name, data );
77
+
78
+ }
79
+
80
+ }
81
+
82
+ dispose() {
83
+
84
+ if ( this._handleLayout ) {
85
+
86
+ if ( this._inspector ) {
87
+
88
+ this._inspector.removeEventListener( 'orientationchange', this._handleLayout );
89
+ this._inspector.removeEventListener( 'layoutchange', this._handleLayout );
90
+ this._inspector.removeEventListener( 'resize', this._handleLayout );
91
+
92
+ }
93
+
94
+ window.removeEventListener( 'resize', this._handleLayout );
95
+ this._handleLayout = null;
96
+
97
+ }
98
+
99
+ this._inspector = null;
100
+
101
+ }
102
+
103
+ onOrientationChange( /* event */ ) { }
104
+
105
+ onLayoutChange( /* event */ ) { }
106
+
13
107
  }
@@ -10,18 +10,26 @@ import { Viewer } from './tabs/Viewer.js';
10
10
  import { Timeline } from './tabs/Timeline.js';
11
11
  import { setText } from './ui/utils.js';
12
12
 
13
- import { setConsoleFunction, REVISION } from '@gnsx/three/webgpu';
13
+ import { setConsoleFunction, getConsoleFunction, REVISION } from '@gnsx/three/webgpu';
14
14
 
15
15
  class Inspector extends RendererInspector {
16
16
 
17
- constructor() {
17
+ constructor( options = {} ) {
18
18
 
19
19
  super();
20
20
 
21
+ const {
22
+ nonce = null
23
+ } = options;
24
+
25
+ this.nonce = nonce;
26
+
21
27
  // init profiler
22
28
 
23
- const profiler = new Profiler( this );
29
+ const profiler = new Profiler( this, options );
24
30
  profiler.addEventListener( 'resize', ( e ) => this.dispatchEvent( e ) );
31
+ profiler.addEventListener( 'orientationchange', ( e ) => this.dispatchEvent( e ) );
32
+ profiler.addEventListener( 'layoutchange', ( e ) => this.dispatchEvent( e ) );
25
33
 
26
34
  const parameters = new Parameters( {
27
35
  builtin: true,
@@ -68,6 +76,8 @@ class Inspector extends RendererInspector {
68
76
  this.settings = settings;
69
77
  this.once = {};
70
78
  this.extensionsData = new WeakMap();
79
+ this.previousConsoleFunction = null;
80
+ this._domObserver = null;
71
81
 
72
82
  this.displayCycle = {
73
83
  text: {
@@ -95,6 +105,12 @@ class Inspector extends RendererInspector {
95
105
 
96
106
  }
97
107
 
108
+ isVertical() {
109
+
110
+ return this.profiler ? this.profiler.isVertical() : false;
111
+
112
+ }
113
+
98
114
  onExtension( name, callback ) {
99
115
 
100
116
  const extensionAdded = ( e ) => {
@@ -135,6 +151,20 @@ class Inspector extends RendererInspector {
135
151
 
136
152
  }
137
153
 
154
+ setVisible( value ) {
155
+
156
+ this.domElement.style.display = value ? '' : 'none';
157
+
158
+ return this;
159
+
160
+ }
161
+
162
+ getVisible() {
163
+
164
+ return this.domElement.style.display !== 'none';
165
+
166
+ }
167
+
138
168
  getSize() {
139
169
 
140
170
  return this.profiler.getSize();
@@ -149,6 +179,22 @@ class Inspector extends RendererInspector {
149
179
 
150
180
  }
151
181
 
182
+ setHorizontalAlign( value ) {
183
+
184
+ this.profiler.setHorizontalAlign( value );
185
+
186
+ return this;
187
+
188
+ }
189
+
190
+ setVerticalAlign( value ) {
191
+
192
+ this.profiler.setVerticalAlign( value );
193
+
194
+ return this;
195
+
196
+ }
197
+
152
198
  addTab( tab ) {
153
199
 
154
200
  this.profiler.addTab( tab );
@@ -159,6 +205,8 @@ class Inspector extends RendererInspector {
159
205
 
160
206
  removeTab( tab ) {
161
207
 
208
+ tab.dispose();
209
+
162
210
  this.profiler.removeTab( tab );
163
211
 
164
212
  return this;
@@ -234,81 +282,129 @@ class Inspector extends RendererInspector {
234
282
 
235
283
  }
236
284
 
237
- init() {
285
+ setRenderer( renderer ) {
286
+
287
+ super.setRenderer( renderer );
238
288
 
239
- const renderer = this.getRenderer();
289
+ if ( renderer !== null ) {
240
290
 
241
- let sign = `THREE.WebGPURenderer: ${ REVISION } [ "`;
291
+ const previousConsoleFunction = getConsoleFunction();
242
292
 
243
- if ( renderer.backend.isWebGPUBackend ) {
293
+ this.previousConsoleFunction = previousConsoleFunction;
244
294
 
245
- sign += 'WebGPU';
295
+ setConsoleFunction( ( type, message, ...params ) => {
246
296
 
247
- } else if ( renderer.backend.isWebGLBackend ) {
297
+ if ( previousConsoleFunction ) {
248
298
 
249
- sign += 'WebGL2';
299
+ previousConsoleFunction( type, message, ...params );
250
300
 
251
- }
301
+ }
252
302
 
253
- sign += '" ]';
303
+ this.resolveConsole( type, message, ...params );
254
304
 
255
- this.console.addMessage( 'info', sign );
305
+ } );
256
306
 
257
- //
307
+ if ( this.isAvailable ) {
258
308
 
259
- if ( renderer.inspector.domElement.parentElement === null ) {
309
+ const init = async () => {
260
310
 
261
- if ( renderer.domElement.parentElement !== null ) {
311
+ if ( renderer.hasInitialized() === false ) await renderer.init();
262
312
 
263
- renderer.domElement.parentElement.appendChild( renderer.inspector.domElement );
313
+ renderer.backend.trackTimestamp = true;
264
314
 
265
- } else {
315
+ if ( renderer.hasFeature( 'timestamp-query' ) !== true ) {
266
316
 
267
- const observer = new MutationObserver( () => {
317
+ this.console.addMessage( 'error', 'THREE.Inspector: GPU Timestamp Queries not available.' );
268
318
 
269
- if ( renderer.domElement.parentElement !== null ) {
319
+ }
270
320
 
271
- renderer.domElement.parentElement.appendChild( renderer.inspector.domElement );
272
- observer.disconnect();
321
+ let sign = `THREE.WebGPURenderer: ${ REVISION } [ "`;
322
+
323
+ if ( renderer.backend.isWebGPUBackend ) {
324
+
325
+ sign += 'WebGPU';
326
+
327
+ } else if ( renderer.backend.isWebGLBackend ) {
328
+
329
+ sign += 'WebGL2';
273
330
 
274
331
  }
275
332
 
276
- } );
333
+ sign += '" ]';
277
334
 
278
- observer.observe( document.body || document.documentElement, { childList: true, subtree: true } );
335
+ this.console.addMessage( 'info', sign );
279
336
 
280
- }
337
+ //
281
338
 
282
- }
339
+ const domElement = this.domElement;
283
340
 
284
- }
341
+ if ( domElement.parentElement === null ) {
285
342
 
286
- setRenderer( renderer ) {
343
+ if ( renderer.domElement.parentElement !== null ) {
287
344
 
288
- super.setRenderer( renderer );
345
+ renderer.domElement.parentElement.appendChild( domElement );
289
346
 
290
- if ( renderer !== null ) {
347
+ } else {
291
348
 
292
- setConsoleFunction( this.resolveConsole.bind( this ) );
349
+ if ( this._domObserver !== null ) {
293
350
 
294
- if ( this.isAvailable ) {
351
+ this._domObserver.disconnect();
295
352
 
296
- renderer.init().then( () => {
353
+ }
297
354
 
298
- renderer.backend.trackTimestamp = true;
355
+ this._domObserver = new MutationObserver( () => {
299
356
 
300
- if ( renderer.hasFeature( 'timestamp-query' ) !== true ) {
357
+ if ( renderer.domElement && renderer.domElement.parentElement !== null ) {
301
358
 
302
- this.console.addMessage( 'error', 'THREE.Inspector: GPU Timestamp Queries not available.' );
359
+ renderer.domElement.parentElement.appendChild( domElement );
360
+
361
+ if ( this._domObserver !== null ) {
362
+
363
+ this._domObserver.disconnect();
364
+ this._domObserver = null;
365
+
366
+ }
367
+
368
+ }
369
+
370
+ } );
371
+
372
+ this._domObserver.observe( document.body || document.documentElement, { childList: true, subtree: true } );
373
+
374
+ }
303
375
 
304
376
  }
305
377
 
306
- } );
378
+ };
379
+
380
+ init();
307
381
 
308
382
  this.timeline.setRenderer( renderer );
309
383
 
310
384
  }
311
385
 
386
+ } else {
387
+
388
+ if ( this.previousConsoleFunction ) {
389
+
390
+ setConsoleFunction( this.previousConsoleFunction );
391
+ this.previousConsoleFunction = undefined;
392
+
393
+ }
394
+
395
+ if ( this._domObserver !== null ) {
396
+
397
+ this._domObserver.disconnect();
398
+ this._domObserver = null;
399
+
400
+ }
401
+
402
+ this.profiler.dispose();
403
+
404
+ this.statsData.clear();
405
+
406
+ super.dispose();
407
+
312
408
  }
313
409
 
314
410
  return this;
@@ -450,9 +546,9 @@ class Inspector extends RendererInspector {
450
546
 
451
547
  resolveFrame( frame ) {
452
548
 
453
- const nextFrame = this.getFrameById( frame.frameId + 1 );
549
+ const previousFrame = this.getFrameById( frame.frameId - 1 );
454
550
 
455
- if ( ! nextFrame ) return;
551
+ if ( ! previousFrame ) return;
456
552
 
457
553
  frame.cpu = 0;
458
554
  frame.gpu = 0;
@@ -470,9 +566,9 @@ class Inspector extends RendererInspector {
470
566
 
471
567
  }
472
568
 
473
- // improve stats using next frame
569
+ // improve stats using previous frame
474
570
 
475
- frame.deltaTime = nextFrame.startTime - frame.startTime;
571
+ frame.deltaTime = frame.startTime - previousFrame.startTime;
476
572
  frame.miscellaneous = frame.deltaTime - frame.total;
477
573
 
478
574
  if ( frame.miscellaneous < 0 ) {
@@ -535,6 +631,14 @@ class Inspector extends RendererInspector {
535
631
 
536
632
  }
537
633
 
634
+ dispose() {
635
+
636
+ super.dispose();
637
+
638
+ this.setRenderer( null );
639
+
640
+ }
641
+
538
642
  }
539
643
 
540
644
  function getItem( id ) {