@ifc-lite/renderer 3.2.0 → 5.0.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 (399) 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/edge-params.d.ts +43 -0
  48. package/dist/edge-params.d.ts.map +1 -0
  49. package/dist/edge-params.js +63 -0
  50. package/dist/edge-params.js.map +1 -0
  51. package/dist/edge-pass.d.ts +38 -0
  52. package/dist/edge-pass.d.ts.map +1 -0
  53. package/dist/edge-pass.js +111 -0
  54. package/dist/edge-pass.js.map +1 -0
  55. package/dist/environment.d.ts +26 -15
  56. package/dist/environment.d.ts.map +1 -1
  57. package/dist/environment.js +24 -13
  58. package/dist/environment.js.map +1 -1
  59. package/dist/federation-registry.d.ts +16 -0
  60. package/dist/federation-registry.d.ts.map +1 -1
  61. package/dist/federation-registry.js +80 -9
  62. package/dist/federation-registry.js.map +1 -1
  63. package/dist/gpu-static-upload.d.ts +39 -0
  64. package/dist/gpu-static-upload.d.ts.map +1 -0
  65. package/dist/gpu-static-upload.js +70 -0
  66. package/dist/gpu-static-upload.js.map +1 -0
  67. package/dist/gpu-upload-guard.d.ts +12 -23
  68. package/dist/gpu-upload-guard.d.ts.map +1 -1
  69. package/dist/gpu-upload-guard.js +12 -26
  70. package/dist/gpu-upload-guard.js.map +1 -1
  71. package/dist/index.d.ts +58 -35
  72. package/dist/index.d.ts.map +1 -1
  73. package/dist/index.js +255 -284
  74. package/dist/index.js.map +1 -1
  75. package/dist/instanced-render.d.ts +25 -5
  76. package/dist/instanced-render.d.ts.map +1 -1
  77. package/dist/instanced-render.js +50 -13
  78. package/dist/instanced-render.js.map +1 -1
  79. package/dist/instanced-rte.d.ts +17 -0
  80. package/dist/instanced-rte.d.ts.map +1 -0
  81. package/dist/instanced-rte.js +32 -0
  82. package/dist/instanced-rte.js.map +1 -0
  83. package/dist/mesh-material.d.ts +26 -0
  84. package/dist/mesh-material.d.ts.map +1 -0
  85. package/dist/mesh-material.js +52 -0
  86. package/dist/mesh-material.js.map +1 -0
  87. package/dist/mesh-rte-uniforms.d.ts +47 -0
  88. package/dist/mesh-rte-uniforms.d.ts.map +1 -0
  89. package/dist/mesh-rte-uniforms.js +60 -0
  90. package/dist/mesh-rte-uniforms.js.map +1 -0
  91. package/dist/model-bounds-tracker.d.ts +7 -0
  92. package/dist/model-bounds-tracker.d.ts.map +1 -1
  93. package/dist/model-bounds-tracker.js +16 -5
  94. package/dist/model-bounds-tracker.js.map +1 -1
  95. package/dist/model-translation.d.ts +1 -1
  96. package/dist/model-translation.d.ts.map +1 -1
  97. package/dist/model-translation.js +50 -2
  98. package/dist/model-translation.js.map +1 -1
  99. package/dist/overlay-theme-uniforms.d.ts +54 -0
  100. package/dist/overlay-theme-uniforms.d.ts.map +1 -0
  101. package/dist/overlay-theme-uniforms.js +89 -0
  102. package/dist/overlay-theme-uniforms.js.map +1 -0
  103. package/dist/overlay-theme.d.ts +73 -0
  104. package/dist/overlay-theme.d.ts.map +1 -0
  105. package/dist/overlay-theme.js +24 -0
  106. package/dist/overlay-theme.js.map +1 -0
  107. package/dist/pick-rte-snapshot.d.ts +7 -0
  108. package/dist/pick-rte-snapshot.d.ts.map +1 -0
  109. package/dist/pick-rte-snapshot.js +15 -0
  110. package/dist/pick-rte-snapshot.js.map +1 -0
  111. package/dist/pick-types.d.ts +17 -0
  112. package/dist/pick-types.d.ts.map +1 -0
  113. package/dist/pick-types.js +5 -0
  114. package/dist/pick-types.js.map +1 -0
  115. package/dist/pick-uniforms.d.ts +6 -0
  116. package/dist/pick-uniforms.d.ts.map +1 -1
  117. package/dist/pick-uniforms.js +22 -18
  118. package/dist/pick-uniforms.js.map +1 -1
  119. package/dist/pick-world-position.d.ts +18 -0
  120. package/dist/pick-world-position.d.ts.map +1 -0
  121. package/dist/pick-world-position.js +21 -0
  122. package/dist/pick-world-position.js.map +1 -0
  123. package/dist/picker-readbacks.d.ts +6 -0
  124. package/dist/picker-readbacks.d.ts.map +1 -0
  125. package/dist/picker-readbacks.js +20 -0
  126. package/dist/picker-readbacks.js.map +1 -0
  127. package/dist/picker-rte-uniforms.d.ts +6 -0
  128. package/dist/picker-rte-uniforms.d.ts.map +1 -0
  129. package/dist/picker-rte-uniforms.js +41 -0
  130. package/dist/picker-rte-uniforms.js.map +1 -0
  131. package/dist/picker.d.ts +6 -7
  132. package/dist/picker.d.ts.map +1 -1
  133. package/dist/picker.js +88 -115
  134. package/dist/picker.js.map +1 -1
  135. package/dist/picking-manager.d.ts +8 -0
  136. package/dist/picking-manager.d.ts.map +1 -1
  137. package/dist/picking-manager.js +46 -19
  138. package/dist/picking-manager.js.map +1 -1
  139. package/dist/pipeline.d.ts +3 -7
  140. package/dist/pipeline.d.ts.map +1 -1
  141. package/dist/pipeline.js +27 -31
  142. package/dist/pipeline.js.map +1 -1
  143. package/dist/point-picker.d.ts +5 -1
  144. package/dist/point-picker.d.ts.map +1 -1
  145. package/dist/point-picker.js +49 -9
  146. package/dist/point-picker.js.map +1 -1
  147. package/dist/pointcloud/point-cloud-handle-ids.d.ts +22 -0
  148. package/dist/pointcloud/point-cloud-handle-ids.d.ts.map +1 -0
  149. package/dist/pointcloud/point-cloud-handle-ids.js +31 -0
  150. package/dist/pointcloud/point-cloud-handle-ids.js.map +1 -0
  151. package/dist/pointcloud/point-cloud-node.d.ts +14 -6
  152. package/dist/pointcloud/point-cloud-node.d.ts.map +1 -1
  153. package/dist/pointcloud/point-cloud-node.js.map +1 -1
  154. package/dist/pointcloud/point-cloud-pick-sources.d.ts +47 -0
  155. package/dist/pointcloud/point-cloud-pick-sources.d.ts.map +1 -0
  156. package/dist/pointcloud/point-cloud-pick-sources.js +32 -0
  157. package/dist/pointcloud/point-cloud-pick-sources.js.map +1 -0
  158. package/dist/pointcloud/point-cloud-placement.d.ts.map +1 -1
  159. package/dist/pointcloud/point-cloud-placement.js +20 -5
  160. package/dist/pointcloud/point-cloud-placement.js.map +1 -1
  161. package/dist/pointcloud/point-cloud-ray-transform.d.ts +78 -4
  162. package/dist/pointcloud/point-cloud-ray-transform.d.ts.map +1 -1
  163. package/dist/pointcloud/point-cloud-ray-transform.js +31 -84
  164. package/dist/pointcloud/point-cloud-ray-transform.js.map +1 -1
  165. package/dist/pointcloud/point-cloud-renderer.d.ts +21 -19
  166. package/dist/pointcloud/point-cloud-renderer.d.ts.map +1 -1
  167. package/dist/pointcloud/point-cloud-renderer.js +46 -52
  168. package/dist/pointcloud/point-cloud-renderer.js.map +1 -1
  169. package/dist/pointcloud/point-cloud-stream-lifecycle.d.ts +44 -0
  170. package/dist/pointcloud/point-cloud-stream-lifecycle.d.ts.map +1 -0
  171. package/dist/pointcloud/point-cloud-stream-lifecycle.js +44 -0
  172. package/dist/pointcloud/point-cloud-stream-lifecycle.js.map +1 -0
  173. package/dist/pointcloud/point-cloud-uniforms.d.ts +5 -0
  174. package/dist/pointcloud/point-cloud-uniforms.d.ts.map +1 -1
  175. package/dist/pointcloud/point-cloud-uniforms.js +55 -44
  176. package/dist/pointcloud/point-cloud-uniforms.js.map +1 -1
  177. package/dist/pointcloud/point-cloud-visibility.d.ts +10 -0
  178. package/dist/pointcloud/point-cloud-visibility.d.ts.map +1 -0
  179. package/dist/pointcloud/point-cloud-visibility.js +18 -0
  180. package/dist/pointcloud/point-cloud-visibility.js.map +1 -0
  181. package/dist/pointcloud/point-pipeline.d.ts +4 -9
  182. package/dist/pointcloud/point-pipeline.d.ts.map +1 -1
  183. package/dist/pointcloud/point-pipeline.js +4 -9
  184. package/dist/pointcloud/point-pipeline.js.map +1 -1
  185. package/dist/pointcloud/point-shader.wgsl.d.ts +1 -21
  186. package/dist/pointcloud/point-shader.wgsl.d.ts.map +1 -1
  187. package/dist/pointcloud/point-shader.wgsl.js +25 -5
  188. package/dist/pointcloud/point-shader.wgsl.js.map +1 -1
  189. package/dist/post-pass-chain.d.ts +38 -0
  190. package/dist/post-pass-chain.d.ts.map +1 -0
  191. package/dist/post-pass-chain.js +105 -0
  192. package/dist/post-pass-chain.js.map +1 -0
  193. package/dist/raycast-engine.d.ts +7 -5
  194. package/dist/raycast-engine.d.ts.map +1 -1
  195. package/dist/raycast-engine.js +17 -20
  196. package/dist/raycast-engine.js.map +1 -1
  197. package/dist/raycast-point-cloud-query.d.ts +1 -1
  198. package/dist/raycast-point-cloud-query.d.ts.map +1 -1
  199. package/dist/reference-image-pipeline.d.ts +1 -1
  200. package/dist/reference-image-pipeline.d.ts.map +1 -1
  201. package/dist/reference-image-pipeline.js +25 -7
  202. package/dist/reference-image-pipeline.js.map +1 -1
  203. package/dist/reference-images.d.ts +1 -1
  204. package/dist/reference-images.d.ts.map +1 -1
  205. package/dist/reference-images.js +13 -5
  206. package/dist/reference-images.js.map +1 -1
  207. package/dist/relative-to-eye.d.ts +146 -0
  208. package/dist/relative-to-eye.d.ts.map +1 -0
  209. package/dist/relative-to-eye.js +326 -0
  210. package/dist/relative-to-eye.js.map +1 -0
  211. package/dist/render-section-draw.d.ts +11 -0
  212. package/dist/render-section-draw.d.ts.map +1 -1
  213. package/dist/render-section-draw.js +6 -3
  214. package/dist/render-section-draw.js.map +1 -1
  215. package/dist/renderer-color-readback.d.ts +50 -0
  216. package/dist/renderer-color-readback.d.ts.map +1 -0
  217. package/dist/renderer-color-readback.js +145 -0
  218. package/dist/renderer-color-readback.js.map +1 -0
  219. package/dist/renderer-overlays.d.ts +20 -10
  220. package/dist/renderer-overlays.d.ts.map +1 -1
  221. package/dist/renderer-overlays.js +44 -34
  222. package/dist/renderer-overlays.js.map +1 -1
  223. package/dist/renderer-screenshot.d.ts +4 -0
  224. package/dist/renderer-screenshot.d.ts.map +1 -0
  225. package/dist/renderer-screenshot.js +17 -0
  226. package/dist/renderer-screenshot.js.map +1 -0
  227. package/dist/renderer-symbolic-overlays.d.ts +4 -2
  228. package/dist/renderer-symbolic-overlays.d.ts.map +1 -1
  229. package/dist/renderer-symbolic-overlays.js +33 -13
  230. package/dist/renderer-symbolic-overlays.js.map +1 -1
  231. package/dist/renderer-viewport.d.ts +45 -0
  232. package/dist/renderer-viewport.d.ts.map +1 -1
  233. package/dist/renderer-viewport.js +44 -0
  234. package/dist/renderer-viewport.js.map +1 -1
  235. package/dist/rte-clip-space.d.ts +12 -0
  236. package/dist/rte-clip-space.d.ts.map +1 -0
  237. package/dist/rte-clip-space.js +22 -0
  238. package/dist/rte-clip-space.js.map +1 -0
  239. package/dist/rte-frustum.d.ts +24 -0
  240. package/dist/rte-frustum.d.ts.map +1 -0
  241. package/dist/rte-frustum.js +45 -0
  242. package/dist/rte-frustum.js.map +1 -0
  243. package/dist/scene-batch-upload.d.ts.map +1 -1
  244. package/dist/scene-batch-upload.js +14 -38
  245. package/dist/scene-batch-upload.js.map +1 -1
  246. package/dist/scene-device-recovery.d.ts.map +1 -1
  247. package/dist/scene-device-recovery.js +5 -9
  248. package/dist/scene-device-recovery.js.map +1 -1
  249. package/dist/scene-finalize-regroup.d.ts +54 -0
  250. package/dist/scene-finalize-regroup.d.ts.map +1 -0
  251. package/dist/scene-finalize-regroup.js +136 -0
  252. package/dist/scene-finalize-regroup.js.map +1 -0
  253. package/dist/scene-instance-bounds.d.ts +12 -0
  254. package/dist/scene-instance-bounds.d.ts.map +1 -0
  255. package/dist/scene-instance-bounds.js +48 -0
  256. package/dist/scene-instance-bounds.js.map +1 -0
  257. package/dist/scene-instance-materialization.d.ts +4 -1
  258. package/dist/scene-instance-materialization.d.ts.map +1 -1
  259. package/dist/scene-instance-materialization.js +21 -6
  260. package/dist/scene-instance-materialization.js.map +1 -1
  261. package/dist/scene-instance-translation.d.ts +17 -0
  262. package/dist/scene-instance-translation.d.ts.map +1 -0
  263. package/dist/scene-instance-translation.js +50 -0
  264. package/dist/scene-instance-translation.js.map +1 -0
  265. package/dist/scene-instance-types.d.ts +6 -0
  266. package/dist/scene-instance-types.d.ts.map +1 -1
  267. package/dist/scene-model-translation.d.ts +2 -0
  268. package/dist/scene-model-translation.d.ts.map +1 -1
  269. package/dist/scene-model-translation.js +1 -1
  270. package/dist/scene-model-translation.js.map +1 -1
  271. package/dist/scene-rect-select.d.ts +11 -1
  272. package/dist/scene-rect-select.d.ts.map +1 -1
  273. package/dist/scene-rect-select.js +7 -4
  274. package/dist/scene-rect-select.js.map +1 -1
  275. package/dist/scene.d.ts +27 -20
  276. package/dist/scene.d.ts.map +1 -1
  277. package/dist/scene.js +109 -238
  278. package/dist/scene.js.map +1 -1
  279. package/dist/section-2d-lift.d.ts +10 -2
  280. package/dist/section-2d-lift.d.ts.map +1 -1
  281. package/dist/section-2d-lift.js +14 -6
  282. package/dist/section-2d-lift.js.map +1 -1
  283. package/dist/section-2d-line-buffer.d.ts +12 -4
  284. package/dist/section-2d-line-buffer.d.ts.map +1 -1
  285. package/dist/section-2d-line-buffer.js +59 -33
  286. package/dist/section-2d-line-buffer.js.map +1 -1
  287. package/dist/section-2d-overlay.d.ts +18 -72
  288. package/dist/section-2d-overlay.d.ts.map +1 -1
  289. package/dist/section-2d-overlay.js +72 -103
  290. package/dist/section-2d-overlay.js.map +1 -1
  291. package/dist/section-2d-types.d.ts +38 -0
  292. package/dist/section-2d-types.d.ts.map +1 -0
  293. package/dist/section-2d-types.js +6 -0
  294. package/dist/section-2d-types.js.map +1 -0
  295. package/dist/section-cap-pipelines.d.ts +6 -0
  296. package/dist/section-cap-pipelines.d.ts.map +1 -0
  297. package/dist/section-cap-pipelines.js +87 -0
  298. package/dist/section-cap-pipelines.js.map +1 -0
  299. package/dist/section-plane-geometry.d.ts +24 -0
  300. package/dist/section-plane-geometry.d.ts.map +1 -0
  301. package/dist/section-plane-geometry.js +93 -0
  302. package/dist/section-plane-geometry.js.map +1 -0
  303. package/dist/section-plane.d.ts +26 -24
  304. package/dist/section-plane.d.ts.map +1 -1
  305. package/dist/section-plane.js +57 -182
  306. package/dist/section-plane.js.map +1 -1
  307. package/dist/shaders/ao.wgsl.d.ts +2 -0
  308. package/dist/shaders/ao.wgsl.d.ts.map +1 -0
  309. package/dist/shaders/ao.wgsl.js +234 -0
  310. package/dist/shaders/ao.wgsl.js.map +1 -0
  311. package/dist/shaders/color-transfer.wgsl.d.ts +28 -0
  312. package/dist/shaders/color-transfer.wgsl.d.ts.map +1 -0
  313. package/dist/shaders/color-transfer.wgsl.js +55 -0
  314. package/dist/shaders/color-transfer.wgsl.js.map +1 -0
  315. package/dist/shaders/depth-reconstruct.wgsl.d.ts +16 -0
  316. package/dist/shaders/depth-reconstruct.wgsl.d.ts.map +1 -0
  317. package/dist/shaders/depth-reconstruct.wgsl.js +69 -0
  318. package/dist/shaders/depth-reconstruct.wgsl.js.map +1 -0
  319. package/dist/shaders/edges.wgsl.d.ts +2 -0
  320. package/dist/shaders/edges.wgsl.d.ts.map +1 -0
  321. package/dist/shaders/edges.wgsl.js +158 -0
  322. package/dist/shaders/edges.wgsl.js.map +1 -0
  323. package/dist/shaders/main-rte-shadow.wgsl.d.ts +4 -0
  324. package/dist/shaders/main-rte-shadow.wgsl.d.ts.map +1 -0
  325. package/dist/shaders/main-rte-shadow.wgsl.js +54 -0
  326. package/dist/shaders/main-rte-shadow.wgsl.js.map +1 -0
  327. package/dist/shaders/main.wgsl.d.ts +1 -6
  328. package/dist/shaders/main.wgsl.d.ts.map +1 -1
  329. package/dist/shaders/main.wgsl.js +183 -228
  330. package/dist/shaders/main.wgsl.js.map +1 -1
  331. package/dist/shaders/relative-to-eye.wgsl.d.ts +12 -0
  332. package/dist/shaders/relative-to-eye.wgsl.d.ts.map +1 -0
  333. package/dist/shaders/relative-to-eye.wgsl.js +40 -0
  334. package/dist/shaders/relative-to-eye.wgsl.js.map +1 -0
  335. package/dist/shaders/section-2d-overlay.wgsl.d.ts +28 -12
  336. package/dist/shaders/section-2d-overlay.wgsl.d.ts.map +1 -1
  337. package/dist/shaders/section-2d-overlay.wgsl.js +40 -13
  338. package/dist/shaders/section-2d-overlay.wgsl.js.map +1 -1
  339. package/dist/shaders/shadow.wgsl.d.ts +1 -1
  340. package/dist/shaders/shadow.wgsl.d.ts.map +1 -1
  341. package/dist/shaders/shadow.wgsl.js +25 -7
  342. package/dist/shaders/shadow.wgsl.js.map +1 -1
  343. package/dist/shaders/sky.wgsl.d.ts +1 -11
  344. package/dist/shaders/sky.wgsl.d.ts.map +1 -1
  345. package/dist/shaders/sky.wgsl.js +17 -19
  346. package/dist/shaders/sky.wgsl.js.map +1 -1
  347. package/dist/shaders/specular.wgsl.d.ts +34 -0
  348. package/dist/shaders/specular.wgsl.d.ts.map +1 -0
  349. package/dist/shaders/specular.wgsl.js +134 -0
  350. package/dist/shaders/specular.wgsl.js.map +1 -0
  351. package/dist/shaders/symbolic-overlay.wgsl.d.ts +2 -9
  352. package/dist/shaders/symbolic-overlay.wgsl.d.ts.map +1 -1
  353. package/dist/shaders/symbolic-overlay.wgsl.js +88 -17
  354. package/dist/shaders/symbolic-overlay.wgsl.js.map +1 -1
  355. package/dist/shaders/textured.wgsl.d.ts.map +1 -1
  356. package/dist/shaders/textured.wgsl.js +11 -9
  357. package/dist/shaders/textured.wgsl.js.map +1 -1
  358. package/dist/shadow-light-matrix.d.ts +7 -0
  359. package/dist/shadow-light-matrix.d.ts.map +1 -1
  360. package/dist/shadow-light-matrix.js +11 -0
  361. package/dist/shadow-light-matrix.js.map +1 -1
  362. package/dist/shadow-occluder-batches.d.ts +10 -0
  363. package/dist/shadow-occluder-batches.d.ts.map +1 -0
  364. package/dist/shadow-occluder-batches.js +39 -0
  365. package/dist/shadow-occluder-batches.js.map +1 -0
  366. package/dist/shadow-occluders.d.ts.map +1 -1
  367. package/dist/shadow-occluders.js +4 -0
  368. package/dist/shadow-occluders.js.map +1 -1
  369. package/dist/shadow-pass.d.ts +5 -51
  370. package/dist/shadow-pass.d.ts.map +1 -1
  371. package/dist/shadow-pass.js +49 -45
  372. package/dist/shadow-pass.js.map +1 -1
  373. package/dist/shadow-types.d.ts +39 -0
  374. package/dist/shadow-types.d.ts.map +1 -0
  375. package/dist/shadow-types.js +15 -0
  376. package/dist/shadow-types.js.map +1 -0
  377. package/dist/symbolic-overlay-geometry.d.ts +7 -0
  378. package/dist/symbolic-overlay-geometry.d.ts.map +1 -0
  379. package/dist/symbolic-overlay-geometry.js +43 -0
  380. package/dist/symbolic-overlay-geometry.js.map +1 -0
  381. package/dist/symbolic-overlay-pipelines.d.ts +24 -36
  382. package/dist/symbolic-overlay-pipelines.d.ts.map +1 -1
  383. package/dist/symbolic-overlay-pipelines.js +175 -182
  384. package/dist/symbolic-overlay-pipelines.js.map +1 -1
  385. package/dist/symbolic-text-atlas.d.ts +21 -0
  386. package/dist/symbolic-text-atlas.d.ts.map +1 -1
  387. package/dist/symbolic-text-atlas.js +29 -1
  388. package/dist/symbolic-text-atlas.js.map +1 -1
  389. package/dist/types.d.ts +20 -26
  390. package/dist/types.d.ts.map +1 -1
  391. package/dist/visual-enhancement.d.ts +30 -1
  392. package/dist/visual-enhancement.d.ts.map +1 -1
  393. package/dist/visual-enhancement.js +44 -12
  394. package/dist/visual-enhancement.js.map +1 -1
  395. package/package.json +3 -3
  396. package/dist/post-processor.d.ts +0 -60
  397. package/dist/post-processor.d.ts.map +0 -1
  398. package/dist/post-processor.js +0 -353
  399. package/dist/post-processor.js.map +0 -1
