@realsee/five-webgpu 1.0.0-alpha.11 → 1.0.0-alpha.13

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 (307) hide show
  1. package/{TERMS.txt → LICENSE.txt} +89 -24
  2. package/_virtual/_rolldown/runtime.js +134 -51
  3. package/docs/assets/hierarchy.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.EyeDomeLightingPass.html +1 -1
  7. package/docs/classes/index.Five.html +77 -69
  8. package/docs/classes/index.FivePass.html +1 -1
  9. package/docs/classes/index.FiveRenderer.html +7 -2
  10. package/docs/classes/index.FlowingFireworks3DPass.html +1 -1
  11. package/docs/classes/index.FlowingLight2DPass.html +1 -1
  12. package/docs/classes/index.FlowingLight3DPass.html +1 -1
  13. package/docs/classes/index.GaussianBlurPass.html +1 -1
  14. package/docs/classes/index.InternalWebGPURenderer.html +4 -5
  15. package/docs/classes/index.Model.html +1 -1
  16. package/docs/classes/index.ModelScene.html +1 -1
  17. package/docs/classes/index.PBMCustomNode.html +1 -1
  18. package/docs/classes/index.PBMGaussianSplattingNodeMaterial.html +9 -9
  19. package/docs/classes/index.PBMGaussianSplattingObject.html +49 -11
  20. package/docs/classes/index.PBMGaussianSplattingRenderMesh.html +71 -16
  21. package/docs/classes/index.PBMGroup.html +1 -1
  22. package/docs/classes/index.PBMMesh.html +1 -1
  23. package/docs/classes/index.PBMMeshBasicMaterial.html +1 -1
  24. package/docs/classes/index.PBMMeshBasicNodeMaterial.html +1 -1
  25. package/docs/classes/index.PBMMeshPanoOnlyMaterial.html +1 -1
  26. package/docs/classes/index.PBMMeshPanoOnlyNodeMaterial.html +1 -1
  27. package/docs/classes/index.PBMMeshPhongMaterial.html +1 -1
  28. package/docs/classes/index.PBMMeshPhongNodeMaterial.html +1 -1
  29. package/docs/classes/index.PBMMeshPhysicalMaterial.html +1 -1
  30. package/docs/classes/index.PBMMeshPhysicalNodeMaterial.html +1 -1
  31. package/docs/classes/index.PBMPanoFilter.html +1 -1
  32. package/docs/classes/index.PBMPointCloud.html +1 -1
  33. package/docs/classes/index.PBMPointCloudMaterial.html +1 -1
  34. package/docs/classes/index.PBMSkinnedMesh.html +1 -1
  35. package/docs/classes/index.PBMUpdateable.html +1 -1
  36. package/docs/classes/index.Parameter.html +24 -22
  37. package/docs/classes/index.Tile3D.html +22 -22
  38. package/docs/classes/index.TileNode.html +2 -2
  39. package/docs/classes/index.TrajectoryNode.html +1 -1
  40. package/docs/classes/index.WorkResolvedObserver.html +1 -1
  41. package/docs/functions/index.loadPly.html +10 -1
  42. package/docs/hierarchy.html +1 -1
  43. package/docs/interfaces/index.DeviceProfile.html +2 -2
  44. package/docs/interfaces/index.EventCallback.html +1 -1
  45. package/docs/interfaces/index.IPBMMaterial.html +1 -1
  46. package/docs/interfaces/index.LooseWorkWithExtrinsics.html +1 -1
  47. package/docs/interfaces/index.ModelControllerCustomInitArgs.html +1 -1
  48. package/docs/interfaces/index.PBMGaussianSplattingNodeMaterialOptions.html +3 -3
  49. package/docs/interfaces/index.PanoramaControllerCustomInitArgs.html +1 -1
  50. package/docs/interfaces/index.PanoramaLikeControllerCustomInitArgs.html +1 -1
  51. package/docs/interfaces/index.ParameterMaterialValue.html +8 -6
  52. package/docs/interfaces/index.ParameterTilesetValue.html +15 -15
  53. package/docs/interfaces/index.ParameterValue.html +21 -19
  54. package/docs/interfaces/index.ResolvedParameterValue.html +22 -20
  55. package/docs/interfaces/index.SplatData.html +10 -6
  56. package/docs/interfaces/index.Tile3DOptions.html +2 -2
  57. package/docs/interfaces/index.TopviewControllerCustomInitArgs.html +1 -1
  58. package/docs/interfaces/index.VRPanoramaControllerCustomInitArgs.html +1 -1
  59. package/docs/interfaces/index.ViewLayer.html +22 -22
  60. package/docs/interfaces/index.WorkCubeHdrGainmapImage.html +1 -1
  61. package/docs/interfaces/index.WorkCubeImage.html +1 -1
  62. package/docs/interfaces/index.WorkImage.html +1 -1
  63. package/docs/interfaces/index.WorkModelLayer.html +2 -2
  64. package/docs/interfaces/index.WorkObserver.html +1 -1
  65. package/docs/interfaces/index.WorkTile.html +1 -1
  66. package/docs/interfaces/index.XRPanoramaControllerCustomInitArgs.html +1 -1
  67. package/docs/types/index.ParseOptions.html +1 -1
  68. package/five/application/five.d.ts +12 -0
  69. package/five/application/renderPoweredByRealsee.d.ts +2 -2
  70. package/five/controllers/xrPanorama.d.ts +13 -0
  71. package/five/core/internalWebGPURenderer.d.ts +0 -3
  72. package/five/core/panoVideo.d.ts +2 -0
  73. package/five/gaussian-splatting/arena/splatArena.d.ts +227 -0
  74. package/five/gaussian-splatting/cullConstants.d.ts +68 -0
  75. package/five/gaussian-splatting/hybridConstants.d.ts +60 -0
  76. package/five/gaussian-splatting/instancePacking.d.ts +46 -0
  77. package/five/gaussian-splatting/mirrors/layoutMirror.d.ts +44 -0
  78. package/five/gaussian-splatting/mirrors/mirrorBuffer.d.ts +72 -0
  79. package/five/gaussian-splatting/mirrors/mirrorSet.d.ts +17 -0
  80. package/five/gaussian-splatting/mirrors/objectParamsMirror.d.ts +35 -0
  81. package/five/gaussian-splatting/mirrors/transformMirror.d.ts +26 -0
  82. package/five/gaussian-splatting/pipelines/gpuSortPipeline.d.ts +5 -31
  83. package/five/gaussian-splatting/pipelines/pipelineMode.d.ts +1 -2
  84. package/five/gaussian-splatting/sh-core/codec.d.ts +13 -0
  85. package/five/gaussian-splatting/sh-core/constants.d.ts +29 -0
  86. package/five/gaussian-splatting/sh-core/index.d.ts +4 -0
  87. package/five/gaussian-splatting/sh-core/rebakePolicy.d.ts +20 -0
  88. package/five/gaussian-splatting/sh-core/texelRange.d.ts +18 -0
  89. package/five/gaussian-splatting/shAssembler.d.ts +14 -0
  90. package/five/gaussian-splatting/shBakeScheduler.d.ts +26 -0
  91. package/five/gaussian-splatting/shBaker.d.ts +44 -0
  92. package/five/gaussian-splatting/shTileResource.d.ts +22 -0
  93. package/five/gaussian-splatting/splatAssembler.d.ts +1 -1
  94. package/five/gaussian-splatting/transformStore.d.ts +2 -2
  95. package/five/gaussian-splatting/worker/decodeWorker.d.ts +72 -0
  96. package/five/index.js +304 -146
  97. package/five/index.mjs +10789 -7851
  98. package/five/model/loaders/ply.d.ts +22 -6
  99. package/five/model/loaders/spz.d.ts +9 -48
  100. package/five/model/materials/pbmGaussianSplattingNodeMaterial.d.ts +6 -12
  101. package/five/model/objects/pbmGaussianSplattingObject.d.ts +91 -6
  102. package/five/model/objects/pbmGaussianSplattingRenderMesh.d.ts +357 -15
  103. package/five/model/parameter.d.ts +4 -0
  104. package/five/renderer/compute-renderers/binned/binned-core.d.ts +45 -2
  105. package/five/renderer/compute-renderers/binned/binned-pipelines.d.ts +82 -1
  106. package/five/renderer/compute-renderers/color-space.d.ts +13 -0
  107. package/five/renderer/compute-renderers/composite-pipelines.d.ts +36 -0
  108. package/five/renderer/compute-renderers/frame-plan.d.ts +166 -0
  109. package/five/renderer/compute-renderers/gsplat-hybrid-renderer.d.ts +386 -0
  110. package/five/renderer/compute-renderers/pointcloud-compute-renderer.d.ts +101 -16
  111. package/five/renderer/compute-renderers/shaders/composite-additive.d.ts +2 -0
  112. package/five/renderer/compute-renderers/shaders/composite-blend.d.ts +2 -0
  113. package/five/renderer/compute-renderers/shaders/gsplatHybridIndirect.d.ts +2 -0
  114. package/five/renderer/compute-renderers/shaders/gsplatProjector.d.ts +2 -0
  115. package/five/renderer/compute-renderers/shaders/gsplatQuad.d.ts +2 -0
  116. package/five/renderer/compute-renderers/shaders/lib/write-additive.d.ts +2 -0
  117. package/five/renderer/compute-renderers/shaders/lib/write-blend.d.ts +2 -0
  118. package/five/renderer/compute-renderers/shaders/lib/write-opaque.d.ts +2 -0
  119. package/five/renderer/compute-renderers/tile-uniform-writer.d.ts +70 -0
  120. package/five/renderer/compute-renderers/transparency-buffers.d.ts +59 -0
  121. package/five/renderer/compute-renderers/transparency-math.d.ts +70 -0
  122. package/five/renderer/compute-renderers/transparency-settings.d.ts +24 -0
  123. package/five/renderer/compute-renderers/uniform-layout.d.ts +11 -2
  124. package/five/renderer/five-renderer.d.ts +28 -3
  125. package/five/renderer/postprocessing/passes/pass.js +134 -51
  126. package/five/renderer/postprocessing/passes/pass.mjs +134 -51
  127. package/five/renderer/tools/full-screen-quad.js +134 -51
  128. package/five/renderer/tools/full-screen-quad.mjs +134 -51
  129. package/five/texture/videoTextureBridge.d.ts +43 -0
  130. package/five/utils/calculateThreeMouse.js +134 -51
  131. package/five/utils/calculateThreeMouse.mjs +134 -51
  132. package/five/utils/distance.js +134 -51
  133. package/five/utils/distance.mjs +134 -51
  134. package/five/utils/isNil.js +134 -51
  135. package/five/utils/isNil.mjs +134 -51
  136. package/five/utils/uuid.js +134 -51
  137. package/five/utils/uuid.mjs +134 -51
  138. package/gltf-loader/index.js +135 -52
  139. package/gltf-loader/index.mjs +135 -52
  140. package/line/index.js +135 -52
  141. package/line/index.mjs +135 -52
  142. package/package.json +2 -2
  143. package/plugins/BackgroundPlugin/Controller.js +134 -51
  144. package/plugins/BackgroundPlugin/Controller.mjs +134 -51
  145. package/plugins/BackgroundPlugin/index.js +134 -51
  146. package/plugins/BackgroundPlugin/index.mjs +134 -51
  147. package/plugins/BasePlugin/index.js +134 -51
  148. package/plugins/BasePlugin/index.mjs +134 -51
  149. package/plugins/CSS2DPlugin/Controller.js +134 -51
  150. package/plugins/CSS2DPlugin/Controller.mjs +134 -51
  151. package/plugins/CSS2DPlugin/index.js +134 -51
  152. package/plugins/CSS2DPlugin/index.mjs +134 -51
  153. package/plugins/CSS2DPlugin/style.css_raw.js +134 -51
  154. package/plugins/CSS2DPlugin/style.css_raw.mjs +134 -51
  155. package/plugins/CSS3DPlugin/Controller.js +134 -51
  156. package/plugins/CSS3DPlugin/Controller.mjs +134 -51
  157. package/plugins/CSS3DPlugin/index.js +134 -51
  158. package/plugins/CSS3DPlugin/index.mjs +134 -51
  159. package/plugins/CSS3DPlugin/style.css_raw.js +134 -51
  160. package/plugins/CSS3DPlugin/style.css_raw.mjs +134 -51
  161. package/plugins/FloorplanPlugin/Controller.js +134 -51
  162. package/plugins/FloorplanPlugin/Controller.mjs +134 -51
  163. package/plugins/FloorplanPlugin/index.js +134 -51
  164. package/plugins/FloorplanPlugin/index.mjs +134 -51
  165. package/plugins/FloorplanPlugin/render/assets.js +134 -51
  166. package/plugins/FloorplanPlugin/render/assets.mjs +134 -51
  167. package/plugins/FloorplanPlugin/render/index.js +134 -51
  168. package/plugins/FloorplanPlugin/render/index.mjs +134 -51
  169. package/plugins/FloorplanPlugin/render/isPointInPolygon.js +134 -51
  170. package/plugins/FloorplanPlugin/render/isPointInPolygon.mjs +134 -51
  171. package/plugins/FloorplanPlugin/render/renderFloor.js +134 -51
  172. package/plugins/FloorplanPlugin/render/renderFloor.mjs +134 -51
  173. package/plugins/FloorplanPlugin/render/roomLabelVisibility.js +134 -51
  174. package/plugins/FloorplanPlugin/render/roomLabelVisibility.mjs +134 -51
  175. package/plugins/FloorplanPlugin/render/style.css_raw.js +134 -51
  176. package/plugins/FloorplanPlugin/render/style.css_raw.mjs +134 -51
  177. package/plugins/FloorplanPlugin/utils/changeMode.js +134 -51
  178. package/plugins/FloorplanPlugin/utils/changeMode.mjs +134 -51
  179. package/plugins/FloorplanPlugin/utils/changeModelCanvasOpacity.js +134 -51
  180. package/plugins/FloorplanPlugin/utils/changeModelCanvasOpacity.mjs +134 -51
  181. package/plugins/FloorplanPlugin/utils/correctFiveState.js +134 -51
  182. package/plugins/FloorplanPlugin/utils/correctFiveState.mjs +134 -51
  183. package/plugins/FloorplanPlugin/utils/equal.js +134 -51
  184. package/plugins/FloorplanPlugin/utils/equal.mjs +134 -51
  185. package/plugins/FloorplanPlugin/utils/filter.js +134 -51
  186. package/plugins/FloorplanPlugin/utils/filter.mjs +134 -51
  187. package/plugins/FloorplanPlugin/utils/fiveModelLoad.js +134 -51
  188. package/plugins/FloorplanPlugin/utils/fiveModelLoad.mjs +134 -51
  189. package/plugins/FloorplanPlugin/utils/formatData.js +134 -51
  190. package/plugins/FloorplanPlugin/utils/formatData.mjs +134 -51
  191. package/plugins/FloorplanPlugin/utils/formatFloorplanJson.js +134 -51
  192. package/plugins/FloorplanPlugin/utils/formatFloorplanJson.mjs +134 -51
  193. package/plugins/FloorplanPlugin/utils/formatPosition.js +134 -51
  194. package/plugins/FloorplanPlugin/utils/formatPosition.mjs +134 -51
  195. package/plugins/FloorplanPlugin/utils/getDistanceFromModel.js +134 -51
  196. package/plugins/FloorplanPlugin/utils/getDistanceFromModel.mjs +134 -51
  197. package/plugins/FloorplanPlugin/utils/getPxmm.js +134 -51
  198. package/plugins/FloorplanPlugin/utils/getPxmm.mjs +134 -51
  199. package/plugins/FloorplanPlugin/utils/isTruelyObject.js +134 -51
  200. package/plugins/FloorplanPlugin/utils/isTruelyObject.mjs +134 -51
  201. package/plugins/FloorplanPlugin/utils/nearlyEqual.js +134 -51
  202. package/plugins/FloorplanPlugin/utils/nearlyEqual.mjs +134 -51
  203. package/plugins/FloorplanPlugin/utils/polylabel.js +134 -51
  204. package/plugins/FloorplanPlugin/utils/polylabel.mjs +134 -51
  205. package/plugins/FloorplanPlugin/utils/to.js +134 -51
  206. package/plugins/FloorplanPlugin/utils/to.mjs +134 -51
  207. package/plugins/GaussianSplattingEntranceAnimationPlugin/Controller.d.ts +6 -0
  208. package/plugins/GaussianSplattingEntranceAnimationPlugin/Controller.js +135 -52
  209. package/plugins/GaussianSplattingEntranceAnimationPlugin/Controller.mjs +135 -52
  210. package/plugins/GaussianSplattingEntranceAnimationPlugin/index.js +134 -51
  211. package/plugins/GaussianSplattingEntranceAnimationPlugin/index.mjs +134 -51
  212. package/plugins/Object3DHelperPlugin/Controller.js +134 -51
  213. package/plugins/Object3DHelperPlugin/Controller.mjs +134 -51
  214. package/plugins/Object3DHelperPlugin/Controllers/BaseController.js +134 -51
  215. package/plugins/Object3DHelperPlugin/Controllers/BaseController.mjs +134 -51
  216. package/plugins/Object3DHelperPlugin/Controllers/BoundingBoxController.js +134 -51
  217. package/plugins/Object3DHelperPlugin/Controllers/BoundingBoxController.mjs +134 -51
  218. package/plugins/Object3DHelperPlugin/Controllers/MoveController.js +134 -51
  219. package/plugins/Object3DHelperPlugin/Controllers/MoveController.mjs +134 -51
  220. package/plugins/Object3DHelperPlugin/Controllers/RotateController.js +134 -51
  221. package/plugins/Object3DHelperPlugin/Controllers/RotateController.mjs +134 -51
  222. package/plugins/Object3DHelperPlugin/FiveControllerWrapper.js +134 -51
  223. package/plugins/Object3DHelperPlugin/FiveControllerWrapper.mjs +134 -51
  224. package/plugins/Object3DHelperPlugin/Helper/BaseHelper.js +134 -51
  225. package/plugins/Object3DHelperPlugin/Helper/BaseHelper.mjs +134 -51
  226. package/plugins/Object3DHelperPlugin/Helper/BoundingBoxHelper.js +134 -51
  227. package/plugins/Object3DHelperPlugin/Helper/BoundingBoxHelper.mjs +134 -51
  228. package/plugins/Object3DHelperPlugin/Helper/MoveHelper.js +134 -51
  229. package/plugins/Object3DHelperPlugin/Helper/MoveHelper.mjs +134 -51
  230. package/plugins/Object3DHelperPlugin/Helper/RotateHelper.js +134 -51
  231. package/plugins/Object3DHelperPlugin/Helper/RotateHelper.mjs +134 -51
  232. package/plugins/Object3DHelperPlugin/constant.js +134 -51
  233. package/plugins/Object3DHelperPlugin/constant.mjs +134 -51
  234. package/plugins/Object3DHelperPlugin/index.js +134 -51
  235. package/plugins/Object3DHelperPlugin/index.mjs +134 -51
  236. package/plugins/Object3DHelperPlugin/utils/ArrowGroup.js +134 -51
  237. package/plugins/Object3DHelperPlugin/utils/ArrowGroup.mjs +134 -51
  238. package/plugins/Object3DHelperPlugin/utils/CenterHandle.js +134 -51
  239. package/plugins/Object3DHelperPlugin/utils/CenterHandle.mjs +134 -51
  240. package/plugins/Object3DHelperPlugin/utils/PlaneHandle.js +134 -51
  241. package/plugins/Object3DHelperPlugin/utils/PlaneHandle.mjs +134 -51
  242. package/plugins/Object3DHelperPlugin/utils/calculateScaleByCamera.js +134 -51
  243. package/plugins/Object3DHelperPlugin/utils/calculateScaleByCamera.mjs +134 -51
  244. package/plugins/Object3DHelperPlugin/utils/cameraHooks.js +134 -51
  245. package/plugins/Object3DHelperPlugin/utils/cameraHooks.mjs +134 -51
  246. package/plugins/Object3DHelperPlugin/utils/direction.js +134 -51
  247. package/plugins/Object3DHelperPlugin/utils/direction.mjs +134 -51
  248. package/plugins/Object3DHelperPlugin/utils/getMouseRaycaster.js +134 -51
  249. package/plugins/Object3DHelperPlugin/utils/getMouseRaycaster.mjs +134 -51
  250. package/plugins/Object3DHelperPlugin/utils/getOrthographicCameraDirection.js +134 -51
  251. package/plugins/Object3DHelperPlugin/utils/getOrthographicCameraDirection.mjs +134 -51
  252. package/plugins/Object3DHelperPlugin/utils/setObjectQuaternion.js +134 -51
  253. package/plugins/Object3DHelperPlugin/utils/setObjectQuaternion.mjs +134 -51
  254. package/plugins/Object3DHelperPlugin/utils/solidGuide.js +134 -51
  255. package/plugins/Object3DHelperPlugin/utils/solidGuide.mjs +134 -51
  256. package/plugins/Object3DHelperPlugin/utils/tipsDom.js +134 -51
  257. package/plugins/Object3DHelperPlugin/utils/tipsDom.mjs +134 -51
  258. package/plugins/PanoAnimePlugin/Controller.js +134 -51
  259. package/plugins/PanoAnimePlugin/Controller.mjs +134 -51
  260. package/plugins/PanoAnimePlugin/index.js +134 -51
  261. package/plugins/PanoAnimePlugin/index.mjs +134 -51
  262. package/plugins/WordPassPlugin/Controller.js +134 -51
  263. package/plugins/WordPassPlugin/Controller.mjs +134 -51
  264. package/plugins/WordPassPlugin/hersheyFont.js +134 -51
  265. package/plugins/WordPassPlugin/hersheyFont.mjs +134 -51
  266. package/plugins/WordPassPlugin/index.js +134 -51
  267. package/plugins/WordPassPlugin/index.mjs +134 -51
  268. package/plugins/WordPassPlugin/textToStrokeOrderStrokes.js +134 -51
  269. package/plugins/WordPassPlugin/textToStrokeOrderStrokes.mjs +134 -51
  270. package/plugins/WordPassPlugin/word-pass.js +134 -51
  271. package/plugins/WordPassPlugin/word-pass.mjs +134 -51
  272. package/plugins/index.js +134 -51
  273. package/plugins/index.mjs +134 -51
  274. package/plugins/thirdParty/CSS2DRenderer.js +134 -51
  275. package/plugins/thirdParty/CSS2DRenderer.mjs +134 -51
  276. package/plugins/thirdParty/CSS3DRenderer.js +134 -51
  277. package/plugins/thirdParty/CSS3DRenderer.mjs +134 -51
  278. package/plugins/thirdParty/doctorstrange-model.js +134 -51
  279. package/plugins/thirdParty/doctorstrange-model.mjs +134 -51
  280. package/plugins/thirdParty/domevents.js +134 -51
  281. package/plugins/thirdParty/domevents.mjs +134 -51
  282. package/plugins/utils/absoluteUrl.js +134 -51
  283. package/plugins/utils/absoluteUrl.mjs +134 -51
  284. package/plugins/utils/calculatePath.js +134 -51
  285. package/plugins/utils/calculatePath.mjs +134 -51
  286. package/plugins/utils/clamp.js +134 -51
  287. package/plugins/utils/clamp.mjs +134 -51
  288. package/plugins/utils/uuid.js +134 -51
  289. package/plugins/utils/uuid.mjs +134 -51
  290. package/react/index.js +134 -51
  291. package/react/index.mjs +134 -51
  292. package/sticker/index.d.ts +7 -0
  293. package/sticker/index.js +169 -52
  294. package/sticker/index.mjs +307 -67
  295. package/umd/five-gltf-loader.js +135 -52
  296. package/umd/five-line.js +135 -52
  297. package/umd/five-plugins.js +135 -52
  298. package/umd/five-react.js +134 -51
  299. package/umd/five-sticker.js +169 -52
  300. package/umd/five-vfx.js +134 -51
  301. package/umd/five.js +337 -179
  302. package/vfx/index.js +134 -51
  303. package/vfx/index.mjs +134 -51
  304. package/work-downloader/index.js +134 -51
  305. package/work-downloader/index.mjs +134 -51
  306. package/five/gaussian-splatting/shStore.d.ts +0 -22
  307. /package/five/assets/{realsee-pmg-data-url.d.ts → realsee-png-data-url.d.ts} +0 -0
