@ifc-lite/renderer 5.0.0 → 6.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (284) hide show
  1. package/dist/camera-projection.d.ts +2 -0
  2. package/dist/camera-projection.d.ts.map +1 -1
  3. package/dist/camera-projection.js +46 -0
  4. package/dist/camera-projection.js.map +1 -1
  5. package/dist/chunk-grid.d.ts +21 -0
  6. package/dist/chunk-grid.d.ts.map +1 -1
  7. package/dist/chunk-grid.js +25 -7
  8. package/dist/chunk-grid.js.map +1 -1
  9. package/dist/clash-solid-pipeline.d.ts.map +1 -1
  10. package/dist/clash-solid-pipeline.js +4 -2
  11. package/dist/clash-solid-pipeline.js.map +1 -1
  12. package/dist/deviation/deviation-computer.d.ts +4 -0
  13. package/dist/deviation/deviation-computer.d.ts.map +1 -1
  14. package/dist/deviation/deviation-computer.js +20 -0
  15. package/dist/deviation/deviation-computer.js.map +1 -1
  16. package/dist/deviation/deviation-readback.d.ts +18 -0
  17. package/dist/deviation/deviation-readback.d.ts.map +1 -0
  18. package/dist/deviation/deviation-readback.js +67 -0
  19. package/dist/deviation/deviation-readback.js.map +1 -0
  20. package/dist/edge-pass.d.ts +16 -0
  21. package/dist/edge-pass.d.ts.map +1 -1
  22. package/dist/edge-pass.js +75 -1
  23. package/dist/edge-pass.js.map +1 -1
  24. package/dist/entity-color-table.d.ts +140 -0
  25. package/dist/entity-color-table.d.ts.map +1 -0
  26. package/dist/entity-color-table.js +238 -0
  27. package/dist/entity-color-table.js.map +1 -0
  28. package/dist/gpu-upload-guard.d.ts +1 -1
  29. package/dist/gpu-upload-guard.js +1 -1
  30. package/dist/hover-mesh-cache.d.ts +29 -0
  31. package/dist/hover-mesh-cache.d.ts.map +1 -0
  32. package/dist/hover-mesh-cache.js +31 -0
  33. package/dist/hover-mesh-cache.js.map +1 -0
  34. package/dist/index.d.ts +14 -0
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +146 -161
  37. package/dist/index.js.map +1 -1
  38. package/dist/individual-mesh-upload.d.ts +24 -0
  39. package/dist/individual-mesh-upload.d.ts.map +1 -0
  40. package/dist/individual-mesh-upload.js +85 -0
  41. package/dist/individual-mesh-upload.js.map +1 -0
  42. package/dist/instanced-render.d.ts +19 -9
  43. package/dist/instanced-render.d.ts.map +1 -1
  44. package/dist/instanced-render.js +36 -24
  45. package/dist/instanced-render.js.map +1 -1
  46. package/dist/instanced-rte.d.ts +68 -7
  47. package/dist/instanced-rte.d.ts.map +1 -1
  48. package/dist/instanced-rte.js +98 -17
  49. package/dist/instanced-rte.js.map +1 -1
  50. package/dist/instanced-vertex-layout.d.ts +26 -0
  51. package/dist/instanced-vertex-layout.d.ts.map +1 -0
  52. package/dist/instanced-vertex-layout.js +61 -0
  53. package/dist/instanced-vertex-layout.js.map +1 -0
  54. package/dist/mesh-rte-uniforms.d.ts +4 -2
  55. package/dist/mesh-rte-uniforms.d.ts.map +1 -1
  56. package/dist/mesh-rte-uniforms.js +4 -2
  57. package/dist/mesh-rte-uniforms.js.map +1 -1
  58. package/dist/model-translation.d.ts.map +1 -1
  59. package/dist/model-translation.js +0 -7
  60. package/dist/model-translation.js.map +1 -1
  61. package/dist/outline-params.d.ts +45 -0
  62. package/dist/outline-params.d.ts.map +1 -0
  63. package/dist/outline-params.js +54 -0
  64. package/dist/outline-params.js.map +1 -0
  65. package/dist/overlay-routing.d.ts +8 -8
  66. package/dist/overlay-routing.js +2 -2
  67. package/dist/overlay-routing.js.map +1 -1
  68. package/dist/overlay-theme.d.ts +9 -3
  69. package/dist/overlay-theme.d.ts.map +1 -1
  70. package/dist/overlay-theme.js.map +1 -1
  71. package/dist/partial-batch-requests.d.ts +2 -2
  72. package/dist/pick-mesh-budget.d.ts +28 -0
  73. package/dist/pick-mesh-budget.d.ts.map +1 -0
  74. package/dist/pick-mesh-budget.js +74 -0
  75. package/dist/pick-mesh-budget.js.map +1 -0
  76. package/dist/picker-rte-uniforms.d.ts +7 -1
  77. package/dist/picker-rte-uniforms.d.ts.map +1 -1
  78. package/dist/picker-rte-uniforms.js +9 -1
  79. package/dist/picker-rte-uniforms.js.map +1 -1
  80. package/dist/picker.d.ts.map +1 -1
  81. package/dist/picker.js +15 -28
  82. package/dist/picker.js.map +1 -1
  83. package/dist/picking-manager.d.ts.map +1 -1
  84. package/dist/picking-manager.js +4 -47
  85. package/dist/picking-manager.js.map +1 -1
  86. package/dist/pipeline.d.ts +7 -1
  87. package/dist/pipeline.d.ts.map +1 -1
  88. package/dist/pipeline.js +37 -59
  89. package/dist/pipeline.js.map +1 -1
  90. package/dist/point-picker.d.ts.map +1 -1
  91. package/dist/point-picker.js +7 -2
  92. package/dist/point-picker.js.map +1 -1
  93. package/dist/pointcloud/point-cloud-node.js +1 -1
  94. package/dist/pointcloud/point-cloud-node.js.map +1 -1
  95. package/dist/pointcloud/point-cloud-renderer.d.ts.map +1 -1
  96. package/dist/pointcloud/point-cloud-renderer.js +3 -1
  97. package/dist/pointcloud/point-cloud-renderer.js.map +1 -1
  98. package/dist/pointcloud/point-cloud-uniforms.d.ts +5 -1
  99. package/dist/pointcloud/point-cloud-uniforms.d.ts.map +1 -1
  100. package/dist/pointcloud/point-cloud-uniforms.js +7 -1
  101. package/dist/pointcloud/point-cloud-uniforms.js.map +1 -1
  102. package/dist/post-pass-chain.d.ts +14 -1
  103. package/dist/post-pass-chain.d.ts.map +1 -1
  104. package/dist/post-pass-chain.js +31 -2
  105. package/dist/post-pass-chain.js.map +1 -1
  106. package/dist/raycast-engine.d.ts +5 -1
  107. package/dist/raycast-engine.d.ts.map +1 -1
  108. package/dist/raycast-engine.js +20 -8
  109. package/dist/raycast-engine.js.map +1 -1
  110. package/dist/raycast-point-cloud-query.d.ts +2 -0
  111. package/dist/raycast-point-cloud-query.d.ts.map +1 -1
  112. package/dist/raycast-point-cloud-query.js +7 -0
  113. package/dist/raycast-point-cloud-query.js.map +1 -1
  114. package/dist/raycast-source-curve-query.d.ts +13 -0
  115. package/dist/raycast-source-curve-query.d.ts.map +1 -0
  116. package/dist/raycast-source-curve-query.js +17 -0
  117. package/dist/raycast-source-curve-query.js.map +1 -0
  118. package/dist/reference-image-pipeline.d.ts.map +1 -1
  119. package/dist/reference-image-pipeline.js +4 -2
  120. package/dist/reference-image-pipeline.js.map +1 -1
  121. package/dist/relative-to-eye-abi.d.ts +36 -0
  122. package/dist/relative-to-eye-abi.d.ts.map +1 -0
  123. package/dist/relative-to-eye-abi.js +72 -0
  124. package/dist/relative-to-eye-abi.js.map +1 -0
  125. package/dist/relative-to-eye.d.ts +15 -35
  126. package/dist/relative-to-eye.d.ts.map +1 -1
  127. package/dist/relative-to-eye.js +46 -74
  128. package/dist/relative-to-eye.js.map +1 -1
  129. package/dist/render-stats.d.ts +5 -1
  130. package/dist/render-stats.d.ts.map +1 -1
  131. package/dist/render-stats.js +1 -1
  132. package/dist/render-stats.js.map +1 -1
  133. package/dist/renderer-overlays.d.ts.map +1 -1
  134. package/dist/renderer-overlays.js +3 -2
  135. package/dist/renderer-overlays.js.map +1 -1
  136. package/dist/scene-batch-rebuild.d.ts +1 -2
  137. package/dist/scene-batch-rebuild.d.ts.map +1 -1
  138. package/dist/scene-batch-rebuild.js +4 -8
  139. package/dist/scene-batch-rebuild.js.map +1 -1
  140. package/dist/scene-batch-upload.d.ts.map +1 -1
  141. package/dist/scene-batch-upload.js +7 -3
  142. package/dist/scene-batch-upload.js.map +1 -1
  143. package/dist/scene-contents.d.ts +1 -1
  144. package/dist/scene-contents.d.ts.map +1 -1
  145. package/dist/scene-derived-batches.d.ts +19 -64
  146. package/dist/scene-derived-batches.d.ts.map +1 -1
  147. package/dist/scene-derived-batches.js +16 -51
  148. package/dist/scene-derived-batches.js.map +1 -1
  149. package/dist/scene-device-recovery.d.ts +3 -3
  150. package/dist/scene-device-recovery.d.ts.map +1 -1
  151. package/dist/scene-device-recovery.js +12 -9
  152. package/dist/scene-device-recovery.js.map +1 -1
  153. package/dist/scene-geometry.d.ts +6 -6
  154. package/dist/scene-geometry.d.ts.map +1 -1
  155. package/dist/scene-geometry.js +8 -9
  156. package/dist/scene-geometry.js.map +1 -1
  157. package/dist/scene-instance-bounds.d.ts +1 -1
  158. package/dist/scene-instance-bounds.d.ts.map +1 -1
  159. package/dist/scene-instance-bounds.js +4 -16
  160. package/dist/scene-instance-bounds.js.map +1 -1
  161. package/dist/scene-instance-materialization.d.ts.map +1 -1
  162. package/dist/scene-instance-materialization.js +4 -4
  163. package/dist/scene-instance-materialization.js.map +1 -1
  164. package/dist/scene-instance-translation.d.ts +6 -10
  165. package/dist/scene-instance-translation.d.ts.map +1 -1
  166. package/dist/scene-instance-translation.js +9 -31
  167. package/dist/scene-instance-translation.js.map +1 -1
  168. package/dist/scene-instance-types.d.ts +11 -2
  169. package/dist/scene-instance-types.d.ts.map +1 -1
  170. package/dist/scene-instance-types.js +7 -1
  171. package/dist/scene-instance-types.js.map +1 -1
  172. package/dist/scene-model-translation.d.ts +1 -2
  173. package/dist/scene-model-translation.d.ts.map +1 -1
  174. package/dist/scene-model-translation.js +4 -3
  175. package/dist/scene-model-translation.js.map +1 -1
  176. package/dist/scene-precision.d.ts +1 -1
  177. package/dist/scene-precision.d.ts.map +1 -1
  178. package/dist/scene-precision.js +11 -2
  179. package/dist/scene-precision.js.map +1 -1
  180. package/dist/scene.d.ts +43 -38
  181. package/dist/scene.d.ts.map +1 -1
  182. package/dist/scene.js +121 -129
  183. package/dist/scene.js.map +1 -1
  184. package/dist/section-2d-line-buffer.d.ts +2 -2
  185. package/dist/section-2d-line-buffer.d.ts.map +1 -1
  186. package/dist/section-2d-line-buffer.js +10 -11
  187. package/dist/section-2d-line-buffer.js.map +1 -1
  188. package/dist/section-2d-overlay.d.ts +6 -4
  189. package/dist/section-2d-overlay.d.ts.map +1 -1
  190. package/dist/section-2d-overlay.js +45 -21
  191. package/dist/section-2d-overlay.js.map +1 -1
  192. package/dist/section-2d-types.d.ts +1 -1
  193. package/dist/section-2d-types.d.ts.map +1 -1
  194. package/dist/section-2d-types.js +1 -1
  195. package/dist/section-2d-types.js.map +1 -1
  196. package/dist/section-plane.d.ts.map +1 -1
  197. package/dist/section-plane.js +3 -1
  198. package/dist/section-plane.js.map +1 -1
  199. package/dist/selection-mask-pass.d.ts +85 -0
  200. package/dist/selection-mask-pass.d.ts.map +1 -0
  201. package/dist/selection-mask-pass.js +170 -0
  202. package/dist/selection-mask-pass.js.map +1 -0
  203. package/dist/selection-mask-pipelines.d.ts +57 -0
  204. package/dist/selection-mask-pipelines.d.ts.map +1 -0
  205. package/dist/selection-mask-pipelines.js +150 -0
  206. package/dist/selection-mask-pipelines.js.map +1 -0
  207. package/dist/selection-outline-frame.d.ts +47 -0
  208. package/dist/selection-outline-frame.d.ts.map +1 -0
  209. package/dist/selection-outline-frame.js +122 -0
  210. package/dist/selection-outline-frame.js.map +1 -0
  211. package/dist/shaders/depth-reconstruct.wgsl.d.ts +7 -2
  212. package/dist/shaders/depth-reconstruct.wgsl.d.ts.map +1 -1
  213. package/dist/shaders/depth-reconstruct.wgsl.js +8 -3
  214. package/dist/shaders/depth-reconstruct.wgsl.js.map +1 -1
  215. package/dist/shaders/edges.wgsl.d.ts +18 -0
  216. package/dist/shaders/edges.wgsl.d.ts.map +1 -1
  217. package/dist/shaders/edges.wgsl.js +99 -0
  218. package/dist/shaders/edges.wgsl.js.map +1 -1
  219. package/dist/shaders/entity-color-table.wgsl.d.ts +2 -0
  220. package/dist/shaders/entity-color-table.wgsl.d.ts.map +1 -0
  221. package/dist/shaders/entity-color-table.wgsl.js +85 -0
  222. package/dist/shaders/entity-color-table.wgsl.js.map +1 -0
  223. package/dist/shaders/main.wgsl.d.ts +1 -1
  224. package/dist/shaders/main.wgsl.d.ts.map +1 -1
  225. package/dist/shaders/main.wgsl.js +45 -113
  226. package/dist/shaders/main.wgsl.js.map +1 -1
  227. package/dist/shaders/mesh-uniforms.wgsl.d.ts +2 -0
  228. package/dist/shaders/mesh-uniforms.wgsl.d.ts.map +1 -0
  229. package/dist/shaders/mesh-uniforms.wgsl.js +53 -0
  230. package/dist/shaders/mesh-uniforms.wgsl.js.map +1 -0
  231. package/dist/shaders/section-2d-overlay.wgsl.d.ts +1 -0
  232. package/dist/shaders/section-2d-overlay.wgsl.d.ts.map +1 -1
  233. package/dist/shaders/section-2d-overlay.wgsl.js +3 -2
  234. package/dist/shaders/section-2d-overlay.wgsl.js.map +1 -1
  235. package/dist/shaders/selection-mask.wgsl.d.ts +16 -0
  236. package/dist/shaders/selection-mask.wgsl.d.ts.map +1 -0
  237. package/dist/shaders/selection-mask.wgsl.js +138 -0
  238. package/dist/shaders/selection-mask.wgsl.js.map +1 -0
  239. package/dist/shaders/shadow.wgsl.d.ts +1 -1
  240. package/dist/shaders/shadow.wgsl.d.ts.map +1 -1
  241. package/dist/shaders/shadow.wgsl.js +3 -3
  242. package/dist/shadow-occluders.d.ts.map +1 -1
  243. package/dist/shadow-occluders.js +1 -0
  244. package/dist/shadow-occluders.js.map +1 -1
  245. package/dist/shadow-pass.d.ts +0 -1
  246. package/dist/shadow-pass.d.ts.map +1 -1
  247. package/dist/shadow-pass.js +26 -32
  248. package/dist/shadow-pass.js.map +1 -1
  249. package/dist/shadow-types.d.ts +3 -0
  250. package/dist/shadow-types.d.ts.map +1 -1
  251. package/dist/shadow-types.js.map +1 -1
  252. package/dist/snap-detector.d.ts +5 -0
  253. package/dist/snap-detector.d.ts.map +1 -1
  254. package/dist/snap-detector.js.map +1 -1
  255. package/dist/source-curve-clipping.d.ts +7 -0
  256. package/dist/source-curve-clipping.d.ts.map +1 -0
  257. package/dist/source-curve-clipping.js +165 -0
  258. package/dist/source-curve-clipping.js.map +1 -0
  259. package/dist/source-curve-snap.d.ts +49 -0
  260. package/dist/source-curve-snap.d.ts.map +1 -0
  261. package/dist/source-curve-snap.js +197 -0
  262. package/dist/source-curve-snap.js.map +1 -0
  263. package/dist/symbolic-overlay-pipelines.d.ts +1 -1
  264. package/dist/symbolic-overlay-pipelines.d.ts.map +1 -1
  265. package/dist/symbolic-overlay-pipelines.js +13 -22
  266. package/dist/symbolic-overlay-pipelines.js.map +1 -1
  267. package/dist/symbolic-text-rte.d.ts +16 -0
  268. package/dist/symbolic-text-rte.d.ts.map +1 -0
  269. package/dist/symbolic-text-rte.js +37 -0
  270. package/dist/symbolic-text-rte.js.map +1 -0
  271. package/dist/textured-vertices.d.ts.map +1 -1
  272. package/dist/textured-vertices.js +2 -3
  273. package/dist/textured-vertices.js.map +1 -1
  274. package/dist/types.d.ts +10 -0
  275. package/dist/types.d.ts.map +1 -1
  276. package/dist/visual-enhancement.d.ts +0 -4
  277. package/dist/visual-enhancement.d.ts.map +1 -1
  278. package/dist/visual-enhancement.js +0 -5
  279. package/dist/visual-enhancement.js.map +1 -1
  280. package/dist/xray-alpha.d.ts +7 -3
  281. package/dist/xray-alpha.d.ts.map +1 -1
  282. package/dist/xray-alpha.js +11 -7
  283. package/dist/xray-alpha.js.map +1 -1
  284. package/package.json +4 -4
