@mui/x-charts-premium 9.0.3 → 9.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/BarChartPremium/BarChartPremium.js +2 -1183
- package/BarChartPremium/BarChartPremium.mjs +2 -1183
- package/BarChartPremium/RangeBar/FocusedRangeBar.js +3 -0
- package/BarChartPremium/RangeBar/FocusedRangeBar.mjs +3 -0
- package/BarChartPremium/RangeBar/seriesConfig/seriesProcessor.js +2 -0
- package/BarChartPremium/RangeBar/seriesConfig/seriesProcessor.mjs +2 -0
- package/CHANGELOG.md +220 -0
- package/CandlestickChart/CandlestickChart.d.mts +2 -2
- package/CandlestickChart/CandlestickChart.d.ts +2 -2
- package/CandlestickChart/CandlestickChart.js +2 -1183
- package/CandlestickChart/CandlestickChart.mjs +2 -1183
- package/CandlestickChart/CandlestickWebGLProgram.d.mts +6 -11
- package/CandlestickChart/CandlestickWebGLProgram.d.ts +6 -11
- package/CandlestickChart/CandlestickWebGLProgram.js +136 -121
- package/CandlestickChart/CandlestickWebGLProgram.mjs +137 -122
- package/CandlestickChart/useCandlestickPlotData.d.mts +2 -2
- package/CandlestickChart/useCandlestickPlotData.d.ts +2 -2
- package/CandlestickChart/useCandlestickPlotData.js +121 -61
- package/CandlestickChart/useCandlestickPlotData.mjs +122 -61
- package/ChartsAxisHighlightValue/index.d.mts +1 -0
- package/ChartsAxisHighlightValue/index.d.ts +1 -0
- package/ChartsAxisHighlightValue/index.js +16 -0
- package/ChartsAxisHighlightValue/index.mjs +2 -0
- package/ChartsDataProviderPremium/ChartsDataProviderPremium.js +2 -2
- package/ChartsDataProviderPremium/ChartsDataProviderPremium.mjs +2 -2
- package/ChartsRadialAxisHighlight/index.d.mts +1 -0
- package/ChartsRadialAxisHighlight/index.d.ts +1 -0
- package/ChartsRadialAxisHighlight/index.js +16 -0
- package/ChartsRadialAxisHighlight/index.mjs +2 -0
- package/ChartsRadialDataProviderPremium/ChartsRadialDataProviderPremium.js +2 -2
- package/ChartsRadialDataProviderPremium/ChartsRadialDataProviderPremium.mjs +2 -2
- package/HeatmapPremium/HeatmapPremium.js +2 -155
- package/HeatmapPremium/HeatmapPremium.mjs +2 -155
- package/HeatmapPremium/webgl/HeatmapWebGLPlot.js +19 -112
- package/HeatmapPremium/webgl/HeatmapWebGLPlot.mjs +19 -111
- package/HeatmapPremium/webgl/HeatmapWebGLProgram.d.mts +24 -0
- package/HeatmapPremium/webgl/HeatmapWebGLProgram.d.ts +24 -0
- package/HeatmapPremium/webgl/HeatmapWebGLProgram.js +132 -0
- package/HeatmapPremium/webgl/HeatmapWebGLProgram.mjs +125 -0
- package/HeatmapPremium/webgl/shaders.d.mts +1 -1
- package/HeatmapPremium/webgl/shaders.d.ts +1 -1
- package/HeatmapPremium/webgl/shaders.js +1 -1
- package/HeatmapPremium/webgl/shaders.mjs +1 -1
- package/HeatmapPremium/webgl/useHeatmapPlotData.d.mts +3 -3
- package/HeatmapPremium/webgl/useHeatmapPlotData.d.ts +3 -3
- package/HeatmapPremium/webgl/useHeatmapPlotData.js +78 -26
- package/HeatmapPremium/webgl/useHeatmapPlotData.mjs +80 -26
- package/LICENSE +3 -1
- package/RadialBarChart/RadialBarChart.d.mts +60 -0
- package/RadialBarChart/RadialBarChart.d.ts +60 -0
- package/RadialBarChart/RadialBarChart.js +298 -0
- package/RadialBarChart/RadialBarChart.mjs +292 -0
- package/RadialBarChart/RadialBarChart.plugins.d.mts +4 -0
- package/RadialBarChart/RadialBarChart.plugins.d.ts +4 -0
- package/RadialBarChart/RadialBarChart.plugins.js +9 -0
- package/RadialBarChart/RadialBarChart.plugins.mjs +3 -0
- package/RadialBarChart/RadialBarElement.d.mts +16 -0
- package/RadialBarChart/RadialBarElement.d.ts +16 -0
- package/RadialBarChart/RadialBarElement.js +54 -0
- package/RadialBarChart/RadialBarElement.mjs +48 -0
- package/RadialBarChart/RadialBarPlot.d.mts +21 -0
- package/RadialBarChart/RadialBarPlot.d.ts +21 -0
- package/RadialBarChart/RadialBarPlot.js +85 -0
- package/RadialBarChart/RadialBarPlot.mjs +79 -0
- package/RadialBarChart/index.d.mts +3 -0
- package/RadialBarChart/index.d.ts +3 -0
- package/RadialBarChart/index.js +39 -0
- package/RadialBarChart/index.mjs +3 -0
- package/RadialBarChart/radialBarClasses.d.mts +15 -0
- package/RadialBarChart/radialBarClasses.d.ts +15 -0
- package/RadialBarChart/radialBarClasses.js +26 -0
- package/RadialBarChart/radialBarClasses.mjs +18 -0
- package/RadialBarChart/seriesConfig/seriesProcessor.js +4 -0
- package/RadialBarChart/seriesConfig/seriesProcessor.mjs +4 -0
- package/RadialBarChart/useRadialBarChartProps.d.mts +28 -0
- package/RadialBarChart/useRadialBarChartProps.d.ts +28 -0
- package/RadialBarChart/useRadialBarChartProps.js +100 -0
- package/RadialBarChart/useRadialBarChartProps.mjs +93 -0
- package/RadialBarChart/useRadialBarPlotData.d.mts +23 -0
- package/RadialBarChart/useRadialBarPlotData.d.ts +23 -0
- package/RadialBarChart/useRadialBarPlotData.js +94 -0
- package/RadialBarChart/useRadialBarPlotData.mjs +87 -0
- package/RadialLineChart/RadialArea.js +13 -1
- package/RadialLineChart/RadialArea.mjs +13 -1
- package/RadialLineChart/RadialLine.js +13 -1
- package/RadialLineChart/RadialLine.mjs +13 -1
- package/RadialLineChart/RadialLineChart.d.mts +11 -3
- package/RadialLineChart/RadialLineChart.d.ts +11 -3
- package/RadialLineChart/RadialLineChart.js +24 -673
- package/RadialLineChart/RadialLineChart.mjs +24 -673
- package/RadialLineChart/RadialLineHighlightElement.d.mts +15 -0
- package/RadialLineChart/RadialLineHighlightElement.d.ts +15 -0
- package/RadialLineChart/RadialLineHighlightElement.js +46 -0
- package/RadialLineChart/RadialLineHighlightElement.mjs +39 -0
- package/RadialLineChart/RadialLineHighlightPlot.d.mts +23 -0
- package/RadialLineChart/RadialLineHighlightPlot.d.ts +23 -0
- package/RadialLineChart/RadialLineHighlightPlot.js +92 -0
- package/RadialLineChart/RadialLineHighlightPlot.mjs +86 -0
- package/RadialLineChart/RadialMarkPlot.js +32 -3
- package/RadialLineChart/RadialMarkPlot.mjs +32 -3
- package/RadialLineChart/index.d.mts +3 -1
- package/RadialLineChart/index.d.ts +3 -1
- package/RadialLineChart/index.js +22 -0
- package/RadialLineChart/index.mjs +3 -1
- package/RadialLineChart/radialLineClasses.d.mts +3 -1
- package/RadialLineChart/radialLineClasses.d.ts +3 -1
- package/RadialLineChart/radialLineClasses.js +2 -1
- package/RadialLineChart/radialLineClasses.mjs +2 -1
- package/RadialLineChart/seriesConfig/getItemAtPosition.d.mts +6 -0
- package/RadialLineChart/seriesConfig/getItemAtPosition.d.ts +6 -0
- package/RadialLineChart/seriesConfig/getItemAtPosition.js +353 -0
- package/RadialLineChart/seriesConfig/getItemAtPosition.mjs +348 -0
- package/RadialLineChart/seriesConfig/getSeriesWithDefaultValues.js +2 -1
- package/RadialLineChart/seriesConfig/getSeriesWithDefaultValues.mjs +2 -1
- package/RadialLineChart/seriesConfig/index.js +2 -1
- package/RadialLineChart/seriesConfig/index.mjs +2 -1
- package/RadialLineChart/seriesConfig/seriesProcessor.js +4 -0
- package/RadialLineChart/seriesConfig/seriesProcessor.mjs +4 -0
- package/RadialLineChart/useRadialLineChartProps.d.mts +2 -0
- package/RadialLineChart/useRadialLineChartProps.d.ts +2 -0
- package/RadialLineChart/useRadialLineChartProps.js +16 -8
- package/RadialLineChart/useRadialLineChartProps.mjs +16 -8
- package/RadialLineChart/useRadialLinePlotData.d.mts +3 -1
- package/RadialLineChart/useRadialLinePlotData.d.ts +3 -1
- package/RadialLineChart/useRadialLinePlotData.js +5 -1
- package/RadialLineChart/useRadialLinePlotData.mjs +6 -2
- package/ScatterChartPremium/ScatterChartPremium.d.mts +25 -0
- package/ScatterChartPremium/ScatterChartPremium.d.ts +25 -0
- package/ScatterChartPremium/ScatterChartPremium.js +507 -0
- package/ScatterChartPremium/ScatterChartPremium.mjs +501 -0
- package/ScatterChartPremium/ScatterChartPremium.plugins.d.mts +3 -0
- package/ScatterChartPremium/ScatterChartPremium.plugins.d.ts +3 -0
- package/ScatterChartPremium/ScatterChartPremium.plugins.js +8 -0
- package/ScatterChartPremium/ScatterChartPremium.plugins.mjs +2 -0
- package/ScatterChartPremium/ScatterPlotPremium.d.mts +14 -0
- package/ScatterChartPremium/ScatterPlotPremium.d.ts +14 -0
- package/ScatterChartPremium/ScatterPlotPremium.js +28 -0
- package/ScatterChartPremium/ScatterPlotPremium.mjs +21 -0
- package/ScatterChartPremium/index.d.mts +3 -0
- package/ScatterChartPremium/index.d.ts +3 -0
- package/ScatterChartPremium/index.js +26 -0
- package/ScatterChartPremium/index.mjs +3 -0
- package/ScatterChartPremium/webgl/ScatterWebGLPlot.d.mts +4 -0
- package/ScatterChartPremium/webgl/ScatterWebGLPlot.d.ts +4 -0
- package/ScatterChartPremium/webgl/ScatterWebGLPlot.js +70 -0
- package/ScatterChartPremium/webgl/ScatterWebGLPlot.mjs +65 -0
- package/ScatterChartPremium/webgl/ScatterWebGLProgram.d.mts +18 -0
- package/ScatterChartPremium/webgl/ScatterWebGLProgram.d.ts +18 -0
- package/ScatterChartPremium/webgl/ScatterWebGLProgram.js +129 -0
- package/ScatterChartPremium/webgl/ScatterWebGLProgram.mjs +122 -0
- package/ScatterChartPremium/webgl/shaders.d.mts +2 -0
- package/ScatterChartPremium/webgl/shaders.d.ts +2 -0
- package/ScatterChartPremium/webgl/shaders.js +57 -0
- package/ScatterChartPremium/webgl/shaders.mjs +51 -0
- package/ScatterChartPremium/webgl/useScatterWebGLPlotData.d.mts +7 -0
- package/ScatterChartPremium/webgl/useScatterWebGLPlotData.d.ts +7 -0
- package/ScatterChartPremium/webgl/useScatterWebGLPlotData.js +140 -0
- package/ScatterChartPremium/webgl/useScatterWebGLPlotData.mjs +134 -0
- package/index.d.mts +3 -1
- package/index.d.ts +3 -1
- package/index.js +25 -1
- package/index.mjs +4 -2
- package/internals/index.d.mts +1 -0
- package/internals/index.d.ts +1 -0
- package/internals/index.js +13 -0
- package/internals/index.mjs +1 -0
- package/models/seriesType/radialLine.d.mts +7 -1
- package/models/seriesType/radialLine.d.ts +7 -1
- package/package.json +185 -115
- package/plugins/selectors/useChartCandlestickPosition.selectors.d.mts +1 -1
- package/plugins/selectors/useChartCandlestickPosition.selectors.d.ts +1 -1
- package/utils/webgl/parseColor.d.mts +2 -1
- package/utils/webgl/parseColor.d.ts +2 -1
- package/utils/webgl/parseColor.js +8 -7
- package/utils/webgl/parseColor.mjs +8 -7
- package/utils/webgl/utils.d.mts +13 -0
- package/utils/webgl/utils.d.ts +13 -0
- package/utils/webgl/utils.js +29 -0
- package/utils/webgl/utils.mjs +27 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
'use client';
|
|
3
|
+
|
|
4
|
+
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.ScatterWebGLPlot = ScatterWebGLPlot;
|
|
9
|
+
var React = _interopRequireWildcard(require("react"));
|
|
10
|
+
var _hooks = require("@mui/x-charts/hooks");
|
|
11
|
+
var _ChartsWebGLContext = require("../../ChartsWebGLLayer/ChartsWebGLContext");
|
|
12
|
+
var _ScatterWebGLProgram = require("./ScatterWebGLProgram");
|
|
13
|
+
var _useScatterWebGLPlotData = require("./useScatterWebGLPlotData");
|
|
14
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
15
|
+
/**
|
|
16
|
+
* @ignore - Internal component used for rendering the scatter plot using WebGL. Not exported from the package.
|
|
17
|
+
*/
|
|
18
|
+
function ScatterWebGLPlot() {
|
|
19
|
+
const layer = (0, _ChartsWebGLContext.useWebGLLayer)();
|
|
20
|
+
const seriesData = (0, _hooks.useScatterSeriesContext)();
|
|
21
|
+
const hasVisibleSeries = React.useMemo(() => {
|
|
22
|
+
if (!seriesData) {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
return seriesData.seriesOrder.some(id => !seriesData.series[id].hidden);
|
|
26
|
+
}, [seriesData]);
|
|
27
|
+
if (!layer || !hasVisibleSeries) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(ScatterWebGLPlotImpl, {
|
|
31
|
+
gl: layer.gl,
|
|
32
|
+
registerDraw: layer.registerDraw,
|
|
33
|
+
requestRender: layer.requestRender
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
function ScatterWebGLPlotImpl(props) {
|
|
37
|
+
const {
|
|
38
|
+
gl,
|
|
39
|
+
registerDraw,
|
|
40
|
+
requestRender
|
|
41
|
+
} = props;
|
|
42
|
+
const drawingArea = (0, _hooks.useDrawingArea)();
|
|
43
|
+
const [program, setProgram] = React.useState(null);
|
|
44
|
+
React.useEffect(() => {
|
|
45
|
+
const prog = new _ScatterWebGLProgram.ScatterWebGLProgram(gl);
|
|
46
|
+
setProgram(prog);
|
|
47
|
+
return () => {
|
|
48
|
+
prog.dispose();
|
|
49
|
+
};
|
|
50
|
+
}, [gl]);
|
|
51
|
+
const plotData = (0, _useScatterWebGLPlotData.useScatterWebGLPlotData)();
|
|
52
|
+
const drawRef = React.useRef(null);
|
|
53
|
+
React.useEffect(() => {
|
|
54
|
+
drawRef.current = () => {
|
|
55
|
+
program?.render(plotData);
|
|
56
|
+
};
|
|
57
|
+
}, [program, plotData]);
|
|
58
|
+
React.useEffect(() => {
|
|
59
|
+
return registerDraw(drawRef);
|
|
60
|
+
}, [registerDraw]);
|
|
61
|
+
React.useEffect(() => {
|
|
62
|
+
program?.setResolution(drawingArea.width, drawingArea.height);
|
|
63
|
+
requestRender();
|
|
64
|
+
}, [drawingArea.height, drawingArea.width, program, requestRender]);
|
|
65
|
+
React.useEffect(() => {
|
|
66
|
+
program?.plot(plotData);
|
|
67
|
+
requestRender();
|
|
68
|
+
}, [plotData, program, requestRender]);
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { useDrawingArea, useScatterSeriesContext } from '@mui/x-charts/hooks';
|
|
5
|
+
import { useWebGLLayer } from "../../ChartsWebGLLayer/ChartsWebGLContext.mjs";
|
|
6
|
+
import { ScatterWebGLProgram } from "./ScatterWebGLProgram.mjs";
|
|
7
|
+
import { useScatterWebGLPlotData } from "./useScatterWebGLPlotData.mjs";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* @ignore - Internal component used for rendering the scatter plot using WebGL. Not exported from the package.
|
|
11
|
+
*/
|
|
12
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
13
|
+
export function ScatterWebGLPlot() {
|
|
14
|
+
const layer = useWebGLLayer();
|
|
15
|
+
const seriesData = useScatterSeriesContext();
|
|
16
|
+
const hasVisibleSeries = React.useMemo(() => {
|
|
17
|
+
if (!seriesData) {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
return seriesData.seriesOrder.some(id => !seriesData.series[id].hidden);
|
|
21
|
+
}, [seriesData]);
|
|
22
|
+
if (!layer || !hasVisibleSeries) {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
return /*#__PURE__*/_jsx(ScatterWebGLPlotImpl, {
|
|
26
|
+
gl: layer.gl,
|
|
27
|
+
registerDraw: layer.registerDraw,
|
|
28
|
+
requestRender: layer.requestRender
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
function ScatterWebGLPlotImpl(props) {
|
|
32
|
+
const {
|
|
33
|
+
gl,
|
|
34
|
+
registerDraw,
|
|
35
|
+
requestRender
|
|
36
|
+
} = props;
|
|
37
|
+
const drawingArea = useDrawingArea();
|
|
38
|
+
const [program, setProgram] = React.useState(null);
|
|
39
|
+
React.useEffect(() => {
|
|
40
|
+
const prog = new ScatterWebGLProgram(gl);
|
|
41
|
+
setProgram(prog);
|
|
42
|
+
return () => {
|
|
43
|
+
prog.dispose();
|
|
44
|
+
};
|
|
45
|
+
}, [gl]);
|
|
46
|
+
const plotData = useScatterWebGLPlotData();
|
|
47
|
+
const drawRef = React.useRef(null);
|
|
48
|
+
React.useEffect(() => {
|
|
49
|
+
drawRef.current = () => {
|
|
50
|
+
program?.render(plotData);
|
|
51
|
+
};
|
|
52
|
+
}, [program, plotData]);
|
|
53
|
+
React.useEffect(() => {
|
|
54
|
+
return registerDraw(drawRef);
|
|
55
|
+
}, [registerDraw]);
|
|
56
|
+
React.useEffect(() => {
|
|
57
|
+
program?.setResolution(drawingArea.width, drawingArea.height);
|
|
58
|
+
requestRender();
|
|
59
|
+
}, [drawingArea.height, drawingArea.width, program, requestRender]);
|
|
60
|
+
React.useEffect(() => {
|
|
61
|
+
program?.plot(plotData);
|
|
62
|
+
requestRender();
|
|
63
|
+
}, [plotData, program, requestRender]);
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type ScatterWebGLPlotData } from "./useScatterWebGLPlotData.mjs";
|
|
2
|
+
export declare class ScatterWebGLProgram {
|
|
3
|
+
private gl;
|
|
4
|
+
private readonly shaders;
|
|
5
|
+
private readonly quadBuffer;
|
|
6
|
+
private readonly program;
|
|
7
|
+
private readonly vao;
|
|
8
|
+
private readonly centers;
|
|
9
|
+
private readonly sizes;
|
|
10
|
+
private readonly colors;
|
|
11
|
+
constructor(gl: WebGL2RenderingContext);
|
|
12
|
+
setResolution(width: number, height: number): void;
|
|
13
|
+
plot(plotData: ScatterWebGLPlotData): void;
|
|
14
|
+
render(plotData: ScatterWebGLPlotData): void;
|
|
15
|
+
dispose(): void;
|
|
16
|
+
private setupInstancedAttribute;
|
|
17
|
+
private uploadBuffer;
|
|
18
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type ScatterWebGLPlotData } from "./useScatterWebGLPlotData.js";
|
|
2
|
+
export declare class ScatterWebGLProgram {
|
|
3
|
+
private gl;
|
|
4
|
+
private readonly shaders;
|
|
5
|
+
private readonly quadBuffer;
|
|
6
|
+
private readonly program;
|
|
7
|
+
private readonly vao;
|
|
8
|
+
private readonly centers;
|
|
9
|
+
private readonly sizes;
|
|
10
|
+
private readonly colors;
|
|
11
|
+
constructor(gl: WebGL2RenderingContext);
|
|
12
|
+
setResolution(width: number, height: number): void;
|
|
13
|
+
plot(plotData: ScatterWebGLPlotData): void;
|
|
14
|
+
render(plotData: ScatterWebGLPlotData): void;
|
|
15
|
+
dispose(): void;
|
|
16
|
+
private setupInstancedAttribute;
|
|
17
|
+
private uploadBuffer;
|
|
18
|
+
}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.ScatterWebGLProgram = void 0;
|
|
7
|
+
var _utils = require("../../utils/webgl/utils");
|
|
8
|
+
var _shaders = require("./shaders");
|
|
9
|
+
const QUAD_VERTICES = new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1]);
|
|
10
|
+
class ScatterWebGLProgram {
|
|
11
|
+
shaders = [];
|
|
12
|
+
constructor(gl) {
|
|
13
|
+
this.gl = gl;
|
|
14
|
+
gl.enable(gl.BLEND);
|
|
15
|
+
gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
|
|
16
|
+
this.quadBuffer = gl.createBuffer();
|
|
17
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, this.quadBuffer);
|
|
18
|
+
gl.bufferData(gl.ARRAY_BUFFER, QUAD_VERTICES, gl.STATIC_DRAW);
|
|
19
|
+
const prog = initializeProgram(gl, _shaders.scatterVertexShader, _shaders.scatterFragmentShader);
|
|
20
|
+
this.program = prog.program;
|
|
21
|
+
this.shaders.push(prog.vertexShader, prog.fragmentShader);
|
|
22
|
+
this.vao = gl.createVertexArray();
|
|
23
|
+
gl.bindVertexArray(this.vao);
|
|
24
|
+
|
|
25
|
+
// a_position references the shared quad; bind it once while the VAO is active.
|
|
26
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, this.quadBuffer);
|
|
27
|
+
const aPosition = gl.getAttribLocation(this.program, 'a_position');
|
|
28
|
+
gl.enableVertexAttribArray(aPosition);
|
|
29
|
+
gl.vertexAttribPointer(aPosition, 2, gl.FLOAT, false, 0, 0);
|
|
30
|
+
this.centers = this.setupInstancedAttribute('a_center', 2, gl.FLOAT, false);
|
|
31
|
+
this.sizes = this.setupInstancedAttribute('a_size', 1, gl.FLOAT, false);
|
|
32
|
+
// Colors come in as Uint8 [0, 255]; normalized=true makes the GPU read them back as vec4 in [0, 1].
|
|
33
|
+
this.colors = this.setupInstancedAttribute('a_color', 4, gl.UNSIGNED_BYTE, true);
|
|
34
|
+
gl.bindVertexArray(null);
|
|
35
|
+
}
|
|
36
|
+
setResolution(width, height) {
|
|
37
|
+
const {
|
|
38
|
+
gl
|
|
39
|
+
} = this;
|
|
40
|
+
gl.useProgram(this.program);
|
|
41
|
+
gl.uniform2f(gl.getUniformLocation(this.program, 'u_resolution'), width, height);
|
|
42
|
+
}
|
|
43
|
+
plot(plotData) {
|
|
44
|
+
this.uploadBuffer(this.centers, plotData.centers);
|
|
45
|
+
this.uploadBuffer(this.sizes, plotData.sizes);
|
|
46
|
+
this.uploadBuffer(this.colors, plotData.colors);
|
|
47
|
+
}
|
|
48
|
+
render(plotData) {
|
|
49
|
+
if (plotData.pointCount === 0) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const {
|
|
53
|
+
gl
|
|
54
|
+
} = this;
|
|
55
|
+
gl.useProgram(this.program);
|
|
56
|
+
(0, _utils.logWebGLErrors)(gl);
|
|
57
|
+
gl.bindVertexArray(this.vao);
|
|
58
|
+
gl.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, 4, plotData.pointCount);
|
|
59
|
+
gl.bindVertexArray(null);
|
|
60
|
+
}
|
|
61
|
+
dispose() {
|
|
62
|
+
const {
|
|
63
|
+
gl
|
|
64
|
+
} = this;
|
|
65
|
+
gl.deleteProgram(this.program);
|
|
66
|
+
gl.deleteVertexArray(this.vao);
|
|
67
|
+
gl.deleteBuffer(this.centers.buffer);
|
|
68
|
+
gl.deleteBuffer(this.sizes.buffer);
|
|
69
|
+
gl.deleteBuffer(this.colors.buffer);
|
|
70
|
+
gl.deleteBuffer(this.quadBuffer);
|
|
71
|
+
this.shaders.forEach(shader => gl.deleteShader(shader));
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Assumes the owning VAO (Vertex Array Object) is already bound.
|
|
75
|
+
setupInstancedAttribute(name, size, glType, normalized) {
|
|
76
|
+
const {
|
|
77
|
+
gl,
|
|
78
|
+
program
|
|
79
|
+
} = this;
|
|
80
|
+
const buffer = gl.createBuffer();
|
|
81
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
|
|
82
|
+
const location = gl.getAttribLocation(program, name);
|
|
83
|
+
gl.enableVertexAttribArray(location);
|
|
84
|
+
gl.vertexAttribPointer(location, size, glType, normalized, 0, 0);
|
|
85
|
+
gl.vertexAttribDivisor(location, 1);
|
|
86
|
+
return {
|
|
87
|
+
buffer,
|
|
88
|
+
size,
|
|
89
|
+
glType,
|
|
90
|
+
capacityBytes: 0,
|
|
91
|
+
lastUploaded: null
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
uploadBuffer(target, data) {
|
|
95
|
+
if (target.lastUploaded === data) {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
const {
|
|
99
|
+
gl
|
|
100
|
+
} = this;
|
|
101
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, target.buffer);
|
|
102
|
+
if (data.byteLength <= target.capacityBytes) {
|
|
103
|
+
gl.bufferSubData(gl.ARRAY_BUFFER, 0, data);
|
|
104
|
+
} else {
|
|
105
|
+
gl.bufferData(gl.ARRAY_BUFFER, data, gl.DYNAMIC_DRAW);
|
|
106
|
+
target.capacityBytes = data.byteLength;
|
|
107
|
+
}
|
|
108
|
+
target.lastUploaded = data;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
exports.ScatterWebGLProgram = ScatterWebGLProgram;
|
|
112
|
+
function initializeProgram(gl, vertexShaderSource, fragmentShaderSource) {
|
|
113
|
+
const program = gl.createProgram();
|
|
114
|
+
const vertexShader = (0, _utils.compileShader)(gl, vertexShaderSource, gl.VERTEX_SHADER);
|
|
115
|
+
const fragmentShader = (0, _utils.compileShader)(gl, fragmentShaderSource, gl.FRAGMENT_SHADER);
|
|
116
|
+
gl.attachShader(program, vertexShader);
|
|
117
|
+
gl.attachShader(program, fragmentShader);
|
|
118
|
+
gl.linkProgram(program);
|
|
119
|
+
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
|
|
120
|
+
console.error(`Program linking failed: ${gl.getProgramInfoLog(program)}`);
|
|
121
|
+
console.error(`Vertex shader info-log: ${gl.getShaderInfoLog(vertexShader)}`);
|
|
122
|
+
console.error(`Fragment shader info-log: ${gl.getShaderInfoLog(fragmentShader)}`);
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
program,
|
|
126
|
+
vertexShader,
|
|
127
|
+
fragmentShader
|
|
128
|
+
};
|
|
129
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { compileShader, logWebGLErrors } from "../../utils/webgl/utils.mjs";
|
|
2
|
+
import { scatterVertexShader, scatterFragmentShader } from "./shaders.mjs";
|
|
3
|
+
const QUAD_VERTICES = new Float32Array([-1, -1, 1, -1, -1, 1, 1, 1]);
|
|
4
|
+
export class ScatterWebGLProgram {
|
|
5
|
+
shaders = [];
|
|
6
|
+
constructor(gl) {
|
|
7
|
+
this.gl = gl;
|
|
8
|
+
gl.enable(gl.BLEND);
|
|
9
|
+
gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);
|
|
10
|
+
this.quadBuffer = gl.createBuffer();
|
|
11
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, this.quadBuffer);
|
|
12
|
+
gl.bufferData(gl.ARRAY_BUFFER, QUAD_VERTICES, gl.STATIC_DRAW);
|
|
13
|
+
const prog = initializeProgram(gl, scatterVertexShader, scatterFragmentShader);
|
|
14
|
+
this.program = prog.program;
|
|
15
|
+
this.shaders.push(prog.vertexShader, prog.fragmentShader);
|
|
16
|
+
this.vao = gl.createVertexArray();
|
|
17
|
+
gl.bindVertexArray(this.vao);
|
|
18
|
+
|
|
19
|
+
// a_position references the shared quad; bind it once while the VAO is active.
|
|
20
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, this.quadBuffer);
|
|
21
|
+
const aPosition = gl.getAttribLocation(this.program, 'a_position');
|
|
22
|
+
gl.enableVertexAttribArray(aPosition);
|
|
23
|
+
gl.vertexAttribPointer(aPosition, 2, gl.FLOAT, false, 0, 0);
|
|
24
|
+
this.centers = this.setupInstancedAttribute('a_center', 2, gl.FLOAT, false);
|
|
25
|
+
this.sizes = this.setupInstancedAttribute('a_size', 1, gl.FLOAT, false);
|
|
26
|
+
// Colors come in as Uint8 [0, 255]; normalized=true makes the GPU read them back as vec4 in [0, 1].
|
|
27
|
+
this.colors = this.setupInstancedAttribute('a_color', 4, gl.UNSIGNED_BYTE, true);
|
|
28
|
+
gl.bindVertexArray(null);
|
|
29
|
+
}
|
|
30
|
+
setResolution(width, height) {
|
|
31
|
+
const {
|
|
32
|
+
gl
|
|
33
|
+
} = this;
|
|
34
|
+
gl.useProgram(this.program);
|
|
35
|
+
gl.uniform2f(gl.getUniformLocation(this.program, 'u_resolution'), width, height);
|
|
36
|
+
}
|
|
37
|
+
plot(plotData) {
|
|
38
|
+
this.uploadBuffer(this.centers, plotData.centers);
|
|
39
|
+
this.uploadBuffer(this.sizes, plotData.sizes);
|
|
40
|
+
this.uploadBuffer(this.colors, plotData.colors);
|
|
41
|
+
}
|
|
42
|
+
render(plotData) {
|
|
43
|
+
if (plotData.pointCount === 0) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const {
|
|
47
|
+
gl
|
|
48
|
+
} = this;
|
|
49
|
+
gl.useProgram(this.program);
|
|
50
|
+
logWebGLErrors(gl);
|
|
51
|
+
gl.bindVertexArray(this.vao);
|
|
52
|
+
gl.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, 4, plotData.pointCount);
|
|
53
|
+
gl.bindVertexArray(null);
|
|
54
|
+
}
|
|
55
|
+
dispose() {
|
|
56
|
+
const {
|
|
57
|
+
gl
|
|
58
|
+
} = this;
|
|
59
|
+
gl.deleteProgram(this.program);
|
|
60
|
+
gl.deleteVertexArray(this.vao);
|
|
61
|
+
gl.deleteBuffer(this.centers.buffer);
|
|
62
|
+
gl.deleteBuffer(this.sizes.buffer);
|
|
63
|
+
gl.deleteBuffer(this.colors.buffer);
|
|
64
|
+
gl.deleteBuffer(this.quadBuffer);
|
|
65
|
+
this.shaders.forEach(shader => gl.deleteShader(shader));
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Assumes the owning VAO (Vertex Array Object) is already bound.
|
|
69
|
+
setupInstancedAttribute(name, size, glType, normalized) {
|
|
70
|
+
const {
|
|
71
|
+
gl,
|
|
72
|
+
program
|
|
73
|
+
} = this;
|
|
74
|
+
const buffer = gl.createBuffer();
|
|
75
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
|
|
76
|
+
const location = gl.getAttribLocation(program, name);
|
|
77
|
+
gl.enableVertexAttribArray(location);
|
|
78
|
+
gl.vertexAttribPointer(location, size, glType, normalized, 0, 0);
|
|
79
|
+
gl.vertexAttribDivisor(location, 1);
|
|
80
|
+
return {
|
|
81
|
+
buffer,
|
|
82
|
+
size,
|
|
83
|
+
glType,
|
|
84
|
+
capacityBytes: 0,
|
|
85
|
+
lastUploaded: null
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
uploadBuffer(target, data) {
|
|
89
|
+
if (target.lastUploaded === data) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const {
|
|
93
|
+
gl
|
|
94
|
+
} = this;
|
|
95
|
+
gl.bindBuffer(gl.ARRAY_BUFFER, target.buffer);
|
|
96
|
+
if (data.byteLength <= target.capacityBytes) {
|
|
97
|
+
gl.bufferSubData(gl.ARRAY_BUFFER, 0, data);
|
|
98
|
+
} else {
|
|
99
|
+
gl.bufferData(gl.ARRAY_BUFFER, data, gl.DYNAMIC_DRAW);
|
|
100
|
+
target.capacityBytes = data.byteLength;
|
|
101
|
+
}
|
|
102
|
+
target.lastUploaded = data;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
function initializeProgram(gl, vertexShaderSource, fragmentShaderSource) {
|
|
106
|
+
const program = gl.createProgram();
|
|
107
|
+
const vertexShader = compileShader(gl, vertexShaderSource, gl.VERTEX_SHADER);
|
|
108
|
+
const fragmentShader = compileShader(gl, fragmentShaderSource, gl.FRAGMENT_SHADER);
|
|
109
|
+
gl.attachShader(program, vertexShader);
|
|
110
|
+
gl.attachShader(program, fragmentShader);
|
|
111
|
+
gl.linkProgram(program);
|
|
112
|
+
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
|
|
113
|
+
console.error(`Program linking failed: ${gl.getProgramInfoLog(program)}`);
|
|
114
|
+
console.error(`Vertex shader info-log: ${gl.getShaderInfoLog(vertexShader)}`);
|
|
115
|
+
console.error(`Fragment shader info-log: ${gl.getShaderInfoLog(fragmentShader)}`);
|
|
116
|
+
}
|
|
117
|
+
return {
|
|
118
|
+
program,
|
|
119
|
+
vertexShader,
|
|
120
|
+
fragmentShader
|
|
121
|
+
};
|
|
122
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export declare const scatterVertexShader = "\n precision highp float;\n precision mediump int;\n\n attribute vec2 a_position;\n attribute highp vec2 a_center;\n attribute float a_size;\n attribute mediump vec4 a_color;\n\n varying mediump vec4 v_color;\n varying mediump vec2 v_offset;\n varying mediump float v_radius;\n\n uniform highp vec2 u_resolution;\n\n void main() {\n float radius = a_size * 0.5;\n vec2 point = a_center + a_position * radius;\n\n vec2 clipSpace = (point / u_resolution) * 2.0 - 1.0;\n gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);\n\n v_color = a_color;\n v_offset = a_position;\n v_radius = radius;\n }\n";
|
|
2
|
+
export declare const scatterFragmentShader = "\n precision mediump float;\n\n varying mediump vec4 v_color;\n varying mediump vec2 v_offset;\n varying mediump float v_radius;\n\n void main() {\n float dist = length(v_offset);\n if (dist > 1.0) {\n discard;\n }\n // Simple antialiased edge: fade the last pixel of the radius.\n float edge = max(0.0, 1.0 - 1.0 / max(v_radius, 1.0));\n float alpha = 1.0 - smoothstep(edge, 1.0, dist);\n gl_FragColor = vec4(v_color.rgb, v_color.a * alpha);\n }\n";
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export declare const scatterVertexShader = "\n precision highp float;\n precision mediump int;\n\n attribute vec2 a_position;\n attribute highp vec2 a_center;\n attribute float a_size;\n attribute mediump vec4 a_color;\n\n varying mediump vec4 v_color;\n varying mediump vec2 v_offset;\n varying mediump float v_radius;\n\n uniform highp vec2 u_resolution;\n\n void main() {\n float radius = a_size * 0.5;\n vec2 point = a_center + a_position * radius;\n\n vec2 clipSpace = (point / u_resolution) * 2.0 - 1.0;\n gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);\n\n v_color = a_color;\n v_offset = a_position;\n v_radius = radius;\n }\n";
|
|
2
|
+
export declare const scatterFragmentShader = "\n precision mediump float;\n\n varying mediump vec4 v_color;\n varying mediump vec2 v_offset;\n varying mediump float v_radius;\n\n void main() {\n float dist = length(v_offset);\n if (dist > 1.0) {\n discard;\n }\n // Simple antialiased edge: fade the last pixel of the radius.\n float edge = max(0.0, 1.0 - 1.0 / max(v_radius, 1.0));\n float alpha = 1.0 - smoothstep(edge, 1.0, dist);\n gl_FragColor = vec4(v_color.rgb, v_color.a * alpha);\n }\n";
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.scatterVertexShader = exports.scatterFragmentShader = void 0;
|
|
7
|
+
// language=Glsl
|
|
8
|
+
// Positions and resolution carry drawing-area pixel coordinates that can
|
|
9
|
+
// exceed the ~1024 range where mediump loses sub-pixel precision on mobile
|
|
10
|
+
// GPUs. They must be highp. v_color stays lowp/mediump to save interpolants.
|
|
11
|
+
const scatterVertexShader = exports.scatterVertexShader = /* glsl */`
|
|
12
|
+
precision highp float;
|
|
13
|
+
precision mediump int;
|
|
14
|
+
|
|
15
|
+
attribute vec2 a_position;
|
|
16
|
+
attribute highp vec2 a_center;
|
|
17
|
+
attribute float a_size;
|
|
18
|
+
attribute mediump vec4 a_color;
|
|
19
|
+
|
|
20
|
+
varying mediump vec4 v_color;
|
|
21
|
+
varying mediump vec2 v_offset;
|
|
22
|
+
varying mediump float v_radius;
|
|
23
|
+
|
|
24
|
+
uniform highp vec2 u_resolution;
|
|
25
|
+
|
|
26
|
+
void main() {
|
|
27
|
+
float radius = a_size * 0.5;
|
|
28
|
+
vec2 point = a_center + a_position * radius;
|
|
29
|
+
|
|
30
|
+
vec2 clipSpace = (point / u_resolution) * 2.0 - 1.0;
|
|
31
|
+
gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);
|
|
32
|
+
|
|
33
|
+
v_color = a_color;
|
|
34
|
+
v_offset = a_position;
|
|
35
|
+
v_radius = radius;
|
|
36
|
+
}
|
|
37
|
+
`;
|
|
38
|
+
|
|
39
|
+
// language=Glsl
|
|
40
|
+
const scatterFragmentShader = exports.scatterFragmentShader = /* glsl */`
|
|
41
|
+
precision mediump float;
|
|
42
|
+
|
|
43
|
+
varying mediump vec4 v_color;
|
|
44
|
+
varying mediump vec2 v_offset;
|
|
45
|
+
varying mediump float v_radius;
|
|
46
|
+
|
|
47
|
+
void main() {
|
|
48
|
+
float dist = length(v_offset);
|
|
49
|
+
if (dist > 1.0) {
|
|
50
|
+
discard;
|
|
51
|
+
}
|
|
52
|
+
// Simple antialiased edge: fade the last pixel of the radius.
|
|
53
|
+
float edge = max(0.0, 1.0 - 1.0 / max(v_radius, 1.0));
|
|
54
|
+
float alpha = 1.0 - smoothstep(edge, 1.0, dist);
|
|
55
|
+
gl_FragColor = vec4(v_color.rgb, v_color.a * alpha);
|
|
56
|
+
}
|
|
57
|
+
`;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// language=Glsl
|
|
2
|
+
// Positions and resolution carry drawing-area pixel coordinates that can
|
|
3
|
+
// exceed the ~1024 range where mediump loses sub-pixel precision on mobile
|
|
4
|
+
// GPUs. They must be highp. v_color stays lowp/mediump to save interpolants.
|
|
5
|
+
export const scatterVertexShader = /* glsl */`
|
|
6
|
+
precision highp float;
|
|
7
|
+
precision mediump int;
|
|
8
|
+
|
|
9
|
+
attribute vec2 a_position;
|
|
10
|
+
attribute highp vec2 a_center;
|
|
11
|
+
attribute float a_size;
|
|
12
|
+
attribute mediump vec4 a_color;
|
|
13
|
+
|
|
14
|
+
varying mediump vec4 v_color;
|
|
15
|
+
varying mediump vec2 v_offset;
|
|
16
|
+
varying mediump float v_radius;
|
|
17
|
+
|
|
18
|
+
uniform highp vec2 u_resolution;
|
|
19
|
+
|
|
20
|
+
void main() {
|
|
21
|
+
float radius = a_size * 0.5;
|
|
22
|
+
vec2 point = a_center + a_position * radius;
|
|
23
|
+
|
|
24
|
+
vec2 clipSpace = (point / u_resolution) * 2.0 - 1.0;
|
|
25
|
+
gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);
|
|
26
|
+
|
|
27
|
+
v_color = a_color;
|
|
28
|
+
v_offset = a_position;
|
|
29
|
+
v_radius = radius;
|
|
30
|
+
}
|
|
31
|
+
`;
|
|
32
|
+
|
|
33
|
+
// language=Glsl
|
|
34
|
+
export const scatterFragmentShader = /* glsl */`
|
|
35
|
+
precision mediump float;
|
|
36
|
+
|
|
37
|
+
varying mediump vec4 v_color;
|
|
38
|
+
varying mediump vec2 v_offset;
|
|
39
|
+
varying mediump float v_radius;
|
|
40
|
+
|
|
41
|
+
void main() {
|
|
42
|
+
float dist = length(v_offset);
|
|
43
|
+
if (dist > 1.0) {
|
|
44
|
+
discard;
|
|
45
|
+
}
|
|
46
|
+
// Simple antialiased edge: fade the last pixel of the radius.
|
|
47
|
+
float edge = max(0.0, 1.0 - 1.0 / max(v_radius, 1.0));
|
|
48
|
+
float alpha = 1.0 - smoothstep(edge, 1.0, dist);
|
|
49
|
+
gl_FragColor = vec4(v_color.rgb, v_color.a * alpha);
|
|
50
|
+
}
|
|
51
|
+
`;
|