@ifc-lite/renderer 4.2.0 → 6.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 (307) hide show
  1. package/dist/camera-projection.d.ts +2 -0
  2. package/dist/camera-projection.d.ts.map +1 -1
  3. package/dist/camera-projection.js +46 -0
  4. package/dist/camera-projection.js.map +1 -1
  5. package/dist/chunk-grid.d.ts +21 -0
  6. package/dist/chunk-grid.d.ts.map +1 -1
  7. package/dist/chunk-grid.js +25 -7
  8. package/dist/chunk-grid.js.map +1 -1
  9. package/dist/clash-solid-pipeline.d.ts.map +1 -1
  10. package/dist/clash-solid-pipeline.js +4 -2
  11. package/dist/clash-solid-pipeline.js.map +1 -1
  12. package/dist/deviation/deviation-computer.d.ts +4 -0
  13. package/dist/deviation/deviation-computer.d.ts.map +1 -1
  14. package/dist/deviation/deviation-computer.js +20 -0
  15. package/dist/deviation/deviation-computer.js.map +1 -1
  16. package/dist/deviation/deviation-readback.d.ts +18 -0
  17. package/dist/deviation/deviation-readback.d.ts.map +1 -0
  18. package/dist/deviation/deviation-readback.js +67 -0
  19. package/dist/deviation/deviation-readback.js.map +1 -0
  20. package/dist/edge-params.d.ts +43 -0
  21. package/dist/edge-params.d.ts.map +1 -0
  22. package/dist/edge-params.js +63 -0
  23. package/dist/edge-params.js.map +1 -0
  24. package/dist/edge-pass.d.ts +54 -0
  25. package/dist/edge-pass.d.ts.map +1 -0
  26. package/dist/edge-pass.js +185 -0
  27. package/dist/edge-pass.js.map +1 -0
  28. package/dist/entity-color-table.d.ts +140 -0
  29. package/dist/entity-color-table.d.ts.map +1 -0
  30. package/dist/entity-color-table.js +238 -0
  31. package/dist/entity-color-table.js.map +1 -0
  32. package/dist/gpu-upload-guard.d.ts +1 -1
  33. package/dist/gpu-upload-guard.js +1 -1
  34. package/dist/hover-mesh-cache.d.ts +29 -0
  35. package/dist/hover-mesh-cache.d.ts.map +1 -0
  36. package/dist/hover-mesh-cache.js +31 -0
  37. package/dist/hover-mesh-cache.js.map +1 -0
  38. package/dist/index.d.ts +43 -14
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +196 -189
  41. package/dist/index.js.map +1 -1
  42. package/dist/individual-mesh-upload.d.ts +24 -0
  43. package/dist/individual-mesh-upload.d.ts.map +1 -0
  44. package/dist/individual-mesh-upload.js +85 -0
  45. package/dist/individual-mesh-upload.js.map +1 -0
  46. package/dist/instanced-render.d.ts +22 -12
  47. package/dist/instanced-render.d.ts.map +1 -1
  48. package/dist/instanced-render.js +39 -27
  49. package/dist/instanced-render.js.map +1 -1
  50. package/dist/instanced-rte.d.ts +68 -7
  51. package/dist/instanced-rte.d.ts.map +1 -1
  52. package/dist/instanced-rte.js +98 -17
  53. package/dist/instanced-rte.js.map +1 -1
  54. package/dist/instanced-vertex-layout.d.ts +26 -0
  55. package/dist/instanced-vertex-layout.d.ts.map +1 -0
  56. package/dist/instanced-vertex-layout.js +61 -0
  57. package/dist/instanced-vertex-layout.js.map +1 -0
  58. package/dist/mesh-material.d.ts +26 -0
  59. package/dist/mesh-material.d.ts.map +1 -0
  60. package/dist/mesh-material.js +52 -0
  61. package/dist/mesh-material.js.map +1 -0
  62. package/dist/mesh-rte-uniforms.d.ts +5 -2
  63. package/dist/mesh-rte-uniforms.d.ts.map +1 -1
  64. package/dist/mesh-rte-uniforms.js +5 -2
  65. package/dist/mesh-rte-uniforms.js.map +1 -1
  66. package/dist/model-translation.d.ts.map +1 -1
  67. package/dist/model-translation.js +0 -7
  68. package/dist/model-translation.js.map +1 -1
  69. package/dist/outline-params.d.ts +45 -0
  70. package/dist/outline-params.d.ts.map +1 -0
  71. package/dist/outline-params.js +54 -0
  72. package/dist/outline-params.js.map +1 -0
  73. package/dist/overlay-routing.d.ts +8 -8
  74. package/dist/overlay-routing.js +2 -2
  75. package/dist/overlay-routing.js.map +1 -1
  76. package/dist/overlay-theme-uniforms.d.ts +54 -0
  77. package/dist/overlay-theme-uniforms.d.ts.map +1 -0
  78. package/dist/overlay-theme-uniforms.js +89 -0
  79. package/dist/overlay-theme-uniforms.js.map +1 -0
  80. package/dist/overlay-theme.d.ts +79 -0
  81. package/dist/overlay-theme.d.ts.map +1 -0
  82. package/dist/overlay-theme.js +24 -0
  83. package/dist/overlay-theme.js.map +1 -0
  84. package/dist/partial-batch-requests.d.ts +2 -2
  85. package/dist/pick-mesh-budget.d.ts +28 -0
  86. package/dist/pick-mesh-budget.d.ts.map +1 -0
  87. package/dist/pick-mesh-budget.js +74 -0
  88. package/dist/pick-mesh-budget.js.map +1 -0
  89. package/dist/picker-rte-uniforms.d.ts +7 -1
  90. package/dist/picker-rte-uniforms.d.ts.map +1 -1
  91. package/dist/picker-rte-uniforms.js +9 -1
  92. package/dist/picker-rte-uniforms.js.map +1 -1
  93. package/dist/picker.d.ts.map +1 -1
  94. package/dist/picker.js +15 -28
  95. package/dist/picker.js.map +1 -1
  96. package/dist/picking-manager.d.ts.map +1 -1
  97. package/dist/picking-manager.js +4 -47
  98. package/dist/picking-manager.js.map +1 -1
  99. package/dist/pipeline.d.ts +9 -1
  100. package/dist/pipeline.d.ts.map +1 -1
  101. package/dist/pipeline.js +47 -70
  102. package/dist/pipeline.js.map +1 -1
  103. package/dist/point-picker.d.ts.map +1 -1
  104. package/dist/point-picker.js +7 -2
  105. package/dist/point-picker.js.map +1 -1
  106. package/dist/pointcloud/point-cloud-node.js +1 -1
  107. package/dist/pointcloud/point-cloud-node.js.map +1 -1
  108. package/dist/pointcloud/point-cloud-renderer.d.ts.map +1 -1
  109. package/dist/pointcloud/point-cloud-renderer.js +3 -1
  110. package/dist/pointcloud/point-cloud-renderer.js.map +1 -1
  111. package/dist/pointcloud/point-cloud-uniforms.d.ts +5 -1
  112. package/dist/pointcloud/point-cloud-uniforms.d.ts.map +1 -1
  113. package/dist/pointcloud/point-cloud-uniforms.js +7 -1
  114. package/dist/pointcloud/point-cloud-uniforms.js.map +1 -1
  115. package/dist/post-pass-chain.d.ts +15 -2
  116. package/dist/post-pass-chain.d.ts.map +1 -1
  117. package/dist/post-pass-chain.js +49 -14
  118. package/dist/post-pass-chain.js.map +1 -1
  119. package/dist/raycast-engine.d.ts +5 -1
  120. package/dist/raycast-engine.d.ts.map +1 -1
  121. package/dist/raycast-engine.js +20 -8
  122. package/dist/raycast-engine.js.map +1 -1
  123. package/dist/raycast-point-cloud-query.d.ts +2 -0
  124. package/dist/raycast-point-cloud-query.d.ts.map +1 -1
  125. package/dist/raycast-point-cloud-query.js +7 -0
  126. package/dist/raycast-point-cloud-query.js.map +1 -1
  127. package/dist/raycast-source-curve-query.d.ts +13 -0
  128. package/dist/raycast-source-curve-query.d.ts.map +1 -0
  129. package/dist/raycast-source-curve-query.js +17 -0
  130. package/dist/raycast-source-curve-query.js.map +1 -0
  131. package/dist/reference-image-pipeline.d.ts.map +1 -1
  132. package/dist/reference-image-pipeline.js +4 -2
  133. package/dist/reference-image-pipeline.js.map +1 -1
  134. package/dist/relative-to-eye-abi.d.ts +36 -0
  135. package/dist/relative-to-eye-abi.d.ts.map +1 -0
  136. package/dist/relative-to-eye-abi.js +72 -0
  137. package/dist/relative-to-eye-abi.js.map +1 -0
  138. package/dist/relative-to-eye.d.ts +15 -35
  139. package/dist/relative-to-eye.d.ts.map +1 -1
  140. package/dist/relative-to-eye.js +46 -74
  141. package/dist/relative-to-eye.js.map +1 -1
  142. package/dist/render-stats.d.ts +5 -1
  143. package/dist/render-stats.d.ts.map +1 -1
  144. package/dist/render-stats.js +1 -1
  145. package/dist/render-stats.js.map +1 -1
  146. package/dist/renderer-overlays.d.ts +8 -7
  147. package/dist/renderer-overlays.d.ts.map +1 -1
  148. package/dist/renderer-overlays.js +14 -16
  149. package/dist/renderer-overlays.js.map +1 -1
  150. package/dist/scene-batch-rebuild.d.ts +1 -2
  151. package/dist/scene-batch-rebuild.d.ts.map +1 -1
  152. package/dist/scene-batch-rebuild.js +4 -8
  153. package/dist/scene-batch-rebuild.js.map +1 -1
  154. package/dist/scene-batch-upload.d.ts.map +1 -1
  155. package/dist/scene-batch-upload.js +7 -3
  156. package/dist/scene-batch-upload.js.map +1 -1
  157. package/dist/scene-contents.d.ts +1 -1
  158. package/dist/scene-contents.d.ts.map +1 -1
  159. package/dist/scene-derived-batches.d.ts +19 -64
  160. package/dist/scene-derived-batches.d.ts.map +1 -1
  161. package/dist/scene-derived-batches.js +16 -51
  162. package/dist/scene-derived-batches.js.map +1 -1
  163. package/dist/scene-device-recovery.d.ts +3 -3
  164. package/dist/scene-device-recovery.d.ts.map +1 -1
  165. package/dist/scene-device-recovery.js +12 -9
  166. package/dist/scene-device-recovery.js.map +1 -1
  167. package/dist/scene-geometry.d.ts +6 -6
  168. package/dist/scene-geometry.d.ts.map +1 -1
  169. package/dist/scene-geometry.js +8 -9
  170. package/dist/scene-geometry.js.map +1 -1
  171. package/dist/scene-instance-bounds.d.ts +1 -1
  172. package/dist/scene-instance-bounds.d.ts.map +1 -1
  173. package/dist/scene-instance-bounds.js +4 -16
  174. package/dist/scene-instance-bounds.js.map +1 -1
  175. package/dist/scene-instance-materialization.d.ts.map +1 -1
  176. package/dist/scene-instance-materialization.js +4 -4
  177. package/dist/scene-instance-materialization.js.map +1 -1
  178. package/dist/scene-instance-translation.d.ts +6 -10
  179. package/dist/scene-instance-translation.d.ts.map +1 -1
  180. package/dist/scene-instance-translation.js +9 -31
  181. package/dist/scene-instance-translation.js.map +1 -1
  182. package/dist/scene-instance-types.d.ts +11 -2
  183. package/dist/scene-instance-types.d.ts.map +1 -1
  184. package/dist/scene-instance-types.js +7 -1
  185. package/dist/scene-instance-types.js.map +1 -1
  186. package/dist/scene-model-translation.d.ts +1 -2
  187. package/dist/scene-model-translation.d.ts.map +1 -1
  188. package/dist/scene-model-translation.js +4 -3
  189. package/dist/scene-model-translation.js.map +1 -1
  190. package/dist/scene.d.ts +44 -30
  191. package/dist/scene.d.ts.map +1 -1
  192. package/dist/scene.js +121 -129
  193. package/dist/scene.js.map +1 -1
  194. package/dist/section-2d-line-buffer.d.ts +2 -2
  195. package/dist/section-2d-line-buffer.d.ts.map +1 -1
  196. package/dist/section-2d-line-buffer.js +10 -11
  197. package/dist/section-2d-line-buffer.js.map +1 -1
  198. package/dist/section-2d-overlay.d.ts +6 -4
  199. package/dist/section-2d-overlay.d.ts.map +1 -1
  200. package/dist/section-2d-overlay.js +45 -21
  201. package/dist/section-2d-overlay.js.map +1 -1
  202. package/dist/section-2d-types.d.ts +1 -1
  203. package/dist/section-2d-types.d.ts.map +1 -1
  204. package/dist/section-2d-types.js +1 -1
  205. package/dist/section-2d-types.js.map +1 -1
  206. package/dist/section-plane.d.ts +3 -0
  207. package/dist/section-plane.d.ts.map +1 -1
  208. package/dist/section-plane.js +18 -25
  209. package/dist/section-plane.js.map +1 -1
  210. package/dist/selection-mask-pass.d.ts +85 -0
  211. package/dist/selection-mask-pass.d.ts.map +1 -0
  212. package/dist/selection-mask-pass.js +170 -0
  213. package/dist/selection-mask-pass.js.map +1 -0
  214. package/dist/selection-mask-pipelines.d.ts +57 -0
  215. package/dist/selection-mask-pipelines.d.ts.map +1 -0
  216. package/dist/selection-mask-pipelines.js +150 -0
  217. package/dist/selection-mask-pipelines.js.map +1 -0
  218. package/dist/selection-outline-frame.d.ts +47 -0
  219. package/dist/selection-outline-frame.d.ts.map +1 -0
  220. package/dist/selection-outline-frame.js +122 -0
  221. package/dist/selection-outline-frame.js.map +1 -0
  222. package/dist/shaders/color-transfer.wgsl.d.ts +5 -3
  223. package/dist/shaders/color-transfer.wgsl.d.ts.map +1 -1
  224. package/dist/shaders/color-transfer.wgsl.js +5 -3
  225. package/dist/shaders/color-transfer.wgsl.js.map +1 -1
  226. package/dist/shaders/depth-reconstruct.wgsl.d.ts +7 -2
  227. package/dist/shaders/depth-reconstruct.wgsl.d.ts.map +1 -1
  228. package/dist/shaders/depth-reconstruct.wgsl.js +8 -3
  229. package/dist/shaders/depth-reconstruct.wgsl.js.map +1 -1
  230. package/dist/shaders/edges.wgsl.d.ts +20 -0
  231. package/dist/shaders/edges.wgsl.d.ts.map +1 -0
  232. package/dist/shaders/edges.wgsl.js +257 -0
  233. package/dist/shaders/edges.wgsl.js.map +1 -0
  234. package/dist/shaders/entity-color-table.wgsl.d.ts +2 -0
  235. package/dist/shaders/entity-color-table.wgsl.d.ts.map +1 -0
  236. package/dist/shaders/entity-color-table.wgsl.js +85 -0
  237. package/dist/shaders/entity-color-table.wgsl.js.map +1 -0
  238. package/dist/shaders/main.wgsl.d.ts +1 -1
  239. package/dist/shaders/main.wgsl.d.ts.map +1 -1
  240. package/dist/shaders/main.wgsl.js +107 -171
  241. package/dist/shaders/main.wgsl.js.map +1 -1
  242. package/dist/shaders/mesh-uniforms.wgsl.d.ts +2 -0
  243. package/dist/shaders/mesh-uniforms.wgsl.d.ts.map +1 -0
  244. package/dist/shaders/mesh-uniforms.wgsl.js +53 -0
  245. package/dist/shaders/mesh-uniforms.wgsl.js.map +1 -0
  246. package/dist/shaders/section-2d-overlay.wgsl.d.ts +1 -0
  247. package/dist/shaders/section-2d-overlay.wgsl.d.ts.map +1 -1
  248. package/dist/shaders/section-2d-overlay.wgsl.js +3 -2
  249. package/dist/shaders/section-2d-overlay.wgsl.js.map +1 -1
  250. package/dist/shaders/selection-mask.wgsl.d.ts +16 -0
  251. package/dist/shaders/selection-mask.wgsl.d.ts.map +1 -0
  252. package/dist/shaders/selection-mask.wgsl.js +138 -0
  253. package/dist/shaders/selection-mask.wgsl.js.map +1 -0
  254. package/dist/shaders/shadow.wgsl.d.ts +1 -1
  255. package/dist/shaders/shadow.wgsl.d.ts.map +1 -1
  256. package/dist/shaders/shadow.wgsl.js +3 -3
  257. package/dist/shaders/specular.wgsl.d.ts +34 -0
  258. package/dist/shaders/specular.wgsl.d.ts.map +1 -0
  259. package/dist/shaders/specular.wgsl.js +134 -0
  260. package/dist/shaders/specular.wgsl.js.map +1 -0
  261. package/dist/shadow-occluders.d.ts.map +1 -1
  262. package/dist/shadow-occluders.js +1 -0
  263. package/dist/shadow-occluders.js.map +1 -1
  264. package/dist/shadow-pass.d.ts +0 -1
  265. package/dist/shadow-pass.d.ts.map +1 -1
  266. package/dist/shadow-pass.js +26 -32
  267. package/dist/shadow-pass.js.map +1 -1
  268. package/dist/shadow-types.d.ts +3 -0
  269. package/dist/shadow-types.d.ts.map +1 -1
  270. package/dist/shadow-types.js.map +1 -1
  271. package/dist/snap-detector.d.ts +5 -0
  272. package/dist/snap-detector.d.ts.map +1 -1
  273. package/dist/snap-detector.js.map +1 -1
  274. package/dist/source-curve-clipping.d.ts +7 -0
  275. package/dist/source-curve-clipping.d.ts.map +1 -0
  276. package/dist/source-curve-clipping.js +165 -0
  277. package/dist/source-curve-clipping.js.map +1 -0
  278. package/dist/source-curve-snap.d.ts +49 -0
  279. package/dist/source-curve-snap.d.ts.map +1 -0
  280. package/dist/source-curve-snap.js +197 -0
  281. package/dist/source-curve-snap.js.map +1 -0
  282. package/dist/symbolic-overlay-pipelines.d.ts +1 -1
  283. package/dist/symbolic-overlay-pipelines.d.ts.map +1 -1
  284. package/dist/symbolic-overlay-pipelines.js +13 -22
  285. package/dist/symbolic-overlay-pipelines.js.map +1 -1
  286. package/dist/symbolic-text-rte.d.ts +16 -0
  287. package/dist/symbolic-text-rte.d.ts.map +1 -0
  288. package/dist/symbolic-text-rte.js +37 -0
  289. package/dist/symbolic-text-rte.js.map +1 -0
  290. package/dist/textured-vertices.d.ts.map +1 -1
  291. package/dist/textured-vertices.js +2 -3
  292. package/dist/textured-vertices.js.map +1 -1
  293. package/dist/types.d.ts +10 -0
  294. package/dist/types.d.ts.map +1 -1
  295. package/dist/visual-enhancement.d.ts +10 -7
  296. package/dist/visual-enhancement.d.ts.map +1 -1
  297. package/dist/visual-enhancement.js +9 -8
  298. package/dist/visual-enhancement.js.map +1 -1
  299. package/dist/xray-alpha.d.ts +7 -3
  300. package/dist/xray-alpha.d.ts.map +1 -1
  301. package/dist/xray-alpha.js +11 -7
  302. package/dist/xray-alpha.js.map +1 -1
  303. package/package.json +4 -4
  304. package/dist/post-processor.d.ts +0 -46
  305. package/dist/post-processor.d.ts.map +0 -1
  306. package/dist/post-processor.js +0 -295
  307. package/dist/post-processor.js.map +0 -1