package/dist/edge-pass.js CHANGED
@@ -14,7 +14,8 @@
14
14
  * straight onto the resolved canvas.
15
15
  */
16
16
  import { EDGE_UNIFORM_BYTES, packEdgeUniforms } from './edge-params.js';
17
- import { edgeShaderSource } from './shaders/edges.wgsl.js';
17
+ import { OUTLINE_UNIFORM_BYTES, packOutlineUniforms } from './outline-params.js';
18
+ import { edgeShaderSource, outlineFragmentSource } from './shaders/edges.wgsl.js';
18
19
  export class EdgePass {
19
20
  device;
20
21
  uniformBuffer;
@@ -24,6 +25,12 @@ export class EdgePass {
24
25
  cachedDepthView = null;
25
26
  cachedObjectIdView = null;
26
27
  cachedBindGroup = null;
28
+ outlineUniformBuffer;
29
+ outlineUniformScratch = new Float32Array(OUTLINE_UNIFORM_BYTES / 4);
30
+ outlineLayout;
31
+ outlinePipeline;
32
+ cachedMask = null;
33
+ cachedOutlineBindGroup = null;
27
34
  destroyed = false;
28
35
  constructor(device, colorFormat, sampleCount) {
29
36
  this.device = device;
@@ -67,6 +74,43 @@ export class EdgePass {
67
74
  },
68
75
  primitive: { topology: 'triangle-list', cullMode: 'none' },
69
76
  });
77
+ // Selection/hover outline composite (#5390): a separate pipeline, since
78
+ // it needs a normal alpha-over blend (it draws an actual colour) rather
79
+ // than the darken-only blend above, and reads the mask textures rather
80
+ // than depth/id — but shares this module's fullscreen-triangle vertex
81
+ // stage (DRY).
82
+ this.outlineUniformBuffer = device.createBuffer({
83
+ label: 'outline-uniforms',
84
+ size: OUTLINE_UNIFORM_BYTES,
85
+ usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,
86
+ });
87
+ this.outlineLayout = device.createBindGroupLayout({
88
+ label: 'outline-bgl',
89
+ entries: [
90
+ { binding: 0, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: 'unfilterable-float' } },
91
+ { binding: 1, visibility: GPUShaderStage.FRAGMENT, texture: { sampleType: 'unfilterable-float' } },
92
+ { binding: 2, visibility: GPUShaderStage.FRAGMENT, buffer: { type: 'uniform' } },
93
+ ],
94
+ });
95
+ const outlineModule = device.createShaderModule({ label: 'outline-shader', code: outlineFragmentSource() });
96
+ this.outlinePipeline = device.createRenderPipeline({
97
+ label: 'outline-pipeline',
98
+ layout: device.createPipelineLayout({ bindGroupLayouts: [this.outlineLayout] }),
99
+ vertex: { module: outlineModule, entryPoint: 'vs_fullscreen' },
100
+ fragment: {
101
+ module: outlineModule,
102
+ entryPoint: 'fs_outline',
103
+ targets: [{
104
+ format: colorFormat,
105
+ // Premultiplied-over: the shader already returns rgb*alpha.
106
+ blend: {
107
+ color: { srcFactor: 'one', dstFactor: 'one-minus-src-alpha' },
108
+ alpha: { srcFactor: 'one', dstFactor: 'one-minus-src-alpha' },
109
+ },
110
+ }],
111
+ },
112
+ primitive: { topology: 'triangle-list', cullMode: 'none' },
113
+ });
70
114
  }