@@ -1,5 +1,7 @@
1
1
  import * as THREE from 'three/webgpu';
2
2
  import { PBMGaussianSplattingNodeMaterial } from '../materials/pbmGaussianSplattingNodeMaterial';
3
+ import { SplatArena } from '../../gaussian-splatting/arena/splatArena';
4
+ import type { GSplatMirrorSet } from '../../gaussian-splatting/mirrors/mirrorSet';
3
5
  /**
4
6
  * 3DGS 渲染 Mesh(WebGPU / TSL 版)
5
7
  *
@@ -9,14 +11,15 @@ import { PBMGaussianSplattingNodeMaterial } from '../materials/pbmGaussianSplatt
9
11
  * 经 THREE.DataTexture 上传供主材质采样)
10
12
  * - `TransformStore`:细粒度 transform 更新(9 texel/对象,含 CPU 预算 inverse)+ 排序用 20 float/对象
11
13
  * - `LayerRegistry`:layerKey → 稳定 layerIndex
12
- * - `SHStore`:按对象顺序连续写入 SH 纹理
14
+ * - `SHAssembler` / `SHBaker` / `SHBakeScheduler`:per-tile SH 纹理 + 按视角预烘焙颜色
15
+ * (按当前渲染路径的全局点索引写入烘焙纹理,两条渲染路径只读烘焙结果)
13
16
  *
14
- * 布局三一致(Requirements 13.1 / 13.2):`SplatAssembler.regionList` 顺序 ≡ `TransformStore`
15
- * 索引顺序 ≡ `SHStore` 写入顺序。四个协作者都从**同一有序 `objects` 数组、同一顺序**同步,
16
- * 因此不会产生 transformIndex / SH 错位;`onBeforeRender` 中另加防御性一致性断言兜底。
17
+ * 布局一致:`SplatAssembler.regionList` 顺序 ≡ `TransformStore` 索引顺序。协作者都从
18
+ * **同一有序 `objects` 数组、同一顺序**同步,因此不会产生 transformIndex 错位;
19
+ * `onBeforeRender` 中另加防御性一致性断言兜底。
17
20
  *
18
21
  * 排序:本类**不再自己排序**。排序、绘制索引来源与绘制实例数一律经 `GSplatPipeline` 抽象基类
19
- * 消费(Requirement 10.2):
22
+ * 消费:
20
23
  * - `RASTER_CPU_SORT`(`CpuSortPipeline`):wasm worker 排序 + Reorder_CPU,索引来自
21
24
  * `splatIndex` 实例属性;
22
25
  * - `RASTER_GPU_SORT`(`GpuSortPipeline`):GPU radix sort,索引来自 R32UI Order_Texture。
@@ -38,7 +41,19 @@ declare class PBMGaussianSplattingRenderMesh extends THREE.Mesh<THREE.InstancedB
38
41
  private assembler;
39
42
  private transformStore;
40
43
  private layerRegistry;
41
- private shStore;
44
+ private shAssembler;
45
+ private shBaker;
46
+ private shScheduler;
47
+ private shJobs;
48
+ /** Compute 路径下由 `arena.layout` 映射出的烘焙区间(复用,避免每帧分配) */
49
+ private shEntries;
50
+ private shCapacityWarned;
51
+ /** 本帧是否读烘焙颜色(appliedDegree > 0 且容量 ok) */
52
+ private shBakedActive;
53
+ /** 上次烘焙时所处路径(true = Compute);路径切换时全局点索引整体改变,需全部重烘焙 */
54
+ private shLastComputePath;
55
+ /** WebGL 后端的 MAX_TEXTURE_SIZE(首次查询后缓存) */
56
+ private glMaxTextureSize;
42
57
  /**
43
58
  * 当前生效的排序管线。由 `syncPipelineMode` 按 Current_Pipeline_Mode 创建 / 重建,
44
59
  * 尚未创建(首帧之前)时为 null。
@@ -60,7 +75,7 @@ declare class PBMGaussianSplattingRenderMesh extends THREE.Mesh<THREE.InstancedB
60
75
  */
