minerva-design 1.2.0 → 1.3.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.
- package/CHANGELOG.md +7 -0
- package/dist/charts/canvas.d.cts +4 -1
- package/dist/charts/canvas.d.ts +4 -1
- package/dist/charts/core.cjs +1 -1
- package/dist/charts/core.d.cts +5 -2
- package/dist/charts/core.d.ts +5 -2
- package/dist/charts/core.js +6 -4
- package/dist/charts/engine/canvas.cjs +1 -1
- package/dist/charts/engine/canvas.cjs.map +1 -1
- package/dist/charts/engine/canvas.js +65 -53
- package/dist/charts/engine/canvas.js.map +1 -1
- package/dist/charts/engine/chart.cjs +1 -2
- package/dist/charts/engine/chart.cjs.map +1 -1
- package/dist/charts/engine/chart.js +342 -323
- package/dist/charts/engine/chart.js.map +1 -1
- package/dist/charts/engine/color.cjs +1 -1
- package/dist/charts/engine/color.cjs.map +1 -1
- package/dist/charts/engine/color.d.cts +17 -0
- package/dist/charts/engine/color.d.ts +17 -0
- package/dist/charts/engine/color.js +27 -3
- package/dist/charts/engine/color.js.map +1 -1
- package/dist/charts/engine/controller.cjs +2 -2
- package/dist/charts/engine/controller.cjs.map +1 -1
- package/dist/charts/engine/controller.d.cts +6 -0
- package/dist/charts/engine/controller.d.ts +6 -0
- package/dist/charts/engine/controller.js +317 -253
- package/dist/charts/engine/controller.js.map +1 -1
- package/dist/charts/engine/curve.cjs +2 -0
- package/dist/charts/engine/curve.cjs.map +1 -0
- package/dist/charts/engine/curve.d.cts +15 -0
- package/dist/charts/engine/curve.d.ts +15 -0
- package/dist/charts/engine/curve.js +56 -0
- package/dist/charts/engine/curve.js.map +1 -0
- package/dist/charts/engine/data.cjs +1 -1
- package/dist/charts/engine/data.cjs.map +1 -1
- package/dist/charts/engine/data.d.cts +15 -2
- package/dist/charts/engine/data.d.ts +15 -2
- package/dist/charts/engine/data.js +98 -38
- package/dist/charts/engine/data.js.map +1 -1
- package/dist/charts/engine/dom.cjs +1 -1
- package/dist/charts/engine/dom.cjs.map +1 -1
- package/dist/charts/engine/dom.d.cts +5 -3
- package/dist/charts/engine/dom.d.ts +5 -3
- package/dist/charts/engine/dom.js +27 -22
- package/dist/charts/engine/dom.js.map +1 -1
- package/dist/charts/engine/items.cjs +1 -1
- package/dist/charts/engine/items.cjs.map +1 -1
- package/dist/charts/engine/items.js +132 -61
- package/dist/charts/engine/items.js.map +1 -1
- package/dist/charts/engine/model.cjs +1 -1
- package/dist/charts/engine/model.cjs.map +1 -1
- package/dist/charts/engine/model.d.cts +30 -3
- package/dist/charts/engine/model.d.ts +30 -3
- package/dist/charts/engine/model.js +225 -108
- package/dist/charts/engine/model.js.map +1 -1
- package/dist/charts/engine/overlay.cjs +1 -1
- package/dist/charts/engine/overlay.cjs.map +1 -1
- package/dist/charts/engine/overlay.d.cts +2 -0
- package/dist/charts/engine/overlay.d.ts +2 -0
- package/dist/charts/engine/overlay.js +16 -16
- package/dist/charts/engine/overlay.js.map +1 -1
- package/dist/charts/engine/presets.cjs +2 -2
- package/dist/charts/engine/presets.cjs.map +1 -1
- package/dist/charts/engine/presets.d.cts +71 -5
- package/dist/charts/engine/presets.d.ts +71 -5
- package/dist/charts/engine/presets.js +120 -33
- package/dist/charts/engine/presets.js.map +1 -1
- package/dist/charts/engine/renderers/canvas2d.cjs +1 -1
- package/dist/charts/engine/renderers/canvas2d.cjs.map +1 -1
- package/dist/charts/engine/renderers/canvas2d.js +149 -111
- package/dist/charts/engine/renderers/canvas2d.js.map +1 -1
- package/dist/charts/engine/renderers/range.cjs +1 -1
- package/dist/charts/engine/renderers/range.cjs.map +1 -1
- package/dist/charts/engine/renderers/range.js +4 -4
- package/dist/charts/engine/renderers/range.js.map +1 -1
- package/dist/charts/engine/renderers/shaders.cjs +37 -19
- package/dist/charts/engine/renderers/shaders.cjs.map +1 -1
- package/dist/charts/engine/renderers/shaders.d.cts +2 -2
- package/dist/charts/engine/renderers/shaders.d.ts +2 -2
- package/dist/charts/engine/renderers/shaders.js +37 -19
- package/dist/charts/engine/renderers/shaders.js.map +1 -1
- package/dist/charts/engine/renderers/types.cjs.map +1 -1
- package/dist/charts/engine/renderers/types.d.cts +11 -4
- package/dist/charts/engine/renderers/types.d.ts +11 -4
- package/dist/charts/engine/renderers/types.js.map +1 -1
- package/dist/charts/engine/renderers/webgl2.cjs +1 -1
- package/dist/charts/engine/renderers/webgl2.cjs.map +1 -1
- package/dist/charts/engine/renderers/webgl2.js +33 -12
- package/dist/charts/engine/renderers/webgl2.js.map +1 -1
- package/dist/charts/engine/renderers/webgpu.cjs +1 -1
- package/dist/charts/engine/renderers/webgpu.cjs.map +1 -1
- package/dist/charts/engine/renderers/webgpu.js +18 -15
- package/dist/charts/engine/renderers/webgpu.js.map +1 -1
- package/dist/charts/engine/scene.cjs +1 -1
- package/dist/charts/engine/scene.cjs.map +1 -1
- package/dist/charts/engine/scene.d.cts +19 -6
- package/dist/charts/engine/scene.d.ts +19 -6
- package/dist/charts/engine/scene.js +201 -89
- package/dist/charts/engine/scene.js.map +1 -1
- package/dist/charts/engine/shapes/canvas.cjs +2 -0
- package/dist/charts/engine/shapes/canvas.cjs.map +1 -0
- package/dist/charts/engine/shapes/canvas.d.cts +58 -0
- package/dist/charts/engine/shapes/canvas.d.ts +58 -0
- package/dist/charts/engine/shapes/canvas.js +159 -0
- package/dist/charts/engine/shapes/canvas.js.map +1 -0
- package/dist/charts/engine/shapes/chart.cjs +2 -0
- package/dist/charts/engine/shapes/chart.cjs.map +1 -0
- package/dist/charts/engine/shapes/chart.d.cts +6 -0
- package/dist/charts/engine/shapes/chart.d.ts +6 -0
- package/dist/charts/engine/shapes/chart.js +273 -0
- package/dist/charts/engine/shapes/chart.js.map +1 -0
- package/dist/charts/engine/shapes/draw.cjs +2 -0
- package/dist/charts/engine/shapes/draw.cjs.map +1 -0
- package/dist/charts/engine/shapes/draw.d.cts +20 -0
- package/dist/charts/engine/shapes/draw.d.ts +20 -0
- package/dist/charts/engine/shapes/draw.js +152 -0
- package/dist/charts/engine/shapes/draw.js.map +1 -0
- package/dist/charts/engine/shapes/funnel.cjs +2 -0
- package/dist/charts/engine/shapes/funnel.cjs.map +1 -0
- package/dist/charts/engine/shapes/funnel.d.cts +6 -0
- package/dist/charts/engine/shapes/funnel.d.ts +6 -0
- package/dist/charts/engine/shapes/funnel.js +149 -0
- package/dist/charts/engine/shapes/funnel.js.map +1 -0
- package/dist/charts/engine/shapes/gauge.cjs +2 -0
- package/dist/charts/engine/shapes/gauge.cjs.map +1 -0
- package/dist/charts/engine/shapes/gauge.d.cts +7 -0
- package/dist/charts/engine/shapes/gauge.d.ts +7 -0
- package/dist/charts/engine/shapes/gauge.js +173 -0
- package/dist/charts/engine/shapes/gauge.js.map +1 -0
- package/dist/charts/engine/shapes/hit.cjs +2 -0
- package/dist/charts/engine/shapes/hit.cjs.map +1 -0
- package/dist/charts/engine/shapes/hit.d.cts +28 -0
- package/dist/charts/engine/shapes/hit.d.ts +28 -0
- package/dist/charts/engine/shapes/hit.js +124 -0
- package/dist/charts/engine/shapes/hit.js.map +1 -0
- package/dist/charts/engine/shapes/index.d.cts +9 -0
- package/dist/charts/engine/shapes/index.d.ts +9 -0
- package/dist/charts/engine/shapes/layout.cjs +3 -0
- package/dist/charts/engine/shapes/layout.cjs.map +1 -0
- package/dist/charts/engine/shapes/layout.d.cts +88 -0
- package/dist/charts/engine/shapes/layout.d.ts +88 -0
- package/dist/charts/engine/shapes/layout.js +266 -0
- package/dist/charts/engine/shapes/layout.js.map +1 -0
- package/dist/charts/engine/shapes/pie.cjs +2 -0
- package/dist/charts/engine/shapes/pie.cjs.map +1 -0
- package/dist/charts/engine/shapes/pie.d.cts +20 -0
- package/dist/charts/engine/shapes/pie.d.ts +20 -0
- package/dist/charts/engine/shapes/pie.js +302 -0
- package/dist/charts/engine/shapes/pie.js.map +1 -0
- package/dist/charts/engine/shapes/radar.cjs +2 -0
- package/dist/charts/engine/shapes/radar.cjs.map +1 -0
- package/dist/charts/engine/shapes/radar.d.cts +8 -0
- package/dist/charts/engine/shapes/radar.d.ts +8 -0
- package/dist/charts/engine/shapes/radar.js +197 -0
- package/dist/charts/engine/shapes/radar.js.map +1 -0
- package/dist/charts/engine/shapes/runtime.cjs +2 -0
- package/dist/charts/engine/shapes/runtime.cjs.map +1 -0
- package/dist/charts/engine/shapes/runtime.d.cts +29 -0
- package/dist/charts/engine/shapes/runtime.d.ts +29 -0
- package/dist/charts/engine/shapes/runtime.js +97 -0
- package/dist/charts/engine/shapes/runtime.js.map +1 -0
- package/dist/charts/engine/shapes/scene.cjs +2 -0
- package/dist/charts/engine/shapes/scene.cjs.map +1 -0
- package/dist/charts/engine/shapes/scene.d.cts +257 -0
- package/dist/charts/engine/shapes/scene.d.ts +257 -0
- package/dist/charts/engine/shapes/scene.js +123 -0
- package/dist/charts/engine/shapes/scene.js.map +1 -0
- package/dist/charts/engine/shapes/treemap.cjs +2 -0
- package/dist/charts/engine/shapes/treemap.cjs.map +1 -0
- package/dist/charts/engine/shapes/treemap.d.cts +14 -0
- package/dist/charts/engine/shapes/treemap.d.ts +14 -0
- package/dist/charts/engine/shapes/treemap.js +213 -0
- package/dist/charts/engine/shapes/treemap.js.map +1 -0
- package/dist/charts/engine/shapes/types.d.cts +292 -0
- package/dist/charts/engine/shapes/types.d.ts +292 -0
- package/dist/charts/engine/signature.cjs +2 -0
- package/dist/charts/engine/signature.cjs.map +1 -0
- package/dist/charts/engine/signature.d.cts +9 -0
- package/dist/charts/engine/signature.d.ts +9 -0
- package/dist/charts/engine/signature.js +13 -0
- package/dist/charts/engine/signature.js.map +1 -0
- package/dist/charts/engine/theme.cjs +1 -1
- package/dist/charts/engine/theme.cjs.map +1 -1
- package/dist/charts/engine/theme.d.cts +10 -1
- package/dist/charts/engine/theme.d.ts +10 -1
- package/dist/charts/engine/theme.js +40 -16
- package/dist/charts/engine/theme.js.map +1 -1
- package/dist/charts/engine/types.d.cts +70 -9
- package/dist/charts/engine/types.d.ts +70 -9
- package/dist/charts/index.cjs +1 -1
- package/dist/charts/index.d.cts +4 -2
- package/dist/charts/index.d.ts +4 -2
- package/dist/charts/index.js +8 -5
- package/dist/charts/react/Chart.cjs +1 -1
- package/dist/charts/react/Chart.cjs.map +1 -1
- package/dist/charts/react/Chart.d.cts +8 -1
- package/dist/charts/react/Chart.d.ts +8 -1
- package/dist/charts/react/Chart.js +66 -47
- package/dist/charts/react/Chart.js.map +1 -1
- package/dist/charts/react/charts.cjs +1 -1
- package/dist/charts/react/charts.cjs.map +1 -1
- package/dist/charts/react/charts.d.cts +10 -2
- package/dist/charts/react/charts.d.ts +10 -2
- package/dist/charts/react/charts.js +174 -51
- package/dist/charts/react/charts.js.map +1 -1
- package/dist/charts/react/shapes.cjs +2 -0
- package/dist/charts/react/shapes.cjs.map +1 -0
- package/dist/charts/react/shapes.d.cts +255 -0
- package/dist/charts/react/shapes.d.ts +255 -0
- package/dist/charts/react/shapes.js +242 -0
- package/dist/charts/react/shapes.js.map +1 -0
- package/dist/charts/react/types.d.cts +73 -4
- package/dist/charts/react/types.d.ts +73 -4
- package/dist/native/charts/src/engine/color.cjs +1 -1
- package/dist/native/charts/src/engine/color.cjs.map +1 -1
- package/dist/native/charts/src/engine/color.js +12 -3
- package/dist/native/charts/src/engine/color.js.map +1 -1
- package/dist/native/charts/src/engine/controller.cjs +2 -2
- package/dist/native/charts/src/engine/controller.cjs.map +1 -1
- package/dist/native/charts/src/engine/controller.js +334 -270
- package/dist/native/charts/src/engine/controller.js.map +1 -1
- package/dist/native/charts/src/engine/curve.cjs +2 -0
- package/dist/native/charts/src/engine/curve.cjs.map +1 -0
- package/dist/native/charts/src/engine/curve.js +56 -0
- package/dist/native/charts/src/engine/curve.js.map +1 -0
- package/dist/native/charts/src/engine/data.cjs +1 -1
- package/dist/native/charts/src/engine/data.cjs.map +1 -1
- package/dist/native/charts/src/engine/data.js +98 -38
- package/dist/native/charts/src/engine/data.js.map +1 -1
- package/dist/native/charts/src/engine/model.cjs +1 -1
- package/dist/native/charts/src/engine/model.cjs.map +1 -1
- package/dist/native/charts/src/engine/model.js +229 -112
- package/dist/native/charts/src/engine/model.js.map +1 -1
- package/dist/native/charts/src/engine/overlay.cjs +1 -1
- package/dist/native/charts/src/engine/overlay.cjs.map +1 -1
- package/dist/native/charts/src/engine/overlay.js +16 -16
- package/dist/native/charts/src/engine/overlay.js.map +1 -1
- package/dist/native/charts/src/engine/presets.cjs +1 -1
- package/dist/native/charts/src/engine/presets.cjs.map +1 -1
- package/dist/native/charts/src/engine/presets.js +11 -4
- package/dist/native/charts/src/engine/presets.js.map +1 -1
- package/dist/native/charts/src/engine/scene.cjs +1 -1
- package/dist/native/charts/src/engine/scene.cjs.map +1 -1
- package/dist/native/charts/src/engine/scene.js +209 -97
- package/dist/native/charts/src/engine/scene.js.map +1 -1
- package/dist/native/charts/src/engine/theme.cjs.map +1 -1
- package/dist/native/charts/src/engine/theme.js.map +1 -1
- package/dist/native/components/Chart/scene.cjs +1 -1
- package/dist/native/components/Chart/scene.cjs.map +1 -1
- package/dist/native/components/Chart/scene.js +31 -19
- package/dist/native/components/Chart/scene.js.map +1 -1
- package/dist/native/source/components/Chart/scene.tsx +54 -20
- package/dist/taro/index.js +1059 -579
- package/dist/uni/charts-canvas.js +3 -1
- package/dist/weapp/controls.js +966 -225
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgl2.cjs","names":["GLSL_LINE","GLSL_AREA","GLSL_BAR","GLSL_SCATTER","instanceRange","require_range","require_shaders","ATTRIBUTES","compile","shader","s","gl","type","code","vs","source","fs","program","attributes","i","name","SOFTWARE_RENDERER","isSoftwareRenderer","info","createWebGl2Renderer","canvas","requireHardware","line","area","bar","scatter","programs","lost","handleLost","event","onLost","resources","setupAttributes","F","item","first","release","res","upload","existing","buffer","vao","params","frame","width","height","t","seen","items","instances","p0","p1","key","p"],"sources":["../../../../../charts/src/engine/renderers/webgl2.ts"],"sourcesContent":["// WebGL2 backend: same instanced primitives as WebGPU, in GLSL ES 3.0.\n\nimport { instanceRange } from \"./range\";\nimport { GLSL_AREA, GLSL_BAR, GLSL_LINE, GLSL_SCATTER } from \"./shaders\";\nimport {\n SCATTER_STRIDE,\n type ChartRenderer,\n type RenderFrame,\n type RenderItem,\n type RendererLostHandler,\n} from \"./types\";\n\ninterface Program {\n program: WebGLProgram;\n xform: WebGLUniformLocation | null;\n viewport: WebGLUniformLocation | null;\n color: WebGLUniformLocation | null;\n params: WebGLUniformLocation | null;\n}\n\ninterface ItemResources {\n version: number;\n kind: RenderItem[\"kind\"];\n buffer: WebGLBuffer;\n vao: WebGLVertexArrayObject;\n /** First instance the attribute pointers start at */\n first: number;\n}\n\nconst ATTRIBUTES: Record<RenderItem[\"kind\"], string[]> = {\n line: [\"a_a\", \"a_b\"],\n area: [\"a_a\", \"a_b\"],\n bar: [\"a_inst\"],\n scatter: [\"a_pos\", \"a_size\", \"a_color\"],\n};\n\nconst compile = (\n gl: WebGL2RenderingContext,\n source: { vertex: string; fragment: string },\n attributes: string[],\n): Program | null => {\n const shader = (type: number, code: string) => {\n const s = gl.createShader(type);\n if (!s) return null;\n gl.shaderSource(s, code);\n gl.compileShader(s);\n if (!gl.getShaderParameter(s, gl.COMPILE_STATUS)) {\n gl.deleteShader(s);\n return null;\n }\n return s;\n };\n const vs = shader(gl.VERTEX_SHADER, source.vertex);\n const fs = shader(gl.FRAGMENT_SHADER, source.fragment);\n const program = gl.createProgram();\n if (!vs || !fs || !program) return null;\n gl.attachShader(program, vs);\n gl.attachShader(program, fs);\n attributes.forEach((name, i) => gl.bindAttribLocation(program, i, name));\n gl.linkProgram(program);\n gl.deleteShader(vs);\n gl.deleteShader(fs);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n gl.deleteProgram(program);\n return null;\n }\n return {\n program,\n xform: gl.getUniformLocation(program, \"u_xform\"),\n viewport: gl.getUniformLocation(program, \"u_viewport\"),\n color: gl.getUniformLocation(program, \"u_color\"),\n params: gl.getUniformLocation(program, \"u_params\"),\n };\n};\n\nexport const SOFTWARE_RENDERER =\n /swiftshader|llvmpipe|softpipe|software|basic render driver|microsoft basic/i;\n\n/** Software rasterizer (SwiftShader, llvmpipe, ...) behind the WebGL context */\nconst isSoftwareRenderer = (gl: WebGL2RenderingContext): boolean => {\n const info = gl.getExtension(\"WEBGL_debug_renderer_info\");\n const name = info\n ? gl.getParameter(info.UNMASKED_RENDERER_WEBGL)\n : gl.getParameter(gl.RENDERER);\n return SOFTWARE_RENDERER.test(String(name ?? \"\"));\n};\n\nexport const createWebGl2Renderer = (\n canvas: HTMLCanvasElement,\n onLost: RendererLostHandler,\n /** Refuses software rendering (SwiftShader, blocklisted GPUs): Canvas2D with decimation is faster there */\n requireHardware = false,\n): ChartRenderer | null => {\n const gl = canvas.getContext(\"webgl2\", {\n alpha: true,\n premultipliedAlpha: true,\n antialias: false,\n depth: false,\n stencil: false,\n preserveDrawingBuffer: false,\n failIfMajorPerformanceCaveat: requireHardware,\n });\n if (!gl) return null;\n if (requireHardware && isSoftwareRenderer(gl)) {\n gl.getExtension(\"WEBGL_lose_context\")?.loseContext();\n return null;\n }\n\n const line = compile(gl, GLSL_LINE, ATTRIBUTES.line);\n const area = compile(gl, GLSL_AREA, ATTRIBUTES.area);\n const bar = compile(gl, GLSL_BAR, ATTRIBUTES.bar);\n const scatter = compile(gl, GLSL_SCATTER, ATTRIBUTES.scatter);\n if (!line || !area || !bar || !scatter) return null;\n const programs = { line, area, bar, scatter };\n\n let lost = false;\n const handleLost = (event: Event) => {\n event.preventDefault();\n lost = true;\n onLost();\n };\n canvas.addEventListener(\"webglcontextlost\", handleLost);\n\n const resources = new Map<string, ItemResources>();\n\n /** WebGL2 has no base instance: the pointers start at the first instance */\n const setupAttributes = (item: RenderItem, first: number) => {\n const F = gl.FLOAT;\n switch (item.kind) {\n case \"line\":\n case \"area\":\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, F, false, 8, first * 8);\n gl.vertexAttribDivisor(0, 1);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 2, F, false, 8, first * 8 + 8);\n gl.vertexAttribDivisor(1, 1);\n break;\n case \"bar\":\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 3, F, false, 12, first * 12);\n gl.vertexAttribDivisor(0, 1);\n break;\n default:\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, F, false, SCATTER_STRIDE, 0);\n gl.vertexAttribDivisor(0, 1);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 1, F, false, SCATTER_STRIDE, 8);\n gl.vertexAttribDivisor(1, 1);\n gl.enableVertexAttribArray(2);\n gl.vertexAttribPointer(\n 2,\n 4,\n gl.UNSIGNED_BYTE,\n true,\n SCATTER_STRIDE,\n 12,\n );\n gl.vertexAttribDivisor(2, 1);\n break;\n }\n };\n\n const release = (res: ItemResources) => {\n gl.deleteBuffer(res.buffer);\n gl.deleteVertexArray(res.vao);\n };\n\n const upload = (item: RenderItem): ItemResources | null => {\n const existing = resources.get(item.key);\n if (\n existing &&\n existing.version === item.version &&\n existing.kind === item.kind\n ) {\n return existing;\n }\n if (existing) release(existing);\n const buffer = gl.createBuffer();\n const vao = gl.createVertexArray();\n if (!buffer || !vao) return null;\n gl.bindVertexArray(vao);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n switch (item.kind) {\n case \"line\":\n case \"area\":\n gl.bufferData(\n gl.ARRAY_BUFFER,\n item.points,\n gl.STATIC_DRAW,\n 0,\n item.count * 2,\n );\n break;\n case \"bar\":\n gl.bufferData(\n gl.ARRAY_BUFFER,\n item.instances,\n gl.STATIC_DRAW,\n 0,\n item.count * 3,\n );\n break;\n default:\n gl.bufferData(gl.ARRAY_BUFFER, item.instances, gl.STATIC_DRAW);\n break;\n }\n setupAttributes(item, 0);\n gl.bindVertexArray(null);\n const res = {\n version: item.version,\n kind: item.kind,\n buffer,\n vao,\n first: 0,\n };\n resources.set(item.key, res);\n return res;\n };\n\n const params = (item: RenderItem, frame: RenderFrame): [number, number] => {\n switch (item.kind) {\n case \"line\":\n return [(item.width * frame.dpr) / 2, 0];\n case \"area\":\n return [item.baseline, item.opacity];\n case \"bar\":\n return [item.halfWidth, item.radius];\n default:\n return [item.opacity, item.stroke];\n }\n };\n\n return {\n kind: \"webgl2\",\n canvas,\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(items, frame) {\n if (lost || gl.isContextLost()) return;\n gl.viewport(0, 0, canvas.width, canvas.height);\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n const t = frame.transform;\n const seen = new Set<string>();\n for (const item of items) {\n seen.add(item.key);\n const [first, instances] = instanceRange(item, frame);\n if (instances <= 0) continue;\n const res = upload(item);\n if (!res) continue;\n const program = programs[item.kind];\n gl.useProgram(program.program);\n gl.uniform4f(program.xform, t.xScale, t.xOffset, t.yScale, t.yOffset);\n gl.uniform4f(program.viewport, frame.width, frame.height, frame.dpr, 0);\n gl.uniform4f(\n program.color,\n item.color[0],\n item.color[1],\n item.color[2],\n item.color[3],\n );\n const [p0, p1] = params(item, frame);\n gl.uniform4f(program.params, p0, p1, 0, 0);\n gl.bindVertexArray(res.vao);\n if (res.first !== first) {\n gl.bindBuffer(gl.ARRAY_BUFFER, res.buffer);\n setupAttributes(item, first);\n res.first = first;\n }\n gl.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, 4, instances);\n }\n gl.bindVertexArray(null);\n for (const [key, res] of resources) {\n if (!seen.has(key)) {\n release(res);\n resources.delete(key);\n }\n }\n },\n destroy() {\n canvas.removeEventListener(\"webglcontextlost\", handleLost);\n if (!gl.isContextLost()) {\n for (const res of resources.values()) release(res);\n for (const p of Object.values(programs)) gl.deleteProgram(p.program);\n }\n resources.clear();\n gl.getExtension(\"WEBGL_lose_context\")?.loseContext();\n },\n };\n};\n"],"mappings":"0DA6BA,IAAMO,EAAmD,CACvD,KAAM,CAAC,MAAO,KAAK,EACnB,KAAM,CAAC,MAAO,KAAK,EACnB,IAAK,CAAC,QAAQ,EACd,QAAS,CAAC,QAAS,SAAU,SAAS,CACxC,EAEMC,GACJ,EACA,EACA,IACmB,CACnB,IAAMC,GAAU,EAAc,IAAiB,CAC7C,IAAMC,EAAIC,EAAG,aAAaC,CAAI,EAQ9B,OAPKF,GACLC,EAAG,aAAaD,EAAGG,CAAI,EACvBF,EAAG,cAAcD,CAAC,EACbC,EAAG,mBAAmBD,EAAGC,EAAG,cAAc,EAIxCD,GAHLC,EAAG,aAAaD,CAAC,EACV,OALM,IAQjB,EACMI,EAAKL,EAAOE,EAAG,cAAeI,EAAO,MAAM,EAC3CC,EAAKP,EAAOE,EAAG,gBAAiBI,EAAO,QAAQ,EAC/CE,EAAUN,EAAG,cAAc,EAYjC,MAXI,CAACG,GAAM,CAACE,GAAM,CAACC,EAAgB,MACnCN,EAAG,aAAaM,EAASH,CAAE,EAC3BH,EAAG,aAAaM,EAASD,CAAE,EAC3BE,EAAW,SAAS,EAAM,IAAMP,EAAG,mBAAmBM,EAASE,EAAGC,CAAI,CAAC,EACvET,EAAG,YAAYM,CAAO,EACtBN,EAAG,aAAaG,CAAE,EAClBH,EAAG,aAAaK,CAAE,EACbL,EAAG,oBAAoBM,EAASN,EAAG,WAAW,EAI5C,CACL,UACA,MAAOA,EAAG,mBAAmBM,EAAS,SAAS,EAC/C,SAAUN,EAAG,mBAAmBM,EAAS,YAAY,EACrD,MAAON,EAAG,mBAAmBM,EAAS,SAAS,EAC/C,OAAQN,EAAG,mBAAmBM,EAAS,UAAU,CACnD,GATEN,EAAG,cAAcM,CAAO,EACjB,MASX,EAEaI,EACX,8EAGIC,EAAsB,GAAwC,CAClE,IAAMC,EAAOZ,EAAG,aAAa,2BAA2B,EAClDS,EAAOG,EACTZ,EAAG,aAAaY,EAAK,uBAAuB,EAC5CZ,EAAG,aAAaA,EAAG,QAAQ,EAC/B,OAAOU,EAAkB,KAAK,OAAOD,GAAQ,EAAE,CAAC,CAClD,EAEaI,GACX,EACA,EAEA,EAAkB,KACO,CACzB,IAAMb,EAAKc,EAAO,WAAW,SAAU,CACrC,MAAO,GACP,mBAAoB,GACpB,UAAW,GACX,MAAO,GACP,QAAS,GACT,sBAAuB,GACvB,6BAA8BC,CAChC,CAAC,EACD,GAAI,CAACf,EAAI,OAAO,KAChB,GAAIe,GAAmBJ,EAAmBX,CAAE,EAE1C,OADAA,EAAG,aAAa,oBAAoB,CAAC,EAAE,YAAY,EAC5C,KAGT,IAAMgB,EAAOnB,EAAQG,EAAIX,EAAAA,UAAWO,EAAW,IAAI,EAC7CqB,EAAOpB,EAAQG,EAAIV,EAAAA,UAAWM,EAAW,IAAI,EAC7CsB,EAAMrB,EAAQG,EAAIT,EAAAA,SAAUK,EAAW,GAAG,EAC1CuB,EAAUtB,EAAQG,EAAIR,EAAAA,aAAcI,EAAW,OAAO,EAC5D,GAAI,CAACoB,GAAQ,CAACC,GAAQ,CAACC,GAAO,CAACC,EAAS,OAAO,KAC/C,IAAMC,EAAW,CAAE,OAAM,OAAM,MAAK,SAAQ,EAExCC,EAAO,GACLC,EAAc,GAAiB,CACnCC,EAAM,eAAe,EACrB,EAAO,GACPC,EAAO,CACT,EACAV,EAAO,iBAAiB,mBAAoBQ,CAAU,EAEtD,IAAMG,EAAY,IAAI,IAGhBC,GAAmB,EAAkB,IAAkB,CAC3D,IAAMC,EAAI3B,EAAG,MACb,OAAQ4B,EAAK,KAAb,CACE,IAAK,OACL,IAAK,OACH5B,EAAG,wBAAwB,CAAC,EAC5BA,EAAG,oBAAoB,EAAG,EAAG2B,EAAG,GAAO,EAAGE,EAAQ,CAAC,EACnD7B,EAAG,oBAAoB,EAAG,CAAC,EAC3BA,EAAG,wBAAwB,CAAC,EAC5BA,EAAG,oBAAoB,EAAG,EAAG2B,EAAG,GAAO,EAAGE,EAAQ,EAAI,CAAC,EACvD7B,EAAG,oBAAoB,EAAG,CAAC,EAC3B,MACF,IAAK,MACHA,EAAG,wBAAwB,CAAC,EAC5BA,EAAG,oBAAoB,EAAG,EAAG2B,EAAG,GAAO,GAAIE,EAAQ,EAAE,EACrD7B,EAAG,oBAAoB,EAAG,CAAC,EAC3B,MACF,QACEA,EAAG,wBAAwB,CAAC,EAC5BA,EAAG,oBAAoB,EAAG,EAAG2B,EAAG,GAAA,GAAuB,CAAC,EACxD3B,EAAG,oBAAoB,EAAG,CAAC,EAC3BA,EAAG,wBAAwB,CAAC,EAC5BA,EAAG,oBAAoB,EAAG,EAAG2B,EAAG,GAAA,GAAuB,CAAC,EACxD3B,EAAG,oBAAoB,EAAG,CAAC,EAC3BA,EAAG,wBAAwB,CAAC,EAC5BA,EAAG,oBACD,EACA,EACAA,EAAG,cACH,GAAA,GAEA,EACF,EACAA,EAAG,oBAAoB,EAAG,CAAC,CAE/B,CACF,EAEM8B,EAAW,GAAuB,CACtC9B,EAAG,aAAa+B,EAAI,MAAM,EAC1B/B,EAAG,kBAAkB+B,EAAI,GAAG,CAC9B,EAEMC,EAAU,GAA2C,CACzD,IAAMC,EAAWR,EAAU,IAAIG,EAAK,GAAG,EACvC,GACEK,GACAA,EAAS,UAAYL,EAAK,SAC1BK,EAAS,OAASL,EAAK,KAEvB,OAAOK,EAELA,GAAUH,EAAQG,CAAQ,EAC9B,IAAMC,EAASlC,EAAG,aAAa,EACzBmC,EAAMnC,EAAG,kBAAkB,EACjC,GAAI,CAACkC,GAAU,CAACC,EAAK,OAAO,KAG5B,OAFAnC,EAAG,gBAAgBmC,CAAG,EACtBnC,EAAG,WAAWA,EAAG,aAAckC,CAAM,EAC7BN,EAAK,KAAb,CACE,IAAK,OACL,IAAK,OACH5B,EAAG,WACDA,EAAG,aACH4B,EAAK,OACL5B,EAAG,YACH,EACA4B,EAAK,MAAQ,CACf,EACA,MACF,IAAK,MACH5B,EAAG,WACDA,EAAG,aACH4B,EAAK,UACL5B,EAAG,YACH,EACA4B,EAAK,MAAQ,CACf,EACA,MACF,QACE5B,EAAG,WAAWA,EAAG,aAAc4B,EAAK,UAAW5B,EAAG,WAAW,CAEjE,CACA0B,EAAgBE,EAAM,CAAC,EACvB5B,EAAG,gBAAgB,IAAI,EACvB,IAAM+B,EAAM,CACV,QAASH,EAAK,QACd,KAAMA,EAAK,KACX,SACA,MACA,MAAO,CACT,EAEA,OADAH,EAAU,IAAIG,EAAK,IAAKG,CAAG,EACpBA,CACT,EAEMK,GAAU,EAAkB,IAAyC,CACzE,OAAQR,EAAK,KAAb,CACE,IAAK,OACH,MAAO,CAAEA,EAAK,MAAQS,EAAM,IAAO,EAAG,CAAC,EACzC,IAAK,OACH,MAAO,CAACT,EAAK,SAAUA,EAAK,OAAO,EACrC,IAAK,MACH,MAAO,CAACA,EAAK,UAAWA,EAAK,MAAM,EACrC,QACE,MAAO,CAACA,EAAK,QAASA,EAAK,MAAM,CACrC,CACF,EAEA,MAAO,CACL,KAAM,SACN,SACA,OAAO,EAAO,EAAQ,CACpB,EAAO,MAAQ,KAAK,IAAI,EAAGU,CAAK,EAChC,EAAO,OAAS,KAAK,IAAI,EAAGC,CAAM,CACpC,EACA,OAAO,EAAO,EAAO,CACnB,GAAIlB,GAAQrB,EAAG,cAAc,EAAG,OAChCA,EAAG,SAAS,EAAG,EAAGc,EAAO,MAAOA,EAAO,MAAM,EAC7Cd,EAAG,WAAW,EAAG,EAAG,EAAG,CAAC,EACxBA,EAAG,MAAMA,EAAG,gBAAgB,EAC5BA,EAAG,OAAOA,EAAG,KAAK,EAClBA,EAAG,UAAUA,EAAG,IAAKA,EAAG,mBAAmB,EAC3C,IAAMwC,EAAIH,EAAM,UACVI,EAAO,IAAI,IACjB,IAAK,IAAMb,KAAQc,EAAO,CACxBD,EAAK,IAAIb,EAAK,GAAG,EACjB,GAAM,CAACC,EAAOc,GAAalD,EAAAA,cAAcmC,EAAMS,CAAK,EACpD,GAAIM,GAAa,EAAG,SACpB,IAAMZ,EAAMC,EAAOJ,CAAI,EACvB,GAAI,CAACG,EAAK,SACV,IAAMzB,EAAUc,EAASQ,EAAK,MAC9B5B,EAAG,WAAWM,EAAQ,OAAO,EAC7BN,EAAG,UAAUM,EAAQ,MAAOkC,EAAE,OAAQA,EAAE,QAASA,EAAE,OAAQA,EAAE,OAAO,EACpExC,EAAG,UAAUM,EAAQ,SAAU+B,EAAM,MAAOA,EAAM,OAAQA,EAAM,IAAK,CAAC,EACtErC,EAAG,UACDM,EAAQ,MACRsB,EAAK,MAAM,GACXA,EAAK,MAAM,GACXA,EAAK,MAAM,GACXA,EAAK,MAAM,EACb,EACA,GAAM,CAACgB,EAAIC,GAAMT,EAAOR,EAAMS,CAAK,EACnCrC,EAAG,UAAUM,EAAQ,OAAQsC,EAAIC,EAAI,EAAG,CAAC,EACzC7C,EAAG,gBAAgB+B,EAAI,GAAG,EACtBA,EAAI,QAAUF,IAChB7B,EAAG,WAAWA,EAAG,aAAc+B,EAAI,MAAM,EACzCL,EAAgBE,EAAMC,CAAK,EAC3B,EAAI,MAAQA,GAEd7B,EAAG,oBAAoBA,EAAG,eAAgB,EAAG,EAAG2C,CAAS,CAC3D,CACA3C,EAAG,gBAAgB,IAAI,EACvB,IAAK,GAAM,CAAC8C,EAAKf,KAAQN,EAClBgB,EAAK,IAAIK,CAAG,IACfhB,EAAQC,CAAG,EACXN,EAAU,OAAOqB,CAAG,EAG1B,EACA,SAAU,CAER,GADAhC,EAAO,oBAAoB,mBAAoBQ,CAAU,EACrD,CAACtB,EAAG,cAAc,EAAG,CACvB,IAAK,IAAM+B,KAAON,EAAU,OAAO,EAAGK,EAAQC,CAAG,EACjD,IAAK,IAAMgB,KAAK,OAAO,OAAO3B,CAAQ,EAAGpB,EAAG,cAAc+C,EAAE,OAAO,CACrE,CACAtB,EAAU,MAAM,EAChBzB,EAAG,aAAa,oBAAoB,CAAC,EAAE,YAAY,CACrD,CACF,CACF"}
|
|
1
|
+
{"version":3,"file":"webgl2.cjs","names":["GLSL_LINE","GLSL_AREA","GLSL_BAR","GLSL_SCATTER","instanceRange","require_range","require_shaders","ATTRIBUTES","compile","shader","s","gl","type","code","vs","source","fs","program","attributes","i","name","SOFTWARE_RENDERER","isSoftwareRenderer","info","createWebGl2Renderer","canvas","requireHardware","line","area","bar","scatter","programs","lost","handleLost","event","onLost","resources","setupAttributes","F","item","first","release","res","upload","existing","buffer","vao","params","frame","width","height","t","seen","items","instances","p0","p1","p2","p3","key","p"],"sources":["../../../../../charts/src/engine/renderers/webgl2.ts"],"sourcesContent":["// WebGL2 backend: same instanced primitives as WebGPU, in GLSL ES 3.0.\n\nimport { instanceRange } from \"./range\";\nimport { GLSL_AREA, GLSL_BAR, GLSL_LINE, GLSL_SCATTER } from \"./shaders\";\nimport {\n AREA_STRIDE,\n BAR_STRIDE,\n SCATTER_STRIDE,\n type ChartRenderer,\n type RenderFrame,\n type RenderItem,\n type RendererLostHandler,\n} from \"./types\";\n\ninterface Program {\n program: WebGLProgram;\n xform: WebGLUniformLocation | null;\n viewport: WebGLUniformLocation | null;\n color: WebGLUniformLocation | null;\n params: WebGLUniformLocation | null;\n}\n\ninterface ItemResources {\n version: number;\n kind: RenderItem[\"kind\"];\n buffer: WebGLBuffer;\n vao: WebGLVertexArrayObject;\n /** First instance the attribute pointers start at */\n first: number;\n}\n\nconst ATTRIBUTES: Record<RenderItem[\"kind\"], string[]> = {\n line: [\"a_a\", \"a_b\"],\n area: [\"a_a\", \"a_b\"],\n bar: [\"a_inst\", \"a_color\"],\n scatter: [\"a_pos\", \"a_size\", \"a_color\"],\n};\n\nconst compile = (\n gl: WebGL2RenderingContext,\n source: { vertex: string; fragment: string },\n attributes: string[],\n): Program | null => {\n const shader = (type: number, code: string) => {\n const s = gl.createShader(type);\n if (!s) return null;\n gl.shaderSource(s, code);\n gl.compileShader(s);\n if (!gl.getShaderParameter(s, gl.COMPILE_STATUS)) {\n gl.deleteShader(s);\n return null;\n }\n return s;\n };\n const vs = shader(gl.VERTEX_SHADER, source.vertex);\n const fs = shader(gl.FRAGMENT_SHADER, source.fragment);\n const program = gl.createProgram();\n if (!vs || !fs || !program) return null;\n gl.attachShader(program, vs);\n gl.attachShader(program, fs);\n attributes.forEach((name, i) => gl.bindAttribLocation(program, i, name));\n gl.linkProgram(program);\n gl.deleteShader(vs);\n gl.deleteShader(fs);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n gl.deleteProgram(program);\n return null;\n }\n return {\n program,\n xform: gl.getUniformLocation(program, \"u_xform\"),\n viewport: gl.getUniformLocation(program, \"u_viewport\"),\n color: gl.getUniformLocation(program, \"u_color\"),\n params: gl.getUniformLocation(program, \"u_params\"),\n };\n};\n\nexport const SOFTWARE_RENDERER =\n /swiftshader|llvmpipe|softpipe|software|basic render driver|microsoft basic/i;\n\n/** Software rasterizer (SwiftShader, llvmpipe, ...) behind the WebGL context */\nconst isSoftwareRenderer = (gl: WebGL2RenderingContext): boolean => {\n const info = gl.getExtension(\"WEBGL_debug_renderer_info\");\n const name = info\n ? gl.getParameter(info.UNMASKED_RENDERER_WEBGL)\n : gl.getParameter(gl.RENDERER);\n return SOFTWARE_RENDERER.test(String(name ?? \"\"));\n};\n\nexport const createWebGl2Renderer = (\n canvas: HTMLCanvasElement,\n onLost: RendererLostHandler,\n /** Refuses software rendering (SwiftShader, blocklisted GPUs): Canvas2D with decimation is faster there */\n requireHardware = false,\n): ChartRenderer | null => {\n const gl = canvas.getContext(\"webgl2\", {\n alpha: true,\n premultipliedAlpha: true,\n antialias: false,\n depth: false,\n stencil: false,\n preserveDrawingBuffer: false,\n failIfMajorPerformanceCaveat: requireHardware,\n });\n if (!gl) return null;\n if (requireHardware && isSoftwareRenderer(gl)) {\n gl.getExtension(\"WEBGL_lose_context\")?.loseContext();\n return null;\n }\n\n const line = compile(gl, GLSL_LINE, ATTRIBUTES.line);\n const area = compile(gl, GLSL_AREA, ATTRIBUTES.area);\n const bar = compile(gl, GLSL_BAR, ATTRIBUTES.bar);\n const scatter = compile(gl, GLSL_SCATTER, ATTRIBUTES.scatter);\n if (!line || !area || !bar || !scatter) return null;\n const programs = { line, area, bar, scatter };\n\n let lost = false;\n const handleLost = (event: Event) => {\n event.preventDefault();\n lost = true;\n onLost();\n };\n canvas.addEventListener(\"webglcontextlost\", handleLost);\n\n const resources = new Map<string, ItemResources>();\n\n /** WebGL2 has no base instance: the pointers start at the first instance */\n const setupAttributes = (item: RenderItem, first: number) => {\n const F = gl.FLOAT;\n switch (item.kind) {\n case \"line\":\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, F, false, 8, first * 8);\n gl.vertexAttribDivisor(0, 1);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 2, F, false, 8, first * 8 + 8);\n gl.vertexAttribDivisor(1, 1);\n break;\n case \"area\": {\n const stride = AREA_STRIDE * 4;\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 3, F, false, stride, first * stride);\n gl.vertexAttribDivisor(0, 1);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 3, F, false, stride, (first + 1) * stride);\n gl.vertexAttribDivisor(1, 1);\n break;\n }\n case \"bar\":\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 3, F, false, BAR_STRIDE, first * BAR_STRIDE);\n gl.vertexAttribDivisor(0, 1);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(\n 1,\n 4,\n gl.UNSIGNED_BYTE,\n true,\n BAR_STRIDE,\n first * BAR_STRIDE + 12,\n );\n gl.vertexAttribDivisor(1, 1);\n break;\n default:\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, F, false, SCATTER_STRIDE, 0);\n gl.vertexAttribDivisor(0, 1);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 1, F, false, SCATTER_STRIDE, 8);\n gl.vertexAttribDivisor(1, 1);\n gl.enableVertexAttribArray(2);\n gl.vertexAttribPointer(\n 2,\n 4,\n gl.UNSIGNED_BYTE,\n true,\n SCATTER_STRIDE,\n 12,\n );\n gl.vertexAttribDivisor(2, 1);\n break;\n }\n };\n\n const release = (res: ItemResources) => {\n gl.deleteBuffer(res.buffer);\n gl.deleteVertexArray(res.vao);\n };\n\n const upload = (item: RenderItem): ItemResources | null => {\n const existing = resources.get(item.key);\n if (\n existing &&\n existing.version === item.version &&\n existing.kind === item.kind\n ) {\n return existing;\n }\n if (existing) release(existing);\n const buffer = gl.createBuffer();\n const vao = gl.createVertexArray();\n if (!buffer || !vao) return null;\n gl.bindVertexArray(vao);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n switch (item.kind) {\n case \"line\":\n gl.bufferData(\n gl.ARRAY_BUFFER,\n item.points,\n gl.STATIC_DRAW,\n 0,\n item.count * 2,\n );\n break;\n case \"area\":\n gl.bufferData(\n gl.ARRAY_BUFFER,\n item.points,\n gl.STATIC_DRAW,\n 0,\n item.count * AREA_STRIDE,\n );\n break;\n default:\n gl.bufferData(gl.ARRAY_BUFFER, item.instances, gl.STATIC_DRAW);\n break;\n }\n setupAttributes(item, 0);\n gl.bindVertexArray(null);\n const res = {\n version: item.version,\n kind: item.kind,\n buffer,\n vao,\n first: 0,\n };\n resources.set(item.key, res);\n return res;\n };\n\n const params = (\n item: RenderItem,\n frame: RenderFrame,\n ): [number, number, number, number] => {\n switch (item.kind) {\n case \"line\":\n return [(item.width * frame.dpr) / 2, 0, 0, 0];\n case \"area\":\n return [0, item.opacity, 0, 0];\n case \"bar\":\n return [item.halfWidth, item.radius, item.inset, item.minHalf];\n default:\n return [item.opacity, item.stroke, 0, 0];\n }\n };\n\n return {\n kind: \"webgl2\",\n canvas,\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(items, frame) {\n if (lost || gl.isContextLost()) return;\n gl.viewport(0, 0, canvas.width, canvas.height);\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n const t = frame.transform;\n const seen = new Set<string>();\n for (const item of items) {\n seen.add(item.key);\n const [first, instances] = instanceRange(item, frame);\n if (instances <= 0) continue;\n const res = upload(item);\n if (!res) continue;\n const program = programs[item.kind];\n gl.useProgram(program.program);\n gl.uniform4f(program.xform, t.xScale, t.xOffset, t.yScale, t.yOffset);\n gl.uniform4f(program.viewport, frame.width, frame.height, frame.dpr, 0);\n gl.uniform4f(\n program.color,\n item.color[0],\n item.color[1],\n item.color[2],\n item.color[3],\n );\n const [p0, p1, p2, p3] = params(item, frame);\n gl.uniform4f(program.params, p0, p1, p2, p3);\n gl.bindVertexArray(res.vao);\n if (res.first !== first) {\n gl.bindBuffer(gl.ARRAY_BUFFER, res.buffer);\n setupAttributes(item, first);\n res.first = first;\n }\n gl.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, 4, instances);\n }\n gl.bindVertexArray(null);\n for (const [key, res] of resources) {\n if (!seen.has(key)) {\n release(res);\n resources.delete(key);\n }\n }\n },\n destroy() {\n canvas.removeEventListener(\"webglcontextlost\", handleLost);\n if (!gl.isContextLost()) {\n for (const res of resources.values()) release(res);\n for (const p of Object.values(programs)) gl.deleteProgram(p.program);\n }\n resources.clear();\n gl.getExtension(\"WEBGL_lose_context\")?.loseContext();\n },\n };\n};\n"],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ import { GLSL_AREA as t, GLSL_BAR as n, GLSL_LINE as r, GLSL_SCATTER as i } from
|
|
|
4
4
|
var a = {
|
|
5
5
|
line: ["a_a", "a_b"],
|
|
6
6
|
area: ["a_a", "a_b"],
|
|
7
|
-
bar: ["a_inst"],
|
|
7
|
+
bar: ["a_inst", "a_color"],
|
|
8
8
|
scatter: [
|
|
9
9
|
"a_pos",
|
|
10
10
|
"a_size",
|
|
@@ -52,11 +52,13 @@ var a = {
|
|
|
52
52
|
let n = d.FLOAT;
|
|
53
53
|
switch (e.kind) {
|
|
54
54
|
case "line":
|
|
55
|
-
case "area":
|
|
56
55
|
d.enableVertexAttribArray(0), d.vertexAttribPointer(0, 2, n, !1, 8, t * 8), d.vertexAttribDivisor(0, 1), d.enableVertexAttribArray(1), d.vertexAttribPointer(1, 2, n, !1, 8, t * 8 + 8), d.vertexAttribDivisor(1, 1);
|
|
57
56
|
break;
|
|
57
|
+
case "area":
|
|
58
|
+
d.enableVertexAttribArray(0), d.vertexAttribPointer(0, 3, n, !1, 12, t * 12), d.vertexAttribDivisor(0, 1), d.enableVertexAttribArray(1), d.vertexAttribPointer(1, 3, n, !1, 12, (t + 1) * 12), d.vertexAttribDivisor(1, 1);
|
|
59
|
+
break;
|
|
58
60
|
case "bar":
|
|
59
|
-
d.enableVertexAttribArray(0), d.vertexAttribPointer(0, 3, n, !1,
|
|
61
|
+
d.enableVertexAttribArray(0), d.vertexAttribPointer(0, 3, n, !1, 16, t * 16), d.vertexAttribDivisor(0, 1), d.enableVertexAttribArray(1), d.vertexAttribPointer(1, 4, d.UNSIGNED_BYTE, !0, 16, t * 16 + 12), d.vertexAttribDivisor(1, 1);
|
|
60
62
|
break;
|
|
61
63
|
default: d.enableVertexAttribArray(0), d.vertexAttribPointer(0, 2, n, !1, 16, 0), d.vertexAttribDivisor(0, 1), d.enableVertexAttribArray(1), d.vertexAttribPointer(1, 1, n, !1, 16, 8), d.vertexAttribDivisor(1, 1), d.enableVertexAttribArray(2), d.vertexAttribPointer(2, 4, d.UNSIGNED_BYTE, !0, 16, 12), d.vertexAttribDivisor(2, 1);
|
|
62
64
|
}
|
|
@@ -70,11 +72,10 @@ var a = {
|
|
|
70
72
|
if (!n || !r) return null;
|
|
71
73
|
switch (d.bindVertexArray(r), d.bindBuffer(d.ARRAY_BUFFER, n), e.kind) {
|
|
72
74
|
case "line":
|
|
73
|
-
case "area":
|
|
74
75
|
d.bufferData(d.ARRAY_BUFFER, e.points, d.STATIC_DRAW, 0, e.count * 2);
|
|
75
76
|
break;
|
|
76
|
-
case "
|
|
77
|
-
d.bufferData(d.ARRAY_BUFFER, e.
|
|
77
|
+
case "area":
|
|
78
|
+
d.bufferData(d.ARRAY_BUFFER, e.points, d.STATIC_DRAW, 0, e.count * 3);
|
|
78
79
|
break;
|
|
79
80
|
default: d.bufferData(d.ARRAY_BUFFER, e.instances, d.STATIC_DRAW);
|
|
80
81
|
}
|
|
@@ -89,10 +90,30 @@ var a = {
|
|
|
89
90
|
return y.set(e.key, i), i;
|
|
90
91
|
}, C = (e, t) => {
|
|
91
92
|
switch (e.kind) {
|
|
92
|
-
case "line": return [
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
93
|
+
case "line": return [
|
|
94
|
+
e.width * t.dpr / 2,
|
|
95
|
+
0,
|
|
96
|
+
0,
|
|
97
|
+
0
|
|
98
|
+
];
|
|
99
|
+
case "area": return [
|
|
100
|
+
0,
|
|
101
|
+
e.opacity,
|
|
102
|
+
0,
|
|
103
|
+
0
|
|
104
|
+
];
|
|
105
|
+
case "bar": return [
|
|
106
|
+
e.halfWidth,
|
|
107
|
+
e.radius,
|
|
108
|
+
e.inset,
|
|
109
|
+
e.minHalf
|
|
110
|
+
];
|
|
111
|
+
default: return [
|
|
112
|
+
e.opacity,
|
|
113
|
+
e.stroke,
|
|
114
|
+
0,
|
|
115
|
+
0
|
|
116
|
+
];
|
|
96
117
|
}
|
|
97
118
|
};
|
|
98
119
|
return {
|
|
@@ -113,8 +134,8 @@ var a = {
|
|
|
113
134
|
if (!s) continue;
|
|
114
135
|
let c = g[a.kind];
|
|
115
136
|
d.useProgram(c.program), d.uniform4f(c.xform, r.xScale, r.xOffset, r.yScale, r.yOffset), d.uniform4f(c.viewport, n.width, n.height, n.dpr, 0), d.uniform4f(c.color, a.color[0], a.color[1], a.color[2], a.color[3]);
|
|
116
|
-
let [l, u] = C(a, n);
|
|
117
|
-
d.uniform4f(c.params, l, u,
|
|
137
|
+
let [l, u, f, p] = C(a, n);
|
|
138
|
+
d.uniform4f(c.params, l, u, f, p), d.bindVertexArray(s.vao), s.first !== t && (d.bindBuffer(d.ARRAY_BUFFER, s.buffer), b(a, t), s.first = t), d.drawArraysInstanced(d.TRIANGLE_STRIP, 0, 4, o);
|
|
118
139
|
}
|
|
119
140
|
d.bindVertexArray(null);
|
|
120
141
|
for (let [e, t] of y) i.has(e) || (x(t), y.delete(e));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgl2.js","names":["ATTRIBUTES","compile","shader","s","gl","type","code","vs","source","fs","program","attributes","i","name","SOFTWARE_RENDERER","isSoftwareRenderer","info","createWebGl2Renderer","canvas","requireHardware","line","GLSL_LINE","area","GLSL_AREA","bar","GLSL_BAR","scatter","GLSL_SCATTER","programs","lost","handleLost","event","onLost","resources","setupAttributes","F","item","first","release","res","upload","existing","buffer","vao","params","frame","width","height","t","seen","items","instances","instanceRange","p0","p1","key","p"],"sources":["../../../../../charts/src/engine/renderers/webgl2.ts"],"sourcesContent":["// WebGL2 backend: same instanced primitives as WebGPU, in GLSL ES 3.0.\n\nimport { instanceRange } from \"./range\";\nimport { GLSL_AREA, GLSL_BAR, GLSL_LINE, GLSL_SCATTER } from \"./shaders\";\nimport {\n SCATTER_STRIDE,\n type ChartRenderer,\n type RenderFrame,\n type RenderItem,\n type RendererLostHandler,\n} from \"./types\";\n\ninterface Program {\n program: WebGLProgram;\n xform: WebGLUniformLocation | null;\n viewport: WebGLUniformLocation | null;\n color: WebGLUniformLocation | null;\n params: WebGLUniformLocation | null;\n}\n\ninterface ItemResources {\n version: number;\n kind: RenderItem[\"kind\"];\n buffer: WebGLBuffer;\n vao: WebGLVertexArrayObject;\n /** First instance the attribute pointers start at */\n first: number;\n}\n\nconst ATTRIBUTES: Record<RenderItem[\"kind\"], string[]> = {\n line: [\"a_a\", \"a_b\"],\n area: [\"a_a\", \"a_b\"],\n bar: [\"a_inst\"],\n scatter: [\"a_pos\", \"a_size\", \"a_color\"],\n};\n\nconst compile = (\n gl: WebGL2RenderingContext,\n source: { vertex: string; fragment: string },\n attributes: string[],\n): Program | null => {\n const shader = (type: number, code: string) => {\n const s = gl.createShader(type);\n if (!s) return null;\n gl.shaderSource(s, code);\n gl.compileShader(s);\n if (!gl.getShaderParameter(s, gl.COMPILE_STATUS)) {\n gl.deleteShader(s);\n return null;\n }\n return s;\n };\n const vs = shader(gl.VERTEX_SHADER, source.vertex);\n const fs = shader(gl.FRAGMENT_SHADER, source.fragment);\n const program = gl.createProgram();\n if (!vs || !fs || !program) return null;\n gl.attachShader(program, vs);\n gl.attachShader(program, fs);\n attributes.forEach((name, i) => gl.bindAttribLocation(program, i, name));\n gl.linkProgram(program);\n gl.deleteShader(vs);\n gl.deleteShader(fs);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n gl.deleteProgram(program);\n return null;\n }\n return {\n program,\n xform: gl.getUniformLocation(program, \"u_xform\"),\n viewport: gl.getUniformLocation(program, \"u_viewport\"),\n color: gl.getUniformLocation(program, \"u_color\"),\n params: gl.getUniformLocation(program, \"u_params\"),\n };\n};\n\nexport const SOFTWARE_RENDERER =\n /swiftshader|llvmpipe|softpipe|software|basic render driver|microsoft basic/i;\n\n/** Software rasterizer (SwiftShader, llvmpipe, ...) behind the WebGL context */\nconst isSoftwareRenderer = (gl: WebGL2RenderingContext): boolean => {\n const info = gl.getExtension(\"WEBGL_debug_renderer_info\");\n const name = info\n ? gl.getParameter(info.UNMASKED_RENDERER_WEBGL)\n : gl.getParameter(gl.RENDERER);\n return SOFTWARE_RENDERER.test(String(name ?? \"\"));\n};\n\nexport const createWebGl2Renderer = (\n canvas: HTMLCanvasElement,\n onLost: RendererLostHandler,\n /** Refuses software rendering (SwiftShader, blocklisted GPUs): Canvas2D with decimation is faster there */\n requireHardware = false,\n): ChartRenderer | null => {\n const gl = canvas.getContext(\"webgl2\", {\n alpha: true,\n premultipliedAlpha: true,\n antialias: false,\n depth: false,\n stencil: false,\n preserveDrawingBuffer: false,\n failIfMajorPerformanceCaveat: requireHardware,\n });\n if (!gl) return null;\n if (requireHardware && isSoftwareRenderer(gl)) {\n gl.getExtension(\"WEBGL_lose_context\")?.loseContext();\n return null;\n }\n\n const line = compile(gl, GLSL_LINE, ATTRIBUTES.line);\n const area = compile(gl, GLSL_AREA, ATTRIBUTES.area);\n const bar = compile(gl, GLSL_BAR, ATTRIBUTES.bar);\n const scatter = compile(gl, GLSL_SCATTER, ATTRIBUTES.scatter);\n if (!line || !area || !bar || !scatter) return null;\n const programs = { line, area, bar, scatter };\n\n let lost = false;\n const handleLost = (event: Event) => {\n event.preventDefault();\n lost = true;\n onLost();\n };\n canvas.addEventListener(\"webglcontextlost\", handleLost);\n\n const resources = new Map<string, ItemResources>();\n\n /** WebGL2 has no base instance: the pointers start at the first instance */\n const setupAttributes = (item: RenderItem, first: number) => {\n const F = gl.FLOAT;\n switch (item.kind) {\n case \"line\":\n case \"area\":\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, F, false, 8, first * 8);\n gl.vertexAttribDivisor(0, 1);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 2, F, false, 8, first * 8 + 8);\n gl.vertexAttribDivisor(1, 1);\n break;\n case \"bar\":\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 3, F, false, 12, first * 12);\n gl.vertexAttribDivisor(0, 1);\n break;\n default:\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, F, false, SCATTER_STRIDE, 0);\n gl.vertexAttribDivisor(0, 1);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 1, F, false, SCATTER_STRIDE, 8);\n gl.vertexAttribDivisor(1, 1);\n gl.enableVertexAttribArray(2);\n gl.vertexAttribPointer(\n 2,\n 4,\n gl.UNSIGNED_BYTE,\n true,\n SCATTER_STRIDE,\n 12,\n );\n gl.vertexAttribDivisor(2, 1);\n break;\n }\n };\n\n const release = (res: ItemResources) => {\n gl.deleteBuffer(res.buffer);\n gl.deleteVertexArray(res.vao);\n };\n\n const upload = (item: RenderItem): ItemResources | null => {\n const existing = resources.get(item.key);\n if (\n existing &&\n existing.version === item.version &&\n existing.kind === item.kind\n ) {\n return existing;\n }\n if (existing) release(existing);\n const buffer = gl.createBuffer();\n const vao = gl.createVertexArray();\n if (!buffer || !vao) return null;\n gl.bindVertexArray(vao);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n switch (item.kind) {\n case \"line\":\n case \"area\":\n gl.bufferData(\n gl.ARRAY_BUFFER,\n item.points,\n gl.STATIC_DRAW,\n 0,\n item.count * 2,\n );\n break;\n case \"bar\":\n gl.bufferData(\n gl.ARRAY_BUFFER,\n item.instances,\n gl.STATIC_DRAW,\n 0,\n item.count * 3,\n );\n break;\n default:\n gl.bufferData(gl.ARRAY_BUFFER, item.instances, gl.STATIC_DRAW);\n break;\n }\n setupAttributes(item, 0);\n gl.bindVertexArray(null);\n const res = {\n version: item.version,\n kind: item.kind,\n buffer,\n vao,\n first: 0,\n };\n resources.set(item.key, res);\n return res;\n };\n\n const params = (item: RenderItem, frame: RenderFrame): [number, number] => {\n switch (item.kind) {\n case \"line\":\n return [(item.width * frame.dpr) / 2, 0];\n case \"area\":\n return [item.baseline, item.opacity];\n case \"bar\":\n return [item.halfWidth, item.radius];\n default:\n return [item.opacity, item.stroke];\n }\n };\n\n return {\n kind: \"webgl2\",\n canvas,\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(items, frame) {\n if (lost || gl.isContextLost()) return;\n gl.viewport(0, 0, canvas.width, canvas.height);\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n const t = frame.transform;\n const seen = new Set<string>();\n for (const item of items) {\n seen.add(item.key);\n const [first, instances] = instanceRange(item, frame);\n if (instances <= 0) continue;\n const res = upload(item);\n if (!res) continue;\n const program = programs[item.kind];\n gl.useProgram(program.program);\n gl.uniform4f(program.xform, t.xScale, t.xOffset, t.yScale, t.yOffset);\n gl.uniform4f(program.viewport, frame.width, frame.height, frame.dpr, 0);\n gl.uniform4f(\n program.color,\n item.color[0],\n item.color[1],\n item.color[2],\n item.color[3],\n );\n const [p0, p1] = params(item, frame);\n gl.uniform4f(program.params, p0, p1, 0, 0);\n gl.bindVertexArray(res.vao);\n if (res.first !== first) {\n gl.bindBuffer(gl.ARRAY_BUFFER, res.buffer);\n setupAttributes(item, first);\n res.first = first;\n }\n gl.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, 4, instances);\n }\n gl.bindVertexArray(null);\n for (const [key, res] of resources) {\n if (!seen.has(key)) {\n release(res);\n resources.delete(key);\n }\n }\n },\n destroy() {\n canvas.removeEventListener(\"webglcontextlost\", handleLost);\n if (!gl.isContextLost()) {\n for (const res of resources.values()) release(res);\n for (const p of Object.values(programs)) gl.deleteProgram(p.program);\n }\n resources.clear();\n gl.getExtension(\"WEBGL_lose_context\")?.loseContext();\n },\n };\n};\n"],"mappings":";;;AA6BA,IAAMA,IAAmD;CACvD,MAAM,CAAC,OAAO,KAAK;CACnB,MAAM,CAAC,OAAO,KAAK;CACnB,KAAK,CAAC,QAAQ;CACd,SAAS;EAAC;EAAS;EAAU;CAAS;AACxC,GAEMC,KACJ,GACA,GACA,MACmB;CACnB,IAAMC,KAAU,GAAc,MAAiB;EAC7C,IAAMC,IAAIC,EAAG,aAAaC,CAAI;EAQ9B,OAPKF,KACLC,EAAG,aAAaD,GAAGG,CAAI,GACvBF,EAAG,cAAcD,CAAC,GACbC,EAAG,mBAAmBD,GAAGC,EAAG,cAAc,IAIxCD,KAHLC,EAAG,aAAaD,CAAC,GACV,SALM;CAQjB,GACMI,IAAKL,EAAOE,EAAG,eAAeI,EAAO,MAAM,GAC3CC,IAAKP,EAAOE,EAAG,iBAAiBI,EAAO,QAAQ,GAC/CE,IAAUN,EAAG,cAAc;CAYjC,OAXI,CAACG,KAAM,CAACE,KAAM,CAACC,IAAgB,QACnCN,EAAG,aAAaM,GAASH,CAAE,GAC3BH,EAAG,aAAaM,GAASD,CAAE,GAC3BE,EAAW,SAAS,GAAM,MAAMP,EAAG,mBAAmBM,GAASE,GAAGC,CAAI,CAAC,GACvET,EAAG,YAAYM,CAAO,GACtBN,EAAG,aAAaG,CAAE,GAClBH,EAAG,aAAaK,CAAE,GACbL,EAAG,oBAAoBM,GAASN,EAAG,WAAW,IAI5C;EACL;EACA,OAAOA,EAAG,mBAAmBM,GAAS,SAAS;EAC/C,UAAUN,EAAG,mBAAmBM,GAAS,YAAY;EACrD,OAAON,EAAG,mBAAmBM,GAAS,SAAS;EAC/C,QAAQN,EAAG,mBAAmBM,GAAS,UAAU;CACnD,KATEN,EAAG,cAAcM,CAAO,GACjB;AASX,GAEaI,IACX,+EAGIC,KAAsB,MAAwC;CAClE,IAAMC,IAAOZ,EAAG,aAAa,2BAA2B,GAClDS,IAAOG,IACTZ,EAAG,aAAaY,EAAK,uBAAuB,IAC5CZ,EAAG,aAAaA,EAAG,QAAQ;CAC/B,OAAOU,EAAkB,KAAK,OAAOD,KAAQ,EAAE,CAAC;AAClD,GAEaI,KACX,GACA,GAEA,IAAkB,OACO;CACzB,IAAMb,IAAKc,EAAO,WAAW,UAAU;EACrC,OAAO;EACP,oBAAoB;EACpB,WAAW;EACX,OAAO;EACP,SAAS;EACT,uBAAuB;EACvB,8BAA8BC;CAChC,CAAC;CACD,IAAI,CAACf,GAAI,OAAO;CAChB,IAAIe,KAAmBJ,EAAmBX,CAAE,GAE1C,OADAA,EAAG,aAAa,oBAAoB,CAAC,EAAE,YAAY,GAC5C;CAGT,IAAMgB,IAAOnB,EAAQG,GAAIiB,GAAWrB,EAAW,IAAI,GAC7CsB,IAAOrB,EAAQG,GAAImB,GAAWvB,EAAW,IAAI,GAC7CwB,IAAMvB,EAAQG,GAAIqB,GAAUzB,EAAW,GAAG,GAC1C0B,IAAUzB,EAAQG,GAAIuB,GAAc3B,EAAW,OAAO;CAC5D,IAAI,CAACoB,KAAQ,CAACE,KAAQ,CAACE,KAAO,CAACE,GAAS,OAAO;CAC/C,IAAME,IAAW;EAAE;EAAM;EAAM;EAAK;CAAQ,GAExCC,IAAO,IACLC,KAAc,MAAiB;EAGnC,AAFAC,EAAM,eAAe,GACrB,IAAO,IACPC,EAAO;CACT;CACA,EAAO,iBAAiB,oBAAoBF,CAAU;CAEtD,IAAMG,oBAAY,IAAI,IAA2B,GAG3CC,KAAmB,GAAkB,MAAkB;EAC3D,IAAMC,IAAI/B,EAAG;EACb,QAAQgC,EAAK,MAAb;GACE,KAAK;GACL,KAAK;IAMH,AALAhC,EAAG,wBAAwB,CAAC,GAC5BA,EAAG,oBAAoB,GAAG,GAAG+B,GAAG,IAAO,GAAGE,IAAQ,CAAC,GACnDjC,EAAG,oBAAoB,GAAG,CAAC,GAC3BA,EAAG,wBAAwB,CAAC,GAC5BA,EAAG,oBAAoB,GAAG,GAAG+B,GAAG,IAAO,GAAGE,IAAQ,IAAI,CAAC,GACvDjC,EAAG,oBAAoB,GAAG,CAAC;IAC3B;GACF,KAAK;IAGH,AAFAA,EAAG,wBAAwB,CAAC,GAC5BA,EAAG,oBAAoB,GAAG,GAAG+B,GAAG,IAAO,IAAIE,IAAQ,EAAE,GACrDjC,EAAG,oBAAoB,GAAG,CAAC;IAC3B;GACF,SAgBE,AAfAA,EAAG,wBAAwB,CAAC,GAC5BA,EAAG,oBAAoB,GAAG,GAAG+B,GAAG,IAAA,IAAuB,CAAC,GACxD/B,EAAG,oBAAoB,GAAG,CAAC,GAC3BA,EAAG,wBAAwB,CAAC,GAC5BA,EAAG,oBAAoB,GAAG,GAAG+B,GAAG,IAAA,IAAuB,CAAC,GACxD/B,EAAG,oBAAoB,GAAG,CAAC,GAC3BA,EAAG,wBAAwB,CAAC,GAC5BA,EAAG,oBACD,GACA,GACAA,EAAG,eACH,IAAA,IAEA,EACF,GACAA,EAAG,oBAAoB,GAAG,CAAC;EAE/B;CACF,GAEMkC,KAAW,MAAuB;EAEtC,AADAlC,EAAG,aAAamC,EAAI,MAAM,GAC1BnC,EAAG,kBAAkBmC,EAAI,GAAG;CAC9B,GAEMC,KAAU,MAA2C;EACzD,IAAMC,IAAWR,EAAU,IAAIG,EAAK,GAAG;EACvC,IACEK,KACAA,EAAS,YAAYL,EAAK,WAC1BK,EAAS,SAASL,EAAK,MAEvB,OAAOK;EAET,AAAIA,KAAUH,EAAQG,CAAQ;EAC9B,IAAMC,IAAStC,EAAG,aAAa,GACzBuC,IAAMvC,EAAG,kBAAkB;EACjC,IAAI,CAACsC,KAAU,CAACC,GAAK,OAAO;EAG5B,QAFAvC,EAAG,gBAAgBuC,CAAG,GACtBvC,EAAG,WAAWA,EAAG,cAAcsC,CAAM,GAC7BN,EAAK,MAAb;GACE,KAAK;GACL,KAAK;IACH,EAAG,WACDhC,EAAG,cACHgC,EAAK,QACLhC,EAAG,aACH,GACAgC,EAAK,QAAQ,CACf;IACA;GACF,KAAK;IACH,EAAG,WACDhC,EAAG,cACHgC,EAAK,WACLhC,EAAG,aACH,GACAgC,EAAK,QAAQ,CACf;IACA;GACF,SACE,EAAG,WAAWhC,EAAG,cAAcgC,EAAK,WAAWhC,EAAG,WAAW;EAEjE;EAEA,AADA8B,EAAgBE,GAAM,CAAC,GACvBhC,EAAG,gBAAgB,IAAI;EACvB,IAAMmC,IAAM;GACV,SAASH,EAAK;GACd,MAAMA,EAAK;GACX;GACA;GACA,OAAO;EACT;EAEA,OADAH,EAAU,IAAIG,EAAK,KAAKG,CAAG,GACpBA;CACT,GAEMK,KAAU,GAAkB,MAAyC;EACzE,QAAQR,EAAK,MAAb;GACE,KAAK,QACH,OAAO,CAAEA,EAAK,QAAQS,EAAM,MAAO,GAAG,CAAC;GACzC,KAAK,QACH,OAAO,CAACT,EAAK,UAAUA,EAAK,OAAO;GACrC,KAAK,OACH,OAAO,CAACA,EAAK,WAAWA,EAAK,MAAM;GACrC,SACE,OAAO,CAACA,EAAK,SAASA,EAAK,MAAM;EACrC;CACF;CAEA,OAAO;EACL,MAAM;EACN;EACA,OAAO,GAAO,GAAQ;GAEpB,AADA,EAAO,QAAQ,KAAK,IAAI,GAAGU,CAAK,GAChC,EAAO,SAAS,KAAK,IAAI,GAAGC,CAAM;EACpC;EACA,OAAO,GAAO,GAAO;GACnB,IAAIlB,KAAQzB,EAAG,cAAc,GAAG;GAKhC,AAJAA,EAAG,SAAS,GAAG,GAAGc,EAAO,OAAOA,EAAO,MAAM,GAC7Cd,EAAG,WAAW,GAAG,GAAG,GAAG,CAAC,GACxBA,EAAG,MAAMA,EAAG,gBAAgB,GAC5BA,EAAG,OAAOA,EAAG,KAAK,GAClBA,EAAG,UAAUA,EAAG,KAAKA,EAAG,mBAAmB;GAC3C,IAAM4C,IAAIH,EAAM,WACVI,oBAAO,IAAI,IAAY;GAC7B,KAAK,IAAMb,KAAQc,GAAO;IACxB,EAAK,IAAId,EAAK,GAAG;IACjB,IAAM,CAACC,GAAOc,KAAaC,EAAchB,GAAMS,CAAK;IACpD,IAAIM,KAAa,GAAG;IACpB,IAAMZ,IAAMC,EAAOJ,CAAI;IACvB,IAAI,CAACG,GAAK;IACV,IAAM7B,IAAUkB,EAASQ,EAAK;IAI9B,AAHAhC,EAAG,WAAWM,EAAQ,OAAO,GAC7BN,EAAG,UAAUM,EAAQ,OAAOsC,EAAE,QAAQA,EAAE,SAASA,EAAE,QAAQA,EAAE,OAAO,GACpE5C,EAAG,UAAUM,EAAQ,UAAUmC,EAAM,OAAOA,EAAM,QAAQA,EAAM,KAAK,CAAC,GACtEzC,EAAG,UACDM,EAAQ,OACR0B,EAAK,MAAM,IACXA,EAAK,MAAM,IACXA,EAAK,MAAM,IACXA,EAAK,MAAM,EACb;IACA,IAAM,CAACiB,GAAIC,KAAMV,EAAOR,GAAMS,CAAK;IAQnC,AAPAzC,EAAG,UAAUM,EAAQ,QAAQ2C,GAAIC,GAAI,GAAG,CAAC,GACzClD,EAAG,gBAAgBmC,EAAI,GAAG,GACtBA,EAAI,UAAUF,MAChBjC,EAAG,WAAWA,EAAG,cAAcmC,EAAI,MAAM,GACzCL,EAAgBE,GAAMC,CAAK,GAC3B,EAAI,QAAQA,IAEdjC,EAAG,oBAAoBA,EAAG,gBAAgB,GAAG,GAAG+C,CAAS;GAC3D;GACA,EAAG,gBAAgB,IAAI;GACvB,KAAK,IAAM,CAACI,GAAKhB,MAAQN,GACvB,AAAKgB,EAAK,IAAIM,CAAG,MACfjB,EAAQC,CAAG,GACXN,EAAU,OAAOsB,CAAG;EAG1B;EACA,UAAU;GAER,IADArC,EAAO,oBAAoB,oBAAoBY,CAAU,GACrD,CAAC1B,EAAG,cAAc,GAAG;IACvB,KAAK,IAAMmC,KAAON,EAAU,OAAO,GAAG,EAAQM,CAAG;IACjD,KAAK,IAAMiB,KAAK,OAAO,OAAO5B,CAAQ,GAAG,EAAG,cAAc4B,EAAE,OAAO;GACrE;GAEA,AADAvB,EAAU,MAAM,GAChB7B,EAAG,aAAa,oBAAoB,CAAC,EAAE,YAAY;EACrD;CACF;AACF"}
|
|
1
|
+
{"version":3,"file":"webgl2.js","names":["ATTRIBUTES","compile","shader","s","gl","type","code","vs","source","fs","program","attributes","i","name","SOFTWARE_RENDERER","isSoftwareRenderer","info","createWebGl2Renderer","canvas","requireHardware","line","GLSL_LINE","area","GLSL_AREA","bar","GLSL_BAR","scatter","GLSL_SCATTER","programs","lost","handleLost","event","onLost","resources","setupAttributes","F","item","first","release","res","upload","existing","buffer","vao","params","frame","width","height","t","seen","items","instances","instanceRange","p0","p1","p2","p3","key","p"],"sources":["../../../../../charts/src/engine/renderers/webgl2.ts"],"sourcesContent":["// WebGL2 backend: same instanced primitives as WebGPU, in GLSL ES 3.0.\n\nimport { instanceRange } from \"./range\";\nimport { GLSL_AREA, GLSL_BAR, GLSL_LINE, GLSL_SCATTER } from \"./shaders\";\nimport {\n AREA_STRIDE,\n BAR_STRIDE,\n SCATTER_STRIDE,\n type ChartRenderer,\n type RenderFrame,\n type RenderItem,\n type RendererLostHandler,\n} from \"./types\";\n\ninterface Program {\n program: WebGLProgram;\n xform: WebGLUniformLocation | null;\n viewport: WebGLUniformLocation | null;\n color: WebGLUniformLocation | null;\n params: WebGLUniformLocation | null;\n}\n\ninterface ItemResources {\n version: number;\n kind: RenderItem[\"kind\"];\n buffer: WebGLBuffer;\n vao: WebGLVertexArrayObject;\n /** First instance the attribute pointers start at */\n first: number;\n}\n\nconst ATTRIBUTES: Record<RenderItem[\"kind\"], string[]> = {\n line: [\"a_a\", \"a_b\"],\n area: [\"a_a\", \"a_b\"],\n bar: [\"a_inst\", \"a_color\"],\n scatter: [\"a_pos\", \"a_size\", \"a_color\"],\n};\n\nconst compile = (\n gl: WebGL2RenderingContext,\n source: { vertex: string; fragment: string },\n attributes: string[],\n): Program | null => {\n const shader = (type: number, code: string) => {\n const s = gl.createShader(type);\n if (!s) return null;\n gl.shaderSource(s, code);\n gl.compileShader(s);\n if (!gl.getShaderParameter(s, gl.COMPILE_STATUS)) {\n gl.deleteShader(s);\n return null;\n }\n return s;\n };\n const vs = shader(gl.VERTEX_SHADER, source.vertex);\n const fs = shader(gl.FRAGMENT_SHADER, source.fragment);\n const program = gl.createProgram();\n if (!vs || !fs || !program) return null;\n gl.attachShader(program, vs);\n gl.attachShader(program, fs);\n attributes.forEach((name, i) => gl.bindAttribLocation(program, i, name));\n gl.linkProgram(program);\n gl.deleteShader(vs);\n gl.deleteShader(fs);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n gl.deleteProgram(program);\n return null;\n }\n return {\n program,\n xform: gl.getUniformLocation(program, \"u_xform\"),\n viewport: gl.getUniformLocation(program, \"u_viewport\"),\n color: gl.getUniformLocation(program, \"u_color\"),\n params: gl.getUniformLocation(program, \"u_params\"),\n };\n};\n\nexport const SOFTWARE_RENDERER =\n /swiftshader|llvmpipe|softpipe|software|basic render driver|microsoft basic/i;\n\n/** Software rasterizer (SwiftShader, llvmpipe, ...) behind the WebGL context */\nconst isSoftwareRenderer = (gl: WebGL2RenderingContext): boolean => {\n const info = gl.getExtension(\"WEBGL_debug_renderer_info\");\n const name = info\n ? gl.getParameter(info.UNMASKED_RENDERER_WEBGL)\n : gl.getParameter(gl.RENDERER);\n return SOFTWARE_RENDERER.test(String(name ?? \"\"));\n};\n\nexport const createWebGl2Renderer = (\n canvas: HTMLCanvasElement,\n onLost: RendererLostHandler,\n /** Refuses software rendering (SwiftShader, blocklisted GPUs): Canvas2D with decimation is faster there */\n requireHardware = false,\n): ChartRenderer | null => {\n const gl = canvas.getContext(\"webgl2\", {\n alpha: true,\n premultipliedAlpha: true,\n antialias: false,\n depth: false,\n stencil: false,\n preserveDrawingBuffer: false,\n failIfMajorPerformanceCaveat: requireHardware,\n });\n if (!gl) return null;\n if (requireHardware && isSoftwareRenderer(gl)) {\n gl.getExtension(\"WEBGL_lose_context\")?.loseContext();\n return null;\n }\n\n const line = compile(gl, GLSL_LINE, ATTRIBUTES.line);\n const area = compile(gl, GLSL_AREA, ATTRIBUTES.area);\n const bar = compile(gl, GLSL_BAR, ATTRIBUTES.bar);\n const scatter = compile(gl, GLSL_SCATTER, ATTRIBUTES.scatter);\n if (!line || !area || !bar || !scatter) return null;\n const programs = { line, area, bar, scatter };\n\n let lost = false;\n const handleLost = (event: Event) => {\n event.preventDefault();\n lost = true;\n onLost();\n };\n canvas.addEventListener(\"webglcontextlost\", handleLost);\n\n const resources = new Map<string, ItemResources>();\n\n /** WebGL2 has no base instance: the pointers start at the first instance */\n const setupAttributes = (item: RenderItem, first: number) => {\n const F = gl.FLOAT;\n switch (item.kind) {\n case \"line\":\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, F, false, 8, first * 8);\n gl.vertexAttribDivisor(0, 1);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 2, F, false, 8, first * 8 + 8);\n gl.vertexAttribDivisor(1, 1);\n break;\n case \"area\": {\n const stride = AREA_STRIDE * 4;\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 3, F, false, stride, first * stride);\n gl.vertexAttribDivisor(0, 1);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 3, F, false, stride, (first + 1) * stride);\n gl.vertexAttribDivisor(1, 1);\n break;\n }\n case \"bar\":\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 3, F, false, BAR_STRIDE, first * BAR_STRIDE);\n gl.vertexAttribDivisor(0, 1);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(\n 1,\n 4,\n gl.UNSIGNED_BYTE,\n true,\n BAR_STRIDE,\n first * BAR_STRIDE + 12,\n );\n gl.vertexAttribDivisor(1, 1);\n break;\n default:\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, F, false, SCATTER_STRIDE, 0);\n gl.vertexAttribDivisor(0, 1);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 1, F, false, SCATTER_STRIDE, 8);\n gl.vertexAttribDivisor(1, 1);\n gl.enableVertexAttribArray(2);\n gl.vertexAttribPointer(\n 2,\n 4,\n gl.UNSIGNED_BYTE,\n true,\n SCATTER_STRIDE,\n 12,\n );\n gl.vertexAttribDivisor(2, 1);\n break;\n }\n };\n\n const release = (res: ItemResources) => {\n gl.deleteBuffer(res.buffer);\n gl.deleteVertexArray(res.vao);\n };\n\n const upload = (item: RenderItem): ItemResources | null => {\n const existing = resources.get(item.key);\n if (\n existing &&\n existing.version === item.version &&\n existing.kind === item.kind\n ) {\n return existing;\n }\n if (existing) release(existing);\n const buffer = gl.createBuffer();\n const vao = gl.createVertexArray();\n if (!buffer || !vao) return null;\n gl.bindVertexArray(vao);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n switch (item.kind) {\n case \"line\":\n gl.bufferData(\n gl.ARRAY_BUFFER,\n item.points,\n gl.STATIC_DRAW,\n 0,\n item.count * 2,\n );\n break;\n case \"area\":\n gl.bufferData(\n gl.ARRAY_BUFFER,\n item.points,\n gl.STATIC_DRAW,\n 0,\n item.count * AREA_STRIDE,\n );\n break;\n default:\n gl.bufferData(gl.ARRAY_BUFFER, item.instances, gl.STATIC_DRAW);\n break;\n }\n setupAttributes(item, 0);\n gl.bindVertexArray(null);\n const res = {\n version: item.version,\n kind: item.kind,\n buffer,\n vao,\n first: 0,\n };\n resources.set(item.key, res);\n return res;\n };\n\n const params = (\n item: RenderItem,\n frame: RenderFrame,\n ): [number, number, number, number] => {\n switch (item.kind) {\n case \"line\":\n return [(item.width * frame.dpr) / 2, 0, 0, 0];\n case \"area\":\n return [0, item.opacity, 0, 0];\n case \"bar\":\n return [item.halfWidth, item.radius, item.inset, item.minHalf];\n default:\n return [item.opacity, item.stroke, 0, 0];\n }\n };\n\n return {\n kind: \"webgl2\",\n canvas,\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(items, frame) {\n if (lost || gl.isContextLost()) return;\n gl.viewport(0, 0, canvas.width, canvas.height);\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n const t = frame.transform;\n const seen = new Set<string>();\n for (const item of items) {\n seen.add(item.key);\n const [first, instances] = instanceRange(item, frame);\n if (instances <= 0) continue;\n const res = upload(item);\n if (!res) continue;\n const program = programs[item.kind];\n gl.useProgram(program.program);\n gl.uniform4f(program.xform, t.xScale, t.xOffset, t.yScale, t.yOffset);\n gl.uniform4f(program.viewport, frame.width, frame.height, frame.dpr, 0);\n gl.uniform4f(\n program.color,\n item.color[0],\n item.color[1],\n item.color[2],\n item.color[3],\n );\n const [p0, p1, p2, p3] = params(item, frame);\n gl.uniform4f(program.params, p0, p1, p2, p3);\n gl.bindVertexArray(res.vao);\n if (res.first !== first) {\n gl.bindBuffer(gl.ARRAY_BUFFER, res.buffer);\n setupAttributes(item, first);\n res.first = first;\n }\n gl.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, 4, instances);\n }\n gl.bindVertexArray(null);\n for (const [key, res] of resources) {\n if (!seen.has(key)) {\n release(res);\n resources.delete(key);\n }\n }\n },\n destroy() {\n canvas.removeEventListener(\"webglcontextlost\", handleLost);\n if (!gl.isContextLost()) {\n for (const res of resources.values()) release(res);\n for (const p of Object.values(programs)) gl.deleteProgram(p.program);\n }\n resources.clear();\n gl.getExtension(\"WEBGL_lose_context\")?.loseContext();\n },\n };\n};\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("./range.cjs"),t=require("./shaders.cjs");var n=64,r=async(r,i,a=!1)=>{let o=navigator.gpu;if(!o)return null;let s=await o.requestAdapter();if(!s)return null;let c=s;if(a&&(c.info?.isFallbackAdapter||c.isFallbackAdapter))return null;let l=await s.requestDevice(),u=r.getContext(`webgpu`);if(!u)return l.destroy(),null;let d=o.getPreferredCanvasFormat();u.configure({device:l,format:d,alphaMode:`premultiplied`});let f=!1;l.lost.then(()=>{f||i()});let p=l.createBindGroupLayout({entries:[{binding:0,visibility:3,buffer:{type:`uniform`}}]}),m=l.createPipelineLayout({bindGroupLayouts:[p]}),h={color:{srcFactor:`one`,dstFactor:`one-minus-src-alpha`,operation:`add`},alpha:{srcFactor:`one`,dstFactor:`one-minus-src-alpha`,operation:`add`}},g=(e,t)=>{let n=l.createShaderModule({code:e});return l.createRenderPipeline({layout:m,vertex:{module:n,entryPoint:`vs`,buffers:t},fragment:{module:n,entryPoint:`fs`,targets:[{format:d,blend:h}]},primitive:{topology:`triangle-strip`}})},_=[{arrayStride:
|
|
1
|
+
const e=require("./range.cjs"),t=require("./shaders.cjs");var n=64,r=async(r,i,a=!1)=>{let o=navigator.gpu;if(!o)return null;let s=await o.requestAdapter();if(!s)return null;let c=s;if(a&&(c.info?.isFallbackAdapter||c.isFallbackAdapter))return null;let l=await s.requestDevice(),u=r.getContext(`webgpu`);if(!u)return l.destroy(),null;let d=o.getPreferredCanvasFormat();u.configure({device:l,format:d,alphaMode:`premultiplied`});let f=!1;l.lost.then(()=>{f||i()});let p=l.createBindGroupLayout({entries:[{binding:0,visibility:3,buffer:{type:`uniform`}}]}),m=l.createPipelineLayout({bindGroupLayouts:[p]}),h={color:{srcFactor:`one`,dstFactor:`one-minus-src-alpha`,operation:`add`},alpha:{srcFactor:`one`,dstFactor:`one-minus-src-alpha`,operation:`add`}},g=(e,t)=>{let n=l.createShaderModule({code:e});return l.createRenderPipeline({layout:m,vertex:{module:n,entryPoint:`vs`,buffers:t},fragment:{module:n,entryPoint:`fs`,targets:[{format:d,blend:h}]},primitive:{topology:`triangle-strip`}})},_=(e,t)=>[{arrayStride:e,stepMode:`instance`,attributes:[{shaderLocation:0,offset:0,format:t}]},{arrayStride:e,stepMode:`instance`,attributes:[{shaderLocation:1,offset:0,format:t}]}],v={line:g(t.WGSL_LINE,_(8,`float32x2`)),area:g(t.WGSL_AREA,_(12,`float32x3`)),bar:g(t.WGSL_BAR,[{arrayStride:16,stepMode:`instance`,attributes:[{shaderLocation:0,offset:0,format:`float32x3`},{shaderLocation:1,offset:12,format:`unorm8x4`}]}]),scatter:g(t.WGSL_SCATTER,[{arrayStride:16,stepMode:`instance`,attributes:[{shaderLocation:0,offset:0,format:`float32x2`},{shaderLocation:1,offset:8,format:`float32`},{shaderLocation:2,offset:12,format:`unorm8x4`}]}])},y=new Map,b=new Float32Array(n/4),x=e=>{switch(e.kind){case`line`:return e.points.subarray(0,e.count*2);case`area`:return e.points.subarray(0,e.count*3);default:return e.instances}},S=e=>{let t=y.get(e.key);if(t&&t.version===e.version&&t.kind===e.kind)return t;t?.vertex?.destroy();let r=x(e),i=Math.max(16,Math.ceil(r.byteLength/4)*4),a=r.byteLength>0?l.createBuffer({size:i,usage:40}):null;if(a&&(r instanceof Float32Array?l.queue.writeBuffer(a,0,r.buffer,r.byteOffset,r.byteLength):l.queue.writeBuffer(a,0,r)),t)t.version=e.version,t.kind=e.kind,t.vertex=a;else{let r=l.createBuffer({size:n,usage:72});t={version:e.version,kind:e.kind,vertex:a,uniform:r,bindGroup:l.createBindGroup({layout:p,entries:[{binding:0,resource:{buffer:r}}]})},y.set(e.key,t)}return t},C=(e,t)=>{switch(e.kind){case`line`:return[e.width*t.dpr/2,0,0,0];case`area`:return[0,e.opacity,0,0];case`bar`:return[e.halfWidth,e.radius,e.inset,e.minHalf];default:return[e.opacity,e.stroke,0,0]}};return{kind:`webgpu`,canvas:r,resize(e,t){r.width=Math.max(1,e),r.height=Math.max(1,t)},render(t,n){if(f)return;let r=new Set,i=l.createCommandEncoder(),a=i.beginRenderPass({colorAttachments:[{view:u.getCurrentTexture().createView(),clearValue:{r:0,g:0,b:0,a:0},loadOp:`clear`,storeOp:`store`}]}),o=n.transform;for(let i of t){r.add(i.key);let[t,s]=e.instanceRange(i,n);if(s<=0)continue;let c=S(i);c.vertex&&(b.set([o.xScale,o.xOffset,o.yScale,o.yOffset,n.width,n.height,n.dpr,0,...i.color,...C(i,n)],0),l.queue.writeBuffer(c.uniform,0,b),a.setPipeline(v[i.kind]),a.setBindGroup(0,c.bindGroup),a.setVertexBuffer(0,c.vertex),i.kind===`line`?a.setVertexBuffer(1,c.vertex,8):i.kind===`area`&&a.setVertexBuffer(1,c.vertex,12),a.draw(4,s,0,t))}a.end(),l.queue.submit([i.finish()]);for(let[e,t]of y)r.has(e)||(t.vertex?.destroy(),t.uniform.destroy(),y.delete(e))},destroy(){f=!0;for(let e of y.values())e.vertex?.destroy(),e.uniform.destroy();y.clear(),u.unconfigure(),l.destroy()}}};exports.createWebGpuRenderer=r;
|
|
2
2
|
//# sourceMappingURL=webgpu.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgpu.cjs","names":["WGSL_LINE","WGSL_AREA","WGSL_BAR","WGSL_SCATTER","instanceRange","require_range","require_shaders","UNIFORM_SIZE","createWebGpuRenderer","gpu","adapter","fallback","requireHardware","device","context","canvas","format","destroyed","onLost","bindGroupLayout","layout","blend","pipeline","module","segment","pipelines","resources","uniformData","vertexData","item","upload","res","data","size","vertex","uniform","params","frame","width","height","seen","encoder","pass","t","items","first","instances","key"],"sources":["../../../../../charts/src/engine/renderers/webgpu.ts"],"sourcesContent":["// WebGPU backend: one instanced draw per series.\n\nimport type { ChartRendererKind } from \"../types\";\nimport { instanceRange } from \"./range\";\nimport { WGSL_AREA, WGSL_BAR, WGSL_LINE, WGSL_SCATTER } from \"./shaders\";\nimport {\n SCATTER_STRIDE,\n type ChartRenderer,\n type RenderFrame,\n type RenderItem,\n type RendererLostHandler,\n} from \"./types\";\n\n// lib.dom has the WebGPU interfaces but not these constant objects\nconst BUFFER_VERTEX = 0x20;\nconst BUFFER_UNIFORM = 0x40;\nconst BUFFER_COPY_DST = 0x08;\nconst STAGE_VERTEX = 0x1;\nconst STAGE_FRAGMENT = 0x2;\n\nconst UNIFORM_SIZE = 64;\n\ninterface ItemResources {\n version: number;\n kind: RenderItem[\"kind\"];\n vertex: GPUBuffer | null;\n uniform: GPUBuffer;\n bindGroup: GPUBindGroup;\n}\n\ntype GpuNavigator = Navigator & { gpu?: GPU };\n\n/** Whether `navigator.gpu` exists (an adapter may still be unavailable) */\nexport const hasWebGpu = (): boolean =>\n typeof navigator !== \"undefined\" && !!(navigator as GpuNavigator).gpu;\n\nexport const createWebGpuRenderer = async (\n canvas: HTMLCanvasElement,\n onLost: RendererLostHandler,\n /** Refuses fallback (software) adapters */\n requireHardware = false,\n): Promise<ChartRenderer | null> => {\n const gpu = (navigator as GpuNavigator).gpu;\n if (!gpu) return null;\n const adapter = await gpu.requestAdapter();\n if (!adapter) return null;\n const fallback = adapter as GPUAdapter & {\n isFallbackAdapter?: boolean;\n info?: { isFallbackAdapter?: boolean };\n };\n if (\n requireHardware &&\n (fallback.info?.isFallbackAdapter || fallback.isFallbackAdapter)\n ) {\n return null;\n }\n const device = await adapter.requestDevice();\n const context = canvas.getContext(\"webgpu\") as GPUCanvasContext | null;\n if (!context) {\n device.destroy();\n return null;\n }\n const format = gpu.getPreferredCanvasFormat();\n context.configure({ device, format, alphaMode: \"premultiplied\" });\n\n let destroyed = false;\n void device.lost.then(() => {\n if (!destroyed) onLost();\n });\n\n const bindGroupLayout = device.createBindGroupLayout({\n entries: [\n {\n binding: 0,\n visibility: STAGE_VERTEX | STAGE_FRAGMENT,\n buffer: { type: \"uniform\" },\n },\n ],\n });\n const layout = device.createPipelineLayout({\n bindGroupLayouts: [bindGroupLayout],\n });\n const blend: GPUBlendState = {\n color: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n alpha: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n };\n const pipeline = (code: string, buffers: GPUVertexBufferLayout[]) => {\n const module = device.createShaderModule({ code });\n return device.createRenderPipeline({\n layout,\n vertex: { module, entryPoint: \"vs\", buffers },\n fragment: {\n module,\n entryPoint: \"fs\",\n targets: [{ format, blend }],\n },\n primitive: { topology: \"triangle-strip\" },\n });\n };\n const segment: GPUVertexBufferLayout[] = [\n {\n arrayStride: 8,\n stepMode: \"instance\",\n attributes: [{ shaderLocation: 0, offset: 0, format: \"float32x2\" }],\n },\n {\n arrayStride: 8,\n stepMode: \"instance\",\n attributes: [{ shaderLocation: 1, offset: 0, format: \"float32x2\" }],\n },\n ];\n const pipelines = {\n line: pipeline(WGSL_LINE, segment),\n area: pipeline(WGSL_AREA, segment),\n bar: pipeline(WGSL_BAR, [\n {\n arrayStride: 12,\n stepMode: \"instance\",\n attributes: [{ shaderLocation: 0, offset: 0, format: \"float32x3\" }],\n },\n ]),\n scatter: pipeline(WGSL_SCATTER, [\n {\n arrayStride: SCATTER_STRIDE,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x2\" },\n { shaderLocation: 1, offset: 8, format: \"float32\" },\n { shaderLocation: 2, offset: 12, format: \"unorm8x4\" },\n ],\n },\n ]),\n };\n\n const resources = new Map<string, ItemResources>();\n const uniformData = new Float32Array(UNIFORM_SIZE / 4);\n\n const vertexData = (item: RenderItem): ArrayBuffer | Float32Array => {\n switch (item.kind) {\n case \"line\":\n case \"area\":\n return item.points.subarray(0, item.count * 2);\n case \"bar\":\n return item.instances.subarray(0, item.count * 3);\n default:\n return item.instances;\n }\n };\n\n const upload = (item: RenderItem): ItemResources => {\n let res = resources.get(item.key);\n if (res && res.version === item.version && res.kind === item.kind) {\n return res;\n }\n res?.vertex?.destroy();\n const data = vertexData(item);\n const size = Math.max(16, Math.ceil(data.byteLength / 4) * 4);\n const vertex =\n data.byteLength > 0\n ? device.createBuffer({ size, usage: BUFFER_VERTEX | BUFFER_COPY_DST })\n : null;\n if (vertex) {\n if (data instanceof Float32Array) {\n device.queue.writeBuffer(\n vertex,\n 0,\n data.buffer,\n data.byteOffset,\n data.byteLength,\n );\n } else {\n device.queue.writeBuffer(vertex, 0, data);\n }\n }\n if (!res) {\n const uniform = device.createBuffer({\n size: UNIFORM_SIZE,\n usage: BUFFER_UNIFORM | BUFFER_COPY_DST,\n });\n res = {\n version: item.version,\n kind: item.kind,\n vertex,\n uniform,\n bindGroup: device.createBindGroup({\n layout: bindGroupLayout,\n entries: [{ binding: 0, resource: { buffer: uniform } }],\n }),\n };\n resources.set(item.key, res);\n } else {\n res.version = item.version;\n res.kind = item.kind;\n res.vertex = vertex;\n }\n return res;\n };\n\n const params = (item: RenderItem, frame: RenderFrame): number[] => {\n switch (item.kind) {\n case \"line\":\n return [(item.width * frame.dpr) / 2, 0, 0, 0];\n case \"area\":\n return [item.baseline, item.opacity, 0, 0];\n case \"bar\":\n return [item.halfWidth, item.radius, 0, 0];\n default:\n return [item.opacity, item.stroke, 0, 0];\n }\n };\n\n const renderer: ChartRenderer = {\n kind: \"webgpu\" satisfies ChartRendererKind,\n canvas,\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(items, frame) {\n if (destroyed) return;\n const seen = new Set<string>();\n const encoder = device.createCommandEncoder();\n const pass = encoder.beginRenderPass({\n colorAttachments: [\n {\n view: context.getCurrentTexture().createView(),\n clearValue: { r: 0, g: 0, b: 0, a: 0 },\n loadOp: \"clear\",\n storeOp: \"store\",\n },\n ],\n });\n const t = frame.transform;\n for (const item of items) {\n seen.add(item.key);\n const [first, instances] = instanceRange(item, frame);\n if (instances <= 0) continue;\n const res = upload(item);\n if (!res.vertex) continue;\n uniformData.set(\n [\n t.xScale,\n t.xOffset,\n t.yScale,\n t.yOffset,\n frame.width,\n frame.height,\n frame.dpr,\n 0,\n ...item.color,\n ...params(item, frame),\n ],\n 0,\n );\n device.queue.writeBuffer(res.uniform, 0, uniformData);\n pass.setPipeline(pipelines[item.kind]);\n pass.setBindGroup(0, res.bindGroup);\n pass.setVertexBuffer(0, res.vertex);\n if (item.kind === \"line\" || item.kind === \"area\") {\n pass.setVertexBuffer(1, res.vertex, 8);\n }\n pass.draw(4, instances, 0, first);\n }\n pass.end();\n device.queue.submit([encoder.finish()]);\n for (const [key, res] of resources) {\n if (!seen.has(key)) {\n res.vertex?.destroy();\n res.uniform.destroy();\n resources.delete(key);\n }\n }\n },\n destroy() {\n destroyed = true;\n for (const res of resources.values()) {\n res.vertex?.destroy();\n res.uniform.destroy();\n }\n resources.clear();\n context.unconfigure();\n device.destroy();\n },\n };\n return renderer;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"webgpu.cjs","names":["WGSL_LINE","WGSL_AREA","WGSL_BAR","WGSL_SCATTER","instanceRange","require_range","require_shaders","UNIFORM_SIZE","createWebGpuRenderer","gpu","adapter","fallback","requireHardware","device","context","canvas","format","destroyed","onLost","bindGroupLayout","layout","blend","pipeline","module","segment","stride","pipelines","resources","uniformData","vertexData","item","upload","res","data","size","vertex","uniform","params","frame","width","height","seen","encoder","pass","t","items","first","instances","key"],"sources":["../../../../../charts/src/engine/renderers/webgpu.ts"],"sourcesContent":["// WebGPU backend: one instanced draw per series.\n\nimport type { ChartRendererKind } from \"../types\";\nimport { instanceRange } from \"./range\";\nimport { WGSL_AREA, WGSL_BAR, WGSL_LINE, WGSL_SCATTER } from \"./shaders\";\nimport {\n AREA_STRIDE,\n BAR_STRIDE,\n SCATTER_STRIDE,\n type ChartRenderer,\n type RenderFrame,\n type RenderItem,\n type RendererLostHandler,\n} from \"./types\";\n\n// lib.dom has the WebGPU interfaces but not these constant objects\nconst BUFFER_VERTEX = 0x20;\nconst BUFFER_UNIFORM = 0x40;\nconst BUFFER_COPY_DST = 0x08;\nconst STAGE_VERTEX = 0x1;\nconst STAGE_FRAGMENT = 0x2;\n\nconst UNIFORM_SIZE = 64;\n\ninterface ItemResources {\n version: number;\n kind: RenderItem[\"kind\"];\n vertex: GPUBuffer | null;\n uniform: GPUBuffer;\n bindGroup: GPUBindGroup;\n}\n\ntype GpuNavigator = Navigator & { gpu?: GPU };\n\n/** Whether `navigator.gpu` exists (an adapter may still be unavailable) */\nexport const hasWebGpu = (): boolean =>\n typeof navigator !== \"undefined\" && !!(navigator as GpuNavigator).gpu;\n\nexport const createWebGpuRenderer = async (\n canvas: HTMLCanvasElement,\n onLost: RendererLostHandler,\n /** Refuses fallback (software) adapters */\n requireHardware = false,\n): Promise<ChartRenderer | null> => {\n const gpu = (navigator as GpuNavigator).gpu;\n if (!gpu) return null;\n const adapter = await gpu.requestAdapter();\n if (!adapter) return null;\n const fallback = adapter as GPUAdapter & {\n isFallbackAdapter?: boolean;\n info?: { isFallbackAdapter?: boolean };\n };\n if (\n requireHardware &&\n (fallback.info?.isFallbackAdapter || fallback.isFallbackAdapter)\n ) {\n return null;\n }\n const device = await adapter.requestDevice();\n const context = canvas.getContext(\"webgpu\") as GPUCanvasContext | null;\n if (!context) {\n device.destroy();\n return null;\n }\n const format = gpu.getPreferredCanvasFormat();\n context.configure({ device, format, alphaMode: \"premultiplied\" });\n\n let destroyed = false;\n void device.lost.then(() => {\n if (!destroyed) onLost();\n });\n\n const bindGroupLayout = device.createBindGroupLayout({\n entries: [\n {\n binding: 0,\n visibility: STAGE_VERTEX | STAGE_FRAGMENT,\n buffer: { type: \"uniform\" },\n },\n ],\n });\n const layout = device.createPipelineLayout({\n bindGroupLayouts: [bindGroupLayout],\n });\n const blend: GPUBlendState = {\n color: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n alpha: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n };\n const pipeline = (code: string, buffers: GPUVertexBufferLayout[]) => {\n const module = device.createShaderModule({ code });\n return device.createRenderPipeline({\n layout,\n vertex: { module, entryPoint: \"vs\", buffers },\n fragment: {\n module,\n entryPoint: \"fs\",\n targets: [{ format, blend }],\n },\n primitive: { topology: \"triangle-strip\" },\n });\n };\n const segment = (\n stride: number,\n format: GPUVertexFormat,\n ): GPUVertexBufferLayout[] => [\n {\n arrayStride: stride,\n stepMode: \"instance\",\n attributes: [{ shaderLocation: 0, offset: 0, format }],\n },\n {\n arrayStride: stride,\n stepMode: \"instance\",\n attributes: [{ shaderLocation: 1, offset: 0, format }],\n },\n ];\n const pipelines = {\n line: pipeline(WGSL_LINE, segment(8, \"float32x2\")),\n area: pipeline(WGSL_AREA, segment(AREA_STRIDE * 4, \"float32x3\")),\n bar: pipeline(WGSL_BAR, [\n {\n arrayStride: BAR_STRIDE,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x3\" },\n { shaderLocation: 1, offset: 12, format: \"unorm8x4\" },\n ],\n },\n ]),\n scatter: pipeline(WGSL_SCATTER, [\n {\n arrayStride: SCATTER_STRIDE,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x2\" },\n { shaderLocation: 1, offset: 8, format: \"float32\" },\n { shaderLocation: 2, offset: 12, format: \"unorm8x4\" },\n ],\n },\n ]),\n };\n\n const resources = new Map<string, ItemResources>();\n const uniformData = new Float32Array(UNIFORM_SIZE / 4);\n\n const vertexData = (item: RenderItem): ArrayBuffer | Float32Array => {\n switch (item.kind) {\n case \"line\":\n return item.points.subarray(0, item.count * 2);\n case \"area\":\n return item.points.subarray(0, item.count * AREA_STRIDE);\n default:\n return item.instances;\n }\n };\n\n const upload = (item: RenderItem): ItemResources => {\n let res = resources.get(item.key);\n if (res && res.version === item.version && res.kind === item.kind) {\n return res;\n }\n res?.vertex?.destroy();\n const data = vertexData(item);\n const size = Math.max(16, Math.ceil(data.byteLength / 4) * 4);\n const vertex =\n data.byteLength > 0\n ? device.createBuffer({ size, usage: BUFFER_VERTEX | BUFFER_COPY_DST })\n : null;\n if (vertex) {\n if (data instanceof Float32Array) {\n device.queue.writeBuffer(\n vertex,\n 0,\n data.buffer,\n data.byteOffset,\n data.byteLength,\n );\n } else {\n device.queue.writeBuffer(vertex, 0, data);\n }\n }\n if (!res) {\n const uniform = device.createBuffer({\n size: UNIFORM_SIZE,\n usage: BUFFER_UNIFORM | BUFFER_COPY_DST,\n });\n res = {\n version: item.version,\n kind: item.kind,\n vertex,\n uniform,\n bindGroup: device.createBindGroup({\n layout: bindGroupLayout,\n entries: [{ binding: 0, resource: { buffer: uniform } }],\n }),\n };\n resources.set(item.key, res);\n } else {\n res.version = item.version;\n res.kind = item.kind;\n res.vertex = vertex;\n }\n return res;\n };\n\n const params = (item: RenderItem, frame: RenderFrame): number[] => {\n switch (item.kind) {\n case \"line\":\n return [(item.width * frame.dpr) / 2, 0, 0, 0];\n case \"area\":\n return [0, item.opacity, 0, 0];\n case \"bar\":\n return [item.halfWidth, item.radius, item.inset, item.minHalf];\n default:\n return [item.opacity, item.stroke, 0, 0];\n }\n };\n\n const renderer: ChartRenderer = {\n kind: \"webgpu\" satisfies ChartRendererKind,\n canvas,\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(items, frame) {\n if (destroyed) return;\n const seen = new Set<string>();\n const encoder = device.createCommandEncoder();\n const pass = encoder.beginRenderPass({\n colorAttachments: [\n {\n view: context.getCurrentTexture().createView(),\n clearValue: { r: 0, g: 0, b: 0, a: 0 },\n loadOp: \"clear\",\n storeOp: \"store\",\n },\n ],\n });\n const t = frame.transform;\n for (const item of items) {\n seen.add(item.key);\n const [first, instances] = instanceRange(item, frame);\n if (instances <= 0) continue;\n const res = upload(item);\n if (!res.vertex) continue;\n uniformData.set(\n [\n t.xScale,\n t.xOffset,\n t.yScale,\n t.yOffset,\n frame.width,\n frame.height,\n frame.dpr,\n 0,\n ...item.color,\n ...params(item, frame),\n ],\n 0,\n );\n device.queue.writeBuffer(res.uniform, 0, uniformData);\n pass.setPipeline(pipelines[item.kind]);\n pass.setBindGroup(0, res.bindGroup);\n pass.setVertexBuffer(0, res.vertex);\n if (item.kind === \"line\") {\n pass.setVertexBuffer(1, res.vertex, 8);\n } else if (item.kind === \"area\") {\n pass.setVertexBuffer(1, res.vertex, AREA_STRIDE * 4);\n }\n pass.draw(4, instances, 0, first);\n }\n pass.end();\n device.queue.submit([encoder.finish()]);\n for (const [key, res] of resources) {\n if (!seen.has(key)) {\n res.vertex?.destroy();\n res.uniform.destroy();\n resources.delete(key);\n }\n }\n },\n destroy() {\n destroyed = true;\n for (const res of resources.values()) {\n res.vertex?.destroy();\n res.uniform.destroy();\n }\n resources.clear();\n context.unconfigure();\n device.destroy();\n },\n };\n return renderer;\n};\n"],"mappings":"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"}
|
|
@@ -54,32 +54,36 @@ var a = 64, o = async (o, s, c = !1) => {
|
|
|
54
54
|
},
|
|
55
55
|
primitive: { topology: "triangle-strip" }
|
|
56
56
|
});
|
|
57
|
-
}, b = [{
|
|
58
|
-
arrayStride:
|
|
57
|
+
}, b = (e, t) => [{
|
|
58
|
+
arrayStride: e,
|
|
59
59
|
stepMode: "instance",
|
|
60
60
|
attributes: [{
|
|
61
61
|
shaderLocation: 0,
|
|
62
62
|
offset: 0,
|
|
63
|
-
format:
|
|
63
|
+
format: t
|
|
64
64
|
}]
|
|
65
65
|
}, {
|
|
66
|
-
arrayStride:
|
|
66
|
+
arrayStride: e,
|
|
67
67
|
stepMode: "instance",
|
|
68
68
|
attributes: [{
|
|
69
69
|
shaderLocation: 1,
|
|
70
70
|
offset: 0,
|
|
71
|
-
format:
|
|
71
|
+
format: t
|
|
72
72
|
}]
|
|
73
73
|
}], x = {
|
|
74
|
-
line: y(r, b),
|
|
75
|
-
area: y(t, b),
|
|
74
|
+
line: y(r, b(8, "float32x2")),
|
|
75
|
+
area: y(t, b(12, "float32x3")),
|
|
76
76
|
bar: y(n, [{
|
|
77
|
-
arrayStride:
|
|
77
|
+
arrayStride: 16,
|
|
78
78
|
stepMode: "instance",
|
|
79
79
|
attributes: [{
|
|
80
80
|
shaderLocation: 0,
|
|
81
81
|
offset: 0,
|
|
82
82
|
format: "float32x3"
|
|
83
|
+
}, {
|
|
84
|
+
shaderLocation: 1,
|
|
85
|
+
offset: 12,
|
|
86
|
+
format: "unorm8x4"
|
|
83
87
|
}]
|
|
84
88
|
}]),
|
|
85
89
|
scatter: y(i, [{
|
|
@@ -105,9 +109,8 @@ var a = 64, o = async (o, s, c = !1) => {
|
|
|
105
109
|
}])
|
|
106
110
|
}, S = /* @__PURE__ */ new Map(), C = new Float32Array(a / 4), w = (e) => {
|
|
107
111
|
switch (e.kind) {
|
|
108
|
-
case "line":
|
|
109
|
-
case "area": return e.points.subarray(0, e.count *
|
|
110
|
-
case "bar": return e.instances.subarray(0, e.count * 3);
|
|
112
|
+
case "line": return e.points.subarray(0, e.count * 2);
|
|
113
|
+
case "area": return e.points.subarray(0, e.count * 3);
|
|
111
114
|
default: return e.instances;
|
|
112
115
|
}
|
|
113
116
|
}, T = (e) => {
|
|
@@ -148,7 +151,7 @@ var a = 64, o = async (o, s, c = !1) => {
|
|
|
148
151
|
0
|
|
149
152
|
];
|
|
150
153
|
case "area": return [
|
|
151
|
-
|
|
154
|
+
0,
|
|
152
155
|
e.opacity,
|
|
153
156
|
0,
|
|
154
157
|
0
|
|
@@ -156,8 +159,8 @@ var a = 64, o = async (o, s, c = !1) => {
|
|
|
156
159
|
case "bar": return [
|
|
157
160
|
e.halfWidth,
|
|
158
161
|
e.radius,
|
|
159
|
-
|
|
160
|
-
|
|
162
|
+
e.inset,
|
|
163
|
+
e.minHalf
|
|
161
164
|
];
|
|
162
165
|
default: return [
|
|
163
166
|
e.opacity,
|
|
@@ -202,7 +205,7 @@ var a = 64, o = async (o, s, c = !1) => {
|
|
|
202
205
|
0,
|
|
203
206
|
...i.color,
|
|
204
207
|
...E(i, n)
|
|
205
|
-
], 0), f.queue.writeBuffer(c.uniform, 0, C), a.setPipeline(x[i.kind]), a.setBindGroup(0, c.bindGroup), a.setVertexBuffer(0, c.vertex),
|
|
208
|
+
], 0), f.queue.writeBuffer(c.uniform, 0, C), a.setPipeline(x[i.kind]), a.setBindGroup(0, c.bindGroup), a.setVertexBuffer(0, c.vertex), i.kind === "line" ? a.setVertexBuffer(1, c.vertex, 8) : i.kind === "area" && a.setVertexBuffer(1, c.vertex, 12), a.draw(4, s, 0, t));
|
|
206
209
|
}
|
|
207
210
|
a.end(), f.queue.submit([i.finish()]);
|
|
208
211
|
for (let [e, t] of S) r.has(e) || (t.vertex?.destroy(), t.uniform.destroy(), S.delete(e));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgpu.js","names":["UNIFORM_SIZE","createWebGpuRenderer","gpu","adapter","fallback","requireHardware","device","context","canvas","format","destroyed","onLost","bindGroupLayout","layout","blend","pipeline","module","segment","pipelines","WGSL_LINE","WGSL_AREA","WGSL_BAR","WGSL_SCATTER","resources","uniformData","vertexData","item","upload","res","data","size","vertex","uniform","params","frame","width","height","seen","encoder","pass","t","items","first","instances","instanceRange","key"],"sources":["../../../../../charts/src/engine/renderers/webgpu.ts"],"sourcesContent":["// WebGPU backend: one instanced draw per series.\n\nimport type { ChartRendererKind } from \"../types\";\nimport { instanceRange } from \"./range\";\nimport { WGSL_AREA, WGSL_BAR, WGSL_LINE, WGSL_SCATTER } from \"./shaders\";\nimport {\n SCATTER_STRIDE,\n type ChartRenderer,\n type RenderFrame,\n type RenderItem,\n type RendererLostHandler,\n} from \"./types\";\n\n// lib.dom has the WebGPU interfaces but not these constant objects\nconst BUFFER_VERTEX = 0x20;\nconst BUFFER_UNIFORM = 0x40;\nconst BUFFER_COPY_DST = 0x08;\nconst STAGE_VERTEX = 0x1;\nconst STAGE_FRAGMENT = 0x2;\n\nconst UNIFORM_SIZE = 64;\n\ninterface ItemResources {\n version: number;\n kind: RenderItem[\"kind\"];\n vertex: GPUBuffer | null;\n uniform: GPUBuffer;\n bindGroup: GPUBindGroup;\n}\n\ntype GpuNavigator = Navigator & { gpu?: GPU };\n\n/** Whether `navigator.gpu` exists (an adapter may still be unavailable) */\nexport const hasWebGpu = (): boolean =>\n typeof navigator !== \"undefined\" && !!(navigator as GpuNavigator).gpu;\n\nexport const createWebGpuRenderer = async (\n canvas: HTMLCanvasElement,\n onLost: RendererLostHandler,\n /** Refuses fallback (software) adapters */\n requireHardware = false,\n): Promise<ChartRenderer | null> => {\n const gpu = (navigator as GpuNavigator).gpu;\n if (!gpu) return null;\n const adapter = await gpu.requestAdapter();\n if (!adapter) return null;\n const fallback = adapter as GPUAdapter & {\n isFallbackAdapter?: boolean;\n info?: { isFallbackAdapter?: boolean };\n };\n if (\n requireHardware &&\n (fallback.info?.isFallbackAdapter || fallback.isFallbackAdapter)\n ) {\n return null;\n }\n const device = await adapter.requestDevice();\n const context = canvas.getContext(\"webgpu\") as GPUCanvasContext | null;\n if (!context) {\n device.destroy();\n return null;\n }\n const format = gpu.getPreferredCanvasFormat();\n context.configure({ device, format, alphaMode: \"premultiplied\" });\n\n let destroyed = false;\n void device.lost.then(() => {\n if (!destroyed) onLost();\n });\n\n const bindGroupLayout = device.createBindGroupLayout({\n entries: [\n {\n binding: 0,\n visibility: STAGE_VERTEX | STAGE_FRAGMENT,\n buffer: { type: \"uniform\" },\n },\n ],\n });\n const layout = device.createPipelineLayout({\n bindGroupLayouts: [bindGroupLayout],\n });\n const blend: GPUBlendState = {\n color: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n alpha: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n };\n const pipeline = (code: string, buffers: GPUVertexBufferLayout[]) => {\n const module = device.createShaderModule({ code });\n return device.createRenderPipeline({\n layout,\n vertex: { module, entryPoint: \"vs\", buffers },\n fragment: {\n module,\n entryPoint: \"fs\",\n targets: [{ format, blend }],\n },\n primitive: { topology: \"triangle-strip\" },\n });\n };\n const segment: GPUVertexBufferLayout[] = [\n {\n arrayStride: 8,\n stepMode: \"instance\",\n attributes: [{ shaderLocation: 0, offset: 0, format: \"float32x2\" }],\n },\n {\n arrayStride: 8,\n stepMode: \"instance\",\n attributes: [{ shaderLocation: 1, offset: 0, format: \"float32x2\" }],\n },\n ];\n const pipelines = {\n line: pipeline(WGSL_LINE, segment),\n area: pipeline(WGSL_AREA, segment),\n bar: pipeline(WGSL_BAR, [\n {\n arrayStride: 12,\n stepMode: \"instance\",\n attributes: [{ shaderLocation: 0, offset: 0, format: \"float32x3\" }],\n },\n ]),\n scatter: pipeline(WGSL_SCATTER, [\n {\n arrayStride: SCATTER_STRIDE,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x2\" },\n { shaderLocation: 1, offset: 8, format: \"float32\" },\n { shaderLocation: 2, offset: 12, format: \"unorm8x4\" },\n ],\n },\n ]),\n };\n\n const resources = new Map<string, ItemResources>();\n const uniformData = new Float32Array(UNIFORM_SIZE / 4);\n\n const vertexData = (item: RenderItem): ArrayBuffer | Float32Array => {\n switch (item.kind) {\n case \"line\":\n case \"area\":\n return item.points.subarray(0, item.count * 2);\n case \"bar\":\n return item.instances.subarray(0, item.count * 3);\n default:\n return item.instances;\n }\n };\n\n const upload = (item: RenderItem): ItemResources => {\n let res = resources.get(item.key);\n if (res && res.version === item.version && res.kind === item.kind) {\n return res;\n }\n res?.vertex?.destroy();\n const data = vertexData(item);\n const size = Math.max(16, Math.ceil(data.byteLength / 4) * 4);\n const vertex =\n data.byteLength > 0\n ? device.createBuffer({ size, usage: BUFFER_VERTEX | BUFFER_COPY_DST })\n : null;\n if (vertex) {\n if (data instanceof Float32Array) {\n device.queue.writeBuffer(\n vertex,\n 0,\n data.buffer,\n data.byteOffset,\n data.byteLength,\n );\n } else {\n device.queue.writeBuffer(vertex, 0, data);\n }\n }\n if (!res) {\n const uniform = device.createBuffer({\n size: UNIFORM_SIZE,\n usage: BUFFER_UNIFORM | BUFFER_COPY_DST,\n });\n res = {\n version: item.version,\n kind: item.kind,\n vertex,\n uniform,\n bindGroup: device.createBindGroup({\n layout: bindGroupLayout,\n entries: [{ binding: 0, resource: { buffer: uniform } }],\n }),\n };\n resources.set(item.key, res);\n } else {\n res.version = item.version;\n res.kind = item.kind;\n res.vertex = vertex;\n }\n return res;\n };\n\n const params = (item: RenderItem, frame: RenderFrame): number[] => {\n switch (item.kind) {\n case \"line\":\n return [(item.width * frame.dpr) / 2, 0, 0, 0];\n case \"area\":\n return [item.baseline, item.opacity, 0, 0];\n case \"bar\":\n return [item.halfWidth, item.radius, 0, 0];\n default:\n return [item.opacity, item.stroke, 0, 0];\n }\n };\n\n const renderer: ChartRenderer = {\n kind: \"webgpu\" satisfies ChartRendererKind,\n canvas,\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(items, frame) {\n if (destroyed) return;\n const seen = new Set<string>();\n const encoder = device.createCommandEncoder();\n const pass = encoder.beginRenderPass({\n colorAttachments: [\n {\n view: context.getCurrentTexture().createView(),\n clearValue: { r: 0, g: 0, b: 0, a: 0 },\n loadOp: \"clear\",\n storeOp: \"store\",\n },\n ],\n });\n const t = frame.transform;\n for (const item of items) {\n seen.add(item.key);\n const [first, instances] = instanceRange(item, frame);\n if (instances <= 0) continue;\n const res = upload(item);\n if (!res.vertex) continue;\n uniformData.set(\n [\n t.xScale,\n t.xOffset,\n t.yScale,\n t.yOffset,\n frame.width,\n frame.height,\n frame.dpr,\n 0,\n ...item.color,\n ...params(item, frame),\n ],\n 0,\n );\n device.queue.writeBuffer(res.uniform, 0, uniformData);\n pass.setPipeline(pipelines[item.kind]);\n pass.setBindGroup(0, res.bindGroup);\n pass.setVertexBuffer(0, res.vertex);\n if (item.kind === \"line\" || item.kind === \"area\") {\n pass.setVertexBuffer(1, res.vertex, 8);\n }\n pass.draw(4, instances, 0, first);\n }\n pass.end();\n device.queue.submit([encoder.finish()]);\n for (const [key, res] of resources) {\n if (!seen.has(key)) {\n res.vertex?.destroy();\n res.uniform.destroy();\n resources.delete(key);\n }\n }\n },\n destroy() {\n destroyed = true;\n for (const res of resources.values()) {\n res.vertex?.destroy();\n res.uniform.destroy();\n }\n resources.clear();\n context.unconfigure();\n device.destroy();\n },\n };\n return renderer;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"webgpu.js","names":["UNIFORM_SIZE","createWebGpuRenderer","gpu","adapter","fallback","requireHardware","device","context","canvas","format","destroyed","onLost","bindGroupLayout","layout","blend","pipeline","module","segment","stride","pipelines","WGSL_LINE","WGSL_AREA","WGSL_BAR","WGSL_SCATTER","resources","uniformData","vertexData","item","upload","res","data","size","vertex","uniform","params","frame","width","height","seen","encoder","pass","t","items","first","instances","instanceRange","key"],"sources":["../../../../../charts/src/engine/renderers/webgpu.ts"],"sourcesContent":["// WebGPU backend: one instanced draw per series.\n\nimport type { ChartRendererKind } from \"../types\";\nimport { instanceRange } from \"./range\";\nimport { WGSL_AREA, WGSL_BAR, WGSL_LINE, WGSL_SCATTER } from \"./shaders\";\nimport {\n AREA_STRIDE,\n BAR_STRIDE,\n SCATTER_STRIDE,\n type ChartRenderer,\n type RenderFrame,\n type RenderItem,\n type RendererLostHandler,\n} from \"./types\";\n\n// lib.dom has the WebGPU interfaces but not these constant objects\nconst BUFFER_VERTEX = 0x20;\nconst BUFFER_UNIFORM = 0x40;\nconst BUFFER_COPY_DST = 0x08;\nconst STAGE_VERTEX = 0x1;\nconst STAGE_FRAGMENT = 0x2;\n\nconst UNIFORM_SIZE = 64;\n\ninterface ItemResources {\n version: number;\n kind: RenderItem[\"kind\"];\n vertex: GPUBuffer | null;\n uniform: GPUBuffer;\n bindGroup: GPUBindGroup;\n}\n\ntype GpuNavigator = Navigator & { gpu?: GPU };\n\n/** Whether `navigator.gpu` exists (an adapter may still be unavailable) */\nexport const hasWebGpu = (): boolean =>\n typeof navigator !== \"undefined\" && !!(navigator as GpuNavigator).gpu;\n\nexport const createWebGpuRenderer = async (\n canvas: HTMLCanvasElement,\n onLost: RendererLostHandler,\n /** Refuses fallback (software) adapters */\n requireHardware = false,\n): Promise<ChartRenderer | null> => {\n const gpu = (navigator as GpuNavigator).gpu;\n if (!gpu) return null;\n const adapter = await gpu.requestAdapter();\n if (!adapter) return null;\n const fallback = adapter as GPUAdapter & {\n isFallbackAdapter?: boolean;\n info?: { isFallbackAdapter?: boolean };\n };\n if (\n requireHardware &&\n (fallback.info?.isFallbackAdapter || fallback.isFallbackAdapter)\n ) {\n return null;\n }\n const device = await adapter.requestDevice();\n const context = canvas.getContext(\"webgpu\") as GPUCanvasContext | null;\n if (!context) {\n device.destroy();\n return null;\n }\n const format = gpu.getPreferredCanvasFormat();\n context.configure({ device, format, alphaMode: \"premultiplied\" });\n\n let destroyed = false;\n void device.lost.then(() => {\n if (!destroyed) onLost();\n });\n\n const bindGroupLayout = device.createBindGroupLayout({\n entries: [\n {\n binding: 0,\n visibility: STAGE_VERTEX | STAGE_FRAGMENT,\n buffer: { type: \"uniform\" },\n },\n ],\n });\n const layout = device.createPipelineLayout({\n bindGroupLayouts: [bindGroupLayout],\n });\n const blend: GPUBlendState = {\n color: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n alpha: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n };\n const pipeline = (code: string, buffers: GPUVertexBufferLayout[]) => {\n const module = device.createShaderModule({ code });\n return device.createRenderPipeline({\n layout,\n vertex: { module, entryPoint: \"vs\", buffers },\n fragment: {\n module,\n entryPoint: \"fs\",\n targets: [{ format, blend }],\n },\n primitive: { topology: \"triangle-strip\" },\n });\n };\n const segment = (\n stride: number,\n format: GPUVertexFormat,\n ): GPUVertexBufferLayout[] => [\n {\n arrayStride: stride,\n stepMode: \"instance\",\n attributes: [{ shaderLocation: 0, offset: 0, format }],\n },\n {\n arrayStride: stride,\n stepMode: \"instance\",\n attributes: [{ shaderLocation: 1, offset: 0, format }],\n },\n ];\n const pipelines = {\n line: pipeline(WGSL_LINE, segment(8, \"float32x2\")),\n area: pipeline(WGSL_AREA, segment(AREA_STRIDE * 4, \"float32x3\")),\n bar: pipeline(WGSL_BAR, [\n {\n arrayStride: BAR_STRIDE,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x3\" },\n { shaderLocation: 1, offset: 12, format: \"unorm8x4\" },\n ],\n },\n ]),\n scatter: pipeline(WGSL_SCATTER, [\n {\n arrayStride: SCATTER_STRIDE,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x2\" },\n { shaderLocation: 1, offset: 8, format: \"float32\" },\n { shaderLocation: 2, offset: 12, format: \"unorm8x4\" },\n ],\n },\n ]),\n };\n\n const resources = new Map<string, ItemResources>();\n const uniformData = new Float32Array(UNIFORM_SIZE / 4);\n\n const vertexData = (item: RenderItem): ArrayBuffer | Float32Array => {\n switch (item.kind) {\n case \"line\":\n return item.points.subarray(0, item.count * 2);\n case \"area\":\n return item.points.subarray(0, item.count * AREA_STRIDE);\n default:\n return item.instances;\n }\n };\n\n const upload = (item: RenderItem): ItemResources => {\n let res = resources.get(item.key);\n if (res && res.version === item.version && res.kind === item.kind) {\n return res;\n }\n res?.vertex?.destroy();\n const data = vertexData(item);\n const size = Math.max(16, Math.ceil(data.byteLength / 4) * 4);\n const vertex =\n data.byteLength > 0\n ? device.createBuffer({ size, usage: BUFFER_VERTEX | BUFFER_COPY_DST })\n : null;\n if (vertex) {\n if (data instanceof Float32Array) {\n device.queue.writeBuffer(\n vertex,\n 0,\n data.buffer,\n data.byteOffset,\n data.byteLength,\n );\n } else {\n device.queue.writeBuffer(vertex, 0, data);\n }\n }\n if (!res) {\n const uniform = device.createBuffer({\n size: UNIFORM_SIZE,\n usage: BUFFER_UNIFORM | BUFFER_COPY_DST,\n });\n res = {\n version: item.version,\n kind: item.kind,\n vertex,\n uniform,\n bindGroup: device.createBindGroup({\n layout: bindGroupLayout,\n entries: [{ binding: 0, resource: { buffer: uniform } }],\n }),\n };\n resources.set(item.key, res);\n } else {\n res.version = item.version;\n res.kind = item.kind;\n res.vertex = vertex;\n }\n return res;\n };\n\n const params = (item: RenderItem, frame: RenderFrame): number[] => {\n switch (item.kind) {\n case \"line\":\n return [(item.width * frame.dpr) / 2, 0, 0, 0];\n case \"area\":\n return [0, item.opacity, 0, 0];\n case \"bar\":\n return [item.halfWidth, item.radius, item.inset, item.minHalf];\n default:\n return [item.opacity, item.stroke, 0, 0];\n }\n };\n\n const renderer: ChartRenderer = {\n kind: \"webgpu\" satisfies ChartRendererKind,\n canvas,\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(items, frame) {\n if (destroyed) return;\n const seen = new Set<string>();\n const encoder = device.createCommandEncoder();\n const pass = encoder.beginRenderPass({\n colorAttachments: [\n {\n view: context.getCurrentTexture().createView(),\n clearValue: { r: 0, g: 0, b: 0, a: 0 },\n loadOp: \"clear\",\n storeOp: \"store\",\n },\n ],\n });\n const t = frame.transform;\n for (const item of items) {\n seen.add(item.key);\n const [first, instances] = instanceRange(item, frame);\n if (instances <= 0) continue;\n const res = upload(item);\n if (!res.vertex) continue;\n uniformData.set(\n [\n t.xScale,\n t.xOffset,\n t.yScale,\n t.yOffset,\n frame.width,\n frame.height,\n frame.dpr,\n 0,\n ...item.color,\n ...params(item, frame),\n ],\n 0,\n );\n device.queue.writeBuffer(res.uniform, 0, uniformData);\n pass.setPipeline(pipelines[item.kind]);\n pass.setBindGroup(0, res.bindGroup);\n pass.setVertexBuffer(0, res.vertex);\n if (item.kind === \"line\") {\n pass.setVertexBuffer(1, res.vertex, 8);\n } else if (item.kind === \"area\") {\n pass.setVertexBuffer(1, res.vertex, AREA_STRIDE * 4);\n }\n pass.draw(4, instances, 0, first);\n }\n pass.end();\n device.queue.submit([encoder.finish()]);\n for (const [key, res] of resources) {\n if (!seen.has(key)) {\n res.vertex?.destroy();\n res.uniform.destroy();\n resources.delete(key);\n }\n }\n },\n destroy() {\n destroyed = true;\n for (const res of resources.values()) {\n res.vertex?.destroy();\n res.uniform.destroy();\n }\n resources.clear();\n context.unconfigure();\n device.destroy();\n },\n };\n return renderer;\n};\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("./data.cjs"),t=require("./color.cjs"),n=require("./layout.cjs"),r=require("./model.cjs"),i=require("./axis.cjs");var
|
|
1
|
+
const e=require("./data.cjs"),t=require("./color.cjs"),n=require("./layout.cjs"),r=require("./model.cjs"),i=require("./format.cjs"),a=require("./axis.cjs");var o={top:12,right:16,bottom:4,left:4},s=(e,t)=>t,c=(e,n)=>{let r=n.resolve??s;return(e??[]).map(e=>{if(e.type===`rect`){let i=e.color?r(e.color,n.primary):n.primary;return{type:`rect`,x0:e.x0,x1:e.x1,y0:e.y0,y1:e.y1,color:i,opacity:e.opacity??.08,label:e.label,labelPosition:e.labelPosition??`top-left`,labelColor:e.labelColor?r(e.labelColor,i):t.mix(i,n.text,.2)}}return e.type===`text`?{type:`text`,x:e.x,y:e.y,text:e.text,anchor:e.anchor??`center`,color:e.color?r(e.color,n.textMuted):n.textMuted,weight:e.weight??500}:{type:`line`,axis:e.axis,value:e.value,color:e.color?r(e.color,n.textMuted):n.textMuted,width:e.width??1,dash:[...e.dash??[4,4]],label:e.label}})},l=e=>{let{model:t,view:r,theme:i,width:s,height:c,measure:l}=e,u=t.y.tickCount??(t.y.type===`category`?Math.max(1,Math.floor((c-40)/(i.fontSize+5))):c>=220?5:Math.max(2,Math.round((c-48)/52))),d=a.axisTicks(t.y,r.y,u),f=0;if(t.y.visible)for(let e of d.labels)f=Math.max(f,l(e));let p=48;if(t.x.type===`category`){p=0;let e=Math.max(1,Math.floor(t.x.categories.length/200));for(let n=0;n<t.x.categories.length;n+=e)p=Math.max(p,l(t.x.categories[n]))}let m={...o,...e.padding},h=n.computePlot({width:s,height:c,padding:m,yLabelWidth:t.y.visible?Math.ceil(f):0,xAxisVisible:t.x.visible,xTitle:!!t.x.title&&t.x.visible,yTitle:!!t.y.title&&t.y.visible,fontSize:i.fontSize});e.top&&(h.y+=e.top);let g=t.x.type===`category`?Math.max(1,Math.floor(h.width/(p+14))):t.x.tickCount??Math.max(3,Math.floor(h.width/88)),_=a.axisTicks(t.x,r.x,g);return{plot:h,scales:n.createScales(h,r,t.x.reverse,t.y.reverse),xTicks:_,yTicks:d}},u=(e,t,n,r)=>{let a=[],o=e.percent?i.formatValue:r?.formatValue??i.formatValue;for(let r of e.series){if(r.hidden||!r.showLabels)continue;if(r.type===`bar`&&r.barTop){let e=r.format??o,{x:i,y:s,count:c}=r.cols,l=r.barTop,[u,d]=t.x[0]<=t.x[1]?t.x:[t.x[1],t.x[0]];for(let t=0;t<c&&a.length<300;t++){let o=i[t]+r.barOffset;if(!Number.isFinite(s[t])||o<u||o>d)continue;let c=l[t]<(r.barBase?.[t]??0);a.push({x:n.xToPx(o),y:n.yToPx(l[t]),r:0,text:e(s[t]),placement:c?`below`:`above`})}continue}if(r.type!==`scatter`)continue;let{x:e,y:i,count:s,labels:c,size:l}=r.cols;if(c)for(let o=0;o<s&&a.length<300;o++){let s=c[o];if(!s)continue;let u=e[o],d=i[o];if(u<t.x[0]||u>t.x[1]||d<t.y[0]||d>t.y[1])continue;let f=l&&l[o]>0?l[o]:r.pointSize;a.push({x:n.xToPx(u),y:n.yToPx(d),r:f/2,text:s})}}return a},d=(e,t,n)=>{let i=e.cols.x[t]+(e.type===`bar`?e.barOffset:0);return{px:n.xToPx(i),py:n.yToPx(r.plottedY(e,t))}},f=(e,t,n,r,i)=>{let a=d(e,t,i),o=!1;if(e.type===`bar`&&e.barBase){let s=e.barHalfWidth/i.xPerPx,c=i.yToPx(e.barBase[t]);o=Math.abs(n-a.px)<=s&&r>=Math.min(c,a.py)-2&&r<=Math.max(c,a.py)+2}else if(e.type===`candlestick`){let{high:s,low:c,y:l}=e.cols,u=Math.max(e.barHalfWidth/i.xPerPx,3),d=i.yToPx(s?s[t]:l[t]),f=i.yToPx(c?c[t]:l[t]);o=Math.abs(n-a.px)<=u&&r>=Math.min(d,f)-2&&r<=Math.max(d,f)+2}return{series:e,index:t,px:a.px,py:a.py,dx:Math.abs(i.xToPx(e.cols.x[t])-n),dist:o?0:Math.hypot(a.px-n,a.py-r),inside:o}},p=(e,t)=>e.cols.size&&e.cols.size[t]>0?e.cols.size[t]:e.pointSize,m=(e,t,n,i,a)=>{let o=Math.max(e.pointSize/2+6,10)+a,s=i.pxToX(t),c=i.pxToY(n),l=o*i.xPerPx,u=o*i.yPerPx,d=-1,f=1/0,{x:m,y:h}=e.cols;return r.gridOf(e).query(s-l,s+l,c-u,c+u,r=>{let o=Math.hypot(i.xToPx(m[r])-t,i.yToPx(h[r])-n);o<=Math.max(p(e,r)/2+4,8)+a&&o<=f&&(f=o,d=r)}),d},h=(e,t,n)=>{let{x:i,y:a}=e.cellHalf,{x:o,y:s}=e.cols,c=-1;return r.gridOf(e).query(t-i,t+i,n-a,n+a,r=>{e.cellColors?.[r]&&Math.abs(o[r]-t)<=i&&Math.abs(s[r]-n)<=a&&(c=r)}),c},g=(t,n)=>{let{x:r,y:i,count:a,sorted:o}=t.cols;if(o)return e.nearestIndex(r,i,a,n);let s=-1,c=1/0;for(let e=0;e<a;e++){if(!Number.isFinite(i[e]))continue;let t=Math.abs(r[e]-n);t<c&&(c=t,s=e)}return s},_=(e,n)=>{let r=e.pointColors?.[n],i=e.cols.labels?.[n],{open:a,high:o,low:s,value:c}=e.cols,l=r?t.toCss(r):e.colorCss,u={};if(e.type===`candlestick`){let r=a?a[n]:NaN;Number.isFinite(r)&&(u.open=r),o&&Number.isFinite(o[n])&&(u.high=o[n]),s&&Number.isFinite(s[n])&&(u.low=s[n]),l=t.toCss(e.cols.y[n]<r?e.downColor:e.upColor)}else if(e.type===`heatmap`){let r=c?c[n]:e.cols.y[n];Number.isFinite(r)&&(u.value=r);let i=e.cellColors?.[n];i&&(l=t.toCss(t.unpackColor(i)))}return{seriesIndex:e.index,seriesId:e.id,seriesName:e.name,index:n,x:e.cols.x[n],y:e.cols.y[n],color:l,...i===void 0?{}:{label:i},...u}},v=(e,t)=>{if(!e.length)return null;e.sort((e,t)=>e.series.index-t.series.index);let n=e.map(e=>_(e.series,e.index)),r=n[0].x;return{items:n,x:r,xLabel:t?.formatValue(r)??String(r)}},y=(e,t,n,r,i,a=0)=>{let{plot:o}=t,s=6+a;if(r<o.x-s||r>o.x+o.width+s||i<o.y-s||i>o.y+o.height+s)return null;let c=t.pxToX(r),l=[],u=[];for(let n of e.series)if(!(n.hidden||n.cols.count===0)){if(n.type===`scatter`){let e=m(n,r,i,t,a);e>=0&&l.push(f(n,e,r,i,t))}else if(n.type===`heatmap`){let e=h(n,t.pxToX(r),t.pxToY(i));if(e>=0){let a=f(n,e,r,i,t);a.inside=!0,a.dist=0,l.push(a)}}else{let e=g(n,c);e>=0&&u.push(f(n,e,r,i,t))}}if(e.tooltipMode===`nearest`){let e=[...l,...u].filter(e=>e.inside||e.series.type===`scatter`||e.dist<=32+a);return e.length?v([e.reduce((e,t)=>t.dist<=e.dist?t:e)],n):null}if(!u.length)return l.length?v([l.reduce((e,t)=>t.dist<=e.dist?t:e)],n):null;let d=Math.min(...u.map(e=>e.dx)),p=e.x.type===`category`?.5/t.xPerPx:0,y=u.filter(e=>e.dx<=d+Math.max(1,p)),b=y.reduce((e,t)=>t.dx<e.dx?t:e),x=v([b,...y.filter(e=>e!==b),...l],n);return x&&(x.x=_(b.series,b.index).x,x.xLabel=n?.formatValue(x.x)??String(x.x)),x},b=(e,t)=>e===t||!!e&&!!t&&e.items.length===t.items.length&&e.items.every((e,n)=>e.index===t.items[n].index&&e.seriesIndex===t.items[n].seriesIndex),x=(e,t,n)=>{let r=n?.formatValue??String,a=t.items[0],o=a?e.series[a.seriesIndex]:null;if(t.items.length===1&&o?.type===`heatmap`){let n=e.y.type===`category`?e.y.categories[Math.round(a.y)]??r(a.y):r(a.y);return{title:`${t.xLabel} · ${n}`,titleColor:null,rows:[{color:a.color,name:a.label??o.name,value:a.value===void 0?`–`:(o.format??i.formatValue)(a.value)}]}}if(t.items.every(t=>e.series[t.seriesIndex].type===`scatter`)&&t.items.length===1){let n=t.items[0],i=[{color:null,name:e.x.title??`x`,value:t.xLabel},{color:null,name:e.y.title??`y`,value:r(n.y)}];return n.label!==void 0&&e.series.length>1&&i.push({color:null,name:``,value:n.seriesName}),{title:n.label??n.seriesName,titleColor:n.color,rows:i}}let s=[],c=[];for(let n of t.items){let t=e.series[n.seriesIndex];if(c.push(s.length),t.type===`candlestick`){let e=n.open!==void 0&&n.open!==0?(n.y-n.open)/Math.abs(n.open)*100:NaN;s.push({color:n.color,name:t.name,value:Number.isFinite(e)?`${e>=0?`+`:``}${e.toFixed(2)}%`:``});let i=[[`Open`,n.open],[`High`,n.high],[`Low`,n.low],[`Close`,n.y]];for(let[e,n]of i)n!==void 0&&Number.isFinite(n)&&s.push({color:null,name:e,value:(t.format??r)(n)});continue}s.push({color:n.color,name:n.label?`${n.seriesName} · ${n.label}`:n.seriesName,value:(t.format??r)(n.y)})}if(e.percent){let n=new Map;for(let r of t.items){let t=S(e,r.seriesIndex);t!==null&&Number.isFinite(r.y)&&n.set(t,(n.get(t)??0)+Math.abs(r.y))}t.items.forEach((t,r)=>{let a=S(e,t.seriesIndex),o=a===null?void 0:n.get(a),l=s[c[r]];o&&l&&Number.isFinite(t.y)&&(l.value=`${(e.series[t.seriesIndex].format??i.formatValue)(t.y)} · ${(Math.abs(t.y)/o*100).toFixed(1)}%`)})}return{title:t.xLabel,titleColor:null,rows:s}},S=(e,t)=>e.series[t].hidden?null:e.stacks[t],C=(e,n,r)=>{let i=[],{plot:a}=n,o=1/0,s=-1/0;for(let c of r.items){let r=e.series[c.seriesIndex];if(r.type===`bar`||r.type===`candlestick`){let e=n.xToPx(c.x+r.barOffset),t=Math.max(r.barHalfWidth/n.xPerPx,1);o=Math.min(o,e-t),s=Math.max(s,e+t);continue}if(r.type===`heatmap`){let e=n.xToPx(c.x),t=n.yToPx(c.y),a=Math.abs(r.cellHalf.x/n.xPerPx),o=Math.abs(r.cellHalf.y/n.yPerPx);i.push({kind:`cell`,x:e-a,y:t-o,width:a*2,height:o*2});continue}let{px:l,py:u}=d(r,c.index,n);if(l<a.x-1||l>a.x+a.width+1||u<a.y-1||u>a.y+a.height+1)continue;let f=r.type===`scatter`?p(r,c.index)+4:Math.max(9,r.lineWidth*2+5),m=r.pointColors?.[c.index]??r.color;i.push({kind:`dot`,x:l,y:u,size:f,color:c.color,halo:t.toCss(m,.2)})}if(s>o){let e=Math.max(4,(s-o)*.14),t=Math.max(a.x,o-e),n=Math.min(a.x+a.width,s+e);n>t&&i.unshift({kind:`band`,x:t,y:a.y,width:n-t,height:a.height})}return i},w=e=>e===`scatter`?`dot`:e===`line`?`line`:`square`,T=(e,t,n)=>n??(e.tooltipMode===`axis`&&t.items.some(t=>{let n=e.series[t.seriesIndex].type;return n===`line`||n===`area`})&&!t.items.some(t=>{let n=e.series[t.seriesIndex].type;return n===`bar`||n===`candlestick`}));exports.DEFAULT_PADDING=o,exports.collectPointLabels=u,exports.dotSize=p,exports.fallbackResolve=s,exports.hitTest=y,exports.hoverItemOf=_,exports.hoverMarks=C,exports.layoutChart=l,exports.legendShape=w,exports.pointOf=d,exports.resolveAnnotations=c,exports.sameHover=b,exports.showsCrosshair=T,exports.tooltipContent=x;
|
|
2
2
|
//# sourceMappingURL=scene.cjs.map
|