@realsee/five-webgpu 1.0.0-alpha.12 → 1.0.0-alpha.14

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 (431) hide show
  1. package/_virtual/_rolldown/runtime.js +3 -3
  2. package/docs/assets/hierarchy.js +1 -1
  3. package/docs/assets/navigation.js +1 -1
  4. package/docs/assets/search.js +1 -1
  5. package/docs/classes/index.AdaptiveLuminancePass.html +1 -1
  6. package/docs/classes/index.BoundingMesh.html +1 -1
  7. package/docs/classes/index.Camera.html +1 -1
  8. package/docs/classes/index.EyeDomeLightingPass.html +1 -1
  9. package/docs/classes/index.Five.html +41 -32
  10. package/docs/classes/index.FivePass.html +1 -1
  11. package/docs/classes/index.FiveRenderer.html +7 -2
  12. package/docs/classes/index.FlowingFireworks3DPass.html +1 -1
  13. package/docs/classes/index.FlowingLight2DPass.html +1 -1
  14. package/docs/classes/index.FlowingLight3DPass.html +1 -1
  15. package/docs/classes/index.GaussianBlurPass.html +1 -1
  16. package/docs/classes/index.InternalWebGPURenderer.html +4 -5
  17. package/docs/classes/index.Model.html +1 -1
  18. package/docs/classes/index.ModelScene.html +1 -1
  19. package/docs/classes/index.NetworkSubscribe.html +1 -1
  20. package/docs/classes/index.PBMCustomNode.html +1 -1
  21. package/docs/classes/index.PBMGaussianSplattingNodeMaterial.html +9 -9
  22. package/docs/classes/index.PBMGaussianSplattingObject.html +49 -11
  23. package/docs/classes/index.PBMGaussianSplattingRenderMesh.html +71 -16
  24. package/docs/classes/index.PBMGroup.html +1 -1
  25. package/docs/classes/index.PBMMesh.html +1 -1
  26. package/docs/classes/index.PBMMeshBasicMaterial.html +1 -1
  27. package/docs/classes/index.PBMMeshBasicNodeMaterial.html +1 -1
  28. package/docs/classes/index.PBMMeshPanoOnlyMaterial.html +1 -1
  29. package/docs/classes/index.PBMMeshPanoOnlyNodeMaterial.html +1 -1
  30. package/docs/classes/index.PBMMeshPhongMaterial.html +1 -1
  31. package/docs/classes/index.PBMMeshPhongNodeMaterial.html +1 -1
  32. package/docs/classes/index.PBMMeshPhysicalMaterial.html +1 -1
  33. package/docs/classes/index.PBMMeshPhysicalNodeMaterial.html +1 -1
  34. package/docs/classes/index.PBMPanoFilter.html +1 -1
  35. package/docs/classes/index.PBMPointCloud.html +1 -1
  36. package/docs/classes/index.PBMPointCloudMaterial.html +1 -1
  37. package/docs/classes/index.PBMSkinnedMesh.html +1 -1
  38. package/docs/classes/index.PBMUpdateable.html +1 -1
  39. package/docs/classes/index.PanoCircleMesh.html +1 -1
  40. package/docs/classes/index.PanoCircleMeshCustom.html +1 -1
  41. package/docs/classes/index.PanoCircleMeshSolid.html +1 -1
  42. package/docs/classes/index.Parameter.html +24 -22
  43. package/docs/classes/index.Scene.html +1 -1
  44. package/docs/classes/index.Subscribe.html +1 -1
  45. package/docs/classes/index.Tile3D.html +22 -22
  46. package/docs/classes/index.TileNode.html +2 -2
  47. package/docs/classes/index.TrajectoryNode.html +1 -1
  48. package/docs/classes/index.Work.html +15 -22
  49. package/docs/classes/index.WorkResolvedObserver.html +22 -22
  50. package/docs/functions/index.createWorks.html +1 -1
  51. package/docs/functions/index.parseWork.html +1 -1
  52. package/docs/hierarchy.html +1 -1
  53. package/docs/interfaces/index.AddableObject.html +1 -1
  54. package/docs/interfaces/index.AjaxOptions.html +1 -1
  55. package/docs/interfaces/index.BaseEvent.html +1 -1
  56. package/docs/interfaces/index.Clock.html +1 -1
  57. package/docs/interfaces/index.DeviceProfile.html +2 -2
  58. package/docs/interfaces/index.EventCallback.html +3 -3
  59. package/docs/interfaces/index.GestureEvent.html +1 -1
  60. package/docs/interfaces/index.IPBMMaterial.html +1 -1
  61. package/docs/interfaces/index.ImageOptions.html +1 -1
  62. package/docs/interfaces/index.IntersectEvent.html +1 -1
  63. package/docs/interfaces/index.IntersectMesh.html +1 -1
  64. package/docs/interfaces/index.IntersectMeshInterface.html +1 -1
  65. package/docs/interfaces/index.Intersection.html +1 -1
  66. package/docs/interfaces/index.LooseWorkWithExtrinsics.html +8 -8
  67. package/docs/interfaces/index.ModeChangeEvent.html +1 -1
  68. package/docs/interfaces/index.ModelControllerCustomInitArgs.html +1 -1
  69. package/docs/interfaces/index.ModelEvent.html +1 -1
  70. package/docs/interfaces/index.ModelSceneEvent.html +1 -1
  71. package/docs/interfaces/index.ModelTileEvent.html +1 -1
  72. package/docs/interfaces/index.MovePanoOptions.html +1 -1
  73. package/docs/interfaces/index.NetworkAbortError.html +1 -1
  74. package/docs/interfaces/index.NetworkFirbiddenError.html +1 -1
  75. package/docs/interfaces/index.NetworkOptions.html +1 -1
  76. package/docs/interfaces/index.NetworkProxyError.html +1 -1
  77. package/docs/interfaces/index.NetworkResourceEvent.html +1 -1
  78. package/docs/interfaces/index.NetworkResponseError.html +1 -1
  79. package/docs/interfaces/index.NetworkTimeoutError.html +1 -1
  80. package/docs/interfaces/index.ObjectEvent.html +1 -1
  81. package/docs/interfaces/index.PBMGaussianSplattingNodeMaterialOptions.html +3 -3
  82. package/docs/interfaces/index.PanoCircleMeshInterface.html +1 -1
  83. package/docs/interfaces/index.PanoEvent.html +1 -1
  84. package/docs/interfaces/index.PanoPrepareEvent.html +1 -1
  85. package/docs/interfaces/index.PanoTextureEvent.html +1 -1
  86. package/docs/interfaces/index.PanoramaControllerCustomInitArgs.html +1 -1
  87. package/docs/interfaces/index.PanoramaLikeControllerCustomInitArgs.html +1 -1
  88. package/docs/interfaces/index.ParameterMaterialValue.html +8 -6
  89. package/docs/interfaces/index.ParameterTilesetValue.html +15 -15
  90. package/docs/interfaces/index.ParameterValue.html +21 -19
  91. package/docs/interfaces/index.Pose.html +1 -1
  92. package/docs/interfaces/index.RenderEvent.html +1 -1
  93. package/docs/interfaces/index.ResolvedParameterValue.html +22 -20
  94. package/docs/interfaces/index.SplatData.html +10 -6
  95. package/docs/interfaces/index.State.html +1 -1
  96. package/docs/interfaces/index.StateEvent.html +1 -1
  97. package/docs/interfaces/index.TextureOptions.html +1 -1
  98. package/docs/interfaces/index.Tile3DOptions.html +2 -2
  99. package/docs/interfaces/index.TopviewControllerCustomInitArgs.html +1 -1
  100. package/docs/interfaces/index.VRPanoramaControllerCustomInitArgs.html +1 -1
  101. package/docs/interfaces/index.ViewLayer.html +22 -22
  102. package/docs/interfaces/index.WorkCubeHdrGainmapImage.html +2 -2
  103. package/docs/interfaces/index.WorkCubeImage.html +2 -2
  104. package/docs/interfaces/index.WorkImage.html +5 -5
  105. package/docs/interfaces/index.WorkInitial.html +8 -8
  106. package/docs/interfaces/index.WorkInitialJson.html +2 -2
  107. package/docs/interfaces/index.WorkJson.html +2 -4
  108. package/docs/interfaces/index.WorkModel.html +8 -8
  109. package/docs/interfaces/index.WorkModelJson.html +2 -2
  110. package/docs/interfaces/index.WorkModelLayer.html +6 -6
  111. package/docs/interfaces/index.WorkModelLayerJson.html +2 -2
  112. package/docs/interfaces/index.WorkObserver.html +23 -23
  113. package/docs/interfaces/index.WorkObserverJson.html +2 -2
  114. package/docs/interfaces/index.WorkPanoramaJson.html +2 -2
  115. package/docs/interfaces/index.WorkPanoramasJson.html +2 -2
  116. package/docs/interfaces/index.WorkTile.html +5 -5
  117. package/docs/interfaces/index.WorkVideo.html +4 -4
  118. package/docs/interfaces/index.WorksEvent.html +1 -1
  119. package/docs/interfaces/index.XRControllerEvent.html +1 -1
  120. package/docs/interfaces/index.XRGestureEvent.html +2 -2
  121. package/docs/interfaces/index.XRPanoramaControllerCustomInitArgs.html +1 -1
  122. package/docs/interfaces/index.XRSessionEvent.html +1 -1
  123. package/docs/modules/index.html +1 -1
  124. package/docs/types/index.LegacyEventType.html +3 -3
  125. package/docs/types/index.OutputTextureDataType.html +1 -1
  126. package/docs/types/index.ParseOptions.html +8 -8
  127. package/docs/types/index.PointCloudTransparencyMode.html +2 -0
  128. package/docs/types/index.Works.html +1 -1
  129. package/docs/variables/index.loadAt3d.html +2 -0
  130. package/docs/variables/index.loadDome.html +2 -0
  131. package/docs/variables/index.loadDomez.html +2 -0
  132. package/docs/variables/index.loadGltf.html +2 -0
  133. package/docs/variables/index.loadPbm.html +2 -0
  134. package/docs/variables/index.loadPly.html +2 -0
  135. package/five/application/five.d.ts +13 -0
  136. package/five/chunks/at3d.js +338 -0
  137. package/five/chunks/at3d.mjs +338 -0
  138. package/five/chunks/dome.js +338 -0
  139. package/five/chunks/dome.mjs +338 -0
  140. package/five/chunks/domez.js +338 -0
  141. package/five/chunks/domez.mjs +338 -0
  142. package/five/chunks/fbx.js +338 -0
  143. package/five/chunks/fbx.mjs +338 -0
  144. package/five/chunks/fflate.js +338 -0
  145. package/five/chunks/fflate.mjs +338 -0
  146. package/five/chunks/glTF-helpers.js +804 -0
  147. package/five/chunks/glTF-helpers.mjs +804 -0
  148. package/five/chunks/gltf.js +338 -0
  149. package/five/chunks/gltf.mjs +338 -0
  150. package/five/chunks/imageBitmap.js +338 -0
  151. package/five/chunks/imageBitmap.mjs +338 -0
  152. package/five/chunks/imageSupport.js +338 -0
  153. package/five/chunks/imageSupport.mjs +338 -0
  154. package/five/chunks/lzma.js +383 -0
  155. package/five/chunks/lzma.mjs +383 -0
  156. package/five/chunks/memoryUsage.js +339 -0
  157. package/five/chunks/memoryUsage.mjs +339 -0
  158. package/five/chunks/minimal.js +338 -0
  159. package/five/chunks/minimal.mjs +338 -0
  160. package/five/chunks/pbm.js +338 -0
  161. package/five/chunks/pbm.mjs +338 -0
  162. package/five/chunks/pbmGaussianSplattingObject.js +338 -0
  163. package/five/chunks/pbmGaussianSplattingObject.mjs +338 -0
  164. package/five/chunks/pbmMeshMaterial.js +338 -0
  165. package/five/chunks/pbmMeshMaterial.mjs +338 -0
  166. package/five/chunks/pick.js +338 -0
  167. package/five/chunks/pick.mjs +338 -0
  168. package/five/chunks/ply.js +339 -0
  169. package/five/chunks/ply.mjs +339 -0
  170. package/five/chunks/spz.js +364 -0
  171. package/five/chunks/spz.mjs +364 -0
  172. package/five/controllers/xrPanorama.d.ts +13 -0
  173. package/five/core/internalWebGPURenderer.d.ts +0 -3
  174. package/five/core/panoVideo.d.ts +2 -0
  175. package/five/core/webglBlendEquationFix.d.ts +41 -0
  176. package/five/gaussian-splatting/arena/splatArena.d.ts +227 -0
  177. package/five/gaussian-splatting/cullConstants.d.ts +68 -0
  178. package/five/gaussian-splatting/hybridConstants.d.ts +60 -0
  179. package/five/gaussian-splatting/instancePacking.d.ts +46 -0
  180. package/five/gaussian-splatting/mirrors/layoutMirror.d.ts +44 -0
  181. package/five/gaussian-splatting/mirrors/mirrorBuffer.d.ts +72 -0
  182. package/five/gaussian-splatting/mirrors/mirrorSet.d.ts +17 -0
  183. package/five/gaussian-splatting/mirrors/objectParamsMirror.d.ts +35 -0
  184. package/five/gaussian-splatting/mirrors/transformMirror.d.ts +26 -0
  185. package/five/gaussian-splatting/pipelines/gpuSortPipeline.d.ts +5 -31
  186. package/five/gaussian-splatting/pipelines/pipelineMode.d.ts +1 -2
  187. package/five/gaussian-splatting/sh-core/codec.d.ts +13 -0
  188. package/five/gaussian-splatting/sh-core/constants.d.ts +29 -0
  189. package/five/gaussian-splatting/sh-core/index.d.ts +4 -0
  190. package/five/gaussian-splatting/sh-core/rebakePolicy.d.ts +20 -0
  191. package/five/gaussian-splatting/sh-core/texelRange.d.ts +18 -0
  192. package/five/gaussian-splatting/shAssembler.d.ts +14 -0
  193. package/five/gaussian-splatting/shBakeScheduler.d.ts +26 -0
  194. package/five/gaussian-splatting/shBaker.d.ts +44 -0
  195. package/five/gaussian-splatting/shTileResource.d.ts +22 -0
  196. package/five/gaussian-splatting/splatAssembler.d.ts +1 -1
  197. package/five/gaussian-splatting/transformStore.d.ts +2 -2
  198. package/five/gaussian-splatting/worker/decodeWorker.d.ts +72 -0
  199. package/five/index.d.ts +0 -1
  200. package/five/index.js +138 -640
  201. package/five/index.mjs +229 -29261
  202. package/five/model/index.d.ts +18 -6
  203. package/five/model/loaders/glTF-helpers/extensions/KHR_gaussian_splatting_compression_spz.d.ts +1 -1
  204. package/five/model/loaders/glTF-helpers/extensions/KHR_gaussian_splatting_compression_spz_2.d.ts +1 -1
  205. package/five/model/loaders/ply.d.ts +22 -6
  206. package/five/model/loaders/spz.d.ts +9 -49
  207. package/five/model/loaders/spz.worker.d.ts +37 -0
  208. package/five/model/materials/pbmGaussianSplattingNodeMaterial.d.ts +6 -12
  209. package/five/model/objects/pbmGaussianSplattingObject.d.ts +91 -6
  210. package/five/model/objects/pbmGaussianSplattingRenderMesh.d.ts +357 -15
  211. package/five/model/parameter.d.ts +4 -0
  212. package/five/renderer/compute-renderers/binned/binned-core.d.ts +45 -2
  213. package/five/renderer/compute-renderers/binned/binned-pipelines.d.ts +82 -1
  214. package/five/renderer/compute-renderers/color-space.d.ts +13 -0
  215. package/five/renderer/compute-renderers/composite-pipelines.d.ts +36 -0
  216. package/five/renderer/compute-renderers/frame-plan.d.ts +166 -0
  217. package/five/renderer/compute-renderers/gsplat-hybrid-renderer.d.ts +386 -0
  218. package/five/renderer/compute-renderers/pointcloud-compute-renderer.d.ts +101 -16
  219. package/five/renderer/compute-renderers/shaders/composite-blend.d.ts +2 -0
  220. package/five/renderer/compute-renderers/shaders/gsplatHybridIndirect.d.ts +2 -0
  221. package/five/renderer/compute-renderers/shaders/gsplatProjector.d.ts +2 -0
  222. package/five/renderer/compute-renderers/shaders/gsplatQuad.d.ts +2 -0
  223. package/five/renderer/compute-renderers/shaders/lib/write-additive.d.ts +2 -0
  224. package/five/renderer/compute-renderers/shaders/lib/write-blend.d.ts +2 -0
  225. package/five/renderer/compute-renderers/shaders/lib/write-opaque.d.ts +2 -0
  226. package/five/renderer/compute-renderers/tile-uniform-writer.d.ts +70 -0
  227. package/five/renderer/compute-renderers/transparency-buffers.d.ts +59 -0
  228. package/five/renderer/compute-renderers/transparency-math.d.ts +70 -0
  229. package/five/renderer/compute-renderers/transparency-settings.d.ts +24 -0
  230. package/five/renderer/compute-renderers/uniform-layout.d.ts +11 -2
  231. package/five/renderer/five-renderer.d.ts +28 -3
  232. package/five/renderer/index.d.ts +1 -1
  233. package/five/renderer/postprocessing/passes/pass.js +3 -3
  234. package/five/renderer/postprocessing/passes/pass.mjs +3 -3
  235. package/five/renderer/tools/full-screen-quad.js +3 -3
  236. package/five/renderer/tools/full-screen-quad.mjs +3 -3
  237. package/five/texture/videoTextureBridge.d.ts +152 -0
  238. package/five/thirdparty/sha256.d.ts +149 -0
  239. package/five/utils/calculateThreeMouse.js +3 -3
  240. package/five/utils/calculateThreeMouse.mjs +3 -3
  241. package/five/utils/distance.js +3 -3
  242. package/five/utils/distance.mjs +3 -3
  243. package/five/utils/isNil.js +3 -3
  244. package/five/utils/isNil.mjs +3 -3
  245. package/five/utils/memoryUsage.d.ts +1 -1
  246. package/five/utils/uuid.js +3 -3
  247. package/five/utils/uuid.mjs +3 -3
  248. package/five/work/work.d.ts +0 -7
  249. package/five/work/workJsonType.d.ts +0 -2
  250. package/gltf-loader/index.js +3 -3
  251. package/gltf-loader/index.mjs +3 -50
  252. package/line/index.js +3 -3
  253. package/line/index.mjs +3 -88
  254. package/package.json +1 -1
  255. package/plugins/BackgroundPlugin/Controller.js +4 -4
  256. package/plugins/BackgroundPlugin/Controller.mjs +4 -4
  257. package/plugins/BackgroundPlugin/index.js +3 -3
  258. package/plugins/BackgroundPlugin/index.mjs +3 -3
  259. package/plugins/BasePlugin/index.js +3 -3
  260. package/plugins/BasePlugin/index.mjs +3 -3
  261. package/plugins/CSS2DPlugin/Controller.js +3 -3
  262. package/plugins/CSS2DPlugin/Controller.mjs +3 -3
  263. package/plugins/CSS2DPlugin/index.js +3 -3
  264. package/plugins/CSS2DPlugin/index.mjs +3 -3
  265. package/plugins/CSS2DPlugin/style.css_raw.js +4 -4
  266. package/plugins/CSS2DPlugin/style.css_raw.mjs +4 -4
  267. package/plugins/CSS3DPlugin/Controller.js +3 -3
  268. package/plugins/CSS3DPlugin/Controller.mjs +3 -3
  269. package/plugins/CSS3DPlugin/index.js +3 -3
  270. package/plugins/CSS3DPlugin/index.mjs +3 -3
  271. package/plugins/CSS3DPlugin/style.css_raw.js +4 -4
  272. package/plugins/CSS3DPlugin/style.css_raw.mjs +4 -4
  273. package/plugins/FloorplanPlugin/Controller.js +3 -3
  274. package/plugins/FloorplanPlugin/Controller.mjs +3 -3
  275. package/plugins/FloorplanPlugin/index.js +3 -3
  276. package/plugins/FloorplanPlugin/index.mjs +3 -3
  277. package/plugins/FloorplanPlugin/render/assets.js +3 -3
  278. package/plugins/FloorplanPlugin/render/assets.mjs +3 -3
  279. package/plugins/FloorplanPlugin/render/index.js +3 -3
  280. package/plugins/FloorplanPlugin/render/index.mjs +3 -3
  281. package/plugins/FloorplanPlugin/render/isPointInPolygon.js +3 -3
  282. package/plugins/FloorplanPlugin/render/isPointInPolygon.mjs +3 -3
  283. package/plugins/FloorplanPlugin/render/renderFloor.js +3 -3
  284. package/plugins/FloorplanPlugin/render/renderFloor.mjs +3 -3
  285. package/plugins/FloorplanPlugin/render/roomLabelVisibility.js +3 -3
  286. package/plugins/FloorplanPlugin/render/roomLabelVisibility.mjs +3 -3
  287. package/plugins/FloorplanPlugin/render/style.css_raw.js +4 -4
  288. package/plugins/FloorplanPlugin/render/style.css_raw.mjs +4 -4
  289. package/plugins/FloorplanPlugin/utils/changeMode.js +3 -3
  290. package/plugins/FloorplanPlugin/utils/changeMode.mjs +3 -3
  291. package/plugins/FloorplanPlugin/utils/changeModelCanvasOpacity.js +3 -3
  292. package/plugins/FloorplanPlugin/utils/changeModelCanvasOpacity.mjs +3 -3
  293. package/plugins/FloorplanPlugin/utils/correctFiveState.js +3 -3
  294. package/plugins/FloorplanPlugin/utils/correctFiveState.mjs +3 -3
  295. package/plugins/FloorplanPlugin/utils/equal.js +3 -3
  296. package/plugins/FloorplanPlugin/utils/equal.mjs +3 -3
  297. package/plugins/FloorplanPlugin/utils/filter.js +3 -3
  298. package/plugins/FloorplanPlugin/utils/filter.mjs +3 -3
  299. package/plugins/FloorplanPlugin/utils/fiveModelLoad.js +3 -3
  300. package/plugins/FloorplanPlugin/utils/fiveModelLoad.mjs +3 -3
  301. package/plugins/FloorplanPlugin/utils/formatData.js +3 -3
  302. package/plugins/FloorplanPlugin/utils/formatData.mjs +3 -3
  303. package/plugins/FloorplanPlugin/utils/formatFloorplanJson.js +3 -3
  304. package/plugins/FloorplanPlugin/utils/formatFloorplanJson.mjs +3 -3
  305. package/plugins/FloorplanPlugin/utils/formatPosition.js +3 -3
  306. package/plugins/FloorplanPlugin/utils/formatPosition.mjs +3 -3
  307. package/plugins/FloorplanPlugin/utils/getDistanceFromModel.js +3 -3
  308. package/plugins/FloorplanPlugin/utils/getDistanceFromModel.mjs +3 -3
  309. package/plugins/FloorplanPlugin/utils/getPxmm.js +3 -3
  310. package/plugins/FloorplanPlugin/utils/getPxmm.mjs +3 -3
  311. package/plugins/FloorplanPlugin/utils/isTruelyObject.js +3 -3
  312. package/plugins/FloorplanPlugin/utils/isTruelyObject.mjs +3 -3
  313. package/plugins/FloorplanPlugin/utils/nearlyEqual.js +3 -3
  314. package/plugins/FloorplanPlugin/utils/nearlyEqual.mjs +3 -3
  315. package/plugins/FloorplanPlugin/utils/polylabel.js +3 -3
  316. package/plugins/FloorplanPlugin/utils/polylabel.mjs +3 -3
  317. package/plugins/FloorplanPlugin/utils/to.js +3 -3
  318. package/plugins/FloorplanPlugin/utils/to.mjs +3 -3
  319. package/plugins/GaussianSplattingEntranceAnimationPlugin/Controller.d.ts +6 -0
  320. package/plugins/GaussianSplattingEntranceAnimationPlugin/Controller.js +3 -3
  321. package/plugins/GaussianSplattingEntranceAnimationPlugin/Controller.mjs +3 -3
  322. package/plugins/GaussianSplattingEntranceAnimationPlugin/index.js +3 -3
  323. package/plugins/GaussianSplattingEntranceAnimationPlugin/index.mjs +3 -3
  324. package/plugins/Object3DHelperPlugin/Controller.js +3 -3
  325. package/plugins/Object3DHelperPlugin/Controller.mjs +3 -3
  326. package/plugins/Object3DHelperPlugin/Controllers/BaseController.js +3 -3
  327. package/plugins/Object3DHelperPlugin/Controllers/BaseController.mjs +3 -3
  328. package/plugins/Object3DHelperPlugin/Controllers/BoundingBoxController.js +3 -3
  329. package/plugins/Object3DHelperPlugin/Controllers/BoundingBoxController.mjs +3 -3
  330. package/plugins/Object3DHelperPlugin/Controllers/MoveController.js +3 -3
  331. package/plugins/Object3DHelperPlugin/Controllers/MoveController.mjs +3 -3
  332. package/plugins/Object3DHelperPlugin/Controllers/RotateController.js +3 -3
  333. package/plugins/Object3DHelperPlugin/Controllers/RotateController.mjs +3 -3
  334. package/plugins/Object3DHelperPlugin/FiveControllerWrapper.js +3 -3
  335. package/plugins/Object3DHelperPlugin/FiveControllerWrapper.mjs +3 -3
  336. package/plugins/Object3DHelperPlugin/Helper/BaseHelper.js +3 -3
  337. package/plugins/Object3DHelperPlugin/Helper/BaseHelper.mjs +3 -3
  338. package/plugins/Object3DHelperPlugin/Helper/BoundingBoxHelper.js +3 -3
  339. package/plugins/Object3DHelperPlugin/Helper/BoundingBoxHelper.mjs +3 -3
  340. package/plugins/Object3DHelperPlugin/Helper/MoveHelper.js +3 -3
  341. package/plugins/Object3DHelperPlugin/Helper/MoveHelper.mjs +3 -3
  342. package/plugins/Object3DHelperPlugin/Helper/RotateHelper.js +3 -3
  343. package/plugins/Object3DHelperPlugin/Helper/RotateHelper.mjs +3 -3
  344. package/plugins/Object3DHelperPlugin/constant.js +3 -3
  345. package/plugins/Object3DHelperPlugin/constant.mjs +3 -3
  346. package/plugins/Object3DHelperPlugin/index.js +3 -3
  347. package/plugins/Object3DHelperPlugin/index.mjs +3 -3
  348. package/plugins/Object3DHelperPlugin/utils/ArrowGroup.js +3 -3
  349. package/plugins/Object3DHelperPlugin/utils/ArrowGroup.mjs +3 -3
  350. package/plugins/Object3DHelperPlugin/utils/CenterHandle.js +3 -3
  351. package/plugins/Object3DHelperPlugin/utils/CenterHandle.mjs +3 -3
  352. package/plugins/Object3DHelperPlugin/utils/PlaneHandle.js +3 -3
  353. package/plugins/Object3DHelperPlugin/utils/PlaneHandle.mjs +3 -3
  354. package/plugins/Object3DHelperPlugin/utils/calculateScaleByCamera.js +3 -3
  355. package/plugins/Object3DHelperPlugin/utils/calculateScaleByCamera.mjs +3 -3
  356. package/plugins/Object3DHelperPlugin/utils/cameraHooks.js +3 -3
  357. package/plugins/Object3DHelperPlugin/utils/cameraHooks.mjs +3 -3
  358. package/plugins/Object3DHelperPlugin/utils/direction.js +3 -3
  359. package/plugins/Object3DHelperPlugin/utils/direction.mjs +3 -3
  360. package/plugins/Object3DHelperPlugin/utils/getMouseRaycaster.js +3 -3
  361. package/plugins/Object3DHelperPlugin/utils/getMouseRaycaster.mjs +3 -3
  362. package/plugins/Object3DHelperPlugin/utils/getOrthographicCameraDirection.js +3 -3
  363. package/plugins/Object3DHelperPlugin/utils/getOrthographicCameraDirection.mjs +3 -3
  364. package/plugins/Object3DHelperPlugin/utils/setObjectQuaternion.js +3 -3
  365. package/plugins/Object3DHelperPlugin/utils/setObjectQuaternion.mjs +3 -3
  366. package/plugins/Object3DHelperPlugin/utils/solidGuide.js +3 -3
  367. package/plugins/Object3DHelperPlugin/utils/solidGuide.mjs +3 -3
  368. package/plugins/Object3DHelperPlugin/utils/tipsDom.js +3 -3
  369. package/plugins/Object3DHelperPlugin/utils/tipsDom.mjs +3 -3
  370. package/plugins/PanoAnimePlugin/Controller.js +3 -3
  371. package/plugins/PanoAnimePlugin/Controller.mjs +3 -3
  372. package/plugins/PanoAnimePlugin/index.js +3 -3
  373. package/plugins/PanoAnimePlugin/index.mjs +3 -3
  374. package/plugins/WordPassPlugin/Controller.js +3 -3
  375. package/plugins/WordPassPlugin/Controller.mjs +3 -3
  376. package/plugins/WordPassPlugin/hersheyFont.js +3 -3
  377. package/plugins/WordPassPlugin/hersheyFont.mjs +3 -3
  378. package/plugins/WordPassPlugin/index.js +3 -3
  379. package/plugins/WordPassPlugin/index.mjs +3 -3
  380. package/plugins/WordPassPlugin/textToStrokeOrderStrokes.js +4 -4
  381. package/plugins/WordPassPlugin/textToStrokeOrderStrokes.mjs +4 -4
  382. package/plugins/WordPassPlugin/word-pass.js +3 -3
  383. package/plugins/WordPassPlugin/word-pass.mjs +3 -3
  384. package/plugins/index.js +3 -3
  385. package/plugins/index.mjs +3 -3
  386. package/plugins/thirdParty/CSS2DRenderer.js +3 -3
  387. package/plugins/thirdParty/CSS2DRenderer.mjs +3 -3
  388. package/plugins/thirdParty/CSS3DRenderer.js +3 -3
  389. package/plugins/thirdParty/CSS3DRenderer.mjs +3 -3
  390. package/plugins/thirdParty/doctorstrange-model.js +75 -75
  391. package/plugins/thirdParty/doctorstrange-model.mjs +75 -75
  392. package/plugins/thirdParty/domevents.js +3 -3
  393. package/plugins/thirdParty/domevents.mjs +3 -3
  394. package/plugins/utils/absoluteUrl.js +3 -3
  395. package/plugins/utils/absoluteUrl.mjs +3 -3
  396. package/plugins/utils/calculatePath.js +3 -3
  397. package/plugins/utils/calculatePath.mjs +3 -3
  398. package/plugins/utils/clamp.js +3 -3
  399. package/plugins/utils/clamp.mjs +3 -3
  400. package/plugins/utils/uuid.js +3 -3
  401. package/plugins/utils/uuid.mjs +3 -3
  402. package/react/hooks/useFiveModelReadyState.d.ts +1 -1
  403. package/react/index.js +3 -3
  404. package/react/index.mjs +3 -644
  405. package/sticker/index.d.ts +7 -0
  406. package/sticker/index.js +46 -3
  407. package/sticker/index.mjs +43 -103
  408. package/umd/five-gltf-loader.js +3 -3
  409. package/umd/five-line.js +3 -3
  410. package/umd/five-plugins.js +3 -3
  411. package/umd/five-react.js +2 -2
  412. package/umd/five-sticker.js +46 -3
  413. package/umd/five-vfx.js +2 -2
  414. package/umd/five.js +216 -179
  415. package/vfx/index.js +3 -3
  416. package/vfx/index.mjs +3 -486
  417. package/work-downloader/index.js +3 -3
  418. package/work-downloader/index.mjs +3 -315
  419. package/docs/functions/index.loadAt3d.html +0 -1
  420. package/docs/functions/index.loadDome.html +0 -1
  421. package/docs/functions/index.loadDomez.html +0 -1
  422. package/docs/functions/index.loadGltf.html +0 -1
  423. package/docs/functions/index.loadPbm.html +0 -1
  424. package/docs/functions/index.loadPly.html +0 -1
  425. package/five/certificates/hardware.d.ts +0 -1
  426. package/five/gaussian-splatting/shStore.d.ts +0 -22
  427. package/five/thirdparty/jsrsasign.d.ts +0 -753
  428. package/five/work/keychain.d.ts +0 -5
  429. package/five/work/verify.d.ts +0 -7
  430. package/five/work/workVerify.d.ts +0 -2
  431. /package/five/{work/_ALLOW_HOST.d.ts → renderer/compute-renderers/shaders/composite-additive.d.ts} +0 -0