61
76
  private _pipelineRenderer;
62
77
  /**
63
- * 传给管线的每帧参数。**跨帧复用同一个对象**(Requirement 10.7),每帧填字段后传入,
78
+ * 传给管线的每帧参数。**跨帧复用同一个对象**,每帧填字段后传入,
64
79
  * 不在渲染循环里新建。`camera` 由每帧填充,构造时无值。
65
80
  */
66
81
  private _frameParams;
@@ -70,17 +85,163 @@ declare class PBMGaussianSplattingRenderMesh extends THREE.Mesh<THREE.InstancedB
70
85
  */
71
86
  private assemblePending;
72
87
  private forceClipperUniformRefresh;
73
- private usedSHDegree;
88
+ /** 实际生效的 SH 阶数 = min(usedSHDegree, 数据阶数, MAX_RENDER_SH_DEGREE),全局唯一 */
89
+ private appliedSHDegree;
90
+ /**
91
+ * Requested_Instance_Size 的原始写入值。
92
+ *
93
+ * 默认 **128**,与 PlayCanvas `GSplatResourceBase.instanceSize` 取同一经验值
94
+ * (其为无 setter 的 static getter,应用层包括 SuperSplat 都用这一个值)。
95
+ *
96
+ * 注意这里**有意偏离** requirements.md 的 Requirement 1.2 / 12.6(原定默认 1 以保证
97
+ * 「默认配置与本特性引入前逐字节等价」):默认值经决策直接定为 128,因此本特性在默认
98
+ * 配置下即生效,不再具备零回归保证。回退方式是把本行改回 1。
99
+ *
100
+ * 仅在 `RASTER_GPU_SORT` 路径下生效;CPU 排序路径由 `resolveInstanceSize` 强制为 1
101
+ * 并输出一条告警(每 (mode, requested) 组合至多一条,不逐帧刷屏)。
102
+ */
103
+ private _requestedInstanceSize;
104
+ /** Effective_Instance_Size。由 setter 与每帧的 `syncInstancePacking` 同步求值。 */
105
+ private _effectiveInstanceSize;
106
+ /**
107
+ * 当前 Packed_Quad_Geometry 实际承载的 quad 数。初值 1(`createGeometry` 建的是 K = 1)。
108
+ *
109
+ * **用显式字段而非从 `geometry.getAttribute('position').count / 4` 反推**,两条理由:
110
+ * 1. 反推需要读属性对象再做一次除法,违反 Requirement 5.3 对每帧一致性检查
111
+ * 「常数次整数比较」的开销约束;
112
+ * 2. 几何体重建失败时属性可能处于「已换 position 未换 index」的中间态,
113
+ * 此时反推会得出一个与索引缓冲不自洽的值。
114
+ * 该字段只在 position 与 index **都**成功替换后才更新。
115
+ */
116
+ private _geometryQuadCount;
117
+ /** Current_Pipeline_Mode 是否已解析过(`syncPipelineMode` 至少跑过一次)。 */
118
+ private _pipelineResolved;
119
+ /** dispose 后置位,屏蔽后续重建与告警。 */
120
+ private _disposed;
121
+ /**
122
+ * Compute_Path 的点数门控:总点数超过它即回落 Fallback_Path。
123
+ *
124
+ * 与设备上报的 `maxStorageBufferBindingSize` 并列,取两者较小者。这道锁存在的理由是
125
+ * `InternalWebGPURenderer` 已按 adapter 上报值申请设备上限(桌面通常是 GiB 量级),原先由
126
+ * 规范默认值 128 MiB 顺带充当的"保险丝"没了,需要一道自己能定的闸门来兜住超大场景的显存。
127
+ * 默认值与依据见 `DEFAULT_MAX_COMPUTE_POINTS`。
128
+ *
129
+ * 每帧透传给 Arena(`prepareComputePath`),因此运行时修改在下一帧生效;但**调小不回收已
130
+ * 分配的容量**,只在下次需要扩容时才生效(见 `SplatArena.maxPoints`)。
131
+ */
132
+ maxComputePoints: number;
133
+ /**
134
+ * Arena(GPU 端紧凑装配器)。**延迟创建**:`GPUDevice` 只能从 `onBeforeRender` 的 renderer
135
+ * 拿到,因此首帧才创建;后端非 WebGPU、device 未就绪或创建失败时保持 `null`。
136
+ */
137
+ private _arena;
138
+ private _layoutMirror;
139
+ private _transformMirror;
140
+ private _objectParamsMirror;
141
+ /**
142
+ * 三块镜像打成的一个集合对象,供 `FiveRenderer` 直接传给 `submitFrame`。
143
+ *
144
+ * **在创建时构造一次并缓存**,不在访问器里每次新建:该访问器每个 Render_Frame 被读一次,
145
+ * 逐帧新建对象只是白给 GC 添活。
146
+ */
147
+ private _mirrorSet;
148
+ /**
149
+ * `ObjectParamsMirror` 的对象列表来源。
150
+ *
151
+ * 存的是 `rebuildScene` 收到的**那个** objects 数组,因此其顺序与 `transformStore.sync`
152
+ * 完全一致——这正是「transformIndex 可直接作为镜像记录下标」的前提。集合未变化的帧不走
153
+ * `rebuildScene`,此时数组内容与当前场景一致(集合哈希相等),沿用无误。
154
+ */
155
+ private _mirrorObjects;
156
+ /**
157
+ * 最近一次由 `FiveRenderer` 回写的存活点数;尚未取得过时为 `null`。
158
+ *
159
+ * `null` 与 `0` 必须可区分:前者是「Compute_Path 未生效或尚未完成首次回读」,
160
+ * 后者是「本帧确实没有点存活」。示例侧据此显示 `-` 而非 0。
161
+ */
162
+ private _survivorCount;
163
+ /** 本帧 Compute_Path 是否实际生效,由 `onBeforeRender` 每帧重新解析。 */
164
+ private _computePathActive;
74
165
  constructor();