@@ -0,0 +1,134 @@
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
+ /**
5
+ * Specular reflection for the geometry fragment stage (#5386).
6
+ *
7
+ * Two terms, both in the units of `fs_main`'s `lightTerm`, so the caller
8
+ * scales them by the same exposure and `IRRADIANCE_CALIBRATION` as the
9
+ * diffuse light and every preset stays consistent:
10
+ *
11
+ * - the sun: a Cook-Torrance lobe (GGX distribution, Smith-Schlick
12
+ * visibility, Schlick Fresnel). `fs_main` lights a Lambertian albedo as
13
+ * `albedo * intensity`, i.e. the sun's irradiance is `pi * intensity`, so
14
+ * the lobe is scaled by the same `pi` and a white dielectric reflects no
15
+ * more than physics allows next to its diffuse.
16
+ * - the environment: the same two-colour hemisphere that lights the diffuse
17
+ * ambient, read along the reflection vector and weighted by the
18
+ * split-sum environment BRDF (Karis's analytic fit, "Physically Based
19
+ * Shading on Mobile", 2014). The fit already accounts for the lobe's
20
+ * shadowing, so a rough surface picks up almost nothing at grazing angles
21
+ * while a smooth one (glass) turns into a mirror there.
22
+ *
23
+ * `reflectance` is that directional albedo of the specular lobe. The caller
24
+ * takes it off the diffuse (`1 - reflectance`), so a highlight never adds
25
+ * energy on top of a full diffuse, and glass uses it as the light it no
26
+ * longer transmits.
27
+ *
28
+ * Reads the `env` lighting uniform, like `sunShadowFactor`.
29
+ */
30
+ /**
31
+ * Smallest roughness the lobe is evaluated at. Below this the GGX peak is a
32
+ * sub-pixel spike that flickers from frame to frame. The value is Filament's
33
+ * `MIN_PERCEPTUAL_ROUGHNESS` for 32-bit floats.
34
+ */
35
+ export const MIN_SPECULAR_ROUGHNESS = 0.045;
36
+ export const specularWgsl = `
37
+ const MIN_SPECULAR_ROUGHNESS: f32 = ${MIN_SPECULAR_ROUGHNESS};
38
+ const DIELECTRIC_F0: f32 = 0.04;
39
+ const PI: f32 = 3.14159265;
40
+
41
+ fn fresnelSchlick(cosTheta: f32, F0: vec3<f32>) -> vec3<f32> {
42
+ return F0 + (1.0 - F0) * pow(clamp(1.0 - cosTheta, 0.0, 1.0), 5.0);
43
+ }
44
+
45
+ fn distributionGGX(NdotH: f32, roughness: f32) -> f32 {
46
+ let a = roughness * roughness;
47
+ let a2 = a * a;
48
+ let NdotH2 = NdotH * NdotH;
49
+ let denomBase = (NdotH2 * (a2 - 1.0) + 1.0);
50
+ return a2 / max(PI * denomBase * denomBase, 0.0000001);
51
+ }
52
+
53
+ fn geometrySchlickGGX(NdotV: f32, roughness: f32) -> f32 {
54
+ let r = (roughness + 1.0);
55
+ let k = (r * r) / 8.0;
56
+ return NdotV / max(NdotV * (1.0 - k) + k, 0.0000001);
57
+ }
58
+
59
+ fn geometrySmith(NdotV: f32, NdotL: f32, roughness: f32) -> f32 {
60
+ return geometrySchlickGGX(NdotL, roughness) * geometrySchlickGGX(NdotV, roughness);
61
+ }
62
+
63
+ // Split-sum environment BRDF, analytic fit (Karis 2014).
64
+ fn envBrdfApprox(F0: vec3<f32>, roughness: f32, NdotV: f32) -> vec3<f32> {
65
+ let r = roughness * vec4<f32>(-1.0, -0.0275, -0.572, 0.022) + vec4<f32>(1.0, 0.0425, 1.04, -0.04);
66
+ let a004 = min(r.x * r.x, exp2(-9.28 * NdotV)) * r.x + r.y;
67
+ let ab = vec2<f32>(-1.04, 1.04) * a004 + r.zw;
68
+ return F0 * ab.x + ab.y;
69
+ }
70
+
71
+ struct SurfaceSpecular {
72
+ // Reflected light, in lightTerm units (unexposed, uncalibrated).
73
+ light: vec3<f32>,
74
+ // Directional albedo of the specular lobe for this view.
75
+ reflectance: vec3<f32>,
76
+ }
77
+
78
+ // N and V are unit vectors; V points from the surface to the eye.
79
+ // sunLight is the sun's diffuse-equivalent intensity: sunColor *
80
+ // sunIntensity * sunShadow, exactly what scales the diffuse sun term.
81
+ fn surfaceSpecular(
82
+ N: vec3<f32>,
83
+ V: vec3<f32>,
84
+ albedo: vec3<f32>,
85
+ metallic: f32,
86
+ roughnessIn: f32,
87
+ sunLight: vec3<f32>,
88
+ ) -> SurfaceSpecular {
89
+ var out: SurfaceSpecular;
90
+ let NdotV = dot(N, V);
91
+ // A face turned away from the eye is its back side: nothing it
92
+ // reflects can reach the eye, and its diffuse keeps full weight.
93
+ if (NdotV <= 0.0) {
94
+ out.light = vec3<f32>(0.0);
95
+ out.reflectance = vec3<f32>(0.0);
96
+ return out;
97
+ }
98
+ let roughness = clamp(roughnessIn, MIN_SPECULAR_ROUGHNESS, 1.0);
99
+ let F0 = mix(vec3<f32>(DIELECTRIC_F0), albedo, metallic);
100
+
101
+ let L = env.sunDirection;
102
+ let rawNdotL = dot(N, L);
103
+ let NdotL = max(rawNdotL, 0.0);
104
+ // A face the sun is behind (rawNdotL <= 0) contributes nothing to
105
+ // the direct lobe anyway (NdotL clamps it to 0 below), but V + L
106
+ // can be exactly zero there — the sun exactly opposite the eye
107
+ // reflection, e.g. N = V = (0,-1,0), sun = (0,1,0), both satisfy
108
+ // NdotV > 0 above. normalize(vec3(0)) is NaN in WGSL, and NaN * 0
109
+ // is NaN, not 0, so it would poison sun and everything summed with
110
+ // it instead of being multiplied away. Skip the half-vector
111
+ // entirely in that case rather than relying on the NdotL factor.
112
+ var sun = vec3<f32>(0.0);
113
+ if (rawNdotL > 0.0) {
114
+ let H = normalize(V + L);
115
+ let D = distributionGGX(max(dot(N, H), 0.0), roughness);
116
+ let G = geometrySmith(NdotV, NdotL, roughness);
117
+ let F = fresnelSchlick(max(dot(V, H), 0.0), F0);
118
+ // BRDF * NdotL * (pi * intensity); the NdotL cancels the BRDF's.
119
+ sun = F * (D * G * PI / (4.0 * NdotV)) * sunLight;
120
+ }
121
+
122
+ // The hemisphere ambient, looked up along the reflection. A rough
123
+ // lobe gathers from around the normal, so lean the lookup toward N.
124
+ let R = reflect(-V, N);
125
+ let Rd = normalize(mix(R, N, roughness * roughness));
126
+ let sky = mix(env.groundColor, env.skyColor, Rd.y * 0.5 + 0.5) * env.ambientIntensity;
127
+ let reflectance = envBrdfApprox(F0, roughness, NdotV);
128
+
129
+ out.light = sun + sky * reflectance;
130
+ out.reflectance = reflectance;
131
+ return out;
132
+ }
133
+ `;
134
+ //# sourceMappingURL=specular.wgsl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"specular.wgsl.js","sourceRoot":"","sources":["../../src/shaders/specular.wgsl.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH;;;;GAIG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,CAAC;AAE5C,MAAM,CAAC,MAAM,YAAY,GAAG;8CACkB,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgGnE,CAAC"}
@@ -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"}