blazeplot 0.1.5 → 0.1.7
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/README.md +19 -14
- package/dist/core/SeriesStore.d.ts +4 -0
- package/dist/core/SeriesStore.d.ts.map +1 -1
- package/dist/core/types.d.ts +5 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +406 -113
- package/dist/index.js.map +1 -1
- package/dist/render/ReglBackend.d.ts +2 -0
- package/dist/render/ReglBackend.d.ts.map +1 -1
- package/dist/render/Renderer.d.ts +16 -1
- package/dist/render/Renderer.d.ts.map +1 -1
- package/dist/render/ShaderPrograms.d.ts +8 -0
- package/dist/render/ShaderPrograms.d.ts.map +1 -1
- package/dist/render/index.d.ts +1 -1
- package/dist/render/index.d.ts.map +1 -1
- package/dist/render/types.d.ts +12 -1
- package/dist/render/types.d.ts.map +1 -1
- package/dist/ui/AxisOverlay.d.ts +6 -14
- package/dist/ui/AxisOverlay.d.ts.map +1 -1
- package/dist/ui/Chart.d.ts +14 -5
- package/dist/ui/Chart.d.ts.map +1 -1
- package/dist/ui/ChartLayout.d.ts +36 -0
- package/dist/ui/ChartLayout.d.ts.map +1 -0
- package/dist/ui/index.d.ts +2 -1
- package/dist/ui/index.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../src/core/MinMaxPyramid.ts","../src/core/SeriesStore.ts","../src/core/RingBuffer.ts","../src/render/ShaderPrograms.ts","../src/render/Renderer.ts","../src/render/WebGL2Resources.ts","../src/render/ReglBackend.ts","../src/interaction/InputController.ts","../src/interaction/Camera2D.ts","../src/interaction/AxisController.ts","../src/ui/AxisOverlay.ts","../src/ui/Chart.ts","../src/core/StaticDataset.ts"],"sourcesContent":["import type { Dataset, LODView, Viewport } from \"./types.js\";\n\nconst MAX_LEVELS = 16;\n\nexport class MinMaxPyramid {\n private levels: Float32Array[] = [];\n private levelLengths: Uint32Array;\n private levelSampleWidths: Uint32Array;\n private _builtLen: number = 0;\n private _lastRangeStart: number = NaN;\n\n constructor(readonly bucketSize: number = 2) {\n if (!Number.isInteger(bucketSize) || bucketSize < 2) {\n throw new RangeError(\"MinMaxPyramid bucketSize must be an integer >= 2.\");\n }\n\n this.levelLengths = new Uint32Array(MAX_LEVELS);\n this.levelSampleWidths = new Uint32Array(MAX_LEVELS);\n }\n\n build(source: Dataset): void {\n this.levels = [];\n this.levelLengths.fill(0);\n this.levelSampleWidths.fill(0);\n\n let srcLen = source.length;\n if (srcLen === 0) {\n this._builtLen = 0;\n this._lastRangeStart = NaN;\n return;\n }\n\n let prevLevel: Float32Array | null = null;\n let level = 0;\n\n while (srcLen > 0 && level < MAX_LEVELS) {\n const nextLen = Math.ceil(srcLen / this.bucketSize);\n const levelData = new Float32Array(nextLen * 2);\n\n for (let i = 0; i < srcLen; i += this.bucketSize) {\n let minY = Infinity;\n let maxY = -Infinity;\n const end = Math.min(i + this.bucketSize, srcLen);\n for (let j = i; j < end; j++) {\n if (prevLevel) {\n const prevMin = prevLevel[j * 2]!;\n const prevMax = prevLevel[j * 2 + 1]!;\n if (prevMin < minY) minY = prevMin;\n if (prevMax > maxY) maxY = prevMax;\n } else {\n const y = source.getY(j);\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n }\n }\n const outIdx = Math.floor(i / this.bucketSize);\n levelData[outIdx * 2] = minY;\n levelData[outIdx * 2 + 1] = maxY;\n }\n\n this.levels[level] = levelData;\n this.levelLengths[level] = nextLen;\n this.levelSampleWidths[level] = this.bucketSize ** (level + 1);\n\n if (nextLen === 1) break;\n\n prevLevel = levelData;\n srcLen = nextLen;\n level++;\n }\n\n this._builtLen = source.length;\n this._lastRangeStart = source.range?.start ?? NaN;\n }\n\n incrementalBuild(source: Dataset): void {\n const newLen = source.length;\n const rangeStart = source.range?.start ?? NaN;\n\n if (newLen === 0) {\n this.levels = [];\n this.levelLengths.fill(0);\n this.levelSampleWidths.fill(0);\n this._builtLen = 0;\n this._lastRangeStart = NaN;\n return;\n }\n\n if (newLen < this._builtLen || rangeStart !== this._lastRangeStart) {\n this.build(source);\n return;\n }\n\n if (newLen === this._builtLen) return;\n\n this.appendTail(source, newLen - this._builtLen);\n this._builtLen = newLen;\n }\n\n private appendTail(source: Dataset, appendedCount: number): void {\n const newLen = source.length;\n const W = this.bucketSize;\n let changedIdx = newLen - appendedCount;\n\n for (let L = 0; L < MAX_LEVELS; L++) {\n const items: number = L === 0 ? newLen : this.levelLengths[L - 1]!;\n const first = Math.floor(changedIdx / W);\n const last = Math.ceil(items / W) - 1;\n\n if (first > last) break;\n\n this.levelSampleWidths[L] = W ** (L + 1);\n this.ensureLevelData(L, last + 1);\n\n for (let b = first; b <= last; b++) {\n const start = b * W;\n const end = Math.min((b + 1) * W, items);\n\n let minY = Infinity;\n let maxY = -Infinity;\n\n if (L === 0) {\n for (let j = start; j < end; j++) {\n const y = source.getY(j);\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n }\n } else {\n const prev = this.levels[L - 1]!;\n for (let j = start; j < end; j++) {\n const pMin = prev[j * 2]!;\n const pMax = prev[j * 2 + 1]!;\n if (pMin < minY) minY = pMin;\n if (pMax > maxY) maxY = pMax;\n }\n }\n\n const dst = this.levels[L]!;\n dst[b * 2] = minY;\n dst[b * 2 + 1] = maxY;\n }\n\n this.levelLengths[L] = last + 1;\n changedIdx = first;\n\n if (this.levelLengths[L]! <= 1) break;\n }\n }\n\n private ensureLevelData(level: number, minBuckets: number): void {\n const needed = minBuckets * 2;\n const current = this.levels[level];\n if (current && current.length >= needed) return;\n\n const next = new Float32Array(needed);\n if (current) {\n next.set(current.subarray(0, Math.min(current.length, needed)));\n }\n this.levels[level] = next;\n }\n\n query(_viewport: Viewport, pixelWidth: number, xRange: { start: number; length: number }): LODView {\n if (pixelWidth <= 0 || xRange.length <= 0) {\n return { buckets: new Float32Array(0), bucketCount: 0, level: 0, samplesPerPixel: 0 };\n }\n\n const visibleSamples = xRange.length;\n const samplesPerPixel = Math.max(1, visibleSamples / pixelWidth);\n const level = Math.min(\n Math.max(0, Math.ceil(Math.log2(samplesPerPixel)) - 1),\n this.levels.length - 1,\n );\n\n const levelData = this.levels[level];\n const levelLen = this.levelLengths[level];\n const sampleWidth = this.levelSampleWidths[level];\n if (!levelData || levelLen === undefined || sampleWidth === undefined || levelLen === 0 || sampleWidth === 0) {\n return { buckets: new Float32Array(0), bucketCount: 0, level: 0, samplesPerPixel };\n }\n\n const queryStart = Math.max(0, xRange.start);\n const queryEnd = queryStart + xRange.length;\n const bucketStart = Math.max(0, Math.floor(queryStart / sampleWidth));\n const bucketEnd = Math.min(levelLen, Math.ceil(queryEnd / sampleWidth));\n const count = bucketEnd - bucketStart;\n\n if (count <= 0) {\n return { buckets: new Float32Array(0), bucketCount: 0, level, samplesPerPixel };\n }\n\n const result = new Float32Array(count * 2);\n for (let i = 0; i < count; i++) {\n const j = (bucketStart + i) * 2;\n result[i * 2] = levelData[j]!;\n result[i * 2 + 1] = levelData[j + 1]!;\n }\n\n return { buckets: result, bucketCount: count, level, samplesPerPixel };\n }\n}\n","import type { Dataset, AppendableDataset, LODView, Viewport, SeriesConfig, SeriesStyle } from \"./types.js\";\nimport { MinMaxPyramid } from \"./MinMaxPyramid.js\";\n\nexport class SeriesStore {\n readonly config: SeriesConfig;\n readonly style: SeriesStyle;\n private readonly dataset: Dataset;\n private readonly pyramid: MinMaxPyramid | null;\n\n private _dirty: boolean = false;\n private _visible: boolean = true;\n\n constructor(dataset: Dataset, config: SeriesConfig, style: SeriesStyle) {\n this.dataset = dataset;\n this.config = config;\n this.pyramid = config.downsample !== \"none\" ? new MinMaxPyramid() : null;\n this.style = style;\n\n if (this.pyramid && dataset.length > 0) {\n this.pyramid.build(dataset);\n }\n }\n\n get hasLOD(): boolean {\n return this.pyramid !== null;\n }\n\n get dirty(): boolean {\n return this._dirty;\n }\n\n get length(): number {\n return this.dataset.length;\n }\n\n get visible(): boolean {\n return this._visible;\n }\n\n setVisible(visible: boolean): void {\n this._visible = visible;\n }\n\n append(x: ArrayLike<number>, y: ArrayLike<number>): void {\n if (!(\"push\" in this.dataset)) {\n throw new TypeError(\"SeriesStore dataset is not appendable.\");\n }\n\n const appendable = this.dataset as AppendableDataset;\n appendable.append(x, y);\n this._dirty = true;\n }\n\n clear(): void {\n if (!(\"clear\" in this.dataset)) {\n throw new TypeError(\"SeriesStore dataset is not clearable.\");\n }\n\n (this.dataset as AppendableDataset).clear();\n if (this.pyramid) this.pyramid.build(this.dataset);\n this._dirty = false;\n }\n\n rebuildPyramid(): void {\n if (!this._dirty) return;\n if (this.pyramid) this.pyramid.incrementalBuild(this.dataset);\n this._dirty = false;\n }\n\n query(viewport: Viewport, pixelWidth: number): LODView {\n if (!this.pyramid) {\n return { buckets: new Float32Array(0), bucketCount: 0, level: 0, samplesPerPixel: 0 };\n }\n\n const range = this.dataset.range;\n if (!range) {\n return { buckets: new Float32Array(0), bucketCount: 0, level: 0, samplesPerPixel: 0 };\n }\n\n const start = this.dataset.lowerBoundX(viewport.xMin);\n const end = this.dataset.upperBoundX(viewport.xMax);\n\n return this.pyramid.query(viewport, pixelWidth, {\n start,\n length: Math.max(0, end - start),\n });\n }\n\n visibleSampleCount(viewport: Viewport): number {\n const start = this.dataset.lowerBoundX(viewport.xMin);\n const end = this.dataset.upperBoundX(viewport.xMax);\n return Math.max(0, end - start);\n }\n\n copyRawVisible(viewport: Viewport, target: Float32Array, maxPoints: number): number {\n if (maxPoints <= 0 || target.length < maxPoints * 2) return 0;\n\n const start = this.dataset.lowerBoundX(viewport.xMin);\n const end = this.dataset.upperBoundX(viewport.xMax);\n const visible = end - start;\n if (visible <= 0) return 0;\n\n const stride = Math.max(1, Math.ceil(visible / maxPoints));\n let count = 0;\n for (let i = start; i < end && count < maxPoints; i += stride) {\n target[count * 2] = this.dataset.getX(i);\n target[count * 2 + 1] = this.dataset.getY(i);\n count++;\n }\n\n return count;\n }\n\n copyMinMaxVisible(viewport: Viewport, target: Float32Array, maxSegments: number): number {\n if (!this.pyramid || maxSegments <= 0 || target.length < maxSegments * 4) return 0;\n\n const start = this.dataset.lowerBoundX(viewport.xMin);\n const end = this.dataset.upperBoundX(viewport.xMax);\n const visible = end - start;\n if (visible <= 0) return 0;\n\n const segmentCount = Math.min(maxSegments, visible);\n let vertexCount = 0;\n for (let segment = 0; segment < segmentCount; segment++) {\n const segmentStart = start + Math.floor((segment * visible) / segmentCount);\n const segmentEnd = start + Math.max(\n Math.floor(((segment + 1) * visible) / segmentCount),\n Math.floor((segment * visible) / segmentCount) + 1,\n );\n const clampedEnd = Math.min(end, segmentEnd);\n\n let minY = Infinity;\n let maxY = -Infinity;\n for (let i = segmentStart; i < clampedEnd; i++) {\n const y = this.dataset.getY(i);\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n }\n\n const x = this.dataset.getX(segmentStart + ((clampedEnd - segmentStart) >> 1));\n target[vertexCount * 2] = x;\n target[vertexCount * 2 + 1] = minY;\n vertexCount++;\n target[vertexCount * 2] = x;\n target[vertexCount * 2 + 1] = maxY;\n vertexCount++;\n }\n\n return vertexCount;\n }\n}\n","import type { TimeRange } from \"./types.js\";\n\nexport class RingBuffer {\n readonly capacity: number;\n private _length: number = 0;\n private _head: number = 0;\n\n private readonly xData: Float64Array;\n private readonly yData: Float32Array;\n\n constructor(capacity: number) {\n if (!Number.isInteger(capacity) || capacity <= 0) {\n throw new RangeError(\"RingBuffer capacity must be a positive integer.\");\n }\n\n this.capacity = capacity;\n this.xData = new Float64Array(capacity);\n this.yData = new Float32Array(capacity);\n }\n\n get length(): number {\n return this._length;\n }\n\n get range(): TimeRange | null {\n if (this._length === 0) return null;\n return { start: this.getX(0), end: this.getX(this._length - 1) };\n }\n\n push(x: number, y: number): void {\n this.xData[this._head] = x;\n this.yData[this._head] = y;\n this._head = (this._head + 1) % this.capacity;\n if (this._length < this.capacity) this._length++;\n }\n\n append(x: ArrayLike<number>, y: ArrayLike<number>): void {\n const n = Math.min(x.length, y.length);\n for (let i = 0; i < n; i++) {\n this.push(x[i]!, y[i]!);\n }\n }\n\n get(index: number): { x: number; y: number } | null {\n if (index < 0 || index >= this._length) return null;\n return { x: this.getX(index), y: this.getY(index) };\n }\n\n getX(index: number): number {\n this.assertValidIndex(index);\n return this.xData[this.logicalToPhysical(index)]!;\n }\n\n getY(index: number): number {\n this.assertValidIndex(index);\n return this.yData[this.logicalToPhysical(index)]!;\n }\n\n lowerBoundX(x: number): number {\n let lo = 0;\n let hi = this._length;\n while (lo < hi) {\n const mid = lo + ((hi - lo) >> 1);\n if (this.getX(mid) < x) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n }\n\n upperBoundX(x: number): number {\n let lo = 0;\n let hi = this._length;\n while (lo < hi) {\n const mid = lo + ((hi - lo) >> 1);\n if (this.getX(mid) <= x) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n }\n\n clear(): void {\n this._length = 0;\n this._head = 0;\n }\n\n private logicalToPhysical(index: number): number {\n return (this._head - this._length + index + this.capacity) % this.capacity;\n }\n\n private assertValidIndex(index: number): void {\n if (!Number.isInteger(index) || index < 0 || index >= this._length) {\n throw new RangeError(`RingBuffer index out of range: ${index}`);\n }\n }\n}\n","import lineVert from \"./shaders/line.vert?raw\";\nimport lineFrag from \"./shaders/line.frag?raw\";\nimport segmentVert from \"./shaders/segment.vert?raw\";\nimport segmentFrag from \"./shaders/segment.frag?raw\";\n\nexport const ShaderPrograms = {\n line: { vert: lineVert, frag: lineFrag },\n segment: { vert: segmentVert, frag: segmentFrag },\n} as const;\n","import { ShaderPrograms } from \"./ShaderPrograms.js\";\nimport type { Camera2D } from \"../interaction/Camera2D.js\";\nimport type { GpuBackend, GpuBuffer, GpuProgram } from \"./types.js\";\nimport type { SeriesStyle } from \"../core/types.js\";\n\nexport class Renderer {\n private readonly lineProgram: GpuProgram;\n private readonly scaleUniform: Float32Array = new Float32Array(2);\n private readonly offsetUniform: Float32Array = new Float32Array(2);\n\n constructor(private backend: GpuBackend) {\n this.lineProgram = this.backend.createProgram(ShaderPrograms.line.vert, ShaderPrograms.line.frag);\n }\n\n clear(r: number, g: number, b: number, a: number): void {\n this.backend.clear(r, g, b, a);\n }\n\n createFloatBuffer(floatCount: number): GpuBuffer {\n return this.backend.createBuffer({ usage: \"stream\", type: \"float\", length: floatCount });\n }\n\n updateFloatBuffer(buffer: GpuBuffer, data: Float32Array): void {\n this.backend.updateBuffer(buffer, data);\n }\n\n viewport(x: number, y: number, width: number, height: number): void {\n this.backend.viewport(x, y, width, height);\n }\n\n drawLines(positions: GpuBuffer, count: number, style: SeriesStyle, camera: Camera2D): void {\n this.drawLinePrimitive(\"lines\", positions, count, style, camera);\n }\n\n drawLineStrip(positions: GpuBuffer, count: number, style: SeriesStyle, camera: Camera2D): void {\n this.drawLinePrimitive(\"line_strip\", positions, count, style, camera);\n }\n\n private drawLinePrimitive(primitive: \"lines\" | \"line_strip\", positions: GpuBuffer, count: number, style: SeriesStyle, camera: Camera2D): void {\n this.scaleUniform[0] = camera.xScale;\n this.scaleUniform[1] = camera.yScale;\n this.offsetUniform[0] = camera.xOffset;\n this.offsetUniform[1] = camera.yOffset;\n\n this.backend.draw({\n program: this.lineProgram,\n primitive,\n count,\n attributes: { position: positions },\n uniforms: {\n uScale: this.scaleUniform,\n uOffset: this.offsetUniform,\n uColor: style.color,\n },\n });\n }\n\n drawMinMaxSegments(positions: GpuBuffer, count: number, style: SeriesStyle, camera: Camera2D): void {\n this.drawLines(positions, count, style, camera);\n }\n\n dispose(): void {\n this.backend.destroy();\n }\n}\n","import type { Regl, Buffer as ReglBuffer } from \"regl\";\n\ninterface PoolEntry {\n buffer: ReglBuffer;\n floatArray: Float32Array;\n floatCapacity: number;\n inUse: boolean;\n}\n\nconst POOL_SIZES = [1024, 4096, 16384, 32768, 131072];\n\nexport class WebGL2Resources {\n private readonly regl: Regl;\n private readonly pool: PoolEntry[] = [];\n private preAllocated: boolean = false;\n\n constructor(regl: Regl) {\n this.regl = regl;\n }\n\n get reglInstance(): Regl {\n return this.regl;\n }\n\n preAllocate(): void {\n if (this.preAllocated) return;\n this.preAllocated = true;\n\n for (const size of POOL_SIZES) {\n this.pool.push(this.createEntry(size, \"stream\"));\n }\n }\n\n acquire(floatCount: number, usage: \"static\" | \"dynamic\" | \"stream\" = \"stream\"): { buffer: ReglBuffer; array: Float32Array } {\n const needed = floatCount;\n let entry = this.findFree(needed);\n if (!entry) {\n const capacity = this.roundUp(needed);\n entry = this.createEntry(capacity, usage);\n this.pool.push(entry);\n }\n entry.inUse = true;\n return { buffer: entry.buffer, array: entry.floatArray };\n }\n\n release(buffer: ReglBuffer): void {\n for (const entry of this.pool) {\n if (entry.buffer === buffer) {\n entry.inUse = false;\n return;\n }\n }\n }\n\n destroy(): void {\n for (const entry of this.pool) {\n entry.buffer.destroy();\n }\n this.pool.length = 0;\n this.preAllocated = false;\n }\n\n private createEntry(floatCapacity: number, usage: \"static\" | \"dynamic\" | \"stream\"): PoolEntry {\n return {\n buffer: this.regl.buffer({\n length: floatCapacity * 4,\n usage,\n type: \"float\",\n }),\n floatArray: new Float32Array(floatCapacity),\n floatCapacity,\n inUse: false,\n };\n }\n\n private findFree(minCapacity: number): PoolEntry | undefined {\n return this.pool.find(e => !e.inUse && e.floatCapacity >= minCapacity);\n }\n\n private roundUp(n: number): number {\n for (const size of POOL_SIZES) {\n if (size >= n) return size;\n }\n const highest = POOL_SIZES[POOL_SIZES.length - 1]!;\n const nextPower = 1 << (32 - Math.clz32(n - 1));\n return Math.max(highest * 2, nextPower);\n }\n}\n","import createRegl from \"regl\";\nimport type { AttributeState, Buffer as ReglBuffer, DrawCommand, PrimitiveType, Regl, Uniform } from \"regl\";\nimport type { GpuBackend, GpuBuffer, GpuProgram, GpuResource, BufferSpec, DrawSpec, UniformValue } from \"./types.js\";\nimport { WebGL2Resources } from \"./WebGL2Resources.js\";\n\ntype ReglGpuBuffer = GpuBuffer & {\n readonly buffer: ReglBuffer;\n};\n\ntype ReglGpuProgram = GpuProgram & {\n readonly id: number;\n readonly vert: string;\n readonly frag: string;\n};\n\ninterface DrawProps {\n readonly count: number;\n readonly instances: number;\n readonly attributes: Readonly<Record<string, ReglBuffer>>;\n readonly uniforms: Readonly<Record<string, UniformValue>>;\n}\n\nfunction toReglContext(gl: WebGL2RenderingContext): WebGLRenderingContext {\n // regl's public types accept WebGLRenderingContext even though regl can run on WebGL2 contexts.\n return gl as unknown as WebGLRenderingContext;\n}\n\ninterface ScissorProps {\n scissorEnable?: boolean;\n scissorBox?: { x: number; y: number; width: number; height: number };\n}\n\nexport class ReglBackend implements GpuBackend {\n private gl: WebGL2RenderingContext;\n private regl: Regl;\n private resources: WebGL2Resources;\n private nextProgramId: number = 1;\n private commandCache: Map<string, DrawCommand> = new Map();\n private scissorBox: { x: number; y: number; w: number; h: number } | null = null;\n\n constructor(canvas: HTMLCanvasElement) {\n const gl = canvas.getContext(\"webgl2\", {\n alpha: true,\n antialias: false,\n depth: false,\n stencil: false,\n premultipliedAlpha: false,\n preserveDrawingBuffer: false,\n powerPreference: \"high-performance\",\n });\n\n if (!gl) {\n throw new Error(\"BlazePlot requires WebGL2, but this browser/context does not support it.\");\n }\n\n this.gl = gl;\n this.regl = createRegl({\n gl: toReglContext(this.gl),\n extensions: [],\n optionalExtensions: [\n \"ext_disjoint_timer_query_webgl2\",\n ],\n });\n\n this.resources = new WebGL2Resources(this.regl);\n this.resources.preAllocate();\n }\n\n createBuffer(spec: BufferSpec): GpuBuffer {\n const { buffer } = this.resources.acquire(spec.length, spec.usage);\n return {\n length: spec.length,\n type: spec.type,\n buffer,\n } as ReglGpuBuffer;\n }\n\n updateBuffer(buffer: GpuBuffer, data: Float32Array | Uint16Array, offset: number = 0): void {\n if (data.length + offset > buffer.length) {\n throw new RangeError(\"GPU buffer update exceeds allocated buffer length.\");\n }\n\n const bytesPerElement = buffer.type === \"float\" ? 4 : 2;\n this.asReglBuffer(buffer).buffer.subdata(data, offset * bytesPerElement);\n }\n\n createProgram(vert: string, frag: string): GpuProgram {\n return {\n id: this.nextProgramId++,\n vert,\n frag,\n } as ReglGpuProgram;\n }\n\n draw(spec: DrawSpec): void {\n if (spec.count <= 0) return;\n\n const program = this.asReglProgram(spec.program);\n const attributeNames = Object.keys(spec.attributes).sort();\n const uniformNames = Object.keys(spec.uniforms).sort();\n const key = [program.id, spec.primitive, attributeNames.join(\",\"), uniformNames.join(\",\"), spec.instances === undefined ? 0 : 1].join(\"|\");\n let command = this.commandCache.get(key);\n\n if (!command) {\n command = this.createDrawCommand(program, spec.primitive, attributeNames, uniformNames, spec.instances !== undefined);\n this.commandCache.set(key, command);\n }\n\n const attributes: Record<string, ReglBuffer> = {};\n for (const name of attributeNames) {\n attributes[name] = this.asReglBuffer(spec.attributes[name]!).buffer;\n }\n\n const props: DrawProps & ScissorProps = {\n count: spec.count,\n instances: spec.instances ?? 0,\n attributes,\n uniforms: spec.uniforms,\n };\n\n if (this.scissorBox) {\n props.scissorEnable = true;\n props.scissorBox = {\n x: this.scissorBox.x,\n y: this.scissorBox.y,\n width: this.scissorBox.w,\n height: this.scissorBox.h,\n };\n }\n\n command(props);\n }\n\n dispose(resource: GpuResource): void {\n if (this.isReglBuffer(resource)) {\n this.resources.release(resource.buffer);\n }\n }\n\n clear(r: number, g: number, b: number, a: number): void {\n this.regl.clear({ color: [r, g, b, a] });\n }\n\n viewport(x: number, y: number, w: number, h: number): void {\n this.scissorBox = { x, y, w, h };\n }\n\n destroy(): void {\n this.resources.destroy();\n this.regl.destroy();\n }\n\n private createDrawCommand(\n program: ReglGpuProgram,\n primitive: DrawSpec[\"primitive\"],\n attributeNames: readonly string[],\n uniformNames: readonly string[],\n instanced: boolean,\n ): DrawCommand {\n const attributes: Record<string, (context: object, props: DrawProps) => AttributeState> = {};\n for (const name of attributeNames) {\n attributes[name] = (_context, props) => props.attributes[name]!;\n }\n\n const uniforms: Record<string, (context: object, props: DrawProps) => Uniform> = {};\n for (const name of uniformNames) {\n uniforms[name] = (_context, props) => props.uniforms[name] as Uniform;\n }\n\n return this.regl({\n vert: program.vert,\n frag: program.frag,\n attributes,\n uniforms,\n primitive: this.toReglPrimitive(primitive),\n count: (_context: object, props: DrawProps) => props.count,\n instances: instanced ? (_context: object, props: DrawProps) => props.instances : undefined,\n depth: { enable: false },\n scissor: {\n enable: (_context: object, props: DrawProps & ScissorProps) => props.scissorEnable ?? false,\n box: (_context: object, props: DrawProps & ScissorProps) =>\n props.scissorBox ?? { x: 0, y: 0, width: 0, height: 0 },\n },\n });\n }\n\n private asReglBuffer(buffer: GpuBuffer): ReglGpuBuffer {\n return buffer as ReglGpuBuffer;\n }\n\n private asReglProgram(program: GpuProgram): ReglGpuProgram {\n return program as ReglGpuProgram;\n }\n\n private isReglBuffer(resource: GpuResource): resource is ReglGpuBuffer {\n return \"length\" in resource && \"type\" in resource && \"buffer\" in resource;\n }\n\n private toReglPrimitive(primitive: DrawSpec[\"primitive\"]): PrimitiveType {\n switch (primitive) {\n case \"line_strip\":\n return \"line strip\";\n case \"triangle_strip\":\n return \"triangle strip\";\n default:\n return primitive;\n }\n }\n}\n","import type { Camera2D } from \"./Camera2D.js\";\nimport type { PanIntent, ViewportPolicy, ZoomIntent } from \"./types.js\";\n\nexport class InputController {\n private _enabled: boolean = true;\n private activePointerId: number | null = null;\n private lastX: number = 0;\n private lastY: number = 0;\n\n constructor(\n private readonly canvas: HTMLCanvasElement,\n private readonly camera: Camera2D,\n private readonly policy?: ViewportPolicy,\n ) {\n this.bindEvents();\n }\n\n get enabled(): boolean {\n return this._enabled;\n }\n\n set enabled(value: boolean) {\n this._enabled = value;\n }\n\n private bindEvents(): void {\n this.canvas.addEventListener(\"pointerdown\", this.onPointerDown);\n this.canvas.addEventListener(\"pointermove\", this.onPointerMove);\n this.canvas.addEventListener(\"pointerup\", this.onPointerUp);\n this.canvas.addEventListener(\"pointercancel\", this.onPointerUp);\n this.canvas.addEventListener(\"wheel\", this.onWheel, { passive: false });\n }\n\n private onPointerDown = (e: PointerEvent): void => {\n if (!this._enabled || this.activePointerId !== null) return;\n this.activePointerId = e.pointerId;\n this.lastX = e.clientX;\n this.lastY = e.clientY;\n this.canvas.setPointerCapture(e.pointerId);\n };\n\n private onPointerMove = (e: PointerEvent): void => {\n if (!this._enabled || e.pointerId !== this.activePointerId) return;\n const rect = this.canvas.getBoundingClientRect();\n const dx = rect.width > 0 ? (this.lastX - e.clientX) / rect.width : 0;\n const dy = rect.height > 0 ? (e.clientY - this.lastY) / rect.height : 0;\n const intent = this.applyPanPolicy({ dx, dy });\n if (intent) this.camera.pan(intent);\n this.lastX = e.clientX;\n this.lastY = e.clientY;\n };\n\n private onPointerUp = (e: PointerEvent): void => {\n if (e.pointerId !== this.activePointerId) return;\n this.activePointerId = null;\n if (this.canvas.hasPointerCapture(e.pointerId)) {\n this.canvas.releasePointerCapture(e.pointerId);\n }\n };\n\n private onWheel = (e: WheelEvent): void => {\n if (!this._enabled) return;\n e.preventDefault();\n const factor = e.deltaY < 0 ? 1.1 : 0.9;\n const rect = this.canvas.getBoundingClientRect();\n const cx = rect.width > 0 ? (e.clientX - rect.left) / rect.width : 0.5;\n const cy = rect.height > 0 ? 1 - (e.clientY - rect.top) / rect.height : 0.5;\n const intent = this.applyZoomPolicy({ factor, cx, cy, axis: \"xy\" });\n if (intent) this.camera.zoom(intent);\n };\n\n private applyPanPolicy(intent: PanIntent): PanIntent | null {\n if (!this.policy?.beforePan) return intent;\n return this.policy.beforePan(this.camera, intent);\n }\n\n private applyZoomPolicy(intent: ZoomIntent): ZoomIntent | null {\n if (!this.policy?.beforeZoom) return intent;\n return this.policy.beforeZoom(this.camera, intent);\n }\n\n dispose(): void {\n this.canvas.removeEventListener(\"pointerdown\", this.onPointerDown);\n this.canvas.removeEventListener(\"pointermove\", this.onPointerMove);\n this.canvas.removeEventListener(\"pointerup\", this.onPointerUp);\n this.canvas.removeEventListener(\"pointercancel\", this.onPointerUp);\n this.canvas.removeEventListener(\"wheel\", this.onWheel);\n }\n}\n","import type { Viewport } from \"../core/types.js\";\nimport type { PanIntent, ZoomIntent } from \"./types.js\";\n\nexport class Camera2D {\n private _xMin: number = 0;\n private _xMax: number = 1;\n private _yMin: number = 0;\n private _yMax: number = 1;\n\n get xMin(): number {\n return this._xMin;\n }\n\n get xMax(): number {\n return this._xMax;\n }\n\n get yMin(): number {\n return this._yMin;\n }\n\n get yMax(): number {\n return this._yMax;\n }\n\n get viewport(): Viewport {\n return { xMin: this._xMin, xMax: this._xMax, yMin: this._yMin, yMax: this._yMax };\n }\n\n get xScale(): number {\n return 2 / (this._xMax - this._xMin);\n }\n\n get xOffset(): number {\n return -(this._xMin + this._xMax) / (this._xMax - this._xMin);\n }\n\n get yScale(): number {\n return 2 / (this._yMax - this._yMin);\n }\n\n get yOffset(): number {\n return -(this._yMin + this._yMax) / (this._yMax - this._yMin);\n }\n\n setViewport(v: { xMin?: number; xMax?: number; yMin?: number; yMax?: number }): void {\n const next = {\n xMin: v.xMin ?? this._xMin,\n xMax: v.xMax ?? this._xMax,\n yMin: v.yMin ?? this._yMin,\n yMax: v.yMax ?? this._yMax,\n };\n Camera2D.assertValidViewport(next);\n this._xMin = next.xMin;\n this._xMax = next.xMax;\n this._yMin = next.yMin;\n this._yMax = next.yMax;\n }\n\n pan(intent: PanIntent): void {\n const { dx, dy } = intent;\n Camera2D.assertFinite(\"dx\", dx);\n Camera2D.assertFinite(\"dy\", dy);\n const rangeX = this._xMax - this._xMin;\n const rangeY = this._yMax - this._yMin;\n this.setViewport({\n xMin: this._xMin + dx * rangeX,\n xMax: this._xMax + dx * rangeX,\n yMin: this._yMin + dy * rangeY,\n yMax: this._yMax + dy * rangeY,\n });\n }\n\n zoom(intent: ZoomIntent): void {\n const { factor, cx, cy, axis } = intent;\n Camera2D.assertFinite(\"factor\", factor);\n Camera2D.assertFinite(\"cx\", cx);\n Camera2D.assertFinite(\"cy\", cy);\n if (factor <= 0) throw new RangeError(\"Camera2D zoom factor must be > 0.\");\n\n const rangeX = this._xMax - this._xMin;\n const rangeY = this._yMax - this._yMin;\n const dataCx = this._xMin + rangeX * cx;\n const dataCy = this._yMin + rangeY * cy;\n const newRangeX = axis === \"y\" ? rangeX : rangeX / factor;\n const newRangeY = axis === \"x\" ? rangeY : rangeY / factor;\n this.setViewport({\n xMin: dataCx - newRangeX * cx,\n xMax: dataCx + newRangeX * (1 - cx),\n yMin: dataCy - newRangeY * cy,\n yMax: dataCy + newRangeY * (1 - cy),\n });\n }\n\n toClip(x: number, y: number): [number, number] {\n return [\n x * this.xScale + this.xOffset,\n y * this.yScale + this.yOffset,\n ];\n }\n\n toScreen(clipX: number, clipY: number, canvasWidth: number, canvasHeight: number): [number, number] {\n return [\n (clipX + 1) * 0.5 * canvasWidth,\n (1 - clipY) * 0.5 * canvasHeight,\n ];\n }\n\n clone(): Camera2D {\n const c = new Camera2D();\n c.setViewport(this.viewport);\n return c;\n }\n\n private static assertValidViewport(v: Viewport): void {\n Camera2D.assertFinite(\"xMin\", v.xMin);\n Camera2D.assertFinite(\"xMax\", v.xMax);\n Camera2D.assertFinite(\"yMin\", v.yMin);\n Camera2D.assertFinite(\"yMax\", v.yMax);\n if (v.xMax <= v.xMin) throw new RangeError(\"Camera2D requires xMax > xMin.\");\n if (v.yMax <= v.yMin) throw new RangeError(\"Camera2D requires yMax > yMin.\");\n }\n\n private static assertFinite(name: string, value: number): void {\n if (!Number.isFinite(value)) throw new RangeError(`Camera2D ${name} must be finite.`);\n }\n}\n","import type { Camera2D } from \"./Camera2D.js\";\n\nexport class AxisController {\n constructor(private readonly camera: Camera2D) {}\n\n getXTickValues(canvasWidth: number, maxTicks: number = 10, target: number[] = []): number[] {\n return this.getTickValues(this.camera.xMin, this.camera.xMax, canvasWidth, maxTicks, 80, target);\n }\n\n getYTickValues(canvasHeight: number, maxTicks: number = 10, target: number[] = []): number[] {\n return this.getTickValues(this.camera.yMin, this.camera.yMax, canvasHeight, maxTicks, 48, target);\n }\n\n formatValue(value: number): string {\n if (Math.abs(value) < 1e-12) return \"0\";\n const abs = Math.abs(value);\n if (abs >= 1e6 || abs < 1e-3) return value.toExponential(2);\n if (abs >= 100) return value.toFixed(0);\n if (abs >= 10) return value.toFixed(1);\n return value.toFixed(2);\n }\n\n private getTickValues(min: number, max: number, pixelSize: number, maxTicks: number, minPixelSpacing: number, target: number[]): number[] {\n target.length = 0;\n if (pixelSize <= 0 || maxTicks <= 0) return target;\n\n const range = max - min;\n if (!Number.isFinite(range) || range <= 0) return target;\n\n const targetTicks = Math.max(2, Math.min(maxTicks, Math.floor(pixelSize / minPixelSpacing)));\n const step = this.niceStep(range / (targetTicks - 1));\n const firstIndex = Math.floor(min / step);\n const lastIndex = Math.ceil(max / step);\n\n for (let index = firstIndex; index <= lastIndex && target.length < maxTicks + 2; index++) {\n target.push(this.normalizeTick(index * step, step));\n }\n\n return target;\n }\n\n private niceStep(rawStep: number): number {\n const magnitude = 10 ** Math.floor(Math.log10(rawStep));\n const normalized = rawStep / magnitude;\n\n if (normalized <= 1.5) return magnitude;\n if (normalized <= 3) return 2 * magnitude;\n if (normalized <= 7) return 5 * magnitude;\n return 10 * magnitude;\n }\n\n private normalizeTick(value: number, step: number): number {\n const decimals = Math.max(0, -Math.floor(Math.log10(step)) + 2);\n const normalized = Number(value.toFixed(decimals));\n return Object.is(normalized, -0) ? 0 : normalized;\n }\n}\n","import type { Camera2D } from \"../interaction/Camera2D.js\";\nimport type { AxisController } from \"../interaction/AxisController.js\";\n\nexport interface AxisOverlayOptions {\n readonly font?: string;\n readonly color?: string;\n}\n\nexport interface AxisOverlayAxisConfig {\n readonly visible: boolean;\n readonly position: \"inside\" | \"outside\";\n}\n\nexport interface AxisOverlayConfig {\n readonly x: AxisOverlayAxisConfig;\n readonly y: AxisOverlayAxisConfig;\n}\n\nexport class AxisOverlay {\n private container: HTMLDivElement;\n private xPool: HTMLDivElement[] = [];\n private yPool: HTMLDivElement[] = [];\n private readonly xTicks: number[] = [];\n private readonly yTicks: number[] = [];\n\n constructor(\n private readonly canvas: HTMLCanvasElement,\n private readonly config: AxisOverlayConfig,\n private readonly options: AxisOverlayOptions = {},\n ) {\n this.container = document.createElement(\"div\");\n this.container.style.position = \"absolute\";\n this.container.style.pointerEvents = \"none\";\n this.container.style.overflow = \"hidden\";\n\n const parent = canvas.parentElement;\n if (parent && getComputedStyle(parent).position === \"static\") {\n parent.style.position = \"relative\";\n }\n\n this.syncPosition();\n parent?.appendChild(this.container);\n }\n\n update(camera: Camera2D, axis: AxisController, leftMargin: number, bottomMargin: number): void {\n this.syncPosition();\n\n const cssW = this.canvas.clientWidth;\n const cssH = this.canvas.clientHeight;\n const plotW = Math.max(1, cssW - leftMargin);\n const plotH = Math.max(1, cssH - bottomMargin);\n\n if (this.config.x.visible) {\n axis.getXTickValues(plotW, 12, this.xTicks);\n } else {\n this.xTicks.length = 0;\n }\n\n if (this.config.y.visible) {\n axis.getYTickValues(plotH, 8, this.yTicks);\n } else {\n this.yTicks.length = 0;\n }\n\n this.updateAxis(this.xPool, this.xTicks, \"x\", camera, cssW, cssH, axis, leftMargin, bottomMargin);\n this.updateAxis(this.yPool, this.yTicks, \"y\", camera, cssW, cssH, axis, leftMargin, bottomMargin);\n }\n\n dispose(): void {\n this.container.remove();\n }\n\n private syncPosition(): void {\n const parent = this.canvas.parentElement;\n if (!parent) return;\n const canvasRect = this.canvas.getBoundingClientRect();\n const parentRect = parent.getBoundingClientRect();\n this.container.style.top = `${Math.round(canvasRect.top - parentRect.top)}px`;\n this.container.style.left = `${Math.round(canvasRect.left - parentRect.left)}px`;\n this.container.style.width = `${this.canvas.clientWidth}px`;\n this.container.style.height = `${this.canvas.clientHeight}px`;\n }\n\n private toCssScreen(\n clipX: number,\n clipY: number,\n cssW: number,\n cssH: number,\n leftMargin: number,\n bottomMargin: number,\n ): [number, number] {\n const plotW = Math.max(1, cssW - leftMargin);\n const plotH = Math.max(1, cssH - bottomMargin);\n return [\n (clipX + 1) * 0.5 * plotW + leftMargin,\n (1 - clipY) * 0.5 * plotH,\n ];\n }\n\n private updateAxis(\n pool: HTMLDivElement[],\n values: number[],\n axis: \"x\" | \"y\",\n camera: Camera2D,\n cssW: number,\n cssH: number,\n controller: AxisController,\n leftMargin: number,\n bottomMargin: number,\n ): void {\n while (pool.length < values.length) {\n const el = document.createElement(\"div\");\n el.style.position = \"absolute\";\n el.style.pointerEvents = \"none\";\n el.style.whiteSpace = \"nowrap\";\n el.style.font = this.options.font ?? \"11px ui-monospace, monospace, sans-serif\";\n el.style.color = this.options.color ?? \"#bfd6ff\";\n el.style.userSelect = \"none\";\n this.container.appendChild(el);\n pool.push(el);\n }\n\n for (let i = values.length; i < pool.length; i++) {\n pool[i]!.style.display = \"none\";\n }\n\n for (let i = 0; i < values.length; i++) {\n const el = pool[i]!;\n const value = values[i]!;\n const text = controller.formatValue(value);\n if (el.textContent !== text) {\n el.textContent = text;\n }\n el.style.display = \"block\";\n\n const [clipX, clipY] =\n axis === \"x\"\n ? camera.toClip(value, camera.yMin)\n : camera.toClip(camera.xMin, value);\n const [screenX, screenY] = this.toCssScreen(clipX, clipY, cssW, cssH, leftMargin, bottomMargin);\n\n if (axis === \"x\") {\n el.style.left = `${screenX}px`;\n el.style.transform = \"translateX(-50%)\";\n if (this.config.x.position === \"outside\") {\n el.style.top = `${screenY + 4}px`;\n el.style.bottom = \"auto\";\n } else {\n el.style.top = \"auto\";\n el.style.bottom = `${cssH - screenY + 4}px`;\n }\n } else {\n el.style.top = `${screenY}px`;\n el.style.transform = \"translateY(-50%)\";\n if (this.config.y.position === \"outside\") {\n el.style.left = \"auto\";\n el.style.right = `${cssW - screenX + 4}px`;\n } else {\n el.style.left = `${screenX + 4}px`;\n el.style.right = \"auto\";\n }\n }\n }\n }\n}\n","import type { SeriesConfig, SeriesStyle, Dataset } from \"../core/types.js\";\nimport { SeriesStore } from \"../core/SeriesStore.js\";\nimport { RingBuffer } from \"../core/RingBuffer.js\";\nimport { Renderer } from \"../render/Renderer.js\";\nimport { ReglBackend } from \"../render/ReglBackend.js\";\nimport type { GpuBuffer } from \"../render/types.js\";\nimport { InputController } from \"../interaction/InputController.js\";\nimport { Camera2D } from \"../interaction/Camera2D.js\";\nimport { AxisController } from \"../interaction/AxisController.js\";\nimport type { ViewportPolicy } from \"../interaction/types.js\";\nimport { AxisOverlay } from \"./AxisOverlay.js\";\n\nconst RAW_LINE_VERTEX_CAPACITY = 16_384;\nconst GRID_LINE_VERTEX_CAPACITY = 64;\nconst LEFT_MARGIN_CSS = 52;\nconst BOTTOM_MARGIN_CSS = 28;\n\nexport interface AxisConfig {\n readonly visible?: boolean;\n readonly position?: \"inside\" | \"outside\";\n}\n\nexport interface ChartOptions {\n readonly viewportPolicy?: ViewportPolicy;\n readonly grid?: boolean;\n readonly gridStyle?: Partial<SeriesStyle>;\n readonly axes?: boolean | { x?: boolean | AxisConfig; y?: boolean | AxisConfig };\n}\n\nexport interface ChartFrameStats {\n fps: number;\n frameMs: number;\n pointsRendered: number;\n drawCalls: number;\n uploadBytes: number;\n renderMode: \"none\" | \"raw\" | \"minmax\" | \"mixed\";\n}\n\ntype NormalizedAxisConfig = { visible: boolean; position: \"inside\" | \"outside\" };\n\nfunction normalizeAxisConfig(config: boolean | AxisConfig | undefined): NormalizedAxisConfig {\n if (config === false) return { visible: false, position: \"inside\" };\n if (config === true || config === undefined) return { visible: true, position: \"inside\" };\n return {\n visible: config.visible !== false,\n position: config.position ?? \"inside\",\n };\n}\n\nexport class Chart {\n private series: SeriesStore[] = [];\n private camera: Camera2D;\n private axis: AxisController;\n private renderer: Renderer;\n private input: InputController;\n private rawLineBuffer: GpuBuffer;\n private rawLineData: Float32Array;\n private gridBuffer: GpuBuffer;\n private gridData: Float32Array;\n private gridStyle: SeriesStyle;\n private readonly xTicks: number[] = [];\n private readonly yTicks: number[] = [];\n private axisOverlay: AxisOverlay | null = null;\n private normalizedAxes: { x: NormalizedAxisConfig; y: NormalizedAxisConfig };\n private stats: ChartFrameStats = {\n fps: 0,\n frameMs: 0,\n pointsRendered: 0,\n drawCalls: 0,\n uploadBytes: 0,\n renderMode: \"none\",\n };\n private resizeObserver: ResizeObserver | null = null;\n private lastFrameAt: number = 0;\n private _rafId: number = 0;\n\n constructor(private readonly canvas: HTMLCanvasElement, private readonly options: ChartOptions = {}) {\n this.applyCanvasSize();\n this.camera = new Camera2D();\n this.axis = new AxisController(this.camera);\n this.renderer = new Renderer(new ReglBackend(canvas));\n this.input = new InputController(canvas, this.camera, options.viewportPolicy);\n this.rawLineData = new Float32Array(RAW_LINE_VERTEX_CAPACITY * 2);\n this.rawLineBuffer = this.renderer.createFloatBuffer(this.rawLineData.length);\n this.gridData = new Float32Array(GRID_LINE_VERTEX_CAPACITY * 2);\n this.gridBuffer = this.renderer.createFloatBuffer(this.gridData.length);\n this.gridStyle = {\n color: options.gridStyle?.color ?? [0.22, 0.30, 0.44, 0.45],\n lineWidth: options.gridStyle?.lineWidth ?? 1,\n };\n\n const axesOpt = options.axes;\n if (axesOpt === false) {\n this.normalizedAxes = { x: { visible: false, position: \"inside\" }, y: { visible: false, position: \"inside\" } };\n } else if (axesOpt === true || axesOpt === undefined) {\n this.normalizedAxes = { x: { visible: true, position: \"inside\" }, y: { visible: true, position: \"inside\" } };\n } else {\n this.normalizedAxes = {\n x: normalizeAxisConfig(axesOpt.x),\n y: normalizeAxisConfig(axesOpt.y),\n };\n }\n\n if (this.normalizedAxes.x.visible || this.normalizedAxes.y.visible) {\n this.axisOverlay = new AxisOverlay(canvas, this.normalizedAxes);\n }\n\n if (typeof ResizeObserver !== \"undefined\") {\n this.resizeObserver = new ResizeObserver(() => this.resize());\n this.resizeObserver.observe(this.canvas);\n }\n }\n\n addSeries(config: SeriesConfig, style?: Partial<SeriesStyle>): SeriesStore {\n const dataset: Dataset = config.dataset ?? new RingBuffer(config.capacity);\n const s = new SeriesStore(dataset, config, {\n color: style?.color ?? [0.3, 0.6, 1.0, 1.0],\n lineWidth: style?.lineWidth ?? 1,\n });\n this.series.push(s);\n return s;\n }\n\n removeSeries(series: SeriesStore): boolean {\n const index = this.series.indexOf(series);\n if (index === -1) return false;\n\n this.series.splice(index, 1);\n return true;\n }\n\n setViewport(v: { xMin?: number; xMax?: number; yMin?: number; yMax?: number }): void {\n this.camera.setViewport(v);\n }\n\n resize(dpr: number = globalThis.devicePixelRatio): boolean {\n return this.applyCanvasSize(dpr);\n }\n\n getFrameStats(target: ChartFrameStats = { fps: 0, frameMs: 0, pointsRendered: 0, drawCalls: 0, uploadBytes: 0, renderMode: \"none\" }): ChartFrameStats {\n target.fps = this.stats.fps;\n target.frameMs = this.stats.frameMs;\n target.pointsRendered = this.stats.pointsRendered;\n target.drawCalls = this.stats.drawCalls;\n target.uploadBytes = this.stats.uploadBytes;\n target.renderMode = this.stats.renderMode;\n return target;\n }\n\n start(): void {\n const frame = (): void => {\n this._rafId = requestAnimationFrame(frame);\n this.render();\n };\n this._rafId = requestAnimationFrame(frame);\n }\n\n stop(): void {\n cancelAnimationFrame(this._rafId);\n }\n\n private getMargins(): { left: number; bottom: number } {\n return {\n left: this.normalizedAxes.y.visible && this.normalizedAxes.y.position === \"outside\" ? LEFT_MARGIN_CSS : 0,\n bottom: this.normalizedAxes.x.visible && this.normalizedAxes.x.position === \"outside\" ? BOTTOM_MARGIN_CSS : 0,\n };\n }\n\n private render(): void {\n const frameStartedAt = performance.now();\n if (this.lastFrameAt > 0) {\n this.stats.fps = 1000 / (frameStartedAt - this.lastFrameAt);\n }\n this.lastFrameAt = frameStartedAt;\n this.stats.pointsRendered = 0;\n this.stats.drawCalls = 0;\n this.stats.uploadBytes = 0;\n this.stats.renderMode = \"none\";\n\n const margins = this.getMargins();\n const dpr = this.canvas.width / Math.max(1, this.canvas.clientWidth);\n const physLeft = Math.floor(margins.left * dpr);\n const physBottom = Math.floor(margins.bottom * dpr);\n\n this.options.viewportPolicy?.beforeRender?.(this.camera);\n\n // Clear full canvas\n this.renderer.viewport(0, 0, this.canvas.width, this.canvas.height);\n this.renderer.clear(0.08, 0.10, 0.16, 1);\n\n // Draw content in inset viewport\n this.renderer.viewport(physLeft, physBottom, this.canvas.width - physLeft, this.canvas.height - physBottom);\n\n const viewport = this.camera.viewport;\n if (this.options.grid !== false) {\n const gridVertexCount = this.writeGridVertices(viewport, margins);\n if (gridVertexCount > 0) {\n this.renderer.updateFloatBuffer(this.gridBuffer, this.gridData);\n this.renderer.drawLines(this.gridBuffer, gridVertexCount, this.gridStyle, this.camera);\n this.stats.drawCalls++;\n this.stats.uploadBytes += this.gridData.byteLength;\n }\n }\n\n for (const s of this.series) {\n if (!s.visible) continue;\n const visibleSamples = s.visibleSampleCount(viewport);\n const dense = s.hasLOD && visibleSamples > RAW_LINE_VERTEX_CAPACITY;\n const count = dense\n ? s.copyMinMaxVisible(viewport, this.rawLineData, Math.min(this.canvas.width, RAW_LINE_VERTEX_CAPACITY >> 1))\n : s.copyRawVisible(viewport, this.rawLineData, RAW_LINE_VERTEX_CAPACITY);\n if (count < 2) continue;\n this.renderer.updateFloatBuffer(this.rawLineBuffer, this.rawLineData);\n if (dense) {\n this.renderer.drawMinMaxSegments(this.rawLineBuffer, count, s.style, this.camera);\n this.recordRenderMode(\"minmax\");\n } else {\n this.renderer.drawLineStrip(this.rawLineBuffer, count, s.style, this.camera);\n this.recordRenderMode(\"raw\");\n }\n this.stats.pointsRendered += count;\n this.stats.drawCalls++;\n this.stats.uploadBytes += this.rawLineData.byteLength;\n }\n\n this.axisOverlay?.update(this.camera, this.axis, margins.left, margins.bottom);\n\n this.stats.frameMs = performance.now() - frameStartedAt;\n }\n\n dispose(): void {\n this.stop();\n this.resizeObserver?.disconnect();\n this.input.dispose();\n this.axisOverlay?.dispose();\n this.renderer.dispose();\n }\n\n private applyCanvasSize(dpr: number = globalThis.devicePixelRatio): boolean {\n const scale = Number.isFinite(dpr) ? Math.max(1, dpr) : 1;\n const width = Math.max(1, Math.floor(this.canvas.clientWidth * scale));\n const height = Math.max(1, Math.floor(this.canvas.clientHeight * scale));\n if (this.canvas.width === width && this.canvas.height === height) return false;\n\n this.canvas.width = width;\n this.canvas.height = height;\n return true;\n }\n\n private writeGridVertices(\n viewport: { xMin: number; xMax: number; yMin: number; yMax: number },\n margins: { left: number; bottom: number },\n ): number {\n const plotW = Math.max(1, this.canvas.clientWidth - margins.left);\n const plotH = Math.max(1, this.canvas.clientHeight - margins.bottom);\n this.axis.getXTickValues(plotW, 12, this.xTicks);\n this.axis.getYTickValues(plotH, 8, this.yTicks);\n\n let vertexCount = 0;\n for (const x of this.xTicks) {\n if (vertexCount + 2 > GRID_LINE_VERTEX_CAPACITY) return vertexCount;\n this.gridData[vertexCount * 2] = x;\n this.gridData[vertexCount * 2 + 1] = viewport.yMin;\n vertexCount++;\n this.gridData[vertexCount * 2] = x;\n this.gridData[vertexCount * 2 + 1] = viewport.yMax;\n vertexCount++;\n }\n\n for (const y of this.yTicks) {\n if (vertexCount + 2 > GRID_LINE_VERTEX_CAPACITY) return vertexCount;\n this.gridData[vertexCount * 2] = viewport.xMin;\n this.gridData[vertexCount * 2 + 1] = y;\n vertexCount++;\n this.gridData[vertexCount * 2] = viewport.xMax;\n this.gridData[vertexCount * 2 + 1] = y;\n vertexCount++;\n }\n\n return vertexCount;\n }\n\n private recordRenderMode(mode: \"raw\" | \"minmax\"): void {\n if (this.stats.renderMode === \"none\") {\n this.stats.renderMode = mode;\n } else if (this.stats.renderMode !== mode) {\n this.stats.renderMode = \"mixed\";\n }\n }\n}\n","import type { Dataset, TimeRange } from \"./types.js\";\n\nexport class StaticDataset implements Dataset {\n constructor(\n private readonly xData: ArrayLike<number>,\n private readonly yData: ArrayLike<number>,\n ) {}\n\n get length(): number {\n return Math.min(this.xData.length, this.yData.length);\n }\n\n get range(): TimeRange | null {\n if (this.length === 0) return null;\n return { start: this.xData[0]!, end: this.xData[this.length - 1]! };\n }\n\n getX(index: number): number {\n this.assertValidIndex(index);\n return this.xData[index]!;\n }\n\n getY(index: number): number {\n this.assertValidIndex(index);\n return this.yData[index]!;\n }\n\n lowerBoundX(x: number): number {\n let lo = 0;\n let hi = this.length;\n while (lo < hi) {\n const mid = lo + ((hi - lo) >> 1);\n if (this.xData[mid]! < x) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n }\n\n upperBoundX(x: number): number {\n let lo = 0;\n let hi = this.length;\n while (lo < hi) {\n const mid = lo + ((hi - lo) >> 1);\n if (this.xData[mid]! <= x) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n }\n\n private assertValidIndex(index: number): void {\n if (!Number.isInteger(index) || index < 0 || index >= this.length) {\n throw new RangeError(`StaticDataset index out of range: ${index}`);\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/core/MinMaxPyramid.ts","../src/core/SeriesStore.ts","../src/core/RingBuffer.ts","../src/render/ShaderPrograms.ts","../src/render/Renderer.ts","../src/render/WebGL2Resources.ts","../src/render/ReglBackend.ts","../src/interaction/InputController.ts","../src/interaction/Camera2D.ts","../src/interaction/AxisController.ts","../src/ui/AxisOverlay.ts","../src/ui/ChartLayout.ts","../src/ui/Chart.ts","../src/core/StaticDataset.ts"],"sourcesContent":["import type { Dataset, LODView, Viewport } from \"./types.js\";\n\nconst MAX_LEVELS = 16;\n\nexport class MinMaxPyramid {\n private levels: Float32Array[] = [];\n private levelLengths: Uint32Array;\n private levelSampleWidths: Uint32Array;\n private _builtLen: number = 0;\n private _lastRangeStart: number = NaN;\n\n constructor(readonly bucketSize: number = 2) {\n if (!Number.isInteger(bucketSize) || bucketSize < 2) {\n throw new RangeError(\"MinMaxPyramid bucketSize must be an integer >= 2.\");\n }\n\n this.levelLengths = new Uint32Array(MAX_LEVELS);\n this.levelSampleWidths = new Uint32Array(MAX_LEVELS);\n }\n\n build(source: Dataset): void {\n this.levels = [];\n this.levelLengths.fill(0);\n this.levelSampleWidths.fill(0);\n\n let srcLen = source.length;\n if (srcLen === 0) {\n this._builtLen = 0;\n this._lastRangeStart = NaN;\n return;\n }\n\n let prevLevel: Float32Array | null = null;\n let level = 0;\n\n while (srcLen > 0 && level < MAX_LEVELS) {\n const nextLen = Math.ceil(srcLen / this.bucketSize);\n const levelData = new Float32Array(nextLen * 2);\n\n for (let i = 0; i < srcLen; i += this.bucketSize) {\n let minY = Infinity;\n let maxY = -Infinity;\n const end = Math.min(i + this.bucketSize, srcLen);\n for (let j = i; j < end; j++) {\n if (prevLevel) {\n const prevMin = prevLevel[j * 2]!;\n const prevMax = prevLevel[j * 2 + 1]!;\n if (prevMin < minY) minY = prevMin;\n if (prevMax > maxY) maxY = prevMax;\n } else {\n const y = source.getY(j);\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n }\n }\n const outIdx = Math.floor(i / this.bucketSize);\n levelData[outIdx * 2] = minY;\n levelData[outIdx * 2 + 1] = maxY;\n }\n\n this.levels[level] = levelData;\n this.levelLengths[level] = nextLen;\n this.levelSampleWidths[level] = this.bucketSize ** (level + 1);\n\n if (nextLen === 1) break;\n\n prevLevel = levelData;\n srcLen = nextLen;\n level++;\n }\n\n this._builtLen = source.length;\n this._lastRangeStart = source.range?.start ?? NaN;\n }\n\n incrementalBuild(source: Dataset): void {\n const newLen = source.length;\n const rangeStart = source.range?.start ?? NaN;\n\n if (newLen === 0) {\n this.levels = [];\n this.levelLengths.fill(0);\n this.levelSampleWidths.fill(0);\n this._builtLen = 0;\n this._lastRangeStart = NaN;\n return;\n }\n\n if (newLen < this._builtLen || rangeStart !== this._lastRangeStart) {\n this.build(source);\n return;\n }\n\n if (newLen === this._builtLen) return;\n\n this.appendTail(source, newLen - this._builtLen);\n this._builtLen = newLen;\n }\n\n private appendTail(source: Dataset, appendedCount: number): void {\n const newLen = source.length;\n const W = this.bucketSize;\n let changedIdx = newLen - appendedCount;\n\n for (let L = 0; L < MAX_LEVELS; L++) {\n const items: number = L === 0 ? newLen : this.levelLengths[L - 1]!;\n const first = Math.floor(changedIdx / W);\n const last = Math.ceil(items / W) - 1;\n\n if (first > last) break;\n\n this.levelSampleWidths[L] = W ** (L + 1);\n this.ensureLevelData(L, last + 1);\n\n for (let b = first; b <= last; b++) {\n const start = b * W;\n const end = Math.min((b + 1) * W, items);\n\n let minY = Infinity;\n let maxY = -Infinity;\n\n if (L === 0) {\n for (let j = start; j < end; j++) {\n const y = source.getY(j);\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n }\n } else {\n const prev = this.levels[L - 1]!;\n for (let j = start; j < end; j++) {\n const pMin = prev[j * 2]!;\n const pMax = prev[j * 2 + 1]!;\n if (pMin < minY) minY = pMin;\n if (pMax > maxY) maxY = pMax;\n }\n }\n\n const dst = this.levels[L]!;\n dst[b * 2] = minY;\n dst[b * 2 + 1] = maxY;\n }\n\n this.levelLengths[L] = last + 1;\n changedIdx = first;\n\n if (this.levelLengths[L]! <= 1) break;\n }\n }\n\n private ensureLevelData(level: number, minBuckets: number): void {\n const needed = minBuckets * 2;\n const current = this.levels[level];\n if (current && current.length >= needed) return;\n\n const next = new Float32Array(needed);\n if (current) {\n next.set(current.subarray(0, Math.min(current.length, needed)));\n }\n this.levels[level] = next;\n }\n\n query(_viewport: Viewport, pixelWidth: number, xRange: { start: number; length: number }): LODView {\n if (pixelWidth <= 0 || xRange.length <= 0) {\n return { buckets: new Float32Array(0), bucketCount: 0, level: 0, samplesPerPixel: 0 };\n }\n\n const visibleSamples = xRange.length;\n const samplesPerPixel = Math.max(1, visibleSamples / pixelWidth);\n const level = Math.min(\n Math.max(0, Math.ceil(Math.log2(samplesPerPixel)) - 1),\n this.levels.length - 1,\n );\n\n const levelData = this.levels[level];\n const levelLen = this.levelLengths[level];\n const sampleWidth = this.levelSampleWidths[level];\n if (!levelData || levelLen === undefined || sampleWidth === undefined || levelLen === 0 || sampleWidth === 0) {\n return { buckets: new Float32Array(0), bucketCount: 0, level: 0, samplesPerPixel };\n }\n\n const queryStart = Math.max(0, xRange.start);\n const queryEnd = queryStart + xRange.length;\n const bucketStart = Math.max(0, Math.floor(queryStart / sampleWidth));\n const bucketEnd = Math.min(levelLen, Math.ceil(queryEnd / sampleWidth));\n const count = bucketEnd - bucketStart;\n\n if (count <= 0) {\n return { buckets: new Float32Array(0), bucketCount: 0, level, samplesPerPixel };\n }\n\n const result = new Float32Array(count * 2);\n for (let i = 0; i < count; i++) {\n const j = (bucketStart + i) * 2;\n result[i * 2] = levelData[j]!;\n result[i * 2 + 1] = levelData[j + 1]!;\n }\n\n return { buckets: result, bucketCount: count, level, samplesPerPixel };\n }\n}\n","import type { Dataset, AppendableDataset, LODView, Viewport, SeriesConfig, SeriesStyle } from \"./types.js\";\nimport { MinMaxPyramid } from \"./MinMaxPyramid.js\";\n\nexport class SeriesStore {\n readonly config: SeriesConfig;\n readonly style: SeriesStyle;\n private readonly dataset: Dataset;\n private readonly pyramid: MinMaxPyramid | null;\n\n private _dirty: boolean = false;\n private _visible: boolean = true;\n\n constructor(dataset: Dataset, config: SeriesConfig, style: SeriesStyle) {\n this.dataset = dataset;\n this.config = config;\n this.pyramid = config.mode === \"line\" && config.downsample !== \"none\" ? new MinMaxPyramid() : null;\n this.style = style;\n\n if (this.pyramid && dataset.length > 0) {\n this.pyramid.build(dataset);\n }\n }\n\n get hasLOD(): boolean {\n return this.pyramid !== null;\n }\n\n get dirty(): boolean {\n return this._dirty;\n }\n\n get length(): number {\n return this.dataset.length;\n }\n\n get visible(): boolean {\n return this._visible;\n }\n\n setVisible(visible: boolean): void {\n this._visible = visible;\n }\n\n append(x: ArrayLike<number>, y: ArrayLike<number>): void {\n if (!(\"push\" in this.dataset)) {\n throw new TypeError(\"SeriesStore dataset is not appendable.\");\n }\n\n const appendable = this.dataset as AppendableDataset;\n appendable.append(x, y);\n this._dirty = true;\n }\n\n clear(): void {\n if (!(\"clear\" in this.dataset)) {\n throw new TypeError(\"SeriesStore dataset is not clearable.\");\n }\n\n (this.dataset as AppendableDataset).clear();\n if (this.pyramid) this.pyramid.build(this.dataset);\n this._dirty = false;\n }\n\n rebuildPyramid(): void {\n if (!this._dirty) return;\n if (this.pyramid) this.pyramid.incrementalBuild(this.dataset);\n this._dirty = false;\n }\n\n query(viewport: Viewport, pixelWidth: number): LODView {\n if (!this.pyramid) {\n return { buckets: new Float32Array(0), bucketCount: 0, level: 0, samplesPerPixel: 0 };\n }\n\n const range = this.dataset.range;\n if (!range) {\n return { buckets: new Float32Array(0), bucketCount: 0, level: 0, samplesPerPixel: 0 };\n }\n\n const start = this.dataset.lowerBoundX(viewport.xMin);\n const end = this.dataset.upperBoundX(viewport.xMax);\n\n return this.pyramid.query(viewport, pixelWidth, {\n start,\n length: Math.max(0, end - start),\n });\n }\n\n visibleSampleCount(viewport: Viewport): number {\n const start = this.dataset.lowerBoundX(viewport.xMin);\n const end = this.dataset.upperBoundX(viewport.xMax);\n return Math.max(0, end - start);\n }\n\n copyRawVisible(viewport: Viewport, target: Float32Array, maxPoints: number): number {\n return this.copyVisibleSamples(viewport, target, maxPoints, \"points\", 0);\n }\n\n copyAreaVisible(viewport: Viewport, target: Float32Array, maxPoints: number, baseline: number = 0): number {\n return this.copyVisibleSamples(viewport, target, maxPoints, \"area\", baseline) * 2;\n }\n\n copyMinMaxVisible(viewport: Viewport, target: Float32Array, maxSegments: number): number {\n return this.copyMinMaxSegments(viewport, target, maxSegments, \"line-list\") * 2;\n }\n\n copyMinMaxInstanced(viewport: Viewport, target: Float32Array, maxSegments: number): number {\n return this.copyMinMaxSegments(viewport, target, maxSegments, \"instanced\");\n }\n\n private copyVisibleSamples(\n viewport: Viewport,\n target: Float32Array,\n maxPoints: number,\n layout: \"points\" | \"area\",\n baseline: number,\n ): number {\n const floatsPerSample = layout === \"points\" ? 2 : 4;\n if (maxPoints <= 0 || target.length < maxPoints * floatsPerSample) return 0;\n\n const start = this.dataset.lowerBoundX(viewport.xMin);\n const end = this.dataset.upperBoundX(viewport.xMax);\n const visible = end - start;\n if (visible <= 0) return 0;\n\n const stride = Math.max(1, Math.ceil(visible / maxPoints));\n let count = 0;\n for (let i = start; i < end && count < maxPoints; i += stride) {\n const x = this.dataset.getX(i);\n const y = this.dataset.getY(i);\n if (layout === \"points\") {\n const offset = count * 2;\n target[offset] = x;\n target[offset + 1] = y;\n } else {\n const offset = count * 4;\n target[offset] = x;\n target[offset + 1] = baseline;\n target[offset + 2] = x;\n target[offset + 3] = y;\n }\n count++;\n }\n\n return count;\n }\n\n private copyMinMaxSegments(\n viewport: Viewport,\n target: Float32Array,\n maxSegments: number,\n layout: \"line-list\" | \"instanced\",\n ): number {\n const floatsPerSegment = layout === \"line-list\" ? 4 : 3;\n if (!this.pyramid || maxSegments <= 0 || target.length < maxSegments * floatsPerSegment) return 0;\n\n const start = this.dataset.lowerBoundX(viewport.xMin);\n const end = this.dataset.upperBoundX(viewport.xMax);\n const visible = end - start;\n if (visible <= 0) return 0;\n\n const segmentCount = Math.min(maxSegments, visible);\n for (let segment = 0; segment < segmentCount; segment++) {\n const segmentStart = start + Math.floor((segment * visible) / segmentCount);\n const segmentEnd = start + Math.max(\n Math.floor(((segment + 1) * visible) / segmentCount),\n Math.floor((segment * visible) / segmentCount) + 1,\n );\n const clampedEnd = Math.min(end, segmentEnd);\n\n let minY = Infinity;\n let maxY = -Infinity;\n for (let i = segmentStart; i < clampedEnd; i++) {\n const y = this.dataset.getY(i);\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n }\n\n const x = this.dataset.getX(segmentStart + ((clampedEnd - segmentStart) >> 1));\n if (layout === \"line-list\") {\n const offset = segment * 4;\n target[offset] = x;\n target[offset + 1] = minY;\n target[offset + 2] = x;\n target[offset + 3] = maxY;\n } else {\n const offset = segment * 3;\n target[offset] = x;\n target[offset + 1] = minY;\n target[offset + 2] = maxY;\n }\n }\n\n return segmentCount;\n }\n}\n","import type { TimeRange } from \"./types.js\";\n\nexport class RingBuffer {\n readonly capacity: number;\n private _length: number = 0;\n private _head: number = 0;\n\n private readonly xData: Float64Array;\n private readonly yData: Float32Array;\n\n constructor(capacity: number) {\n if (!Number.isInteger(capacity) || capacity <= 0) {\n throw new RangeError(\"RingBuffer capacity must be a positive integer.\");\n }\n\n this.capacity = capacity;\n this.xData = new Float64Array(capacity);\n this.yData = new Float32Array(capacity);\n }\n\n get length(): number {\n return this._length;\n }\n\n get range(): TimeRange | null {\n if (this._length === 0) return null;\n return { start: this.getX(0), end: this.getX(this._length - 1) };\n }\n\n push(x: number, y: number): void {\n this.xData[this._head] = x;\n this.yData[this._head] = y;\n this._head = (this._head + 1) % this.capacity;\n if (this._length < this.capacity) this._length++;\n }\n\n append(x: ArrayLike<number>, y: ArrayLike<number>): void {\n const n = Math.min(x.length, y.length);\n for (let i = 0; i < n; i++) {\n this.push(x[i]!, y[i]!);\n }\n }\n\n get(index: number): { x: number; y: number } | null {\n if (index < 0 || index >= this._length) return null;\n return { x: this.getX(index), y: this.getY(index) };\n }\n\n getX(index: number): number {\n this.assertValidIndex(index);\n return this.xData[this.logicalToPhysical(index)]!;\n }\n\n getY(index: number): number {\n this.assertValidIndex(index);\n return this.yData[this.logicalToPhysical(index)]!;\n }\n\n lowerBoundX(x: number): number {\n let lo = 0;\n let hi = this._length;\n while (lo < hi) {\n const mid = lo + ((hi - lo) >> 1);\n if (this.getX(mid) < x) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n }\n\n upperBoundX(x: number): number {\n let lo = 0;\n let hi = this._length;\n while (lo < hi) {\n const mid = lo + ((hi - lo) >> 1);\n if (this.getX(mid) <= x) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n }\n\n clear(): void {\n this._length = 0;\n this._head = 0;\n }\n\n private logicalToPhysical(index: number): number {\n return (this._head - this._length + index + this.capacity) % this.capacity;\n }\n\n private assertValidIndex(index: number): void {\n if (!Number.isInteger(index) || index < 0 || index >= this._length) {\n throw new RangeError(`RingBuffer index out of range: ${index}`);\n }\n }\n}\n","import lineVert from \"./shaders/line.vert?raw\";\nimport lineFrag from \"./shaders/line.frag?raw\";\nimport segmentVert from \"./shaders/segment.vert?raw\";\nimport segmentFrag from \"./shaders/segment.frag?raw\";\nimport pointVert from \"./shaders/point.vert?raw\";\nimport pointFrag from \"./shaders/point.frag?raw\";\nimport barVert from \"./shaders/bar.vert?raw\";\nimport barFrag from \"./shaders/bar.frag?raw\";\n\nexport const ShaderPrograms = {\n line: { vert: lineVert, frag: lineFrag },\n segment: { vert: segmentVert, frag: segmentFrag },\n point: { vert: pointVert, frag: pointFrag },\n bar: { vert: barVert, frag: barFrag },\n} as const;\n","import { ShaderPrograms } from \"./ShaderPrograms.js\";\nimport type { Camera2D } from \"../interaction/Camera2D.js\";\nimport type { AttributeSpec, GpuBackend, GpuBuffer, GpuProgram } from \"./types.js\";\nimport type { SeriesStyle } from \"../core/types.js\";\n\nconst FLOATS_PER_SEGMENT_INSTANCE = 3;\nconst FLOATS_PER_POINT_INSTANCE = 2;\nconst BYTES_PER_FLOAT = 4;\nconst DEFAULT_POINT_SIZE_PX = 4;\nconst DEFAULT_BAR_WIDTH_DATA = 0.8;\nconst DEFAULT_BASELINE = 0;\n\nexport class Renderer {\n private readonly lineProgram: GpuProgram;\n private readonly segmentProgram: GpuProgram;\n private readonly pointProgram: GpuProgram;\n private readonly barProgram: GpuProgram;\n private readonly segmentSelectBuffer: GpuBuffer;\n private readonly pointCornerBuffer: GpuBuffer;\n private readonly barCornerBuffer: GpuBuffer;\n private readonly scaleUniform: Float32Array = new Float32Array(2);\n private readonly offsetUniform: Float32Array = new Float32Array(2);\n private readonly canvasSizeUniform: Float32Array = new Float32Array(2);\n\n constructor(private backend: GpuBackend) {\n this.lineProgram = this.backend.createProgram(ShaderPrograms.line.vert, ShaderPrograms.line.frag);\n this.segmentProgram = this.backend.createProgram(ShaderPrograms.segment.vert, ShaderPrograms.segment.frag);\n this.pointProgram = this.backend.createProgram(ShaderPrograms.point.vert, ShaderPrograms.point.frag);\n this.barProgram = this.backend.createProgram(ShaderPrograms.bar.vert, ShaderPrograms.bar.frag);\n\n this.segmentSelectBuffer = this.backend.createBuffer({ usage: \"static\", type: \"float\", length: 2 });\n this.backend.updateBuffer(this.segmentSelectBuffer, new Float32Array([0, 1]));\n\n this.pointCornerBuffer = this.backend.createBuffer({ usage: \"static\", type: \"float\", length: 8 });\n this.backend.updateBuffer(this.pointCornerBuffer, new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1]));\n\n this.barCornerBuffer = this.backend.createBuffer({ usage: \"static\", type: \"float\", length: 8 });\n this.backend.updateBuffer(this.barCornerBuffer, new Float32Array([-0.5, 0, 0.5, 0, -0.5, 1, 0.5, 1]));\n }\n\n get supportsInstancedSegments(): boolean {\n return this.backend.capabilities.instancing;\n }\n\n get supportsInstancedPoints(): boolean {\n return this.backend.capabilities.instancing;\n }\n\n get supportsInstancedBars(): boolean {\n return this.backend.capabilities.instancing;\n }\n\n clear(r: number, g: number, b: number, a: number): void {\n this.backend.clear(r, g, b, a);\n }\n\n createFloatBuffer(floatCount: number): GpuBuffer {\n return this.backend.createBuffer({ usage: \"stream\", type: \"float\", length: floatCount });\n }\n\n updateFloatBuffer(buffer: GpuBuffer, data: Float32Array): void {\n this.backend.updateBuffer(buffer, data);\n }\n\n viewport(x: number, y: number, width: number, height: number): void {\n this.backend.viewport(x, y, width, height);\n }\n\n drawLines(positions: GpuBuffer, count: number, style: SeriesStyle, camera: Camera2D): void {\n this.drawLinePrimitive(\"lines\", positions, count, style, camera);\n }\n\n drawLineStrip(positions: GpuBuffer, count: number, style: SeriesStyle, camera: Camera2D): void {\n this.drawLinePrimitive(\"line_strip\", positions, count, style, camera);\n }\n\n drawMinMaxSegments(positions: GpuBuffer, count: number, style: SeriesStyle, camera: Camera2D): void {\n this.drawLines(positions, count, style, camera);\n }\n\n drawMinMaxSegmentsInstanced(instanceBuffer: GpuBuffer, instanceCount: number, style: SeriesStyle, camera: Camera2D): void {\n this.writeCameraUniforms(camera);\n\n const stride = FLOATS_PER_SEGMENT_INSTANCE * BYTES_PER_FLOAT;\n const aX: AttributeSpec = { buffer: instanceBuffer, divisor: 1, stride, offset: 0 };\n const aMinY: AttributeSpec = { buffer: instanceBuffer, divisor: 1, stride, offset: BYTES_PER_FLOAT };\n const aMaxY: AttributeSpec = { buffer: instanceBuffer, divisor: 1, stride, offset: BYTES_PER_FLOAT * 2 };\n const aSelect: AttributeSpec = { buffer: this.segmentSelectBuffer, divisor: 0, stride: BYTES_PER_FLOAT, offset: 0 };\n\n this.backend.draw({\n program: this.segmentProgram,\n primitive: \"lines\",\n count: 2,\n instances: instanceCount,\n attributes: { aMaxY, aMinY, aSelect, aX },\n uniforms: {\n uScale: this.scaleUniform,\n uOffset: this.offsetUniform,\n uColor: style.color,\n },\n });\n }\n\n drawPointsInstanced(\n instanceBuffer: GpuBuffer,\n pointCount: number,\n style: SeriesStyle,\n camera: Camera2D,\n canvasWidth: number,\n canvasHeight: number,\n ): void {\n this.writeCameraUniforms(camera);\n this.canvasSizeUniform[0] = Math.max(1, canvasWidth);\n this.canvasSizeUniform[1] = Math.max(1, canvasHeight);\n\n const instanceStride = FLOATS_PER_POINT_INSTANCE * BYTES_PER_FLOAT;\n const aPosition: AttributeSpec = { buffer: instanceBuffer, divisor: 1, stride: instanceStride, offset: 0, size: 2 };\n const aCorner: AttributeSpec = { buffer: this.pointCornerBuffer, divisor: 0, stride: FLOATS_PER_POINT_INSTANCE * BYTES_PER_FLOAT, offset: 0, size: 2 };\n\n this.backend.draw({\n program: this.pointProgram,\n primitive: \"triangle_strip\",\n count: 4,\n instances: pointCount,\n attributes: { aCorner, aPosition },\n uniforms: {\n uScale: this.scaleUniform,\n uOffset: this.offsetUniform,\n uCanvasSize: this.canvasSizeUniform,\n uPointSize: style.pointSize ?? DEFAULT_POINT_SIZE_PX,\n uColor: style.color,\n },\n });\n }\n\n drawAreaStrip(positions: GpuBuffer, count: number, style: SeriesStyle, camera: Camera2D): void {\n this.writeCameraUniforms(camera);\n\n this.backend.draw({\n program: this.lineProgram,\n primitive: \"triangle_strip\",\n count,\n attributes: { position: positions },\n uniforms: {\n uScale: this.scaleUniform,\n uOffset: this.offsetUniform,\n uColor: style.fillColor ?? style.color,\n },\n });\n }\n\n drawBarsInstanced(\n instanceBuffer: GpuBuffer,\n barCount: number,\n style: SeriesStyle,\n camera: Camera2D,\n ): void {\n this.writeCameraUniforms(camera);\n\n const instanceStride = FLOATS_PER_POINT_INSTANCE * BYTES_PER_FLOAT;\n const aPosition: AttributeSpec = { buffer: instanceBuffer, divisor: 1, stride: instanceStride, offset: 0, size: 2 };\n const aCorner: AttributeSpec = { buffer: this.barCornerBuffer, divisor: 0, stride: FLOATS_PER_POINT_INSTANCE * BYTES_PER_FLOAT, offset: 0, size: 2 };\n\n this.backend.draw({\n program: this.barProgram,\n primitive: \"triangle_strip\",\n count: 4,\n instances: barCount,\n attributes: { aCorner, aPosition },\n uniforms: {\n uScale: this.scaleUniform,\n uOffset: this.offsetUniform,\n uBarWidth: style.barWidth ?? DEFAULT_BAR_WIDTH_DATA,\n uBaseline: style.baseline ?? DEFAULT_BASELINE,\n uColor: style.color,\n },\n });\n }\n\n private drawLinePrimitive(primitive: \"lines\" | \"line_strip\", positions: GpuBuffer, count: number, style: SeriesStyle, camera: Camera2D): void {\n this.writeCameraUniforms(camera);\n\n this.backend.draw({\n program: this.lineProgram,\n primitive,\n count,\n attributes: { position: positions },\n uniforms: {\n uScale: this.scaleUniform,\n uOffset: this.offsetUniform,\n uColor: style.color,\n },\n });\n }\n\n private writeCameraUniforms(camera: Camera2D): void {\n this.scaleUniform[0] = camera.xScale;\n this.scaleUniform[1] = camera.yScale;\n this.offsetUniform[0] = camera.xOffset;\n this.offsetUniform[1] = camera.yOffset;\n }\n\n dispose(): void {\n this.backend.destroy();\n }\n}\n","import type { Regl, Buffer as ReglBuffer } from \"regl\";\n\ninterface PoolEntry {\n buffer: ReglBuffer;\n floatArray: Float32Array;\n floatCapacity: number;\n inUse: boolean;\n}\n\nconst POOL_SIZES = [1024, 4096, 16384, 32768, 131072];\n\nexport class WebGL2Resources {\n private readonly regl: Regl;\n private readonly pool: PoolEntry[] = [];\n private preAllocated: boolean = false;\n\n constructor(regl: Regl) {\n this.regl = regl;\n }\n\n get reglInstance(): Regl {\n return this.regl;\n }\n\n preAllocate(): void {\n if (this.preAllocated) return;\n this.preAllocated = true;\n\n for (const size of POOL_SIZES) {\n this.pool.push(this.createEntry(size, \"stream\"));\n }\n }\n\n acquire(floatCount: number, usage: \"static\" | \"dynamic\" | \"stream\" = \"stream\"): { buffer: ReglBuffer; array: Float32Array } {\n const needed = floatCount;\n let entry = this.findFree(needed);\n if (!entry) {\n const capacity = this.roundUp(needed);\n entry = this.createEntry(capacity, usage);\n this.pool.push(entry);\n }\n entry.inUse = true;\n return { buffer: entry.buffer, array: entry.floatArray };\n }\n\n release(buffer: ReglBuffer): void {\n for (const entry of this.pool) {\n if (entry.buffer === buffer) {\n entry.inUse = false;\n return;\n }\n }\n }\n\n destroy(): void {\n for (const entry of this.pool) {\n entry.buffer.destroy();\n }\n this.pool.length = 0;\n this.preAllocated = false;\n }\n\n private createEntry(floatCapacity: number, usage: \"static\" | \"dynamic\" | \"stream\"): PoolEntry {\n return {\n buffer: this.regl.buffer({\n length: floatCapacity * 4,\n usage,\n type: \"float\",\n }),\n floatArray: new Float32Array(floatCapacity),\n floatCapacity,\n inUse: false,\n };\n }\n\n private findFree(minCapacity: number): PoolEntry | undefined {\n return this.pool.find(e => !e.inUse && e.floatCapacity >= minCapacity);\n }\n\n private roundUp(n: number): number {\n for (const size of POOL_SIZES) {\n if (size >= n) return size;\n }\n const highest = POOL_SIZES[POOL_SIZES.length - 1]!;\n const nextPower = 1 << (32 - Math.clz32(n - 1));\n return Math.max(highest * 2, nextPower);\n }\n}\n","import createRegl from \"regl\";\nimport type { AttributeState, Buffer as ReglBuffer, DrawCommand, PrimitiveType, Regl, Uniform } from \"regl\";\nimport type { GpuBackend, GpuBuffer, GpuProgram, GpuResource, BufferSpec, DrawSpec, AttributeSpec, UniformValue } from \"./types.js\";\nimport { WebGL2Resources } from \"./WebGL2Resources.js\";\n\ntype ReglGpuBuffer = GpuBuffer & {\n readonly buffer: ReglBuffer;\n};\n\ntype ReglGpuProgram = GpuProgram & {\n readonly id: number;\n readonly vert: string;\n readonly frag: string;\n};\n\ninterface DrawProps {\n readonly count: number;\n readonly instances: number;\n readonly attributes: Readonly<Record<string, AttributeState>>;\n readonly uniforms: Readonly<Record<string, UniformValue>>;\n}\n\nfunction toReglContext(gl: WebGL2RenderingContext): WebGLRenderingContext {\n // regl's public types accept WebGLRenderingContext even though regl can run on WebGL2 contexts.\n return gl as unknown as WebGLRenderingContext;\n}\n\ninterface ScissorProps {\n scissorEnable?: boolean;\n scissorBox?: { x: number; y: number; width: number; height: number };\n}\n\nexport class ReglBackend implements GpuBackend {\n private gl: WebGL2RenderingContext;\n private regl: Regl;\n private resources: WebGL2Resources;\n private nextProgramId: number = 1;\n private commandCache: Map<string, DrawCommand> = new Map();\n private scissorBox: { x: number; y: number; w: number; h: number } | null = null;\n readonly capabilities: GpuBackend[\"capabilities\"];\n\n constructor(canvas: HTMLCanvasElement) {\n const gl = canvas.getContext(\"webgl2\", {\n alpha: true,\n antialias: false,\n depth: false,\n stencil: false,\n premultipliedAlpha: false,\n preserveDrawingBuffer: false,\n powerPreference: \"high-performance\",\n });\n\n if (!gl) {\n throw new Error(\"BlazePlot requires WebGL2, but this browser/context does not support it.\");\n }\n\n this.gl = gl;\n this.regl = createRegl({\n gl: toReglContext(this.gl),\n extensions: [],\n optionalExtensions: [\n \"angle_instanced_arrays\",\n \"ext_disjoint_timer_query_webgl2\",\n ],\n });\n\n this.capabilities = {\n instancing: this.regl.hasExtension(\"angle_instanced_arrays\"),\n };\n\n this.resources = new WebGL2Resources(this.regl);\n this.resources.preAllocate();\n }\n\n createBuffer(spec: BufferSpec): GpuBuffer {\n const { buffer } = this.resources.acquire(spec.length, spec.usage);\n return {\n length: spec.length,\n type: spec.type,\n buffer,\n } as ReglGpuBuffer;\n }\n\n updateBuffer(buffer: GpuBuffer, data: Float32Array | Uint16Array, offset: number = 0): void {\n if (data.length + offset > buffer.length) {\n throw new RangeError(\"GPU buffer update exceeds allocated buffer length.\");\n }\n\n const bytesPerElement = buffer.type === \"float\" ? 4 : 2;\n this.asReglBuffer(buffer).buffer.subdata(data, offset * bytesPerElement);\n }\n\n createProgram(vert: string, frag: string): GpuProgram {\n return {\n id: this.nextProgramId++,\n vert,\n frag,\n } as ReglGpuProgram;\n }\n\n draw(spec: DrawSpec): void {\n if (spec.count <= 0) return;\n\n const program = this.asReglProgram(spec.program);\n const attributeNames = Object.keys(spec.attributes).sort();\n const uniformNames = Object.keys(spec.uniforms).sort();\n const key = [program.id, spec.primitive, attributeNames.join(\",\"), uniformNames.join(\",\"), spec.instances === undefined ? 0 : 1].join(\"|\");\n let command = this.commandCache.get(key);\n\n if (!command) {\n command = this.createDrawCommand(program, spec.primitive, attributeNames, uniformNames, spec.instances !== undefined);\n this.commandCache.set(key, command);\n }\n\n const attributes: Record<string, AttributeState> = {};\n for (const name of attributeNames) {\n attributes[name] = this.resolveAttribute(spec.attributes[name]!);\n }\n\n const props: DrawProps & ScissorProps = {\n count: spec.count,\n instances: spec.instances ?? 0,\n attributes,\n uniforms: spec.uniforms,\n };\n\n if (this.scissorBox) {\n props.scissorEnable = true;\n props.scissorBox = {\n x: this.scissorBox.x,\n y: this.scissorBox.y,\n width: this.scissorBox.w,\n height: this.scissorBox.h,\n };\n }\n\n command(props);\n }\n\n dispose(resource: GpuResource): void {\n if (this.isReglBuffer(resource)) {\n this.resources.release(resource.buffer);\n }\n }\n\n clear(r: number, g: number, b: number, a: number): void {\n this.regl.clear({ color: [r, g, b, a] });\n }\n\n viewport(x: number, y: number, w: number, h: number): void {\n this.scissorBox = { x, y, w, h };\n }\n\n destroy(): void {\n this.resources.destroy();\n this.regl.destroy();\n }\n\n private createDrawCommand(\n program: ReglGpuProgram,\n primitive: DrawSpec[\"primitive\"],\n attributeNames: readonly string[],\n uniformNames: readonly string[],\n instanced: boolean,\n ): DrawCommand {\n const attributes: Record<string, (context: object, props: DrawProps) => AttributeState> = {};\n for (const name of attributeNames) {\n attributes[name] = (_context, props) => props.attributes[name]!;\n }\n\n const uniforms: Record<string, (context: object, props: DrawProps) => Uniform> = {};\n for (const name of uniformNames) {\n uniforms[name] = (_context, props) => props.uniforms[name] as Uniform;\n }\n\n return this.regl({\n vert: program.vert,\n frag: program.frag,\n attributes,\n uniforms,\n primitive: this.toReglPrimitive(primitive),\n count: (_context: object, props: DrawProps) => props.count,\n instances: instanced ? (_context: object, props: DrawProps) => props.instances : undefined,\n depth: { enable: false },\n scissor: {\n enable: (_context: object, props: DrawProps & ScissorProps) => props.scissorEnable ?? false,\n box: (_context: object, props: DrawProps & ScissorProps) =>\n props.scissorBox ?? { x: 0, y: 0, width: 0, height: 0 },\n },\n });\n }\n\n private resolveAttribute(attribute: GpuBuffer | AttributeSpec): AttributeState {\n if (\"divisor\" in attribute) {\n return {\n buffer: this.asReglBuffer(attribute.buffer).buffer,\n divisor: attribute.divisor,\n stride: attribute.stride,\n offset: attribute.offset,\n size: attribute.size,\n } as AttributeState;\n }\n\n return this.asReglBuffer(attribute).buffer;\n }\n\n private asReglBuffer(buffer: GpuBuffer): ReglGpuBuffer {\n return buffer as ReglGpuBuffer;\n }\n\n private asReglProgram(program: GpuProgram): ReglGpuProgram {\n return program as ReglGpuProgram;\n }\n\n private isReglBuffer(resource: GpuResource): resource is ReglGpuBuffer {\n return \"length\" in resource && \"type\" in resource && \"buffer\" in resource;\n }\n\n private toReglPrimitive(primitive: DrawSpec[\"primitive\"]): PrimitiveType {\n switch (primitive) {\n case \"line_strip\":\n return \"line strip\";\n case \"triangle_strip\":\n return \"triangle strip\";\n default:\n return primitive;\n }\n }\n}\n","import type { Camera2D } from \"./Camera2D.js\";\nimport type { PanIntent, ViewportPolicy, ZoomIntent } from \"./types.js\";\n\nexport class InputController {\n private _enabled: boolean = true;\n private activePointerId: number | null = null;\n private lastX: number = 0;\n private lastY: number = 0;\n\n constructor(\n private readonly canvas: HTMLCanvasElement,\n private readonly camera: Camera2D,\n private readonly policy?: ViewportPolicy,\n ) {\n this.bindEvents();\n }\n\n get enabled(): boolean {\n return this._enabled;\n }\n\n set enabled(value: boolean) {\n this._enabled = value;\n }\n\n private bindEvents(): void {\n this.canvas.addEventListener(\"pointerdown\", this.onPointerDown);\n this.canvas.addEventListener(\"pointermove\", this.onPointerMove);\n this.canvas.addEventListener(\"pointerup\", this.onPointerUp);\n this.canvas.addEventListener(\"pointercancel\", this.onPointerUp);\n this.canvas.addEventListener(\"wheel\", this.onWheel, { passive: false });\n }\n\n private onPointerDown = (e: PointerEvent): void => {\n if (!this._enabled || this.activePointerId !== null) return;\n this.activePointerId = e.pointerId;\n this.lastX = e.clientX;\n this.lastY = e.clientY;\n this.canvas.setPointerCapture(e.pointerId);\n };\n\n private onPointerMove = (e: PointerEvent): void => {\n if (!this._enabled || e.pointerId !== this.activePointerId) return;\n const rect = this.canvas.getBoundingClientRect();\n const dx = rect.width > 0 ? (this.lastX - e.clientX) / rect.width : 0;\n const dy = rect.height > 0 ? (e.clientY - this.lastY) / rect.height : 0;\n const intent = this.applyPanPolicy({ dx, dy });\n if (intent) this.camera.pan(intent);\n this.lastX = e.clientX;\n this.lastY = e.clientY;\n };\n\n private onPointerUp = (e: PointerEvent): void => {\n if (e.pointerId !== this.activePointerId) return;\n this.activePointerId = null;\n if (this.canvas.hasPointerCapture(e.pointerId)) {\n this.canvas.releasePointerCapture(e.pointerId);\n }\n };\n\n private onWheel = (e: WheelEvent): void => {\n if (!this._enabled) return;\n e.preventDefault();\n const factor = e.deltaY < 0 ? 1.1 : 0.9;\n const rect = this.canvas.getBoundingClientRect();\n const cx = rect.width > 0 ? (e.clientX - rect.left) / rect.width : 0.5;\n const cy = rect.height > 0 ? 1 - (e.clientY - rect.top) / rect.height : 0.5;\n const intent = this.applyZoomPolicy({ factor, cx, cy, axis: \"xy\" });\n if (intent) this.camera.zoom(intent);\n };\n\n private applyPanPolicy(intent: PanIntent): PanIntent | null {\n if (!this.policy?.beforePan) return intent;\n return this.policy.beforePan(this.camera, intent);\n }\n\n private applyZoomPolicy(intent: ZoomIntent): ZoomIntent | null {\n if (!this.policy?.beforeZoom) return intent;\n return this.policy.beforeZoom(this.camera, intent);\n }\n\n dispose(): void {\n this.canvas.removeEventListener(\"pointerdown\", this.onPointerDown);\n this.canvas.removeEventListener(\"pointermove\", this.onPointerMove);\n this.canvas.removeEventListener(\"pointerup\", this.onPointerUp);\n this.canvas.removeEventListener(\"pointercancel\", this.onPointerUp);\n this.canvas.removeEventListener(\"wheel\", this.onWheel);\n }\n}\n","import type { Viewport } from \"../core/types.js\";\nimport type { PanIntent, ZoomIntent } from \"./types.js\";\n\nexport class Camera2D {\n private _xMin: number = 0;\n private _xMax: number = 1;\n private _yMin: number = 0;\n private _yMax: number = 1;\n\n get xMin(): number {\n return this._xMin;\n }\n\n get xMax(): number {\n return this._xMax;\n }\n\n get yMin(): number {\n return this._yMin;\n }\n\n get yMax(): number {\n return this._yMax;\n }\n\n get viewport(): Viewport {\n return { xMin: this._xMin, xMax: this._xMax, yMin: this._yMin, yMax: this._yMax };\n }\n\n get xScale(): number {\n return 2 / (this._xMax - this._xMin);\n }\n\n get xOffset(): number {\n return -(this._xMin + this._xMax) / (this._xMax - this._xMin);\n }\n\n get yScale(): number {\n return 2 / (this._yMax - this._yMin);\n }\n\n get yOffset(): number {\n return -(this._yMin + this._yMax) / (this._yMax - this._yMin);\n }\n\n setViewport(v: { xMin?: number; xMax?: number; yMin?: number; yMax?: number }): void {\n const next = {\n xMin: v.xMin ?? this._xMin,\n xMax: v.xMax ?? this._xMax,\n yMin: v.yMin ?? this._yMin,\n yMax: v.yMax ?? this._yMax,\n };\n Camera2D.assertValidViewport(next);\n this._xMin = next.xMin;\n this._xMax = next.xMax;\n this._yMin = next.yMin;\n this._yMax = next.yMax;\n }\n\n pan(intent: PanIntent): void {\n const { dx, dy } = intent;\n Camera2D.assertFinite(\"dx\", dx);\n Camera2D.assertFinite(\"dy\", dy);\n const rangeX = this._xMax - this._xMin;\n const rangeY = this._yMax - this._yMin;\n this.setViewport({\n xMin: this._xMin + dx * rangeX,\n xMax: this._xMax + dx * rangeX,\n yMin: this._yMin + dy * rangeY,\n yMax: this._yMax + dy * rangeY,\n });\n }\n\n zoom(intent: ZoomIntent): void {\n const { factor, cx, cy, axis } = intent;\n Camera2D.assertFinite(\"factor\", factor);\n Camera2D.assertFinite(\"cx\", cx);\n Camera2D.assertFinite(\"cy\", cy);\n if (factor <= 0) throw new RangeError(\"Camera2D zoom factor must be > 0.\");\n\n const rangeX = this._xMax - this._xMin;\n const rangeY = this._yMax - this._yMin;\n const dataCx = this._xMin + rangeX * cx;\n const dataCy = this._yMin + rangeY * cy;\n const newRangeX = axis === \"y\" ? rangeX : rangeX / factor;\n const newRangeY = axis === \"x\" ? rangeY : rangeY / factor;\n this.setViewport({\n xMin: dataCx - newRangeX * cx,\n xMax: dataCx + newRangeX * (1 - cx),\n yMin: dataCy - newRangeY * cy,\n yMax: dataCy + newRangeY * (1 - cy),\n });\n }\n\n toClip(x: number, y: number): [number, number] {\n return [\n x * this.xScale + this.xOffset,\n y * this.yScale + this.yOffset,\n ];\n }\n\n toScreen(clipX: number, clipY: number, canvasWidth: number, canvasHeight: number): [number, number] {\n return [\n (clipX + 1) * 0.5 * canvasWidth,\n (1 - clipY) * 0.5 * canvasHeight,\n ];\n }\n\n clone(): Camera2D {\n const c = new Camera2D();\n c.setViewport(this.viewport);\n return c;\n }\n\n private static assertValidViewport(v: Viewport): void {\n Camera2D.assertFinite(\"xMin\", v.xMin);\n Camera2D.assertFinite(\"xMax\", v.xMax);\n Camera2D.assertFinite(\"yMin\", v.yMin);\n Camera2D.assertFinite(\"yMax\", v.yMax);\n if (v.xMax <= v.xMin) throw new RangeError(\"Camera2D requires xMax > xMin.\");\n if (v.yMax <= v.yMin) throw new RangeError(\"Camera2D requires yMax > yMin.\");\n }\n\n private static assertFinite(name: string, value: number): void {\n if (!Number.isFinite(value)) throw new RangeError(`Camera2D ${name} must be finite.`);\n }\n}\n","import type { Camera2D } from \"./Camera2D.js\";\n\nexport class AxisController {\n constructor(private readonly camera: Camera2D) {}\n\n getXTickValues(canvasWidth: number, maxTicks: number = 10, target: number[] = []): number[] {\n return this.getTickValues(this.camera.xMin, this.camera.xMax, canvasWidth, maxTicks, 80, target);\n }\n\n getYTickValues(canvasHeight: number, maxTicks: number = 10, target: number[] = []): number[] {\n return this.getTickValues(this.camera.yMin, this.camera.yMax, canvasHeight, maxTicks, 48, target);\n }\n\n formatValue(value: number): string {\n if (Math.abs(value) < 1e-12) return \"0\";\n const abs = Math.abs(value);\n if (abs >= 1e6 || abs < 1e-3) return value.toExponential(2);\n if (abs >= 100) return value.toFixed(0);\n if (abs >= 10) return value.toFixed(1);\n return value.toFixed(2);\n }\n\n private getTickValues(min: number, max: number, pixelSize: number, maxTicks: number, minPixelSpacing: number, target: number[]): number[] {\n target.length = 0;\n if (pixelSize <= 0 || maxTicks <= 0) return target;\n\n const range = max - min;\n if (!Number.isFinite(range) || range <= 0) return target;\n\n const targetTicks = Math.max(2, Math.min(maxTicks, Math.floor(pixelSize / minPixelSpacing)));\n const step = this.niceStep(range / (targetTicks - 1));\n const firstIndex = Math.floor(min / step);\n const lastIndex = Math.ceil(max / step);\n\n for (let index = firstIndex; index <= lastIndex && target.length < maxTicks + 2; index++) {\n target.push(this.normalizeTick(index * step, step));\n }\n\n return target;\n }\n\n private niceStep(rawStep: number): number {\n const magnitude = 10 ** Math.floor(Math.log10(rawStep));\n const normalized = rawStep / magnitude;\n\n if (normalized <= 1.5) return magnitude;\n if (normalized <= 3) return 2 * magnitude;\n if (normalized <= 7) return 5 * magnitude;\n return 10 * magnitude;\n }\n\n private normalizeTick(value: number, step: number): number {\n const decimals = Math.max(0, -Math.floor(Math.log10(step)) + 2);\n const normalized = Number(value.toFixed(decimals));\n return Object.is(normalized, -0) ? 0 : normalized;\n }\n}\n","import type { Camera2D } from \"../interaction/Camera2D.js\";\nimport type { AxisController } from \"../interaction/AxisController.js\";\nimport type { ChartLayoutElements, ChartLayoutConfig } from \"./ChartLayout.js\";\n\nexport interface AxisOverlayOptions {\n readonly font?: string;\n readonly color?: string;\n}\n\nexport type AxisOverlayConfig = ChartLayoutConfig;\n\nexport class AxisOverlay {\n private xPool: HTMLDivElement[] = [];\n private yPool: HTMLDivElement[] = [];\n private readonly xTicks: number[] = [];\n private readonly yTicks: number[] = [];\n\n constructor(\n private readonly layout: ChartLayoutElements,\n private readonly config: AxisOverlayConfig,\n private readonly options: AxisOverlayOptions = {},\n ) {}\n\n update(camera: Camera2D, axis: AxisController): void {\n const plotW = Math.max(1, this.layout.plot.clientWidth);\n const plotH = Math.max(1, this.layout.plot.clientHeight);\n\n if (this.config.x.visible) {\n axis.getXTickValues(plotW, 12, this.xTicks);\n } else {\n this.xTicks.length = 0;\n }\n\n if (this.config.y.visible) {\n axis.getYTickValues(plotH, 8, this.yTicks);\n } else {\n this.yTicks.length = 0;\n }\n\n this.updateAxis(this.xPool, this.xTicks, \"x\", camera, plotW, plotH, axis);\n this.updateAxis(this.yPool, this.yTicks, \"y\", camera, plotW, plotH, axis);\n }\n\n dispose(): void {\n for (const el of this.xPool) el.remove();\n for (const el of this.yPool) el.remove();\n this.xPool = [];\n this.yPool = [];\n }\n\n private parentForAxis(axis: \"x\" | \"y\"): HTMLElement {\n if (axis === \"x\") {\n return this.config.x.position === \"outside\" ? this.layout.xAxis : this.layout.plot;\n }\n return this.config.y.position === \"outside\" ? this.layout.yAxis : this.layout.plot;\n }\n\n private updateAxis(\n pool: HTMLDivElement[],\n values: number[],\n axis: \"x\" | \"y\",\n camera: Camera2D,\n plotW: number,\n plotH: number,\n controller: AxisController,\n ): void {\n const parent = this.parentForAxis(axis);\n\n while (pool.length < values.length) {\n const el = document.createElement(\"div\");\n el.style.position = \"absolute\";\n el.style.pointerEvents = \"none\";\n el.style.whiteSpace = \"nowrap\";\n el.style.font = this.options.font ?? \"11px ui-monospace, monospace, sans-serif\";\n el.style.color = this.options.color ?? \"#bfd6ff\";\n el.style.userSelect = \"none\";\n parent.appendChild(el);\n pool.push(el);\n }\n\n for (const el of pool) {\n if (el.parentElement !== parent) parent.appendChild(el);\n }\n\n for (let i = values.length; i < pool.length; i++) {\n pool[i]!.style.display = \"none\";\n }\n\n for (let i = 0; i < values.length; i++) {\n const el = pool[i]!;\n const value = values[i]!;\n const text = controller.formatValue(value);\n if (el.textContent !== text) {\n el.textContent = text;\n }\n el.style.display = \"block\";\n\n if (axis === \"x\") {\n const [clipX] = camera.toClip(value, camera.yMin);\n const screenX = (clipX + 1) * 0.5 * plotW;\n el.style.left = `${screenX}px`;\n el.style.right = \"auto\";\n el.style.transform = \"translateX(-50%)\";\n if (this.config.x.position === \"outside\") {\n el.style.top = \"4px\";\n el.style.bottom = \"auto\";\n } else {\n el.style.top = \"auto\";\n el.style.bottom = \"4px\";\n }\n } else {\n const [, clipY] = camera.toClip(camera.xMin, value);\n const screenY = (1 - clipY) * 0.5 * plotH;\n el.style.top = `${screenY}px`;\n el.style.bottom = \"auto\";\n el.style.transform = \"translateY(-50%)\";\n if (this.config.y.position === \"outside\") {\n el.style.left = \"auto\";\n el.style.right = \"4px\";\n } else {\n el.style.left = \"4px\";\n el.style.right = \"auto\";\n }\n }\n }\n }\n}\n","export type AxisPosition = \"inside\" | \"outside\";\n\nexport interface NormalizedAxisConfig {\n readonly visible: boolean;\n readonly position: AxisPosition;\n}\n\nexport interface ChartLayoutConfig {\n readonly x: NormalizedAxisConfig;\n readonly y: NormalizedAxisConfig;\n}\n\nexport interface ChartLayoutElements {\n readonly root: HTMLDivElement;\n readonly plot: HTMLDivElement;\n readonly canvas: HTMLCanvasElement;\n readonly xAxis: HTMLDivElement;\n readonly yAxis: HTMLDivElement;\n readonly corner: HTMLDivElement;\n}\n\nexport const LEFT_AXIS_GUTTER_CSS = 52;\nexport const BOTTOM_AXIS_GUTTER_CSS = 28;\n\nexport class ChartLayout implements ChartLayoutElements {\n readonly root: HTMLDivElement;\n readonly plot: HTMLDivElement;\n readonly canvas: HTMLCanvasElement;\n readonly xAxis: HTMLDivElement;\n readonly yAxis: HTMLDivElement;\n readonly corner: HTMLDivElement;\n\n private readonly externalCanvas: boolean;\n private readonly originalCanvasCssText: string;\n private readonly originalCanvasParent: HTMLElement | null;\n\n constructor(target: HTMLElement, config: ChartLayoutConfig) {\n const canvasTarget = target instanceof HTMLCanvasElement ? target : null;\n this.externalCanvas = canvasTarget !== null;\n this.originalCanvasCssText = canvasTarget?.style.cssText ?? \"\";\n this.originalCanvasParent = canvasTarget?.parentElement ?? null;\n\n this.root = document.createElement(\"div\");\n this.plot = document.createElement(\"div\");\n this.canvas = canvasTarget ?? document.createElement(\"canvas\");\n this.xAxis = document.createElement(\"div\");\n this.yAxis = document.createElement(\"div\");\n this.corner = document.createElement(\"div\");\n\n this.root.className = \"blazeplot-root\";\n this.plot.className = \"blazeplot-plot\";\n this.canvas.classList.add(\"blazeplot-canvas\");\n this.xAxis.className = \"blazeplot-axis blazeplot-axis-x\";\n this.yAxis.className = \"blazeplot-axis blazeplot-axis-y\";\n this.corner.className = \"blazeplot-axis-corner\";\n\n this.applyBaseStyles();\n this.mount(target);\n this.update(config);\n }\n\n update(config: ChartLayoutConfig): void {\n const hasOutsideY = config.y.visible && config.y.position === \"outside\";\n const hasOutsideX = config.x.visible && config.x.position === \"outside\";\n\n this.root.style.gridTemplateColumns = `${hasOutsideY ? LEFT_AXIS_GUTTER_CSS : 0}px minmax(0, 1fr)`;\n this.root.style.gridTemplateRows = `minmax(0, 1fr) ${hasOutsideX ? BOTTOM_AXIS_GUTTER_CSS : 0}px`;\n this.yAxis.style.display = hasOutsideY ? \"block\" : \"none\";\n this.xAxis.style.display = hasOutsideX ? \"block\" : \"none\";\n this.corner.style.display = hasOutsideX && hasOutsideY ? \"block\" : \"none\";\n }\n\n dispose(): void {\n if (this.externalCanvas && this.originalCanvasParent) {\n this.canvas.style.cssText = this.originalCanvasCssText;\n this.originalCanvasParent.insertBefore(this.canvas, this.root);\n }\n this.root.remove();\n }\n\n private mount(target: HTMLElement): void {\n if (this.externalCanvas) {\n this.originalCanvasParent?.insertBefore(this.root, target);\n } else {\n target.appendChild(this.root);\n }\n\n this.root.appendChild(this.yAxis);\n this.root.appendChild(this.plot);\n this.root.appendChild(this.corner);\n this.root.appendChild(this.xAxis);\n this.plot.appendChild(this.canvas);\n }\n\n private applyBaseStyles(): void {\n this.root.style.display = \"grid\";\n this.root.style.width = \"100%\";\n this.root.style.height = \"100%\";\n this.root.style.minWidth = \"0\";\n this.root.style.minHeight = \"0\";\n this.root.style.overflow = \"hidden\";\n\n this.plot.style.position = \"relative\";\n this.plot.style.gridColumn = \"2\";\n this.plot.style.gridRow = \"1\";\n this.plot.style.minWidth = \"0\";\n this.plot.style.minHeight = \"0\";\n this.plot.style.overflow = \"hidden\";\n\n this.canvas.style.position = \"absolute\";\n this.canvas.style.inset = \"0\";\n this.canvas.style.display = \"block\";\n this.canvas.style.width = \"100%\";\n this.canvas.style.height = \"100%\";\n this.canvas.style.touchAction = \"none\";\n\n this.yAxis.style.position = \"relative\";\n this.yAxis.style.gridColumn = \"1\";\n this.yAxis.style.gridRow = \"1\";\n this.yAxis.style.minWidth = \"0\";\n this.yAxis.style.minHeight = \"0\";\n this.yAxis.style.overflow = \"hidden\";\n this.yAxis.style.pointerEvents = \"none\";\n\n this.xAxis.style.position = \"relative\";\n this.xAxis.style.gridColumn = \"2\";\n this.xAxis.style.gridRow = \"2\";\n this.xAxis.style.minWidth = \"0\";\n this.xAxis.style.minHeight = \"0\";\n this.xAxis.style.overflow = \"hidden\";\n this.xAxis.style.pointerEvents = \"none\";\n\n this.corner.style.gridColumn = \"1\";\n this.corner.style.gridRow = \"2\";\n this.corner.style.minWidth = \"0\";\n this.corner.style.minHeight = \"0\";\n this.corner.style.pointerEvents = \"none\";\n }\n}\n","import type { SeriesConfig, SeriesStyle, Dataset } from \"../core/types.js\";\nimport { SeriesStore } from \"../core/SeriesStore.js\";\nimport { RingBuffer } from \"../core/RingBuffer.js\";\nimport { Renderer } from \"../render/Renderer.js\";\nimport { ReglBackend } from \"../render/ReglBackend.js\";\nimport type { GpuBuffer } from \"../render/types.js\";\nimport { InputController } from \"../interaction/InputController.js\";\nimport { Camera2D } from \"../interaction/Camera2D.js\";\nimport { AxisController } from \"../interaction/AxisController.js\";\nimport type { ViewportPolicy } from \"../interaction/types.js\";\nimport { AxisOverlay } from \"./AxisOverlay.js\";\nimport { ChartLayout } from \"./ChartLayout.js\";\nimport type { AxisPosition, NormalizedAxisConfig } from \"./ChartLayout.js\";\n\nconst RAW_LINE_VERTEX_CAPACITY = 16_384;\nconst AREA_POINT_CAPACITY = RAW_LINE_VERTEX_CAPACITY >> 1;\nconst MINMAX_SEGMENT_CAPACITY = RAW_LINE_VERTEX_CAPACITY >> 1;\nconst FLOATS_PER_MINMAX_SEGMENT_INSTANCE = 3;\nconst GRID_LINE_VERTEX_CAPACITY = 64;\n\nexport interface AxisConfig {\n readonly visible?: boolean;\n readonly position?: AxisPosition;\n}\n\nexport interface ChartOptions {\n readonly viewportPolicy?: ViewportPolicy;\n readonly grid?: boolean;\n readonly gridStyle?: Partial<SeriesStyle>;\n readonly axes?: boolean | { x?: boolean | AxisConfig; y?: boolean | AxisConfig };\n}\n\nexport interface ChartFrameStats {\n fps: number;\n frameMs: number;\n pointsRendered: number;\n drawCalls: number;\n uploadBytes: number;\n renderMode: \"none\" | \"raw\" | \"minmax\" | \"points\" | \"bars\" | \"area\" | \"mixed\";\n}\n\nfunction normalizeAxisConfig(config: boolean | AxisConfig | undefined): NormalizedAxisConfig {\n if (config === false) return { visible: false, position: \"inside\" };\n if (config === true || config === undefined) return { visible: true, position: \"inside\" };\n return {\n visible: config.visible !== false,\n position: config.position ?? \"inside\",\n };\n}\n\nexport class Chart {\n private series: SeriesStore[] = [];\n private camera: Camera2D;\n private axis: AxisController;\n private renderer: Renderer;\n private input: InputController;\n private rawLineBuffer: GpuBuffer;\n private rawLineData: Float32Array;\n private minMaxInstanceBuffer: GpuBuffer;\n private minMaxInstanceData: Float32Array;\n private gridBuffer: GpuBuffer;\n private gridData: Float32Array;\n private gridStyle: SeriesStyle;\n private readonly xTicks: number[] = [];\n private readonly yTicks: number[] = [];\n private axisOverlay: AxisOverlay | null = null;\n private normalizedAxes: { x: NormalizedAxisConfig; y: NormalizedAxisConfig };\n private layout: ChartLayout;\n private stats: ChartFrameStats = {\n fps: 0,\n frameMs: 0,\n pointsRendered: 0,\n drawCalls: 0,\n uploadBytes: 0,\n renderMode: \"none\",\n };\n private resizeObserver: ResizeObserver | null = null;\n private lastFrameAt: number = 0;\n private _rafId: number = 0;\n\n constructor(target: HTMLElement, private readonly options: ChartOptions = {}) {\n const axesOpt = options.axes;\n if (axesOpt === false) {\n this.normalizedAxes = { x: { visible: false, position: \"inside\" }, y: { visible: false, position: \"inside\" } };\n } else if (axesOpt === true || axesOpt === undefined) {\n this.normalizedAxes = { x: { visible: true, position: \"inside\" }, y: { visible: true, position: \"inside\" } };\n } else {\n this.normalizedAxes = {\n x: normalizeAxisConfig(axesOpt.x),\n y: normalizeAxisConfig(axesOpt.y),\n };\n }\n\n this.layout = new ChartLayout(target, this.normalizedAxes);\n this.applyCanvasSize();\n this.camera = new Camera2D();\n this.axis = new AxisController(this.camera);\n this.renderer = new Renderer(new ReglBackend(this.layout.canvas));\n this.input = new InputController(this.layout.canvas, this.camera, options.viewportPolicy);\n this.rawLineData = new Float32Array(RAW_LINE_VERTEX_CAPACITY * 2);\n this.rawLineBuffer = this.renderer.createFloatBuffer(this.rawLineData.length);\n this.minMaxInstanceData = new Float32Array(MINMAX_SEGMENT_CAPACITY * FLOATS_PER_MINMAX_SEGMENT_INSTANCE);\n this.minMaxInstanceBuffer = this.renderer.createFloatBuffer(this.minMaxInstanceData.length);\n this.gridData = new Float32Array(GRID_LINE_VERTEX_CAPACITY * 2);\n this.gridBuffer = this.renderer.createFloatBuffer(this.gridData.length);\n this.gridStyle = {\n color: options.gridStyle?.color ?? [0.22, 0.30, 0.44, 0.45],\n lineWidth: options.gridStyle?.lineWidth ?? 1,\n };\n\n if (this.normalizedAxes.x.visible || this.normalizedAxes.y.visible) {\n this.axisOverlay = new AxisOverlay(this.layout, this.normalizedAxes);\n }\n\n if (typeof ResizeObserver !== \"undefined\") {\n this.resizeObserver = new ResizeObserver(() => this.resize());\n this.resizeObserver.observe(this.layout.plot);\n }\n }\n\n get canvas(): HTMLCanvasElement {\n return this.layout.canvas;\n }\n\n addSeries(config: SeriesConfig, style?: Partial<SeriesStyle>): SeriesStore {\n const dataset: Dataset = config.dataset ?? new RingBuffer(config.capacity);\n const color = style?.color ?? [0.3, 0.6, 1.0, 1.0];\n const s = new SeriesStore(dataset, config, {\n color,\n lineWidth: style?.lineWidth ?? 1,\n pointSize: style?.pointSize ?? 4,\n barWidth: style?.barWidth ?? 0.8,\n baseline: style?.baseline ?? 0,\n fillColor: style?.fillColor ?? [color[0], color[1], color[2], color[3] * 0.25],\n });\n this.series.push(s);\n return s;\n }\n\n removeSeries(series: SeriesStore): boolean {\n const index = this.series.indexOf(series);\n if (index === -1) return false;\n\n this.series.splice(index, 1);\n return true;\n }\n\n setViewport(v: { xMin?: number; xMax?: number; yMin?: number; yMax?: number }): void {\n this.camera.setViewport(v);\n }\n\n resize(dpr: number = globalThis.devicePixelRatio): boolean {\n return this.applyCanvasSize(dpr);\n }\n\n getFrameStats(target: ChartFrameStats = { fps: 0, frameMs: 0, pointsRendered: 0, drawCalls: 0, uploadBytes: 0, renderMode: \"none\" }): ChartFrameStats {\n target.fps = this.stats.fps;\n target.frameMs = this.stats.frameMs;\n target.pointsRendered = this.stats.pointsRendered;\n target.drawCalls = this.stats.drawCalls;\n target.uploadBytes = this.stats.uploadBytes;\n target.renderMode = this.stats.renderMode;\n return target;\n }\n\n start(): void {\n const frame = (): void => {\n this._rafId = requestAnimationFrame(frame);\n this.render();\n };\n this._rafId = requestAnimationFrame(frame);\n }\n\n stop(): void {\n cancelAnimationFrame(this._rafId);\n }\n\n private render(): void {\n const frameStartedAt = performance.now();\n if (this.lastFrameAt > 0) {\n this.stats.fps = 1000 / (frameStartedAt - this.lastFrameAt);\n }\n this.lastFrameAt = frameStartedAt;\n this.stats.pointsRendered = 0;\n this.stats.drawCalls = 0;\n this.stats.uploadBytes = 0;\n this.stats.renderMode = \"none\";\n\n this.options.viewportPolicy?.beforeRender?.(this.camera);\n\n this.renderer.viewport(0, 0, this.canvas.width, this.canvas.height);\n this.renderer.clear(0.08, 0.10, 0.16, 1);\n\n const viewport = this.camera.viewport;\n if (this.options.grid !== false) {\n const gridVertexCount = this.writeGridVertices(viewport);\n if (gridVertexCount > 0) {\n this.renderer.updateFloatBuffer(this.gridBuffer, this.gridData);\n this.renderer.drawLines(this.gridBuffer, gridVertexCount, this.gridStyle, this.camera);\n this.stats.drawCalls++;\n this.stats.uploadBytes += this.gridData.byteLength;\n }\n }\n\n for (const s of this.series) {\n if (!s.visible) continue;\n if (s.config.mode === \"scatter\") {\n this.drawScatterSeries(s, viewport);\n continue;\n }\n if (s.config.mode === \"bar\") {\n this.drawBarSeries(s, viewport);\n continue;\n }\n if (s.config.mode === \"area\") {\n this.drawAreaSeries(s, viewport);\n continue;\n }\n\n const visibleSamples = s.visibleSampleCount(viewport);\n const dense = s.hasLOD && visibleSamples > RAW_LINE_VERTEX_CAPACITY;\n if (dense && this.renderer.supportsInstancedSegments) {\n const segmentCount = s.copyMinMaxInstanced(viewport, this.minMaxInstanceData, this.maxMinMaxSegments());\n if (segmentCount <= 0) continue;\n this.renderer.updateFloatBuffer(this.minMaxInstanceBuffer, this.minMaxInstanceData);\n this.renderer.drawMinMaxSegmentsInstanced(this.minMaxInstanceBuffer, segmentCount, s.style, this.camera);\n this.recordRenderMode(\"minmax\");\n this.stats.pointsRendered += segmentCount * 2;\n this.stats.drawCalls++;\n this.stats.uploadBytes += this.minMaxInstanceData.byteLength;\n continue;\n }\n\n const count = dense\n ? s.copyMinMaxVisible(viewport, this.rawLineData, this.maxMinMaxSegments())\n : s.copyRawVisible(viewport, this.rawLineData, RAW_LINE_VERTEX_CAPACITY);\n if (count < 2) continue;\n this.renderer.updateFloatBuffer(this.rawLineBuffer, this.rawLineData);\n if (dense) {\n this.renderer.drawMinMaxSegments(this.rawLineBuffer, count, s.style, this.camera);\n this.recordRenderMode(\"minmax\");\n } else {\n this.renderer.drawLineStrip(this.rawLineBuffer, count, s.style, this.camera);\n this.recordRenderMode(\"raw\");\n }\n this.stats.pointsRendered += count;\n this.stats.drawCalls++;\n this.stats.uploadBytes += this.rawLineData.byteLength;\n }\n\n this.axisOverlay?.update(this.camera, this.axis);\n\n this.stats.frameMs = performance.now() - frameStartedAt;\n }\n\n dispose(): void {\n this.stop();\n this.resizeObserver?.disconnect();\n this.input.dispose();\n this.axisOverlay?.dispose();\n this.renderer.dispose();\n this.layout.dispose();\n }\n\n private applyCanvasSize(dpr: number = globalThis.devicePixelRatio): boolean {\n const scale = Number.isFinite(dpr) ? Math.max(1, dpr) : 1;\n const width = Math.max(1, Math.floor(this.canvas.clientWidth * scale));\n const height = Math.max(1, Math.floor(this.canvas.clientHeight * scale));\n if (this.canvas.width === width && this.canvas.height === height) return false;\n\n this.canvas.width = width;\n this.canvas.height = height;\n return true;\n }\n\n private drawAreaSeries(\n series: SeriesStore,\n viewport: { xMin: number; xMax: number; yMin: number; yMax: number },\n ): void {\n const baseline = series.style.baseline ?? 0;\n const areaVertexCount = series.copyAreaVisible(viewport, this.rawLineData, AREA_POINT_CAPACITY, baseline);\n if (areaVertexCount < 4) return;\n\n this.renderer.updateFloatBuffer(this.rawLineBuffer, this.rawLineData);\n this.renderer.drawAreaStrip(this.rawLineBuffer, areaVertexCount, series.style, this.camera);\n this.stats.pointsRendered += areaVertexCount;\n this.stats.drawCalls++;\n this.stats.uploadBytes += this.rawLineData.byteLength;\n\n const lineVertexCount = this.uploadRawInstances(series, viewport, AREA_POINT_CAPACITY);\n if (lineVertexCount >= 2) {\n this.renderer.drawLineStrip(this.rawLineBuffer, lineVertexCount, series.style, this.camera);\n this.stats.pointsRendered += lineVertexCount;\n this.stats.drawCalls++;\n }\n\n this.recordRenderMode(\"area\");\n }\n\n private drawScatterSeries(\n series: SeriesStore,\n viewport: { xMin: number; xMax: number; yMin: number; yMax: number },\n ): void {\n if (!this.renderer.supportsInstancedPoints) return;\n const count = this.uploadRawInstances(series, viewport, RAW_LINE_VERTEX_CAPACITY);\n if (count <= 0) return;\n\n this.renderer.drawPointsInstanced(this.rawLineBuffer, count, series.style, this.camera, this.canvas.width, this.canvas.height);\n this.recordInstancedDraw(\"points\", count);\n }\n\n private drawBarSeries(\n series: SeriesStore,\n viewport: { xMin: number; xMax: number; yMin: number; yMax: number },\n ): void {\n if (!this.renderer.supportsInstancedBars) return;\n const count = this.uploadRawInstances(series, viewport, RAW_LINE_VERTEX_CAPACITY);\n if (count <= 0) return;\n\n this.renderer.drawBarsInstanced(this.rawLineBuffer, count, series.style, this.camera);\n this.recordInstancedDraw(\"bars\", count);\n }\n\n private uploadRawInstances(\n series: SeriesStore,\n viewport: { xMin: number; xMax: number; yMin: number; yMax: number },\n maxPoints: number,\n ): number {\n const count = series.copyRawVisible(viewport, this.rawLineData, maxPoints);\n if (count <= 0) return 0;\n\n this.renderer.updateFloatBuffer(this.rawLineBuffer, this.rawLineData);\n this.stats.uploadBytes += this.rawLineData.byteLength;\n return count;\n }\n\n private recordInstancedDraw(mode: \"points\" | \"bars\", count: number): void {\n this.recordRenderMode(mode);\n this.stats.pointsRendered += count;\n this.stats.drawCalls++;\n }\n\n private maxMinMaxSegments(): number {\n return Math.min(this.canvas.width, MINMAX_SEGMENT_CAPACITY);\n }\n\n private writeGridVertices(\n viewport: { xMin: number; xMax: number; yMin: number; yMax: number },\n ): number {\n const plotW = Math.max(1, this.canvas.clientWidth);\n const plotH = Math.max(1, this.canvas.clientHeight);\n this.axis.getXTickValues(plotW, 12, this.xTicks);\n this.axis.getYTickValues(plotH, 8, this.yTicks);\n\n let vertexCount = 0;\n for (const x of this.xTicks) {\n if (vertexCount + 2 > GRID_LINE_VERTEX_CAPACITY) return vertexCount;\n this.gridData[vertexCount * 2] = x;\n this.gridData[vertexCount * 2 + 1] = viewport.yMin;\n vertexCount++;\n this.gridData[vertexCount * 2] = x;\n this.gridData[vertexCount * 2 + 1] = viewport.yMax;\n vertexCount++;\n }\n\n for (const y of this.yTicks) {\n if (vertexCount + 2 > GRID_LINE_VERTEX_CAPACITY) return vertexCount;\n this.gridData[vertexCount * 2] = viewport.xMin;\n this.gridData[vertexCount * 2 + 1] = y;\n vertexCount++;\n this.gridData[vertexCount * 2] = viewport.xMax;\n this.gridData[vertexCount * 2 + 1] = y;\n vertexCount++;\n }\n\n return vertexCount;\n }\n\n private recordRenderMode(mode: \"raw\" | \"minmax\" | \"points\" | \"bars\" | \"area\"): void {\n if (this.stats.renderMode === \"none\") {\n this.stats.renderMode = mode;\n } else if (this.stats.renderMode !== mode) {\n this.stats.renderMode = \"mixed\";\n }\n }\n}\n","import type { Dataset, TimeRange } from \"./types.js\";\n\nexport class StaticDataset implements Dataset {\n constructor(\n private readonly xData: ArrayLike<number>,\n private readonly yData: ArrayLike<number>,\n ) {}\n\n get length(): number {\n return Math.min(this.xData.length, this.yData.length);\n }\n\n get range(): TimeRange | null {\n if (this.length === 0) return null;\n return { start: this.xData[0]!, end: this.xData[this.length - 1]! };\n }\n\n getX(index: number): number {\n this.assertValidIndex(index);\n return this.xData[index]!;\n }\n\n getY(index: number): number {\n this.assertValidIndex(index);\n return this.yData[index]!;\n }\n\n lowerBoundX(x: number): number {\n let lo = 0;\n let hi = this.length;\n while (lo < hi) {\n const mid = lo + ((hi - lo) >> 1);\n if (this.xData[mid]! < x) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n }\n\n upperBoundX(x: number): number {\n let lo = 0;\n let hi = this.length;\n while (lo < hi) {\n const mid = lo + ((hi - lo) >> 1);\n if (this.xData[mid]! <= x) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n }\n\n private assertValidIndex(index: number): void {\n if (!Number.isInteger(index) || index < 0 || index >= this.length) {\n throw new RangeError(`StaticDataset index out of range: ${index}`);\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@ export declare class ReglBackend implements GpuBackend {
|
|
|
6
6
|
private nextProgramId;
|
|
7
7
|
private commandCache;
|
|
8
8
|
private scissorBox;
|
|
9
|
+
readonly capabilities: GpuBackend["capabilities"];
|
|
9
10
|
constructor(canvas: HTMLCanvasElement);
|
|
10
11
|
createBuffer(spec: BufferSpec): GpuBuffer;
|
|
11
12
|
updateBuffer(buffer: GpuBuffer, data: Float32Array | Uint16Array, offset?: number): void;
|
|
@@ -16,6 +17,7 @@ export declare class ReglBackend implements GpuBackend {
|
|
|
16
17
|
viewport(x: number, y: number, w: number, h: number): void;
|
|
17
18
|
destroy(): void;
|
|
18
19
|
private createDrawCommand;
|
|
20
|
+
private resolveAttribute;
|
|
19
21
|
private asReglBuffer;
|
|
20
22
|
private asReglProgram;
|
|
21
23
|
private isReglBuffer;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReglBackend.d.ts","sourceRoot":"","sources":["../../src/render/ReglBackend.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"ReglBackend.d.ts","sourceRoot":"","sources":["../../src/render/ReglBackend.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAA+B,MAAM,YAAY,CAAC;AA8BpI,qBAAa,WAAY,YAAW,UAAU;IAC5C,OAAO,CAAC,EAAE,CAAyB;IACnC,OAAO,CAAC,IAAI,CAAO;IACnB,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,YAAY,CAAuC;IAC3D,OAAO,CAAC,UAAU,CAA+D;IACjF,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAC,cAAc,CAAC,CAAC;gBAEtC,MAAM,EAAE,iBAAiB;IAiCrC,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS;IASzC,YAAY,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,GAAG,WAAW,EAAE,MAAM,GAAE,MAAU,GAAG,IAAI;IAS3F,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU;IAQrD,IAAI,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IAuC1B,OAAO,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI;IAMpC,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAIvD,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAI1D,OAAO,IAAI,IAAI;IAKf,OAAO,CAAC,iBAAiB;IAkCzB,OAAO,CAAC,gBAAgB;IAcxB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,eAAe;CAUxB"}
|
|
@@ -4,17 +4,32 @@ import { SeriesStyle } from '../core/types.js';
|
|
|
4
4
|
export declare class Renderer {
|
|
5
5
|
private backend;
|
|
6
6
|
private readonly lineProgram;
|
|
7
|
+
private readonly segmentProgram;
|
|
8
|
+
private readonly pointProgram;
|
|
9
|
+
private readonly barProgram;
|
|
10
|
+
private readonly segmentSelectBuffer;
|
|
11
|
+
private readonly pointCornerBuffer;
|
|
12
|
+
private readonly barCornerBuffer;
|
|
7
13
|
private readonly scaleUniform;
|
|
8
14
|
private readonly offsetUniform;
|
|
15
|
+
private readonly canvasSizeUniform;
|
|
9
16
|
constructor(backend: GpuBackend);
|
|
17
|
+
get supportsInstancedSegments(): boolean;
|
|
18
|
+
get supportsInstancedPoints(): boolean;
|
|
19
|
+
get supportsInstancedBars(): boolean;
|
|
10
20
|
clear(r: number, g: number, b: number, a: number): void;
|
|
11
21
|
createFloatBuffer(floatCount: number): GpuBuffer;
|
|
12
22
|
updateFloatBuffer(buffer: GpuBuffer, data: Float32Array): void;
|
|
13
23
|
viewport(x: number, y: number, width: number, height: number): void;
|
|
14
24
|
drawLines(positions: GpuBuffer, count: number, style: SeriesStyle, camera: Camera2D): void;
|
|
15
25
|
drawLineStrip(positions: GpuBuffer, count: number, style: SeriesStyle, camera: Camera2D): void;
|
|
16
|
-
private drawLinePrimitive;
|
|
17
26
|
drawMinMaxSegments(positions: GpuBuffer, count: number, style: SeriesStyle, camera: Camera2D): void;
|
|
27
|
+
drawMinMaxSegmentsInstanced(instanceBuffer: GpuBuffer, instanceCount: number, style: SeriesStyle, camera: Camera2D): void;
|
|
28
|
+
drawPointsInstanced(instanceBuffer: GpuBuffer, pointCount: number, style: SeriesStyle, camera: Camera2D, canvasWidth: number, canvasHeight: number): void;
|
|
29
|
+
drawAreaStrip(positions: GpuBuffer, count: number, style: SeriesStyle, camera: Camera2D): void;
|
|
30
|
+
drawBarsInstanced(instanceBuffer: GpuBuffer, barCount: number, style: SeriesStyle, camera: Camera2D): void;
|
|
31
|
+
private drawLinePrimitive;
|
|
32
|
+
private writeCameraUniforms;
|
|
18
33
|
dispose(): void;
|
|
19
34
|
}
|
|
20
35
|
//# sourceMappingURL=Renderer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Renderer.d.ts","sourceRoot":"","sources":["../../src/render/Renderer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"Renderer.d.ts","sourceRoot":"","sources":["../../src/render/Renderer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,KAAK,EAAiB,UAAU,EAAE,SAAS,EAAc,MAAM,YAAY,CAAC;AACnF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AASpD,qBAAa,QAAQ;IAYP,OAAO,CAAC,OAAO;IAX3B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IACzC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAa;IAC5C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAa;IAC1C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAY;IAChD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAY;IAC9C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAY;IAC5C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqC;IAClE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqC;IACnE,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAqC;gBAEnD,OAAO,EAAE,UAAU;IAgBvC,IAAI,yBAAyB,IAAI,OAAO,CAEvC;IAED,IAAI,uBAAuB,IAAI,OAAO,CAErC;IAED,IAAI,qBAAqB,IAAI,OAAO,CAEnC;IAED,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAIvD,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS;IAIhD,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI;IAI9D,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAInE,SAAS,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI;IAI1F,aAAa,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI;IAI9F,kBAAkB,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI;IAInG,2BAA2B,CAAC,cAAc,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI;IAuBzH,mBAAmB,CACjB,cAAc,EAAE,SAAS,EACzB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,QAAQ,EAChB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GACnB,IAAI;IAyBP,aAAa,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,GAAG,IAAI;IAgB9F,iBAAiB,CACf,cAAc,EAAE,SAAS,EACzB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,QAAQ,GACf,IAAI;IAuBP,OAAO,CAAC,iBAAiB;IAgBzB,OAAO,CAAC,mBAAmB;IAO3B,OAAO,IAAI,IAAI;CAGhB"}
|
|
@@ -7,5 +7,13 @@ export declare const ShaderPrograms: {
|
|
|
7
7
|
readonly vert: string;
|
|
8
8
|
readonly frag: string;
|
|
9
9
|
};
|
|
10
|
+
readonly point: {
|
|
11
|
+
readonly vert: string;
|
|
12
|
+
readonly frag: string;
|
|
13
|
+
};
|
|
14
|
+
readonly bar: {
|
|
15
|
+
readonly vert: string;
|
|
16
|
+
readonly frag: string;
|
|
17
|
+
};
|
|
10
18
|
};
|
|
11
19
|
//# sourceMappingURL=ShaderPrograms.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ShaderPrograms.d.ts","sourceRoot":"","sources":["../../src/render/ShaderPrograms.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ShaderPrograms.d.ts","sourceRoot":"","sources":["../../src/render/ShaderPrograms.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;CAKjB,CAAC"}
|
package/dist/render/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type { GpuBackend, GpuBuffer, GpuProgram, GpuResource, BufferSpec, DrawSpec } from './types.js';
|
|
1
|
+
export type { GpuBackend, GpuCapabilities, GpuBuffer, GpuProgram, GpuResource, BufferSpec, AttributeSpec, DrawSpec } from './types.js';
|
|
2
2
|
export { Renderer } from './Renderer.js';
|
|
3
3
|
export { ReglBackend } from './ReglBackend.js';
|
|
4
4
|
export { WebGL2Resources } from './WebGL2Resources.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/render/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/render/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEvI,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
|
package/dist/render/types.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
declare const gpuBufferBrand: unique symbol;
|
|
2
2
|
declare const gpuProgramBrand: unique symbol;
|
|
3
3
|
export interface GpuBackend {
|
|
4
|
+
readonly capabilities: GpuCapabilities;
|
|
4
5
|
createBuffer(spec: BufferSpec): GpuBuffer;
|
|
5
6
|
updateBuffer(buffer: GpuBuffer, data: Float32Array | Uint16Array, offset?: number): void;
|
|
6
7
|
createProgram(vert: string, frag: string): GpuProgram;
|
|
@@ -10,6 +11,9 @@ export interface GpuBackend {
|
|
|
10
11
|
viewport(x: number, y: number, w: number, h: number): void;
|
|
11
12
|
destroy(): void;
|
|
12
13
|
}
|
|
14
|
+
export interface GpuCapabilities {
|
|
15
|
+
readonly instancing: boolean;
|
|
16
|
+
}
|
|
13
17
|
export interface BufferSpec {
|
|
14
18
|
readonly usage: "static" | "dynamic" | "stream";
|
|
15
19
|
readonly type: "float" | "element";
|
|
@@ -25,13 +29,20 @@ export interface GpuProgram {
|
|
|
25
29
|
}
|
|
26
30
|
export type GpuResource = GpuBuffer | GpuProgram;
|
|
27
31
|
export type UniformValue = number | boolean | readonly number[] | Float32Array;
|
|
32
|
+
export interface AttributeSpec {
|
|
33
|
+
readonly buffer: GpuBuffer;
|
|
34
|
+
readonly divisor: number;
|
|
35
|
+
readonly stride?: number;
|
|
36
|
+
readonly offset?: number;
|
|
37
|
+
readonly size?: number;
|
|
38
|
+
}
|
|
28
39
|
export interface DrawSpec {
|
|
29
40
|
readonly program: GpuProgram;
|
|
30
41
|
readonly primitive: "lines" | "line_strip" | "triangles" | "triangle_strip";
|
|
31
42
|
readonly count: number;
|
|
32
43
|
readonly instances?: number;
|
|
33
44
|
readonly uniforms: Readonly<Record<string, UniformValue>>;
|
|
34
|
-
readonly attributes: Readonly<Record<string, GpuBuffer>>;
|
|
45
|
+
readonly attributes: Readonly<Record<string, GpuBuffer | AttributeSpec>>;
|
|
35
46
|
readonly elements?: GpuBuffer;
|
|
36
47
|
}
|
|
37
48
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/render/types.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,cAAc,EAAE,OAAO,MAAM,CAAC;AAC5C,OAAO,CAAC,MAAM,eAAe,EAAE,OAAO,MAAM,CAAC;AAE7C,MAAM,WAAW,UAAU;IACzB,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,CAAC;IAC1C,YAAY,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,GAAG,WAAW,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzF,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;IACtD,IAAI,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC3B,OAAO,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAC;IACrC,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxD,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3D,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;IAChD,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,CAAC,cAAc,CAAC,EAAE,IAAI,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,CAAC,eAAe,CAAC,EAAE,IAAI,CAAC;CAClC;AAED,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,UAAU,CAAC;AAEjD,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,MAAM,EAAE,GAAG,YAAY,CAAC;AAE/E,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,OAAO,GAAG,YAAY,GAAG,WAAW,GAAG,gBAAgB,CAAC;IAC5E,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;IAC1D,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/render/types.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,cAAc,EAAE,OAAO,MAAM,CAAC;AAC5C,OAAO,CAAC,MAAM,eAAe,EAAE,OAAO,MAAM,CAAC;AAE7C,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,YAAY,EAAE,eAAe,CAAC;IACvC,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,CAAC;IAC1C,YAAY,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,GAAG,WAAW,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzF,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;IACtD,IAAI,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC3B,OAAO,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI,CAAC;IACrC,KAAK,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxD,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3D,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;IAChD,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,CAAC,cAAc,CAAC,EAAE,IAAI,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,CAAC,eAAe,CAAC,EAAE,IAAI,CAAC;CAClC;AAED,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,UAAU,CAAC;AAEjD,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,MAAM,EAAE,GAAG,YAAY,CAAC;AAE/E,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,OAAO,GAAG,YAAY,GAAG,WAAW,GAAG,gBAAgB,CAAC;IAC5E,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;IAC1D,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,GAAG,aAAa,CAAC,CAAC,CAAC;IACzE,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC;CAC/B"}
|