75
166
  /**
76
167
  * Requested_Pipeline_Mode(`GSPLAT_PIPELINE_*`)。写入后在**下一帧**由
77
168
  * `syncPipelineMode` 解析并按需重建管线,便于开发期在同场景下对比两条管线
78
- * (Requirement 13.2)。
79
169
  */
80
170
  get pipelineMode(): number;
81
171
  set pipelineMode(value: number);
82
172
  /** 实际生效的 Current_Pipeline_Mode(解析后的结果,永不为 `AUTO`)。 */
83
173
  get currentPipelineMode(): number;
174
+ /**
175
+ * 本帧 Compute_Path 是否**实际生效**(只读)。
176
+ *
177
+ * 供 `FiveRenderer` 在 `renderer.render()` **之后**读取——本属性由 `onBeforeRender` 写入,而
178
+ * `onBeforeRender` 由 three 在渲染本 Mesh 时回调,即发生在 `render()` 内部。在 `render()`
179
+ * 之前读取拿到的是上一帧的取值。
180
+ */
181
+ get computePathActive(): boolean;
182
+ /**
183
+ * Hybrid_Path 的 compute 渲染器。与 `_arena`、三块 Mirror 一样由本类持有、同一时机创建、
184
+ * 在 `dispose` 中一并释放。
185
+ */
186
+ private _hybridRenderer;
187
+ /** 资源初始化失败即置位,**此后不再重试**(避免逐帧抛同一个异常)。 */
188
+ private _computeFailure;
189
+ /**
190
+ * Arena(只读)。尚未创建(非 WebGPU 后端 / device 未就绪 / 创建失败)时为 `null`。
191
+ *
192
+ * 读取本属性与读取 Arena 自身的 `buffer` / `totalPoints` / `layout` / `revision` 一样是同步、
193
+ * 无副作用的:不触发装配、不创建或销毁资源。
194
+ */
195
+ get arena(): SplatArena | null;
196
+ /**
197
+ * Cull_Pass 所需的三块镜像(只读)。尚未创建时为 `null`,渲染器据此整体跳过剔除路径
198
+ * (不视为错误)。
199
+ *
200
+ * 与 `arena` 一样是同步、无副作用的读取:不上传、不置脏、不创建或销毁资源。镜像的
201
+ * `upload()` 由渲染器在 encoder 之外调用,本访问器只交出引用。
202
+ */
203
+ get mirrors(): GSplatMirrorSet | null;
204
+ /**
205
+ * 存活点数(只读)。`null` 表示尚不可得——Compute_Path 未生效、或异步回读尚未成功过一次。
206
+ *
207
+ * 取值来自 `GSplatComputeRenderer` 的廉价异步回读,因此**滞后于当前帧**(一帧以上)。
208
+ * 示例侧显示时须标注该值为异步取得。
209
+ *
210
+ * **`null` 与 `0` 语义不同**,消费方不得把两者合并:`null` 是「取不到」,`0` 是「确实
211
+ * 一个点都没存活」。
212
+ */
213
+ get survivorCount(): number | null;
214
+ /**
215
+ * 回写存活点数。**只应由 `FiveRenderer` 在每帧提交 3DGS Compute_Path 时调用。**
216
+ *
217
+ * ## 为什么是回写而不是本类直接转发
218
+ *
219
+ * 存活点数的权威来源是 `GSplatComputeRenderer`,而**本类不持有它**:该渲染器由
220
+ * `FiveRenderer` 创建与持有,本类只能从 `onBeforeRender` 拿到 three 的 `WebGPURenderer`,
221
+ * 拿不到那个 compute 渲染器实例。可选做法有三种:
222
+ *
223
+ * - 让本类反向持有 compute 渲染器:得改动所有权关系,且要处理「渲染器换实例 / 被降级」
224
+ * 的失效,代价最大;
225
+ * - 让示例侧直接问 `FiveRenderer`:需要在 `Five` 上再开一条对外通路,改动面比本方案大,
226
+ * 且与既有「3DGS 状态一律经 Render_Mesh 暴露」的读法不一致;
227
+ * - **(本实现)由 `FiveRenderer` 在提交帧时把值回写过来。** 一个 setter、一处调用,
228
+ * 不动任何所有权关系。
229
+ *
230
+ * 代价是本类的这个取值依赖调用方按帧回写;不回写时保持上一次的取值,语义上仍然成立
231
+ * (它本就是「最近一次成功回读的值」)。
232
+ */
233
+ setSurvivorCount(value: number | null): void;
234
+ /**
235
+ * Requested_Instance_Size:打包进单个绘制实例的 quad 数(Instance_Size / K)。
236
+ *
237
+ * 读取返回最近一次写入的**原始值**,不做取整与 clamp。
238
+ * 写入在**返回前**同步更新 `effectiveInstanceSize`,而几何体与
239
+ * 着色器程序的同步延迟到下一个 Render_Frame。
240
+ */
241
+ get requestedInstanceSize(): number;
242
+ set requestedInstanceSize(value: number);
243
+ /** Effective_Instance_Size(只读):校验与路径约束后实际生效的取值。 */
244
+ get effectiveInstanceSize(): number;
84
245
  /** 平移增量阈值(世界单位):超过才重排。 */
