@ifc-lite/renderer 3.2.0 → 4.2.0

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 (371) hide show
  1. package/dist/aabb-edges.d.ts +10 -0
  2. package/dist/aabb-edges.d.ts.map +1 -1
  3. package/dist/aabb-edges.js +13 -0
  4. package/dist/aabb-edges.js.map +1 -1
  5. package/dist/ao-params.d.ts +85 -0
  6. package/dist/ao-params.d.ts.map +1 -0
  7. package/dist/ao-params.js +109 -0
  8. package/dist/ao-params.js.map +1 -0
  9. package/dist/ao-pass.d.ts +47 -0
  10. package/dist/ao-pass.d.ts.map +1 -0
  11. package/dist/ao-pass.js +157 -0
  12. package/dist/ao-pass.js.map +1 -0
  13. package/dist/camera-matrices.d.ts +3 -0
  14. package/dist/camera-matrices.d.ts.map +1 -1
  15. package/dist/camera-matrices.js +12 -1
  16. package/dist/camera-matrices.js.map +1 -1
  17. package/dist/camera-orientation.d.ts +62 -0
  18. package/dist/camera-orientation.d.ts.map +1 -0
  19. package/dist/camera-orientation.js +155 -0
  20. package/dist/camera-orientation.js.map +1 -0
  21. package/dist/camera-projection.d.ts +3 -1
  22. package/dist/camera-projection.d.ts.map +1 -1
  23. package/dist/camera-projection.js +26 -20
  24. package/dist/camera-projection.js.map +1 -1
  25. package/dist/camera-surface-zoom.d.ts +32 -0
  26. package/dist/camera-surface-zoom.d.ts.map +1 -0
  27. package/dist/camera-surface-zoom.js +37 -0
  28. package/dist/camera-surface-zoom.js.map +1 -0
  29. package/dist/camera.d.ts +32 -61
  30. package/dist/camera.d.ts.map +1 -1
  31. package/dist/camera.js +71 -167
  32. package/dist/camera.js.map +1 -1
  33. package/dist/clash-solid-pipeline.d.ts +9 -3
  34. package/dist/clash-solid-pipeline.d.ts.map +1 -1
  35. package/dist/clash-solid-pipeline.js +31 -8
  36. package/dist/clash-solid-pipeline.js.map +1 -1
  37. package/dist/constants.d.ts +1 -1
  38. package/dist/constants.d.ts.map +1 -1
  39. package/dist/constants.js +4 -3
  40. package/dist/constants.js.map +1 -1
  41. package/dist/depth-reconstruct.d.ts +43 -0
  42. package/dist/depth-reconstruct.d.ts.map +1 -0
  43. package/dist/depth-reconstruct.js +35 -0
  44. package/dist/depth-reconstruct.js.map +1 -0
  45. package/dist/device.js +1 -1
  46. package/dist/device.js.map +1 -1
  47. package/dist/environment.d.ts +26 -15
  48. package/dist/environment.d.ts.map +1 -1
  49. package/dist/environment.js +24 -13
  50. package/dist/environment.js.map +1 -1
  51. package/dist/federation-registry.d.ts +16 -0
  52. package/dist/federation-registry.d.ts.map +1 -1
  53. package/dist/federation-registry.js +80 -9
  54. package/dist/federation-registry.js.map +1 -1
  55. package/dist/gpu-static-upload.d.ts +39 -0
  56. package/dist/gpu-static-upload.d.ts.map +1 -0
  57. package/dist/gpu-static-upload.js +70 -0
  58. package/dist/gpu-static-upload.js.map +1 -0
  59. package/dist/gpu-upload-guard.d.ts +12 -23
  60. package/dist/gpu-upload-guard.d.ts.map +1 -1
  61. package/dist/gpu-upload-guard.js +12 -26
  62. package/dist/gpu-upload-guard.js.map +1 -1
  63. package/dist/index.d.ts +29 -21
  64. package/dist/index.d.ts.map +1 -1
  65. package/dist/index.js +201 -252
  66. package/dist/index.js.map +1 -1
  67. package/dist/instanced-render.d.ts +22 -2
  68. package/dist/instanced-render.d.ts.map +1 -1
  69. package/dist/instanced-render.js +47 -10
  70. package/dist/instanced-render.js.map +1 -1
  71. package/dist/instanced-rte.d.ts +17 -0
  72. package/dist/instanced-rte.d.ts.map +1 -0
  73. package/dist/instanced-rte.js +32 -0
  74. package/dist/instanced-rte.js.map +1 -0
  75. package/dist/mesh-rte-uniforms.d.ts +46 -0
  76. package/dist/mesh-rte-uniforms.d.ts.map +1 -0
  77. package/dist/mesh-rte-uniforms.js +59 -0
  78. package/dist/mesh-rte-uniforms.js.map +1 -0
  79. package/dist/model-bounds-tracker.d.ts +7 -0
  80. package/dist/model-bounds-tracker.d.ts.map +1 -1
  81. package/dist/model-bounds-tracker.js +16 -5
  82. package/dist/model-bounds-tracker.js.map +1 -1
  83. package/dist/model-translation.d.ts +1 -1
  84. package/dist/model-translation.d.ts.map +1 -1
  85. package/dist/model-translation.js +50 -2
  86. package/dist/model-translation.js.map +1 -1
  87. package/dist/pick-rte-snapshot.d.ts +7 -0
  88. package/dist/pick-rte-snapshot.d.ts.map +1 -0
  89. package/dist/pick-rte-snapshot.js +15 -0
  90. package/dist/pick-rte-snapshot.js.map +1 -0
  91. package/dist/pick-types.d.ts +17 -0
  92. package/dist/pick-types.d.ts.map +1 -0
  93. package/dist/pick-types.js +5 -0
  94. package/dist/pick-types.js.map +1 -0
  95. package/dist/pick-uniforms.d.ts +6 -0
  96. package/dist/pick-uniforms.d.ts.map +1 -1
  97. package/dist/pick-uniforms.js +22 -18
  98. package/dist/pick-uniforms.js.map +1 -1
  99. package/dist/pick-world-position.d.ts +18 -0
  100. package/dist/pick-world-position.d.ts.map +1 -0
  101. package/dist/pick-world-position.js +21 -0
  102. package/dist/pick-world-position.js.map +1 -0
  103. package/dist/picker-readbacks.d.ts +6 -0
  104. package/dist/picker-readbacks.d.ts.map +1 -0
  105. package/dist/picker-readbacks.js +20 -0
  106. package/dist/picker-readbacks.js.map +1 -0
  107. package/dist/picker-rte-uniforms.d.ts +6 -0
  108. package/dist/picker-rte-uniforms.d.ts.map +1 -0
  109. package/dist/picker-rte-uniforms.js +41 -0
  110. package/dist/picker-rte-uniforms.js.map +1 -0
  111. package/dist/picker.d.ts +6 -7
  112. package/dist/picker.d.ts.map +1 -1
  113. package/dist/picker.js +88 -115
  114. package/dist/picker.js.map +1 -1
  115. package/dist/picking-manager.d.ts +8 -0
  116. package/dist/picking-manager.d.ts.map +1 -1
  117. package/dist/picking-manager.js +46 -19
  118. package/dist/picking-manager.js.map +1 -1
  119. package/dist/pipeline.d.ts +1 -7
  120. package/dist/pipeline.d.ts.map +1 -1
  121. package/dist/pipeline.js +17 -20
  122. package/dist/pipeline.js.map +1 -1
  123. package/dist/point-picker.d.ts +5 -1
  124. package/dist/point-picker.d.ts.map +1 -1
  125. package/dist/point-picker.js +49 -9
  126. package/dist/point-picker.js.map +1 -1
  127. package/dist/pointcloud/point-cloud-handle-ids.d.ts +22 -0
  128. package/dist/pointcloud/point-cloud-handle-ids.d.ts.map +1 -0
  129. package/dist/pointcloud/point-cloud-handle-ids.js +31 -0
  130. package/dist/pointcloud/point-cloud-handle-ids.js.map +1 -0
  131. package/dist/pointcloud/point-cloud-node.d.ts +14 -6
  132. package/dist/pointcloud/point-cloud-node.d.ts.map +1 -1
  133. package/dist/pointcloud/point-cloud-node.js.map +1 -1
  134. package/dist/pointcloud/point-cloud-pick-sources.d.ts +47 -0
  135. package/dist/pointcloud/point-cloud-pick-sources.d.ts.map +1 -0
  136. package/dist/pointcloud/point-cloud-pick-sources.js +32 -0
  137. package/dist/pointcloud/point-cloud-pick-sources.js.map +1 -0
  138. package/dist/pointcloud/point-cloud-placement.d.ts.map +1 -1
  139. package/dist/pointcloud/point-cloud-placement.js +20 -5
  140. package/dist/pointcloud/point-cloud-placement.js.map +1 -1
  141. package/dist/pointcloud/point-cloud-ray-transform.d.ts +78 -4
  142. package/dist/pointcloud/point-cloud-ray-transform.d.ts.map +1 -1
  143. package/dist/pointcloud/point-cloud-ray-transform.js +31 -84
  144. package/dist/pointcloud/point-cloud-ray-transform.js.map +1 -1
  145. package/dist/pointcloud/point-cloud-renderer.d.ts +21 -19
  146. package/dist/pointcloud/point-cloud-renderer.d.ts.map +1 -1
  147. package/dist/pointcloud/point-cloud-renderer.js +46 -52
  148. package/dist/pointcloud/point-cloud-renderer.js.map +1 -1
  149. package/dist/pointcloud/point-cloud-stream-lifecycle.d.ts +44 -0
  150. package/dist/pointcloud/point-cloud-stream-lifecycle.d.ts.map +1 -0
  151. package/dist/pointcloud/point-cloud-stream-lifecycle.js +44 -0
  152. package/dist/pointcloud/point-cloud-stream-lifecycle.js.map +1 -0
  153. package/dist/pointcloud/point-cloud-uniforms.d.ts +5 -0
  154. package/dist/pointcloud/point-cloud-uniforms.d.ts.map +1 -1
  155. package/dist/pointcloud/point-cloud-uniforms.js +55 -44
  156. package/dist/pointcloud/point-cloud-uniforms.js.map +1 -1
  157. package/dist/pointcloud/point-cloud-visibility.d.ts +10 -0
  158. package/dist/pointcloud/point-cloud-visibility.d.ts.map +1 -0
  159. package/dist/pointcloud/point-cloud-visibility.js +18 -0
  160. package/dist/pointcloud/point-cloud-visibility.js.map +1 -0
  161. package/dist/pointcloud/point-pipeline.d.ts +4 -9
  162. package/dist/pointcloud/point-pipeline.d.ts.map +1 -1
  163. package/dist/pointcloud/point-pipeline.js +4 -9
  164. package/dist/pointcloud/point-pipeline.js.map +1 -1
  165. package/dist/pointcloud/point-shader.wgsl.d.ts +1 -21
  166. package/dist/pointcloud/point-shader.wgsl.d.ts.map +1 -1
  167. package/dist/pointcloud/point-shader.wgsl.js +25 -5
  168. package/dist/pointcloud/point-shader.wgsl.js.map +1 -1
  169. package/dist/post-pass-chain.d.ts +38 -0
  170. package/dist/post-pass-chain.d.ts.map +1 -0
  171. package/dist/post-pass-chain.js +99 -0
  172. package/dist/post-pass-chain.js.map +1 -0
  173. package/dist/post-processor.d.ts +12 -26
  174. package/dist/post-processor.d.ts.map +1 -1
  175. package/dist/post-processor.js +14 -72
  176. package/dist/post-processor.js.map +1 -1
  177. package/dist/raycast-engine.d.ts +7 -5
  178. package/dist/raycast-engine.d.ts.map +1 -1
  179. package/dist/raycast-engine.js +17 -20
  180. package/dist/raycast-engine.js.map +1 -1
  181. package/dist/raycast-point-cloud-query.d.ts +1 -1
  182. package/dist/raycast-point-cloud-query.d.ts.map +1 -1
  183. package/dist/reference-image-pipeline.d.ts +1 -1
  184. package/dist/reference-image-pipeline.d.ts.map +1 -1
  185. package/dist/reference-image-pipeline.js +25 -7
  186. package/dist/reference-image-pipeline.js.map +1 -1
  187. package/dist/reference-images.d.ts +1 -1
  188. package/dist/reference-images.d.ts.map +1 -1
  189. package/dist/reference-images.js +13 -5
  190. package/dist/reference-images.js.map +1 -1
  191. package/dist/relative-to-eye.d.ts +146 -0
  192. package/dist/relative-to-eye.d.ts.map +1 -0
  193. package/dist/relative-to-eye.js +326 -0
  194. package/dist/relative-to-eye.js.map +1 -0
  195. package/dist/render-section-draw.d.ts +11 -0
  196. package/dist/render-section-draw.d.ts.map +1 -1
  197. package/dist/render-section-draw.js +6 -3
  198. package/dist/render-section-draw.js.map +1 -1
  199. package/dist/renderer-color-readback.d.ts +50 -0
  200. package/dist/renderer-color-readback.d.ts.map +1 -0
  201. package/dist/renderer-color-readback.js +145 -0
  202. package/dist/renderer-color-readback.js.map +1 -0
  203. package/dist/renderer-overlays.d.ts +12 -3
  204. package/dist/renderer-overlays.d.ts.map +1 -1
  205. package/dist/renderer-overlays.js +33 -20
  206. package/dist/renderer-overlays.js.map +1 -1
  207. package/dist/renderer-screenshot.d.ts +4 -0
  208. package/dist/renderer-screenshot.d.ts.map +1 -0
  209. package/dist/renderer-screenshot.js +17 -0
  210. package/dist/renderer-screenshot.js.map +1 -0
  211. package/dist/renderer-symbolic-overlays.d.ts +4 -2
  212. package/dist/renderer-symbolic-overlays.d.ts.map +1 -1
  213. package/dist/renderer-symbolic-overlays.js +33 -13
  214. package/dist/renderer-symbolic-overlays.js.map +1 -1
  215. package/dist/renderer-viewport.d.ts +45 -0
  216. package/dist/renderer-viewport.d.ts.map +1 -1
  217. package/dist/renderer-viewport.js +44 -0
  218. package/dist/renderer-viewport.js.map +1 -1
  219. package/dist/rte-clip-space.d.ts +12 -0
  220. package/dist/rte-clip-space.d.ts.map +1 -0
  221. package/dist/rte-clip-space.js +22 -0
  222. package/dist/rte-clip-space.js.map +1 -0
  223. package/dist/rte-frustum.d.ts +24 -0
  224. package/dist/rte-frustum.d.ts.map +1 -0
  225. package/dist/rte-frustum.js +45 -0
  226. package/dist/rte-frustum.js.map +1 -0
  227. package/dist/scene-batch-upload.d.ts.map +1 -1
  228. package/dist/scene-batch-upload.js +14 -38
  229. package/dist/scene-batch-upload.js.map +1 -1
  230. package/dist/scene-device-recovery.d.ts.map +1 -1
  231. package/dist/scene-device-recovery.js +5 -9
  232. package/dist/scene-device-recovery.js.map +1 -1
  233. package/dist/scene-finalize-regroup.d.ts +54 -0
  234. package/dist/scene-finalize-regroup.d.ts.map +1 -0
  235. package/dist/scene-finalize-regroup.js +136 -0
  236. package/dist/scene-finalize-regroup.js.map +1 -0
  237. package/dist/scene-instance-bounds.d.ts +12 -0
  238. package/dist/scene-instance-bounds.d.ts.map +1 -0
  239. package/dist/scene-instance-bounds.js +48 -0
  240. package/dist/scene-instance-bounds.js.map +1 -0
  241. package/dist/scene-instance-materialization.d.ts +4 -1
  242. package/dist/scene-instance-materialization.d.ts.map +1 -1
  243. package/dist/scene-instance-materialization.js +21 -6
  244. package/dist/scene-instance-materialization.js.map +1 -1
  245. package/dist/scene-instance-translation.d.ts +17 -0
  246. package/dist/scene-instance-translation.d.ts.map +1 -0
  247. package/dist/scene-instance-translation.js +50 -0
  248. package/dist/scene-instance-translation.js.map +1 -0
  249. package/dist/scene-instance-types.d.ts +6 -0
  250. package/dist/scene-instance-types.d.ts.map +1 -1
  251. package/dist/scene-model-translation.d.ts +2 -0
  252. package/dist/scene-model-translation.d.ts.map +1 -1
  253. package/dist/scene-model-translation.js +1 -1
  254. package/dist/scene-model-translation.js.map +1 -1
  255. package/dist/scene-rect-select.d.ts +11 -1
  256. package/dist/scene-rect-select.d.ts.map +1 -1
  257. package/dist/scene-rect-select.js +7 -4
  258. package/dist/scene-rect-select.js.map +1 -1
  259. package/dist/scene.d.ts +17 -19
  260. package/dist/scene.d.ts.map +1 -1
  261. package/dist/scene.js +109 -238
  262. package/dist/scene.js.map +1 -1
  263. package/dist/section-2d-lift.d.ts +10 -2
  264. package/dist/section-2d-lift.d.ts.map +1 -1
  265. package/dist/section-2d-lift.js +14 -6
  266. package/dist/section-2d-lift.js.map +1 -1
  267. package/dist/section-2d-line-buffer.d.ts +12 -4
  268. package/dist/section-2d-line-buffer.d.ts.map +1 -1
  269. package/dist/section-2d-line-buffer.js +59 -33
  270. package/dist/section-2d-line-buffer.js.map +1 -1
  271. package/dist/section-2d-overlay.d.ts +18 -72
  272. package/dist/section-2d-overlay.d.ts.map +1 -1
  273. package/dist/section-2d-overlay.js +72 -103
  274. package/dist/section-2d-overlay.js.map +1 -1
  275. package/dist/section-2d-types.d.ts +38 -0
  276. package/dist/section-2d-types.d.ts.map +1 -0
  277. package/dist/section-2d-types.js +6 -0
  278. package/dist/section-2d-types.js.map +1 -0
  279. package/dist/section-cap-pipelines.d.ts +6 -0
  280. package/dist/section-cap-pipelines.d.ts.map +1 -0
  281. package/dist/section-cap-pipelines.js +87 -0
  282. package/dist/section-cap-pipelines.js.map +1 -0
  283. package/dist/section-plane-geometry.d.ts +24 -0
  284. package/dist/section-plane-geometry.d.ts.map +1 -0
  285. package/dist/section-plane-geometry.js +93 -0
  286. package/dist/section-plane-geometry.js.map +1 -0
  287. package/dist/section-plane.d.ts +23 -24
  288. package/dist/section-plane.d.ts.map +1 -1
  289. package/dist/section-plane.js +58 -174
  290. package/dist/section-plane.js.map +1 -1
  291. package/dist/shaders/ao.wgsl.d.ts +2 -0
  292. package/dist/shaders/ao.wgsl.d.ts.map +1 -0
  293. package/dist/shaders/ao.wgsl.js +234 -0
  294. package/dist/shaders/ao.wgsl.js.map +1 -0
  295. package/dist/shaders/color-transfer.wgsl.d.ts +26 -0
  296. package/dist/shaders/color-transfer.wgsl.d.ts.map +1 -0
  297. package/dist/shaders/color-transfer.wgsl.js +53 -0
  298. package/dist/shaders/color-transfer.wgsl.js.map +1 -0
  299. package/dist/shaders/depth-reconstruct.wgsl.d.ts +16 -0
  300. package/dist/shaders/depth-reconstruct.wgsl.d.ts.map +1 -0
  301. package/dist/shaders/depth-reconstruct.wgsl.js +69 -0
  302. package/dist/shaders/depth-reconstruct.wgsl.js.map +1 -0
  303. package/dist/shaders/main-rte-shadow.wgsl.d.ts +4 -0
  304. package/dist/shaders/main-rte-shadow.wgsl.d.ts.map +1 -0
  305. package/dist/shaders/main-rte-shadow.wgsl.js +54 -0
  306. package/dist/shaders/main-rte-shadow.wgsl.js.map +1 -0
  307. package/dist/shaders/main.wgsl.d.ts +1 -6
  308. package/dist/shaders/main.wgsl.d.ts.map +1 -1
  309. package/dist/shaders/main.wgsl.js +110 -159
  310. package/dist/shaders/main.wgsl.js.map +1 -1
  311. package/dist/shaders/relative-to-eye.wgsl.d.ts +12 -0
  312. package/dist/shaders/relative-to-eye.wgsl.d.ts.map +1 -0
  313. package/dist/shaders/relative-to-eye.wgsl.js +40 -0
  314. package/dist/shaders/relative-to-eye.wgsl.js.map +1 -0
  315. package/dist/shaders/section-2d-overlay.wgsl.d.ts +28 -12
  316. package/dist/shaders/section-2d-overlay.wgsl.d.ts.map +1 -1
  317. package/dist/shaders/section-2d-overlay.wgsl.js +40 -13
  318. package/dist/shaders/section-2d-overlay.wgsl.js.map +1 -1
  319. package/dist/shaders/shadow.wgsl.d.ts +1 -1
  320. package/dist/shaders/shadow.wgsl.d.ts.map +1 -1
  321. package/dist/shaders/shadow.wgsl.js +25 -7
  322. package/dist/shaders/shadow.wgsl.js.map +1 -1
  323. package/dist/shaders/sky.wgsl.d.ts +1 -11
  324. package/dist/shaders/sky.wgsl.d.ts.map +1 -1
  325. package/dist/shaders/sky.wgsl.js +17 -19
  326. package/dist/shaders/sky.wgsl.js.map +1 -1
  327. package/dist/shaders/symbolic-overlay.wgsl.d.ts +2 -9
  328. package/dist/shaders/symbolic-overlay.wgsl.d.ts.map +1 -1
  329. package/dist/shaders/symbolic-overlay.wgsl.js +88 -17
  330. package/dist/shaders/symbolic-overlay.wgsl.js.map +1 -1
  331. package/dist/shaders/textured.wgsl.d.ts.map +1 -1
  332. package/dist/shaders/textured.wgsl.js +11 -9
  333. package/dist/shaders/textured.wgsl.js.map +1 -1
  334. package/dist/shadow-light-matrix.d.ts +7 -0
  335. package/dist/shadow-light-matrix.d.ts.map +1 -1
  336. package/dist/shadow-light-matrix.js +11 -0
  337. package/dist/shadow-light-matrix.js.map +1 -1
  338. package/dist/shadow-occluder-batches.d.ts +10 -0
  339. package/dist/shadow-occluder-batches.d.ts.map +1 -0
  340. package/dist/shadow-occluder-batches.js +39 -0
  341. package/dist/shadow-occluder-batches.js.map +1 -0
  342. package/dist/shadow-occluders.d.ts.map +1 -1
  343. package/dist/shadow-occluders.js +4 -0
  344. package/dist/shadow-occluders.js.map +1 -1
  345. package/dist/shadow-pass.d.ts +5 -51
  346. package/dist/shadow-pass.d.ts.map +1 -1
  347. package/dist/shadow-pass.js +49 -45
  348. package/dist/shadow-pass.js.map +1 -1
  349. package/dist/shadow-types.d.ts +39 -0
  350. package/dist/shadow-types.d.ts.map +1 -0
  351. package/dist/shadow-types.js +15 -0
  352. package/dist/shadow-types.js.map +1 -0
  353. package/dist/symbolic-overlay-geometry.d.ts +7 -0
  354. package/dist/symbolic-overlay-geometry.d.ts.map +1 -0
  355. package/dist/symbolic-overlay-geometry.js +43 -0
  356. package/dist/symbolic-overlay-geometry.js.map +1 -0
  357. package/dist/symbolic-overlay-pipelines.d.ts +24 -36
  358. package/dist/symbolic-overlay-pipelines.d.ts.map +1 -1
  359. package/dist/symbolic-overlay-pipelines.js +175 -182
  360. package/dist/symbolic-overlay-pipelines.js.map +1 -1
  361. package/dist/symbolic-text-atlas.d.ts +21 -0
  362. package/dist/symbolic-text-atlas.d.ts.map +1 -1
  363. package/dist/symbolic-text-atlas.js +29 -1
  364. package/dist/symbolic-text-atlas.js.map +1 -1
  365. package/dist/types.d.ts +20 -26
  366. package/dist/types.d.ts.map +1 -1
  367. package/dist/visual-enhancement.d.ts +23 -1
  368. package/dist/visual-enhancement.d.ts.map +1 -1
  369. package/dist/visual-enhancement.js +38 -12
  370. package/dist/visual-enhancement.js.map +1 -1
  371. package/package.json +3 -3
