@jbrowse/render-core 4.3.0 → 5.0.0-beta.10

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 (352) hide show
  1. package/esm/RenderCanvas.d.ts +2 -2
  2. package/esm/RenderLifecycleMixin.d.ts +52 -20
  3. package/esm/RenderLifecycleMixin.js +89 -23
  4. package/esm/canvas2dUtils.d.ts +90 -23
  5. package/esm/canvas2dUtils.js +119 -36
  6. package/esm/colorRampLut.d.ts +5 -5
  7. package/esm/colorRampLut.js +6 -6
  8. package/esm/computePipeline.d.ts +14 -0
  9. package/esm/computePipeline.js +62 -0
  10. package/esm/contractReports.d.ts +54 -0
  11. package/esm/contractReports.js +112 -0
  12. package/esm/coverageBand.d.ts +13 -8
  13. package/esm/coverageBand.js +15 -5
  14. package/esm/coverageBandBuffers.d.ts +2 -9
  15. package/esm/coverageBandBuffers.js +1 -13
  16. package/esm/createRenderingBackend.d.ts +14 -18
  17. package/esm/createRenderingBackend.js +4 -2
  18. package/esm/displayPhase.d.ts +83 -104
  19. package/esm/displayPhase.js +42 -82
  20. package/esm/encodeMemo.d.ts +14 -0
  21. package/esm/encodeMemo.js +48 -0
  22. package/esm/gpuContextLostError.d.ts +30 -0
  23. package/esm/gpuContextLostError.js +40 -0
  24. package/esm/gpuDevice.d.ts +29 -10
  25. package/esm/gpuDevice.js +35 -16
  26. package/esm/graphicsCapabilities.d.ts +27 -19
  27. package/esm/graphicsCapabilities.js +40 -18
  28. package/esm/hal/createHal.d.ts +4 -5
  29. package/esm/hal/createHal.js +14 -4
  30. package/esm/hal/deviceGpuCache.d.ts +25 -30
  31. package/esm/hal/deviceGpuCache.js +88 -97
  32. package/esm/hal/gpuHalBase.d.ts +5 -4
  33. package/esm/hal/gpuHalBase.js +25 -14
  34. package/esm/hal/index.d.ts +2 -2
  35. package/esm/hal/index.js +1 -1
  36. package/esm/hal/mockHal.d.ts +15 -10
  37. package/esm/hal/mockHal.js +31 -18
  38. package/esm/hal/oomReporter.d.ts +7 -0
  39. package/esm/hal/oomReporter.js +10 -0
  40. package/esm/hal/passIds.d.ts +8 -7
  41. package/esm/hal/passIds.js +11 -10
  42. package/esm/hal/regionRegistry.d.ts +0 -1
  43. package/esm/hal/regionRegistry.js +3 -15
  44. package/esm/hal/types.d.ts +55 -18
  45. package/esm/hal/webgl2Hal.d.ts +23 -6
  46. package/esm/hal/webgl2Hal.js +161 -155
  47. package/esm/hal/webgpuHal.d.ts +29 -13
  48. package/esm/hal/webgpuHal.js +221 -153
  49. package/esm/installUpload.d.ts +16 -3
  50. package/esm/installUpload.js +13 -41
  51. package/esm/instanceCache.d.ts +10 -7
  52. package/esm/instanceCache.js +14 -15
  53. package/esm/instancePass.d.ts +2 -1
  54. package/esm/mapUploadSync.d.ts +2 -10
  55. package/esm/mapUploadSync.js +2 -3
  56. package/esm/marks/barMark.d.ts +30 -0
  57. package/esm/marks/barMark.js +149 -0
  58. package/esm/marks/colorFill.d.ts +17 -0
  59. package/esm/marks/colorFill.js +26 -0
  60. package/esm/marks/drawAgainstHit.d.ts +113 -0
  61. package/esm/marks/drawAgainstHit.js +407 -0
  62. package/esm/marks/ellipseDistance.d.ts +10 -0
  63. package/esm/marks/ellipseDistance.js +136 -0
  64. package/esm/marks/glyphPaint.d.ts +36 -0
  65. package/esm/marks/glyphPaint.js +77 -0
  66. package/esm/marks/index.d.ts +33 -0
  67. package/esm/marks/index.js +20 -0
  68. package/esm/marks/lineMark.d.ts +37 -0
  69. package/esm/marks/lineMark.js +416 -0
  70. package/esm/marks/linkMark.d.ts +76 -0
  71. package/esm/marks/linkMark.js +585 -0
  72. package/esm/marks/markBackend.d.ts +118 -0
  73. package/esm/marks/markBackend.js +196 -0
  74. package/esm/marks/markHit.d.ts +32 -0
  75. package/esm/marks/markHit.js +61 -0
  76. package/esm/marks/markInk.d.ts +18 -0
  77. package/esm/marks/markInk.js +71 -0
  78. package/esm/marks/markPaint.d.ts +14 -0
  79. package/esm/marks/markPaint.js +32 -0
  80. package/esm/marks/markPlan.d.ts +25 -0
  81. package/esm/marks/markPlan.js +20 -0
  82. package/esm/marks/markRamp.d.ts +72 -0
  83. package/esm/marks/markRamp.js +197 -0
  84. package/esm/marks/nearestMarkHit.d.ts +55 -0
  85. package/esm/marks/nearestMarkHit.js +158 -0
  86. package/esm/marks/pathRecorder.d.ts +14 -0
  87. package/esm/marks/pathRecorder.js +80 -0
  88. package/esm/marks/pointMark.d.ts +42 -0
  89. package/esm/marks/pointMark.js +125 -0
  90. package/esm/marks/rowLane.d.ts +39 -0
  91. package/esm/marks/rowLane.js +41 -0
  92. package/esm/marks/rowSpanIndex.d.ts +29 -0
  93. package/esm/marks/rowSpanIndex.js +141 -0
  94. package/esm/marks/rowTable.d.ts +41 -0
  95. package/esm/marks/rowTable.js +75 -0
  96. package/esm/marks/ruleMark.d.ts +21 -0
  97. package/esm/marks/ruleMark.js +91 -0
  98. package/esm/marks/spanMark.d.ts +42 -0
  99. package/esm/marks/spanMark.js +81 -0
  100. package/esm/marks/types.d.ts +261 -0
  101. package/esm/marks/types.js +175 -0
  102. package/esm/marks/valueScale.d.ts +23 -0
  103. package/esm/marks/valueScale.js +11 -0
  104. package/esm/namedReactions.d.ts +3 -4
  105. package/esm/namedReactions.js +3 -4
  106. package/esm/perRegionRenderingBackend.d.ts +21 -3
  107. package/esm/perRegionRenderingBackend.js +37 -3
  108. package/esm/regionDataMap.d.ts +2 -2
  109. package/esm/regionDataMap.js +25 -23
  110. package/esm/renderBlock.d.ts +14 -0
  111. package/esm/renderBlock.js +25 -0
  112. package/esm/renderingBackendBase.d.ts +20 -14
  113. package/esm/renderingBackendBase.js +12 -7
  114. package/esm/scoreScale.d.ts +27 -0
  115. package/esm/scoreScale.js +88 -0
  116. package/esm/shaders/barMark.generated.d.ts +3 -0
  117. package/esm/shaders/barMark.generated.js +7 -0
  118. package/esm/shaders/barMark.glsl.generated.d.ts +2 -0
  119. package/esm/shaders/barMark.glsl.generated.js +4 -0
  120. package/esm/shaders/barMark.iface.generated.d.ts +90 -0
  121. package/esm/shaders/barMark.iface.generated.js +205 -0
  122. package/esm/shaders/barMark.wgsl.generated.d.ts +1 -0
  123. package/esm/shaders/barMark.wgsl.generated.js +3 -0
  124. package/esm/shaders/capsule.js.generated.d.ts +1 -0
  125. package/esm/shaders/capsule.js.generated.js +11 -0
  126. package/esm/shaders/clipStrip.generated.d.ts +2 -0
  127. package/esm/shaders/clipStrip.generated.js +4 -0
  128. package/esm/shaders/clipStrip.js.generated.d.ts +1 -0
  129. package/esm/shaders/clipStrip.js.generated.js +21 -0
  130. package/esm/shaders/colorRampLut.js.generated.d.ts +1 -0
  131. package/esm/shaders/colorRampLut.js.generated.js +17 -0
  132. package/esm/shaders/coverageBar.generated.d.ts +2 -3
  133. package/esm/shaders/coverageBar.generated.js +4 -3
  134. package/esm/shaders/coverageBar.glsl.generated.d.ts +2 -0
  135. package/esm/shaders/coverageBar.glsl.generated.js +4 -0
  136. package/esm/shaders/coverageBar.iface.generated.js +1 -1
  137. package/esm/shaders/coverageBar.wgsl.generated.d.ts +1 -0
  138. package/esm/shaders/coverageBar.wgsl.generated.js +3 -0
  139. package/esm/shaders/coverageClip.generated.d.ts +3 -0
  140. package/esm/shaders/coverageClip.generated.js +7 -0
  141. package/esm/shaders/coverageClip.glsl.generated.d.ts +2 -0
  142. package/esm/shaders/coverageClip.glsl.generated.js +4 -0
  143. package/esm/shaders/coverageClip.iface.generated.d.ts +85 -0
  144. package/esm/shaders/coverageClip.iface.generated.js +114 -0
  145. package/esm/shaders/coverageClip.wgsl.generated.d.ts +1 -0
  146. package/esm/shaders/coverageClip.wgsl.generated.js +3 -0
  147. package/esm/shaders/coverageIndicator.generated.d.ts +2 -3
  148. package/esm/shaders/coverageIndicator.generated.js +4 -3
  149. package/esm/shaders/coverageIndicator.glsl.generated.d.ts +2 -0
  150. package/esm/shaders/coverageIndicator.glsl.generated.js +4 -0
  151. package/esm/shaders/coverageIndicator.iface.generated.js +1 -1
  152. package/esm/shaders/coverageIndicator.wgsl.generated.d.ts +1 -0
  153. package/esm/shaders/coverageIndicator.wgsl.generated.js +3 -0
  154. package/esm/shaders/coverageInterbase.generated.d.ts +2 -3
  155. package/esm/shaders/coverageInterbase.generated.js +4 -3
  156. package/esm/shaders/coverageInterbase.glsl.generated.d.ts +2 -0
  157. package/esm/shaders/coverageInterbase.glsl.generated.js +4 -0
  158. package/esm/shaders/coverageInterbase.iface.generated.js +1 -1
  159. package/esm/shaders/coverageInterbase.wgsl.generated.d.ts +1 -0
  160. package/esm/shaders/coverageInterbase.wgsl.generated.js +3 -0
  161. package/esm/shaders/coverageMod.generated.d.ts +2 -3
  162. package/esm/shaders/coverageMod.generated.js +4 -3
  163. package/esm/shaders/coverageMod.glsl.generated.d.ts +2 -0
  164. package/esm/shaders/coverageMod.glsl.generated.js +4 -0
  165. package/esm/shaders/coverageMod.iface.generated.js +1 -1
  166. package/esm/shaders/coverageMod.wgsl.generated.d.ts +1 -0
  167. package/esm/shaders/coverageMod.wgsl.generated.js +3 -0
  168. package/esm/shaders/coverageSnp.generated.d.ts +2 -3
  169. package/esm/shaders/coverageSnp.generated.js +4 -3
  170. package/esm/shaders/coverageSnp.glsl.generated.d.ts +2 -0
  171. package/esm/shaders/coverageSnp.glsl.generated.js +4 -0
  172. package/esm/shaders/coverageSnp.iface.generated.js +1 -1
  173. package/esm/shaders/coverageSnp.wgsl.generated.d.ts +1 -0
  174. package/esm/shaders/coverageSnp.wgsl.generated.js +3 -0
  175. package/esm/shaders/curveDistance.js.generated.d.ts +5 -0
  176. package/esm/shaders/curveDistance.js.generated.js +87 -0
  177. package/esm/shaders/hpmath.js.generated.d.ts +2 -1
  178. package/esm/shaders/hpmath.js.generated.js +5 -2
  179. package/esm/shaders/lineCenterMark.generated.d.ts +3 -0
  180. package/esm/shaders/lineCenterMark.generated.js +7 -0
  181. package/esm/shaders/lineCenterMark.glsl.generated.d.ts +2 -0
  182. package/esm/shaders/lineCenterMark.glsl.generated.js +4 -0
  183. package/esm/shaders/lineCenterMark.iface.generated.d.ts +104 -0
  184. package/esm/shaders/lineCenterMark.iface.generated.js +237 -0
  185. package/esm/shaders/lineCenterMark.wgsl.generated.d.ts +1 -0
  186. package/esm/shaders/lineCenterMark.wgsl.generated.js +3 -0
  187. package/esm/shaders/lineCommon.generated.d.ts +2 -0
  188. package/esm/shaders/lineCommon.generated.js +4 -0
  189. package/esm/shaders/lineStepMark.generated.d.ts +3 -0
  190. package/esm/shaders/lineStepMark.generated.js +7 -0
  191. package/esm/shaders/lineStepMark.glsl.generated.d.ts +2 -0
  192. package/esm/shaders/lineStepMark.glsl.generated.js +4 -0
  193. package/esm/shaders/lineStepMark.iface.generated.d.ts +98 -0
  194. package/esm/shaders/lineStepMark.iface.generated.js +225 -0
  195. package/esm/shaders/lineStepMark.wgsl.generated.d.ts +1 -0
  196. package/esm/shaders/lineStepMark.wgsl.generated.js +3 -0
  197. package/esm/shaders/linkMark.consts.generated.d.ts +14 -0
  198. package/esm/shaders/linkMark.consts.generated.js +16 -0
  199. package/esm/shaders/linkMark.generated.d.ts +4 -0
  200. package/esm/shaders/linkMark.generated.js +8 -0
  201. package/esm/shaders/linkMark.glsl.generated.d.ts +2 -0
  202. package/esm/shaders/linkMark.glsl.generated.js +4 -0
  203. package/esm/shaders/linkMark.iface.generated.d.ts +142 -0
  204. package/esm/shaders/linkMark.iface.generated.js +1829 -0
  205. package/esm/shaders/linkMark.js.generated.d.ts +7 -0
  206. package/esm/shaders/linkMark.js.generated.js +159 -0
  207. package/esm/shaders/linkMark.wgsl.generated.d.ts +1 -0
  208. package/esm/shaders/linkMark.wgsl.generated.js +3 -0
  209. package/esm/shaders/markColor.generated.d.ts +9 -0
  210. package/esm/shaders/markColor.generated.js +11 -0
  211. package/esm/shaders/pointGlyph.js.generated.d.ts +2 -0
  212. package/esm/shaders/pointGlyph.js.generated.js +15 -0
  213. package/esm/shaders/pointMark.consts.generated.d.ts +7 -0
  214. package/esm/shaders/pointMark.consts.generated.js +9 -0
  215. package/esm/shaders/pointMark.generated.d.ts +4 -0
  216. package/esm/shaders/pointMark.generated.js +8 -0
  217. package/esm/shaders/pointMark.glsl.generated.d.ts +2 -0
  218. package/esm/shaders/pointMark.glsl.generated.js +4 -0
  219. package/esm/shaders/pointMark.iface.generated.d.ts +98 -0
  220. package/esm/shaders/pointMark.iface.generated.js +219 -0
  221. package/esm/shaders/pointMark.js.generated.d.ts +3 -0
  222. package/esm/shaders/pointMark.js.generated.js +93 -0
  223. package/esm/shaders/pointMark.wgsl.generated.d.ts +1 -0
  224. package/esm/shaders/pointMark.wgsl.generated.js +3 -0
  225. package/esm/shaders/rowRect.generated.d.ts +0 -1
  226. package/esm/shaders/rowRect.generated.js +0 -1
  227. package/esm/shaders/rowTable.generated.d.ts +1 -0
  228. package/esm/shaders/rowTable.generated.js +3 -0
  229. package/esm/shaders/rowTable.js.generated.d.ts +5 -0
  230. package/esm/shaders/rowTable.js.generated.js +29 -0
  231. package/esm/shaders/scoreScale.generated.d.ts +2 -0
  232. package/esm/shaders/scoreScale.generated.js +4 -0
  233. package/esm/shaders/scoreScale.js.generated.d.ts +1 -0
  234. package/esm/shaders/scoreScale.js.generated.js +50 -23
  235. package/esm/shaders/spanMark.generated.d.ts +3 -0
  236. package/esm/shaders/spanMark.generated.js +7 -0
  237. package/esm/shaders/spanMark.glsl.generated.d.ts +2 -0
  238. package/esm/shaders/spanMark.glsl.generated.js +4 -0
  239. package/esm/shaders/spanMark.iface.generated.d.ts +81 -0
  240. package/esm/shaders/spanMark.iface.generated.js +215 -0
  241. package/esm/shaders/spanMark.wgsl.generated.d.ts +1 -0
  242. package/esm/shaders/spanMark.wgsl.generated.js +3 -0
  243. package/esm/sharedBackendKey.d.ts +18 -0
  244. package/esm/{keyedRenderingBackend.js → sharedBackendKey.js} +5 -0
  245. package/esm/slangPass.d.ts +18 -11
  246. package/esm/slangPass.js +12 -4
  247. package/esm/useGraphicsCapabilities.d.ts +1 -1
  248. package/esm/useGraphicsCapabilities.js +1 -1
  249. package/esm/useRenderingBackend.d.ts +13 -13
  250. package/esm/useRenderingBackend.js +58 -20
  251. package/esm/webgpuUtils.d.ts +3 -11
  252. package/esm/webgpuUtils.js +12 -33
  253. package/package.json +32 -7
  254. package/src/shaders/antialias.slang +46 -0
  255. package/src/shaders/arcHull.test.ts +267 -0
  256. package/src/shaders/barMark.generated.ts +11 -0
  257. package/src/shaders/barMark.glsl.generated.ts +6 -0
  258. package/src/shaders/barMark.iface.generated.ts +285 -0
  259. package/src/shaders/barMark.slang +167 -0
  260. package/src/shaders/barMark.wgsl.generated.ts +4 -0
  261. package/src/shaders/capsule.js.generated.ts +14 -0
  262. package/src/shaders/capsule.slang +12 -4
  263. package/src/shaders/clipStrip.generated.ts +6 -0
  264. package/src/shaders/clipStrip.js.generated.ts +22 -0
  265. package/src/shaders/clipStrip.slang +34 -0
  266. package/src/shaders/clipStrip.test.ts +39 -0
  267. package/src/shaders/colorPack.slang +5 -1
  268. package/src/shaders/colorRampLut.js.generated.ts +22 -0
  269. package/src/shaders/colorRampLut.slang +15 -1
  270. package/src/shaders/coverageBand.slang +64 -32
  271. package/src/shaders/coverageBar.generated.ts +6 -5
  272. package/src/shaders/coverageBar.glsl.generated.ts +6 -0
  273. package/src/shaders/coverageBar.iface.generated.ts +1 -1
  274. package/src/shaders/coverageBar.slang +10 -10
  275. package/src/shaders/coverageBar.wgsl.generated.ts +4 -0
  276. package/src/shaders/coverageClip.generated.ts +11 -0
  277. package/src/shaders/coverageClip.glsl.generated.ts +6 -0
  278. package/src/shaders/coverageClip.iface.generated.ts +172 -0
  279. package/src/shaders/coverageClip.slang +38 -0
  280. package/src/shaders/coverageClip.wgsl.generated.ts +4 -0
  281. package/src/shaders/coverageIndicator.generated.ts +6 -5
  282. package/src/shaders/coverageIndicator.glsl.generated.ts +6 -0
  283. package/src/shaders/coverageIndicator.iface.generated.ts +1 -1
  284. package/src/shaders/coverageIndicator.wgsl.generated.ts +4 -0
  285. package/src/shaders/coverageInterbase.generated.ts +6 -5
  286. package/src/shaders/coverageInterbase.glsl.generated.ts +6 -0
  287. package/src/shaders/coverageInterbase.iface.generated.ts +1 -1
  288. package/src/shaders/coverageInterbase.wgsl.generated.ts +4 -0
  289. package/src/shaders/coverageMod.generated.ts +6 -5
  290. package/src/shaders/coverageMod.glsl.generated.ts +6 -0
  291. package/src/shaders/coverageMod.iface.generated.ts +1 -1
  292. package/src/shaders/coverageMod.wgsl.generated.ts +4 -0
  293. package/src/shaders/coverageSnp.generated.ts +6 -5
  294. package/src/shaders/coverageSnp.glsl.generated.ts +6 -0
  295. package/src/shaders/coverageSnp.iface.generated.ts +1 -1
  296. package/src/shaders/coverageSnp.wgsl.generated.ts +4 -0
  297. package/src/shaders/curveDistance.js.generated.ts +91 -0
  298. package/src/shaders/curveDistance.slang +265 -0
  299. package/src/shaders/hpClampFloor.test.ts +87 -0
  300. package/src/shaders/hpmath.js.generated.ts +6 -2
  301. package/src/shaders/hpmath.slang +100 -48
  302. package/src/shaders/insetValueScale.test.ts +67 -0
  303. package/src/shaders/lineCenterMark.generated.ts +11 -0
  304. package/src/shaders/lineCenterMark.glsl.generated.ts +6 -0
  305. package/src/shaders/lineCenterMark.iface.generated.ts +328 -0
  306. package/src/shaders/lineCenterMark.slang +127 -0
  307. package/src/shaders/lineCenterMark.wgsl.generated.ts +4 -0
  308. package/src/shaders/lineCommon.generated.ts +6 -0
  309. package/src/shaders/lineCommon.slang +102 -0
  310. package/src/shaders/lineStepMark.generated.ts +11 -0
  311. package/src/shaders/lineStepMark.glsl.generated.ts +6 -0
  312. package/src/shaders/lineStepMark.iface.generated.ts +311 -0
  313. package/src/shaders/lineStepMark.slang +125 -0
  314. package/src/shaders/lineStepMark.wgsl.generated.ts +4 -0
  315. package/src/shaders/linkMark.consts.generated.ts +30 -0
  316. package/src/shaders/linkMark.generated.ts +12 -0
  317. package/src/shaders/linkMark.glsl.generated.ts +6 -0
  318. package/src/shaders/linkMark.iface.generated.ts +1954 -0
  319. package/src/shaders/linkMark.js.generated.ts +167 -0
  320. package/src/shaders/linkMark.slang +439 -0
  321. package/src/shaders/linkMark.wgsl.generated.ts +4 -0
  322. package/src/shaders/markColor.generated.ts +20 -0
  323. package/src/shaders/markColor.slang +128 -0
  324. package/src/shaders/pointGlyph.js.generated.ts +20 -0
  325. package/src/shaders/pointGlyph.slang +23 -7
  326. package/src/shaders/pointGlyphPad.test.ts +242 -0
  327. package/src/shaders/pointMark.consts.generated.ts +16 -0
  328. package/src/shaders/pointMark.generated.ts +12 -0
  329. package/src/shaders/pointMark.glsl.generated.ts +6 -0
  330. package/src/shaders/pointMark.iface.generated.ts +304 -0
  331. package/src/shaders/pointMark.js.generated.ts +99 -0
  332. package/src/shaders/pointMark.slang +227 -0
  333. package/src/shaders/pointMark.wgsl.generated.ts +4 -0
  334. package/src/shaders/rowRect.generated.ts +0 -2
  335. package/src/shaders/rowRect.slang +39 -58
  336. package/src/shaders/rowTable.generated.ts +4 -0
  337. package/src/shaders/rowTable.js.generated.ts +37 -0
  338. package/src/shaders/rowTable.slang +98 -0
  339. package/src/shaders/scoreScale.generated.ts +6 -0
  340. package/src/shaders/scoreScale.js.generated.ts +48 -23
  341. package/src/shaders/scoreScale.slang +49 -55
  342. package/src/shaders/sdEllipse.test.ts +211 -0
  343. package/src/shaders/spanMark.generated.ts +11 -0
  344. package/src/shaders/spanMark.glsl.generated.ts +6 -0
  345. package/src/shaders/spanMark.iface.generated.ts +289 -0
  346. package/src/shaders/spanMark.slang +77 -0
  347. package/src/shaders/spanMark.wgsl.generated.ts +4 -0
  348. package/src/shaders/valueScale.slang +26 -0
  349. package/src/shaders/wideCircleLeg.test.ts +85 -0
  350. package/esm/globalRenderingBackend.d.ts +0 -90
  351. package/esm/globalRenderingBackend.js +0 -53
  352. package/esm/keyedRenderingBackend.d.ts +0 -41