85
246
  get sortCameraDistance(): number;
86
247
  set sortCameraDistance(value: number);
@@ -90,6 +251,13 @@ declare class PBMGaussianSplattingRenderMesh extends THREE.Mesh<THREE.InstancedB
90
251
  /** 最小重排间隔(ms):即使脏也不超过此频率,0=不限。 */
91
252
  get sortMinIntervalMs(): number;
92
253
  set sortMinIntervalMs(value: number);
254
+ /**
255
+ * SH 重烘焙阈值角度(度),合法区间 [0, 90),默认 10。
256
+ * 相机相对 tile 上次烘焙位置的视角变化超过该角度才重新计算 SH 颜色;0 等价于逐帧精确计算。
257
+ * 修改本身不触发强制重烘焙;非法值告警并忽略。
258
+ */
259
+ get shRebakeAngle(): number;
260
+ set shRebakeAngle(value: number);
93
261
  private createGeometry;
94
262
  private createMaterial;
95
263
  private createDefaultLayerClipperRanges;
@@ -106,32 +274,206 @@ declare class PBMGaussianSplattingRenderMesh extends THREE.Mesh<THREE.InstancedB
106
274
  /**
107
275
  * 场景变化时按**同一有序 objects**依次同步四个协作者,保证布局三一致:
108
276
  * layerRegistry / transformStore 先行(assembler 的 resolveIndices 依赖二者的 indexOf/layerIndexOf),
109
- * 再 assembler.sync(增量 diff + 连续 start 偏移,不触碰 GPU)→ shStore.sync;大纹理组装
277
+ * 再 assembler.sync(增量 diff + 连续 start 偏移,不触碰 GPU)→ syncSH;大纹理组装
110
278
  * 延迟到 onBeforeRender 中的 assembler.assemble()。
111
279
  */
112
280
  private rebuildScene;
281
+ /** per-tile SH 纹理增量同步(只上传新增 tile) */
282
+ private syncSH;
283
+ /** 后端最大 2D 纹理尺寸:WebGPU 取 device limits,WebGL 取 MAX_TEXTURE_SIZE。 */
284
+ private getMaxTextureSize;
285
+ /**
286
+ * 每帧 SH 预烘焙:挑出需要重算的 tile 写入烘焙纹理(按本帧渲染路径的全局点索引寻址)。
287
+ * 须在 `_computePathActive` 本帧终裁之后(寻址取决于路径)、`syncMaterialTextures` / `drawHybrid` 之前调用。
288
+ */
289
+ private updateSHBake;
113
290
  /**
114
- * 防御性断言:regionList 顺序 ≡ objects 顺序 ≡ TransformStore 索引顺序(Requirements 13.1/13.2)。
291
+ * 防御性断言:regionList 顺序 ≡ objects 顺序 ≡ TransformStore 索引顺序。
115
292
  * 四者由 rebuildScene 从同一 objects 同序同步,正常情况下恒成立;不成立即视为错误状态并告警。
116
293
  */
117
294
  private assertLayoutConsistency;
118
295
  /** 把 store 产出的纹理与 SH 阶数同步到材质。 */
119
296
  private syncMaterialTextures;
120
297
  /**
121
- * 每帧一次的 Pipeline_Mode 检查与管线切换(Requirement 8.2)。
298
+ * 每帧一次的 Pipeline_Mode 检查与管线切换。
122
299
  *
123
300
  * 之所以每帧检查而非首帧一次性初始化:`pipelineMode` 的运行时修改要在下一帧生效
124
- * (Requirement 8.6 / 13.2),且 `totalPoints` 增长导致 limits 越界、或 GPU 管线运行期失效
301
+ *,且 `totalPoints` 增长导致 limits 越界、或 GPU 管线运行期失效
125
302
  * (compute pipeline 创建失败 / device lost,经 `unusable` 汇聚)时都要能自动降级。
126
303
  * 所有降级情形统一归结为「`resolvePipelineMode` 返回 `RASTER_CPU_SORT`」后由本方法完成切换
127
- * (Requirement 15.4),因此不存在第二条降级代码路径。
304
+ *,因此不存在第二条降级代码路径。
128
305
  *
129
- * 模式未变且管线已就绪时只做一次整数比较即返回,开销可忽略(Requirement 8.10)。
306
+ * 模式未变且管线已就绪时只做一次整数比较即返回,开销可忽略。
130
307
  *
131
308
  * @param renderer 本帧渲染器(由 `onBeforeRender` 传入,是取 `GPUDevice` 的唯一入口)
132
309
  * @param totalPoints 当前布局的 Total_Points,用于按实际规模检查 limits
133
310
  */