@@ -1,10 +1,3 @@
1
- /**
2
- * WGSL shaders for the IfcAnnotation overlay (fills + text labels).
3
- *
4
- * Two pipelines share this file because they ride the same camera uniform
5
- * layout and write into the same RGBA-blended pass. Splitting per-pipeline
6
- * would mean two near-identical vertex inputs and duplicate camera structs.
7
- */
8
- export declare const SYMBOLIC_FILL_WGSL = "\nstruct Camera {\n viewProj: mat4x4<f32>,\n};\n\n@group(0) @binding(0) var<uniform> camera: Camera;\n\nstruct VsIn {\n @location(0) position: vec3<f32>,\n @location(1) color: vec4<f32>,\n};\n\nstruct VsOut {\n @builtin(position) clipPos: vec4<f32>,\n @location(0) color: vec4<f32>,\n};\n\n@vertex\nfn vs_main(in: VsIn) -> VsOut {\n var out: VsOut;\n out.clipPos = camera.viewProj * vec4<f32>(in.position, 1.0);\n out.color = in.color;\n return out;\n}\n\n@fragment\nfn fs_main(in: VsOut) -> @location(0) vec4<f32> {\n // Premultiply alpha so the standard \"src * 1 + dst * (1-src.a)\" blend\n // produces the correct composite on top of the existing scene.\n return vec4<f32>(in.color.rgb * in.color.a, in.color.a);\n}\n";
9
- export declare const SYMBOLIC_TEXT_WGSL = "\nstruct Camera {\n viewProj: mat4x4<f32>,\n // x = viewport width in physical pixels, y = viewport height\n // z = target glyph cap-height in screen pixels, w = padding\n viewportAndTarget: vec4<f32>,\n // Screen-aligned camera basis (world space). xyz = direction, w = padding.\n // Used by billboarded glyphs (grid tags) so they always face the camera \u2014\n // critical for top-down/ground views where world-up upAxis collapses to\n // zero screen extent and the tag becomes invisible.\n cameraRight: vec4<f32>,\n cameraUp: vec4<f32>,\n};\n\n@group(0) @binding(0) var<uniform> camera: Camera;\n@group(0) @binding(1) var atlasTex: texture_2d<f32>;\n@group(0) @binding(2) var atlasSamp: sampler;\n\n// Per-vertex (corner of the glyph quad).\nstruct VsIn {\n // Bit-packed corner index 0..3. The vertex buffer is just [0u, 1u, 2u, 3u].\n @location(0) corner: u32,\n};\n\n// Per-instance attributes \u2014 one record per glyph.\nstruct InstIn {\n // World-space origin of the glyph (bottom-left, after alignment + rotation).\n @location(1) origin: vec3<f32>,\n // Right axis in world space \u2014 encodes both glyph width and baseline rotation.\n @location(2) rightAxis: vec3<f32>,\n // Up axis in world space \u2014 encodes glyph height and baseline rotation.\n @location(3) upAxis: vec3<f32>,\n // Atlas UV bounds: (u0, v0, u1, v1).\n @location(4) uvBounds: vec4<f32>,\n // Glyph tint (sRGB straight-alpha).\n @location(5) color: vec4<f32>,\n // Shared text-label anchor (every glyph in the same label uses the same\n // anchor). Lets the shader compute one screen-space scale per label and\n // apply it uniformly to every glyph offset so row spacing stays in sync.\n @location(6) anchor: vec3<f32>,\n // Authored cap height in world units. Same value for every glyph in the\n // label; used to convert \"target pixels\" into a scale factor.\n @location(7) capHeight: f32,\n // Billboard flag (1.0 = use camera-aligned axes, 0.0 = use authored\n // rightAxis/upAxis). Only the grid-tag emission path sets this to 1.0.\n @location(8) billboard: f32,\n // Per-glyph baseline-relative offset + size in WORLD units. Only used\n // when billboard=1 (the authored origin bakes the offset along the\n // floor-plane basis, which is the wrong direction for camera-aligned\n // text). For non-billboard glyphs these are written too but the shader\n // picks the authored path. World units = atlas-pixel * wScale.\n // .xy = (offsetX, offsetY) from anchor to glyph BL\n // .zw = (width, height) of the glyph quad\n @location(9) glyphOffsetSize: vec4<f32>,\n // Per-instance target cap height in screen pixels. 0 = fall back to\n // the renderer global default (viewportAndTarget.z). Grid bubble\n // glyphs override with a larger value so the bubble stays proportional\n // to the tag at every zoom level.\n @location(10) targetPxOverride: f32,\n};\n\nstruct VsOut {\n @builtin(position) clipPos: vec4<f32>,\n @location(0) uv: vec2<f32>,\n @location(1) color: vec4<f32>,\n};\n\n@vertex\nfn vs_main(in: VsIn, inst: InstIn) -> VsOut {\n // Map corner index to (u, v) in [0, 1] \u2014 the four quad corners.\n // 0 = bottom-left, 1 = bottom-right, 2 = top-left, 3 = top-right.\n let u = f32((in.corner & 1u)); // 0,1,0,1\n let v = f32((in.corner >> 1u) & 1u); // 0,0,1,1\n\n // \u2500\u2500 Screen-space text scaling (projection-agnostic) \u2500\u2500\n // For non-billboard glyphs measure world-Y \u2192 screen pixels (matches the\n // authored upAxis convention). For billboard glyphs measure cameraUp \u2192\n // screen pixels \u2014 that axis ALWAYS spans the full viewport height\n // regardless of view angle, so screen-space scaling stays correct in\n // top-down / ground / oblique views.\n let isBillboard = inst.billboard > 0.5;\n let scaleProbeAxis = select(vec3<f32>(0.0, 1.0, 0.0), camera.cameraUp.xyz, isBillboard);\n let aClip = camera.viewProj * vec4<f32>(inst.anchor, 1.0);\n let bClip = camera.viewProj * vec4<f32>(inst.anchor + scaleProbeAxis, 1.0);\n let aNdc = aClip.xy / max(abs(aClip.w), 1e-4);\n let bNdc = bClip.xy / max(abs(bClip.w), 1e-4);\n let unitYPx = length(bNdc - aNdc) * camera.viewportAndTarget.y * 0.5;\n\n let safeCap = max(inst.capHeight, 1e-4);\n let currentPx = safeCap * unitYPx;\n // Per-instance target overrides the uniform default (used by grid bubble\n // glyphs to render at a larger on-screen size than the inscribed tag).\n let targetPx = select(camera.viewportAndTarget.z, inst.targetPxOverride, inst.targetPxOverride > 0.0);\n // Clamp to (0.02, 1.0]: never grow text beyond authored size; never\n // shrink below ~2%.\n let scale = clamp(\n targetPx / max(currentPx, 1e-2),\n 0.02,\n 1.0,\n );\n\n // \u2500\u2500 Position the glyph quad in world space \u2500\u2500\n // Non-billboard: authored axes (text lies in the floor plane of its\n // annotation \u2014 IFC convention). Billboard: camera-aligned axes (text\n // always faces the camera \u2014 grid-tag convention).\n let authoredLocalOffset = inst.origin - inst.anchor;\n let authoredWorldPos =\n inst.anchor\n + authoredLocalOffset * scale\n + inst.rightAxis * scale * u\n + inst.upAxis * scale * v;\n\n // Billboard: rebuild the quad in screen-aligned camera basis. glyphOffsetSize\n // carries the same 2D atlas-pixel layout the upload computed, just in\n // world units \u2014 re-project onto (cameraRight, cameraUp) so it tracks the\n // viewer's eye in every orientation.\n let bbOffsetX = inst.glyphOffsetSize.x;\n let bbOffsetY = inst.glyphOffsetSize.y;\n let bbWidth = inst.glyphOffsetSize.z;\n let bbHeight = inst.glyphOffsetSize.w;\n let billboardWorldPos =\n inst.anchor\n + (camera.cameraRight.xyz * bbOffsetX + camera.cameraUp.xyz * bbOffsetY) * scale\n + (camera.cameraRight.xyz * bbWidth * u\n + camera.cameraUp.xyz * bbHeight * v) * scale;\n\n let worldPos = select(authoredWorldPos, billboardWorldPos, isBillboard);\n\n // UV: lerp atlas bounds. Note v inverted (atlas top is v=0).\n let uMix = mix(inst.uvBounds.x, inst.uvBounds.z, u);\n let vMix = mix(inst.uvBounds.w, inst.uvBounds.y, v);\n\n var out: VsOut;\n let clip = camera.viewProj * vec4<f32>(worldPos, 1.0);\n // Reverse-Z decal nudge for text coplanar with model faces (issue #812\n // follow-up: \"30\", \"1.49\" etc. flickering against the terrain). The\n // pipeline-level depthBiasSlopeScale collapses to ~0 for billboard\n // glyphs \u2014 the quad faces the camera, so depth slope across the quad\n // is zero \u2014 leaving only a tiny -4 constant that MSAA jitter beats.\n // Adding a small positive multiple of clip.w raises NDC z by a\n // constant after the w-divide, which under reverse-Z reads as\n // \"slightly closer\" \u2014 same trick the line pipeline uses.\n out.clipPos = vec4<f32>(clip.x, clip.y, clip.z + 5e-5 * clip.w, clip.w);\n out.uv = vec2<f32>(uMix, vMix);\n out.color = inst.color;\n return out;\n}\n\n@fragment\nfn fs_main(in: VsOut) -> @location(0) vec4<f32> {\n let atlas = textureSample(atlasTex, atlasSamp, in.uv);\n // The atlas was rasterised with white glyphs on a transparent background,\n // so atlas.r is the coverage and atlas.a is the alpha. Multiply by the\n // per-glyph tint and premultiply for the standard composite.\n let alpha = atlas.a * in.color.a;\n return vec4<f32>(in.color.rgb * alpha, alpha);\n}\n";
1
+ export declare const SYMBOLIC_FILL_WGSL = "\nstruct Camera {\n viewProj: mat4x4<f32>,\n rteViewProj: mat4x4<f32>,\n originHigh: vec4<f32>,\n originLow: vec4<f32>,\n};\n\n@group(0) @binding(0) var<uniform> camera: Camera;\n\nstruct VsIn {\n @location(0) position: vec3<f32>,\n @location(1) color: vec4<f32>,\n};\n\nstruct VsOut {\n @builtin(position) clipPos: vec4<f32>,\n @location(0) color: vec4<f32>,\n};\n\n@vertex\nfn vs_main(in: VsIn) -> VsOut {\n var out: VsOut;\n let global = camera.viewProj * vec4<f32>(in.position, 1.0);\n let relative = (in.position + camera.originHigh.xyz) + camera.originLow.xyz;\n out.clipPos = select(global, camera.rteViewProj * vec4<f32>(relative, 1.0), camera.originHigh.w == 1.0);\n out.color = in.color;\n return out;\n}\n\n@fragment\nfn fs_main(in: VsOut) -> @location(0) vec4<f32> {\n // Premultiply alpha so the standard \"src * 1 + dst * (1-src.a)\" blend\n // produces the correct composite on top of the existing scene.\n return vec4<f32>(in.color.rgb * in.color.a, in.color.a);\n}\n";
2
+ export declare const SYMBOLIC_TEXT_WGSL = "\nstruct Camera {\n viewProj: mat4x4<f32>,\n // Legacy labels keep using viewProj. Anchored labels select this\n // translation-free eye-relative matrix per instance.\n rteViewProj: mat4x4<f32>,\n // x = viewport width in physical pixels, y = viewport height\n // z = target glyph cap-height in screen pixels, w = padding\n viewportAndTarget: vec4<f32>,\n // Screen-aligned camera basis (world space). xyz = direction, w = padding.\n // Used by billboarded glyphs (grid tags) so they always face the camera \u2014\n // critical for top-down/ground views where world-up upAxis collapses to\n // zero screen extent and the tag becomes invisible.\n cameraRight: vec4<f32>,\n cameraUp: vec4<f32>,\n // Retained for the 208-byte symbolic-text uniform ABI. RTE text now packs\n // its drawable-minus-camera delta on the CPU rather than subtracting these\n // independently rounded absolute values in WGSL.\n cameraHigh: vec4<f32>,\n cameraLow: vec4<f32>,\n};\n\n@group(0) @binding(0) var<uniform> camera: Camera;\n@group(0) @binding(1) var atlasTex: texture_2d<f32>;\n@group(0) @binding(2) var atlasSamp: sampler;\n\n// Per-vertex (corner of the glyph quad).\nstruct VsIn {\n // Bit-packed corner index 0..3. The vertex buffer is just [0u, 1u, 2u, 3u].\n @location(0) corner: u32,\n};\n\n// Per-instance attributes \u2014 one record per glyph.\nstruct InstIn {\n // World-space origin of the glyph (bottom-left, after alignment + rotation).\n @location(1) origin: vec3<f32>,\n // Right axis in world space \u2014 encodes both glyph width and baseline rotation.\n @location(2) rightAxis: vec3<f32>,\n // Up axis in world space \u2014 encodes glyph height and baseline rotation.\n @location(3) upAxis: vec3<f32>,\n // Atlas UV bounds: (u0, v0, u1, v1).\n @location(4) uvBounds: vec4<f32>,\n // Glyph tint (sRGB straight-alpha).\n @location(5) color: vec4<f32>,\n // Shared text-label anchor (every glyph in the same label uses the same\n // anchor). Lets the shader compute one screen-space scale per label and\n // apply it uniformly to every glyph offset so row spacing stays in sync.\n @location(6) anchor: vec3<f32>,\n // Authored cap height in world units. Same value for every glyph in the\n // label; used to convert \"target pixels\" into a scale factor.\n @location(7) capHeight: f32,\n // Billboard flag (1.0 = use camera-aligned axes, 0.0 = use authored\n // rightAxis/upAxis). Only the grid-tag emission path sets this to 1.0.\n @location(8) billboard: f32,\n // Per-glyph baseline-relative offset + size in WORLD units. Only used\n // when billboard=1 (the authored origin bakes the offset along the\n // floor-plane basis, which is the wrong direction for camera-aligned\n // text). For non-billboard glyphs these are written too but the shader\n // picks the authored path. World units = atlas-pixel * wScale.\n // .xy = (offsetX, offsetY) from anchor to glyph BL\n // .zw = (width, height) of the glyph quad\n @location(9) glyphOffsetSize: vec4<f32>,\n // Per-instance target cap height in screen pixels. 0 = fall back to\n // the renderer global default (viewportAndTarget.z). Grid bubble\n // glyphs override with a larger value so the bubble stays proportional\n // to the tag at every zoom level.\n @location(10) targetPxOverride: f32,\n // CPU-packed drawable-minus-camera delta. deltaHigh.w == 1 selects the\n // RTE route; deltaLow.w marks an anchor-local static glyph origin for the\n // legacy projection path too.\n @location(11) deltaHigh: vec4<f32>,\n @location(12) deltaLow: vec4<f32>,\n};\n\nstruct VsOut {\n @builtin(position) clipPos: vec4<f32>,\n @location(0) uv: vec2<f32>,\n @location(1) color: vec4<f32>,\n};\n\nfn rteClipPosition(\n local: vec3<f32>, high: vec3<f32>, low: vec3<f32>, viewProj: mat4x4<f32>,\n) -> vec4<f32> {\n // Do not first reconstruct a million-metre f32 position: that addition can\n // discard centimetre local lanes before projection. Transform high and the\n // combined local/low term independently, then combine in clip space where projection has\n // reduced or cancelled the coordinate scale. A final raw f32 eye vector\n // still cannot represent a sub-ULP residual at the \u00B11,000,000 m boundary.\n return viewProj * vec4<f32>(high, 1.0) + viewProj * vec4<f32>(local + low, 0.0);\n}\n\n@vertex\nfn vs_main(in: VsIn, inst: InstIn) -> VsOut {\n // Map corner index to (u, v) in [0, 1] \u2014 the four quad corners.\n // 0 = bottom-left, 1 = bottom-right, 2 = top-left, 3 = top-right.\n let u = f32((in.corner & 1u)); // 0,1,0,1\n let v = f32((in.corner >> 1u) & 1u); // 0,0,1,1\n\n // \u2500\u2500 Screen-space text scaling (projection-agnostic) \u2500\u2500\n // For non-billboard glyphs measure world-Y \u2192 screen pixels (matches the\n // authored upAxis convention). For billboard glyphs measure cameraUp \u2192\n // screen pixels \u2014 that axis ALWAYS spans the full viewport height\n // regardless of view angle, so screen-space scaling stays correct in\n // top-down / ground / oblique views.\n let isBillboard = inst.billboard > 0.5;\n let isRte = inst.deltaHigh.w == 1.0;\n let hasLocalOrigin = inst.deltaLow.w == 1.0;\n // The f64 CPU path has already formed the drawable-camera delta. Project\n // split terms independently so projection can retain low residuals.\n let scaleProbeAxis = select(vec3<f32>(0.0, 1.0, 0.0), camera.cameraUp.xyz, isBillboard);\n let aClip = select(\n camera.viewProj * vec4<f32>(inst.anchor, 1.0),\n rteClipPosition(vec3<f32>(0.0), inst.deltaHigh.xyz, inst.deltaLow.xyz, camera.rteViewProj),\n isRte,\n );\n let bClip = select(\n camera.viewProj * vec4<f32>(inst.anchor + scaleProbeAxis, 1.0),\n rteClipPosition(scaleProbeAxis, inst.deltaHigh.xyz, inst.deltaLow.xyz, camera.rteViewProj),\n isRte,\n );\n let aNdc = aClip.xy / max(abs(aClip.w), 1e-4);\n let bNdc = bClip.xy / max(abs(bClip.w), 1e-4);\n let unitYPx = length(bNdc - aNdc) * camera.viewportAndTarget.y * 0.5;\n\n let safeCap = max(inst.capHeight, 1e-4);\n let currentPx = safeCap * unitYPx;\n // Per-instance target overrides the uniform default (used by grid bubble\n // glyphs to render at a larger on-screen size than the inscribed tag).\n let targetPx = select(camera.viewportAndTarget.z, inst.targetPxOverride, inst.targetPxOverride > 0.0);\n // Clamp to (0.02, 1.0]: never grow text beyond authored size; never\n // shrink below ~2%.\n let scale = clamp(\n targetPx / max(currentPx, 1e-2),\n 0.02,\n 1.0,\n );\n\n // \u2500\u2500 Position the glyph quad in world space \u2500\u2500\n // Non-billboard: authored axes (text lies in the floor plane of its\n // annotation \u2014 IFC convention). Billboard: camera-aligned axes (text\n // always faces the camera \u2014 grid-tag convention).\n // Anchored producers retain a small glyph-local origin; legacy producers\n // retain the original absolute origin and derive its local offset here.\n let authoredLocalOffset = select(inst.origin - inst.anchor, inst.origin, hasLocalOrigin);\n let authoredLocalPos =\n authoredLocalOffset * scale\n + inst.rightAxis * scale * u\n + inst.upAxis * scale * v;\n\n // Billboard: rebuild the quad in screen-aligned camera basis. glyphOffsetSize\n // carries the same 2D atlas-pixel layout the upload computed, just in\n // world units \u2014 re-project onto (cameraRight, cameraUp) so it tracks the\n // viewer's eye in every orientation.\n let bbOffsetX = inst.glyphOffsetSize.x;\n let bbOffsetY = inst.glyphOffsetSize.y;\n let bbWidth = inst.glyphOffsetSize.z;\n let bbHeight = inst.glyphOffsetSize.w;\n let billboardLocalPos =\n (camera.cameraRight.xyz * bbOffsetX + camera.cameraUp.xyz * bbOffsetY) * scale\n + (camera.cameraRight.xyz * bbWidth * u\n + camera.cameraUp.xyz * bbHeight * v) * scale;\n\n let glyphLocalPos = select(authoredLocalPos, billboardLocalPos, isBillboard);\n let worldPos = inst.anchor + glyphLocalPos;\n\n // UV: lerp atlas bounds. Note v inverted (atlas top is v=0).\n let uMix = mix(inst.uvBounds.x, inst.uvBounds.z, u);\n let vMix = mix(inst.uvBounds.w, inst.uvBounds.y, v);\n\n var out: VsOut;\n let clip = select(\n camera.viewProj * vec4<f32>(worldPos, 1.0),\n rteClipPosition(glyphLocalPos, inst.deltaHigh.xyz, inst.deltaLow.xyz, camera.rteViewProj),\n isRte,\n );\n // Reverse-Z decal nudge for text coplanar with model faces (issue #812\n // follow-up: \"30\", \"1.49\" etc. flickering against the terrain). The\n // pipeline-level depthBiasSlopeScale collapses to ~0 for billboard\n // glyphs \u2014 the quad faces the camera, so depth slope across the quad\n // is zero \u2014 leaving only a tiny -4 constant that MSAA jitter beats.\n // Adding a small positive multiple of clip.w raises NDC z by a\n // constant after the w-divide, which under reverse-Z reads as\n // \"slightly closer\" \u2014 same trick the line pipeline uses.\n out.clipPos = vec4<f32>(clip.x, clip.y, clip.z + 5e-5 * clip.w, clip.w);\n out.uv = vec2<f32>(uMix, vMix);\n out.color = inst.color;\n return out;\n}\n\n// Halo (#5388): labels sit over model geometry as often as over the empty\n// backdrop, so no single ink is legible on both. Every glyph gets a thin\n// contrasting outline: the glyph coverage dilated by HALO_TEXELS, drawn under\n// the glyph in black (light text) or white (dark text). The quad and its UVs\n// were widened by the same margin on upload, and the atlas packs glyphs far\n// enough apart that the taps never reach a neighbour.\nconst HALO_TEXELS: f32 = 6.0;\nconst HALO_OPACITY: f32 = 0.8;\nconst HALO_DIRS = array<vec2<f32>, 8>(\n vec2<f32>(1.0, 0.0), vec2<f32>(-1.0, 0.0), vec2<f32>(0.0, 1.0), vec2<f32>(0.0, -1.0),\n vec2<f32>(0.7071, 0.7071), vec2<f32>(-0.7071, 0.7071), vec2<f32>(0.7071, -0.7071), vec2<f32>(-0.7071, -0.7071),\n);\n\n@fragment\nfn fs_main(in: VsOut) -> @location(0) vec4<f32> {\n // The atlas was rasterised with white glyphs on a transparent background,\n // so atlas.a is the coverage.\n let coverage = textureSample(atlasTex, atlasSamp, in.uv).a;\n let texel = 1.0 / vec2<f32>(textureDimensions(atlasTex));\n var dilated = coverage;\n // Two rings (full and half radius) so thin strokes and counters fill in.\n for (var i = 0u; i < 8u; i = i + 1u) {\n let d = HALO_DIRS[i] * texel * HALO_TEXELS;\n dilated = max(dilated, textureSample(atlasTex, atlasSamp, in.uv + d).a);\n dilated = max(dilated, textureSample(atlasTex, atlasSamp, in.uv + d * 0.5).a);\n }\n let luminance = dot(in.color.rgb, vec3<f32>(0.2126, 0.7152, 0.0722));\n let haloRgb = select(vec3<f32>(1.0), vec3<f32>(0.0), luminance > 0.5);\n // Glyph over halo, premultiplied for the standard composite.\n let glyphA = coverage * in.color.a;\n let haloA = dilated * HALO_OPACITY * in.color.a * (1.0 - glyphA);\n return vec4<f32>(in.color.rgb * glyphA + haloRgb * haloA, glyphA + haloA);\n}\n";
10
3
  //# sourceMappingURL=symbolic-overlay.wgsl.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"symbolic-overlay.wgsl.d.ts","sourceRoot":"","sources":["../../src/shaders/symbolic-overlay.wgsl.ts"],"names":[],"mappings":"AAIA;;;;;;GAMG;AAEH,eAAO,MAAM,kBAAkB,+uBA+B9B,CAAC;AAEF,eAAO,MAAM,kBAAkB,mwOA6J9B,CAAC"}
