@gnsx/three 0.184.19 → 0.184.21

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 (320) hide show
  1. package/build/three.cjs +185 -42
  2. package/build/three.core.js +185 -42
  3. package/build/three.core.min.js +1 -1
  4. package/examples/jsm/animation/AnimationClipCreator.js +1 -1
  5. package/examples/jsm/animation/CCDIKSolver.js +1 -1
  6. package/examples/jsm/controls/ArcballControls.js +1 -1
  7. package/examples/jsm/controls/DragControls.js +1 -1
  8. package/examples/jsm/controls/FirstPersonControls.js +1 -1
  9. package/examples/jsm/controls/FlyControls.js +1 -1
  10. package/examples/jsm/controls/MapControls.js +1 -1
  11. package/examples/jsm/controls/OrbitControls.js +1 -1
  12. package/examples/jsm/controls/PointerLockControls.js +1 -1
  13. package/examples/jsm/controls/TrackballControls.js +1 -1
  14. package/examples/jsm/controls/TransformControls.js +1 -1
  15. package/examples/jsm/csm/CSM.js +1 -1
  16. package/examples/jsm/csm/CSMFrustum.js +1 -1
  17. package/examples/jsm/csm/CSMHelper.js +1 -1
  18. package/examples/jsm/csm/CSMShader.js +1 -1
  19. package/examples/jsm/csm/CSMShadowNode.js +2 -2
  20. package/examples/jsm/curves/CurveExtras.js +1 -1
  21. package/examples/jsm/curves/NURBSCurve.js +1 -1
  22. package/examples/jsm/curves/NURBSSurface.js +1 -1
  23. package/examples/jsm/curves/NURBSUtils.js +1 -1
  24. package/examples/jsm/curves/NURBSVolume.js +1 -1
  25. package/examples/jsm/effects/AnaglyphEffect.js +1 -1
  26. package/examples/jsm/effects/OutlineEffect.js +1 -1
  27. package/examples/jsm/effects/ParallaxBarrierEffect.js +1 -1
  28. package/examples/jsm/effects/StereoEffect.js +1 -1
  29. package/examples/jsm/environments/ColorEnvironment.js +1 -1
  30. package/examples/jsm/environments/DebugEnvironment.js +1 -1
  31. package/examples/jsm/environments/RoomEnvironment.js +1 -1
  32. package/examples/jsm/exporters/DRACOExporter.js +1 -1
  33. package/examples/jsm/exporters/EXRExporter.js +1 -1
  34. package/examples/jsm/exporters/GLTFExporter.js +1 -1
  35. package/examples/jsm/exporters/KTX2Exporter.js +1 -1
  36. package/examples/jsm/exporters/OBJExporter.js +1 -1
  37. package/examples/jsm/exporters/PLYExporter.js +1 -1
  38. package/examples/jsm/exporters/STLExporter.js +1 -1
  39. package/examples/jsm/exporters/USDZExporter.js +1 -1
  40. package/examples/jsm/geometries/BoxLineGeometry.js +1 -1
  41. package/examples/jsm/geometries/ConvexGeometry.js +1 -1
  42. package/examples/jsm/geometries/DecalGeometry.js +1 -1
  43. package/examples/jsm/geometries/ParametricGeometry.js +1 -1
  44. package/examples/jsm/geometries/RoundedBoxGeometry.js +1 -1
  45. package/examples/jsm/geometries/TeapotGeometry.js +1 -1
  46. package/examples/jsm/geometries/TextGeometry.js +1 -1
  47. package/examples/jsm/gpgpu/BitonicSort.js +1 -1
  48. package/examples/jsm/helpers/AnimationPathHelper.js +1 -1
  49. package/examples/jsm/helpers/LightProbeGridCubeMapHelper.js +3 -3
  50. package/examples/jsm/helpers/LightProbeGridHelper.js +3 -3
  51. package/examples/jsm/helpers/LightProbeHelper.js +1 -1
  52. package/examples/jsm/helpers/LightProbeHelperGPU.js +2 -2
  53. package/examples/jsm/helpers/OctreeHelper.js +1 -1
  54. package/examples/jsm/helpers/PositionalAudioHelper.js +1 -1
  55. package/examples/jsm/helpers/RapierHelper.js +1 -1
  56. package/examples/jsm/helpers/RectAreaLightHelper.js +1 -1
  57. package/examples/jsm/helpers/TextureHelper.js +1 -1
  58. package/examples/jsm/helpers/TextureHelperGPU.js +2 -2
  59. package/examples/jsm/helpers/VertexNormalsHelper.js +1 -1
  60. package/examples/jsm/helpers/VertexTangentsHelper.js +1 -1
  61. package/examples/jsm/helpers/ViewHelper.js +1 -1
  62. package/examples/jsm/inspector/Extension.js +1 -1
  63. package/examples/jsm/inspector/Inspector.js +1 -1
  64. package/examples/jsm/inspector/RendererInspector.js +1 -1
  65. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +2 -2
  66. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +3 -3
  67. package/examples/jsm/inspector/tabs/Settings.js +1 -1
  68. package/examples/jsm/inspector/tabs/Timeline.js +1 -1
  69. package/examples/jsm/inspector/tabs/Viewer.js +2 -2
  70. package/examples/jsm/inspector/ui/Profiler.js +1 -1
  71. package/examples/jsm/inspector/ui/Tab.js +1 -1
  72. package/examples/jsm/inspector/ui/Values.js +1 -1
  73. package/examples/jsm/interaction/InteractionManager.js +1 -1
  74. package/examples/jsm/interactive/HTMLMesh.js +1 -1
  75. package/examples/jsm/interactive/InteractiveGroup.js +1 -1
  76. package/examples/jsm/interactive/SelectionBox.js +1 -1
  77. package/examples/jsm/interactive/SelectionHelper.js +1 -1
  78. package/examples/jsm/lighting/DynamicLighting.js +1 -1
  79. package/examples/jsm/lighting/LightProbeGrid.js +3 -3
  80. package/examples/jsm/lighting/TiledLighting.js +1 -1
  81. package/examples/jsm/lights/LightProbeGenerator.js +1 -1
  82. package/examples/jsm/lights/RectAreaLightTexturesLib.js +1 -1
  83. package/examples/jsm/lights/RectAreaLightUniformsLib.js +1 -1
  84. package/examples/jsm/lines/LineMaterial.js +1 -1
  85. package/examples/jsm/lines/LineSegments2.js +1 -1
  86. package/examples/jsm/lines/LineSegmentsGeometry.js +1 -1
  87. package/examples/jsm/lines/Wireframe.js +1 -1
  88. package/examples/jsm/lines/WireframeGeometry2.js +1 -1
  89. package/examples/jsm/lines/webgpu/Line2.js +1 -1
  90. package/examples/jsm/lines/webgpu/LineSegments2.js +1 -1
  91. package/examples/jsm/lines/webgpu/Wireframe.js +1 -1
  92. package/examples/jsm/loaders/3DMLoader.js +1 -1
  93. package/examples/jsm/loaders/3MFLoader.js +1 -1
  94. package/examples/jsm/loaders/AMFLoader.js +1 -1
  95. package/examples/jsm/loaders/BVHLoader.js +1 -1
  96. package/examples/jsm/loaders/ColladaLoader.js +1 -1
  97. package/examples/jsm/loaders/DDSLoader.js +1 -1
  98. package/examples/jsm/loaders/DRACOLoader.js +1 -1
  99. package/examples/jsm/loaders/EXRLoader.js +1 -1
  100. package/examples/jsm/loaders/FBXLoader.js +1 -1
  101. package/examples/jsm/loaders/FontLoader.js +1 -1
  102. package/examples/jsm/loaders/GCodeLoader.js +1 -1
  103. package/examples/jsm/loaders/GLTFLoader.js +1 -1
  104. package/examples/jsm/loaders/HDRCubeTextureLoader.js +1 -1
  105. package/examples/jsm/loaders/HDRLoader.js +1 -1
  106. package/examples/jsm/loaders/IESLoader.js +1 -1
  107. package/examples/jsm/loaders/KMZLoader.js +1 -1
  108. package/examples/jsm/loaders/KTX2Loader.js +1 -1
  109. package/examples/jsm/loaders/KTXLoader.js +1 -1
  110. package/examples/jsm/loaders/LDrawLoader.js +1 -1
  111. package/examples/jsm/loaders/LUT3dlLoader.js +1 -1
  112. package/examples/jsm/loaders/LUTCubeLoader.js +1 -1
  113. package/examples/jsm/loaders/LUTImageLoader.js +1 -1
  114. package/examples/jsm/loaders/LWOLoader.js +1 -1
  115. package/examples/jsm/loaders/LottieLoader.js +1 -1
  116. package/examples/jsm/loaders/MD2Loader.js +1 -1
  117. package/examples/jsm/loaders/MDDLoader.js +1 -1
  118. package/examples/jsm/loaders/MTLLoader.js +1 -1
  119. package/examples/jsm/loaders/MaterialXLoader.js +2 -2
  120. package/examples/jsm/loaders/NRRDLoader.js +1 -1
  121. package/examples/jsm/loaders/OBJLoader.js +1 -1
  122. package/examples/jsm/loaders/PCDLoader.js +1 -1
  123. package/examples/jsm/loaders/PDBLoader.js +1 -1
  124. package/examples/jsm/loaders/PLYLoader.js +1 -1
  125. package/examples/jsm/loaders/PVRLoader.js +1 -1
  126. package/examples/jsm/loaders/STLLoader.js +1 -1
  127. package/examples/jsm/loaders/SVGLoader.js +1 -1
  128. package/examples/jsm/loaders/TDSLoader.js +1 -1
  129. package/examples/jsm/loaders/TGALoader.js +1 -1
  130. package/examples/jsm/loaders/TIFFLoader.js +1 -1
  131. package/examples/jsm/loaders/TTFLoader.js +1 -1
  132. package/examples/jsm/loaders/USDLoader.js +1 -1
  133. package/examples/jsm/loaders/UltraHDRLoader.js +1 -1
  134. package/examples/jsm/loaders/VOXLoader.js +1 -1
  135. package/examples/jsm/loaders/VRMLLoader.js +1 -1
  136. package/examples/jsm/loaders/VTKLoader.js +1 -1
  137. package/examples/jsm/loaders/XYZLoader.js +1 -1
  138. package/examples/jsm/loaders/collada/ColladaComposer.js +1 -1
  139. package/examples/jsm/loaders/collada/ColladaParser.js +1 -1
  140. package/examples/jsm/loaders/usd/USDComposer.js +1 -1
  141. package/examples/jsm/materials/LDrawConditionalLineMaterial.js +1 -1
  142. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
  143. package/examples/jsm/materials/WoodNodeMaterial.js +2 -2
  144. package/examples/jsm/math/Capsule.js +1 -1
  145. package/examples/jsm/math/ColorConverter.js +1 -1
  146. package/examples/jsm/math/ColorSpaces.js +1 -1
  147. package/examples/jsm/math/ConvexHull.js +1 -1
  148. package/examples/jsm/math/ImprovedNoise.js +1 -1
  149. package/examples/jsm/math/Lut.js +1 -1
  150. package/examples/jsm/math/MeshSurfaceSampler.js +1 -1
  151. package/examples/jsm/math/OBB.js +1 -1
  152. package/examples/jsm/math/Octree.js +1 -1
  153. package/examples/jsm/misc/ConvexObjectBreaker.js +1 -1
  154. package/examples/jsm/misc/GPUComputationRenderer.js +1 -1
  155. package/examples/jsm/misc/Gyroscope.js +1 -1
  156. package/examples/jsm/misc/MD2Character.js +1 -1
  157. package/examples/jsm/misc/MD2CharacterComplex.js +1 -1
  158. package/examples/jsm/misc/MorphAnimMesh.js +1 -1
  159. package/examples/jsm/misc/MorphBlendMesh.js +1 -1
  160. package/examples/jsm/misc/ProgressiveLightMap.js +1 -1
  161. package/examples/jsm/misc/ProgressiveLightMapGPU.js +2 -2
  162. package/examples/jsm/misc/RollerCoaster.js +1 -1
  163. package/examples/jsm/misc/TubePainter.js +1 -1
  164. package/examples/jsm/misc/Volume.js +1 -1
  165. package/examples/jsm/misc/VolumeSlice.js +1 -1
  166. package/examples/jsm/modifiers/CurveModifier.js +1 -1
  167. package/examples/jsm/modifiers/CurveModifierGPU.js +2 -2
  168. package/examples/jsm/modifiers/EdgeSplitModifier.js +1 -1
  169. package/examples/jsm/modifiers/SimplifyModifier.js +1 -1
  170. package/examples/jsm/modifiers/TessellateModifier.js +1 -1
  171. package/examples/jsm/objects/GroundedSkybox.js +1 -1
  172. package/examples/jsm/objects/Lensflare.js +1 -1
  173. package/examples/jsm/objects/LensflareMesh.js +2 -2
  174. package/examples/jsm/objects/MarchingCubes.js +1 -1
  175. package/examples/jsm/objects/Reflector.js +1 -1
  176. package/examples/jsm/objects/ReflectorForSSRPass.js +1 -1
  177. package/examples/jsm/objects/Refractor.js +1 -1
  178. package/examples/jsm/objects/ShadowMesh.js +1 -1
  179. package/examples/jsm/objects/Sky.js +1 -1
  180. package/examples/jsm/objects/SkyMesh.js +2 -2
  181. package/examples/jsm/objects/Water.js +1 -1
  182. package/examples/jsm/objects/Water2.js +1 -1
  183. package/examples/jsm/objects/Water2Mesh.js +2 -2
  184. package/examples/jsm/objects/WaterMesh.js +2 -2
  185. package/examples/jsm/physics/JoltPhysics.js +1 -1
  186. package/examples/jsm/physics/RapierPhysics.js +1 -1
  187. package/examples/jsm/postprocessing/AfterimagePass.js +1 -1
  188. package/examples/jsm/postprocessing/BloomPass.js +1 -1
  189. package/examples/jsm/postprocessing/BokehPass.js +1 -1
  190. package/examples/jsm/postprocessing/ClearPass.js +1 -1
  191. package/examples/jsm/postprocessing/CubeTexturePass.js +1 -1
  192. package/examples/jsm/postprocessing/DotScreenPass.js +1 -1
  193. package/examples/jsm/postprocessing/EffectComposer.js +1 -1
  194. package/examples/jsm/postprocessing/FilmPass.js +1 -1
  195. package/examples/jsm/postprocessing/GTAOPass.js +1 -1
  196. package/examples/jsm/postprocessing/GlitchPass.js +1 -1
  197. package/examples/jsm/postprocessing/HalftonePass.js +1 -1
  198. package/examples/jsm/postprocessing/OutlinePass.js +1 -1
  199. package/examples/jsm/postprocessing/OutputPass.js +1 -1
  200. package/examples/jsm/postprocessing/Pass.js +1 -1
  201. package/examples/jsm/postprocessing/RenderPass.js +1 -1
  202. package/examples/jsm/postprocessing/RenderPixelatedPass.js +1 -1
  203. package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
  204. package/examples/jsm/postprocessing/SAOPass.js +1 -1
  205. package/examples/jsm/postprocessing/SMAAPass.js +1 -1
  206. package/examples/jsm/postprocessing/SSAARenderPass.js +1 -1
  207. package/examples/jsm/postprocessing/SSAOPass.js +1 -1
  208. package/examples/jsm/postprocessing/SSRPass.js +1 -1
  209. package/examples/jsm/postprocessing/SavePass.js +1 -1
  210. package/examples/jsm/postprocessing/ShaderPass.js +1 -1
  211. package/examples/jsm/postprocessing/TAARenderPass.js +1 -1
  212. package/examples/jsm/postprocessing/TexturePass.js +1 -1
  213. package/examples/jsm/postprocessing/UnrealBloomPass.js +1 -1
  214. package/examples/jsm/renderers/CSS2DRenderer.js +1 -1
  215. package/examples/jsm/renderers/CSS3DRenderer.js +1 -1
  216. package/examples/jsm/renderers/Projector.js +1 -1
  217. package/examples/jsm/renderers/SVGRenderer.js +1 -1
  218. package/examples/jsm/shaders/BokehShader2.js +1 -1
  219. package/examples/jsm/shaders/ColorCorrectionShader.js +1 -1
  220. package/examples/jsm/shaders/ColorifyShader.js +1 -1
  221. package/examples/jsm/shaders/ConvolutionShader.js +1 -1
  222. package/examples/jsm/shaders/DepthLimitedBlurShader.js +1 -1
  223. package/examples/jsm/shaders/DotScreenShader.js +1 -1
  224. package/examples/jsm/shaders/FXAAShader.js +1 -1
  225. package/examples/jsm/shaders/FreiChenShader.js +1 -1
  226. package/examples/jsm/shaders/GTAOShader.js +1 -1
  227. package/examples/jsm/shaders/LuminosityHighPassShader.js +1 -1
  228. package/examples/jsm/shaders/NormalMapShader.js +1 -1
  229. package/examples/jsm/shaders/PoissonDenoiseShader.js +1 -1
  230. package/examples/jsm/shaders/SAOShader.js +1 -1
  231. package/examples/jsm/shaders/SMAAShader.js +1 -1
  232. package/examples/jsm/shaders/SSAOShader.js +1 -1
  233. package/examples/jsm/shaders/SSRShader.js +1 -1
  234. package/examples/jsm/shaders/SobelOperatorShader.js +1 -1
  235. package/examples/jsm/shaders/SubsurfaceScatteringShader.js +1 -1
  236. package/examples/jsm/shaders/ToonShader.js +1 -1
  237. package/examples/jsm/shaders/TriangleBlurShader.js +1 -1
  238. package/examples/jsm/shaders/VelocityShader.js +1 -1
  239. package/examples/jsm/shaders/VolumeShader.js +1 -1
  240. package/examples/jsm/transpiler/TSLEncoder.js +2 -2
  241. package/examples/jsm/transpiler/WGSLEncoder.js +1 -1
  242. package/examples/jsm/tsl/WebGLNodesHandler.js +3 -3
  243. package/examples/jsm/tsl/display/AfterImageNode.js +2 -2
  244. package/examples/jsm/tsl/display/AnaglyphPassNode.js +2 -2
  245. package/examples/jsm/tsl/display/AnamorphicNode.js +2 -2
  246. package/examples/jsm/tsl/display/BilateralBlurNode.js +2 -2
  247. package/examples/jsm/tsl/display/BleachBypass.js +1 -1
  248. package/examples/jsm/tsl/display/BloomNode.js +2 -2
  249. package/examples/jsm/tsl/display/CRT.js +1 -1
  250. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +2 -2
  251. package/examples/jsm/tsl/display/DenoiseNode.js +2 -2
  252. package/examples/jsm/tsl/display/DepthOfFieldNode.js +2 -2
  253. package/examples/jsm/tsl/display/DotScreenNode.js +2 -2
  254. package/examples/jsm/tsl/display/FSR1Node.js +2 -2
  255. package/examples/jsm/tsl/display/FXAANode.js +2 -2
  256. package/examples/jsm/tsl/display/FilmNode.js +2 -2
  257. package/examples/jsm/tsl/display/GTAONode.js +2 -2
  258. package/examples/jsm/tsl/display/GaussianBlurNode.js +2 -2
  259. package/examples/jsm/tsl/display/GodraysNode.js +2 -2
  260. package/examples/jsm/tsl/display/LensflareNode.js +2 -2
  261. package/examples/jsm/tsl/display/Lut3DNode.js +2 -2
  262. package/examples/jsm/tsl/display/MotionBlur.js +1 -1
  263. package/examples/jsm/tsl/display/OutlineNode.js +2 -2
  264. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
  265. package/examples/jsm/tsl/display/PixelationPassNode.js +2 -2
  266. package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
  267. package/examples/jsm/tsl/display/RetroPassNode.js +2 -2
  268. package/examples/jsm/tsl/display/SMAANode.js +2 -2
  269. package/examples/jsm/tsl/display/SSAAPassNode.js +2 -2
  270. package/examples/jsm/tsl/display/SSGINode.js +2 -2
  271. package/examples/jsm/tsl/display/SSRNode.js +2 -2
  272. package/examples/jsm/tsl/display/SSSNode.js +2 -2
  273. package/examples/jsm/tsl/display/Sepia.js +1 -1
  274. package/examples/jsm/tsl/display/Shape.js +1 -1
  275. package/examples/jsm/tsl/display/SharpenNode.js +2 -2
  276. package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
  277. package/examples/jsm/tsl/display/StereoCompositePassNode.js +2 -2
  278. package/examples/jsm/tsl/display/StereoPassNode.js +1 -1
  279. package/examples/jsm/tsl/display/TAAUNode.js +2 -2
  280. package/examples/jsm/tsl/display/TRAANode.js +2 -2
  281. package/examples/jsm/tsl/display/TransitionNode.js +2 -2
  282. package/examples/jsm/tsl/display/boxBlur.js +1 -1
  283. package/examples/jsm/tsl/display/depthAwareBlend.js +1 -1
  284. package/examples/jsm/tsl/display/hashBlur.js +1 -1
  285. package/examples/jsm/tsl/display/radialBlur.js +1 -1
  286. package/examples/jsm/tsl/lighting/DynamicLightsNode.js +2 -2
  287. package/examples/jsm/tsl/lighting/TiledLightsNode.js +2 -2
  288. package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +2 -2
  289. package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +2 -2
  290. package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +2 -2
  291. package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +2 -2
  292. package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +2 -2
  293. package/examples/jsm/tsl/math/Bayer.js +2 -2
  294. package/examples/jsm/tsl/shadows/TileShadowNode.js +2 -2
  295. package/examples/jsm/tsl/shadows/TileShadowNodeHelper.js +2 -2
  296. package/examples/jsm/tsl/utils/Raymarching.js +1 -1
  297. package/examples/jsm/utils/BufferGeometryUtils.js +1 -1
  298. package/examples/jsm/utils/CameraUtils.js +1 -1
  299. package/examples/jsm/utils/ColorUtils.js +1 -1
  300. package/examples/jsm/utils/GeometryCompressionUtils.js +1 -1
  301. package/examples/jsm/utils/GeometryUtils.js +1 -1
  302. package/examples/jsm/utils/LDrawUtils.js +1 -1
  303. package/examples/jsm/utils/SceneOptimizer.js +1 -1
  304. package/examples/jsm/utils/SceneUtils.js +1 -1
  305. package/examples/jsm/utils/ShadowMapViewer.js +1 -1
  306. package/examples/jsm/utils/ShadowMapViewerGPU.js +2 -2
  307. package/examples/jsm/utils/SkeletonUtils.js +1 -1
  308. package/examples/jsm/utils/UVsDebug.js +1 -1
  309. package/examples/jsm/utils/WebGLTextureUtils.js +1 -1
  310. package/examples/jsm/utils/WebGPUTextureUtils.js +2 -2
  311. package/examples/jsm/webxr/OculusHandModel.js +1 -1
  312. package/examples/jsm/webxr/OculusHandPointerModel.js +1 -1
  313. package/examples/jsm/webxr/Text2D.js +1 -1
  314. package/examples/jsm/webxr/XRControllerModelFactory.js +1 -1
  315. package/examples/jsm/webxr/XREstimatedLight.js +1 -1
  316. package/examples/jsm/webxr/XRHandModelFactory.js +1 -1
  317. package/examples/jsm/webxr/XRHandPrimitiveModel.js +1 -1
  318. package/examples/jsm/webxr/XRPlanes.js +1 -1
  319. package/package.json +1 -1
  320. package/src/profiler/ProfilerService.js +185 -42