134
311
  private syncPipelineMode;
312
+ /**
313
+ * 每帧一次的 instance packing 同步。
314
+ *
315
+ * 三件事,顺序固定:
316
+ * ① 按当前 Current_Pipeline_Mode 重新求值 Effective_Instance_Size
317
+ * ② 与几何体承载的 quad 数比对,不一致则重建 `position` 与 `index`
318
+ * ③ 把取值同步给材质(K 是编译期常量,变化需重建程序)
319
+ *
320
+ * 一致时的开销是常数次整数比较,不随 Total_Points 增长;
321
+ * 本方法自身不新建 TypedArray 与 GPU buffer(只有 ② 触发重建时才分配)。
322
+ *
323
+ * @param totalPoints 当前布局的 Total_Points(仅用于「是否为 0」的分支,不参与 K 的求值)
324
+ * @returns 本帧是否可以提交绘制(几何体处于失败态时为 false,调用方令 Instance_Count = 0)
325
+ */
326
+ private syncInstancePacking;
327
+ /** K 是编译期字面量常量,变化必须重建程序。 */
328
+ private syncMaterialInstanceSize;
329
+ /**
330
+ * 重建 Packed_Quad_Geometry 的 `position` 与 `index`。
331
+ *
332
+ * **替换属性对象而非新建几何体**:Requirement 5.9 要求保持同一 `InstancedBufferGeometry`
333
+ * 实例、保留 `splatIndex` 占位属性对象及其 `_maxInstanceCount` 维护逻辑,因此这里
334
+ * **不调用** `geometry.dispose()`。
335
+ *
336
+ * three 侧的正确性依据:`RenderObject.needsGeometryUpdate` 会把 `attributesId` 里记录的
337
+ * 每个属性 id 与当前 `geometry.getAttribute(name).id` 逐个比对,不等即触发 `setGeometry()`
338
+ * 清空属性缓存并在下次 `getAttributes()` 重新收集。所以「替换属性对象」是 three WebGPU
339
+ * 后端官方支持的更新路径。`itemSize`(3)与类型(Float32)都不变,vertex buffer layout
340
+ * 不变,render pipeline 本身不因几何体重建而失效(它会因材质 `needsUpdate` 重建,与此无关)。
341
+ *
342
+ * 本方法不向外抛异常:失败时还原重建前的属性并返回 `false`。
343
+ *
344
+ * @param quadCount 目标 quad 数(Effective_Instance_Size)
345
+ * @returns 是否重建成功
346
+ */
347
+ private rebuildPackedQuadGeometry;
348
+ /**
349
+ * 释放被替换属性占用的 GPU buffer。
350
+ *
351
+ * three 没有公开的「单独释放一个 BufferAttribute」API,但内部路径是明确的:
352
+ * `Renderer._attributes.delete(attribute)` → `DataMap.delete` 清缓存 →
353
+ * `backend.destroyAttribute(attribute)` → `WebGPUAttributeUtils.destroyAttribute`
354
+ * 销毁 `GPUBuffer`。
355
+ *
356
+ * 这是**内部 API**,因此全程可选链 + `try/catch`:若 three 版本调整了内部结构,
357
+ * 这里退化为「不显式释放」,旧 `GPUBuffer` 随 attribute 对象被 GC 回收,
358
+ * **不影响渲染正确性**,只是释放时机变晚。
359
+ *
360
+ * 渲染器复用既有的 `_pipelineRenderer` 字段(`syncPipelineMode` 里已记录本帧渲染器),
361
+ * 不为此新增 renderer 引用。
362
+ */
363
+ private releaseAttributeGpuResource;
364
+ /**
365
+ * 求值本帧 Instance_Count。
366
+ *
367
+ * 按 `pipeline.requiresOrderTexture` 分流而非 `instanceof`:该 getter 是
368
+ * `GSplatPipeline` 的既有能力查询契约,不需要新增接口,也不引入对管线实现类型的依赖。
369
+ *
370
+ * `pipeline.instanceCount` 的契约语义保持不变(仍是「可绘制的 splat 数」),`ceil` 除法只
371
+ * 发生在这里,因此上游 spec gsplat-gpu-sort 无需修改。
372
+ *
373
+ * `Math.ceil(raw / k)` 用浮点除法而非整数运算是安全的:`raw` 上限约 1677 万(受 keygen
374
+ * dispatch 上限约束)、`k <= 256`,二者都在双精度可精确表示的范围内,无舍入风险。
375
+ * Requirement 4.5(`0 < raw < k` 时取 1)与 4.6 的双向不等式都是 `ceil` 的定义性质,
376
+ * 不需要额外代码。
377
+ *
378
+ * @param pipeline 本帧生效的管线
379
+ * @param resourcesReady Render_Mesh 侧的资源就绪判据
380
+ * @returns 提交给 `geometry.instanceCount` 的实例数;任何不可用情形均为 0
381
+ */
382
+ private resolveInstanceCount;
383
+ /**
384
+ * 后端是否为 WebGPU 且 `GPUDevice` 已就绪。**每帧实算,不缓存。**
385
+ *
386
+ * 曾经是「三态缓存 + 连续 120 帧未就绪则置终态 false」。那个超时终态在 iPhone 上会误杀:
387
+ * WebGPU device 的异步创建比桌面慢,前 120 帧都拿不到 device,于是被永久判定为不可用,
388
+ * 之后 device 就绪了也不再启用 —— 表现为「backend 显示 WEBGPU 但 3dgs path 恒为 FALLBACK,
389
+ * 且没有任何报错」。两个判据每帧都可查、没有任何计算量,缓存它没有收益。
390
+ */
391
+ private probeComputeBackend;
392
+ /**
393
+ * Compute_Path 的每帧起点:**探测 → Arena 延迟创建 → `arena.beginFrame()` → 解析
394
+ * `_computePathActive`**,四件事按此次序一次做完。
395
+ *
396
+ * **调用位置必须在 `isSceneNeedsRebuild` / `rebuildScene` 之前**,理由是两条依赖交叉:
397
+ * - Arena 只能从 `renderer` 拿 device,故创建必须在 `onBeforeRender` 内;
398
+ * - `rebuildScene` 内部会调 `arena.sync`,而 `beginFrame()` 必须早于本帧任何 `sync`
399
+ * (它负责归零每帧流量计数器并结算上一帧的流量校验)。
400
+ *
401
+ * 把四件事都放在 `collectObjects` 之后、`isSceneNeedsRebuild` 之前,两条依赖同时满足:
402
+ * device 已可取得,且本帧的 `sync` 一定发生在 `beginFrame()` 之后。
403
+ *
404
+ * `_computePathActive` 也在此解析而非等到 `syncPipelineMode` 之后:它的三个输入(探测结论、
405
+ * 开关、Arena 可用性)在这里全部已知,而**下游的 `assembler.assemble()` 早于
406
+ * `syncPipelineMode`**,若等到那之后再解析就来不及跳过组装。解析结果与放在哪里无关——
407
+ * `unusable` 只会在 `encodeAssembly`(`FiveRenderer` 侧,本帧 `render()` 之后)与 `dispose`
408
+ * 中改变,本方法与 `syncPipelineMode` 之间不存在任何能改变它的调用。
409
+ */
410
+ private prepareComputePath;
411
+ /** 建 Arena、Hybrid 渲染器与三块 Mirror。三者可用性对 Compute_Path 是「与」关系,同生同灭。 */
412
+ private createComputeResources;
413
+ /**
414
+ * 建 Hybrid 渲染器。color / depth 格式**必须与 Draw 命令所在 render pass 的附件严格一致**,
415
+ * 否则 `setPipeline` 被校验层拒绝。
416
+ *
417
+ * color 从 three 当前 render target 的纹理类型推:`FiveRenderer` 的合成 RT 是
418
+ * `{ type: outputType }` + 默认 `RGBAFormat`,于是 `HalfFloatType → 'rgba16float'`,
419
+ * 其余(`UnsignedByteType`)→ `'rgba8unorm'`。depth 取 `'depth24plus'`:three 为合成目标建的
420
+ * `DepthTexture`(默认 `DepthFormat` + `UnsignedIntType`)落到 WebGPU 后端就是它。
421
+ *
422
+ * 对数深度缓冲下返回 `null`:`gsplatQuad.wgsl` 用 `clip.z = -P22 · depth + P32` 重建裁剪空间
423
+ * 深度,只对常规投影成立,而 three 在该标志为真时走 `viewZToLogarithmicDepth`。症状是 3DGS
424
+ * 相对不透明几何整体偏前或偏后。
425
+ */
426
+ private createHybridRenderer;
427
+ /**
428
+ * Hybrid_Path 的绘制:编码 compute 链并把 Draw 命令录进 three 当前活跃的 render pass。
429
+ *
430
+ * 由 `onBeforeRender` 末尾调用,那一刻三个前提同时成立:Layout_Table 已就绪、不透明几何已画完
431
+ * 且深度已写入、其后的半透明与 overlay 对象还没开始画(本 Mesh 的
432
+ * `renderOrder = -99999999999` 是 transparent 队列第一个)。放到 `render()` 之后画会把 grid、
433
+ * `intersectMesh` 这类 overlay 全盖住。
434
+ */
435
+ private drawHybrid;
436
+ /**
437
+ * 取 three 当前活跃的 `GPURenderPassEncoder` 与它的状态缓存失效化回调。
438
+ *
439
+ * 依赖三个非公开字段:`renderer._currentRenderContext`(`renderObject` 期间有效)、
440
+ * `backend.get(rc).currentPass`、`.currentSets`。取不到就跳过本帧绘制而不是抛给渲染循环,
441
+ * 故 three 升级若改名,症状是 Compute_Path 下 3DGS 不显示而非崩溃。
442
+ */
443
+ private getActiveRenderPass;
444
+ /**
445
+ * 创建三块 Mirror 并缓存它们的集合对象。仅由 `prepareComputePath` 在创建 Arena 的同一处调用。
446
+ *
447
+ * 三个取数闭包都指向本类自己的状态,因此镜像与本类之间**只有单向引用**(镜像持闭包,本类
448
+ * 持镜像),不构成互相持有:
449
+ * - Layout:读 `_arena.layout`。Arena 在 `unusable` 时自己返回空表,故这里不必再判可用性;
450
+ * - Transform:读 `transformStore`(其 `transforms` 是公开 getter,每对象 20 float、
451
+ * 前 16 个即 matrixWorld 列主序),因此**不需要改动 `TransformStore`**;
452
+ * - Object_Params:读 `_mirrorObjects`,即 `rebuildScene` 收到的那个有序数组。
453
+ */
454
+ private createMirrors;
455
+ /**
456
+ * 级联销毁三块 Mirror 并清掉集合缓存。`MirrorBuffer.dispose()` 幂等且内部捕获异常,
457
+ * 因此这里不需要 try/catch。
458
+ */
459
+ private disposeMirrors;
460
+ /**
461
+ * 判定本帧场景是否用到了 Hybrid_Path 还没迁进 compute 的功能。
462
+ *
463
+ * 两项功能(viewlayer clipper、入场动画)在 Fallback 的 TSL 顶点着色器里已实现,
464
+ * `gsplatProjector.wgsl` 还没写。命中任一项就走 Fallback,画面因此始终正确、只是拿不到
465
+ * Hybrid 的性能收益。SH 由 SHBaker 预烘焙、两条路径同读烘焙颜色,不是回落判据。
466
+ *
467
+ * **本方法与 `gsplat-hybrid-projection` 的任务 2.2 / 2.3 是一组的:那两项完成后,对应的判据
468
+ * 要一并删掉,本方法随之整个消失。** 别把它当成长期存在的能力检查。
469
+ *
470
+ * 判据的取值来源刻意不走 `this.material.numGsClippers`:它由 `updateClipperUniforms` 更新,
471
+ * 排在本判定**之后**,读它会拿到上一帧的值——症状是加 clipper 的那一帧先用 Hybrid 画一帧不带
472
+ * 该功能的画面、下一帧才切回 Fallback,即闪一帧。改读数据源就没有这个延迟。
473
+ *
474
+ * @returns 命中的原因键,未命中时 `null`
475
+ */
476
+ private resolveHybridUnsupportedReason;
135
477
  onBeforeRender: (renderer: any, scene: THREE.Scene, camera: THREE.Camera, ..._rest: any[]) => void;