71
115
  encode(frame) {
72
116
  if (this.destroyed)
@@ -97,6 +141,33 @@ export class EdgePass {
97
141
  pass.draw(3, 1, 0, 0);
98
142
  pass.end();
99
143
  }
144
+ /** Outline the selection/hover mask (#5390) onto `frame.targetView`. */
145
+ encodeOutline(frame) {
146
+ if (this.destroyed)
147
+ return;
148
+ packOutlineUniforms(this.outlineUniformScratch, frame.params);
149
+ this.device.queue.writeBuffer(this.outlineUniformBuffer, 0, this.outlineUniformScratch);
150
+ if (this.cachedMask !== frame.mask || this.cachedOutlineBindGroup === null) {
151
+ this.cachedOutlineBindGroup = this.device.createBindGroup({
152
+ label: 'outline-bg',
153
+ layout: this.outlineLayout,
154
+ entries: [
155
+ { binding: 0, resource: frame.mask.visibleView },
156
+ { binding: 1, resource: frame.mask.allView },
157
+ { binding: 2, resource: { buffer: this.outlineUniformBuffer } },
158
+ ],
159
+ });
160
+ this.cachedMask = frame.mask;
161
+ }
162
+ const pass = frame.encoder.beginRenderPass({
163
+ label: 'selection-hover-outline',
164
+ colorAttachments: [{ view: frame.targetView, loadOp: 'load', storeOp: 'store' }],
165
+ });
166
+ pass.setPipeline(this.outlinePipeline);
167
+ pass.setBindGroup(0, this.cachedOutlineBindGroup);
168
+ pass.draw(3, 1, 0, 0);
169
+ pass.end();
170
+ }
100
171
  /** Release all GPU resources. Idempotent; the pass is unusable afterwards. */
101
172
  destroy() {
102
173
  if (this.destroyed)
@@ -106,6 +177,9 @@ export class EdgePass {
106
177
  this.cachedBindGroup = null;
107
178
  this.cachedDepthView = null;
108
179
  this.cachedObjectIdView = null;
180
+ this.outlineUniformBuffer.destroy();
181
+ this.cachedOutlineBindGroup = null;
182
+ this.cachedMask = null;
109
183
  }
110
184
  }
111
185
  //# sourceMappingURL=edge-pass.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"edge-pass.js","sourceRoot":"","sources":["../src/edge-pass.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"edge-pass.js","sourceRoot":"","sources":["../src/edge-pass.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Per-entity colour table (#6076): colour overrides (lens, charts, IDS,
3
+ * compare, 4D) are applied in the BASE pass by looking the entity up in one
4
+ * GPU storage buffer, instead of copying the overridden geometry into overlay
5
+ * batches drawn in a second equal-depth pass.
6
+ *
7
+ * WHAT THE SHADER CAN KNOW. Every flat vertex carries a u32 entity lane whose
8
+ * low 24 bits are the scene id (`MeshData.expressId`, the federated global id)
9
+ * masked to 24 bits, and whose high 8 bits are a colour salt for the depth
10
+ * nudge (`packEntityLane` in scene-geometry.ts). It does NOT carry a model
11
+ * index: federated global ids exceed 2^24 as soon as a few models load (each
12
+ * model's range is its max express id plus a 1,000,000 headroom), so the lane
13
+ * alone is ambiguous across models. Each draw therefore also passes an
14
+ * ANCHOR, the smallest full id it draws (`uniforms.overrideParams.x`), and the
15
+ * shader rebuilds the full id as `anchor + ((lane - anchor) mod 2^24)`. That is
16
+ * exact whenever the draw's ids span less than 2^24. Scene bucket keys carry
17
+ * each id's 2^24 page ({@link entityIdPageKey}), so every bucket batch,
18
+ * streaming fragment and partial sub-batch lies inside one page and meets
19
+ * that by construction. {@link entityIdAnchor} still returns null for a draw
20
+ * that does not (a hand-built batch), and the renderer then leaves it
21
+ * unpainted rather than paint the wrong entity.
22
+ *
23
+ * TABLE LAYOUT: an open-addressing hash table keyed by the full id, one
24
+ * `array<u32>` storage buffer:
25
+ *
26
+ * [0] capacity (power of two, 0 when empty) [1] max probe distance
27
+ * [2] entry count [3] colourBase = 4 + capacity
28
+ * [4 .. 4 + capacity) keys, EMPTY = 0xFFFFFFFF
29
+ * [colourBase + 4 * slot .. + 4) rgba as f32 bit patterns
30
+ *
31
+ * Linear probing from `fmix32(id) & (capacity - 1)`, load factor at most 1/2,
32
+ * and the longest displacement recorded in the header so the shader's probe
33
+ * loop has a bound. A dense per-model table (slot = express id) was the other
34
+ * candidate; it is sized by the model's STEP line count rather than by what
35
+ * is overridden, which on a large federation is tens of millions of slots and
36
+ * exceeds the 128 MiB default `maxStorageBufferBindingSize`. This table is
37
+ * sized by the number of overridden entities only.
38
+ *
39
+ * MEMORY BOUND: 20 bytes per slot plus a 16-byte header, capacity =
40
+ * nextPow2(2n) with a 16-slot minimum (336 bytes), so past that minimum
41
+ * (n >= 8) under 80 bytes per overridden entity and at least 40. 100,000 overridden entities take 262,144 slots = 5.0 MiB. The
42
+ * capacity is capped by `maxStorageBufferBindingSize` and `maxBufferSize`
43
+ * (2,097,152 entries at the 128 MiB default); past that the extra entries are
44
+ * dropped with one console warning.
45
+ *
46
+ * `EntityColorTable.write` rebuilds the image on the CPU (O(n)) and uploads it
47
+ * with one `queue.writeBuffer`; the GPU buffer is reallocated only when the
48
+ * image outgrows it (or the device changed, after a device-loss recovery), and
49
+ * the renderer rebinds it at frame start (`RenderPipeline.setEntityColorTableBuffer`).
50
+ */
51
+ type Rgba = readonly [number, number, number, number];
52
+ /** Key value of an unused slot. Federated ids stop far below it (`FederationRegistry`'s 2e9 limit). */
53
+ export declare const ENTITY_COLOR_EMPTY_KEY = 4294967295;
54
+ /** Header words before the key section. */
55
+ export declare const ENTITY_COLOR_HEADER_WORDS = 4;
56
+ /** Distinct full ids one draw can resolve from the 24-bit lane (see the module doc). */
57
+ export declare const ENTITY_LANE_ID_SPAN = 16777216;
58
+ /** `overrideParams.y` bit: this draw applies the table. */
59
+ export declare const OVERRIDE_PARAM_PAINT = 1;
60
+ /** `overrideParams.y` bit: paint the override unlit and opaque (`RenderOptions.emphasizeOverrides`). */
61
+ export declare const OVERRIDE_PARAM_EMPHASIZE = 2;
62
+ /** murmur3's 32-bit finalizer; `entityColorSlotHash` in the WGSL is the same function. */
63
+ export declare function entityColorSlotHash(key: number): number;
64
+ /** The table as uploaded: `words` is the whole buffer image. */
65
+ export interface EntityColorTableImage {
66
+ readonly words: Uint32Array;
67
+ readonly capacity: number;
68
+ readonly count: number;
69
+ readonly maxProbe: number;
70
+ /** Overrides that did not fit under the device's buffer limits. */
71
+ readonly dropped: number;
72
+ }
73
+ /** Build the buffer image for `overrides` (keys are scene ids, colours linear 0..1 RGBA). */
74
+ export declare function buildEntityColorTableImage(overrides: ReadonlyMap<number, Rgba>, maxBytes?: number): EntityColorTableImage;
75
+ /** CPU mirror of the shader lookup: the colour stored for `id`, or null (sentinel). */
76
+ export declare function lookupEntityColor(image: EntityColorTableImage, id: number): [number, number, number, number] | null;
77
+ /**
78
+ * The anchor a draw passes so the shader can rebuild full ids from 24-bit
79
+ * lanes: the smallest id, or null when the ids span 2^24 or more (or are not
80
+ * table keys) and the draw must stay unpainted.
81
+ */
82
+ export declare function entityIdAnchor(ids: ArrayLike<number>): number | null;
83
+ /** CPU mirror of the shader's `resolveLaneEntityId`: the full id behind a lane under `anchor`. */
84
+ export declare function resolveLaneEntityId(anchor: number, lane: number): number;
85
+ /**
86
+ * `key` qualified by the 2^24 page of `id` (unchanged for ids below 2^24).
87
+ * Scene bucket keys go through this, so no batch holds ids from two pages and
88
+ * {@link entityIdAnchor} never refuses a bucket batch or its fragments.
89
+ */
90
+ export declare function entityIdPageKey(id: number, key: string): string;
91
+ /** {@link entityIdAnchor} of a batch, cached per batch object (a batch's `expressIds` never change). */
92
+ export declare function batchEntityIdAnchor(batch: {
93
+ readonly expressIds: readonly number[];
94
+ }): number | null;
95
+ /**
96
+ * Whether any entity of `batch` is overridden, cached per batch for one
97
+ * override `generation` (`Scene.getColorOverrideGeneration`). A batch with none
98
+ * is drawn with the table off, so its fragments skip the lookup entirely.
99
+ */
100
+ export declare function batchHasColorOverride(batch: {
101
+ readonly expressIds: readonly number[];
102
+ }, overrides: ReadonlyMap<number, unknown> | null, generation: number): boolean;
103
+ /**
104
+ * Write a draw's `overrideParams` lanes (x = anchor, y = mode bits). A null
105
+ * anchor, or `paint = false`, writes zeros: the draw keeps its own colour.
106
+ */
107
+ export declare function packOverrideParams(out: Uint32Array, anchor: number | null, paint: boolean, emphasize: boolean): void;
108
+ interface TableDevice {
109
+ readonly limits?: {
110
+ readonly maxStorageBufferBindingSize?: number;
111
+ readonly maxBufferSize?: number;
112
+ };
113
+ createBuffer(descriptor: GPUBufferDescriptor): GPUBuffer;
114
+ readonly queue: {
115
+ writeBuffer(buffer: GPUBuffer, offset: number, data: Uint32Array): void;
116
+ };
117
+ }
118
+ /** Owns the table's CPU image and its GPU buffer. One per `Scene`. */
119
+ export declare class EntityColorTable {
120
+ private image;
121
+ private buffer;
122
+ private bufferDevice;
123
+ private bufferBytes;
124
+ private uploadedBytes;
125
+ private warnedDropped;
126
+ /** Replace the table with `overrides` and upload it. */
127
+ write(device: TableDevice, overrides: ReadonlyMap<number, Rgba>): void;
128
+ /** Empty the table: only the 16-byte header is rewritten (count 0 disables every lookup). */
129
+ clear(): void;
130
+ /** Drop the GPU buffer (device loss, scene teardown); the CPU image survives for re-upload. */
131
+ releaseGpu(): void;
132
+ /** The buffer the renderer binds, or null while nothing was ever written. */
133
+ getBuffer(): GPUBuffer | null;
134
+ /** The current CPU image (what the GPU buffer holds after the last write). */
135
+ getImage(): EntityColorTableImage;
136
+ /** Bytes the last `write` / `clear` uploaded. */
137
+ getLastUploadBytes(): number;
138
+ }
139
+ export {};
140
+ //# sourceMappingURL=entity-color-table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-color-table.d.ts","sourceRoot":"","sources":["../src/entity-color-table.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,238 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ /** Key value of an unused slot. Federated ids stop far below it (`FederationRegistry`'s 2e9 limit). */
5
+ export const ENTITY_COLOR_EMPTY_KEY = 0xFFFFFFFF;
6
+ /** Header words before the key section. */
7
+ export const ENTITY_COLOR_HEADER_WORDS = 4;
8
+ const MIN_CAPACITY = 16;
9
+ const BYTES_PER_SLOT = 20; // one u32 key + four f32 colour lanes
10
+ /** Distinct full ids one draw can resolve from the 24-bit lane (see the module doc). */
11
+ export const ENTITY_LANE_ID_SPAN = 0x1000000;
12
+ /** Used when a device reports no limit (the WebGPU default for `maxStorageBufferBindingSize`). */
13
+ const DEFAULT_MAX_TABLE_BYTES = 128 * 1024 * 1024;
14
+ /** `overrideParams.y` bit: this draw applies the table. */
15
+ export const OVERRIDE_PARAM_PAINT = 1;
16
+ /** `overrideParams.y` bit: paint the override unlit and opaque (`RenderOptions.emphasizeOverrides`). */
17
+ export const OVERRIDE_PARAM_EMPHASIZE = 2;
18
+ /** murmur3's 32-bit finalizer; `entityColorSlotHash` in the WGSL is the same function. */
19
+ export function entityColorSlotHash(key) {
20
+ let h = key >>> 0;
21
+ h ^= h >>> 16;
22
+ h = Math.imul(h, 0x85ebca6b) >>> 0;
23
+ h ^= h >>> 13;
24
+ h = Math.imul(h, 0xc2b2ae35) >>> 0;
25
+ h ^= h >>> 16;
26
+ return h >>> 0;
27
+ }
28
+ const EMPTY_IMAGE = {
29
+ words: new Uint32Array(ENTITY_COLOR_HEADER_WORDS), capacity: 0, count: 0, maxProbe: 0, dropped: 0,
30
+ };
31
+ function isTableKey(id) {
32
+ return Number.isInteger(id) && id >= 0 && id < ENTITY_COLOR_EMPTY_KEY;
33
+ }
34
+ function capacityFor(entries, maxBytes) {
35
+ let capacity = MIN_CAPACITY;
36
+ while (capacity < entries * 2)
37
+ capacity *= 2;
38
+ while (capacity > MIN_CAPACITY && ENTITY_COLOR_HEADER_WORDS * 4 + capacity * BYTES_PER_SLOT > maxBytes)
39
+ capacity /= 2;
40
+ return capacity;
41
+ }
42
+ /** Build the buffer image for `overrides` (keys are scene ids, colours linear 0..1 RGBA). */
43
+ export function buildEntityColorTableImage(overrides, maxBytes = DEFAULT_MAX_TABLE_BYTES) {
44
+ let entries = 0;
45
+ for (const id of overrides.keys())
46
+ if (isTableKey(id))
47
+ entries++;
48
+ if (entries === 0)
49
+ return EMPTY_IMAGE;
50
+ const capacity = capacityFor(entries, maxBytes);
51
+ const limit = Math.min(entries, capacity / 2);
52
+ const colorBase = ENTITY_COLOR_HEADER_WORDS + capacity;
53
+ const words = new Uint32Array(colorBase + capacity * 4);
54
+ const colors = new Float32Array(words.buffer);
55
+ words.fill(ENTITY_COLOR_EMPTY_KEY, ENTITY_COLOR_HEADER_WORDS, colorBase);
56
+ const mask = capacity - 1;
57
+ let count = 0;
58
+ let maxProbe = 0;
59
+ for (const [id, rgba] of overrides) {
60
+ if (count === limit)
61
+ break;
62
+ if (!isTableKey(id))
63
+ continue;
64
+ let slot = entityColorSlotHash(id) & mask;
65
+ let probe = 0;
66
+ while (words[ENTITY_COLOR_HEADER_WORDS + slot] !== ENTITY_COLOR_EMPTY_KEY) {
67
+ slot = (slot + 1) & mask;
68
+ probe++;
69
+ }
70
+ words[ENTITY_COLOR_HEADER_WORDS + slot] = id;
71
+ colors.set([rgba[0], rgba[1], rgba[2], rgba[3]], colorBase + slot * 4);
72
+ if (probe > maxProbe)
73
+ maxProbe = probe;
74
+ count++;
75
+ }
76
+ words[0] = capacity;
77
+ words[1] = maxProbe;
78
+ words[2] = count;
79
+ words[3] = colorBase;
80
+ return { words, capacity, count, maxProbe, dropped: entries - count };
81
+ }
82
+ /** CPU mirror of the shader lookup: the colour stored for `id`, or null (sentinel). */
83
+ export function lookupEntityColor(image, id) {
84
+ if (image.count === 0 || !isTableKey(id))
85
+ return null;
86
+ const { words, capacity } = image;
87
+ const colorBase = words[3];
88
+ const mask = capacity - 1;
89
+ let slot = entityColorSlotHash(id) & mask;
90
+ for (let i = 0; i <= image.maxProbe && i < capacity; i++) {
91
+ const key = words[ENTITY_COLOR_HEADER_WORDS + slot];
92
+ if (key === id) {
93
+ const c = new Float32Array(words.buffer, (colorBase + slot * 4) * 4, 4);
94
+ return [c[0], c[1], c[2], c[3]];
95
+ }
96
+ if (key === ENTITY_COLOR_EMPTY_KEY)
97
+ return null;
98
+ slot = (slot + 1) & mask;
99
+ }
100
+ return null;
101
+ }
102
+ /**
103
+ * The anchor a draw passes so the shader can rebuild full ids from 24-bit
104
+ * lanes: the smallest id, or null when the ids span 2^24 or more (or are not
105
+ * table keys) and the draw must stay unpainted.
106
+ */
107
+ export function entityIdAnchor(ids) {
108
+ if (ids.length === 0)
109
+ return null;
110
+ let min = Infinity;
111
+ let max = -Infinity;
112
+ for (let i = 0; i < ids.length; i++) {
113
+ const id = ids[i];
114
+ if (!isTableKey(id))
115
+ return null;
116
+ if (id < min)
117
+ min = id;
118
+ if (id > max)
119
+ max = id;
120
+ }
121
+ return max - min < ENTITY_LANE_ID_SPAN ? min : null;
122
+ }
123
+ /** CPU mirror of the shader's `resolveLaneEntityId`: the full id behind a lane under `anchor`. */
124
+ export function resolveLaneEntityId(anchor, lane) {
125
+ return (anchor + (((lane >>> 0) - anchor) & 0x00FFFFFF)) >>> 0;
126
+ }
127
+ /**
128
+ * `key` qualified by the 2^24 page of `id` (unchanged for ids below 2^24).
129
+ * Scene bucket keys go through this, so no batch holds ids from two pages and
130
+ * {@link entityIdAnchor} never refuses a bucket batch or its fragments.
131
+ */
132
+ export function entityIdPageKey(id, key) {
133
+ const page = Math.floor(id / ENTITY_LANE_ID_SPAN);
134
+ return page > 0 ? `p${page}~${key}` : key;
135
+ }
136
+ const anchorCache = new WeakMap();
137
+ /** {@link entityIdAnchor} of a batch, cached per batch object (a batch's `expressIds` never change). */
138
+ export function batchEntityIdAnchor(batch) {
139
+ let anchor = anchorCache.get(batch);
140
+ if (anchor === undefined) {
141
+ anchor = entityIdAnchor(batch.expressIds);
142
+ anchorCache.set(batch, anchor);
143
+ }
144
+ return anchor;
145
+ }
146
+ const hasOverrideCache = new WeakMap();
147
+ /**
148
+ * Whether any entity of `batch` is overridden, cached per batch for one
149
+ * override `generation` (`Scene.getColorOverrideGeneration`). A batch with none
150
+ * is drawn with the table off, so its fragments skip the lookup entirely.
151
+ */
152
+ export function batchHasColorOverride(batch, overrides, generation) {
153
+ if (!overrides || overrides.size === 0)
154
+ return false;
155
+ const cached = hasOverrideCache.get(batch);
156
+ if (cached && cached.generation === generation)
157
+ return cached.has;
158
+ const has = batch.expressIds.some((id) => overrides.has(id));
159
+ hasOverrideCache.set(batch, { generation, has });
160
+ return has;
161
+ }
162
+ /**
163
+ * Write a draw's `overrideParams` lanes (x = anchor, y = mode bits). A null
164
+ * anchor, or `paint = false`, writes zeros: the draw keeps its own colour.
165
+ */
166
+ export function packOverrideParams(out, anchor, paint, emphasize) {
167
+ if (paint && anchor !== null) {
168
+ out[0] = anchor;
169
+ out[1] = OVERRIDE_PARAM_PAINT | (emphasize ? OVERRIDE_PARAM_EMPHASIZE : 0);
170
+ }
171
+ else {
172
+ out[0] = 0;
173
+ out[1] = 0;
174
+ }
175
+ out[2] = 0;
176
+ out[3] = 0;
177
+ }
178
+ /** Owns the table's CPU image and its GPU buffer. One per `Scene`. */
179
+ export class EntityColorTable {
180
+ image = EMPTY_IMAGE;
181
+ buffer = null;
182
+ bufferDevice = null;
183
+ bufferBytes = 0;
184
+ uploadedBytes = 0;
185
+ warnedDropped = false; // per table, i.e. per scene
186
+ /** Replace the table with `overrides` and upload it. */
187
+ write(device, overrides) {
188
+ const limits = device.limits;
189
+ const maxBytes = Math.min(limits?.maxStorageBufferBindingSize ?? DEFAULT_MAX_TABLE_BYTES, limits?.maxBufferSize ?? DEFAULT_MAX_TABLE_BYTES);
190
+ this.image = buildEntityColorTableImage(overrides, maxBytes);
191
+ if (this.image.dropped > 0 && !this.warnedDropped) {
192
+ this.warnedDropped = true;
193
+ console.warn(`[EntityColorTable] ${this.image.dropped} colour overrides exceed the device's storage-buffer limit and are not painted.`);
194
+ }
195
+ const bytes = this.image.words.byteLength;
196
+ if (!this.buffer || this.bufferDevice !== device || this.bufferBytes < bytes) {
197
+ this.buffer?.destroy();
198
+ this.bufferBytes = Math.max(bytes, ENTITY_COLOR_HEADER_WORDS * 4);
199
+ this.buffer = device.createBuffer({
200
+ label: 'entity-color-table',
201
+ size: this.bufferBytes,
202
+ usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,
203
+ });
204
+ this.bufferDevice = device;
205
+ }
206
+ device.queue.writeBuffer(this.buffer, 0, this.image.words);
207
+ this.uploadedBytes = bytes;
208
+ }
209
+ /** Empty the table: only the 16-byte header is rewritten (count 0 disables every lookup). */
210
+ clear() {
211
+ this.image = EMPTY_IMAGE;
212
+ this.uploadedBytes = 0;
213
+ if (this.buffer && this.bufferDevice) {
214
+ this.bufferDevice.queue.writeBuffer(this.buffer, 0, EMPTY_IMAGE.words);
215
+ this.uploadedBytes = EMPTY_IMAGE.words.byteLength;
216
+ }
217
+ }
218
+ /** Drop the GPU buffer (device loss, scene teardown); the CPU image survives for re-upload. */
219
+ releaseGpu() {
220
+ this.buffer?.destroy();
221
+ this.buffer = null;
222
+ this.bufferDevice = null;
223
+ this.bufferBytes = 0;
224
+ }
225
+ /** The buffer the renderer binds, or null while nothing was ever written. */
226
+ getBuffer() {
227
+ return this.buffer;
228
+ }
229
+ /** The current CPU image (what the GPU buffer holds after the last write). */
230
+ getImage() {
231
+ return this.image;
232
+ }
233
+ /** Bytes the last `write` / `clear` uploaded. */
234
+ getLastUploadBytes() {
235
+ return this.uploadedBytes;
236
+ }
237
+ }
238
+ //# sourceMappingURL=entity-color-table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-color-table.js","sourceRoot":"","sources":["../src/entity-color-table.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@
6
6
  * pre-check skips the frame, and `containFrameThrow` catches whatever a
7
7
  * mid-frame call throws. Every upload call site that runs OUTSIDE that loop —
8
8
  * `addMeshes`, `loadGeometry`, `addMesh`, `ensureMeshResources`,
9
- * `createMeshFromData`, and the viewer's `setSpaceOverlayMeshes` — has none of
9
+ * `createMeshFromData`, and the viewer's `setAuthoringOverlayMeshes` — has none of
10
10
  * that. Before this module, a `device.createBuffer()` on a lost-but-not-yet-
11
11
  * `isInitialized()==false` device (see `getGPUDevice()`'s doc: a loss never
12
12
  * calls `destroy()`, so the zombie device stays "initialized") threw straight
@@ -9,7 +9,7 @@
9
9
  * pre-check skips the frame, and `containFrameThrow` catches whatever a
10
10
  * mid-frame call throws. Every upload call site that runs OUTSIDE that loop —
11
11
  * `addMeshes`, `loadGeometry`, `addMesh`, `ensureMeshResources`,
12
- * `createMeshFromData`, and the viewer's `setSpaceOverlayMeshes` — has none of
12
+ * `createMeshFromData`, and the viewer's `setAuthoringOverlayMeshes` — has none of
13
13
  * that. Before this module, a `device.createBuffer()` on a lost-but-not-yet-
14
14
  * `isInitialized()==false` device (see `getGPUDevice()`'s doc: a loss never
15
15
  * calls `destroy()`, so the zombie device stays "initialized") threw straight
@@ -0,0 +1,29 @@
1
+ /**
2
+ * GPU copies of the hovered entity's pieces for the hover pre-highlight mask
3
+ * (#5390). A batched model has no individual mesh for an entity that is not
4
+ * selected, so the hover outline would otherwise never draw.
5
+ *
6
+ * Deliberately kept OUT of `Scene.meshes`: hydrated scene meshes are also
7
+ * drawn by the main pass, so a hovered translucent entity would blend twice
8
+ * over its own batch copy. These copies are only ever drawn into the mask.
9
+ *
10
+ * Every piece of the entity is uploaded (a window or a layered wall is several
11
+ * pieces), through the same `uploadIndividualMesh` selection hydration uses,
12
+ * so the outline is bit-coincident with the batch it traces. The copies are
13
+ * rebuilt only when the hovered (model, id) changes, and the previous ones are
14
+ * destroyed then; `release()` frees them when nothing is hovered.
15
+ */
16
+ import type { MeshData } from '@ifc-lite/geometry';
17
+ import { type IndividualMeshFrame, type IndividualMeshGpu } from './individual-mesh-upload.js';
18
+ export declare class HoverMeshCache {
19
+ private key;
20
+ private pieces;
21
+ /**
22
+ * The GPU pieces for `(modelIndex, id)`: cached while the key is unchanged,
23
+ * otherwise `pieces()` is re-read and uploaded.
24
+ */
25
+ resolve(device: GPUDevice, id: number, modelIndex: number | undefined, pieces: () => readonly MeshData[] | undefined, frameOf: (meshData: MeshData) => IndividualMeshFrame): readonly IndividualMeshGpu[];
26
+ /** Destroy the cached copies. Idempotent. */
27
+ release(): void;
28
+ }
29
+ //# sourceMappingURL=hover-mesh-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hover-mesh-cache.d.ts","sourceRoot":"","sources":["../src/hover-mesh-cache.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAwB,KAAK,mBAAmB,EAAE,KAAK,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAErH,qBAAa,cAAc;IACzB,OAAO,CAAC,GAAG,CAAuB;IAClC,OAAO,CAAC,MAAM,CAA2B;IAEzC;;;OAGG;IACH,OAAO,CACL,MAAM,EAAE,SAAS,EACjB,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,MAAM,EAAE,MAAM,SAAS,QAAQ,EAAE,GAAG,SAAS,EAC7C,OAAO,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,mBAAmB,GACnD,SAAS,iBAAiB,EAAE;IAS/B,6CAA6C;IAC7C,OAAO,IAAI,IAAI;CAQhB"}
@@ -0,0 +1,31 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ import { uploadIndividualMesh } from './individual-mesh-upload.js';
5
+ export class HoverMeshCache {
6
+ key = null;
7
+ pieces = [];
8
+ /**
9
+ * The GPU pieces for `(modelIndex, id)`: cached while the key is unchanged,
10
+ * otherwise `pieces()` is re-read and uploaded.
11
+ */
12
+ resolve(device, id, modelIndex, pieces, frameOf) {
13
+ const key = `${modelIndex ?? 'any'}:${id}`;
14
+ if (key === this.key)
15
+ return this.pieces;
16
+ this.release();
17
+ this.key = key;
18
+ this.pieces = (pieces() ?? []).map((meshData) => uploadIndividualMesh(device, meshData, frameOf(meshData)));
19
+ return this.pieces;
20
+ }
21
+ /** Destroy the cached copies. Idempotent. */
22
+ release() {
23
+ for (const piece of this.pieces) {
24
+ piece.vertexBuffer.destroy();
25
+ piece.indexBuffer.destroy();
26
+ }
27
+ this.pieces = [];
28
+ this.key = null;
29
+ }
30
+ }
31
+ //# sourceMappingURL=hover-mesh-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hover-mesh-cache.js","sourceRoot":"","sources":["../src/hover-mesh-cache.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAmB/D,OAAO,EAAE,oBAAoB,EAAoD,MAAM,6BAA6B,CAAC;AAErH,MAAM,OAAO,cAAc;IACjB,GAAG,GAAkB,IAAI,CAAC;IAC1B,MAAM,GAAwB,EAAE,CAAC;IAEzC;;;OAGG;IACH,OAAO,CACL,MAAiB,EACjB,EAAU,EACV,UAA8B,EAC9B,MAA6C,EAC7C,OAAoD;QAEpD,MAAM,GAAG,GAAG,GAAG,UAAU,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;QAC3C,IAAI,GAAG,KAAK,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC;QACzC,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,MAAM,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,oBAAoB,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC5G,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,6CAA6C;IAC7C,OAAO;QACL,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;YAC7B,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;QAC9B,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;IAClB,CAAC;CACF"}