@@ -0,0 +1,2 @@
1
+ export declare const meshUniformsWgsl = "\n struct Uniforms {\n viewProj: mat4x4<f32>,\n model: mat4x4<f32>,\n baseColor: vec4<f32>,\n metallicRoughness: vec2<f32>, // x = metallic, y = roughness (mesh-material.ts)\n transmission: vec2<f32>, // x = 1: authored translucent, drawn as glass; y = pad\n sectionPlane: vec4<f32>, // xyz = plane normal, w = plane distance\n flags: vec4<u32>, // x = isSelected, y = section/clip bits; z, w unused (0) since #5746 dropped the derivative edges\n clipBoxMin: vec4<f32>, // xyz = clip-box min corner (world), w = pad\n clipBoxMax: vec4<f32>, // xyz = clip-box max corner (world), w = pad\n quantParams: vec4<f32>, // local min xyz, lattice step w\n rteViewProj: mat4x4<f32>, // appended frame; bit 16 selects it\n drawableDeltaHigh: vec4<f32>,\n drawableDeltaLow: vec4<f32>,\n rteCameraHigh: vec4<f32>,\n rteCameraLow: vec4<f32>,\n overrideParams: vec4<u32>, // x = draw's id anchor, y = OVERRIDE_* bits (entity-color-table.ts, #6076)\n }\n @binding(0) @group(0) var<uniform> uniforms: Uniforms;\n const RTE_DRAWABLE_FLAG: u32 = 65536u;\n\n // The fragment position the section/crop tests run in: camera-relative\n // for RTE drawables (the packer writes plane and box in that frame),\n // world space otherwise.\n fn clipSpacePos(worldPos: vec3<f32>, eyePos: vec3<f32>) -> vec3<f32> {\n return select(worldPos, eyePos, (uniforms.flags.x & RTE_DRAWABLE_FLAG) != 0u);\n }\n\n // True when p is cut away: ABOVE the section plane (flags.y bit 0 =\n // enabled, bit 1 = flipped) or OUTSIDE the clip box (bit 2).\n fn sectionClipped(p: vec3<f32>) -> bool {\n if ((uniforms.flags.y & 1u) == 1u) {\n let side = select(1.0, -1.0, (uniforms.flags.y & 2u) == 2u);\n if ((dot(p, uniforms.sectionPlane.xyz) - uniforms.sectionPlane.w) * side > 0.0) { return true; }\n }\n if ((uniforms.flags.y & 4u) != 0u) {\n if (any(p < uniforms.clipBoxMin.xyz) || any(p > uniforms.clipBoxMax.xyz)) { return true; }\n }\n return false;\n }\n";
2
+ //# sourceMappingURL=mesh-uniforms.wgsl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesh-uniforms.wgsl.d.ts","sourceRoot":"","sources":["../../src/shaders/mesh-uniforms.wgsl.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,gBAAgB,ouEAyC5B,CAAC"}
@@ -0,0 +1,53 @@
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
+ * The per-mesh uniform block (`@group(0) @binding(0)`) and the section /
6
+ * clip-box test that reads it, shared by `main.wgsl.ts` and the selection
7
+ * mask fragment stage (#5390) so an outline is cut exactly where the
8
+ * surface it traces is. Packing: `mesh-rte-uniforms.ts` / `index.ts`.
9
+ */
10
+ import { MESH_FLAG_RTE_DRAWABLE } from '../mesh-rte-uniforms.js';
11
+ export const meshUniformsWgsl = `
12
+ struct Uniforms {
13
+ viewProj: mat4x4<f32>,
14
+ model: mat4x4<f32>,
15
+ baseColor: vec4<f32>,
16
+ metallicRoughness: vec2<f32>, // x = metallic, y = roughness (mesh-material.ts)
17
+ transmission: vec2<f32>, // x = 1: authored translucent, drawn as glass; y = pad
18
+ sectionPlane: vec4<f32>, // xyz = plane normal, w = plane distance
19
+ flags: vec4<u32>, // x = isSelected, y = section/clip bits; z, w unused (0) since #5746 dropped the derivative edges
20
+ clipBoxMin: vec4<f32>, // xyz = clip-box min corner (world), w = pad
21
+ clipBoxMax: vec4<f32>, // xyz = clip-box max corner (world), w = pad
22
+ quantParams: vec4<f32>, // local min xyz, lattice step w
23
+ rteViewProj: mat4x4<f32>, // appended frame; bit 16 selects it
24
+ drawableDeltaHigh: vec4<f32>,
25
+ drawableDeltaLow: vec4<f32>,
26
+ rteCameraHigh: vec4<f32>,
27
+ rteCameraLow: vec4<f32>,
28
+ overrideParams: vec4<u32>, // x = draw's id anchor, y = OVERRIDE_* bits (entity-color-table.ts, #6076)
29
+ }
30
+ @binding(0) @group(0) var<uniform> uniforms: Uniforms;
31
+ const RTE_DRAWABLE_FLAG: u32 = ${MESH_FLAG_RTE_DRAWABLE}u;
32
+
33
+ // The fragment position the section/crop tests run in: camera-relative
34
+ // for RTE drawables (the packer writes plane and box in that frame),
35
+ // world space otherwise.
36
+ fn clipSpacePos(worldPos: vec3<f32>, eyePos: vec3<f32>) -> vec3<f32> {
37
+ return select(worldPos, eyePos, (uniforms.flags.x & RTE_DRAWABLE_FLAG) != 0u);
38
+ }
39
+
40
+ // True when p is cut away: ABOVE the section plane (flags.y bit 0 =
41
+ // enabled, bit 1 = flipped) or OUTSIDE the clip box (bit 2).
42
+ fn sectionClipped(p: vec3<f32>) -> bool {
43
+ if ((uniforms.flags.y & 1u) == 1u) {
44
+ let side = select(1.0, -1.0, (uniforms.flags.y & 2u) == 2u);
45
+ if ((dot(p, uniforms.sectionPlane.xyz) - uniforms.sectionPlane.w) * side > 0.0) { return true; }
46
+ }
47
+ if ((uniforms.flags.y & 4u) != 0u) {
48
+ if (any(p < uniforms.clipBoxMin.xyz) || any(p > uniforms.clipBoxMax.xyz)) { return true; }
49
+ }
50
+ return false;
51
+ }
52
+ `;
53
+ //# sourceMappingURL=mesh-uniforms.wgsl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mesh-uniforms.wgsl.js","sourceRoot":"","sources":["../../src/shaders/mesh-uniforms.wgsl.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;;GAKG;AACH,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;yCAoBS,sBAAsB;;;;;;;;;;;;;;;;;;;;;CAqB9D,CAAC"}
@@ -85,6 +85,7 @@ export declare const SECTION_2D_UNIFORM_SLOT_INDEX: {
85
85
  readonly grid: number;
86
86
  readonly dxf: number;
87
87
  readonly terrain: number;
88
+ readonly centreline: number;
88
89
  readonly clashBox: number;
89
90
  };
90
91
  /** One cap record plus a partition range for every line family. */
@@ -1 +1 @@
1
- {"version":3,"file":"section-2d-overlay.wgsl.d.ts","sourceRoot":"","sources":["../../src/shaders/section-2d-overlay.wgsl.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;GAcG;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB;IACnC,+CAA+C;;IAE/C,+CAA+C;;IAE/C,+CAA+C;;IAE/C,gDAAgD;;IAEhD,gFAAgF;;IAEhF,oEAAoE;;IAEpE,mFAAmF;;IAEnF,oEAAoE;;IAEpE,8DAA8D;;;CAGtD,CAAC;AAEX,uEAAuE;AACvE,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAE5C,6CAA6C;AAC7C,eAAO,MAAM,wBAAwB,QAAgC,CAAC;AAEtE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH;;;;;;;;GAQG;AACH,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAElD,eAAO,MAAM,6BAA6B;IACxC,6EAA6E;;;;;;;;CAQrE,CAAC;AAEX,mEAAmE;AACnE,eAAO,MAAM,6BAA6B,QAAyC,CAAC;AAEpF;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAIlE;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,wBAAwB,k7LA8H9B,CAAC;AAER;;;GAGG;AACH,eAAO,MAAM,4BAA4B,46EAyDlC,CAAC"}
1
+ {"version":3,"file":"section-2d-overlay.wgsl.d.ts","sourceRoot":"","sources":["../../src/shaders/section-2d-overlay.wgsl.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;GAcG;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB;IACnC,+CAA+C;;IAE/C,+CAA+C;;IAE/C,+CAA+C;;IAE/C,gDAAgD;;IAEhD,gFAAgF;;IAEhF,oEAAoE;;IAEpE,mFAAmF;;IAEnF,oEAAoE;;IAEpE,8DAA8D;;;CAGtD,CAAC;AAEX,uEAAuE;AACvE,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAE5C,6CAA6C;AAC7C,eAAO,MAAM,wBAAwB,QAAgC,CAAC;AAEtE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH;;;;;;;;GAQG;AACH,eAAO,MAAM,8BAA8B,MAAM,CAAC;AAElD,eAAO,MAAM,6BAA6B;IACxC,6EAA6E;;;;;;;;;CASrE,CAAC;AAEX,mEAAmE;AACnE,eAAO,MAAM,6BAA6B,QAAyC,CAAC;AAEpF;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAIlE;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,wBAAwB,k7LA8H9B,CAAC;AAER;;;GAGG;AACH,eAAO,MAAM,4BAA4B,46EAyDlC,CAAC"}
@@ -88,10 +88,11 @@ export const SECTION_2D_UNIFORM_SLOT_INDEX = {
88
88
  grid: 1 + SECTION_2D_MAX_LINE_PARTITIONS * 2,
89
89
  dxf: 1 + SECTION_2D_MAX_LINE_PARTITIONS * 3,
90
90
  terrain: 1 + SECTION_2D_MAX_LINE_PARTITIONS * 4,
91
- clashBox: 1 + SECTION_2D_MAX_LINE_PARTITIONS * 5,
91
+ centreline: 1 + SECTION_2D_MAX_LINE_PARTITIONS * 5,
92
+ clashBox: 1 + SECTION_2D_MAX_LINE_PARTITIONS * 6,
92
93
  };
93
94
  /** One cap record plus a partition range for every line family. */
94
- export const SECTION_2D_UNIFORM_SLOT_COUNT = 1 + SECTION_2D_MAX_LINE_PARTITIONS * 6;
95
+ export const SECTION_2D_UNIFORM_SLOT_COUNT = 1 + SECTION_2D_MAX_LINE_PARTITIONS * 7;
95
96
  /**
96
97
  * Byte stride between uniform slots for `device`.
97
98
  *
@@ -1 +1 @@
1
- {"version":3,"file":"section-2d-overlay.wgsl.js","sourceRoot":"","sources":["../../src/shaders/section-2d-overlay.wgsl.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;;;;;;;;;;;GAcG;AAEH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,+CAA+C;IAC/C,QAAQ,EAAE,CAAC;IACX,+CAA+C;IAC/C,WAAW,EAAE,EAAE;IACf,+CAA+C;IAC/C,YAAY,EAAE,EAAE;IAChB,gDAAgD;IAChD,cAAc,EAAE,EAAE;IAClB,gFAAgF;IAChF,MAAM,EAAE,EAAE;IACV,oEAAoE;IACpE,OAAO,EAAE,EAAE;IACX,mFAAmF;IACnF,SAAS,EAAE,EAAE;IACb,oEAAoE;IACpE,WAAW,EAAE,EAAE;IACf,8DAA8D;IAC9D,eAAe,EAAE,EAAE;IACnB,cAAc,EAAE,EAAE;CACV,CAAC;AAEX,uEAAuE;AACvE,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,CAAC;AAE5C,6CAA6C;AAC7C,MAAM,CAAC,MAAM,wBAAwB,GAAG,yBAAyB,GAAG,CAAC,CAAC;AAEtE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAG,GAAG,CAAC;AAElD,MAAM,CAAC,MAAM,6BAA6B,GAAG;IAC3C,6EAA6E;IAC7E,UAAU,EAAE,CAAC;IACb,UAAU,EAAE,CAAC;IACb,SAAS,EAAE,CAAC,GAAG,8BAA8B;IAC7C,IAAI,EAAE,CAAC,GAAG,8BAA8B,GAAG,CAAC;IAC5C,GAAG,EAAE,CAAC,GAAG,8BAA8B,GAAG,CAAC;IAC3C,OAAO,EAAE,CAAC,GAAG,8BAA8B,GAAG,CAAC;IAC/C,QAAQ,EAAE,CAAC,GAAG,8BAA8B,GAAG,CAAC;CACxC,CAAC;AAEX,mEAAmE;AACnE,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,GAAG,8BAA8B,GAAG,CAAC,CAAC;AAEpF;;;;;;;GAOG;AACH,MAAM,UAAU,wBAAwB,CAAC,MAAiB;IACxD,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,+BAA+B,IAAI,GAAG,CAAC;IACxE,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC;IAC3E,OAAO,IAAI,CAAC,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;AAC3D,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8H5C,CAAC;AAER;;;GAGG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAyDhD,CAAC"}
1
+ {"version":3,"file":"section-2d-overlay.wgsl.js","sourceRoot":"","sources":["../../src/shaders/section-2d-overlay.wgsl.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;;;;;;;;;;;GAcG;AAEH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,+CAA+C;IAC/C,QAAQ,EAAE,CAAC;IACX,+CAA+C;IAC/C,WAAW,EAAE,EAAE;IACf,+CAA+C;IAC/C,YAAY,EAAE,EAAE;IAChB,gDAAgD;IAChD,cAAc,EAAE,EAAE;IAClB,gFAAgF;IAChF,MAAM,EAAE,EAAE;IACV,oEAAoE;IACpE,OAAO,EAAE,EAAE;IACX,mFAAmF;IACnF,SAAS,EAAE,EAAE;IACb,oEAAoE;IACpE,WAAW,EAAE,EAAE;IACf,8DAA8D;IAC9D,eAAe,EAAE,EAAE;IACnB,cAAc,EAAE,EAAE;CACV,CAAC;AAEX,uEAAuE;AACvE,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,CAAC;AAE5C,6CAA6C;AAC7C,MAAM,CAAC,MAAM,wBAAwB,GAAG,yBAAyB,GAAG,CAAC,CAAC;AAEtE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAG,GAAG,CAAC;AAElD,MAAM,CAAC,MAAM,6BAA6B,GAAG;IAC3C,6EAA6E;IAC7E,UAAU,EAAE,CAAC;IACb,UAAU,EAAE,CAAC;IACb,SAAS,EAAE,CAAC,GAAG,8BAA8B;IAC7C,IAAI,EAAE,CAAC,GAAG,8BAA8B,GAAG,CAAC;IAC5C,GAAG,EAAE,CAAC,GAAG,8BAA8B,GAAG,CAAC;IAC3C,OAAO,EAAE,CAAC,GAAG,8BAA8B,GAAG,CAAC;IAC/C,UAAU,EAAE,CAAC,GAAG,8BAA8B,GAAG,CAAC;IAClD,QAAQ,EAAE,CAAC,GAAG,8BAA8B,GAAG,CAAC;CACxC,CAAC;AAEX,mEAAmE;AACnE,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,GAAG,8BAA8B,GAAG,CAAC,CAAC;AAEpF;;;;;;;GAOG;AACH,MAAM,UAAU,wBAAwB,CAAC,MAAiB;IACxD,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,+BAA+B,IAAI,GAAG,CAAC;IACxE,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC;IAC3E,OAAO,IAAI,CAAC,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;AAC3D,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA8H5C,CAAC;AAER;;;GAGG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAyDhD,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Bind-group index of the scene depth texture in the mask pipeline layout:
3
+ * group 0 is the mesh uniform that `vs_main` reads, so depth is group 1.
4
+ * `selection-mask-pass.ts` builds its layout from this same constant.
5
+ */
6
+ export declare const SELECTION_MASK_DEPTH_GROUP = 1;
7
+ /**
8
+ * Bind-group index of the hovered-entity uniform (`vec4<u32>`, x = id) in the
9
+ * INSTANCED mask pipeline layout only (#5745). The non-instanced variant
10
+ * selects its meshes on the CPU and declares no such binding.
11
+ */
12
+ export declare const SELECTION_MASK_HOVER_GROUP = 2;
13
+ /** Relative depth slack for "the same surface" (reverse-Z: ~0.2 % of the distance). */
14
+ export declare const MASK_DEPTH_REL_TOLERANCE = 0.002;
15
+ export declare function selectionMaskFragmentSource(multisampled: boolean, instanced?: boolean): string;
16
+ //# sourceMappingURL=selection-mask.wgsl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selection-mask.wgsl.d.ts","sourceRoot":"","sources":["../../src/shaders/selection-mask.wgsl.ts"],"names":[],"mappings":"AAqDA;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAE5C;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAE5C,uFAAuF;AACvF,eAAO,MAAM,wBAAwB,QAAO,CAAC;AAuB7C,wBAAgB,2BAA2B,CAAC,YAAY,EAAE,OAAO,EAAE,SAAS,UAAQ,GAAG,MAAM,CAmD5F"}
@@ -0,0 +1,138 @@
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
+ * Fragment stage for the selection/hover mask pass (#5390). The vertex
6
+ * stage is `mainShaderSource`'s `vs_main` (recompiled as its own
7
+ * `GPUShaderModule`, reusing the exact same RTE/section-plane/transform
8
+ * math the selection highlight draw already uses) — this module supplies
9
+ * only the fragment side, so the two can be mixed in one pipeline: a
10
+ * fragment entry point with no declared inputs is interface-compatible
11
+ * with any vertex stage, since `@builtin(position)` is always available.
12
+ *
13
+ * Manual depth test instead of a real depth-stencil attachment: comparing
14
+ * `@builtin(position).z` (this fragment's own device depth) against the
15
+ * scene depth texture (`depth-reconstruct.wgsl.ts`'s `loadDepth`, same
16
+ * sample-0 convention as the AO/edge passes) means the mask targets stay
17
+ * single-sample regardless of the scene's MSAA sample count, with no
18
+ * resolve step of their own.
19
+ *
20
+ * Every output first drops fragments the section plane or clip box cuts
21
+ * away (`sectionClipped`, shared with `fs_main`), so an outline never traces
22
+ * geometry the section tool removed. That reads the mesh uniform at group 0
23
+ * and the `worldPos` / `eyePos` varyings `vs_main` already emits.
24
+ *
25
+ * Three outputs, at most one per pipeline:
26
+ * - `fs_mask_selected_visible` / `fs_mask_hover_visible`: pass only where
27
+ * this fragment is at least as close as the stored scene depth
28
+ * (reverse-Z: `>=`), i.e. not occluded. `discard` otherwise, so the
29
+ * additive blend leaves the target at 0 there. The comparison is NOT
30
+ * exact: the stored depth is sample 0 of an MSAA attachment (not the
31
+ * pixel centre) and was usually written by the batch draw, whose
32
+ * positions may be quantized, so the same surface lands a slope-sized
33
+ * step away. `isVisible` therefore allows this fragment's own depth
34
+ * slope (`fwidth`, taken before any branch so it stays in uniform
35
+ * control flow) plus `MASK_DEPTH_REL_TOLERANCE` of its depth; reverse-Z
36
+ * depth is proportional to 1/distance, so that is a relative distance
37
+ * tolerance. A fixed 1e-7 epsilon failed on every pixel of a real
38
+ * WebGPU frame, leaving the visible mask empty.
39
+ * - `fs_mask_selected_all`: always passes (drawn "through occluders").
40
+ *
41
+ * Instanced variant (#5745, `instanced = true`): the vertex stage is
42
+ * `vs_instanced` instead, so one draw covers every occurrence of a template.
43
+ * The same entry points then also keep only the occurrences they are for:
44
+ * selected ones (instance flag bit 0) for the selected outputs, and the one
45
+ * whose entity id is the hovered id (a small uniform at
46
+ * `SELECTION_MASK_HOVER_GROUP`) for the hover output. Hidden occurrences
47
+ * (flag bit 1) are dropped, as `fs_main` drops them. The section/clip cut and
48
+ * the depth test are the same code as the non-instanced variant.
49
+ */
50
+ import { depthTextureWgsl } from './depth-reconstruct.wgsl.js';
51
+ import { meshUniformsWgsl } from './mesh-uniforms.wgsl.js';
52
+ /**
53
+ * Bind-group index of the scene depth texture in the mask pipeline layout:
54
+ * group 0 is the mesh uniform that `vs_main` reads, so depth is group 1.
55
+ * `selection-mask-pass.ts` builds its layout from this same constant.
56
+ */
57
+ export const SELECTION_MASK_DEPTH_GROUP = 1;
58
+ /**
59
+ * Bind-group index of the hovered-entity uniform (`vec4<u32>`, x = id) in the
60
+ * INSTANCED mask pipeline layout only (#5745). The non-instanced variant
61
+ * selects its meshes on the CPU and declares no such binding.
62
+ */
63
+ export const SELECTION_MASK_HOVER_GROUP = 2;
64
+ /** Relative depth slack for "the same surface" (reverse-Z: ~0.2 % of the distance). */
65
+ export const MASK_DEPTH_REL_TOLERANCE = 2e-3;
66
+ /**
67
+ * Which occurrences each output keeps. The non-instanced pass is handed only
68
+ * the meshes it should draw, so every fragment qualifies; the instanced pass
69
+ * draws whole templates and filters per occurrence off the flat varyings
70
+ * `vs_instanced` emits (`VertexOutput.entityId` / `.instSelected`).
71
+ */
72
+ function occurrenceFilterWgsl(instanced) {
73
+ if (!instanced) {
74
+ return `
75
+ fn isSelectedOccurrence(input: MaskInput) -> bool { return true; }
76
+ fn isHoveredOccurrence(input: MaskInput) -> bool { return true; }`;
77
+ }
78
+ return `
79
+ @group(${SELECTION_MASK_HOVER_GROUP}) @binding(0) var<uniform> maskHover: vec4<u32>;
80
+ // bit 0 = selected, bit 1 = hidden (instanced-vertex-layout.ts).
81
+ fn isSelectedOccurrence(input: MaskInput) -> bool { return (input.instSelected & 3u) == 1u; }
82
+ fn isHoveredOccurrence(input: MaskInput) -> bool {
83
+ return (input.instSelected & 2u) == 0u && input.entityId == maskHover.x;
84
+ }`;
85
+ }
86
+ export function selectionMaskFragmentSource(multisampled, instanced = false) {
87
+ const instanceVaryings = instanced
88
+ ? `
89
+ @location(2) @interpolate(flat) entityId: u32,
90
+ @location(5) @interpolate(flat) instSelected: u32,`
91
+ : '';
92
+ return `
93
+ ${meshUniformsWgsl}
94
+ ${depthTextureWgsl(0, multisampled, SELECTION_MASK_DEPTH_GROUP)}
95
+
96
+ // The subset of the vertex stage's VertexOutput the mask reads (locations match).
97
+ struct MaskInput {
98
+ @builtin(position) fragPos: vec4<f32>,
99
+ @location(0) worldPos: vec3<f32>,
100
+ @location(6) eyePos: vec3<f32>,${instanceVaryings}
101
+ }
102
+ ${occurrenceFilterWgsl(instanced)}
103
+
104
+ fn isCut(input: MaskInput) -> bool {
105
+ return sectionClipped(clipSpacePos(input.worldPos, input.eyePos));
106
+ }
107
+
108
+ const MASK_DEPTH_REL_TOLERANCE: f32 = ${MASK_DEPTH_REL_TOLERANCE};
109
+
110
+ // depthSlope = fwidth(fragPos.z), taken by the caller in uniform control flow.
111
+ fn isVisible(fragPos: vec4<f32>, depthSlope: f32) -> bool {
112
+ let ip = vec2<i32>(fragPos.xy);
113
+ let slack = depthSlope + fragPos.z * MASK_DEPTH_REL_TOLERANCE;
114
+ return fragPos.z >= loadDepth(ip) - slack;
115
+ }
116
+
117
+ @fragment
118
+ fn fs_mask_selected_visible(input: MaskInput) -> @location(0) vec4<f32> {
119
+ let depthSlope = fwidth(input.fragPos.z);
120
+ if (!isSelectedOccurrence(input) || isCut(input) || !isVisible(input.fragPos, depthSlope)) { discard; }
121
+ return vec4<f32>(1.0, 0.0, 0.0, 0.0);
122
+ }
123
+
124
+ @fragment
125
+ fn fs_mask_hover_visible(input: MaskInput) -> @location(0) vec4<f32> {
126
+ let depthSlope = fwidth(input.fragPos.z);
127
+ if (!isHoveredOccurrence(input) || isCut(input) || !isVisible(input.fragPos, depthSlope)) { discard; }
128
+ return vec4<f32>(0.0, 1.0, 0.0, 0.0);
129
+ }
130
+
131
+ @fragment
132
+ fn fs_mask_selected_all(input: MaskInput) -> @location(0) vec4<f32> {
133
+ if (!isSelectedOccurrence(input) || isCut(input)) { discard; }
134
+ return vec4<f32>(1.0, 0.0, 0.0, 0.0);
135
+ }
136
+ `;
137
+ }
138
+ //# sourceMappingURL=selection-mask.wgsl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selection-mask.wgsl.js","sourceRoot":"","sources":["../../src/shaders/selection-mask.wgsl.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D;;;;GAIG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC;AAE5C;;;;GAIG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC;AAE5C,uFAAuF;AACvF,MAAM,CAAC,MAAM,wBAAwB,GAAG,IAAI,CAAC;AAE7C;;;;;GAKG;AACH,SAAS,oBAAoB,CAAC,SAAkB;IAC9C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO;;0EAE+D,CAAC;IACzE,CAAC;IACD,OAAO;iBACQ,0BAA0B;;;;;UAKjC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,YAAqB,EAAE,SAAS,GAAG,KAAK;IAClF,MAAM,gBAAgB,GAAG,SAAS;QAChC,CAAC,CAAC;;6DAEuD;QACzD,CAAC,CAAC,EAAE,CAAC;IACP,OAAO;UACC,gBAAgB;UAChB,gBAAgB,CAAC,CAAC,EAAE,YAAY,EAAE,0BAA0B,CAAC;;;;;;2CAM5B,gBAAgB;;UAEjD,oBAAoB,CAAC,SAAS,CAAC;;;;;;gDAMO,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BvE,CAAC;AACF,CAAC"}
@@ -27,5 +27,5 @@
27
27
  * the unused `worldPos` output on those pipelines costs an interpolator, not a
28
28
  * shader stage.
29
29
  */
30
- export declare const shadowShaderSource = "\n \nstruct RteFrameUniform {\n // Camera translation is intentionally absent. This projects positions\n // returned by rteWorldPosition, which are already relative to the eye.\n viewProj: mat4x4<f32>,\n}\n\nstruct RteDrawableUniform {\n // CPU computes (drawable origin - camera origin) in f64 and splits it.\n // This data must be refreshed whenever the RTE camera frame changes.\n drawableDeltaHigh: vec4<f32>,\n drawableDeltaLow: vec4<f32>,\n}\n\nfn rteWorldPosition(\n local: vec3<f32>,\n drawable: RteDrawableUniform,\n) -> vec4<f32> {\n // Do not subtract a camera origin here: this delta was formed in CPU f64.\n let highDelta = drawable.drawableDeltaHigh.xyz;\n let lowDelta = drawable.drawableDeltaLow.xyz;\n // A drawable template can span kilometres. Keep local with high first;\n // The local-plus-(high-plus-low) association is not equivalent in f32.\n return vec4<f32>((local + highDelta) + lowDelta, 1.0);\n}\n\n struct Light {\n lightViewProj: mat4x4<f32>,\n cameraHigh: vec4<f32>,\n cameraLow: vec4<f32>,\n }\n @binding(0) @group(0) var<uniform> light: Light;\n\n struct Draw {\n model: mat4x4<f32>,\n // xyz = lattice-aligned quantMin (batch-origin-relative), w = step.\n // Read only by vs_shadow_quantized; zero for the other paths.\n quantParams: vec4<f32>,\n originHigh: vec4<f32>,\n originLow: vec4<f32>,\n }\n @binding(1) @group(0) var<uniform> draw: Draw;\n\n struct Clip {\n // xyz = plane normal, w = plane distance (world space).\n sectionPlane: vec4<f32>,\n clipBoxMin: vec4<f32>,\n clipBoxMax: vec4<f32>,\n // x packs: bit 0 = section enabled, bit 1 = section flipped,\n // bit 2 = clip box enabled. Mirrors main.wgsl's flags.y.\n flags: vec4<u32>,\n }\n @binding(2) @group(0) var<uniform> clip: Clip;\n\n struct FlatIn {\n @location(0) position: vec3<f32>,\n }\n\n struct QuantIn {\n @location(0) q: vec4<u32>, // uint16x4: lattice x, y, z, packedOct\n }\n\n struct InstanceIn {\n @location(3) m0: vec4<f32>,\n @location(4) m1: vec4<f32>,\n @location(5) m2: vec4<f32>,\n @location(6) m3: vec4<f32>,\n // Per-occurrence flags lane (bit 1 = hidden), same instance buffer the\n // colour pass reads. Locations 7 (entityId) and 8 (rgba) are unused by\n // the depth pass and left unbound.\n @location(9) flags: u32,\n // V2 split drawable-minus-camera delta, byte offsets 88 and 104.\n @location(10) anchorHigh: vec4<f32>,\n @location(11) anchorLow: vec4<f32>,\n }\n\n struct ShadowOut {\n @builtin(position) position: vec4<f32>,\n @location(0) worldPos: vec3<f32>,\n }\n\n fn emit(eyePos: vec4<f32>) -> ShadowOut {\n var out: ShadowOut;\n out.position = light.lightViewProj * eyePos;\n out.worldPos = eyePos.xyz;\n return out;\n }\n\n @vertex\n fn vs_shadow_flat(input: FlatIn) -> ShadowOut {\n let linear = (draw.model * vec4<f32>(input.position, 0.0)).xyz;\n return emit(rteWorldPosition(linear, RteDrawableUniform(draw.originHigh, draw.originLow)));\n }\n\n @vertex\n fn vs_shadow_quantized(input: QuantIn) -> ShadowOut {\n let p = draw.quantParams.xyz\n + vec3<f32>(f32(input.q.x), f32(input.q.y), f32(input.q.z)) * draw.quantParams.w;\n let linear = (draw.model * vec4<f32>(p, 0.0)).xyz;\n return emit(rteWorldPosition(linear, RteDrawableUniform(draw.originHigh, draw.originLow)));\n }\n\n @vertex\n fn vs_shadow_instanced(input: FlatIn, inst: InstanceIn) -> ShadowOut {\n // A hidden / isolation-excluded occurrence (flags bit 1) must not cast:\n // the colour pass discards it in fs_main, so collapse it to a zero-area\n // triangle here (every vertex to one clip point) \u2014 the rasterizer drops\n // it and it writes no depth. Mirrors main.wgsl's instSelected & 2u check.\n if ((inst.flags & 2u) != 0u) {\n var out: ShadowOut;\n out.position = vec4<f32>(0.0, 0.0, 0.0, 1.0);\n out.worldPos = vec3<f32>(0.0, 0.0, 0.0);\n return out;\n }\n let instMat = mat4x4<f32>(inst.m0, inst.m1, inst.m2, inst.m3);\n // Keep the local placement from the V1 matrix and add the shared\n // CPU-packed drawable-minus-camera delta. The light projection uses\n // the same RTE frame as the colour and picker submissions.\n let linear = (instMat * vec4<f32>(input.position, 0.0)).xyz;\n return emit(rteWorldPosition(linear, RteDrawableUniform(\n inst.anchorHigh, inst.anchorLow,\n )));\n }\n\n @vertex\n fn vs_shadow_textured(input: FlatIn) -> ShadowOut {\n let linear = (draw.model * vec4<f32>(input.position, 0.0)).xyz;\n return emit(rteWorldPosition(linear, RteDrawableUniform(draw.originHigh, draw.originLow)));\n }\n\n // Clipped variant: discard before the depth write, so a clipped-away\n // occluder leaves the shadow map untouched. Kept byte-for-byte in step\n // with the fs_main section/clip-box branches.\n @fragment\n fn fs_shadow_clip(@location(0) worldPos: vec3<f32>) {\n if ((clip.flags.x & 1u) == 1u) {\n let side = select(1.0, -1.0, (clip.flags.x & 2u) == 2u);\n let distToPlane = (dot(worldPos, clip.sectionPlane.xyz) - clip.sectionPlane.w) * side;\n if (distToPlane > 0.0) {\n discard;\n }\n }\n if ((clip.flags.x & 4u) != 0u) {\n if (any(worldPos < clip.clipBoxMin.xyz) || any(worldPos > clip.clipBoxMax.xyz)) {\n discard;\n }\n }\n }\n";
30
+ export declare const shadowShaderSource = "\n \nstruct RteFrameUniform {\n // Camera translation is intentionally absent. This projects positions\n // returned by rteWorldPosition, which are already relative to the eye.\n viewProj: mat4x4<f32>,\n}\n\nstruct RteDrawableUniform {\n // CPU computes (drawable origin - camera origin) in f64 and splits it.\n // This data must be refreshed whenever the RTE camera frame changes.\n drawableDeltaHigh: vec4<f32>,\n drawableDeltaLow: vec4<f32>,\n}\n\nfn rteWorldPosition(\n local: vec3<f32>,\n drawable: RteDrawableUniform,\n) -> vec4<f32> {\n // Do not subtract a camera origin here: this delta was formed in CPU f64.\n let highDelta = drawable.drawableDeltaHigh.xyz;\n let lowDelta = drawable.drawableDeltaLow.xyz;\n // A drawable template can span kilometres. Keep local with high first;\n // The local-plus-(high-plus-low) association is not equivalent in f32.\n return vec4<f32>((local + highDelta) + lowDelta, 1.0);\n}\n\n struct Light {\n lightViewProj: mat4x4<f32>,\n cameraHigh: vec4<f32>,\n cameraLow: vec4<f32>,\n }\n @binding(0) @group(0) var<uniform> light: Light;\n\n struct Draw {\n model: mat4x4<f32>,\n // xyz = lattice-aligned quantMin (batch-origin-relative), w = step.\n // Read only by vs_shadow_quantized; zero for the other paths.\n quantParams: vec4<f32>,\n originHigh: vec4<f32>,\n originLow: vec4<f32>,\n }\n @binding(1) @group(0) var<uniform> draw: Draw;\n\n struct Clip {\n // xyz = plane normal, w = plane distance (world space).\n sectionPlane: vec4<f32>,\n clipBoxMin: vec4<f32>,\n clipBoxMax: vec4<f32>,\n // x packs: bit 0 = section enabled, bit 1 = section flipped,\n // bit 2 = clip box enabled. Mirrors main.wgsl's flags.y.\n flags: vec4<u32>,\n }\n @binding(2) @group(0) var<uniform> clip: Clip;\n\n struct FlatIn {\n @location(0) position: vec3<f32>,\n }\n\n struct QuantIn {\n @location(0) q: vec4<u32>, // uint16x4: lattice x, y, z, packedOct\n }\n\n struct InstanceIn {\n @location(3) m0: vec4<f32>,\n @location(4) m1: vec4<f32>,\n @location(5) m2: vec4<f32>,\n @location(6) m3: vec4<f32>,\n // Per-occurrence flags lane (bit 1 = hidden), same instance buffer the\n // colour pass reads. Locations 7 (entityId) and 8 (rgba) are in the\n // shared layout but unused by the depth pass.\n @location(9) flags: u32,\n // Split drawable-minus-camera delta from the slot-2 delta stream.\n @location(10) anchorHigh: vec4<f32>,\n @location(11) anchorLow: vec4<f32>,\n }\n\n struct ShadowOut {\n @builtin(position) position: vec4<f32>,\n @location(0) worldPos: vec3<f32>,\n }\n\n fn emit(eyePos: vec4<f32>) -> ShadowOut {\n var out: ShadowOut;\n out.position = light.lightViewProj * eyePos;\n out.worldPos = eyePos.xyz;\n return out;\n }\n\n @vertex\n fn vs_shadow_flat(input: FlatIn) -> ShadowOut {\n let linear = (draw.model * vec4<f32>(input.position, 0.0)).xyz;\n return emit(rteWorldPosition(linear, RteDrawableUniform(draw.originHigh, draw.originLow)));\n }\n\n @vertex\n fn vs_shadow_quantized(input: QuantIn) -> ShadowOut {\n let p = draw.quantParams.xyz\n + vec3<f32>(f32(input.q.x), f32(input.q.y), f32(input.q.z)) * draw.quantParams.w;\n let linear = (draw.model * vec4<f32>(p, 0.0)).xyz;\n return emit(rteWorldPosition(linear, RteDrawableUniform(draw.originHigh, draw.originLow)));\n }\n\n @vertex\n fn vs_shadow_instanced(input: FlatIn, inst: InstanceIn) -> ShadowOut {\n // A hidden / isolation-excluded occurrence (flags bit 1) must not cast:\n // the colour pass discards it in fs_main, so collapse it to a zero-area\n // triangle here (every vertex to one clip point) \u2014 the rasterizer drops\n // it and it writes no depth. Mirrors main.wgsl's instSelected & 2u check.\n if ((inst.flags & 2u) != 0u) {\n var out: ShadowOut;\n out.position = vec4<f32>(0.0, 0.0, 0.0, 1.0);\n out.worldPos = vec3<f32>(0.0, 0.0, 0.0);\n return out;\n }\n let instMat = mat4x4<f32>(inst.m0, inst.m1, inst.m2, inst.m3);\n // Keep the local placement from the V1 matrix and add the shared\n // CPU-packed drawable-minus-camera delta. The light projection uses\n // the same RTE frame as the colour and picker submissions.\n let linear = (instMat * vec4<f32>(input.position, 0.0)).xyz;\n return emit(rteWorldPosition(linear, RteDrawableUniform(\n inst.anchorHigh, inst.anchorLow,\n )));\n }\n\n @vertex\n fn vs_shadow_textured(input: FlatIn) -> ShadowOut {\n let linear = (draw.model * vec4<f32>(input.position, 0.0)).xyz;\n return emit(rteWorldPosition(linear, RteDrawableUniform(draw.originHigh, draw.originLow)));\n }\n\n // Clipped variant: discard before the depth write, so a clipped-away\n // occluder leaves the shadow map untouched. Kept byte-for-byte in step\n // with the fs_main section/clip-box branches.\n @fragment\n fn fs_shadow_clip(@location(0) worldPos: vec3<f32>) {\n if ((clip.flags.x & 1u) == 1u) {\n let side = select(1.0, -1.0, (clip.flags.x & 2u) == 2u);\n let distToPlane = (dot(worldPos, clip.sectionPlane.xyz) - clip.sectionPlane.w) * side;\n if (distToPlane > 0.0) {\n discard;\n }\n }\n if ((clip.flags.x & 4u) != 0u) {\n if (any(worldPos < clip.clipBoxMin.xyz) || any(worldPos > clip.clipBoxMax.xyz)) {\n discard;\n }\n }\n }\n";
31
31
  //# sourceMappingURL=shadow.wgsl.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shadow.wgsl.d.ts","sourceRoot":"","sources":["../../src/shaders/shadow.wgsl.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,eAAO,MAAM,kBAAkB,+6LA4H9B,CAAC"}
1
+ {"version":3,"file":"shadow.wgsl.d.ts","sourceRoot":"","sources":["../../src/shaders/shadow.wgsl.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,eAAO,MAAM,kBAAkB,w7LA4H9B,CAAC"}
@@ -75,10 +75,10 @@ export const shadowShaderSource = `
75
75
  @location(5) m2: vec4<f32>,
76
76
  @location(6) m3: vec4<f32>,
77
77
  // Per-occurrence flags lane (bit 1 = hidden), same instance buffer the
78
- // colour pass reads. Locations 7 (entityId) and 8 (rgba) are unused by
79
- // the depth pass and left unbound.
78
+ // colour pass reads. Locations 7 (entityId) and 8 (rgba) are in the
79
+ // shared layout but unused by the depth pass.
80
80
  @location(9) flags: u32,
81
- // V2 split drawable-minus-camera delta, byte offsets 88 and 104.
81
+ // Split drawable-minus-camera delta from the slot-2 delta stream.
82
82
  @location(10) anchorHigh: vec4<f32>,
83
83
  @location(11) anchorLow: vec4<f32>,
84
84
  }
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Specular reflection for the geometry fragment stage (#5386).
3
+ *
4
+ * Two terms, both in the units of `fs_main`'s `lightTerm`, so the caller
5
+ * scales them by the same exposure and `IRRADIANCE_CALIBRATION` as the
6
+ * diffuse light and every preset stays consistent:
7
+ *
8
+ * - the sun: a Cook-Torrance lobe (GGX distribution, Smith-Schlick
9
+ * visibility, Schlick Fresnel). `fs_main` lights a Lambertian albedo as
10
+ * `albedo * intensity`, i.e. the sun's irradiance is `pi * intensity`, so
11
+ * the lobe is scaled by the same `pi` and a white dielectric reflects no
12
+ * more than physics allows next to its diffuse.
13
+ * - the environment: the same two-colour hemisphere that lights the diffuse
14
+ * ambient, read along the reflection vector and weighted by the
15
+ * split-sum environment BRDF (Karis's analytic fit, "Physically Based
16
+ * Shading on Mobile", 2014). The fit already accounts for the lobe's
17
+ * shadowing, so a rough surface picks up almost nothing at grazing angles
18
+ * while a smooth one (glass) turns into a mirror there.
19
+ *
20
+ * `reflectance` is that directional albedo of the specular lobe. The caller
21
+ * takes it off the diffuse (`1 - reflectance`), so a highlight never adds
22
+ * energy on top of a full diffuse, and glass uses it as the light it no
23
+ * longer transmits.
24
+ *
25
+ * Reads the `env` lighting uniform, like `sunShadowFactor`.
26
+ */
27
+ /**
28
+ * Smallest roughness the lobe is evaluated at. Below this the GGX peak is a
29
+ * sub-pixel spike that flickers from frame to frame. The value is Filament's
30
+ * `MIN_PERCEPTUAL_ROUGHNESS` for 32-bit floats.
31
+ */
32
+ export declare const MIN_SPECULAR_ROUGHNESS = 0.045;
33
+ export declare const specularWgsl = "\n const MIN_SPECULAR_ROUGHNESS: f32 = 0.045;\n const DIELECTRIC_F0: f32 = 0.04;\n const PI: f32 = 3.14159265;\n\n fn fresnelSchlick(cosTheta: f32, F0: vec3<f32>) -> vec3<f32> {\n return F0 + (1.0 - F0) * pow(clamp(1.0 - cosTheta, 0.0, 1.0), 5.0);\n }\n\n fn distributionGGX(NdotH: f32, roughness: f32) -> f32 {\n let a = roughness * roughness;\n let a2 = a * a;\n let NdotH2 = NdotH * NdotH;\n let denomBase = (NdotH2 * (a2 - 1.0) + 1.0);\n return a2 / max(PI * denomBase * denomBase, 0.0000001);\n }\n\n fn geometrySchlickGGX(NdotV: f32, roughness: f32) -> f32 {\n let r = (roughness + 1.0);\n let k = (r * r) / 8.0;\n return NdotV / max(NdotV * (1.0 - k) + k, 0.0000001);\n }\n\n fn geometrySmith(NdotV: f32, NdotL: f32, roughness: f32) -> f32 {\n return geometrySchlickGGX(NdotL, roughness) * geometrySchlickGGX(NdotV, roughness);\n }\n\n // Split-sum environment BRDF, analytic fit (Karis 2014).\n fn envBrdfApprox(F0: vec3<f32>, roughness: f32, NdotV: f32) -> vec3<f32> {\n let r = roughness * vec4<f32>(-1.0, -0.0275, -0.572, 0.022) + vec4<f32>(1.0, 0.0425, 1.04, -0.04);\n let a004 = min(r.x * r.x, exp2(-9.28 * NdotV)) * r.x + r.y;\n let ab = vec2<f32>(-1.04, 1.04) * a004 + r.zw;\n return F0 * ab.x + ab.y;\n }\n\n struct SurfaceSpecular {\n // Reflected light, in lightTerm units (unexposed, uncalibrated).\n light: vec3<f32>,\n // Directional albedo of the specular lobe for this view.\n reflectance: vec3<f32>,\n }\n\n // N and V are unit vectors; V points from the surface to the eye.\n // sunLight is the sun's diffuse-equivalent intensity: sunColor *\n // sunIntensity * sunShadow, exactly what scales the diffuse sun term.\n fn surfaceSpecular(\n N: vec3<f32>,\n V: vec3<f32>,\n albedo: vec3<f32>,\n metallic: f32,\n roughnessIn: f32,\n sunLight: vec3<f32>,\n ) -> SurfaceSpecular {\n var out: SurfaceSpecular;\n let NdotV = dot(N, V);\n // A face turned away from the eye is its back side: nothing it\n // reflects can reach the eye, and its diffuse keeps full weight.\n if (NdotV <= 0.0) {\n out.light = vec3<f32>(0.0);\n out.reflectance = vec3<f32>(0.0);\n return out;\n }\n let roughness = clamp(roughnessIn, MIN_SPECULAR_ROUGHNESS, 1.0);\n let F0 = mix(vec3<f32>(DIELECTRIC_F0), albedo, metallic);\n\n let L = env.sunDirection;\n let rawNdotL = dot(N, L);\n let NdotL = max(rawNdotL, 0.0);\n // A face the sun is behind (rawNdotL <= 0) contributes nothing to\n // the direct lobe anyway (NdotL clamps it to 0 below), but V + L\n // can be exactly zero there \u2014 the sun exactly opposite the eye\n // reflection, e.g. N = V = (0,-1,0), sun = (0,1,0), both satisfy\n // NdotV > 0 above. normalize(vec3(0)) is NaN in WGSL, and NaN * 0\n // is NaN, not 0, so it would poison sun and everything summed with\n // it instead of being multiplied away. Skip the half-vector\n // entirely in that case rather than relying on the NdotL factor.\n var sun = vec3<f32>(0.0);\n if (rawNdotL > 0.0) {\n let H = normalize(V + L);\n let D = distributionGGX(max(dot(N, H), 0.0), roughness);\n let G = geometrySmith(NdotV, NdotL, roughness);\n let F = fresnelSchlick(max(dot(V, H), 0.0), F0);\n // BRDF * NdotL * (pi * intensity); the NdotL cancels the BRDF's.\n sun = F * (D * G * PI / (4.0 * NdotV)) * sunLight;\n }\n\n // The hemisphere ambient, looked up along the reflection. A rough\n // lobe gathers from around the normal, so lean the lookup toward N.\n let R = reflect(-V, N);\n let Rd = normalize(mix(R, N, roughness * roughness));\n let sky = mix(env.groundColor, env.skyColor, Rd.y * 0.5 + 0.5) * env.ambientIntensity;\n let reflectance = envBrdfApprox(F0, roughness, NdotV);\n\n out.light = sun + sky * reflectance;\n out.reflectance = reflectance;\n return out;\n }\n";
34
+ //# sourceMappingURL=specular.wgsl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"specular.wgsl.d.ts","sourceRoot":"","sources":["../../src/shaders/specular.wgsl.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,QAAQ,CAAC;AAE5C,eAAO,MAAM,YAAY,u1IAiGxB,CAAC"}
@@ -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 +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,CAoEtB"}
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,CAqEtB"}
@@ -119,6 +119,7 @@ export function collectShadowOccluders(sources, visibility, options) {
119
119
  instanceBuffer: it.instanceBuffer,
120
120
  instanceCount: it.instanceCount,
121
121
  canonicalAnchors: it.canonicalAnchors,
122
+ rteDeltas: it.rteDeltas,
122
123
  });
123
124
  }
124
125
  for (const tm of sources.textured) {
@@ -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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"}
@@ -80,7 +80,6 @@ export declare class ShadowPass {
80
80
  private createDrawBindGroup;
81
81
  private posBuffer;
82
82
  private quantBuffer;
83
- private instanceBuffer;
84
83
  private createPipeline;
85
84
  }
86
85
  //# sourceMappingURL=shadow-pass.d.ts.map
@@ -1 +1 @@
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"}
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;AAMvC,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;IAgHP,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;CA2CvB"}