package/build/three.cjs CHANGED
@@ -59718,14 +59718,22 @@ class TextureUtils {
59718
59718
  * __gnsx_profiler.downloadTrace() // download gnsx-trace.json for Speedscope / Perfetto
59719
59719
  * __gnsx_profiler.reset() // clear samples and trace
59720
59720
  * __gnsx_profiler.disable()
59721
+ *
59722
+ * Chrome trace: `tid=1` is synchronous work; `@profile` on async methods records the
59723
+ * promise lifetime on `tid=2` so long async does not flatten the main row. For manual
59724
+ * spans, use `beginSpan` / `endSpan` with `{ asyncTimeline: true }` in a `.finally()`.
59721
59725
  */
59722
59726
 
59723
59727
  const RING_SIZE = 120;
59724
59728
  const FRAME_BUDGET_MS = 1000 / 60;
59725
- /** Max events in the trace log (~50s at 60fps with 8 labels). */
59726
- const MAX_TRACE_EVENTS = 50_000;
59729
+ const TRACE_TID_MAIN = 1;
59730
+ const TRACE_TID_ASYNC = 2;
59727
59731
  const NOOP = () => {};
59728
59732
 
59733
+ const DUMMY_SPAN = Object.freeze( { label: '', t0: 0, _seq: 0 } );
59734
+ const NOOP_BEGIN_SPAN = () => DUMMY_SPAN;
59735
+ const NOOP_END_SPAN = () => {};
59736
+
59729
59737
  class ProfilerServiceClass {
59730
59738
 
59731
59739
  constructor() {
@@ -59739,7 +59747,7 @@ class ProfilerServiceClass {
59739
59747
  this.cursors = new Map();
59740
59748
  /** @type {Map<string, number>} */
59741
59749
  this.counts = new Map();
59742
- /** @type {Map<string, Array<{ startTime: number, startMark: string, traced: boolean }>>} */
59750
+ /** @type {Map<string, Array<{ startTime: number, startMark: string }>>} */
59743
59751
  this.marks = new Map();
59744
59752
  /** @type {ChromeTraceEvent[]} */
59745
59753
  this.traceEvents = [];
@@ -59765,6 +59773,8 @@ class ProfilerServiceClass {
59765
59773
  this.traceStartTime = performance.now();
59766
59774
  this.begin = this._beginImpl.bind( this );
59767
59775
  this.end = this._endImpl.bind( this );
59776
+ this.beginSpan = this._beginSpanImpl.bind( this );
59777
+ this.endSpan = this._endSpanImpl.bind( this );
59768
59778
  this._exposeGlobal();
59769
59779
  console.log( `[ProfilerService] auto-started from env (profile: ${this._profile})` );
59770
59780
 
@@ -59772,6 +59782,8 @@ class ProfilerServiceClass {
59772
59782
 
59773
59783
  this.begin = NOOP;
59774
59784
  this.end = NOOP;
59785
+ this.beginSpan = NOOP_BEGIN_SPAN;
59786
+ this.endSpan = NOOP_END_SPAN;
59775
59787
 
59776
59788
  }
59777
59789
 
@@ -59803,6 +59815,8 @@ class ProfilerServiceClass {
59803
59815
  this._enabled = true;
59804
59816
  this.begin = this._beginImpl.bind( this );
59805
59817
  this.end = this._endImpl.bind( this );
59818
+ this.beginSpan = this._beginSpanImpl.bind( this );
59819
+ this.endSpan = this._endSpanImpl.bind( this );
59806
59820
  this._exposeGlobal();
59807
59821
  console.log( `[ProfilerService] enabled (profile: ${this._profile}) — call __gnsx_profiler.report() or downloadTrace() from the console` );
59808
59822
 
@@ -59814,6 +59828,8 @@ class ProfilerServiceClass {
59814
59828
  this._enabled = false;
59815
59829
  this.begin = NOOP;
59816
59830
  this.end = NOOP;
59831
+ this.beginSpan = NOOP_BEGIN_SPAN;
59832
+ this.endSpan = NOOP_END_SPAN;
59817
59833
  console.log( '[ProfilerService] disabled' );
59818
59834
 
59819
59835
  }
@@ -59849,22 +59865,8 @@ class ProfilerServiceClass {
59849
59865
 
59850
59866
  }
59851
59867
 
59852
- const traced = this._profile === 'full' && this.traceEvents.length < MAX_TRACE_EVENTS;
59853
- if ( traced ) {
59854
-
59855
- this.traceEvents.push( {
59856
- name: label,
59857
- ph: 'B',
59858
- ts: this._getTraceTimestamp( startTime ),
59859
- pid: 1,
59860
- tid: 1,
59861
- cat: 'gnsx',
59862
- } );
59863
-
59864
- }
59865
-
59866
59868
  performance.mark( startMark );
59867
- stack.push( { startTime, startMark, traced } );
59869
+ stack.push( { startTime, startMark } );
59868
59870
 
59869
59871
  // Push onto the global call stack for exclusive-time tracking.
59870
59872
  this.callStack.push( { label, childTime: 0 } );
@@ -59882,13 +59884,61 @@ class ProfilerServiceClass {
59882
59884
  if ( stack.length === 0 ) this.marks.delete( label );
59883
59885
 
59884
59886
  const now = performance.now();
59885
- const { startTime, startMark, traced } = mark;
59887
+ const { startTime, startMark } = mark;
59886
59888
  const duration = now - startTime;
59887
59889
  const endMark = `gnsx:${label}:end:${++ this._markId}`;
59888
59890
 
59889
59891
  performance.mark( endMark );
59890
59892
  performance.measure( `gnsx:${label}`, startMark, endMark );
59891
59893
 
59894
+ this._commitDurationSample( label, startTime, duration, TRACE_TID_MAIN );
59895
+
59896
+ }
59897
+
59898
+ /**
59899
+ * Per-invocation span start (pair with {@link ProfilerServiceClass#endSpan}).
59900
+ * Safe for concurrent async with the same label.
59901
+ *
59902
+ * @param {string} label
59903
+ * @return {import('./ProfilerService.js').SpanHandle}
59904
+ */
59905
+ _beginSpanImpl( label ) {
59906
+
59907
+ const seq = ++ this._markId;
59908
+ const t0 = performance.now();
59909
+ const startMark = `gnsx:${label}:s${seq}:start`;
59910
+ performance.mark( startMark );
59911
+ return { label, t0, _seq: seq, _startMark: startMark };
59912
+
59913
+ }
59914
+
59915
+ /**
59916
+ * @param {import('./ProfilerService.js').SpanHandle} handle
59917
+ * @param {import('./ProfilerService.js').EndSpanOptions} [opts]
59918
+ */
59919
+ _endSpanImpl( handle, opts ) {
59920
+
59921
+ if ( handle._seq === 0 ) return;
59922
+
59923
+ const now = performance.now();
59924
+ const duration = now - handle.t0;
59925
+ const endMark = `gnsx:${handle.label}:s${handle._seq}:end`;
59926
+ performance.mark( endMark );
59927
+ performance.measure( `gnsx:${handle.label}#${handle._seq}`, handle._startMark, endMark );
59928
+
59929
+ const traceTid = opts?.asyncTimeline === true ? TRACE_TID_ASYNC : TRACE_TID_MAIN;
59930
+ this._commitDurationSample( handle.label, handle.t0, duration, traceTid );
59931
+
59932
+ }
59933
+
59934
+ /**
59935
+ * @param {string} label
59936
+ * @param {number} startTime
59937
+ * @param {number} durationMs
59938
+ * @param {typeof TRACE_TID_MAIN|typeof TRACE_TID_ASYNC} traceTid
59939
+ */
59940
+ _commitDurationSample( label, startTime, durationMs, traceTid ) {
59941
+
59892
59942
  let buffer = this.buffers.get( label );
59893
59943
  if ( ! buffer ) {
59894
59944
 
@@ -59900,7 +59950,7 @@ class ProfilerServiceClass {
59900
59950
  }
59901
59951
 
59902
59952
  const cursor = this.cursors.get( label );
59903
- buffer[ cursor ] = duration;
59953
+ buffer[ cursor ] = durationMs;
59904
59954
  this.cursors.set( label, ( cursor + 1 ) % RING_SIZE );
59905
59955
  this.counts.set( label, Math.min( ( this.counts.get( label ) + 1 ), RING_SIZE ) );
59906
59956
 
@@ -59912,7 +59962,7 @@ class ProfilerServiceClass {
59912
59962
  if ( top !== undefined && top.label === label ) {
59913
59963
 
59914
59964
  this.callStack.pop();
59915
- const selfTime = Math.max( 0, duration - top.childTime );
59965
+ const selfTime = Math.max( 0, durationMs - top.childTime );
59916
59966
 
59917
59967
  let selfBuffer = this.selfBuffers.get( label );
59918
59968
  if ( ! selfBuffer ) {
@@ -59931,7 +59981,7 @@ class ProfilerServiceClass {
59931
59981
 
59932
59982
  // Propagate inclusive duration to the parent scope's child accumulator.
59933
59983
  const parent = this.callStack.length > 0 ? this.callStack[ this.callStack.length - 1 ] : undefined;
59934
- if ( parent !== undefined ) parent.childTime += duration;
59984
+ if ( parent !== undefined ) parent.childTime += durationMs;
59935
59985
 
59936
59986
  } else {
59937
59987
 
@@ -59940,14 +59990,16 @@ class ProfilerServiceClass {
59940
59990
 
59941
59991
  }
59942
59992
 
59943
- if ( traced ) {
59993
+ if ( traceTid ) {
59944
59994
 
59995
+ const traceName = traceTid === TRACE_TID_ASYNC ? `${label} (promise)` : label;
59945
59996
  this.traceEvents.push( {
59946
- name: label,
59947
- ph: 'E',
59948
- ts: this._getTraceTimestamp( now ),
59997
+ name: traceName,
59998
+ ph: 'X',
59999
+ ts: Math.round( this._getTraceTimestamp( startTime ) ),
60000
+ dur: Math.max( 1, Math.round( durationMs * 1000 ) ),
59949
60001
  pid: 1,
59950
- tid: 1,
60002
+ tid: traceTid,
59951
60003
  cat: 'gnsx',
59952
60004
  } );
59953
60005
 
@@ -60058,13 +60110,53 @@ class ProfilerServiceClass {
60058
60110
  */
60059
60111
  exportChromeTrace() {
60060
60112
 
60113
+ const slices = [ ...this.traceEvents ];
60114
+ slices.sort( ( a, b ) => {
60115
+
60116
+ if ( a.ts !== b.ts ) return a.ts - b.ts;
60117
+ if ( a.tid !== b.tid ) return a.tid - b.tid;
60118
+ return a.name.localeCompare( b.name );
60119
+
60120
+ } );
60121
+ const hasAsync = slices.some( e => e.tid === TRACE_TID_ASYNC );
60122
+ /** @type {import('./ProfilerService.js').ChromeTraceMetadataEvent[]} */
60123
+ const prefix = [
60124
+ {
60125
+ cat: '__metadata',
60126
+ name: 'process_name',
60127
+ ph: 'M',
60128
+ pid: 1,
60129
+ tid: 0,
60130
+ ts: 0,
60131
+ args: { name: 'Genesys Profiler' },
60132
+ },
60133
+ {
60134
+ cat: '__metadata',
60135
+ name: 'thread_name',
60136
+ ph: 'M',
60137
+ pid: 1,
60138
+ tid: TRACE_TID_MAIN,
60139
+ ts: 0,
60140
+ args: { name: 'Main thread' },
60141
+ },
60142
+ ];
60143
+ if ( hasAsync ) {
60144
+
60145
+ prefix.push( {
60146
+ cat: '__metadata',
60147
+ name: 'thread_name',
60148
+ ph: 'M',
60149
+ pid: 1,
60150
+ tid: TRACE_TID_ASYNC,
60151
+ ts: 0,
60152
+ args: { name: 'Async (promise lifetime)' },
60153
+ } );
60154
+
60155
+ }
60156
+
60061
60157
  return {
60062
60158
  displayTimeUnit: 'ms',
60063
- traceEvents: [
60064
- { name: 'process_name', ph: 'M', pid: 1, args: { name: 'Genesys Profiler' } },
60065
- { name: 'thread_name', ph: 'M', pid: 1, tid: 1, args: { name: 'Main Thread' } },
60066
- ...this.traceEvents,
60067
- ],
60159
+ traceEvents: [ ...prefix, ...slices ],
60068
60160
  };
60069
60161
 
60070
60162
  }
@@ -60169,22 +60261,38 @@ class ProfilerServiceClass {
60169
60261
  * @property {number|undefined} selfFrameBudget Exclusive time as percentage of a 60 fps frame budget.
60170
60262
  */
60171
60263
 
60264
+ /**
60265
+ * @typedef {Object} SpanHandle
60266
+ * @property {string} label
60267
+ * @property {number} t0
60268
+ * @property {number} _seq
60269
+ * @property {string} _startMark
60270
+ */
60271
+
60272
+ /**
60273
+ * @typedef {Object} EndSpanOptions
60274
+ * @property {boolean} [asyncTimeline] When true, trace slice uses `tid=2` (virtual async row).
60275
+ */
60276
+
60172
60277
  /**
60173
60278
  * @typedef {Object} ChromeTraceEvent
60174
60279
  * @property {string} name
60175
- * @property {'B'|'E'} ph
60280
+ * @property {'X'} ph
60176
60281
  * @property {number} ts
60282
+ * @property {number} dur
60177
60283
  * @property {1} pid
60178
- * @property {1} tid
60284
+ * @property {number} tid
60179
60285
  * @property {'gnsx'} cat
60180
60286
  */
60181
60287
 
60182
60288
  /**
60183
60289
  * @typedef {Object} ChromeTraceMetadataEvent
60290
+ * @property {'__metadata'} cat
60184
60291
  * @property {'process_name'|'thread_name'} name
60185
60292
  * @property {'M'} ph
60186
60293
  * @property {1} pid
60187
- * @property {1} [tid]
60294
+ * @property {number} [tid]
60295
+ * @property {0} ts
60188
60296
  * @property {{ name: string }} args
60189
60297
  */
60190
60298
 
@@ -60200,28 +60308,38 @@ class ProfilerServiceClass {
60200
60308
 
60201
60309
  const ProfilerService = new ProfilerServiceClass();
60202
60310
 
60311
+ function isThenable( x ) {
60312
+
60313
+ return (
60314
+ ( typeof x === 'object' || typeof x === 'function' ) &&
60315
+ x !== null &&
60316
+ typeof x.then === 'function'
60317
+ );
60318
+
60319
+ }
60320
+
60203
60321
  function applyProfileToMethod( label, descriptor ) {
60204
60322
 
60205
60323
  const original = descriptor.value;
60206
60324
 
60207
60325
  function profiled( ...args ) {
60208
60326
 
60209
- ProfilerService.begin( label );
60327
+ const span = ProfilerService.beginSpan( label );
60210
60328
  try {
60211
60329
 
60212
60330
  const result = original.apply( this, args );
60213
- if ( result instanceof Promise ) {
60331
+ if ( isThenable( result ) ) {
60214
60332
 
60215
- return result.finally( () => ProfilerService.end( label ) );
60333
+ return Promise.resolve( result ).finally( () => ProfilerService.endSpan( span, { asyncTimeline: true } ) );
60216
60334
 
60217
60335
  }
60218
60336
 
60219
- ProfilerService.end( label );
60337
+ ProfilerService.endSpan( span );
60220
60338
  return result;
60221
60339
 
60222
60340
  } catch ( error ) {
60223
60341
 
60224
- ProfilerService.end( label );
60342
+ ProfilerService.endSpan( span );
60225
60343
  throw error;
60226
60344
 
60227
60345
  }
@@ -60235,14 +60353,39 @@ function applyProfileToMethod( label, descriptor ) {
60235
60353
 
60236
60354
  /**
60237
60355
  * Method decorator that profiles the decorated method.
60238
- * The label is automatically set to `ClassName.methodName`.
60356
+ * Default label: `ClassName.methodName`. Pass a custom tag via `@profile('My tag')`.
60239
60357
  *
60358
+ * @param {Object|string} [targetOrTag]
60359
+ * @param {string|symbol} [propertyKey]
60360
+ * @param {PropertyDescriptor} [descriptor]
60361
+ * @return {PropertyDescriptor|function(Object, string|symbol, PropertyDescriptor): PropertyDescriptor}
60362
+ */
60363
+ function profile( targetOrTag, propertyKey, descriptor ) {
60364
+
60365
+ if ( arguments.length === 0 ) {
60366
+
60367
+ return defaultProfileDecorator;
60368
+
60369
+ }
60370
+
60371
+ if ( arguments.length === 1 && typeof targetOrTag === 'string' ) {
60372
+
60373
+ const customTag = targetOrTag;
60374
+ return ( target, key, desc ) => applyProfileToMethod( customTag, desc );
60375
+
60376
+ }
60377
+
60378
+ return defaultProfileDecorator( targetOrTag, propertyKey, descriptor );
60379
+
60380
+ }
60381
+
60382
+ /**
60240
60383
  * @param {Object} target
60241
60384
  * @param {string|symbol} propertyKey
60242
60385
  * @param {PropertyDescriptor} descriptor
60243
60386
  * @return {PropertyDescriptor}
60244
60387
  */
60245
- function profile( target, propertyKey, descriptor ) {
60388
+ function defaultProfileDecorator( target, propertyKey, descriptor ) {
60246
60389
 
60247
60390
  const className = target.constructor?.name ?? 'Unknown';
60248
60391
  return applyProfileToMethod( `${className}.${String( propertyKey )}`, descriptor );