@@ -0,0 +1,11 @@
1
+ // AUTO-GENERATED by packages/shader-tools/src/shader-codegen from lineCenterMark.slang.
2
+ // Do not edit. Run `pnpm gen:shaders` to regenerate.
3
+
4
+ import type { ShaderSource } from '@jbrowse/render-core/hal'
5
+
6
+ export * from './lineCenterMark.iface.generated.ts'
7
+
8
+ export const SOURCE: ShaderSource = {
9
+ wgsl: () => import('./lineCenterMark.wgsl.generated.ts'),
10
+ glsl: () => import('./lineCenterMark.glsl.generated.ts'),
11
+ }
@@ -0,0 +1,6 @@
1
+ // AUTO-GENERATED by packages/shader-tools/src/shader-codegen from lineCenterMark.slang.
2
+ // Do not edit. Run `pnpm gen:shaders` to regenerate.
3
+
4
+ export const GLSL_VERTEX = "#version 300 es\nprecision highp float;\nprecision highp int;\nprecision highp sampler2D;\n\n\n\nlayout(std140) uniform Uniforms\n{\n vec3 bpRangeX_0;\n float canvasHeight_0;\n float domainMin_0;\n float domainMax_0;\n int valueScaleType_0;\n float valueSymlogConstant_0;\n int rampMode_0;\n float rampMin_0;\n float rampMax_0;\n float rampMidNorm_0;\n int colorCutCount_0;\n vec4 colorCuts_0[2];\n vec4 colorBands_0[9];\n float rowHeight_0;\n float rowBandPx_0;\n float rowOffsetPx_0;\n float origin_0;\n float lineWidth_0;\n float zero_0;\n float viewportWidth_0;\n float devicePixelRatio_0;\n int rowTableKeys_0;\n}u_0;\n\nuniform sampler2D u_colorRamp;\n\n\nuniform sampler2D u_rowTable;\n\n\nvec4 unpackRGBA_0(uint c_0)\n{\n\n return vec4(float((c_0 >> 0U) & 255U), float((c_0 >> 8U) & 255U), float((c_0 >> 16U) & 255U), float((c_0 >> 24U) & 255U)) / 255.0;\n}\n\n\nfloat rampMidT_0(float t_0, float mid_0)\n{\n\n float _S1 = max(mid_0, 1.0 - mid_0);\n return clamp((t_0 + (_S1 - mid_0)) / (2.0 * _S1), 0.0, 1.0);\n}\n\n\nfloat colorCutAt_0(int i_0, vec4 cutsLo_0, vec4 cutsHi_0)\n{\n\n float _S2;\n if(i_0 < 4)\n {\n\n _S2 = cutsLo_0[i_0];\n\n }\n else\n {\n\n _S2 = cutsHi_0[i_0 - 4];\n\n }\n\n return _S2;\n}\n\n\nint thresholdBand_0(float value_0, int cutCount_0, vec4 cutsLo_1, vec4 cutsHi_1)\n{\n\n int band_0 = 0;\n\n int i_1 = 0;\n\n for(;;)\n {\n\n if(i_1 < cutCount_0)\n {\n }\n else\n {\n\n break;\n }\n\n if(value_0 >= (colorCutAt_0(i_1, cutsLo_1, cutsHi_1)))\n {\n\n band_0 = i_1 + 1;\n\n }\n\n i_1 = i_1 + 1;\n\n }\n\n return band_0;\n}\n\n\nfloat log1pf_0(float x_0)\n{\n\n float u_1 = 1.0 + x_0;\n\n float _S3;\n if(u_1 == 1.0)\n {\n\n _S3 = x_0;\n\n }\n else\n {\n\n _S3 = log(u_1) * (x_0 / (u_1 - 1.0));\n\n }\n\n return _S3;\n}\n\nfloat symlogTransform_0(float x_1, float c_1)\n{\n\n return float((int(sign((x_1))))) * log1pf_0(abs(x_1 / c_1));\n}\n\n\nfloat normalizeScoreUnclamped_0(float score_0, float domainMin_1, float domainMax_1, int scaleType_0, float symlogConstant_0)\n{\n\n float tMax_0;\n\n float tMin_0;\n\n float t_1;\n\n\n\n if(scaleType_0 == 2)\n {\n\n float _S4 = symlogTransform_0(score_0, symlogConstant_0);\n float _S5 = symlogTransform_0(domainMin_1, symlogConstant_0);\n\n tMax_0 = symlogTransform_0(domainMax_1, symlogConstant_0);\n\n tMin_0 = _S5;\n\n t_1 = _S4;\n\n }\n else\n {\n\n if(scaleType_0 == 1)\n {\n if(domainMin_1 > 0.0)\n {\n\n tMax_0 = domainMin_1;\n\n }\n else\n {\n\n tMax_0 = 1.0;\n\n }\n float _S6 = log2(max(score_0, tMax_0));\n float _S7 = log2(tMax_0);\n\n tMax_0 = log2(max(domainMax_1, tMax_0));\n\n tMin_0 = _S7;\n\n t_1 = _S6;\n\n }\n else\n {\n\n tMax_0 = domainMax_1;\n\n tMin_0 = domainMin_1;\n\n t_1 = score_0;\n\n }\n\n }\n\n float tRange_0 = tMax_0 - tMin_0;\n if(tRange_0 <= 0.0)\n {\n\n if(t_1 > tMin_0)\n {\n\n tMax_0 = 1.0;\n\n }\n else\n {\n\n tMax_0 = 0.0;\n\n }\n\n return tMax_0;\n }\n return (t_1 - tMin_0) / tRange_0;\n}\n\nfloat normalizeScore_0(float score_1, float domainMin_2, float domainMax_2, int scaleType_1, float symlogConstant_1)\n{\n\n return clamp(normalizeScoreUnclamped_0(score_1, domainMin_2, domainMax_2, scaleType_1, symlogConstant_1), 0.0, 1.0);\n}\n\n\nuint rowTableWidth_0(uint keys_0)\n{\n\n return max(min(keys_0, 2048U), 1U);\n}\n\nuint rowTablePlaneHeight_0(uint keys_1)\n{\n\n uint w_0 = rowTableWidth_0(keys_1);\n uint _S8 = (keys_1 + w_0 - 1U) / w_0;\n\n return max(_S8, 1U);\n}\n\nuint rowTableTexelX_0(uint key_0, uint keys_2)\n{\n\n uint _S9 = key_0 % rowTableWidth_0(keys_2);\n\n return _S9;\n}\n\n\nuint rowTableTexelY_0(uint key_1, uint keys_3)\n{\n\n uint _S10 = key_1 / rowTableWidth_0(keys_3);\n\n return _S10;\n}\n\n\nuint byteOf_0(float channel_0)\n{\n\n return uint(channel_0 * 255.0 + 0.5);\n}\n\n\nvec2 hpSplitUint_0(uint value_1)\n{\n\n uint lo_0 = value_1 & 4095U;\n\n return vec2(float(value_1 - lo_0), float(lo_0));\n}\n\n\nfloat hpToClipX_0(vec2 splitPos_0, vec3 bpRange_0, float hpZero_0)\n{\n\n float floorBp_0 = -3.00000000549775576e+38 + hpZero_0;\n float step_0 = 2.0 / bpRange_0.z;\n\n\n return dot(vec3(-1.0, max(splitPos_0.x - bpRange_0.x, floorBp_0), max(splitPos_0.y - bpRange_0.y, floorBp_0)), vec3(1.0, step_0, step_0));\n}\n\n\nfloat rowBandTopPx_0(float rowOffsetPx_1, float rowHeight_1, uint slot_0)\n{\n\n return rowOffsetPx_1 + rowHeight_1 * float(slot_0);\n}\n\n\nfloat valueToYPxScaled_0(float value_2, float domainMin_3, float domainMax_3, float h_0, int scaleType_2, float symlogConstant_2)\n{\n\n return (1.0 - normalizeScore_0(value_2, domainMin_3, domainMax_3, scaleType_2, symlogConstant_2)) * h_0;\n}\n\n\nstruct CapsuleFrame_0\n{\n vec2 tangent_0;\n vec2 normal_0;\n};\n\n\nCapsuleFrame_0 capsuleFrame_0(vec2 delta_0, float len_0)\n{\n\n CapsuleFrame_0 f_0;\n\n vec2 _S11;\n if(len_0 > 0.00009999999747379)\n {\n\n _S11 = delta_0 / len_0;\n\n }\n else\n {\n\n _S11 = vec2(1.0, 0.0);\n\n }\n\n f_0.tangent_0 = _S11;\n f_0.normal_0 = vec2(- _S11.y, _S11.x);\n return f_0;\n}\n\n\nfloat aaPx_0(float dpr_0)\n{\n\n return 1.0 / max(dpr_0, 1.0);\n}\n\n\nfloat aaHalfPx_0(float dpr_1)\n{\n\n return 0.5 * aaPx_0(dpr_1);\n}\n\n\nvec2 quadLocal_0(uint vid_0)\n{\n\n uint v_0 = vid_0 % 6U;\n\n bool _S12 = v_0 == 0U;\n\n bool _S13;\n\n if(_S12)\n {\n\n _S13 = true;\n\n }\n else\n {\n\n _S13 = v_0 == 2U;\n\n }\n\n if(_S13)\n {\n\n _S13 = true;\n\n }\n else\n {\n\n _S13 = v_0 == 3U;\n\n }\n\n float _S14;\n\n if(_S13)\n {\n\n _S14 = 0.0;\n\n }\n else\n {\n\n _S14 = 1.0;\n\n }\n if(_S12)\n {\n\n _S13 = true;\n\n }\n else\n {\n\n _S13 = v_0 == 1U;\n\n }\n\n if(_S13)\n {\n\n _S13 = true;\n\n }\n else\n {\n\n _S13 = v_0 == 4U;\n\n }\n\n float _S15;\n\n if(_S13)\n {\n\n _S15 = 0.0;\n\n }\n else\n {\n\n _S15 = 1.0;\n\n }\n\n return vec2(_S14, _S15);\n}\n\n\nvec2 capsuleQuadLocal_0(uint vid_1, float halfLenPx_0, float halfWidthPx_0, float dpr_2)\n{\n\n float ext_0 = halfWidthPx_0 + aaHalfPx_0(dpr_2);\n vec2 q_0 = quadLocal_0(vid_1) * 2.0 - 1.0;\n return vec2(q_0.x * (halfLenPx_0 + ext_0), q_0.y * ext_0);\n}\n\n\nfloat pxToClipLen_0(float px_0, float size_0)\n{\n\n return px_0 * 2.0 / size_0;\n}\n\n\nfloat yPxToClipY_0(float yPx_0, float canvasHeight_1)\n{\n\n return 1.0 - yPx_0 / canvasHeight_1 * 2.0;\n}\n\n\nflat out vec4 v_color;\n\n\nout vec2 v_localPos;\n\n\nflat out float v_segHalfLen;\n\n\nflat out vec2 v_colorLine;\n\n\nflat out vec4 v_cutYsLo;\n\n\nflat out vec4 v_cutYsHi;\n\n\nlayout(location = 0)\nin uint a_x;\n\n\nlayout(location = 1)\nin uint a_x2;\n\n\nlayout(location = 2)\nin float a_y;\n\n\nlayout(location = 3)\nin uint a_color;\n\n\nlayout(location = 4)\nin uint a_row;\n\n\nlayout(location = 5)\nin uint a_prevX;\n\n\nlayout(location = 6)\nin uint a_prevX2;\n\n\nlayout(location = 7)\nin float a_prevY;\n\n\nstruct VsOut_0\n{\n vec4 position_0;\n vec4 color_0;\n vec2 localPos_0;\n float segHalfLen_0;\n vec2 colorLine_0;\n vec4 cutYsLo_0;\n vec4 cutYsHi_0;\n};\n\n\nvec4 rampColor_0(float _S16)\n{\n\n return (textureLod((u_colorRamp), (vec2((clamp(_S16, 0.0, 1.0) * 255.0 + 0.5) / 256.0, 0.5)), (0.0)));\n}\n\n\nvec4 markScaleColor_0(uint _S17, int _S18, float _S19, float _S20, float _S21, int _S22, vec4 _S23, vec4 _S24)\n{\n\n if(_S18 == 0)\n {\n\n return unpackRGBA_0(_S17);\n }\n if(_S17 == 2143289345U)\n {\n\n return unpackRGBA_0(4289703855U);\n }\n\n int scaleType_3;\n\n if((_S17 & 2139095040U) == 2139095040U)\n {\n\n if((_S17 & 8388607U) != 0U)\n {\n\n return unpackRGBA_0(4286611584U);\n }\n\n bool negative_0 = (_S17 & 2147483648U) != 0U;\n if(_S18 == 3)\n {\n\n if(negative_0)\n {\n\n scaleType_3 = 0;\n\n }\n else\n {\n\n scaleType_3 = _S22;\n\n }\n\n return u_0.colorBands_0[scaleType_3];\n }\n\n float _S25;\n\n if(negative_0)\n {\n\n _S25 = 0.0;\n\n }\n else\n {\n\n _S25 = 1.0;\n\n }\n\n return rampColor_0(rampMidT_0(_S25, _S21));\n }\n float value_3 = uintBitsToFloat(_S17);\n if(_S18 == 3)\n {\n\n return u_0.colorBands_0[thresholdBand_0(value_3, _S22, _S23, _S24)];\n }\n if(_S18 == 2)\n {\n\n scaleType_3 = 1;\n\n }\n else\n {\n\n scaleType_3 = 0;\n\n }\n return rampColor_0(rampMidT_0(normalizeScore_0(value_3, _S19, _S20, scaleType_3, 1.0), _S21));\n}\n\n\nstruct RowPlacement_0\n{\n bool hidden_0;\n uint slot_1;\n vec4 color_1;\n};\n\n\nRowPlacement_0 rowTableLookup_0(uint _S26, int _S27, vec4 _S28)\n{\n\n RowPlacement_0 p_0;\n p_0.hidden_0 = false;\n p_0.slot_1 = _S26;\n p_0.color_1 = _S28;\n if(_S27 < 0)\n {\n\n return p_0;\n }\n uint n_0 = uint(_S27);\n if(_S26 >= n_0)\n {\n\n p_0.hidden_0 = true;\n return p_0;\n }\n uint h_1 = rowTablePlaneHeight_0(n_0);\n uint _S29 = rowTableTexelX_0(_S26, n_0);\n\n float u_2 = (float(_S29) + 0.5) / float(rowTableWidth_0(n_0));\n float rows_0 = float(2U * h_1);\n uint y_0 = rowTableTexelY_0(_S26, n_0);\n vec4 s_0 = (textureLod((u_rowTable), (vec2(u_2, (float(y_0) + 0.5) / rows_0)), (0.0)));\n if((s_0.w) < 0.5)\n {\n\n p_0.hidden_0 = true;\n return p_0;\n }\n p_0.slot_1 = ((byteOf_0(s_0.x)) | ((byteOf_0(s_0.y)) << 8)) | ((byteOf_0(s_0.z)) << 16);\n vec4 c_2 = (textureLod((u_rowTable), (vec2(u_2, (float(y_0 + h_1) + 0.5) / rows_0)), (0.0)));\n\n vec4 _S30;\n if((c_2.w) > 0.0)\n {\n\n _S30 = c_2;\n\n }\n else\n {\n\n _S30 = _S28;\n\n }\n\n p_0.color_1 = _S30;\n return p_0;\n}\n\n\nfloat lineBpToClipX_0(uint _S31)\n{\n\n return hpToClipX_0(hpSplitUint_0(_S31), u_0.bpRangeX_0, u_0.zero_0);\n}\n\n\nfloat lineValueYPx_0(float _S32, float _S33)\n{\n\n return _S33 + valueToYPxScaled_0(_S32, u_0.domainMin_0, u_0.domainMax_0, u_0.rowBandPx_0, u_0.valueScaleType_0, u_0.valueSymlogConstant_0);\n}\n\n\nfloat lineColorYPx_0(float _S34, float _S35)\n{\n\n return _S35 + (1.0 - normalizeScoreUnclamped_0(_S34, u_0.domainMin_0, u_0.domainMax_0, u_0.valueScaleType_0, u_0.valueSymlogConstant_0)) * u_0.rowBandPx_0;\n}\n\n\nvec4 lineCutYsPx_0(int _S36, float _S37)\n{\n\n vec4 ys_0 = vec4(0.0);\n\n int k_0 = 0;\n for(;;)\n {\n\n if(k_0 < 4)\n {\n }\n else\n {\n\n break;\n }\n\n int _S38 = _S36 + k_0;\n\n if(_S38 < (u_0.colorCutCount_0))\n {\n\n ys_0[k_0] = lineColorYPx_0(colorCutAt_0(_S38, u_0.colorCuts_0[0], u_0.colorCuts_0[1]), _S37);\n\n }\n\n k_0 = k_0 + 1;\n\n }\n\n return ys_0;\n}\n\n\nvoid main()\n{\n\n VsOut_0 o_0;\n\n RowPlacement_0 _S39 = rowTableLookup_0(a_row, u_0.rowTableKeys_0, markScaleColor_0(a_color, u_0.rampMode_0, u_0.rampMin_0, u_0.rampMax_0, u_0.rampMidNorm_0, u_0.colorCutCount_0, u_0.colorCuts_0[0], u_0.colorCuts_0[1]));\n\n\n if(_S39.hidden_0)\n {\n\n o_0.position_0 = vec4(2.0, 2.0, 0.0, 1.0);\n const vec4 _S40 = vec4(0.0);\n\n o_0.color_0 = _S40;\n const vec2 _S41 = vec2(0.0);\n\n o_0.localPos_0 = _S41;\n o_0.segHalfLen_0 = 0.0;\n o_0.colorLine_0 = _S41;\n o_0.cutYsLo_0 = _S40;\n o_0.cutYsHi_0 = _S40;\n VsOut_0 _S42 = o_0;\n\n gl_Position = o_0.position_0;\n\n v_color = _S42.color_0;\n\n v_localPos = _S42.localPos_0;\n\n v_segHalfLen = _S42.segHalfLen_0;\n\n v_colorLine = _S42.colorLine_0;\n\n v_cutYsLo = _S42.cutYsLo_0;\n\n v_cutYsHi = _S42.cutYsHi_0;\n\n return;\n }\n\n\n float bandTop_0 = rowBandTopPx_0(u_0.rowOffsetPx_0, u_0.rowHeight_0, _S39.slot_1);\n bool hasPrev_0 = a_prevX != 4294967295U;\n float midCurrX_0 = (lineBpToClipX_0(a_x) + lineBpToClipX_0(a_x2)) * 0.5;\n\n float midPrevX_0;\n\n\n\n if(hasPrev_0)\n {\n\n midPrevX_0 = (lineBpToClipX_0(a_prevX) + lineBpToClipX_0(a_prevX2)) * 0.5;\n\n }\n else\n {\n\n midPrevX_0 = midCurrX_0;\n\n }\n\n float _S43 = lineValueYPx_0(a_y, bandTop_0);\n\n float prevYPx_0;\n\n\n if(hasPrev_0)\n {\n\n prevYPx_0 = lineValueYPx_0(a_prevY, bandTop_0);\n\n }\n else\n {\n\n prevYPx_0 = _S43;\n\n }\n\n vec2 deltaPx_0 = vec2((midCurrX_0 - midPrevX_0) * u_0.viewportWidth_0 * 0.5, _S43 - prevYPx_0);\n\n float len_1 = length(deltaPx_0);\n CapsuleFrame_0 f_1 = capsuleFrame_0(deltaPx_0, len_1);\n\n float _S44 = len_1 * 0.5;\n\n vec2 local_0 = capsuleQuadLocal_0(uint(gl_VertexID), _S44, u_0.lineWidth_0 * 0.5, u_0.devicePixelRatio_0);\n vec2 off_0 = f_1.tangent_0 * local_0.x + f_1.normal_0 * local_0.y;\n o_0.position_0 = vec4((midPrevX_0 + midCurrX_0) * 0.5 + pxToClipLen_0(off_0.x, u_0.viewportWidth_0), yPxToClipY_0((prevYPx_0 + _S43) * 0.5 + off_0.y, u_0.canvasHeight_0), 0.0, 1.0);\n\n o_0.color_0 = _S39.color_1;\n o_0.localPos_0 = local_0;\n o_0.segHalfLen_0 = _S44;\n\n float _S45 = lineColorYPx_0(a_y, bandTop_0);\n\n float prevColorYPx_0;\n\n if(hasPrev_0)\n {\n\n prevColorYPx_0 = lineColorYPx_0(a_prevY, bandTop_0);\n\n }\n else\n {\n\n prevColorYPx_0 = _S45;\n\n }\n\n float _S46 = (prevColorYPx_0 + _S45) * 0.5;\n if(len_1 > 0.00009999999747379)\n {\n\n midPrevX_0 = (_S45 - prevColorYPx_0) / len_1;\n\n }\n else\n {\n\n midPrevX_0 = 0.0;\n\n }\n\n o_0.colorLine_0 = vec2(_S46, midPrevX_0);\n\n\n o_0.cutYsLo_0 = lineCutYsPx_0(0, bandTop_0);\n o_0.cutYsHi_0 = lineCutYsPx_0(4, bandTop_0);\n VsOut_0 _S47 = o_0;\n\n gl_Position = o_0.position_0;\n\n v_color = _S47.color_0;\n\n v_localPos = _S47.localPos_0;\n\n v_segHalfLen = _S47.segHalfLen_0;\n\n v_colorLine = _S47.colorLine_0;\n\n v_cutYsLo = _S47.cutYsLo_0;\n\n v_cutYsHi = _S47.cutYsHi_0;\n\n return;\n}\n\n"
5
+
6
+ export const GLSL_FRAGMENT = "#version 300 es\nprecision highp float;\nprecision highp int;\nprecision highp sampler2D;\n\n\n\nlayout(std140) uniform Uniforms\n{\n vec3 bpRangeX_0;\n float canvasHeight_0;\n float domainMin_0;\n float domainMax_0;\n int valueScaleType_0;\n float valueSymlogConstant_0;\n int rampMode_0;\n float rampMin_0;\n float rampMax_0;\n float rampMidNorm_0;\n int colorCutCount_0;\n vec4 colorCuts_0[2];\n vec4 colorBands_0[9];\n float rowHeight_0;\n float rowBandPx_0;\n float rowOffsetPx_0;\n float origin_0;\n float lineWidth_0;\n float zero_0;\n float viewportWidth_0;\n float devicePixelRatio_0;\n int rowTableKeys_0;\n}u_0;\n\nfloat capsuleDistPx_0(float alongPx_0, float acrossPx_0, float halfLenPx_0)\n{\n\n float _S1 = max(abs(alongPx_0) - halfLenPx_0, 0.0);\n return sqrt(_S1 * _S1 + acrossPx_0 * acrossPx_0);\n}\n\nfloat capsuleDist_0(vec2 local_0, float halfLenPx_1)\n{\n\n return capsuleDistPx_0(local_0.x, local_0.y, halfLenPx_1);\n}\n\n\nfloat aaPx_0(float dpr_0)\n{\n\n return 1.0 / max(dpr_0, 1.0);\n}\n\n\nfloat aaRamp_0(float signedInk_0, float widthPx_0)\n{\n\n return clamp(signedInk_0 / widthPx_0 + 0.5, 0.0, 1.0);\n}\n\n\nfloat edgeCoverage_0(float signedInkCssPx_0, float dpr_1)\n{\n\n return aaRamp_0(signedInkCssPx_0, aaPx_0(dpr_1));\n}\n\n\nfloat colorCutAt_0(int i_0, vec4 cutsLo_0, vec4 cutsHi_0)\n{\n\n float _S2;\n if(i_0 < 4)\n {\n\n _S2 = cutsLo_0[i_0];\n\n }\n else\n {\n\n _S2 = cutsHi_0[i_0 - 4];\n\n }\n\n return _S2;\n}\n\n\nint thresholdBandAtYPx_0(float yPx_0, int cutCount_0, vec4 cutYsLo_0, vec4 cutYsHi_0)\n{\n\n int band_0 = 0;\n\n int i_1 = 0;\n\n for(;;)\n {\n\n if(i_1 < cutCount_0)\n {\n }\n else\n {\n\n break;\n }\n\n if(yPx_0 <= (colorCutAt_0(i_1, cutYsLo_0, cutYsHi_0)))\n {\n\n band_0 = i_1 + 1;\n\n }\n\n i_1 = i_1 + 1;\n\n }\n\n return band_0;\n}\n\n\nlayout(location = 0)\nout vec4 entryPointParam_fs_main_0;\n\n\nflat in vec4 v_color;\n\n\nin vec2 v_localPos;\n\n\nflat in float v_segHalfLen;\n\n\nflat in vec2 v_colorLine;\n\n\nflat in vec4 v_cutYsLo;\n\n\nflat in vec4 v_cutYsHi;\n\n\nvec4 lineFragmentColor_0(float _S3, vec4 _S4, vec4 _S5, vec4 _S6)\n{\n\n if((u_0.rampMode_0) != 3)\n {\n\n return _S6;\n }\n return u_0.colorBands_0[thresholdBandAtYPx_0(_S3, u_0.colorCutCount_0, _S4, _S5)];\n}\n\n\nvoid main()\n{\n float alpha_0 = edgeCoverage_0(u_0.lineWidth_0 * 0.5 - capsuleDist_0(v_localPos, v_segHalfLen), u_0.devicePixelRatio_0);\n if(alpha_0 <= 0.0)\n {\n\n discard;\n\n }\n\n vec4 _S7 = lineFragmentColor_0(v_colorLine.x + v_colorLine.y * clamp(v_localPos.x, - v_segHalfLen, v_segHalfLen), v_cutYsLo, v_cutYsHi, v_color);\n\n entryPointParam_fs_main_0 = vec4(_S7.xyz * alpha_0, _S7.w * alpha_0);\n\n return;\n}\n\n"
@@ -0,0 +1,328 @@
1
+ // AUTO-GENERATED by packages/shader-tools/src/shader-codegen from lineCenterMark.slang.
2
+ // Do not edit. Run `pnpm gen:shaders` to regenerate.
3
+
4
+ import type { VertexAttributeLayout, ShaderBinding, BlendState, TextureBinding } from '@jbrowse/render-core/hal'
5
+
6
+ export const BINDINGS: readonly ShaderBinding[] = [
7
+ { index: 1, kind: 'uniform', name: 'u', stages: ['vertex', 'fragment'] },
8
+ { index: 2, kind: 'texture', name: 'colorRamp', stages: ['vertex'] },
9
+ { index: 3, kind: 'sampler', name: 'colorRamp', stages: ['vertex'] },
10
+ { index: 4, kind: 'texture', name: 'rowTable', stages: ['vertex'] },
11
+ { index: 5, kind: 'sampler', name: 'rowTable', stages: ['vertex'] },
12
+ ]
13
+
14
+ export const VERTS_PER_INSTANCE = 6
15
+
16
+ export const BLEND_STATE: BlendState = { op: 'max' }
17
+
18
+ export const COVERAGE = 'analytic' as const
19
+
20
+ export const UNIFORMS_SIZE_BYTES = 288
21
+
22
+ // Word indices into a Float32Array view over the uniform buffer.
23
+ export const UNIFORM_OFFSET_F32 = {
24
+ bpRangeX: 0,
25
+ canvasHeight: 3,
26
+ domainMin: 4,
27
+ domainMax: 5,
28
+ valueSymlogConstant: 7,
29
+ rampMin: 9,
30
+ rampMax: 10,
31
+ rampMidNorm: 11,
32
+ rowHeight: 60,
33
+ rowBandPx: 61,
34
+ rowOffsetPx: 62,
35
+ origin: 63,
36
+ lineWidth: 64,
37
+ zero: 65,
38
+ viewportWidth: 66,
39
+ devicePixelRatio: 67,
40
+ } as const
41
+
42
+ // Word indices into a Int32Array view over the uniform buffer.
43
+ export const UNIFORM_OFFSET_I32 = {
44
+ valueScaleType: 6,
45
+ rampMode: 8,
46
+ colorCutCount: 12,
47
+ rowTableKeys: 68,
48
+ } as const
49
+
50
+
51
+ // Word indices of each array field’s elements, into a 4-byte-word
52
+ // view over the uniform buffer (Uint32Array or Float32Array — the
53
+ // field’s scalar type picks, same as UNIFORM_OFFSET_*). NOT
54
+ // consecutive: std140 pads every array element to 16 bytes.
55
+ export const UNIFORM_SLOT_ARRAYS = {
56
+ colorCuts: [16, 20] as const,
57
+ colorBands: [24, 28, 32, 36, 40, 44, 48, 52, 56] as const,
58
+ } as const
59
+
60
+ // Element `i` of the `colorCuts` uniform array (4 components).
61
+ export function setUniformColorCuts(
62
+ f32: Float32Array,
63
+ i: number,
64
+ v0: number,
65
+ v1: number,
66
+ v2: number,
67
+ v3: number,
68
+ ) {
69
+ const o = UNIFORM_SLOT_ARRAYS.colorCuts[i]!
70
+ f32[o] = v0
71
+ f32[o + 1] = v1
72
+ f32[o + 2] = v2
73
+ f32[o + 3] = v3
74
+ }
75
+
76
+ // Element `i` of the `colorBands` uniform array (4 components).
77
+ export function setUniformColorBands(
78
+ f32: Float32Array,
79
+ i: number,
80
+ v0: number,
81
+ v1: number,
82
+ v2: number,
83
+ v3: number,
84
+ ) {
85
+ const o = UNIFORM_SLOT_ARRAYS.colorBands[i]!
86
+ f32[o] = v0
87
+ f32[o + 1] = v1
88
+ f32[o + 2] = v2
89
+ f32[o + 3] = v3
90
+ }
91
+
92
+
93
+ export interface Uniforms {
94
+ bpRangeX: [number, number, number]
95
+ canvasHeight: number
96
+ domainMin: number
97
+ domainMax: number
98
+ valueScaleType: number
99
+ valueSymlogConstant: number
100
+ rampMode: number
101
+ rampMin: number
102
+ rampMax: number
103
+ rampMidNorm: number
104
+ colorCutCount: number
105
+ colorCuts: [[number, number, number, number], [number, number, number, number]]
106
+ colorBands: [[number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number], [number, number, number, number]]
107
+ rowHeight: number
108
+ rowBandPx: number
109
+ rowOffsetPx: number
110
+ origin: number
111
+ lineWidth: number
112
+ zero: number
113
+ viewportWidth: number
114
+ devicePixelRatio: number
115
+ rowTableKeys: number
116
+ }
117
+
118
+ export function writeUniforms(buf: ArrayBuffer, uniforms: Uniforms) {
119
+ const f32 = new Float32Array(buf)
120
+ const i32 = new Int32Array(buf)
121
+ f32[0] = uniforms.bpRangeX[0]
122
+ f32[1] = uniforms.bpRangeX[1]
123
+ f32[2] = uniforms.bpRangeX[2]
124
+ f32[3] = uniforms.canvasHeight
125
+ f32[4] = uniforms.domainMin
126
+ f32[5] = uniforms.domainMax
127
+ i32[6] = uniforms.valueScaleType
128
+ f32[7] = uniforms.valueSymlogConstant
129
+ i32[8] = uniforms.rampMode
130
+ f32[9] = uniforms.rampMin
131
+ f32[10] = uniforms.rampMax
132
+ f32[11] = uniforms.rampMidNorm
133
+ i32[12] = uniforms.colorCutCount
134
+ f32[16] = uniforms.colorCuts[0][0]
135
+ f32[17] = uniforms.colorCuts[0][1]
136
+ f32[18] = uniforms.colorCuts[0][2]
137
+ f32[19] = uniforms.colorCuts[0][3]
138
+ f32[20] = uniforms.colorCuts[1][0]
139
+ f32[21] = uniforms.colorCuts[1][1]
140
+ f32[22] = uniforms.colorCuts[1][2]
141
+ f32[23] = uniforms.colorCuts[1][3]
142
+ f32[24] = uniforms.colorBands[0][0]
143
+ f32[25] = uniforms.colorBands[0][1]
144
+ f32[26] = uniforms.colorBands[0][2]
145
+ f32[27] = uniforms.colorBands[0][3]
146
+ f32[28] = uniforms.colorBands[1][0]
147
+ f32[29] = uniforms.colorBands[1][1]
148
+ f32[30] = uniforms.colorBands[1][2]
149
+ f32[31] = uniforms.colorBands[1][3]
150
+ f32[32] = uniforms.colorBands[2][0]
151
+ f32[33] = uniforms.colorBands[2][1]
152
+ f32[34] = uniforms.colorBands[2][2]
153
+ f32[35] = uniforms.colorBands[2][3]
154
+ f32[36] = uniforms.colorBands[3][0]
155
+ f32[37] = uniforms.colorBands[3][1]
156
+ f32[38] = uniforms.colorBands[3][2]
157
+ f32[39] = uniforms.colorBands[3][3]
158
+ f32[40] = uniforms.colorBands[4][0]
159
+ f32[41] = uniforms.colorBands[4][1]
160
+ f32[42] = uniforms.colorBands[4][2]
161
+ f32[43] = uniforms.colorBands[4][3]
162
+ f32[44] = uniforms.colorBands[5][0]
163
+ f32[45] = uniforms.colorBands[5][1]
164
+ f32[46] = uniforms.colorBands[5][2]
165
+ f32[47] = uniforms.colorBands[5][3]
166
+ f32[48] = uniforms.colorBands[6][0]
167
+ f32[49] = uniforms.colorBands[6][1]
168
+ f32[50] = uniforms.colorBands[6][2]
169
+ f32[51] = uniforms.colorBands[6][3]
170
+ f32[52] = uniforms.colorBands[7][0]
171
+ f32[53] = uniforms.colorBands[7][1]
172
+ f32[54] = uniforms.colorBands[7][2]
173
+ f32[55] = uniforms.colorBands[7][3]
174
+ f32[56] = uniforms.colorBands[8][0]
175
+ f32[57] = uniforms.colorBands[8][1]
176
+ f32[58] = uniforms.colorBands[8][2]
177
+ f32[59] = uniforms.colorBands[8][3]
178
+ f32[60] = uniforms.rowHeight
179
+ f32[61] = uniforms.rowBandPx
180
+ f32[62] = uniforms.rowOffsetPx
181
+ f32[63] = uniforms.origin
182
+ f32[64] = uniforms.lineWidth
183
+ f32[65] = uniforms.zero
184
+ f32[66] = uniforms.viewportWidth
185
+ f32[67] = uniforms.devicePixelRatio
186
+ i32[68] = uniforms.rowTableKeys
187
+ }
188
+
189
+ export const INSTANCE_STRIDE_BYTES = 32
190
+ export const INSTANCE_STRIDE_WORDS = 8
191
+
192
+ // Word indices into a Float32Array view over the instance buffer.
193
+ export const INSTANCE_OFFSET_F32 = {
194
+ y: 2,
195
+ prevY: 7,
196
+ } as const
197
+
198
+ // Word indices into a Uint32Array view over the instance buffer.
199
+ export const INSTANCE_OFFSET_U32 = {
200
+ x: 0,
201
+ x2: 1,
202
+ color: 3,
203
+ row: 4,
204
+ prevX: 5,
205
+ prevX2: 6,
206
+ } as const
207
+
208
+ export const VERTEX_ATTRIBUTES: readonly VertexAttributeLayout[] = [
209
+ { name: 'a_x', components: 1, type: 'uint', offsetBytes: 0, integer: true },
210
+ { name: 'a_x2', components: 1, type: 'uint', offsetBytes: 4, integer: true },
211
+ { name: 'a_y', components: 1, type: 'float', offsetBytes: 8, integer: false },
212
+ { name: 'a_color', components: 1, type: 'uint', offsetBytes: 12, integer: true },
213
+ { name: 'a_row', components: 1, type: 'uint', offsetBytes: 16, integer: true },
214
+ { name: 'a_prevX', components: 1, type: 'uint', offsetBytes: 20, integer: true },
215
+ { name: 'a_prevX2', components: 1, type: 'uint', offsetBytes: 24, integer: true },
216
+ { name: 'a_prevY', components: 1, type: 'float', offsetBytes: 28, integer: false },
217
+ ]
218
+
219
+ export interface InstanceArrays {
220
+ x: ArrayLike<number>
221
+ x2: ArrayLike<number>
222
+ y: ArrayLike<number>
223
+ color: ArrayLike<number>
224
+ row: ArrayLike<number>
225
+ prevX: ArrayLike<number>
226
+ prevX2: ArrayLike<number>
227
+ prevY: ArrayLike<number>
228
+ }
229
+
230
+ export function packInstances(
231
+ arrays: InstanceArrays,
232
+ numInstances: number,
233
+ buf: ArrayBuffer = new ArrayBuffer(numInstances * INSTANCE_STRIDE_BYTES),
234
+ ) {
235
+ const f32 = new Float32Array(buf)
236
+ const u32 = new Uint32Array(buf)
237
+ const { x, x2, y, color, row, prevX, prevX2, prevY } = arrays
238
+ for (let i = 0; i < numInstances; i++) {
239
+ const o = i * INSTANCE_STRIDE_WORDS
240
+ u32[o + 0] = x[i]!
241
+ u32[o + 1] = x2[i]!
242
+ f32[o + 2] = y[i]!
243
+ u32[o + 3] = color[i]!
244
+ u32[o + 4] = row[i]!
245
+ u32[o + 5] = prevX[i]!
246
+ u32[o + 6] = prevX2[i]!
247
+ f32[o + 7] = prevY[i]!
248
+ }
249
+ return buf
250
+ }
251
+
252
+ // Instance `i`'s `x`.
253
+ export function getInstanceX(u32: Uint32Array, i: number) {
254
+ return u32[i * INSTANCE_STRIDE_WORDS]!
255
+ }
256
+
257
+ export function setInstanceX(u32: Uint32Array, i: number, v: number) {
258
+ u32[i * INSTANCE_STRIDE_WORDS] = v
259
+ }
260
+
261
+ // Instance `i`'s `x2`.
262
+ export function getInstanceX2(u32: Uint32Array, i: number) {
263
+ return u32[i * INSTANCE_STRIDE_WORDS + 1]!
264
+ }
265
+
266
+ export function setInstanceX2(u32: Uint32Array, i: number, v: number) {
267
+ u32[i * INSTANCE_STRIDE_WORDS + 1] = v
268
+ }
269
+
270
+ // Instance `i`'s `y`.
271
+ export function getInstanceY(f32: Float32Array, i: number) {
272
+ return f32[i * INSTANCE_STRIDE_WORDS + 2]!
273
+ }
274
+
275
+ export function setInstanceY(f32: Float32Array, i: number, v: number) {
276
+ f32[i * INSTANCE_STRIDE_WORDS + 2] = v
277
+ }
278
+
279
+ // Instance `i`'s `color`.
280
+ export function getInstanceColor(u32: Uint32Array, i: number) {
281
+ return u32[i * INSTANCE_STRIDE_WORDS + 3]!
282
+ }
283
+
284
+ export function setInstanceColor(u32: Uint32Array, i: number, v: number) {
285
+ u32[i * INSTANCE_STRIDE_WORDS + 3] = v
286
+ }
287
+
288
+ // Instance `i`'s `row`.
289
+ export function getInstanceRow(u32: Uint32Array, i: number) {
290
+ return u32[i * INSTANCE_STRIDE_WORDS + 4]!
291
+ }
292
+
293
+ export function setInstanceRow(u32: Uint32Array, i: number, v: number) {
294
+ u32[i * INSTANCE_STRIDE_WORDS + 4] = v
295
+ }
296
+
297
+ // Instance `i`'s `prevX`.
298
+ export function getInstancePrevX(u32: Uint32Array, i: number) {
299
+ return u32[i * INSTANCE_STRIDE_WORDS + 5]!
300
+ }
301
+
302
+ export function setInstancePrevX(u32: Uint32Array, i: number, v: number) {
303
+ u32[i * INSTANCE_STRIDE_WORDS + 5] = v
304
+ }
305
+
306
+ // Instance `i`'s `prevX2`.
307
+ export function getInstancePrevX2(u32: Uint32Array, i: number) {
308
+ return u32[i * INSTANCE_STRIDE_WORDS + 6]!
309
+ }
310
+
311
+ export function setInstancePrevX2(u32: Uint32Array, i: number, v: number) {
312
+ u32[i * INSTANCE_STRIDE_WORDS + 6] = v
313
+ }
314
+
315
+ // Instance `i`'s `prevY`.
316
+ export function getInstancePrevY(f32: Float32Array, i: number) {
317
+ return f32[i * INSTANCE_STRIDE_WORDS + 7]!
318
+ }
319
+
320
+ export function setInstancePrevY(f32: Float32Array, i: number, v: number) {
321
+ f32[i * INSTANCE_STRIDE_WORDS + 7] = v
322
+ }
323
+
324
+ // Combined `Sampler2D` bindings. Texture unit indices start at 0.
325
+ export const TEXTURES: readonly [TextureBinding, ...TextureBinding[]] = [
326
+ { name: 'colorRamp', glTextureUnit: 0, glUniformName: 'u_colorRamp', filter: 'linear' },
327
+ { name: 'rowTable', glTextureUnit: 1, glUniformName: 'u_rowTable', filter: 'nearest' },
328
+ ]
@@ -0,0 +1,127 @@
1
+ // The `line` mark shape's linear variant: one capsule per instance from the
2
+ // previous instance's bp midpoint at its value to this instance's, thickened
3
+ // to `lineWidth` with round caps, so consecutive capsules meet in a seamless
4
+ // round join under the max blend; a run's first instance (`prevX == NO_PREV_X`)
5
+ // draws as a dot. Which instance is the previous one is the packer's call
6
+ // (`gapBp`), so both backends break a run in the same place.
7
+ //
8
+ // Premultiplied MAX blend, so overlapping segments and caps union instead of
9
+ // accumulating into dark seams under src-over. Max is inexact where lines of
10
+ // different colours cross.
11
+ //
12
+ // The band is the instance's `row`, read through the bound row table as
13
+ // `barMark` reads it.
14
+ //! targets: wgsl, glsl
15
+ //! blend: max
16
+ //! coverage: analytic
17
+
18
+ import antialias;
19
+ import capsule;
20
+ import hpmath;
21
+ import colorPack;
22
+ import markColor;
23
+ import rowTable;
24
+ import valueScale;
25
+ import lineCommon;
26
+
27
+ public static const uint VERTS_PER_INSTANCE = 6u;
28
+
29
+ struct LineCenterInstance {
30
+ uint x : ATTR0;
31
+ uint x2 : ATTR1;
32
+ float y : ATTR2;
33
+ uint color : ATTR3;
34
+ uint row : ATTR4;
35
+ // The previous instance's span and value, NO_PREV_X at a run start.
36
+ uint prevX : ATTR5;
37
+ uint prevX2 : ATTR6;
38
+ float prevY : ATTR7;
39
+ };
40
+
41
+ [[vk::binding(1, 0)]] ConstantBuffer<Uniforms> u;
42
+ [[vk::binding(2, 0)]] Sampler2D<float4> colorRamp;
43
+ [[vk::binding(4, 0)]] Sampler2D<float4> rowTable;
44
+
45
+ struct VsOut {
46
+ float4 position : SV_Position;
47
+ nointerpolation float4 color : COLOR0;
48
+ // signed px distance (along, across) from the segment centre, and the
49
+ // segment's half-length, for the capsule SDF
50
+ float2 localPos : TEXCOORD0;
51
+ nointerpolation float segHalfLen : TEXCOORD1;
52
+ // the colour line's y at the segment centre and its rise per px along, so
53
+ // the fragment reads the value under itself
54
+ nointerpolation float2 colorLine : TEXCOORD2;
55
+ nointerpolation float4 cutYsLo : TEXCOORD3;
56
+ nointerpolation float4 cutYsHi : TEXCOORD4;
57
+ };
58
+
59
+ [shader("vertex")]
60
+ VsOut vs_main(LineCenterInstance inst, uint vid : SV_VertexID) {
61
+ VsOut o;
62
+ RowPlacement place = rowTableLookup(rowTable, inst.row, u.rowTableKeys,
63
+ markScaleColor(colorRamp, inst.color, u.rampMode, u.rampMin, u.rampMax, u.rampMidNorm, u.colorCutCount, u.colorCuts[0], u.colorCuts[1], u.colorBands));
64
+ if (place.hidden) {
65
+ o.position = float4(2.0, 2.0, 0.0, 1.0);
66
+ o.color = float4(0.0);
67
+ o.localPos = float2(0.0);
68
+ o.segHalfLen = 0.0;
69
+ o.colorLine = float2(0.0);
70
+ o.cutYsLo = float4(0.0);
71
+ o.cutYsHi = float4(0.0);
72
+ return o;
73
+ }
74
+ float sx1 = lineBpToClipX(inst.x, u);
75
+ float sx2 = lineBpToClipX(inst.x2, u);
76
+ float bandTop = rowBandTopPx(u.rowOffsetPx, u.rowHeight, place.slot);
77
+ bool hasPrev = inst.prevX != NO_PREV_X;
78
+ float midCurrX = (sx1 + sx2) * 0.5;
79
+ // Averaged in clip space, as midCurrX is, so consecutive capsules meet
80
+ // exactly; a bp-space average would need a rounded integer midpoint.
81
+ float midPrevX = hasPrev
82
+ ? (lineBpToClipX(inst.prevX, u) + lineBpToClipX(inst.prevX2, u)) * 0.5
83
+ : midCurrX;
84
+ float currYPx = lineValueYPx(inst.y, bandTop, u);
85
+ float prevYPx = hasPrev ? lineValueYPx(inst.prevY, bandTop, u) : currYPx;
86
+ // Built in px space so the capsule stays isotropic despite the differing
87
+ // per-axis px→clip scales.
88
+ float centerClipX = (midPrevX + midCurrX) * 0.5;
89
+ float centerYPx = (prevYPx + currYPx) * 0.5;
90
+ float2 deltaPx = float2(
91
+ (midCurrX - midPrevX) * u.viewportWidth * 0.5, currYPx - prevYPx);
92
+ float len = length(deltaPx);
93
+ CapsuleFrame f = capsuleFrame(deltaPx, len);
94
+ float2 local =
95
+ capsuleQuadLocal(vid, len * 0.5, u.lineWidth * 0.5, u.devicePixelRatio);
96
+ float2 off = f.tangent * local.x + f.normal * local.y;
97
+ o.position = float4(
98
+ centerClipX + pxToClipLen(off.x, u.viewportWidth),
99
+ yPxToClipY(centerYPx + off.y, u.canvasHeight),
100
+ 0.0,
101
+ 1.0);
102
+ o.color = place.color;
103
+ o.localPos = local;
104
+ o.segHalfLen = len * 0.5;
105
+ float currColorYPx = lineColorYPx(inst.y, bandTop, u);
106
+ float prevColorYPx = hasPrev ? lineColorYPx(inst.prevY, bandTop, u) : currColorYPx;
107
+ o.colorLine = float2(
108
+ (prevColorYPx + currColorYPx) * 0.5,
109
+ len > CAPSULE_MIN_LEN_PX ? (currColorYPx - prevColorYPx) / len : 0.0);
110
+ o.cutYsLo = lineCutYsPx(0, bandTop, u);
111
+ o.cutYsHi = lineCutYsPx(4, bandTop, u);
112
+ return o;
113
+ }
114
+
115
+ [shader("fragment")]
116
+ float4 fs_main(VsOut v) : SV_Target {
117
+ float dist = capsuleDist(v.localPos, v.segHalfLen);
118
+ float alpha = edgeCoverage(u.lineWidth * 0.5 - dist, u.devicePixelRatio);
119
+ if (alpha <= 0.0) {
120
+ discard;
121
+ }
122
+ float along = clamp(v.localPos.x, -v.segHalfLen, v.segHalfLen);
123
+ float4 color = lineFragmentColor(
124
+ v.colorLine.x + v.colorLine.y * along, v.cutYsLo, v.cutYsHi, v.color, u);
125
+ // premultiplied, so same-colour overlaps union under the max blend
126
+ return float4(color.rgb * alpha, color.a * alpha);
127
+ }
@@ -0,0 +1,4 @@
1
+ // AUTO-GENERATED by packages/shader-tools/src/shader-codegen from lineCenterMark.slang.
2
+ // Do not edit. Run `pnpm gen:shaders` to regenerate.
3
+
4
+ export const WGSL_SOURCE = "struct Uniforms_std140_0\n{\n @align(16) bpRangeX_0 : vec3<f32>,\n @align(4) canvasHeight_0 : f32,\n @align(16) domainMin_0 : f32,\n @align(4) domainMax_0 : f32,\n @align(8) valueScaleType_0 : i32,\n @align(4) valueSymlogConstant_0 : f32,\n @align(16) rampMode_0 : i32,\n @align(4) rampMin_0 : f32,\n @align(8) rampMax_0 : f32,\n @align(4) rampMidNorm_0 : f32,\n @align(16) colorCutCount_0 : i32,\n @align(16) colorCuts_0 : array<vec4<f32>, i32(2)>,\n @align(16) colorBands_0 : array<vec4<f32>, i32(9)>,\n @align(16) rowHeight_0 : f32,\n @align(4) rowBandPx_0 : f32,\n @align(8) rowOffsetPx_0 : f32,\n @align(4) origin_0 : f32,\n @align(16) lineWidth_0 : f32,\n @align(4) zero_0 : f32,\n @align(8) viewportWidth_0 : f32,\n @align(4) devicePixelRatio_0 : f32,\n @align(16) rowTableKeys_0 : i32,\n};\n\n@binding(1) @group(0) var<uniform> u_0 : Uniforms_std140_0;\n@binding(2) @group(0) var colorRamp_texture_0 : texture_2d<f32>;\n\n@binding(3) @group(0) var colorRamp_sampler_0 : sampler;\n\n@binding(4) @group(0) var rowTable_texture_0 : texture_2d<f32>;\n\n@binding(5) @group(0) var rowTable_sampler_0 : sampler;\n\nfn unpackRGBA_0( c_0 : u32) -> vec4<f32>\n{\n return vec4<f32>(f32((((c_0 >> (u32(0)))) & (u32(255)))), f32((((c_0 >> (u32(8)))) & (u32(255)))), f32((((c_0 >> (u32(16)))) & (u32(255)))), f32((((c_0 >> (u32(24)))) & (u32(255))))) / vec4<f32>(255.0f);\n}\n\nfn rampMidT_0( t_0 : f32, mid_0 : f32) -> f32\n{\n var _S1 : f32 = max(mid_0, 1.0f - mid_0);\n return clamp((t_0 + (_S1 - mid_0)) / (2.0f * _S1), 0.0f, 1.0f);\n}\n\nfn rampColor_0( ramp_texture_0 : texture_2d<f32>, ramp_sampler_0 : sampler, t_1 : f32) -> vec4<f32>\n{\n return (textureSampleLevel((ramp_texture_0), (ramp_sampler_0), (vec2<f32>((clamp(t_1, 0.0f, 1.0f) * 255.0f + 0.5f) / 256.0f, 0.5f)), (0.0f)));\n}\n\nfn colorCutAt_0( i_0 : i32, cutsLo_0 : vec4<f32>, cutsHi_0 : vec4<f32>) -> f32\n{\n var _S2 : f32;\n if(i_0 < i32(4))\n {\n _S2 = cutsLo_0[i_0];\n }\n else\n {\n _S2 = cutsHi_0[i_0 - i32(4)];\n }\n return _S2;\n}\n\nfn thresholdBand_0( value_0 : f32, cutCount_0 : i32, cutsLo_1 : vec4<f32>, cutsHi_1 : vec4<f32>) -> i32\n{\n var band_0 : i32 = i32(0);\n var i_1 : i32 = i32(0);\n for(;;)\n {\n if(i_1 < cutCount_0)\n {\n }\n else\n {\n break;\n }\n if(value_0 >= (colorCutAt_0(i_1, cutsLo_1, cutsHi_1)))\n {\n band_0 = i_1 + i32(1);\n }\n i_1 = i_1 + i32(1);\n }\n return band_0;\n}\n\nfn log1pf_0( x_0 : f32) -> f32\n{\n var u_1 : f32 = 1.0f + x_0;\n var _S3 : f32;\n if(u_1 == 1.0f)\n {\n _S3 = x_0;\n }\n else\n {\n _S3 = log(u_1) * (x_0 / (u_1 - 1.0f));\n }\n return _S3;\n}\n\nfn symlogTransform_0( x_1 : f32, c_1 : f32) -> f32\n{\n return f32((i32(sign((x_1))))) * log1pf_0(abs(x_1 / c_1));\n}\n\nfn normalizeScoreUnclamped_0( score_0 : f32, domainMin_1 : f32, domainMax_1 : f32, scaleType_0 : i32, symlogConstant_0 : f32) -> f32\n{\n var tMax_0 : f32;\n var tMin_0 : f32;\n var t_2 : f32;\n if(scaleType_0 == i32(2))\n {\n var _S4 : f32 = symlogTransform_0(score_0, symlogConstant_0);\n var _S5 : f32 = symlogTransform_0(domainMin_1, symlogConstant_0);\n tMax_0 = symlogTransform_0(domainMax_1, symlogConstant_0);\n tMin_0 = _S5;\n t_2 = _S4;\n }\n else\n {\n if(scaleType_0 == i32(1))\n {\n if(domainMin_1 > 0.0f)\n {\n tMax_0 = domainMin_1;\n }\n else\n {\n tMax_0 = 1.0f;\n }\n var _S6 : f32 = log2(max(score_0, tMax_0));\n var _S7 : f32 = log2(tMax_0);\n tMax_0 = log2(max(domainMax_1, tMax_0));\n tMin_0 = _S7;\n t_2 = _S6;\n }\n else\n {\n tMax_0 = domainMax_1;\n tMin_0 = domainMin_1;\n t_2 = score_0;\n }\n }\n var tRange_0 : f32 = tMax_0 - tMin_0;\n if(tRange_0 <= 0.0f)\n {\n if(t_2 > tMin_0)\n {\n tMax_0 = 1.0f;\n }\n else\n {\n tMax_0 = 0.0f;\n }\n return tMax_0;\n }\n return (t_2 - tMin_0) / tRange_0;\n}\n\nfn normalizeScore_0( score_1 : f32, domainMin_2 : f32, domainMax_2 : f32, scaleType_1 : i32, symlogConstant_1 : f32) -> f32\n{\n return clamp(normalizeScoreUnclamped_0(score_1, domainMin_2, domainMax_2, scaleType_1, symlogConstant_1), 0.0f, 1.0f);\n}\n\nfn rowTableWidth_0( keys_0 : u32) -> u32\n{\n return max(min(keys_0, u32(2048)), u32(1));\n}\n\nfn rowTablePlaneHeight_0( keys_1 : u32) -> u32\n{\n var w_0 : u32 = rowTableWidth_0(keys_1);\n var _S8 : u32 = (keys_1 + w_0 - u32(1)) / w_0;\n return max(_S8, u32(1));\n}\n\nfn rowTableTexelX_0( key_0 : u32, keys_2 : u32) -> u32\n{\n var _S9 : u32 = key_0 % rowTableWidth_0(keys_2);\n return _S9;\n}\n\nfn rowTableTexelY_0( key_1 : u32, keys_3 : u32) -> u32\n{\n var _S10 : u32 = key_1 / rowTableWidth_0(keys_3);\n return _S10;\n}\n\nfn byteOf_0( channel_0 : f32) -> u32\n{\n return u32(channel_0 * 255.0f + 0.5f);\n}\n\nstruct RowPlacement_0\n{\n hidden_0 : bool,\n slot_0 : u32,\n color_0 : vec4<f32>,\n};\n\nfn rowTableLookup_0( table_texture_0 : texture_2d<f32>, table_sampler_0 : sampler, key_2 : u32, keys_4 : i32, own_0 : vec4<f32>) -> RowPlacement_0\n{\n var p_0 : RowPlacement_0;\n p_0.hidden_0 = false;\n p_0.slot_0 = key_2;\n p_0.color_0 = own_0;\n if(keys_4 < i32(0))\n {\n return p_0;\n }\n var n_0 : u32 = u32(keys_4);\n if(key_2 >= n_0)\n {\n p_0.hidden_0 = true;\n return p_0;\n }\n var h_0 : u32 = rowTablePlaneHeight_0(n_0);\n var _S11 : u32 = rowTableTexelX_0(key_2, n_0);\n var u_2 : f32 = (f32(_S11) + 0.5f) / f32(rowTableWidth_0(n_0));\n var rows_0 : f32 = f32(u32(2) * h_0);\n var y_0 : u32 = rowTableTexelY_0(key_2, n_0);\n var _S12 : vec4<f32> = (textureSampleLevel((table_texture_0), (table_sampler_0), (vec2<f32>(u_2, (f32(y_0) + 0.5f) / rows_0)), (0.0f)));\n if((_S12.w) < 0.5f)\n {\n p_0.hidden_0 = true;\n return p_0;\n }\n p_0.slot_0 = ((((byteOf_0(_S12.x)) | ((((byteOf_0(_S12.y)) << (u32(8))))))) | ((((byteOf_0(_S12.z)) << (u32(16))))));\n var _S13 : vec4<f32> = (textureSampleLevel((table_texture_0), (table_sampler_0), (vec2<f32>(u_2, (f32(y_0 + h_0) + 0.5f) / rows_0)), (0.0f)));\n var _S14 : vec4<f32>;\n if((_S13.w) > 0.0f)\n {\n _S14 = _S13;\n }\n else\n {\n _S14 = own_0;\n }\n p_0.color_0 = _S14;\n return p_0;\n}\n\nfn hpSplitUint_0( value_1 : u32) -> vec2<f32>\n{\n var lo_0 : u32 = (value_1 & (u32(4095)));\n return vec2<f32>(f32(value_1 - lo_0), f32(lo_0));\n}\n\nfn hpToClipX_0( splitPos_0 : vec2<f32>, bpRange_0 : vec3<f32>, hpZero_0 : f32) -> f32\n{\n var floorBp_0 : f32 = -3.00000000549775576e+38f + hpZero_0;\n var step_0 : f32 = 2.0f / bpRange_0.z;\n return dot(vec3<f32>(-1.0f, max(splitPos_0.x - bpRange_0.x, floorBp_0), max(splitPos_0.y - bpRange_0.y, floorBp_0)), vec3<f32>(1.0f, step_0, step_0));\n}\n\nfn rowBandTopPx_0( rowOffsetPx_1 : f32, rowHeight_1 : f32, slot_1 : u32) -> f32\n{\n return rowOffsetPx_1 + rowHeight_1 * f32(slot_1);\n}\n\nfn valueToYPxScaled_0( value_2 : f32, domainMin_3 : f32, domainMax_3 : f32, h_1 : f32, scaleType_2 : i32, symlogConstant_2 : f32) -> f32\n{\n return (1.0f - normalizeScore_0(value_2, domainMin_3, domainMax_3, scaleType_2, symlogConstant_2)) * h_1;\n}\n\nstruct CapsuleFrame_0\n{\n tangent_0 : vec2<f32>,\n normal_0 : vec2<f32>,\n};\n\nfn capsuleFrame_0( delta_0 : vec2<f32>, len_0 : f32) -> CapsuleFrame_0\n{\n var f_0 : CapsuleFrame_0;\n var _S15 : vec2<f32>;\n if(len_0 > 0.00009999999747379f)\n {\n _S15 = delta_0 / vec2<f32>(len_0);\n }\n else\n {\n _S15 = vec2<f32>(1.0f, 0.0f);\n }\n f_0.tangent_0 = _S15;\n f_0.normal_0 = vec2<f32>(- _S15.y, _S15.x);\n return f_0;\n}\n\nfn aaPx_0( dpr_0 : f32) -> f32\n{\n return 1.0f / max(dpr_0, 1.0f);\n}\n\nfn aaHalfPx_0( dpr_1 : f32) -> f32\n{\n return 0.5f * aaPx_0(dpr_1);\n}\n\nfn quadLocal_0( vid_0 : u32) -> vec2<f32>\n{\n var v_0 : u32 = vid_0 % u32(6);\n var _S16 : bool = v_0 == u32(0);\n var _S17 : bool;\n if(_S16)\n {\n _S17 = true;\n }\n else\n {\n _S17 = v_0 == u32(2);\n }\n if(_S17)\n {\n _S17 = true;\n }\n else\n {\n _S17 = v_0 == u32(3);\n }\n var _S18 : f32;\n if(_S17)\n {\n _S18 = 0.0f;\n }\n else\n {\n _S18 = 1.0f;\n }\n if(_S16)\n {\n _S17 = true;\n }\n else\n {\n _S17 = v_0 == u32(1);\n }\n if(_S17)\n {\n _S17 = true;\n }\n else\n {\n _S17 = v_0 == u32(4);\n }\n var _S19 : f32;\n if(_S17)\n {\n _S19 = 0.0f;\n }\n else\n {\n _S19 = 1.0f;\n }\n return vec2<f32>(_S18, _S19);\n}\n\nfn capsuleQuadLocal_0( vid_1 : u32, halfLenPx_0 : f32, halfWidthPx_0 : f32, dpr_2 : f32) -> vec2<f32>\n{\n var ext_0 : f32 = halfWidthPx_0 + aaHalfPx_0(dpr_2);\n var q_0 : vec2<f32> = quadLocal_0(vid_1) * vec2<f32>(2.0f) - vec2<f32>(1.0f);\n return vec2<f32>(q_0.x * (halfLenPx_0 + ext_0), q_0.y * ext_0);\n}\n\nfn pxToClipLen_0( px_0 : f32, size_0 : f32) -> f32\n{\n return px_0 * 2.0f / size_0;\n}\n\nfn yPxToClipY_0( yPx_0 : f32, canvasHeight_1 : f32) -> f32\n{\n return 1.0f - yPx_0 / canvasHeight_1 * 2.0f;\n}\n\nstruct VsOut_0\n{\n @builtin(position) position_0 : vec4<f32>,\n @interpolate(flat) @location(0) color_1 : vec4<f32>,\n @location(5) localPos_0 : vec2<f32>,\n @interpolate(flat) @location(1) segHalfLen_0 : f32,\n @interpolate(flat) @location(2) colorLine_0 : vec2<f32>,\n @interpolate(flat) @location(3) cutYsLo_0 : vec4<f32>,\n @interpolate(flat) @location(4) cutYsHi_0 : vec4<f32>,\n};\n\nstruct vertexInput_0\n{\n @location(0) x_2 : u32,\n @location(1) x2_0 : u32,\n @location(2) y_1 : f32,\n @location(3) color_2 : u32,\n @location(4) row_0 : u32,\n @location(5) prevX_0 : u32,\n @location(6) prevX2_0 : u32,\n @location(7) prevY_0 : f32,\n};\n\nfn markScaleColor_0( _S20 : texture_2d<f32>, _S21 : sampler, _S22 : u32, _S23 : i32, _S24 : f32, _S25 : f32, _S26 : f32, _S27 : i32, _S28 : vec4<f32>, _S29 : vec4<f32>) -> vec4<f32>\n{\n if(_S23 == i32(0))\n {\n return unpackRGBA_0(_S22);\n }\n if(_S22 == u32(2143289345))\n {\n return unpackRGBA_0(u32(4289703855));\n }\n var scaleType_3 : i32;\n if(((_S22 & (u32(2139095040)))) == u32(2139095040))\n {\n if(((_S22 & (u32(8388607)))) != u32(0))\n {\n return unpackRGBA_0(u32(4286611584));\n }\n var negative_0 : bool = ((_S22 & (u32(2147483648)))) != u32(0);\n if(_S23 == i32(3))\n {\n if(negative_0)\n {\n scaleType_3 = i32(0);\n }\n else\n {\n scaleType_3 = _S27;\n }\n return u_0.colorBands_0[scaleType_3];\n }\n var _S30 : f32;\n if(negative_0)\n {\n _S30 = 0.0f;\n }\n else\n {\n _S30 = 1.0f;\n }\n return rampColor_0(_S20, _S21, rampMidT_0(_S30, _S26));\n }\n var value_3 : f32 = (bitcast<f32>((_S22)));\n if(_S23 == i32(3))\n {\n return u_0.colorBands_0[thresholdBand_0(value_3, _S27, _S28, _S29)];\n }\n if(_S23 == i32(2))\n {\n scaleType_3 = i32(1);\n }\n else\n {\n scaleType_3 = i32(0);\n }\n return rampColor_0(_S20, _S21, rampMidT_0(normalizeScore_0(value_3, _S24, _S25, scaleType_3, 1.0f), _S26));\n}\n\nfn lineBpToClipX_0( _S31 : u32) -> f32\n{\n return hpToClipX_0(hpSplitUint_0(_S31), u_0.bpRangeX_0, u_0.zero_0);\n}\n\nfn lineValueYPx_0( _S32 : f32, _S33 : f32) -> f32\n{\n return _S33 + valueToYPxScaled_0(_S32, u_0.domainMin_0, u_0.domainMax_0, u_0.rowBandPx_0, u_0.valueScaleType_0, u_0.valueSymlogConstant_0);\n}\n\nfn lineColorYPx_0( _S34 : f32, _S35 : f32) -> f32\n{\n return _S35 + (1.0f - normalizeScoreUnclamped_0(_S34, u_0.domainMin_0, u_0.domainMax_0, u_0.valueScaleType_0, u_0.valueSymlogConstant_0)) * u_0.rowBandPx_0;\n}\n\nfn lineCutYsPx_0( _S36 : i32, _S37 : f32) -> vec4<f32>\n{\n var ys_0 : vec4<f32> = vec4<f32>(0.0f);\n var k_0 : i32 = i32(0);\n for(;;)\n {\n if(k_0 < i32(4))\n {\n }\n else\n {\n break;\n }\n var _S38 : i32 = _S36 + k_0;\n if(_S38 < (u_0.colorCutCount_0))\n {\n ys_0[k_0] = lineColorYPx_0(colorCutAt_0(_S38, u_0.colorCuts_0[i32(0)], u_0.colorCuts_0[i32(1)]), _S37);\n }\n k_0 = k_0 + i32(1);\n }\n return ys_0;\n}\n\n@vertex\nfn vs_main( _S39 : vertexInput_0, @builtin(vertex_index) vid_2 : u32) -> VsOut_0\n{\n var o_0 : VsOut_0;\n var _S40 : RowPlacement_0 = rowTableLookup_0(rowTable_texture_0, rowTable_sampler_0, _S39.row_0, u_0.rowTableKeys_0, markScaleColor_0(colorRamp_texture_0, colorRamp_sampler_0, _S39.color_2, u_0.rampMode_0, u_0.rampMin_0, u_0.rampMax_0, u_0.rampMidNorm_0, u_0.colorCutCount_0, u_0.colorCuts_0[i32(0)], u_0.colorCuts_0[i32(1)]));\n if(_S40.hidden_0)\n {\n o_0.position_0 = vec4<f32>(2.0f, 2.0f, 0.0f, 1.0f);\n var _S41 : vec4<f32> = vec4<f32>(0.0f);\n o_0.color_1 = _S41;\n var _S42 : vec2<f32> = vec2<f32>(0.0f);\n o_0.localPos_0 = _S42;\n o_0.segHalfLen_0 = 0.0f;\n o_0.colorLine_0 = _S42;\n o_0.cutYsLo_0 = _S41;\n o_0.cutYsHi_0 = _S41;\n return o_0;\n }\n var bandTop_0 : f32 = rowBandTopPx_0(u_0.rowOffsetPx_0, u_0.rowHeight_0, _S40.slot_0);\n var hasPrev_0 : bool = (_S39.prevX_0) != u32(4294967295);\n var midCurrX_0 : f32 = (lineBpToClipX_0(_S39.x_2) + lineBpToClipX_0(_S39.x2_0)) * 0.5f;\n var midPrevX_0 : f32;\n if(hasPrev_0)\n {\n midPrevX_0 = (lineBpToClipX_0(_S39.prevX_0) + lineBpToClipX_0(_S39.prevX2_0)) * 0.5f;\n }\n else\n {\n midPrevX_0 = midCurrX_0;\n }\n var _S43 : f32 = lineValueYPx_0(_S39.y_1, bandTop_0);\n var prevYPx_0 : f32;\n if(hasPrev_0)\n {\n prevYPx_0 = lineValueYPx_0(_S39.prevY_0, bandTop_0);\n }\n else\n {\n prevYPx_0 = _S43;\n }\n var deltaPx_0 : vec2<f32> = vec2<f32>((midCurrX_0 - midPrevX_0) * u_0.viewportWidth_0 * 0.5f, _S43 - prevYPx_0);\n var len_1 : f32 = length(deltaPx_0);\n var f_1 : CapsuleFrame_0 = capsuleFrame_0(deltaPx_0, len_1);\n var _S44 : f32 = len_1 * 0.5f;\n var local_0 : vec2<f32> = capsuleQuadLocal_0(vid_2, _S44, u_0.lineWidth_0 * 0.5f, u_0.devicePixelRatio_0);\n var off_0 : vec2<f32> = f_1.tangent_0 * vec2<f32>(local_0.x) + f_1.normal_0 * vec2<f32>(local_0.y);\n o_0.position_0 = vec4<f32>((midPrevX_0 + midCurrX_0) * 0.5f + pxToClipLen_0(off_0.x, u_0.viewportWidth_0), yPxToClipY_0((prevYPx_0 + _S43) * 0.5f + off_0.y, u_0.canvasHeight_0), 0.0f, 1.0f);\n o_0.color_1 = _S40.color_0;\n o_0.localPos_0 = local_0;\n o_0.segHalfLen_0 = _S44;\n var _S45 : f32 = lineColorYPx_0(_S39.y_1, bandTop_0);\n var prevColorYPx_0 : f32;\n if(hasPrev_0)\n {\n prevColorYPx_0 = lineColorYPx_0(_S39.prevY_0, bandTop_0);\n }\n else\n {\n prevColorYPx_0 = _S45;\n }\n var _S46 : f32 = (prevColorYPx_0 + _S45) * 0.5f;\n if(len_1 > 0.00009999999747379f)\n {\n midPrevX_0 = (_S45 - prevColorYPx_0) / len_1;\n }\n else\n {\n midPrevX_0 = 0.0f;\n }\n o_0.colorLine_0 = vec2<f32>(_S46, midPrevX_0);\n o_0.cutYsLo_0 = lineCutYsPx_0(i32(0), bandTop_0);\n o_0.cutYsHi_0 = lineCutYsPx_0(i32(4), bandTop_0);\n return o_0;\n}\n\nfn capsuleDistPx_0( alongPx_0 : f32, acrossPx_0 : f32, halfLenPx_1 : f32) -> f32\n{\n var _S47 : f32 = max(abs(alongPx_0) - halfLenPx_1, 0.0f);\n return sqrt(_S47 * _S47 + acrossPx_0 * acrossPx_0);\n}\n\nfn capsuleDist_0( local_1 : vec2<f32>, halfLenPx_2 : f32) -> f32\n{\n return capsuleDistPx_0(local_1.x, local_1.y, halfLenPx_2);\n}\n\nfn aaRamp_0( signedInk_0 : f32, widthPx_0 : f32) -> f32\n{\n return clamp(signedInk_0 / widthPx_0 + 0.5f, 0.0f, 1.0f);\n}\n\nfn edgeCoverage_0( signedInkCssPx_0 : f32, dpr_3 : f32) -> f32\n{\n return aaRamp_0(signedInkCssPx_0, aaPx_0(dpr_3));\n}\n\nfn thresholdBandAtYPx_0( yPx_1 : f32, cutCount_1 : i32, cutYsLo_1 : vec4<f32>, cutYsHi_1 : vec4<f32>) -> i32\n{\n var band_1 : i32 = i32(0);\n var i_2 : i32 = i32(0);\n for(;;)\n {\n if(i_2 < cutCount_1)\n {\n }\n else\n {\n break;\n }\n if(yPx_1 <= (colorCutAt_0(i_2, cutYsLo_1, cutYsHi_1)))\n {\n band_1 = i_2 + i32(1);\n }\n i_2 = i_2 + i32(1);\n }\n return band_1;\n}\n\nstruct pixelOutput_0\n{\n @location(0) output_0 : vec4<f32>,\n};\n\nstruct pixelInput_0\n{\n @interpolate(flat) @location(0) color_3 : vec4<f32>,\n @location(5) localPos_1 : vec2<f32>,\n @interpolate(flat) @location(1) segHalfLen_1 : f32,\n @interpolate(flat) @location(2) colorLine_1 : vec2<f32>,\n @interpolate(flat) @location(3) cutYsLo_2 : vec4<f32>,\n @interpolate(flat) @location(4) cutYsHi_2 : vec4<f32>,\n};\n\nfn lineFragmentColor_0( _S48 : f32, _S49 : vec4<f32>, _S50 : vec4<f32>, _S51 : vec4<f32>) -> vec4<f32>\n{\n if((u_0.rampMode_0) != i32(3))\n {\n return _S51;\n }\n return u_0.colorBands_0[thresholdBandAtYPx_0(_S48, u_0.colorCutCount_0, _S49, _S50)];\n}\n\n@fragment\nfn fs_main( _S52 : pixelInput_0, @builtin(position) position_1 : vec4<f32>) -> pixelOutput_0\n{\n var alpha_0 : f32 = edgeCoverage_0(u_0.lineWidth_0 * 0.5f - capsuleDist_0(_S52.localPos_1, _S52.segHalfLen_1), u_0.devicePixelRatio_0);\n if(alpha_0 <= 0.0f)\n {\n discard;\n }\n var _S53 : vec4<f32> = lineFragmentColor_0(_S52.colorLine_1.x + _S52.colorLine_1.y * clamp(_S52.localPos_1.x, - _S52.segHalfLen_1, _S52.segHalfLen_1), _S52.cutYsLo_2, _S52.cutYsHi_2, _S52.color_3);\n var _S54 : pixelOutput_0 = pixelOutput_0( vec4<f32>(_S53.xyz * vec3<f32>(alpha_0), _S53.w * alpha_0) );\n return _S54;\n}\n\n"
@@ -0,0 +1,6 @@
1
+ // AUTO-GENERATED by packages/shader-tools/src/shader-codegen from lineCommon.slang.
2
+ // Do not edit. Run `pnpm gen:shaders` to regenerate.
3
+
4
+ export const GAP_Y = -3e+38
5
+
6
+ export const NO_PREV_X = 4294967295
@@ -0,0 +1,102 @@
1
+ // What the two `line` shapes agree on: the uniform block, the sentinels the
2
+ // packer writes for a neighbour that is not there, and where a value lands
3
+ // in its band. `lineStepMark.slang` and `lineCenterMark.slang` are separate
4
+ // entry modules because a module reflects one instance struct and the two read
5
+ // different neighbours: the step line the previous and next values, the centre
6
+ // line the previous instance's span and value. One record carrying both would
7
+ // cost every instance the fields the other variant reads.
8
+ //
9
+ // Each consumer declares its OWN `[[vk::binding(1, 0)]] ConstantBuffer<Uniforms>
10
+ // u;` — the struct is shared, the binding is not — and imports `hpmath`,
11
+ // `markColor` and `rowTable` for itself, since Slang does not re-export through
12
+ // an import.
13
+ //! export-consts: GAP_Y, NO_PREV_X
14
+ module lineCommon;
15
+
16
+ import hpmath;
17
+ import markColor;
18
+ import scoreScale;
19
+ import valueScale;
20
+
21
+ // A step neighbour that is not adjacent, which the shader reads as the
22
+ // `origin`: the line drops to the baseline across a gap and rises again.
23
+ public static const float GAP_Y = -3.0e38;
24
+ // A centre instance with no previous point on its run, which draws as a dot.
25
+ public static const uint NO_PREV_X = 0xffffffffu;
26
+
27
+ public struct Uniforms {
28
+ public float3 bpRangeX;
29
+ public float canvasHeight;
30
+ public float domainMin;
31
+ public float domainMax;
32
+ // `scoreScale`'s scale-type vocabulary, for the declared y scale.
33
+ public int valueScaleType;
34
+ // Already resolved from the domain (`resolveSymlogConstant`); read by symlog alone.
35
+ public float valueSymlogConstant;
36
+ // `markColor`'s: 0 packs the instance's colour, 1 and 2 read its slot as a
37
+ // value through the ramp.
38
+ public int rampMode;
39
+ public float rampMin;
40
+ public float rampMax;
41
+ public float rampMidNorm;
42
+ // `markColor`'s threshold: how many cuts are in use, the cuts four to a
43
+ // vector, and the colour of each interval between them.
44
+ public int colorCutCount;
45
+ public float4 colorCuts[2];
46
+ public float4 colorBands[MAX_COLOR_BANDS];
47
+ // CSS px per row band; the canvas height where every instance is on row 0.
48
+ public float rowHeight;
49
+ // CSS px the value scale runs over inside a row, and how far below the
50
+ // row's top it starts.
51
+ public float rowBandPx;
52
+ public float rowOffsetPx;
53
+ // The value a step drops to across a gap, on the same scale as `y`.
54
+ public float origin;
55
+ public float lineWidth;
56
+ public float zero;
57
+ public float viewportWidth;
58
+ public float devicePixelRatio;
59
+ public int rowTableKeys;
60
+ };
61
+
62
+ public float lineBpToClipX(uint bp, Uniforms u) {
63
+ return hpToClipX(hpSplitUint(bp), u.bpRangeX, u.zero);
64
+ }
65
+
66
+ // A value's CSS px down the canvas in the band starting at `bandTop`: the
67
+ // shared value scale over the band, the anchor this shape's own (ADR-097).
68
+ public float lineValueYPx(float value, float bandTop, Uniforms u) {
69
+ return bandTop + valueToYPxScaled(value, u.domainMin, u.domainMax, u.rowBandPx, u.valueScaleType, u.valueSymlogConstant);
70
+ }
71
+
72
+ // A value's y in the band for the colour test, placed UNCLAMPED where
73
+ // `lineValueYPx` clamps it to draw: the cuts go through it, and so does the
74
+ // line a threshold colours along. Clamped, a cut outside the domain landed on
75
+ // the band edge out-of-domain values are clamped onto too, and a value past
76
+ // the domain took the side of that edge rather than its own.
77
+ public float lineColorYPx(float value, float bandTop, Uniforms u) {
78
+ float norm = normalizeScoreUnclamped(value, u.domainMin, u.domainMax, u.valueScaleType, u.valueSymlogConstant);
79
+ return bandTop + (1.0 - norm) * u.rowBandPx;
80
+ }
81
+
82
+ // Each cut's y in the band, four to a vector: placed once per vertex and
83
+ // handed to the fragment flat, so a pixel only compares. Slots past the count
84
+ // are 0.
85
+ public float4 lineCutYsPx(int from, float bandTop, Uniforms u) {
86
+ float4 ys = float4(0.0);
87
+ for (int k = 0; k < 4; k++) {
88
+ if (from + k < u.colorCutCount) {
89
+ ys[k] = lineColorYPx(colorCutAt(from + k, u.colorCuts[0], u.colorCuts[1]), bandTop, u);
90
+ }
91
+ }
92
+ return ys;
93
+ }
94
+
95
+ // A line fragment's colour: under a threshold, the interval the colour y it
96
+ // is read at falls in; otherwise the colour its vertex resolved.
97
+ public float4 lineFragmentColor(float colorYPx, float4 cutYsLo, float4 cutYsHi, float4 own, Uniforms u) {
98
+ if (u.rampMode != RAMP_THRESHOLD) {
99
+ return own;
100
+ }
101
+ return u.colorBands[thresholdBandAtYPx(colorYPx, u.colorCutCount, cutYsLo, cutYsHi)];
102
+ }