136
478
  dispose(): void;
137
479
  }
@@ -80,6 +80,10 @@ export interface ParameterMaterialValue {
80
80
  boundingBox: THREE.Box3;
81
81
  /** 3dgs球谐阶数*/
82
82
  gaussianSplattingSHDegree: number;
83
+ /**
84
+ * 是否开启 3dgs 加载入场动画(点云扩散生长 + 运镜)
85
+ */
86
+ enableGaussianSplattingInitAnimation: boolean;
83
87
  maxDisplayBoost: number;
84
88
  /** 自定义节点列表(TSL Node 级别的材质扩展) */
85
89
  customNodes: readonly PBMCustomNode[];
@@ -1,3 +1,5 @@
1
+ import { BinnedPipelineCache, type BinnedPipelines, type BinnedStage, type TransparentBinnedStage } from './binned-pipelines';
2
+ import type { ExtraBuffers } from '../transparency-buffers';
1
3
  /** 光栅参数(像素直径):≤ SMALL 单线程绘制,≤ LARGE 按点协作,更大按 8×8 子块协作 */
2
4
  export declare const RASTER_CONFIG: {
3
5
  readonly smallThreshold: 8;
@@ -15,10 +17,17 @@ export declare const RASTER_CONFIG: {
15
17
  * 分桶协作光栅的 GPU 资源与命令编码。
16
18
  * classify 按点尺寸分类:Small 直接绘制,Medium / Large 入桶;
17
19
  * 随后 coop_medium 每个 workgroup 绘制一个点,coop_large 每个 workgroup 绘制一个 8×8 子块。
20
+ *
21
+ * 按阶段编码:各阶段复用同一组桶、子块、计数器与 indirect 参数。
22
+ * 每个阶段开始前须 `encodeClearCounters(encoder)`(在计算通道之外),随后在计算通道内
23
+ * 对各块 `encodeStageClassify`,最后 `encodeStageCoop`。透明阶段先调用 `prepareStage`
24
+ * 准备流水线与平面绑定组。
18
25
  */
19
26
  export declare class BinnedCore {
20
27
  private readonly device;
21
28
  private readonly frameUniformBuffer;
29
+ /** 各阶段的流水线;不透明变体在构造时创建,透明变体惰性创建 */
30
+ readonly pipelines: BinnedPipelineCache;
22
31
  private readonly pipes;
23
32
  private readonly counters;
24
33
  private readonly args;
@@ -30,17 +39,51 @@ export declare class BinnedCore {
30
39
  private argsBG;
31
40
  private coopBG;
32
41
  private boundFramebuffer;
42
+ /** 透明阶段 coop group0(不含 framebuffer);透明变体共用同一布局,随桶重分配重建 */
43
+ private transparentCoopBG;
44
+ /** 透明阶段 coop group1(空绑定组) */
45
+ private emptyBG;
46
+ private readonly stageStates;
33
47
  constructor(device: GPUDevice, tileBindGroupLayout: GPUBindGroupLayout, frameUniformBuffer: GPUBuffer);
34
48
  get bucketCapacity(): number;
35
49
  get subBlockCapacity(): number;
36
50
  /** 每帧编码前调用:按点数调整容量(只增不减),并保证 bind group 引用当前 framebuffer */
37
51
  prepare(totalPoints: number, framebuffer: GPUBuffer): void;
52
+ /** 每个阶段开始前调用(计算通道之外):清零 medium / large / subBlock / overflow 计数 */
38
53
  encodeClearCounters(encoder: GPUCommandEncoder): void;
39
- /** 一个 tile 的分类 dispatch */
54
+ /** 获取某阶段流水线(透明变体首次调用时创建);失败返回 Error,上层按缓冲创建失败降级 */
55
+ getStagePipelines(stage: BinnedStage): BinnedPipelines | Error;
56
+ /**
57
+ * 透明阶段的块绑定组(classify group0,无 binding 0 framebuffer,binding 1..7 与不透明块绑定组相同)。
58
+ * 透明变体共用同一个 tileBGL,所以每块只需一份,各透明阶段通用。
59
+ * `entries` 传 binding 1..7(不含 framebuffer)。流水线创建失败时返回 Error。
60
+ */
61
+ createTransparentTileBindGroup(entries: GPUBindGroupEntry[], stage?: TransparentBinnedStage): GPUBindGroup | Error;
62
+ /**
63
+ * 透明阶段编码前调用(须在 `prepare` 之后):取得流水线、确保透明 coop 绑定组与空绑定组,
64
+ * 并按 (revision, depthView) 复用或重建平面绑定组。叠加需要叠加平面(单缓冲);
65
+ * 混合半透明需要透明层与不透明深度视图。
66
+ * 成功返回 null;流水线创建失败或缓冲缺失时返回 Error,本阶段不应编码。
67
+ */
68
+ prepareStage(stage: TransparentBinnedStage, buffers: ExtraBuffers, revision: number, depthView?: GPUTextureView | null): Error | null;
69
+ /** 一个 tile 的分类 dispatch(不透明) */
40
70
  encodeClassify(pass: GPUComputePassEncoder, tileBindGroup: GPUBindGroup, pointCount: number): void;
41
- /** 所有 tile 分类完成后:写 indirect 参数,再协作绘制 Medium / Large 点 */
71
+ /** 所有 tile 分类完成后:写 indirect 参数,再协作绘制 Medium / Large 点(不透明) */
42
72
  encodeCoop(pass: GPUComputePassEncoder): void;
73
+ /**
74
+ * 按阶段变体对一个块分类。不透明传渲染器的块绑定组(含 framebuffer);
75
+ * 透明阶段传 `createTransparentTileBindGroup` 创建的块绑定组,且本帧须已 `prepareStage` 成功。
76
+ * 透明阶段未准备好时不编码,返回 false。
77
+ */
78
+ encodeStageClassify(pass: GPUComputePassEncoder, stage: BinnedStage, tileBindGroup: GPUBindGroup, pointCount: number): boolean;
79
+ /**
80
+ * 某阶段所有块分类完成后:args-builder 写 indirect 参数,再 coop_medium / coop_large。
81
+ * 透明阶段未准备好时不编码,返回 false。
82
+ */
83
+ encodeStageCoop(pass: GPUComputePassEncoder, stage: BinnedStage): boolean;
43
84
  dispose(): void;
85
+ /** 透明 coop group0 / group1:透明变体共用 coopBGL 与 emptyBGL,按需创建一次,桶重分配后重建 */
86
+ private ensureTransparentCoopBindGroups;
44
87
  private allocate;
45
88
  private createBindGroups;
46
89
  }
@@ -1,10 +1,91 @@
1
+ /** 绘制阶段:不透明 / 叠加 / 混合半透明(层写入),各对应一个写像素模块 */
2
+ export type BinnedStage = 'opaque' | 'additive' | 'blend';
3
+ export type TransparentBinnedStage = Exclude<BinnedStage, 'opaque'>;
4
+ /**
5
+ * 一个阶段的分桶流水线变体。
6
+ *
7
+ * 绑定组安排:
8
+ * - 不透明:classify = [tileBGL(含 framebuffer), classifyBGL];coop = [coopBGL(含 framebuffer)]。
9
+ * - 叠加:classify = [tileBGL(无 binding 0), classifyBGL, planesBGL(binding 0 = 叠加平面单缓冲)];
10
+ * coop = [coopBGL(无 binding 0), emptyBGL, planesBGL]。其余 binding 号与不透明一致。
11
+ * - 混合半透明:同叠加,planesBGL = [binding 0 = 透明层, binding 1 = 不透明深度纹理(sampleType 'depth')]。
12
+ * - args-builder 各阶段都是 [argsBGL]。
13
+ */
1
14
  export interface BinnedPipelines {
15
+ readonly stage: BinnedStage;
16
+ /** classify 的 group0(块绑定组)布局;不透明即渲染器的 tileBindGroupLayout */
17
+ readonly tileBGL: GPUBindGroupLayout;
18
+ /** classify 的 group1(桶 / 子块 / 计数),各阶段共用 */
2
19
  readonly classifyBGL: GPUBindGroupLayout;
20
+ /** args-builder 的 group0,各阶段共用 */
3
21
  readonly argsBGL: GPUBindGroupLayout;
22
+ /** coop 的 group0 布局;透明变体共用同一个不含 framebuffer 的布局 */
4
23
  readonly coopBGL: GPUBindGroupLayout;
24
+ /** 透明变体 coop 的 group1(空布局);不透明为 null */
25
+ readonly emptyBGL: GPUBindGroupLayout | null;
26
+ /** 透明变体 classify 与 coop 的 group2(平面);不透明为 null */
27
+ readonly planesBGL: GPUBindGroupLayout | null;
5
28
  readonly classifier: GPUComputePipeline;
6
29
  readonly argsBuilder: GPUComputePipeline;
7
30
  readonly coopMedium: GPUComputePipeline;
8
31
  readonly coopLarge: GPUComputePipeline;
9
32
  }
10
- export declare function createBinnedPipelines(device: GPUDevice, tileBindGroupLayout: GPUBindGroupLayout): BinnedPipelines;
33
+ interface WriteModuleParts {
34
+ /** 拼入 classify 与 coop:Payload、BUCKET_STRIDE、write_pixel、load_bucket 等 */
35
+ readonly shared: string;
36
+ /** 只拼入 classify:make_payload、store_bucket 等依赖着色或可写桶的函数 */
37
+ readonly classifyOnly: string;
38
+ /** 只含 BUCKET_STRIDE 常量声明,拼入 args-builder */
39
+ readonly strideDecl: string;
40
+ }
41
+ /** 按约定切分写像素模块(write-*.wgsl) */
42
+ export declare function splitWriteModule(code: string): WriteModuleParts;
43
+ export interface BinnedShaderCodes {
44
+ readonly classify: string;
45
+ readonly argsBuilder: string;
46
+ readonly coop: string;
47
+ }
48
+ /**
49
+ * 用给定写像素模块拼出 classify / args-builder / coop 的完整 WGSL。
50
+ * `constants` 拼在写像素模块之前(透明变体传 transparencyWgslConstants()),不透明变体为空。
51
+ */
52
+ export declare function buildBinnedShaderCodes(writeModuleCode: string, constants?: string): BinnedShaderCodes;
53
+ /** 某阶段三份着色器的完整 WGSL(按需拼接并缓存) */
54
+ export declare function buildBinnedStageShaderCodes(stage: BinnedStage): BinnedShaderCodes;
55
+ /**
56
+ * 块绑定组(classify group0)的布局条目,与 tile-bindings.wgsl 对应。
57
+ * `withFramebuffer = true` 为渲染器现有的 tileBindGroupLayout;透明变体去掉 binding 0(framebuffer),
58
+ * 其余 binding 号不变。
59
+ */
60
+ export declare function tileBindGroupLayoutEntries(withFramebuffer: boolean): GPUBindGroupLayoutEntry[];
61
+ /** 透明变体 classify 每着色阶段所需的 storage buffer 数(块 + 桶 + 平面),用于创建前检查设备上限 */
62
+ export declare function transparentClassifyStorageBufferCount(stage: TransparentBinnedStage): number;
63
+ /**
64
+ * 创建某阶段的分桶流水线。
65
+ * 不透明(默认):`tileBindGroupLayout` 为渲染器的块布局。
66
+ * 透明变体:单独调用时自建全部布局(不与其它阶段共用),一般应通过 `BinnedPipelineCache` 获取。
67
+ */
68
+ export declare function createBinnedPipelines(device: GPUDevice, tileBindGroupLayout: GPUBindGroupLayout, stage?: BinnedStage): BinnedPipelines;
69
+ /**
70
+ * 透明流水线变体的惰性缓存。
71
+ *
72
+ * - 首次 `get(stage)` 时同步创建该阶段流水线(以及透明变体共用的布局),之后直接返回缓存;
73
+ * `classifyBGL` / `argsBGL` 与不透明变体共用,上层可复用同一组桶 / args 绑定组。
74
+ * - 创建前检查 storage buffer 数是否超过 `maxStorageBuffersPerShaderStage`,超过时直接返回错误。
75
+ * - 同步异常(try/catch)与异步校验错误(pushErrorScope / popErrorScope)都记为失败,`get` 返回 Error,
76
+ * 上层按"缓冲创建失败"降级。校验错误(着色器编译、布局不匹配)是确定性的,不再重试,
77
+ * 以免每次重试都让一帧的命令缓冲失效;内存不足 / 内部错误在下一次 `get` 时重试。
78
+ * - 异步结果返回前(pending)`get` 照常返回流水线。
79
+ */
80
+ export declare class BinnedPipelineCache {
81
+ private readonly device;
82
+ readonly opaque: BinnedPipelines;
83
+ private transparentShared;
84
+ private readonly entries;
85
+ constructor(device: GPUDevice, opaque: BinnedPipelines);
86
+ get(stage: BinnedStage): BinnedPipelines | Error;
87
+ /** 已有缓存(不触发创建);未创建或失败时为 null */
88
+ peek(stage: BinnedStage): BinnedPipelines | null;
89
+ private create;
90
+ }
91
+ export {};
@@ -0,0 +1,13 @@
1
+ /**
2
+ * 点颜色上传用的线性 → sRGB 转换与 sRGB → RGB565 编码。
3
+ *
4
+ * 点颜色缓冲按 sRGB 值存 RGB565:上传时不做 sRGB 转线性,着色器(color.wgsl)
5
+ * 解码 RGB565 后再用 `srgb_to_linear` 转成线性。
6
+ */
7
+ /** 线性 → sRGB(64 位),用于 Float32Array 颜色上传。 */
8
+ export declare function linearToSrgb(v: number): number;
9
+ /**
10
+ * 8 位 sRGB → RGB565:(round(r/255×31) << 11) | (round(g/255×63) << 5) | round(b/255×31)。
11
+ * 输入为 0–255 的整数(Uint8Array 颜色)。
12
+ */
13
+ export declare function encodeSrgb8ToRgb565(r: number, g: number, b: number): number;