1
+ {"version":3,"file":"symbolic-overlay.wgsl.d.ts","sourceRoot":"","sources":["../../src/shaders/symbolic-overlay.wgsl.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,kBAAkB,0/BAoC9B,CAAC;AAEF,eAAO,MAAM,kBAAkB,yrVA8N9B,CAAC"}
@@ -8,9 +8,13 @@
8
8
  * layout and write into the same RGBA-blended pass. Splitting per-pipeline
9
9
  * would mean two near-identical vertex inputs and duplicate camera structs.
10
10
  */
11
+ import { GLYPH_HALO_PX } from '../symbolic-text-atlas.js';
11
12
  export const SYMBOLIC_FILL_WGSL = /* wgsl */ `
12
13
  struct Camera {
13
14
  viewProj: mat4x4<f32>,
15
+ rteViewProj: mat4x4<f32>,
16
+ originHigh: vec4<f32>,
17
+ originLow: vec4<f32>,
14
18
  };
15
19
 
16
20
  @group(0) @binding(0) var<uniform> camera: Camera;
@@ -28,7 +32,9 @@ struct VsOut {
28
32
  @vertex
29
33
  fn vs_main(in: VsIn) -> VsOut {
30
34
  var out: VsOut;
31
- out.clipPos = camera.viewProj * vec4<f32>(in.position, 1.0);
35
+ let global = camera.viewProj * vec4<f32>(in.position, 1.0);
36
+ let relative = (in.position + camera.originHigh.xyz) + camera.originLow.xyz;
37
+ out.clipPos = select(global, camera.rteViewProj * vec4<f32>(relative, 1.0), camera.originHigh.w == 1.0);
32
38
  out.color = in.color;
33
39
  return out;
34
40
  }
@@ -43,6 +49,9 @@ fn fs_main(in: VsOut) -> @location(0) vec4<f32> {
43
49
  export const SYMBOLIC_TEXT_WGSL = /* wgsl */ `
44
50
  struct Camera {
45
51
  viewProj: mat4x4<f32>,
52
+ // Legacy labels keep using viewProj. Anchored labels select this
53
+ // translation-free eye-relative matrix per instance.
54
+ rteViewProj: mat4x4<f32>,
46
55
  // x = viewport width in physical pixels, y = viewport height
47
56
  // z = target glyph cap-height in screen pixels, w = padding
48
57
  viewportAndTarget: vec4<f32>,
@@ -52,6 +61,11 @@ struct Camera {
52
61
  // zero screen extent and the tag becomes invisible.
53
62
  cameraRight: vec4<f32>,
54
63
  cameraUp: vec4<f32>,
64
+ // Retained for the 208-byte symbolic-text uniform ABI. RTE text now packs
65
+ // its drawable-minus-camera delta on the CPU rather than subtracting these
66
+ // independently rounded absolute values in WGSL.
67
+ cameraHigh: vec4<f32>,
68
+ cameraLow: vec4<f32>,
55
69
  };
56
70
 
57
71
  @group(0) @binding(0) var<uniform> camera: Camera;
@@ -99,6 +113,11 @@ struct InstIn {
99
113
  // glyphs override with a larger value so the bubble stays proportional
100
114
  // to the tag at every zoom level.
101
115
  @location(10) targetPxOverride: f32,
116
+ // CPU-packed drawable-minus-camera delta. deltaHigh.w == 1 selects the
117
+ // RTE route; deltaLow.w marks an anchor-local static glyph origin for the
118
+ // legacy projection path too.
119
+ @location(11) deltaHigh: vec4<f32>,
120
+ @location(12) deltaLow: vec4<f32>,
102
121
  };
103
122
 
104
123
  struct VsOut {
@@ -107,6 +126,17 @@ struct VsOut {
107
126
  @location(1) color: vec4<f32>,
108
127
  };
109
128
 
129
+ fn rteClipPosition(
130
+ local: vec3<f32>, high: vec3<f32>, low: vec3<f32>, viewProj: mat4x4<f32>,
131
+ ) -> vec4<f32> {
132
+ // Do not first reconstruct a million-metre f32 position: that addition can
133
+ // discard centimetre local lanes before projection. Transform high and the
134
+ // combined local/low term independently, then combine in clip space where projection has
135
+ // reduced or cancelled the coordinate scale. A final raw f32 eye vector
136
+ // still cannot represent a sub-ULP residual at the ±1,000,000 m boundary.
137
+ return viewProj * vec4<f32>(high, 1.0) + viewProj * vec4<f32>(local + low, 0.0);
138
+ }
139
+
110
140
  @vertex
111
141
  fn vs_main(in: VsIn, inst: InstIn) -> VsOut {
112
142
  // Map corner index to (u, v) in [0, 1] — the four quad corners.
@@ -121,9 +151,21 @@ fn vs_main(in: VsIn, inst: InstIn) -> VsOut {
121
151
  // regardless of view angle, so screen-space scaling stays correct in
122
152
  // top-down / ground / oblique views.
123
153
  let isBillboard = inst.billboard > 0.5;
154
+ let isRte = inst.deltaHigh.w == 1.0;
155
+ let hasLocalOrigin = inst.deltaLow.w == 1.0;
156
+ // The f64 CPU path has already formed the drawable-camera delta. Project
157
+ // split terms independently so projection can retain low residuals.
124
158
  let scaleProbeAxis = select(vec3<f32>(0.0, 1.0, 0.0), camera.cameraUp.xyz, isBillboard);
125
- let aClip = camera.viewProj * vec4<f32>(inst.anchor, 1.0);
126
- let bClip = camera.viewProj * vec4<f32>(inst.anchor + scaleProbeAxis, 1.0);
159
+ let aClip = select(
160
+ camera.viewProj * vec4<f32>(inst.anchor, 1.0),
161
+ rteClipPosition(vec3<f32>(0.0), inst.deltaHigh.xyz, inst.deltaLow.xyz, camera.rteViewProj),
162
+ isRte,
163
+ );
164
+ let bClip = select(
165
+ camera.viewProj * vec4<f32>(inst.anchor + scaleProbeAxis, 1.0),
166
+ rteClipPosition(scaleProbeAxis, inst.deltaHigh.xyz, inst.deltaLow.xyz, camera.rteViewProj),
167
+ isRte,
168
+ );
127
169
  let aNdc = aClip.xy / max(abs(aClip.w), 1e-4);
128
170
  let bNdc = bClip.xy / max(abs(bClip.w), 1e-4);
129
171
  let unitYPx = length(bNdc - aNdc) * camera.viewportAndTarget.y * 0.5;
@@ -145,10 +187,11 @@ fn vs_main(in: VsIn, inst: InstIn) -> VsOut {
145
187
  // Non-billboard: authored axes (text lies in the floor plane of its
146
188
  // annotation — IFC convention). Billboard: camera-aligned axes (text
147
189
  // always faces the camera — grid-tag convention).
148
- let authoredLocalOffset = inst.origin - inst.anchor;
149
- let authoredWorldPos =
150
- inst.anchor
151
- + authoredLocalOffset * scale
190
+ // Anchored producers retain a small glyph-local origin; legacy producers
191
+ // retain the original absolute origin and derive its local offset here.
192
+ let authoredLocalOffset = select(inst.origin - inst.anchor, inst.origin, hasLocalOrigin);
193
+ let authoredLocalPos =
194
+ authoredLocalOffset * scale
152
195
  + inst.rightAxis * scale * u
153
196
  + inst.upAxis * scale * v;
154
197
 
@@ -160,20 +203,24 @@ fn vs_main(in: VsIn, inst: InstIn) -> VsOut {
160
203
  let bbOffsetY = inst.glyphOffsetSize.y;
161
204
  let bbWidth = inst.glyphOffsetSize.z;
162
205
  let bbHeight = inst.glyphOffsetSize.w;
163
- let billboardWorldPos =
164
- inst.anchor
165
- + (camera.cameraRight.xyz * bbOffsetX + camera.cameraUp.xyz * bbOffsetY) * scale
206
+ let billboardLocalPos =
207
+ (camera.cameraRight.xyz * bbOffsetX + camera.cameraUp.xyz * bbOffsetY) * scale
166
208
  + (camera.cameraRight.xyz * bbWidth * u
167
209
  + camera.cameraUp.xyz * bbHeight * v) * scale;
168
210
 
169
- let worldPos = select(authoredWorldPos, billboardWorldPos, isBillboard);
211
+ let glyphLocalPos = select(authoredLocalPos, billboardLocalPos, isBillboard);
212
+ let worldPos = inst.anchor + glyphLocalPos;
170
213
 
171
214
  // UV: lerp atlas bounds. Note v inverted (atlas top is v=0).
172
215
  let uMix = mix(inst.uvBounds.x, inst.uvBounds.z, u);
173
216
  let vMix = mix(inst.uvBounds.w, inst.uvBounds.y, v);
174
217
 
175
218
  var out: VsOut;
176
- let clip = camera.viewProj * vec4<f32>(worldPos, 1.0);
219
+ let clip = select(
220
+ camera.viewProj * vec4<f32>(worldPos, 1.0),
221
+ rteClipPosition(glyphLocalPos, inst.deltaHigh.xyz, inst.deltaLow.xyz, camera.rteViewProj),
222
+ isRte,
223
+ );
177
224
  // Reverse-Z decal nudge for text coplanar with model faces (issue #812
178
225
  // follow-up: "30", "1.49" etc. flickering against the terrain). The
179
226
  // pipeline-level depthBiasSlopeScale collapses to ~0 for billboard
@@ -188,14 +235,38 @@ fn vs_main(in: VsIn, inst: InstIn) -> VsOut {
188
235
  return out;
189
236
  }
190
237
 
238
+ // Halo (#5388): labels sit over model geometry as often as over the empty
239
+ // backdrop, so no single ink is legible on both. Every glyph gets a thin
240
+ // contrasting outline: the glyph coverage dilated by HALO_TEXELS, drawn under
241
+ // the glyph in black (light text) or white (dark text). The quad and its UVs
242
+ // were widened by the same margin on upload, and the atlas packs glyphs far
243
+ // enough apart that the taps never reach a neighbour.
244
+ const HALO_TEXELS: f32 = ${GLYPH_HALO_PX}.0;
245
+ const HALO_OPACITY: f32 = 0.8;
246
+ const HALO_DIRS = array<vec2<f32>, 8>(
247
+ vec2<f32>(1.0, 0.0), vec2<f32>(-1.0, 0.0), vec2<f32>(0.0, 1.0), vec2<f32>(0.0, -1.0),
248
+ vec2<f32>(0.7071, 0.7071), vec2<f32>(-0.7071, 0.7071), vec2<f32>(0.7071, -0.7071), vec2<f32>(-0.7071, -0.7071),
249
+ );
250
+
191
251
  @fragment
192
252
  fn fs_main(in: VsOut) -> @location(0) vec4<f32> {
193
- let atlas = textureSample(atlasTex, atlasSamp, in.uv);
194
253
  // The atlas was rasterised with white glyphs on a transparent background,
195
- // so atlas.r is the coverage and atlas.a is the alpha. Multiply by the
196
- // per-glyph tint and premultiply for the standard composite.
197
- let alpha = atlas.a * in.color.a;
198
- return vec4<f32>(in.color.rgb * alpha, alpha);
254
+ // so atlas.a is the coverage.
255
+ let coverage = textureSample(atlasTex, atlasSamp, in.uv).a;
256
+ let texel = 1.0 / vec2<f32>(textureDimensions(atlasTex));
257
+ var dilated = coverage;
258
+ // Two rings (full and half radius) so thin strokes and counters fill in.
259
+ for (var i = 0u; i < 8u; i = i + 1u) {
260
+ let d = HALO_DIRS[i] * texel * HALO_TEXELS;
261
+ dilated = max(dilated, textureSample(atlasTex, atlasSamp, in.uv + d).a);
262
+ dilated = max(dilated, textureSample(atlasTex, atlasSamp, in.uv + d * 0.5).a);
263
+ }
264
+ let luminance = dot(in.color.rgb, vec3<f32>(0.2126, 0.7152, 0.0722));
265
+ let haloRgb = select(vec3<f32>(1.0), vec3<f32>(0.0), luminance > 0.5);
266
+ // Glyph over halo, premultiplied for the standard composite.
267
+ let glyphA = coverage * in.color.a;
268
+ let haloA = dilated * HALO_OPACITY * in.color.a * (1.0 - glyphA);
269
+ return vec4<f32>(in.color.rgb * glyphA + haloRgb * haloA, glyphA + haloA);
199
270
  }
200
271
  `;
201
272
  //# sourceMappingURL=symbolic-overlay.wgsl.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"symbolic-overlay.wgsl.js","sourceRoot":"","sources":["../../src/shaders/symbolic-overlay.wgsl.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;;;GAMG;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+B5C,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6J5C,CAAC"}
1
+ {"version":3,"file":"symbolic-overlay.wgsl.js","sourceRoot":"","sources":["../../src/shaders/symbolic-overlay.wgsl.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;;;GAMG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE1D,MAAM,CAAC,MAAM,kBAAkB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoC5C,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAmMlB,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BvC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"textured.wgsl.d.ts","sourceRoot":"","sources":["../../src/shaders/textured.wgsl.ts"],"names":[],"mappings":"AAuGA,eAAO,MAAM,oBAAoB,QAAyB,CAAC"}
1
+ {"version":3,"file":"textured.wgsl.d.ts","sourceRoot":"","sources":["../../src/shaders/textured.wgsl.ts"],"names":[],"mappings":"AAyGA,eAAO,MAAM,oBAAoB,QAAyB,CAAC"}
@@ -36,17 +36,19 @@ function deriveTexturedShader() {
36
36
  s = replaceOnce(s, '@binding(0) @group(0) var<uniform> uniforms: Uniforms;', '@binding(0) @group(0) var<uniform> uniforms: Uniforms;\n' +
37
37
  ' @binding(1) @group(0) var albedoTex: texture_2d<f32>;\n' +
38
38
  ' @binding(2) @group(0) var albedoSampler: sampler;', 'uniform binding');
39
- // 2. UV vertex attribute on VertexInput. Placed at @location(10), NOT 3-9:
39
+ // 2. UV vertex attribute on VertexInput. Placed at @location(12), NOT 3-11:
40
40
  // main.wgsl also declares vs_instanced + InstanceInput at vertex-input
41
- // @location 3..9 (mat4 3-6, entityId 7, colour 8, selected flag 9), which
41
+ // @location 3..11 (mat4 3-6, entityId 7, colour 8, selected flag 9,
42
+ // RTE anchor high/low 10-11), which
42
43
  // this derived module still contains (unused by the textured pipeline). A uv
43
- // in 3..9 would collide with InstanceInput in vs_instanced's input interface
44
- // = a shader-creation error. @10 is clear of both the per-vertex inputs
45
- // (0..2) and the per-instance inputs (3..9). The textured pipeline's slot-0
46
- // uv attribute uses shaderLocation 10 to match.
47
- s = replaceOnce(s, ' @location(2) entityId: u32,\n }\n\n struct VertexOutput {', ' @location(2) entityId: u32,\n @location(10) uv: vec2<f32>,\n }\n\n struct VertexOutput {', 'VertexInput uv');
48
- // 3. UV interpolant on VertexOutput (after the @location(5) instSelected varying).
49
- s = replaceOnce(s, ' @location(5) @interpolate(flat) instSelected: u32,\n }', ' @location(5) @interpolate(flat) instSelected: u32,\n @location(6) uv: vec2<f32>,\n }', 'VertexOutput uv');
44
+ // in 3..11 would collide with InstanceInput in vs_instanced's input interface
45
+ // = a shader-creation error. @12 is clear of both the per-vertex inputs
46
+ // (0..2) and the per-instance inputs (3..11). The textured pipeline's slot-0
47
+ // uv attribute uses shaderLocation 12 to match.
48
+ s = replaceOnce(s, ' @location(2) entityId: u32,\n }\n\n struct VertexOutput {', ' @location(2) entityId: u32,\n @location(12) uv: vec2<f32>,\n }\n\n struct VertexOutput {', 'VertexInput uv');
49
+ // 3. UV interpolant on VertexOutput. Location 6 is the main shader's
50
+ // camera-relative fragment position (#5049), so texture UVs stay at 7.
51
+ s = replaceOnce(s, ' @location(6) eyePos: vec3<f32>,\n }', ' @location(6) eyePos: vec3<f32>,\n @location(7) uv: vec2<f32>,\n }', 'VertexOutput uv');
50
52
  // 4. Pass UV through the vertex shader.
51
53
  s = replaceOnce(s, ' output.entityId = input.entityId;', ' output.entityId = input.entityId;\n output.uv = input.uv;', 'vs_main uv passthrough');
52
54
  // 5. Sample the texture; multiply by the authored tint (white = passthrough).
@@ -1 +1 @@
1
- {"version":3,"file":"textured.wgsl.js","sourceRoot":"","sources":["../../src/shaders/textured.wgsl.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,SAAS,WAAW,CAAC,GAAW,EAAE,IAAY,EAAE,IAAY,EAAE,KAAa;IACzE,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,0BAA0B,KAAK,4EAA4E,CAC5G,CAAC;IACJ,CAAC;IACD,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,2CAA2C,CAAC,CAAC;IAC9F,CAAC;IACD,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,oBAAoB;IAC3B,IAAI,CAAC,GAAG,gBAAgB,CAAC;IAEzB,uEAAuE;IACvE,CAAC,GAAG,WAAW,CACb,CAAC,EACD,wDAAwD,EACxD,0DAA0D;QACxD,iEAAiE;QACjE,2DAA2D,EAC7D,iBAAiB,CAClB,CAAC;IAEF,2EAA2E;IAC3E,0EAA0E;IAC1E,6EAA6E;IAC7E,gFAAgF;IAChF,gFAAgF;IAChF,2EAA2E;IAC3E,+EAA+E;IAC/E,mDAAmD;IACnD,CAAC,GAAG,WAAW,CACb,CAAC,EACD,mFAAmF,EACnF,2HAA2H,EAC3H,gBAAgB,CACjB,CAAC;IAEF,mFAAmF;IACnF,CAAC,GAAG,WAAW,CACb,CAAC,EACD,yEAAyE,EACzE,gHAAgH,EAChH,iBAAiB,CAClB,CAAC;IAEF,wCAAwC;IACxC,CAAC,GAAG,WAAW,CACb,CAAC,EACD,6CAA6C,EAC7C,8EAA8E,EAC9E,wBAAwB,CACzB,CAAC;IAEF,8EAA8E;IAC9E,6EAA6E;IAC7E,+EAA+E;IAC/E,yEAAyE;IACzE,2EAA2E;IAC3E,mDAAmD;IACnD,yEAAyE;IACzE,+EAA+E;IAC/E,6EAA6E;IAC7E,8DAA8D;IAC9D,CAAC,GAAG,WAAW,CACb,CAAC,EACD,kCAAkC,EAClC,wEAAwE;QACtE,qDAAqD;QACrD,8DAA8D,EAChE,eAAe,CAChB,CAAC;IAEF,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG,oBAAoB,EAAE,CAAC"}
1
+ {"version":3,"file":"textured.wgsl.js","sourceRoot":"","sources":["../../src/shaders/textured.wgsl.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,SAAS,WAAW,CAAC,GAAW,EAAE,IAAY,EAAE,IAAY,EAAE,KAAa;IACzE,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,0BAA0B,KAAK,4EAA4E,CAC5G,CAAC;IACJ,CAAC;IACD,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,2CAA2C,CAAC,CAAC;IAC9F,CAAC;IACD,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,oBAAoB;IAC3B,IAAI,CAAC,GAAG,gBAAgB,CAAC;IAEzB,uEAAuE;IACvE,CAAC,GAAG,WAAW,CACb,CAAC,EACD,wDAAwD,EACxD,0DAA0D;QACxD,iEAAiE;QACjE,2DAA2D,EAC7D,iBAAiB,CAClB,CAAC;IAEF,4EAA4E;IAC5E,0EAA0E;IAC1E,uEAAuE;IACvE,uCAAuC;IACvC,gFAAgF;IAChF,iFAAiF;IACjF,2EAA2E;IAC3E,gFAAgF;IAChF,mDAAmD;IACnD,CAAC,GAAG,WAAW,CACb,CAAC,EACD,mFAAmF,EACnF,2HAA2H,EAC3H,gBAAgB,CACjB,CAAC;IAEF,qEAAqE;IACrE,uEAAuE;IACvE,CAAC,GAAG,WAAW,CACb,CAAC,EACD,sDAAsD,EACtD,6FAA6F,EAC7F,iBAAiB,CAClB,CAAC;IAEF,wCAAwC;IACxC,CAAC,GAAG,WAAW,CACb,CAAC,EACD,6CAA6C,EAC7C,8EAA8E,EAC9E,wBAAwB,CACzB,CAAC;IAEF,8EAA8E;IAC9E,6EAA6E;IAC7E,+EAA+E;IAC/E,yEAAyE;IACzE,2EAA2E;IAC3E,mDAAmD;IACnD,yEAAyE;IACzE,+EAA+E;IAC/E,6EAA6E;IAC7E,8DAA8D;IAC9D,CAAC,GAAG,WAAW,CACb,CAAC,EACD,kCAAkC,EAClC,wEAAwE;QACtE,qDAAqD;QACrD,8DAA8D,EAChE,eAAe,CAChB,CAAC;IAEF,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG,oBAAoB,EAAE,CAAC"}
@@ -60,6 +60,13 @@ export interface SunLightFit {
60
60
  /** Near→far depth span along the sun axis, world units. */
61
61
  depthRange: number;
62
62
  }
63
+ /** A coarse site-wide map must not lift receivers beyond local BIM geometry. */
64
+ export declare const MAX_SHADOW_NORMAL_BIAS_METRES = 0.25;
65
+ /**
66
+ * Scales normal bias with the shadow-map texel at ordinary resolutions while
67
+ * bounding the coarse whole-site fallback in real-world metres.
68
+ */
69
+ export declare function resolveShadowNormalBiasMetres(texelWorld: number, pcfRadius: number): number;
63
70
  /**
64
71
  * Fit the sun's orthographic shadow frustum. Pure; see the file header for the
65
72
  * fitting policy. The returned matrix maps world space straight to the shadow
@@ -1 +1 @@
1
- {"version":3,"file":"shadow-light-matrix.d.ts","sourceRoot":"","sources":["../src/shadow-light-matrix.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAG7C,MAAM,WAAW,iBAAiB;IAChC;;;;OAIG;IACH,YAAY,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAChD,yCAAyC;IACzC,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,yCAAyC;IACzC,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C;;;;OAIG;IACH,YAAY,CAAC,EAAE,SAAS,IAAI,EAAE,CAAC;IAC/B;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,2EAA2E;IAC3E,aAAa,EAAE,IAAI,CAAC;IACpB,+DAA+D;IAC/D,SAAS,EAAE,IAAI,CAAC;IAChB,8DAA8D;IAC9D,cAAc,EAAE,MAAM,CAAC;IACvB,+DAA+D;IAC/D,eAAe,EAAE,MAAM,CAAC;IACxB,2DAA2D;IAC3D,UAAU,EAAE,MAAM,CAAC;CACpB;AAwCD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,WAAW,CA0FxE;AAED,MAAM,WAAW,mBAAmB;IAClC,0BAA0B;IAC1B,GAAG,EAAE,IAAI,CAAC;IACV,0CAA0C;IAC1C,OAAO,EAAE,IAAI,CAAC;IACd,yBAAyB;IACzB,KAAK,EAAE,IAAI,CAAC;IACZ,sBAAsB;IACtB,EAAE,EAAE,IAAI,CAAC;IACT,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,yEAAyE;IACzE,KAAK,EAAE,OAAO,CAAC;IACf,sEAAsE;IACtE,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,2EAA2E;IAC3E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,yBAAyB,CAAC,CAAC,EAAE,mBAAmB,GAAG,IAAI,EAAE,GAAG,IAAI,CAoC/E"}
1
+ {"version":3,"file":"shadow-light-matrix.d.ts","sourceRoot":"","sources":["../src/shadow-light-matrix.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAG7C,MAAM,WAAW,iBAAiB;IAChC;;;;OAIG;IACH,YAAY,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAChD,yCAAyC;IACzC,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,yCAAyC;IACzC,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C;;;;OAIG;IACH,YAAY,CAAC,EAAE,SAAS,IAAI,EAAE,CAAC;IAC/B;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,2EAA2E;IAC3E,aAAa,EAAE,IAAI,CAAC;IACpB,+DAA+D;IAC/D,SAAS,EAAE,IAAI,CAAC;IAChB,8DAA8D;IAC9D,cAAc,EAAE,MAAM,CAAC;IACvB,+DAA+D;IAC/D,eAAe,EAAE,MAAM,CAAC;IACxB,2DAA2D;IAC3D,UAAU,EAAE,MAAM,CAAC;CACpB;AAID,gFAAgF;AAChF,eAAO,MAAM,6BAA6B,OAAO,CAAC;AAElD;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAG3F;AAsCD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,WAAW,CA0FxE;AAED,MAAM,WAAW,mBAAmB;IAClC,0BAA0B;IAC1B,GAAG,EAAE,IAAI,CAAC;IACV,0CAA0C;IAC1C,OAAO,EAAE,IAAI,CAAC;IACd,yBAAyB;IACzB,KAAK,EAAE,IAAI,CAAC;IACZ,sBAAsB;IACtB,EAAE,EAAE,IAAI,CAAC;IACT,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,yEAAyE;IACzE,KAAK,EAAE,OAAO,CAAC;IACf,sEAAsE;IACtE,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,2EAA2E;IAC3E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,yBAAyB,CAAC,CAAC,EAAE,mBAAmB,GAAG,IAAI,EAAE,GAAG,IAAI,CAoC/E"}
@@ -3,6 +3,17 @@
3
3
  * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
4
  import { MathUtils } from './math.js';
5
5
  const DEFAULT_SUN = { x: 0, y: 1, z: 0 };
6
+ /** A coarse site-wide map must not lift receivers beyond local BIM geometry. */
7
+ export const MAX_SHADOW_NORMAL_BIAS_METRES = 0.25;
8
+ /**
9
+ * Scales normal bias with the shadow-map texel at ordinary resolutions while
10
+ * bounding the coarse whole-site fallback in real-world metres.
11
+ */
12
+ export function resolveShadowNormalBiasMetres(texelWorld, pcfRadius) {
13
+ if (!Number.isFinite(texelWorld) || !Number.isFinite(pcfRadius))
14
+ return 0;
15
+ return Math.min(Math.max(texelWorld, 0) * (2 + Math.max(pcfRadius, 0)), MAX_SHADOW_NORMAL_BIAS_METRES);
16
+ }
6
17
  /** Unit sun direction, falling back to straight down-up for unusable input. */
7
18
  function resolveSun(dir) {
8
19
  const x = dir[0], y = dir[1], z = dir[2];
@@ -1 +1 @@
1
- {"version":3,"file":"shadow-light-matrix.js","sourceRoot":"","sources":["../src/shadow-light-matrix.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shadow-light-matrix.js","sourceRoot":"","sources":["../src/shadow-light-matrix.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { RenderPipeline } from './pipeline.js';
2
+ import type { BatchedMesh, RenderOptions } from './types.js';
3
+ export interface ShadowBatchScene {
4
+ getBatchedMeshes(): BatchedMesh[];
5
+ requestBatchResidency(batch: BatchedMesh): void;
6
+ recordBatchDrawn(batch: BatchedMesh): void;
7
+ getOrCreatePartialBatch(key: string, colorKey: string, ids: Set<number>, device: GPUDevice, pipeline: RenderPipeline, epoch: number): BatchedMesh | null | undefined;
8
+ }
9
+ export declare function shadowOccluderBatches(scene: ShadowBatchScene, options: RenderOptions, device: GPUDevice, filtered: boolean, pipeline: RenderPipeline | null, epoch: number): BatchedMesh[];
10
+ //# sourceMappingURL=shadow-occluder-batches.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shadow-occluder-batches.d.ts","sourceRoot":"","sources":["../src/shadow-occluder-batches.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEpD,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE7D,MAAM,WAAW,gBAAgB;IAC/B,gBAAgB,IAAI,WAAW,EAAE,CAAC;IAClC,qBAAqB,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;IAChD,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3C,uBAAuB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,GAAG,SAAS,CAAC;CACtK;AAKD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW,EAAE,CAc1L"}
@@ -0,0 +1,39 @@
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 { classifyBatchVisibility, DEFAULT_MIN_CAST_ALPHA } from './shadow-occluders.js';
5
+ function noteResidency(scene, batch) {
6
+ if (batch.color[3] < DEFAULT_MIN_CAST_ALPHA)
7
+ return;
8
+ if (batch.gpuResident === false)
9
+ scene.requestBatchResidency(batch);
10
+ else
11
+ scene.recordBatchDrawn(batch);
12
+ }
13
+ export function shadowOccluderBatches(scene, options, device, filtered, pipeline, epoch) {
14
+ const all = scene.getBatchedMeshes();
15
+ if (!filtered) {
16
+ for (const batch of all)
17
+ noteResidency(scene, batch);
18
+ return all;
19
+ }
20
+ const result = [];
21
+ for (const batch of all) {
22
+ const visible = classifyBatchVisibility(batch.expressIds, options.hiddenIds, options.isolatedIds);
23
+ if (visible.kind === 'none')
24
+ continue;
25
+ if (visible.kind === 'all') {
26
+ noteResidency(scene, batch);
27
+ result.push(batch);
28
+ continue;
29
+ }
30
+ if (batch.color[3] < DEFAULT_MIN_CAST_ALPHA || !pipeline)
31
+ continue;
32
+ noteResidency(scene, batch);
33
+ const subset = scene.getOrCreatePartialBatch(`${batch.colorKey}:${batch.id}`, batch.colorKey, visible.visibleIds, device, pipeline, epoch);
34
+ if (subset && subset.indexCount > 0)
35
+ result.push(subset);
36
+ }
37
+ return result;
38
+ }
39
+ //# sourceMappingURL=shadow-occluder-batches.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shadow-occluder-batches.js","sourceRoot":"","sources":["../src/shadow-occluder-batches.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAG/D,OAAO,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AASxF,SAAS,aAAa,CAAC,KAAuB,EAAE,KAAkB;IAChE,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,sBAAsB;QAAE,OAAO;IACpD,IAAI,KAAK,CAAC,WAAW,KAAK,KAAK;QAAE,KAAK,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;;QAAM,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;AAC1G,CAAC;AACD,MAAM,UAAU,qBAAqB,CAAC,KAAuB,EAAE,OAAsB,EAAE,MAAiB,EAAE,QAAiB,EAAE,QAA+B,EAAE,KAAa;IACzK,MAAM,GAAG,GAAG,KAAK,CAAC,gBAAgB,EAAE,CAAC;IACrC,IAAI,CAAC,QAAQ,EAAE,CAAC;QAAC,KAAK,MAAM,KAAK,IAAI,GAAG;YAAE,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAAC,OAAO,GAAG,CAAC;IAAC,CAAC;IACpF,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,KAAK,MAAM,KAAK,IAAI,GAAG,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,uBAAuB,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;QAClG,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM;YAAE,SAAS;QACtC,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YAAC,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QAC1F,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,sBAAsB,IAAI,CAAC,QAAQ;YAAE,SAAS;QACnE,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC5B,MAAM,MAAM,GAAG,KAAK,CAAC,uBAAuB,CAAC,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC3I,IAAI,MAAM,IAAI,MAAM,CAAC,UAAU,GAAG,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"shadow-occluders.d.ts","sourceRoot":"","sources":["../src/shadow-occluders.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACrE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAG3D,qEAAqE;AACrE,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,SAAS,WAAW,EAAE,CAAC;IAChC,SAAS,EAAE,SAAS,oBAAoB,EAAE,CAAC;IAC3C,QAAQ,EAAE,SAAS,YAAY,EAAE,CAAC;IAClC;;;;;OAKG;IACH,MAAM,CAAC,EAAE,SAAS,IAAI,EAAE,CAAC;CAC1B;AAED,oDAAoD;AACpD,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAChC,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACnC;AAED,iDAAiD;AACjD,MAAM,WAAW,qBAAqB;IACpC;;;;;;;;;OASG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAE1C;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EACrD,GAAG,GAAE,YAAmC,GACvC,YAAY,CASd;AAsBD;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,oBAAoB,GAC5B;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,GACf;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAAE,CAAC;AAEjD,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,SAAS,MAAM,EAAE,EAC7B,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,SAAS,EACjD,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,SAAS,GAClD,oBAAoB,CAYtB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,qBAAqB,EAC9B,UAAU,CAAC,EAAE,gBAAgB,EAC7B,OAAO,CAAC,EAAE,qBAAqB,GAC9B,kBAAkB,EAAE,CAgEtB"}
1
+ {"version":3,"file":"shadow-occluders.d.ts","sourceRoot":"","sources":["../src/shadow-occluders.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACrE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAG3D,qEAAqE;AACrE,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,SAAS,WAAW,EAAE,CAAC;IAChC,SAAS,EAAE,SAAS,oBAAoB,EAAE,CAAC;IAC3C,QAAQ,EAAE,SAAS,YAAY,EAAE,CAAC;IAClC;;;;;OAKG;IACH,MAAM,CAAC,EAAE,SAAS,IAAI,EAAE,CAAC;CAC1B;AAED,oDAAoD;AACpD,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAChC,WAAW,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACnC;AAED,iDAAiD;AACjD,MAAM,WAAW,qBAAqB;IACpC;;;;;;;;;OASG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,MAAM,CAAC;AAE1C;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,EACrD,GAAG,GAAE,YAAmC,GACvC,YAAY,CASd;AAsBD;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,oBAAoB,GAC5B;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,GACf;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAAE,CAAC;AAEjD,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,SAAS,MAAM,EAAE,EAC7B,SAAS,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,SAAS,EACjD,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,SAAS,GAClD,oBAAoB,CAYtB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,qBAAqB,EAC9B,UAAU,CAAC,EAAE,gBAAgB,EAC7B,OAAO,CAAC,EAAE,qBAAqB,GAC9B,kBAAkB,EAAE,CAoEtB"}
@@ -104,6 +104,7 @@ export function collectShadowOccluders(sources, visibility, options) {
104
104
  indexBuffer: batch.indexBuffer,
105
105
  indexCount: batch.indexCount,
106
106
  model: originModelMatrix(batch.origin),
107
+ origin: batch.origin,
107
108
  quantParams: q ? [q.min[0], q.min[1], q.min[2], q.step] : undefined,
108
109
  });
109
110
  }
@@ -117,6 +118,7 @@ export function collectShadowOccluders(sources, visibility, options) {
117
118
  indexCount: it.indexCount,
118
119
  instanceBuffer: it.instanceBuffer,
119
120
  instanceCount: it.instanceCount,
121
+ canonicalAnchors: it.canonicalAnchors,
120
122
  });
121
123
  }
122
124
  for (const tm of sources.textured) {
@@ -132,6 +134,7 @@ export function collectShadowOccluders(sources, visibility, options) {
132
134
  indexBuffer: tm.indexBuffer,
133
135
  indexCount: tm.indexCount,
134
136
  model: originModelMatrix(tm.origin),
137
+ origin: tm.origin,
135
138
  });
136
139
  }
137
140
  // Individual meshes (Renderer.addMesh() / no-batch fallback). Same 28-byte
@@ -153,6 +156,7 @@ export function collectShadowOccluders(sources, visibility, options) {
153
156
  indexBuffer: mesh.indexBuffer,
154
157
  indexCount: mesh.indexCount,
155
158
  model: mesh.transform.m,
159
+ origin: mesh.rteOrigin ?? [mesh.transform.m[12], mesh.transform.m[13], mesh.transform.m[14]],
156
160
  });
157
161
  }
158
162
  return draws;
@@ -1 +1 @@
1
- {"version":3,"file":"shadow-occluders.js","sourceRoot":"","sources":["../src/shadow-occluders.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shadow-occluders.js","sourceRoot":"","sources":["../src/shadow-occluders.ts"],"names":[],"mappings":"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"}
@@ -18,56 +18,9 @@
18
18
  * holes in the shadow.
19
19
  */
20
20
  import type { Mat4 } from './types.js';
21
- /** Which geometry path an occluder draw came from — selects the pipeline. */
22
- export type ShadowDrawKind = 'flat' | 'quantized' | 'instanced' | 'textured';
23
- /**
24
- * Resolve the shadow-map side length to actually allocate.
25
- *
26
- * `requested === 0` (or a non-positive / non-finite value) means **Auto**: pick
27
- * a sensible size from the device's 2D texture limit — a laptop iGPU capped at
28
- * 4096 gets a 2048 map, a discrete GPU (8192+) gets 4096 (#2670 review). A
29
- * manual request is honoured but never allowed to exceed the device limit,
30
- * since `createTexture` would otherwise fail outright on a smaller device.
31
- */
32
- export declare function resolveShadowMapResolution(requested: number | undefined, maxTextureDim: number): number;
33
- /** One occluder draw recorded into the depth pre-pass. */
34
- export interface ShadowOccluderDraw {
35
- kind: ShadowDrawKind;
36
- /** Slot-0 vertex buffer (positions). */
37
- vertexBuffer: GPUBuffer;
38
- indexBuffer: GPUBuffer;
39
- indexCount: number;
40
- /**
41
- * Column-major model matrix (16 floats). Carries the batch origin for the
42
- * flat/quantized/textured paths; ignored for the instanced path.
43
- */
44
- model?: Float32Array;
45
- /** Dequantization params [minX, minY, minZ, step]; quantized path only. */
46
- quantParams?: readonly [number, number, number, number];
47
- /** Slot-1 per-occurrence instance buffer; instanced path only. */
48
- instanceBuffer?: GPUBuffer;
49
- /** Instance count; instanced path only. */
50
- instanceCount?: number;
51
- }
52
- /**
53
- * The clip this frame, mirrored from the colour pass so clipped-away geometry
54
- * stops casting (a sectioned-off roof must not keep shadowing the floor).
55
- * `null`/all-absent members mean "no clipping" and keep the fragment-less
56
- * depth-only pipelines.
57
- */
58
- export interface ShadowClip {
59
- /** World-space plane; fragments on its + side are cut (see `flipped`). */
60
- section?: {
61
- normal: readonly [number, number, number];
62
- distance: number;
63
- flipped?: boolean;
64
- } | null;
65
- /** World-space crop box; fragments outside it are cut. */
66
- box?: {
67
- min: readonly [number, number, number];
68
- max: readonly [number, number, number];
69
- } | null;
70
- }
21
+ import type { ShadowClip, ShadowOccluderDraw, ShadowRteFrame } from './shadow-types.js';
22
+ export { resolveShadowMapResolution } from './shadow-types.js';
23
+ export type { ShadowClip, ShadowDrawKind, ShadowOccluderDraw, ShadowRteFrame } from './shadow-types.js';
71
24
  export declare class ShadowPass {
72
25
  private device;
73
26
  private resolution;
@@ -84,6 +37,7 @@ export declare class ShadowPass {
84
37
  private shaderModule;
85
38
  private pipelineLayout;
86
39
  private lightBuffer;
40
+ /** Light matrix plus retained RTE-frame fields for the stable uniform ABI. */
87
41
  private lightScratch;
88
42
  /** Clip uniform (floats 0..11) with the flag word aliased as u32 (word 12). */
89
43
  private clipBuffer;
@@ -112,7 +66,7 @@ export declare class ShadowPass {
112
66
  * anything the draws go through the clipping pipelines so removed geometry
113
67
  * casts nothing.
114
68
  */
115
- render(encoder: GPUCommandEncoder, lightViewProj: Mat4, draws: readonly ShadowOccluderDraw[], clip?: ShadowClip | null): void;
69
+ render(encoder: GPUCommandEncoder, lightViewProj: Mat4, draws: readonly ShadowOccluderDraw[], clip?: ShadowClip | null, rte?: ShadowRteFrame | null): void;
116
70
  destroy(): void;
117
71
  /**
118
72
  * Pack this frame's clip into the uniform, laid out (and flag-packed) exactly
@@ -1 +1 @@
1
- {"version":3,"file":"shadow-pass.d.ts","sourceRoot":"","sources":["../src/shadow-pass.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shadow-pass.d.ts","sourceRoot":"","sources":["../src/shadow-pass.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAKvC,OAAO,KAAK,EACV,UAAU,EAEV,kBAAkB,EAClB,cAAc,EACf,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAC/D,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAWxG,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,UAAU,CAAS;IAE3B,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,gBAAgB,CAAiB;IAEzC,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,SAAS,CAA4C;IAC7D;;;;OAIG;IACH,OAAO,CAAC,aAAa,CAA0D;IAC/E,OAAO,CAAC,YAAY,CAAkB;IACtC,OAAO,CAAC,cAAc,CAAoB;IAE1C,OAAO,CAAC,WAAW,CAAY;IAC/B,8EAA8E;IAC9E,OAAO,CAAC,YAAY,CAAwB;IAE5C,+EAA+E;IAC/E,OAAO,CAAC,UAAU,CAAY;IAC9B,OAAO,CAAC,WAAW,CAAoC;IACvD,OAAO,CAAC,SAAS,CAA4C;IAE7D,yEAAyE;IACzE,OAAO,CAAC,UAAU,CAAY;IAC9B,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,aAAa,CAAe;IACpC,OAAO,CAAC,WAAW,CAAe;IAElC,OAAO,CAAC,SAAS,CAAS;gBAEd,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM;IAoDjD,mFAAmF;IACnF,OAAO,CAAC,iBAAiB;IAWzB,wDAAwD;IACxD,mBAAmB,IAAI,cAAc;IAIrC,aAAa,IAAI,MAAM;IAIvB,8EAA8E;IAC9E,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IASvC;;;;;;;OAOG;IACH,MAAM,CACJ,OAAO,EAAE,iBAAiB,EAC1B,aAAa,EAAE,IAAI,EACnB,KAAK,EAAE,SAAS,kBAAkB,EAAE,EACpC,IAAI,CAAC,EAAE,UAAU,GAAG,IAAI,EACxB,GAAG,CAAC,EAAE,cAAc,GAAG,IAAI,GAC1B,IAAI;IAmGP,OAAO,IAAI,IAAI;IASf;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IAqBxB,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,cAAc;IAsBtB,OAAO,CAAC,cAAc;CA2CvB"}