@@ -18,6 +18,13 @@ interface IntersectionLike {
18
18
  declare class Sticker extends THREE.Mesh<THREE.BufferGeometry, THREE.MeshBasicMaterial> {
19
19
  static get version(): string;
20
20
  private _needsRender;
21
+ /**
22
+ * 资源对应的原始纹理。
23
+ * @description
24
+ * 视频资源在 WebGPU 下 `material.map` 会被换成 GPU 中转纹理,`needsUpdate` 与 `dispose`
25
+ * 必须作用在原始纹理上(中转纹理不能 needsUpdate,否则 three 会重复初始化)。
26
+ */
27
+ private _sourceTexture;
21
28
  /**
22
29
  * 贴纸
23
30
  * @description
package/sticker/index.js CHANGED
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * @license
3
3
  * @realsee/five-webgpu
4
- * Generated: 2026/10/29
5
- * Version: 1.0.0-alpha.12
4
+ * Generated: 2026/11/3
5
+ * Version: 1.0.0-alpha.14
6
6
  * License:
7
7
  * Realsee SDK License Agreement
8
8
 
@@ -335,4 +335,47 @@
335
335
  * writing and signed by Realsee. You and Realsee hereto confirm that this
336
336
  * Agreement and all related documents shall be drafted in English.
337
337
 
338
- */Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require("three/webgpu");c=s(c,1);var l=new Float32Array([-.5,-.5,0,.5,-.5,0,-.5,.5,0,.5,.5,0]),u=new Float32Array([0,0,1,0,0,1,1,1]),d=new Uint8Array([0,1,2,1,3,2]),f=new c.BufferGeometry;f.setAttribute(`position`,new c.BufferAttribute(l,3)),f.setAttribute(`uv`,new c.BufferAttribute(u,2)),f.setIndex(new c.BufferAttribute(d,1));var p=window,m=p.requestAnimationFrame||p.mozRequestAnimationFrame||p.webkitRequestAnimationFrame||p.msRequestAnimationFrame||(e=>setTimeout(e,16)),h=typeof performance<`u`&&performance.timing!==void 0?performance.timing.navigationStart:Date.now(),g=typeof performance<`u`?(()=>h+performance.now()):(()=>Date.now());function _(e,t){e.naturalWidth>0&&m(()=>t());let n=()=>t();return e.addEventListener(`load`,n,!1),()=>e.removeEventListener(`load`,n,!1)}function v(e,t){let n=g(),r=!1,i=()=>{r=!0,t(),g()-n<3e3?m(i):r=!1},a=()=>{n=g(),r===!1&&i()};return e.addEventListener(`timeupdate`,a,!1),()=>{e.removeEventListener(`timeupdate`,a,!1),r=!1}}function y(e,t){let n=e.dispose;e.dispose=()=>{t(),n.call(e)}}var b=class extends c.Mesh{static get version(){return`1.0.0-alpha.12`}constructor(e,t,n){let r=new c.MeshBasicMaterial;if(super(f,r),this._needsRender=!1,this.scale.set(e,t,1),typeof n==`string`){r.transparent=/\.png$/.test(n);let e=new Image;e.src=n,e.crossOrigin=``,n=e}if(n instanceof HTMLImageElement){let e=r.map=new c.Texture;e.wrapS=c.ClampToEdgeWrapping,e.wrapT=c.ClampToEdgeWrapping,e.minFilter=c.LinearFilter,e.colorSpace=c.SRGBColorSpace,y(e,_(n,()=>{e.image=n,e.needsUpdate=!0,this._needsRender=!0}))}else if(n instanceof HTMLCanvasElement)r.map=new c.CanvasTexture(n);else if(n instanceof HTMLVideoElement){let e=r.map=new c.VideoTexture(n);e.wrapS=c.ClampToEdgeWrapping,e.wrapT=c.ClampToEdgeWrapping,e.minFilter=c.LinearFilter,e.colorSpace=c.SRGBColorSpace,y(e,v(n,()=>{this._needsRender=!0}))}}get needsRender(){return this._needsRender}set needsRender(e){this._needsRender=e,e===!0&&this.material.map&&(this.material.map.needsUpdate=!0)}setSize(e,t){this.scale.set(e,t,1),this._needsRender=!0}setTransparent(e){this.material.transparent=e,this._needsRender=!0}locationWithIntersection(e,t=.005){let{point:n,face:r}=e;this.position.copy(n),r&&(this.position.add(r.normal.clone().setLength(t)),this.lookAt(n.clone().add(r.normal))),this._needsRender=!0}dispose(){var e;(e=this.material.map)==null||e.dispose(),this.material.dispose()}};exports.Sticker=b;
338
+ */Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var __create=Object.create,__defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropNames=Object.getOwnPropertyNames,__getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty,__copyProps=(to,from,except,desc)=>{if(from&&typeof from==`object`||typeof from==`function`)for(var keys=__getOwnPropNames(from),i=0,n=keys.length,key;i<n;i++)key=keys[i],!__hasOwnProp.call(to,key)&&key!==except&&__defProp(to,key,{get:(k=>from[k]).bind(null,key),enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to},__toESM=(mod,isNodeMode,target)=>(target=mod==null?{}:__create(__getProtoOf(mod)),__copyProps(isNodeMode||!mod||!mod.__esModule?__defProp(target,`default`,{value:mod,enumerable:!0}):target,mod));let three_webgpu=require("three/webgpu");three_webgpu=__toESM(three_webgpu,1);let tslib=require("tslib");var vertices=new Float32Array([-.5,-.5,0,.5,-.5,0,-.5,.5,0,.5,.5,0]),uvs=new Float32Array([0,0,1,0,0,1,1,1]),index=new Uint8Array([0,1,2,1,3,2]),geometry=new three_webgpu.BufferGeometry;geometry.setAttribute(`position`,new three_webgpu.BufferAttribute(vertices,3)),geometry.setAttribute(`uv`,new three_webgpu.BufferAttribute(uvs,2)),geometry.setIndex(new three_webgpu.BufferAttribute(index,1));var CANDIDATE_ORDER=[`videoFrame`,`video`,`canvasFromVideoFrame`,`canvasFromVideo`],CANDIDATE_SHORT={videoFrame:`vf`,video:`video`,canvasFromVideoFrame:`cvf`,canvasFromVideo:`cv`},BRIGHT_THRESHOLD=6,MAX_CONSECUTIVE_FAILS=10,MIN_FAIL_DURATION_MS=3e3,BLACKLIST_TTL_MS=15e3,MAX_CANVAS_SIZE=4096,INTERMEDIATE_FORMAT=`rgba8unorm-srgb`,BLIT_SHADER=`
339
+ struct VSOut {
340
+ @builtin(position) position: vec4f,
341
+ @location(0) uv: vec2f,
342
+ };
343
+
344
+ @vertex
345
+ fn vs(@builtin(vertex_index) index: u32) -> VSOut {
346
+ // 全屏三角形:p ∈ {(0,0), (2,0), (0,2)}
347
+ let p = vec2f(f32((index << 1u) & 2u), f32(index & 2u));
348
+ var out: VSOut;
349
+ out.position = vec4f(p * 2.0 - 1.0, 0.0, 1.0);
350
+ // NDC y = +1 对应纹理第 0 行。three 的约定是 uv.v = 0 为图像底部、且存放在第 0 行,
351
+ // 而 external texture 的 uv (0,0) 是视频左上角,所以第 0 行要采视频的 v = 1,即 uv = p。
352
+ out.uv = p;
353
+ return out;
354
+ }
355
+
356
+ @group(0) @binding(0) var source: texture_external;
357
+ @group(0) @binding(1) var sourceSampler: sampler;
358
+
359
+ fn srgbToLinear(c: vec3f) -> vec3f {
360
+ let low = c / 12.92;
361
+ let high = pow((c + 0.055) / 1.055, vec3f(2.4));
362
+ return select(high, low, c <= vec3f(0.04045));
363
+ }
364
+
365
+ @fragment
366
+ fn fs(in: VSOut) -> @location(0) vec4f {
367
+ // external texture 采样结果是 sRGB 编码值;目标是 -srgb 格式,写入时会再编码一次,
368
+ // 所以这里先解码为线性。
369
+ let color = textureSampleBaseClampToEdge(source, sourceSampler, in.uv);
370
+ return vec4f(srgbToLinear(color.rgb), 1.0);
371
+ }
372
+ `,pipelineCache=new WeakMap;function getBlitPipeline(device){let cached=pipelineCache.get(device);if(!cached){let module=device.createShaderModule({label:`five.videoBlit`,code:BLIT_SHADER}),bindGroupLayout=device.createBindGroupLayout({label:`five.videoBlit`,entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,externalTexture:{}},{binding:1,visibility:GPUShaderStage.FRAGMENT,sampler:{}}]});cached={pipeline:device.createRenderPipeline({label:`five.videoBlit`,layout:device.createPipelineLayout({bindGroupLayouts:[bindGroupLayout]}),vertex:{module,entryPoint:`vs`},fragment:{module,entryPoint:`fs`,targets:[{format:INTERMEDIATE_FORMAT}]},primitive:{topology:`triangle-list`}}),bindGroupLayout,sampler:device.createSampler({magFilter:`linear`,minFilter:`linear`})},pipelineCache.set(device,cached)}return cached}var sharedPlaceholder=null;function getPlaceholder(){return sharedPlaceholder||(sharedPlaceholder=new three_webgpu.DataTexture(new Uint8Array([0,0,0,255]),1,1,three_webgpu.RGBAFormat),sharedPlaceholder.colorSpace=three_webgpu.SRGBColorSpace,sharedPlaceholder.magFilter=three_webgpu.LinearFilter,sharedPlaceholder.minFilter=three_webgpu.LinearFilter,sharedPlaceholder.needsUpdate=!0),sharedPlaceholder}function hasVideoFrame(){return typeof globalThis.VideoFrame==`function`}function createVideoFrame(video){let VideoFrameCtor=globalThis.VideoFrame;return new VideoFrameCtor(video)}function isAvailable(candidate){return candidate===`videoFrame`||candidate===`canvasFromVideoFrame`?hasVideoFrame():!0}function maxChannel(data){let max=0;for(let i=0;i<data.length;i+=4)data[i]>max&&(max=data[i]),data[i+1]>max&&(max=data[i+1]),data[i+2]>max&&(max=data[i+2]);return max}var GL_PROBE_SIZE=16;function createGLProbe(){try{let canvas=document.createElement(`canvas`);canvas.width=canvas.height=GL_PROBE_SIZE;let gl=canvas.getContext(`webgl2`,{antialias:!1,depth:!1,stencil:!1,preserveDrawingBuffer:!0});if(!gl)return null;let compile=(type,source)=>{var _a;let shader=gl.createShader(type);if(gl.shaderSource(shader,source),gl.compileShader(shader),!gl.getShaderParameter(shader,gl.COMPILE_STATUS))throw Error((_a=gl.getShaderInfoLog(shader))==null?`compile`:_a);return shader},program=gl.createProgram();if(gl.attachShader(program,compile(gl.VERTEX_SHADER,`#version 300 es
373
+ out vec2 uv;
374
+ void main() {
375
+ vec2 p = vec2(float((gl_VertexID << 1) & 2), float(gl_VertexID & 2));
376
+ uv = p;
377
+ gl_Position = vec4(p * 2.0 - 1.0, 0.0, 1.0);
378
+ }`)),gl.attachShader(program,compile(gl.FRAGMENT_SHADER,`#version 300 es
379
+ precision mediump float;
380
+ in vec2 uv; uniform sampler2D tex; out vec4 color;
381
+ void main() { color = vec4(texture(tex, uv).rgb, 1.0); }`)),gl.linkProgram(program),!gl.getProgramParameter(program,gl.LINK_STATUS))return null;let texture=gl.createTexture();return gl.bindTexture(gl.TEXTURE_2D,texture),gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.LINEAR),gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER,gl.LINEAR),gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_S,gl.CLAMP_TO_EDGE),gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_T,gl.CLAMP_TO_EDGE),{canvas,gl,texture,program,pixels:new Uint8Array(GL_PROBE_SIZE*GL_PROBE_SIZE*4)}}catch(_a){return null}}function disposeGLProbe(probe){var _a;let{gl}=probe;gl.deleteTexture(probe.texture),gl.deleteProgram(probe.program),(_a=gl.getExtension(`WEBGL_lose_context`))==null||_a.loseContext()}var GPU_PROBE_WIDTH=64,GPU_PROBE_HEIGHT=16,VideoTextureBridge=class{constructor(videoTexture){var _a;this.debug={path:`pending`,candidate:``,locked:!1,probe:``,updateCalls:0,skipNotReady:0,blitCount:0,rvfcCount:0,fails:0,targetSize:``,lastError:``},this.mode=`unknown`,this.device=null,this.broken=!1,this.disposed=!1,this.locked=!1,this.blacklist=new Map,this.probing=!1,this.nextProbeAt=0,this.probeInterval=300,this.consecutiveFails=0,this.failingSince=0,this.frameTexture=null,this.frameReady=!1,this.heldFrame=null,this.canvas=null,this.canvasContext=null,this.gpuTexture=null,this.externalTexture=null,this.externalReady=!1,this.width=0,this.height=0,this.frameDirty=!0,this.lastVideoTime=-1,this.videoFrameCallbackId=null,this.glProbe=null,this.glProbeFailed=!1,this.gpuProbe=null,this.probeCanvas=null,this.forced=!1,this.onSourceChange=()=>{this.forced||(this.blacklist.clear(),this.locked=!1,this.debug.locked=!1,this.probeInterval=300,this.nextProbeAt=0,this.consecutiveFails=0,this.frameDirty=!0)},this.videoTexture=videoTexture,this.current=(_a=CANDIDATE_ORDER.find(isAvailable))==null?`video`:_a,this.debug.candidate=this.current,this.scheduleVideoFrameCallback();let video=this.video;typeof(video==null?void 0:video.addEventListener)==`function`&&video.addEventListener(`loadstart`,this.onSourceChange)}get video(){return this.videoTexture.image}scheduleVideoFrameCallback(){let video=this.video;this.disposed||typeof(video==null?void 0:video.requestVideoFrameCallback)!=`function`||(this.videoFrameCallbackId=video.requestVideoFrameCallback(()=>{this.videoFrameCallbackId=null,this.frameDirty=!0,this.debug.rvfcCount++,this.scheduleVideoFrameCallback()}))}get texture(){var _a;if(this.broken||this.mode===`unknown`)return this.videoTexture;let wantsExternal=this.mode===`webgpu`&&(this.current===`videoFrame`||this.current===`video`),external=this.externalReady?this.externalTexture:null,frame=this.frameReady?this.frameTexture:null;return(_a=wantsExternal?external==null?frame:external:frame==null?external:frame)==null?getPlaceholder():_a}update(renderer){if(this.debug.updateCalls++,this.disposed||this.broken||!this.resolveMode(renderer))return;let video=this.video;if(!(video instanceof HTMLVideoElement))return;if(video.readyState<2||video.videoWidth===0||video.videoHeight===0){this.debug.skipNotReady++;return}let now=performance.now();if(!this.locked&&!this.probing&&now>=this.nextProbeAt&&this.startProbe(),!(!this.frameDirty&&(this.debug.rvfcCount>0||video.currentTime===this.lastVideoTime)))try{this.produce(this.current,video),this.frameDirty=!1,this.lastVideoTime=video.currentTime,this.consecutiveFails=0,this.debug.blitCount++}catch(error){this.onProduceFailed(error)}}forceCandidate(candidate){if(candidate===null){this.forced=!1,this.onSourceChange();return}this.forced=!0,this.current=candidate,this.locked=!0,this.debug.candidate=candidate,this.debug.locked=!0,this.frameDirty=!0,this.releaseProbeResources()}resolveMode(renderer){if(this.mode!==`unknown`)return!0;let backend=renderer==null?void 0:renderer.backend;if(!backend)return!1;if(backend.isWebGPUBackend===!0){if(!backend.device)return!1;this.device=backend.device,this.mode=`webgpu`}else this.mode=`webgl`;return this.debug.path=this.mode,this.ensureFrameTexture(),!0}ensureFrameTexture(){if(this.frameTexture)return;let source=this.videoTexture,texture=new three_webgpu.VideoFrameTexture;texture.colorSpace=three_webgpu.SRGBColorSpace,texture.generateMipmaps=!1,texture.minFilter=source.minFilter,texture.magFilter=source.magFilter,texture.wrapS=source.wrapS,texture.wrapT=source.wrapT,this.frameTexture=texture}produce(candidate,video){let webgpu=this.mode===`webgpu`;switch(candidate){case`videoFrame`:{let frame=createVideoFrame(video);if(webgpu)try{this.blit(frame,video)}finally{frame.close()}else this.setFrame(frame,frame);break}case`video`:webgpu?this.blit(video,video):this.setFrame(video,null);break;case`canvasFromVideoFrame`:{let frame=createVideoFrame(video);try{this.drawCanvas(frame,video)}finally{frame.close()}this.setFrame(this.canvas,null);break}case`canvasFromVideo`:this.drawCanvas(video,video),this.setFrame(this.canvas,null);break}}setFrame(image,owned){this.frameTexture.setFrame(image);let previous=this.heldFrame;this.heldFrame=owned,previous&&previous!==owned&&previous.close(),this.frameReady=!0}drawCanvas(source,video){let scale=Math.min(1,MAX_CANVAS_SIZE/Math.max(video.videoWidth,video.videoHeight)),width=Math.max(1,Math.floor(video.videoWidth*scale)),height=Math.max(1,Math.floor(video.videoHeight*scale));if(!this.canvas&&(this.canvas=document.createElement(`canvas`),this.canvasContext=this.canvas.getContext(`2d`,{alpha:!1}),!this.canvasContext))throw Error(`canvas 2d 上下文不可用`);this.canvas.width!==width&&(this.canvas.width=width),this.canvas.height!==height&&(this.canvas.height=height),this.canvasContext.drawImage(source,0,0,width,height)}isBlacklisted(candidate){let expiresAt=this.blacklist.get(candidate);return expiresAt===void 0?!1:performance.now()>=expiresAt?(this.blacklist.delete(candidate),!1):!0}onProduceFailed(error){var _a;let now=performance.now();if(this.consecutiveFails===0&&(this.failingSince=now),this.consecutiveFails++,this.debug.fails++,this.debug.lastError=String((_a=error==null?void 0:error.message)==null?error:_a),this.consecutiveFails<MAX_CONSECUTIVE_FAILS||now-this.failingSince<MIN_FAIL_DURATION_MS)return;console.warn(`[Five] 视频候选路径 ${this.current} 持续失败,暂时弃用`,error),this.blacklist.set(this.current,now+BLACKLIST_TTL_MS);let next=CANDIDATE_ORDER.find(c=>isAvailable(c)&&!this.isBlacklisted(c));this.consecutiveFails=0,next?(this.current=next,this.debug.candidate=next,this.locked=!1,this.debug.locked=!1,this.nextProbeAt=0,this.frameDirty=!0):(console.warn(`[Five] 视频所有候选路径均失败,回退为 VideoTexture 上传`),this.broken=!0,this.debug.path=`fallback`,this.releaseOutputs())}blit(source,video){this.ensureTarget(video.videoWidth,video.videoHeight);let device=this.device,{pipeline,bindGroupLayout,sampler}=getBlitPipeline(device),external=device.importExternalTexture({source}),bindGroup=device.createBindGroup({layout:bindGroupLayout,entries:[{binding:0,resource:external},{binding:1,resource:sampler}]}),encoder=device.createCommandEncoder({label:`five.videoBlit`}),pass=encoder.beginRenderPass({colorAttachments:[{view:this.gpuTexture.createView(),loadOp:`clear`,storeOp:`store`,clearValue:{r:0,g:0,b:0,a:1}}]});pass.setPipeline(pipeline),pass.setBindGroup(0,bindGroup),pass.draw(3),pass.end(),device.queue.submit([encoder.finish()]),this.externalReady=!0,this.debug.targetSize=`${this.width}x${this.height}`}ensureTarget(videoWidth,videoHeight){let device=this.device,maxSize=device.limits.maxTextureDimension2D,scale=Math.min(1,maxSize/Math.max(videoWidth,videoHeight)),width=Math.max(1,Math.floor(videoWidth*scale)),height=Math.max(1,Math.floor(videoHeight*scale));if(this.gpuTexture&&this.width===width&&this.height===height)return;let prevGPUTexture=this.gpuTexture,gpuTexture=device.createTexture({label:`five.videoBlit.target`,size:{width,height},format:INTERMEDIATE_FORMAT,usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.RENDER_ATTACHMENT});if(this.gpuTexture=gpuTexture,this.width=width,this.height=height,this.externalTexture)this.externalTexture.sourceTexture=gpuTexture,this.externalTexture.image={width,height},this.externalTexture.dispose();else{let texture=new three_webgpu.ExternalTexture(gpuTexture);texture.colorSpace=three_webgpu.SRGBColorSpace,texture.flipY=!1,texture.generateMipmaps=!1,texture.minFilter=three_webgpu.LinearFilter,texture.magFilter=three_webgpu.LinearFilter,texture.wrapS=three_webgpu.ClampToEdgeWrapping,texture.wrapT=three_webgpu.ClampToEdgeWrapping,texture.image={width,height},this.externalTexture=texture}prevGPUTexture==null||prevGPUTexture.destroy()}startProbe(){this.probing=!0,this.runProbe().catch(error=>{var _a;this.debug.lastError=String((_a=error==null?void 0:error.message)==null?error:_a)}).finally(()=>{this.probing=!1,this.nextProbeAt=performance.now()+this.probeInterval,this.probeInterval=Math.min(this.probeInterval*1.5,5e3)})}runProbe(){return(0,tslib.__awaiter)(this,void 0,void 0,function*(){let results=[],chosen=null;for(let candidate of CANDIDATE_ORDER){let label=CANDIDATE_SHORT[candidate];if(this.disposed)return;if(this.isBlacklisted(candidate)||!isAvailable(candidate)){results.push(`${label}:n/a`);continue}let brightness;try{brightness=yield this.probeCandidate(candidate)}catch(_a){brightness=-1}if(results.push(`${label}:${brightness===null?`?`:brightness}`),brightness===null||brightness>=BRIGHT_THRESHOLD){chosen=candidate;break}}this.debug.probe=results.join(` `),chosen&&this.select(chosen)})}select(candidate){this.current=candidate,this.locked=!0,this.debug.candidate=candidate,this.debug.locked=!0,this.frameDirty=!0,this.releaseProbeResources()}probeCandidate(candidate){return(0,tslib.__awaiter)(this,void 0,void 0,function*(){let video=this.video;if(!(video instanceof HTMLVideoElement)||video.readyState<2)return-1;switch(candidate){case`canvasFromVideoFrame`:return this.probe2d(video,!0);case`canvasFromVideo`:return this.probe2d(video,!1);default:return this.mode===`webgpu`?this.probeGPU(video,candidate===`videoFrame`):this.probeGL(video,candidate===`videoFrame`)}})}probe2d(video,useFrame){if(!this.probeCanvas){let canvas=document.createElement(`canvas`);canvas.width=canvas.height=GL_PROBE_SIZE;let context=canvas.getContext(`2d`,{willReadFrequently:!0});if(!context)return-1;this.probeCanvas=context}let frame=useFrame?createVideoFrame(video):null;try{return this.probeCanvas.drawImage(frame==null?video:frame,0,0,GL_PROBE_SIZE,GL_PROBE_SIZE),maxChannel(this.probeCanvas.getImageData(0,0,GL_PROBE_SIZE,GL_PROBE_SIZE).data)}finally{frame==null||frame.close()}}probeGL(video,useFrame){!this.glProbe&&!this.glProbeFailed&&(this.glProbe=createGLProbe(),this.glProbeFailed=this.glProbe===null);let probe=this.glProbe;if(!probe)return null;let{gl}=probe,frame=useFrame?createVideoFrame(video):null;try{return gl.getError(),gl.viewport(0,0,GL_PROBE_SIZE,GL_PROBE_SIZE),gl.bindTexture(gl.TEXTURE_2D,probe.texture),gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,gl.RGBA,gl.UNSIGNED_BYTE,frame==null?video:frame),gl.getError()===gl.NO_ERROR?(gl.useProgram(probe.program),gl.drawArrays(gl.TRIANGLES,0,3),gl.readPixels(0,0,GL_PROBE_SIZE,GL_PROBE_SIZE,gl.RGBA,gl.UNSIGNED_BYTE,probe.pixels),maxChannel(probe.pixels)):-1}finally{frame==null||frame.close()}}probeGPU(video,useFrame){return(0,tslib.__awaiter)(this,void 0,void 0,function*(){let device=this.device,{pipeline,bindGroupLayout,sampler}=getBlitPipeline(device);this.gpuProbe||(this.gpuProbe={texture:device.createTexture({label:`five.videoProbe.target`,size:{width:GPU_PROBE_WIDTH,height:GPU_PROBE_HEIGHT},format:INTERMEDIATE_FORMAT,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.COPY_SRC}),buffer:device.createBuffer({label:`five.videoProbe.readback`,size:GPU_PROBE_WIDTH*4*GPU_PROBE_HEIGHT,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ})});let probe=this.gpuProbe;device.pushErrorScope(`validation`);let encodeError=null,frame=useFrame?createVideoFrame(video):null;try{let external=device.importExternalTexture({source:frame==null?video:frame}),bindGroup=device.createBindGroup({layout:bindGroupLayout,entries:[{binding:0,resource:external},{binding:1,resource:sampler}]}),encoder=device.createCommandEncoder({label:`five.videoProbe`}),pass=encoder.beginRenderPass({colorAttachments:[{view:probe.texture.createView(),loadOp:`clear`,storeOp:`store`,clearValue:{r:0,g:0,b:0,a:1}}]});pass.setPipeline(pipeline),pass.setBindGroup(0,bindGroup),pass.draw(3),pass.end(),encoder.copyTextureToBuffer({texture:probe.texture},{buffer:probe.buffer,bytesPerRow:GPU_PROBE_WIDTH*4},{width:GPU_PROBE_WIDTH,height:GPU_PROBE_HEIGHT}),device.queue.submit([encoder.finish()])}catch(error){encodeError=error}finally{frame==null||frame.close()}let scopeError=yield device.popErrorScope();if(encodeError||scopeError)return-1;yield probe.buffer.mapAsync(GPUMapMode.READ);let brightness=maxChannel(new Uint8Array(probe.buffer.getMappedRange()));return probe.buffer.unmap(),brightness})}releaseProbeResources(){this.glProbe&&(disposeGLProbe(this.glProbe),this.glProbe=null),this.glProbeFailed=!1,this.probeCanvas=null,this.gpuProbe&&(this.gpuProbe.texture.destroy(),this.gpuProbe.buffer.destroy(),this.gpuProbe=null)}releaseOutputs(){var _a,_b,_c,_d;(_a=this.heldFrame)==null||_a.close(),this.heldFrame=null,(_b=this.frameTexture)==null||_b.dispose(),this.frameTexture=null,this.frameReady=!1,(_c=this.externalTexture)==null||_c.dispose(),this.externalTexture=null,this.externalReady=!1,(_d=this.gpuTexture)==null||_d.destroy(),this.gpuTexture=null,this.width=this.height=0,this.canvas=null,this.canvasContext=null}dispose(){if(this.disposed)return;this.disposed=!0;let video=this.video;this.videoFrameCallbackId!==null&&typeof(video==null?void 0:video.cancelVideoFrameCallback)==`function`&&video.cancelVideoFrameCallback(this.videoFrameCallbackId),this.videoFrameCallbackId=null,typeof(video==null?void 0:video.removeEventListener)==`function`&&video.removeEventListener(`loadstart`,this.onSourceChange),this.releaseOutputs(),this.releaseProbeResources()}},bridges=new WeakMap;function getVideoTextureBridge(videoTexture){let bridge=bridges.get(videoTexture);if(!bridge){let created=new VideoTextureBridge(videoTexture);bridge=created,bridges.set(videoTexture,created);let onDispose=()=>{videoTexture.removeEventListener(`dispose`,onDispose),bridges.get(videoTexture)===created&&bridges.delete(videoTexture),created.dispose()};videoTexture.addEventListener(`dispose`,onDispose)}return bridge}var window_=window,_requestAnimationFrame=window_.requestAnimationFrame||window_.mozRequestAnimationFrame||window_.webkitRequestAnimationFrame||window_.msRequestAnimationFrame||(fn=>setTimeout(fn,16)),start=typeof performance<`u`&&performance.timing!==void 0?performance.timing.navigationStart:Date.now(),now=typeof performance<`u`?(()=>start+performance.now()):(()=>Date.now());function imageReady(image,callback){image.naturalWidth>0&&_requestAnimationFrame(()=>callback());let onLoad=()=>callback();return image.addEventListener(`load`,onLoad,!1),()=>image.removeEventListener(`load`,onLoad,!1)}function videoReady(video,callback){let lastUpdateTime=now(),looping=!1,loop=()=>{looping=!0,callback(),now()-lastUpdateTime<3e3?_requestAnimationFrame(loop):looping=!1},onUpdate=()=>{lastUpdateTime=now(),looping===!1&&loop()};return video.addEventListener(`timeupdate`,onUpdate,!1),()=>{video.removeEventListener(`timeupdate`,onUpdate,!1),looping=!1}}function injectDispose(texture,dispose){let _dispose=texture.dispose;texture.dispose=()=>{dispose(),_dispose.call(texture)}}var Sticker=class extends three_webgpu.Mesh{static get version(){return`1.0.0-alpha.14`}constructor(width,height,resource){let material=new three_webgpu.MeshBasicMaterial;if(super(geometry,material),this._sourceTexture=null,this._needsRender=!1,this.scale.set(width,height,1),typeof resource==`string`){material.transparent=/\.png$/.test(resource);let image=new Image;image.src=resource,image.crossOrigin=``,resource=image}if(resource instanceof HTMLImageElement){let texture=material.map=new three_webgpu.Texture;texture.wrapS=three_webgpu.ClampToEdgeWrapping,texture.wrapT=three_webgpu.ClampToEdgeWrapping,texture.minFilter=three_webgpu.LinearFilter,texture.colorSpace=three_webgpu.SRGBColorSpace,injectDispose(texture,imageReady(resource,()=>{texture.image=resource,texture.needsUpdate=!0,this._needsRender=!0}))}else if(resource instanceof HTMLCanvasElement)material.map=new three_webgpu.CanvasTexture(resource);else if(resource instanceof HTMLVideoElement){let texture=material.map=new three_webgpu.VideoTexture(resource);texture.wrapS=three_webgpu.ClampToEdgeWrapping,texture.wrapT=three_webgpu.ClampToEdgeWrapping,texture.minFilter=three_webgpu.LinearFilter,texture.colorSpace=three_webgpu.SRGBColorSpace,injectDispose(texture,videoReady(resource,()=>{this._needsRender=!0}));let bridge=getVideoTextureBridge(texture);this.onBeforeRender=renderer=>{bridge.update(renderer);let map=bridge.texture;material.map!==map&&(material.map=map)}}this._sourceTexture=material.map}get needsRender(){return this._needsRender}set needsRender(value){this._needsRender=value,value===!0&&this._sourceTexture&&(this._sourceTexture.needsUpdate=!0)}setSize(width,height){this.scale.set(width,height,1),this._needsRender=!0}setTransparent(transparent){this.material.transparent=transparent,this._needsRender=!0}locationWithIntersection(intersection,offset=.005){let{point,face}=intersection;this.position.copy(point),face&&(this.position.add(face.normal.clone().setLength(offset)),this.lookAt(point.clone().add(face.normal))),this._needsRender=!0}dispose(){var _a;(_a=this._sourceTexture)==null||_a.dispose(),this.material.dispose()}};exports.Sticker=Sticker;
package/sticker/index.mjs CHANGED
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * @license
3
3
  * @realsee/five-webgpu
4
- * Generated: 2026/10/29
5
- * Version: 1.0.0-alpha.12
4
+ * Generated: 2026/11/3
5
+ * Version: 1.0.0-alpha.14
6
6
  * License:
7
7
  * Realsee SDK License Agreement
8
8
 
@@ -335,107 +335,47 @@
335
335
  * writing and signed by Realsee. You and Realsee hereto confirm that this
336
336
  * Agreement and all related documents shall be drafted in English.
337
337
 
338
- */import * as e from "three/webgpu";
339
- //#region build/sticker/geometry.js
340
- var t = new Float32Array([
341
- -.5,
342
- -.5,
343
- 0,
344
- .5,
345
- -.5,
346
- 0,
347
- -.5,
348
- .5,
349
- 0,
350
- .5,
351
- .5,
352
- 0
353
- ]), n = new Float32Array([
354
- 0,
355
- 0,
356
- 1,
357
- 0,
358
- 0,
359
- 1,
360
- 1,
361
- 1
362
- ]), r = new Uint8Array([
363
- 0,
364
- 1,
365
- 2,
366
- 1,
367
- 3,
368
- 2
369
- ]), i = new e.BufferGeometry();
370
- i.setAttribute("position", new e.BufferAttribute(t, 3)), i.setAttribute("uv", new e.BufferAttribute(n, 2)), i.setIndex(new e.BufferAttribute(r, 1));
371
- //#endregion
372
- //#region build/sticker/index.js
373
- var a = window, o = a.requestAnimationFrame || a.mozRequestAnimationFrame || a.webkitRequestAnimationFrame || a.msRequestAnimationFrame || ((e) => setTimeout(e, 16)), s = typeof performance < "u" && performance.timing !== void 0 ? performance.timing.navigationStart : Date.now(), c = typeof performance < "u" ? (() => s + performance.now()) : (() => Date.now());
374
- function l(e, t) {
375
- e.naturalWidth > 0 && o(() => t());
376
- let n = () => t();
377
- return e.addEventListener("load", n, !1), () => e.removeEventListener("load", n, !1);
338
+ */import*as THREE from"three/webgpu";import{__awaiter}from"tslib";var vertices=new Float32Array([-.5,-.5,0,.5,-.5,0,-.5,.5,0,.5,.5,0]),uvs=new Float32Array([0,0,1,0,0,1,1,1]),index=new Uint8Array([0,1,2,1,3,2]),geometry=new THREE.BufferGeometry;geometry.setAttribute(`position`,new THREE.BufferAttribute(vertices,3)),geometry.setAttribute(`uv`,new THREE.BufferAttribute(uvs,2)),geometry.setIndex(new THREE.BufferAttribute(index,1));var CANDIDATE_ORDER=[`videoFrame`,`video`,`canvasFromVideoFrame`,`canvasFromVideo`],CANDIDATE_SHORT={videoFrame:`vf`,video:`video`,canvasFromVideoFrame:`cvf`,canvasFromVideo:`cv`},BRIGHT_THRESHOLD=6,MAX_CONSECUTIVE_FAILS=10,MIN_FAIL_DURATION_MS=3e3,BLACKLIST_TTL_MS=15e3,MAX_CANVAS_SIZE=4096,INTERMEDIATE_FORMAT=`rgba8unorm-srgb`,BLIT_SHADER=`
339
+ struct VSOut {
340
+ @builtin(position) position: vec4f,
341
+ @location(0) uv: vec2f,
342
+ };
343
+
344
+ @vertex
345
+ fn vs(@builtin(vertex_index) index: u32) -> VSOut {
346
+ // 全屏三角形:p ∈ {(0,0), (2,0), (0,2)}
347
+ let p = vec2f(f32((index << 1u) & 2u), f32(index & 2u));
348
+ var out: VSOut;
349
+ out.position = vec4f(p * 2.0 - 1.0, 0.0, 1.0);
350
+ // NDC y = +1 对应纹理第 0 行。three 的约定是 uv.v = 0 为图像底部、且存放在第 0 行,
351
+ // 而 external texture 的 uv (0,0) 是视频左上角,所以第 0 行要采视频的 v = 1,即 uv = p。
352
+ out.uv = p;
353
+ return out;
378
354
  }
379
- function u(e, t) {
380
- let n = c(), r = !1, i = () => {
381
- r = !0, t(), c() - n < 3e3 ? o(i) : r = !1;
382
- }, a = () => {
383
- n = c(), r === !1 && i();
384
- };
385
- return e.addEventListener("timeupdate", a, !1), () => {
386
- e.removeEventListener("timeupdate", a, !1), r = !1;
387
- };
355
+
356
+ @group(0) @binding(0) var source: texture_external;
357
+ @group(0) @binding(1) var sourceSampler: sampler;
358
+
359
+ fn srgbToLinear(c: vec3f) -> vec3f {
360
+ let low = c / 12.92;
361
+ let high = pow((c + 0.055) / 1.055, vec3f(2.4));
362
+ return select(high, low, c <= vec3f(0.04045));
388
363
  }
389
- function d(e, t) {
390
- let n = e.dispose;
391
- e.dispose = () => {
392
- t(), n.call(e);
393
- };
364
+
365
+ @fragment
366
+ fn fs(in: VSOut) -> @location(0) vec4f {
367
+ // external texture 采样结果是 sRGB 编码值;目标是 -srgb 格式,写入时会再编码一次,
368
+ // 所以这里先解码为线性。
369
+ let color = textureSampleBaseClampToEdge(source, sourceSampler, in.uv);
370
+ return vec4f(srgbToLinear(color.rgb), 1.0);
394
371
  }
395
- var f = class extends e.Mesh {
396
- static get version() {
397
- return "1.0.0-alpha.12";
398
- }
399
- constructor(t, n, r) {
400
- let a = new e.MeshBasicMaterial();
401
- if (super(i, a), this._needsRender = !1, this.scale.set(t, n, 1), typeof r == "string") {
402
- a.transparent = /\.png$/.test(r);
403
- let e = new Image();
404
- e.src = r, e.crossOrigin = "", r = e;
405
- }
406
- if (r instanceof HTMLImageElement) {
407
- let t = a.map = new e.Texture();
408
- t.wrapS = e.ClampToEdgeWrapping, t.wrapT = e.ClampToEdgeWrapping, t.minFilter = e.LinearFilter, t.colorSpace = e.SRGBColorSpace, d(t, l(r, () => {
409
- t.image = r, t.needsUpdate = !0, this._needsRender = !0;
410
- }));
411
- } else if (r instanceof HTMLCanvasElement) a.map = new e.CanvasTexture(r);
412
- else if (r instanceof HTMLVideoElement) {
413
- let t = a.map = new e.VideoTexture(r);
414
- t.wrapS = e.ClampToEdgeWrapping, t.wrapT = e.ClampToEdgeWrapping, t.minFilter = e.LinearFilter, t.colorSpace = e.SRGBColorSpace, d(t, u(r, () => {
415
- this._needsRender = !0;
416
- }));
417
- }
418
- }
419
- get needsRender() {
420
- return this._needsRender;
421
- }
422
- set needsRender(e) {
423
- this._needsRender = e, e === !0 && this.material.map && (this.material.map.needsUpdate = !0);
424
- }
425
- setSize(e, t) {
426
- this.scale.set(e, t, 1), this._needsRender = !0;
427
- }
428
- setTransparent(e) {
429
- this.material.transparent = e, this._needsRender = !0;
430
- }
431
- locationWithIntersection(e, t = .005) {
432
- let { point: n, face: r } = e;
433
- this.position.copy(n), r && (this.position.add(r.normal.clone().setLength(t)), this.lookAt(n.clone().add(r.normal))), this._needsRender = !0;
434
- }
435
- dispose() {
436
- var e;
437
- (e = this.material.map) == null || e.dispose(), this.material.dispose();
438
- }
439
- };
440
- //#endregion
441
- export { f as Sticker };
372
+ `,pipelineCache=new WeakMap;function getBlitPipeline(device){let cached=pipelineCache.get(device);if(!cached){let module=device.createShaderModule({label:`five.videoBlit`,code:BLIT_SHADER}),bindGroupLayout=device.createBindGroupLayout({label:`five.videoBlit`,entries:[{binding:0,visibility:GPUShaderStage.FRAGMENT,externalTexture:{}},{binding:1,visibility:GPUShaderStage.FRAGMENT,sampler:{}}]});cached={pipeline:device.createRenderPipeline({label:`five.videoBlit`,layout:device.createPipelineLayout({bindGroupLayouts:[bindGroupLayout]}),vertex:{module,entryPoint:`vs`},fragment:{module,entryPoint:`fs`,targets:[{format:INTERMEDIATE_FORMAT}]},primitive:{topology:`triangle-list`}}),bindGroupLayout,sampler:device.createSampler({magFilter:`linear`,minFilter:`linear`})},pipelineCache.set(device,cached)}return cached}var sharedPlaceholder=null;function getPlaceholder(){return sharedPlaceholder||(sharedPlaceholder=new THREE.DataTexture(new Uint8Array([0,0,0,255]),1,1,THREE.RGBAFormat),sharedPlaceholder.colorSpace=THREE.SRGBColorSpace,sharedPlaceholder.magFilter=THREE.LinearFilter,sharedPlaceholder.minFilter=THREE.LinearFilter,sharedPlaceholder.needsUpdate=!0),sharedPlaceholder}function hasVideoFrame(){return typeof globalThis.VideoFrame==`function`}function createVideoFrame(video){let VideoFrameCtor=globalThis.VideoFrame;return new VideoFrameCtor(video)}function isAvailable(candidate){return candidate===`videoFrame`||candidate===`canvasFromVideoFrame`?hasVideoFrame():!0}function maxChannel(data){let max=0;for(let i=0;i<data.length;i+=4)data[i]>max&&(max=data[i]),data[i+1]>max&&(max=data[i+1]),data[i+2]>max&&(max=data[i+2]);return max}var GL_PROBE_SIZE=16;function createGLProbe(){try{let canvas=document.createElement(`canvas`);canvas.width=canvas.height=GL_PROBE_SIZE;let gl=canvas.getContext(`webgl2`,{antialias:!1,depth:!1,stencil:!1,preserveDrawingBuffer:!0});if(!gl)return null;let compile=(type,source)=>{var _a;let shader=gl.createShader(type);if(gl.shaderSource(shader,source),gl.compileShader(shader),!gl.getShaderParameter(shader,gl.COMPILE_STATUS))throw Error((_a=gl.getShaderInfoLog(shader))==null?`compile`:_a);return shader},program=gl.createProgram();if(gl.attachShader(program,compile(gl.VERTEX_SHADER,`#version 300 es
373
+ out vec2 uv;
374
+ void main() {
375
+ vec2 p = vec2(float((gl_VertexID << 1) & 2), float(gl_VertexID & 2));
376
+ uv = p;
377
+ gl_Position = vec4(p * 2.0 - 1.0, 0.0, 1.0);
378
+ }`)),gl.attachShader(program,compile(gl.FRAGMENT_SHADER,`#version 300 es
379
+ precision mediump float;
380
+ in vec2 uv; uniform sampler2D tex; out vec4 color;
381
+ void main() { color = vec4(texture(tex, uv).rgb, 1.0); }`)),gl.linkProgram(program),!gl.getProgramParameter(program,gl.LINK_STATUS))return null;let texture=gl.createTexture();return gl.bindTexture(gl.TEXTURE_2D,texture),gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.LINEAR),gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER,gl.LINEAR),gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_S,gl.CLAMP_TO_EDGE),gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_T,gl.CLAMP_TO_EDGE),{canvas,gl,texture,program,pixels:new Uint8Array(GL_PROBE_SIZE*GL_PROBE_SIZE*4)}}catch(_a){return null}}function disposeGLProbe(probe){var _a;let{gl}=probe;gl.deleteTexture(probe.texture),gl.deleteProgram(probe.program),(_a=gl.getExtension(`WEBGL_lose_context`))==null||_a.loseContext()}var GPU_PROBE_WIDTH=64,GPU_PROBE_HEIGHT=16,VideoTextureBridge=class{constructor(videoTexture){var _a;this.debug={path:`pending`,candidate:``,locked:!1,probe:``,updateCalls:0,skipNotReady:0,blitCount:0,rvfcCount:0,fails:0,targetSize:``,lastError:``},this.mode=`unknown`,this.device=null,this.broken=!1,this.disposed=!1,this.locked=!1,this.blacklist=new Map,this.probing=!1,this.nextProbeAt=0,this.probeInterval=300,this.consecutiveFails=0,this.failingSince=0,this.frameTexture=null,this.frameReady=!1,this.heldFrame=null,this.canvas=null,this.canvasContext=null,this.gpuTexture=null,this.externalTexture=null,this.externalReady=!1,this.width=0,this.height=0,this.frameDirty=!0,this.lastVideoTime=-1,this.videoFrameCallbackId=null,this.glProbe=null,this.glProbeFailed=!1,this.gpuProbe=null,this.probeCanvas=null,this.forced=!1,this.onSourceChange=()=>{this.forced||(this.blacklist.clear(),this.locked=!1,this.debug.locked=!1,this.probeInterval=300,this.nextProbeAt=0,this.consecutiveFails=0,this.frameDirty=!0)},this.videoTexture=videoTexture,this.current=(_a=CANDIDATE_ORDER.find(isAvailable))==null?`video`:_a,this.debug.candidate=this.current,this.scheduleVideoFrameCallback();let video=this.video;typeof(video==null?void 0:video.addEventListener)==`function`&&video.addEventListener(`loadstart`,this.onSourceChange)}get video(){return this.videoTexture.image}scheduleVideoFrameCallback(){let video=this.video;this.disposed||typeof(video==null?void 0:video.requestVideoFrameCallback)!=`function`||(this.videoFrameCallbackId=video.requestVideoFrameCallback(()=>{this.videoFrameCallbackId=null,this.frameDirty=!0,this.debug.rvfcCount++,this.scheduleVideoFrameCallback()}))}get texture(){var _a;if(this.broken||this.mode===`unknown`)return this.videoTexture;let wantsExternal=this.mode===`webgpu`&&(this.current===`videoFrame`||this.current===`video`),external=this.externalReady?this.externalTexture:null,frame=this.frameReady?this.frameTexture:null;return(_a=wantsExternal?external==null?frame:external:frame==null?external:frame)==null?getPlaceholder():_a}update(renderer){if(this.debug.updateCalls++,this.disposed||this.broken||!this.resolveMode(renderer))return;let video=this.video;if(!(video instanceof HTMLVideoElement))return;if(video.readyState<2||video.videoWidth===0||video.videoHeight===0){this.debug.skipNotReady++;return}let now=performance.now();if(!this.locked&&!this.probing&&now>=this.nextProbeAt&&this.startProbe(),!(!this.frameDirty&&(this.debug.rvfcCount>0||video.currentTime===this.lastVideoTime)))try{this.produce(this.current,video),this.frameDirty=!1,this.lastVideoTime=video.currentTime,this.consecutiveFails=0,this.debug.blitCount++}catch(error){this.onProduceFailed(error)}}forceCandidate(candidate){if(candidate===null){this.forced=!1,this.onSourceChange();return}this.forced=!0,this.current=candidate,this.locked=!0,this.debug.candidate=candidate,this.debug.locked=!0,this.frameDirty=!0,this.releaseProbeResources()}resolveMode(renderer){if(this.mode!==`unknown`)return!0;let backend=renderer==null?void 0:renderer.backend;if(!backend)return!1;if(backend.isWebGPUBackend===!0){if(!backend.device)return!1;this.device=backend.device,this.mode=`webgpu`}else this.mode=`webgl`;return this.debug.path=this.mode,this.ensureFrameTexture(),!0}ensureFrameTexture(){if(this.frameTexture)return;let source=this.videoTexture,texture=new THREE.VideoFrameTexture;texture.colorSpace=THREE.SRGBColorSpace,texture.generateMipmaps=!1,texture.minFilter=source.minFilter,texture.magFilter=source.magFilter,texture.wrapS=source.wrapS,texture.wrapT=source.wrapT,this.frameTexture=texture}produce(candidate,video){let webgpu=this.mode===`webgpu`;switch(candidate){case`videoFrame`:{let frame=createVideoFrame(video);if(webgpu)try{this.blit(frame,video)}finally{frame.close()}else this.setFrame(frame,frame);break}case`video`:webgpu?this.blit(video,video):this.setFrame(video,null);break;case`canvasFromVideoFrame`:{let frame=createVideoFrame(video);try{this.drawCanvas(frame,video)}finally{frame.close()}this.setFrame(this.canvas,null);break}case`canvasFromVideo`:this.drawCanvas(video,video),this.setFrame(this.canvas,null);break}}setFrame(image,owned){this.frameTexture.setFrame(image);let previous=this.heldFrame;this.heldFrame=owned,previous&&previous!==owned&&previous.close(),this.frameReady=!0}drawCanvas(source,video){let scale=Math.min(1,MAX_CANVAS_SIZE/Math.max(video.videoWidth,video.videoHeight)),width=Math.max(1,Math.floor(video.videoWidth*scale)),height=Math.max(1,Math.floor(video.videoHeight*scale));if(!this.canvas&&(this.canvas=document.createElement(`canvas`),this.canvasContext=this.canvas.getContext(`2d`,{alpha:!1}),!this.canvasContext))throw Error(`canvas 2d 上下文不可用`);this.canvas.width!==width&&(this.canvas.width=width),this.canvas.height!==height&&(this.canvas.height=height),this.canvasContext.drawImage(source,0,0,width,height)}isBlacklisted(candidate){let expiresAt=this.blacklist.get(candidate);return expiresAt===void 0?!1:performance.now()>=expiresAt?(this.blacklist.delete(candidate),!1):!0}onProduceFailed(error){var _a;let now=performance.now();if(this.consecutiveFails===0&&(this.failingSince=now),this.consecutiveFails++,this.debug.fails++,this.debug.lastError=String((_a=error==null?void 0:error.message)==null?error:_a),this.consecutiveFails<MAX_CONSECUTIVE_FAILS||now-this.failingSince<MIN_FAIL_DURATION_MS)return;console.warn(`[Five] 视频候选路径 ${this.current} 持续失败,暂时弃用`,error),this.blacklist.set(this.current,now+BLACKLIST_TTL_MS);let next=CANDIDATE_ORDER.find(c=>isAvailable(c)&&!this.isBlacklisted(c));this.consecutiveFails=0,next?(this.current=next,this.debug.candidate=next,this.locked=!1,this.debug.locked=!1,this.nextProbeAt=0,this.frameDirty=!0):(console.warn(`[Five] 视频所有候选路径均失败,回退为 VideoTexture 上传`),this.broken=!0,this.debug.path=`fallback`,this.releaseOutputs())}blit(source,video){this.ensureTarget(video.videoWidth,video.videoHeight);let device=this.device,{pipeline,bindGroupLayout,sampler}=getBlitPipeline(device),external=device.importExternalTexture({source}),bindGroup=device.createBindGroup({layout:bindGroupLayout,entries:[{binding:0,resource:external},{binding:1,resource:sampler}]}),encoder=device.createCommandEncoder({label:`five.videoBlit`}),pass=encoder.beginRenderPass({colorAttachments:[{view:this.gpuTexture.createView(),loadOp:`clear`,storeOp:`store`,clearValue:{r:0,g:0,b:0,a:1}}]});pass.setPipeline(pipeline),pass.setBindGroup(0,bindGroup),pass.draw(3),pass.end(),device.queue.submit([encoder.finish()]),this.externalReady=!0,this.debug.targetSize=`${this.width}x${this.height}`}ensureTarget(videoWidth,videoHeight){let device=this.device,maxSize=device.limits.maxTextureDimension2D,scale=Math.min(1,maxSize/Math.max(videoWidth,videoHeight)),width=Math.max(1,Math.floor(videoWidth*scale)),height=Math.max(1,Math.floor(videoHeight*scale));if(this.gpuTexture&&this.width===width&&this.height===height)return;let prevGPUTexture=this.gpuTexture,gpuTexture=device.createTexture({label:`five.videoBlit.target`,size:{width,height},format:INTERMEDIATE_FORMAT,usage:GPUTextureUsage.TEXTURE_BINDING|GPUTextureUsage.RENDER_ATTACHMENT});if(this.gpuTexture=gpuTexture,this.width=width,this.height=height,this.externalTexture)this.externalTexture.sourceTexture=gpuTexture,this.externalTexture.image={width,height},this.externalTexture.dispose();else{let texture=new THREE.ExternalTexture(gpuTexture);texture.colorSpace=THREE.SRGBColorSpace,texture.flipY=!1,texture.generateMipmaps=!1,texture.minFilter=THREE.LinearFilter,texture.magFilter=THREE.LinearFilter,texture.wrapS=THREE.ClampToEdgeWrapping,texture.wrapT=THREE.ClampToEdgeWrapping,texture.image={width,height},this.externalTexture=texture}prevGPUTexture==null||prevGPUTexture.destroy()}startProbe(){this.probing=!0,this.runProbe().catch(error=>{var _a;this.debug.lastError=String((_a=error==null?void 0:error.message)==null?error:_a)}).finally(()=>{this.probing=!1,this.nextProbeAt=performance.now()+this.probeInterval,this.probeInterval=Math.min(this.probeInterval*1.5,5e3)})}runProbe(){return __awaiter(this,void 0,void 0,function*(){let results=[],chosen=null;for(let candidate of CANDIDATE_ORDER){let label=CANDIDATE_SHORT[candidate];if(this.disposed)return;if(this.isBlacklisted(candidate)||!isAvailable(candidate)){results.push(`${label}:n/a`);continue}let brightness;try{brightness=yield this.probeCandidate(candidate)}catch(_a){brightness=-1}if(results.push(`${label}:${brightness===null?`?`:brightness}`),brightness===null||brightness>=BRIGHT_THRESHOLD){chosen=candidate;break}}this.debug.probe=results.join(` `),chosen&&this.select(chosen)})}select(candidate){this.current=candidate,this.locked=!0,this.debug.candidate=candidate,this.debug.locked=!0,this.frameDirty=!0,this.releaseProbeResources()}probeCandidate(candidate){return __awaiter(this,void 0,void 0,function*(){let video=this.video;if(!(video instanceof HTMLVideoElement)||video.readyState<2)return-1;switch(candidate){case`canvasFromVideoFrame`:return this.probe2d(video,!0);case`canvasFromVideo`:return this.probe2d(video,!1);default:return this.mode===`webgpu`?this.probeGPU(video,candidate===`videoFrame`):this.probeGL(video,candidate===`videoFrame`)}})}probe2d(video,useFrame){if(!this.probeCanvas){let canvas=document.createElement(`canvas`);canvas.width=canvas.height=GL_PROBE_SIZE;let context=canvas.getContext(`2d`,{willReadFrequently:!0});if(!context)return-1;this.probeCanvas=context}let frame=useFrame?createVideoFrame(video):null;try{return this.probeCanvas.drawImage(frame==null?video:frame,0,0,GL_PROBE_SIZE,GL_PROBE_SIZE),maxChannel(this.probeCanvas.getImageData(0,0,GL_PROBE_SIZE,GL_PROBE_SIZE).data)}finally{frame==null||frame.close()}}probeGL(video,useFrame){!this.glProbe&&!this.glProbeFailed&&(this.glProbe=createGLProbe(),this.glProbeFailed=this.glProbe===null);let probe=this.glProbe;if(!probe)return null;let{gl}=probe,frame=useFrame?createVideoFrame(video):null;try{return gl.getError(),gl.viewport(0,0,GL_PROBE_SIZE,GL_PROBE_SIZE),gl.bindTexture(gl.TEXTURE_2D,probe.texture),gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,gl.RGBA,gl.UNSIGNED_BYTE,frame==null?video:frame),gl.getError()===gl.NO_ERROR?(gl.useProgram(probe.program),gl.drawArrays(gl.TRIANGLES,0,3),gl.readPixels(0,0,GL_PROBE_SIZE,GL_PROBE_SIZE,gl.RGBA,gl.UNSIGNED_BYTE,probe.pixels),maxChannel(probe.pixels)):-1}finally{frame==null||frame.close()}}probeGPU(video,useFrame){return __awaiter(this,void 0,void 0,function*(){let device=this.device,{pipeline,bindGroupLayout,sampler}=getBlitPipeline(device);this.gpuProbe||(this.gpuProbe={texture:device.createTexture({label:`five.videoProbe.target`,size:{width:GPU_PROBE_WIDTH,height:GPU_PROBE_HEIGHT},format:INTERMEDIATE_FORMAT,usage:GPUTextureUsage.RENDER_ATTACHMENT|GPUTextureUsage.COPY_SRC}),buffer:device.createBuffer({label:`five.videoProbe.readback`,size:GPU_PROBE_WIDTH*4*GPU_PROBE_HEIGHT,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ})});let probe=this.gpuProbe;device.pushErrorScope(`validation`);let encodeError=null,frame=useFrame?createVideoFrame(video):null;try{let external=device.importExternalTexture({source:frame==null?video:frame}),bindGroup=device.createBindGroup({layout:bindGroupLayout,entries:[{binding:0,resource:external},{binding:1,resource:sampler}]}),encoder=device.createCommandEncoder({label:`five.videoProbe`}),pass=encoder.beginRenderPass({colorAttachments:[{view:probe.texture.createView(),loadOp:`clear`,storeOp:`store`,clearValue:{r:0,g:0,b:0,a:1}}]});pass.setPipeline(pipeline),pass.setBindGroup(0,bindGroup),pass.draw(3),pass.end(),encoder.copyTextureToBuffer({texture:probe.texture},{buffer:probe.buffer,bytesPerRow:GPU_PROBE_WIDTH*4},{width:GPU_PROBE_WIDTH,height:GPU_PROBE_HEIGHT}),device.queue.submit([encoder.finish()])}catch(error){encodeError=error}finally{frame==null||frame.close()}let scopeError=yield device.popErrorScope();if(encodeError||scopeError)return-1;yield probe.buffer.mapAsync(GPUMapMode.READ);let brightness=maxChannel(new Uint8Array(probe.buffer.getMappedRange()));return probe.buffer.unmap(),brightness})}releaseProbeResources(){this.glProbe&&(disposeGLProbe(this.glProbe),this.glProbe=null),this.glProbeFailed=!1,this.probeCanvas=null,this.gpuProbe&&(this.gpuProbe.texture.destroy(),this.gpuProbe.buffer.destroy(),this.gpuProbe=null)}releaseOutputs(){var _a,_b,_c,_d;(_a=this.heldFrame)==null||_a.close(),this.heldFrame=null,(_b=this.frameTexture)==null||_b.dispose(),this.frameTexture=null,this.frameReady=!1,(_c=this.externalTexture)==null||_c.dispose(),this.externalTexture=null,this.externalReady=!1,(_d=this.gpuTexture)==null||_d.destroy(),this.gpuTexture=null,this.width=this.height=0,this.canvas=null,this.canvasContext=null}dispose(){if(this.disposed)return;this.disposed=!0;let video=this.video;this.videoFrameCallbackId!==null&&typeof(video==null?void 0:video.cancelVideoFrameCallback)==`function`&&video.cancelVideoFrameCallback(this.videoFrameCallbackId),this.videoFrameCallbackId=null,typeof(video==null?void 0:video.removeEventListener)==`function`&&video.removeEventListener(`loadstart`,this.onSourceChange),this.releaseOutputs(),this.releaseProbeResources()}},bridges=new WeakMap;function getVideoTextureBridge(videoTexture){let bridge=bridges.get(videoTexture);if(!bridge){let created=new VideoTextureBridge(videoTexture);bridge=created,bridges.set(videoTexture,created);let onDispose=()=>{videoTexture.removeEventListener(`dispose`,onDispose),bridges.get(videoTexture)===created&&bridges.delete(videoTexture),created.dispose()};videoTexture.addEventListener(`dispose`,onDispose)}return bridge}var window_=window,_requestAnimationFrame=window_.requestAnimationFrame||window_.mozRequestAnimationFrame||window_.webkitRequestAnimationFrame||window_.msRequestAnimationFrame||(fn=>setTimeout(fn,16)),start=typeof performance<`u`&&performance.timing!==void 0?performance.timing.navigationStart:Date.now(),now=typeof performance<`u`?(()=>start+performance.now()):(()=>Date.now());function imageReady(image,callback){image.naturalWidth>0&&_requestAnimationFrame(()=>callback());let onLoad=()=>callback();return image.addEventListener(`load`,onLoad,!1),()=>image.removeEventListener(`load`,onLoad,!1)}function videoReady(video,callback){let lastUpdateTime=now(),looping=!1,loop=()=>{looping=!0,callback(),now()-lastUpdateTime<3e3?_requestAnimationFrame(loop):looping=!1},onUpdate=()=>{lastUpdateTime=now(),looping===!1&&loop()};return video.addEventListener(`timeupdate`,onUpdate,!1),()=>{video.removeEventListener(`timeupdate`,onUpdate,!1),looping=!1}}function injectDispose(texture,dispose){let _dispose=texture.dispose;texture.dispose=()=>{dispose(),_dispose.call(texture)}}var Sticker=class extends THREE.Mesh{static get version(){return`1.0.0-alpha.14`}constructor(width,height,resource){let material=new THREE.MeshBasicMaterial;if(super(geometry,material),this._sourceTexture=null,this._needsRender=!1,this.scale.set(width,height,1),typeof resource==`string`){material.transparent=/\.png$/.test(resource);let image=new Image;image.src=resource,image.crossOrigin=``,resource=image}if(resource instanceof HTMLImageElement){let texture=material.map=new THREE.Texture;texture.wrapS=THREE.ClampToEdgeWrapping,texture.wrapT=THREE.ClampToEdgeWrapping,texture.minFilter=THREE.LinearFilter,texture.colorSpace=THREE.SRGBColorSpace,injectDispose(texture,imageReady(resource,()=>{texture.image=resource,texture.needsUpdate=!0,this._needsRender=!0}))}else if(resource instanceof HTMLCanvasElement)material.map=new THREE.CanvasTexture(resource);else if(resource instanceof HTMLVideoElement){let texture=material.map=new THREE.VideoTexture(resource);texture.wrapS=THREE.ClampToEdgeWrapping,texture.wrapT=THREE.ClampToEdgeWrapping,texture.minFilter=THREE.LinearFilter,texture.colorSpace=THREE.SRGBColorSpace,injectDispose(texture,videoReady(resource,()=>{this._needsRender=!0}));let bridge=getVideoTextureBridge(texture);this.onBeforeRender=renderer=>{bridge.update(renderer);let map=bridge.texture;material.map!==map&&(material.map=map)}}this._sourceTexture=material.map}get needsRender(){return this._needsRender}set needsRender(value){this._needsRender=value,value===!0&&this._sourceTexture&&(this._sourceTexture.needsUpdate=!0)}setSize(width,height){this.scale.set(width,height,1),this._needsRender=!0}setTransparent(transparent){this.material.transparent=transparent,this._needsRender=!0}locationWithIntersection(intersection,offset=.005){let{point,face}=intersection;this.position.copy(point),face&&(this.position.add(face.normal.clone().setLength(offset)),this.lookAt(point.clone().add(face.normal))),this._needsRender=!0}dispose(){var _a;(_a=this._sourceTexture)==null||_a.dispose(),this.material.dispose()}};export{Sticker};