minerva-design 1.4.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +9 -0
- package/README.md +21 -21
- package/custom-elements.json +4047 -1703
- package/dist/angular/fesm2022/minerva-angular.mjs +1436 -5
- package/dist/angular/fesm2022/minerva-angular.mjs.map +1 -1
- package/dist/angular/types/minerva-angular.d.ts +573 -4
- package/dist/charts/canvas.d.cts +2 -2
- package/dist/charts/canvas.d.ts +2 -2
- package/dist/charts/core.cjs +1 -1
- package/dist/charts/core.d.cts +6 -4
- package/dist/charts/core.d.ts +6 -4
- package/dist/charts/core.js +24 -16
- package/dist/charts/engine/axis.cjs +1 -1
- package/dist/charts/engine/axis.cjs.map +1 -1
- package/dist/charts/engine/axis.js +42 -19
- package/dist/charts/engine/axis.js.map +1 -1
- package/dist/charts/engine/canvas.cjs +1 -1
- package/dist/charts/engine/canvas.cjs.map +1 -1
- package/dist/charts/engine/canvas.js +154 -127
- package/dist/charts/engine/canvas.js.map +1 -1
- package/dist/charts/engine/chart.cjs +1 -1
- package/dist/charts/engine/chart.cjs.map +1 -1
- package/dist/charts/engine/chart.js +365 -251
- package/dist/charts/engine/chart.js.map +1 -1
- package/dist/charts/engine/color.cjs +1 -1
- package/dist/charts/engine/color.cjs.map +1 -1
- package/dist/charts/engine/color.d.cts +18 -0
- package/dist/charts/engine/color.d.ts +18 -0
- package/dist/charts/engine/color.js +48 -2
- package/dist/charts/engine/color.js.map +1 -1
- package/dist/charts/engine/controller.cjs +2 -2
- package/dist/charts/engine/controller.cjs.map +1 -1
- package/dist/charts/engine/controller.d.cts +32 -1
- package/dist/charts/engine/controller.d.ts +32 -1
- package/dist/charts/engine/controller.js +310 -263
- package/dist/charts/engine/controller.js.map +1 -1
- package/dist/charts/engine/data.cjs +1 -1
- package/dist/charts/engine/data.cjs.map +1 -1
- package/dist/charts/engine/data.d.cts +3 -1
- package/dist/charts/engine/data.d.ts +3 -1
- package/dist/charts/engine/data.js +6 -4
- package/dist/charts/engine/data.js.map +1 -1
- package/dist/charts/engine/defaults.cjs +2 -0
- package/dist/charts/engine/defaults.cjs.map +1 -0
- package/dist/charts/engine/defaults.d.cts +20 -0
- package/dist/charts/engine/defaults.d.ts +20 -0
- package/dist/charts/engine/defaults.js +35 -0
- package/dist/charts/engine/defaults.js.map +1 -0
- package/dist/charts/engine/format.cjs +1 -1
- package/dist/charts/engine/format.cjs.map +1 -1
- package/dist/charts/engine/format.d.cts +6 -0
- package/dist/charts/engine/format.d.ts +6 -0
- package/dist/charts/engine/format.js +15 -2
- package/dist/charts/engine/format.js.map +1 -1
- package/dist/charts/engine/graph/chart.cjs +2 -0
- package/dist/charts/engine/graph/chart.cjs.map +1 -0
- package/dist/charts/engine/graph/chart.d.cts +3 -0
- package/dist/charts/engine/graph/chart.d.ts +3 -0
- package/dist/charts/engine/graph/chart.js +1565 -0
- package/dist/charts/engine/graph/chart.js.map +1 -0
- package/dist/charts/engine/graph/circular.cjs +2 -0
- package/dist/charts/engine/graph/circular.cjs.map +1 -0
- package/dist/charts/engine/graph/circular.d.cts +16 -0
- package/dist/charts/engine/graph/circular.d.ts +16 -0
- package/dist/charts/engine/graph/circular.js +62 -0
- package/dist/charts/engine/graph/circular.js.map +1 -0
- package/dist/charts/engine/graph/dag.cjs +2 -0
- package/dist/charts/engine/graph/dag.cjs.map +1 -0
- package/dist/charts/engine/graph/dag.d.cts +34 -0
- package/dist/charts/engine/graph/dag.d.ts +34 -0
- package/dist/charts/engine/graph/dag.js +314 -0
- package/dist/charts/engine/graph/dag.js.map +1 -0
- package/dist/charts/engine/graph/dom.cjs +2 -0
- package/dist/charts/engine/graph/dom.cjs.map +1 -0
- package/dist/charts/engine/graph/dom.d.cts +23 -0
- package/dist/charts/engine/graph/dom.d.ts +23 -0
- package/dist/charts/engine/graph/dom.js +158 -0
- package/dist/charts/engine/graph/dom.js.map +1 -0
- package/dist/charts/engine/graph/force.cjs +2 -0
- package/dist/charts/engine/graph/force.cjs.map +1 -0
- package/dist/charts/engine/graph/force.d.cts +67 -0
- package/dist/charts/engine/graph/force.d.ts +67 -0
- package/dist/charts/engine/graph/force.js +325 -0
- package/dist/charts/engine/graph/force.js.map +1 -0
- package/dist/charts/engine/graph/geometry.cjs +2 -0
- package/dist/charts/engine/graph/geometry.cjs.map +1 -0
- package/dist/charts/engine/graph/geometry.d.cts +37 -0
- package/dist/charts/engine/graph/geometry.d.ts +37 -0
- package/dist/charts/engine/graph/geometry.js +144 -0
- package/dist/charts/engine/graph/geometry.js.map +1 -0
- package/dist/charts/engine/graph/index.cjs +1 -0
- package/dist/charts/engine/graph/index.d.cts +6 -0
- package/dist/charts/engine/graph/index.d.ts +6 -0
- package/dist/charts/engine/graph/index.js +6 -0
- package/dist/charts/engine/graph/labels.cjs +2 -0
- package/dist/charts/engine/graph/labels.cjs.map +1 -0
- package/dist/charts/engine/graph/labels.d.cts +12 -0
- package/dist/charts/engine/graph/labels.d.ts +12 -0
- package/dist/charts/engine/graph/labels.js +128 -0
- package/dist/charts/engine/graph/labels.js.map +1 -0
- package/dist/charts/engine/graph/model.cjs +2 -0
- package/dist/charts/engine/graph/model.cjs.map +1 -0
- package/dist/charts/engine/graph/model.d.cts +43 -0
- package/dist/charts/engine/graph/model.d.ts +43 -0
- package/dist/charts/engine/graph/model.js +88 -0
- package/dist/charts/engine/graph/model.js.map +1 -0
- package/dist/charts/engine/graph/sizing.cjs +2 -0
- package/dist/charts/engine/graph/sizing.cjs.map +1 -0
- package/dist/charts/engine/graph/sizing.d.cts +33 -0
- package/dist/charts/engine/graph/sizing.d.ts +33 -0
- package/dist/charts/engine/graph/sizing.js +60 -0
- package/dist/charts/engine/graph/sizing.js.map +1 -0
- package/dist/charts/engine/graph/tree.cjs +2 -0
- package/dist/charts/engine/graph/tree.cjs.map +1 -0
- package/dist/charts/engine/graph/tree.d.cts +30 -0
- package/dist/charts/engine/graph/tree.d.ts +30 -0
- package/dist/charts/engine/graph/tree.js +218 -0
- package/dist/charts/engine/graph/tree.js.map +1 -0
- package/dist/charts/engine/graph/types.d.cts +626 -0
- package/dist/charts/engine/graph/types.d.ts +626 -0
- package/dist/charts/engine/graph/worker.cjs +46 -0
- package/dist/charts/engine/graph/worker.cjs.map +1 -0
- package/dist/charts/engine/graph/worker.d.cts +36 -0
- package/dist/charts/engine/graph/worker.d.ts +36 -0
- package/dist/charts/engine/graph/worker.js +129 -0
- package/dist/charts/engine/graph/worker.js.map +1 -0
- package/dist/charts/engine/items.cjs +1 -1
- package/dist/charts/engine/items.cjs.map +1 -1
- package/dist/charts/engine/items.d.cts +15 -2
- package/dist/charts/engine/items.d.ts +15 -2
- package/dist/charts/engine/items.js +131 -112
- package/dist/charts/engine/items.js.map +1 -1
- package/dist/charts/engine/labels.cjs +1 -1
- package/dist/charts/engine/labels.cjs.map +1 -1
- package/dist/charts/engine/labels.js +28 -4
- package/dist/charts/engine/labels.js.map +1 -1
- package/dist/charts/engine/layout.cjs +1 -1
- package/dist/charts/engine/layout.cjs.map +1 -1
- package/dist/charts/engine/layout.d.cts +9 -0
- package/dist/charts/engine/layout.d.ts +9 -0
- package/dist/charts/engine/layout.js +11 -2
- package/dist/charts/engine/layout.js.map +1 -1
- package/dist/charts/engine/model.cjs +1 -1
- package/dist/charts/engine/model.cjs.map +1 -1
- package/dist/charts/engine/model.d.cts +40 -3
- package/dist/charts/engine/model.d.ts +40 -3
- package/dist/charts/engine/model.js +246 -165
- package/dist/charts/engine/model.js.map +1 -1
- package/dist/charts/engine/orderbook/format.cjs +1 -1
- package/dist/charts/engine/orderbook/format.cjs.map +1 -1
- package/dist/charts/engine/orderbook/format.d.cts +3 -2
- package/dist/charts/engine/orderbook/format.d.ts +3 -2
- package/dist/charts/engine/orderbook/format.js +5 -5
- package/dist/charts/engine/orderbook/format.js.map +1 -1
- package/dist/charts/engine/orderbook/heatmap.cjs +1 -1
- package/dist/charts/engine/orderbook/heatmap.cjs.map +1 -1
- package/dist/charts/engine/orderbook/heatmap.js +527 -408
- package/dist/charts/engine/orderbook/heatmap.js.map +1 -1
- package/dist/charts/engine/orderbook/layout.cjs +2 -0
- package/dist/charts/engine/orderbook/layout.cjs.map +1 -0
- package/dist/charts/engine/orderbook/layout.d.cts +37 -0
- package/dist/charts/engine/orderbook/layout.d.ts +37 -0
- package/dist/charts/engine/orderbook/layout.js +70 -0
- package/dist/charts/engine/orderbook/layout.js.map +1 -0
- package/dist/charts/engine/orderbook/tape.cjs +1 -1
- package/dist/charts/engine/orderbook/tape.cjs.map +1 -1
- package/dist/charts/engine/orderbook/tape.js +1 -1
- package/dist/charts/engine/orderbook/tape.js.map +1 -1
- package/dist/charts/engine/orderbook/types.d.cts +18 -2
- package/dist/charts/engine/orderbook/types.d.ts +18 -2
- package/dist/charts/engine/overlay.cjs +1 -1
- package/dist/charts/engine/overlay.cjs.map +1 -1
- package/dist/charts/engine/overlay.d.cts +10 -0
- package/dist/charts/engine/overlay.d.ts +10 -0
- package/dist/charts/engine/overlay.js +6 -0
- package/dist/charts/engine/overlay.js.map +1 -1
- package/dist/charts/engine/presets.cjs +2 -2
- package/dist/charts/engine/presets.cjs.map +1 -1
- package/dist/charts/engine/presets.d.cts +25 -3
- package/dist/charts/engine/presets.d.ts +25 -3
- package/dist/charts/engine/presets.js +115 -101
- package/dist/charts/engine/presets.js.map +1 -1
- package/dist/charts/engine/renderers/detect.cjs +1 -1
- package/dist/charts/engine/renderers/detect.cjs.map +1 -1
- package/dist/charts/engine/renderers/detect.d.cts +2 -1
- package/dist/charts/engine/renderers/detect.d.ts +2 -1
- package/dist/charts/engine/renderers/detect.js +23 -21
- package/dist/charts/engine/renderers/detect.js.map +1 -1
- package/dist/charts/engine/scene.cjs +1 -1
- package/dist/charts/engine/scene.cjs.map +1 -1
- package/dist/charts/engine/scene.d.cts +57 -4
- package/dist/charts/engine/scene.d.ts +57 -4
- package/dist/charts/engine/scene.js +335 -182
- package/dist/charts/engine/scene.js.map +1 -1
- package/dist/charts/engine/shapes/bullet.cjs +1 -1
- package/dist/charts/engine/shapes/bullet.cjs.map +1 -1
- package/dist/charts/engine/shapes/bullet.js +110 -110
- package/dist/charts/engine/shapes/bullet.js.map +1 -1
- package/dist/charts/engine/shapes/chart.cjs +1 -1
- package/dist/charts/engine/shapes/chart.cjs.map +1 -1
- package/dist/charts/engine/shapes/chart.js +4 -1
- package/dist/charts/engine/shapes/chart.js.map +1 -1
- package/dist/charts/engine/shapes/chord.cjs +2 -0
- package/dist/charts/engine/shapes/chord.cjs.map +1 -0
- package/dist/charts/engine/shapes/chord.d.cts +18 -0
- package/dist/charts/engine/shapes/chord.d.ts +18 -0
- package/dist/charts/engine/shapes/chord.js +414 -0
- package/dist/charts/engine/shapes/chord.js.map +1 -0
- package/dist/charts/engine/shapes/draw.cjs +1 -1
- package/dist/charts/engine/shapes/draw.cjs.map +1 -1
- package/dist/charts/engine/shapes/draw.d.cts +5 -1
- package/dist/charts/engine/shapes/draw.d.ts +5 -1
- package/dist/charts/engine/shapes/draw.js +47 -17
- package/dist/charts/engine/shapes/draw.js.map +1 -1
- package/dist/charts/engine/shapes/hit.cjs +1 -1
- package/dist/charts/engine/shapes/hit.cjs.map +1 -1
- package/dist/charts/engine/shapes/hit.d.cts +3 -1
- package/dist/charts/engine/shapes/hit.d.ts +3 -1
- package/dist/charts/engine/shapes/hit.js +75 -46
- package/dist/charts/engine/shapes/hit.js.map +1 -1
- package/dist/charts/engine/shapes/index.d.cts +3 -2
- package/dist/charts/engine/shapes/index.d.ts +3 -2
- package/dist/charts/engine/shapes/labels.cjs +1 -1
- package/dist/charts/engine/shapes/labels.cjs.map +1 -1
- package/dist/charts/engine/shapes/labels.js +12 -4
- package/dist/charts/engine/shapes/labels.js.map +1 -1
- package/dist/charts/engine/shapes/layout.cjs +2 -2
- package/dist/charts/engine/shapes/layout.cjs.map +1 -1
- package/dist/charts/engine/shapes/layout.d.cts +3 -1
- package/dist/charts/engine/shapes/layout.d.ts +3 -1
- package/dist/charts/engine/shapes/layout.js +106 -78
- package/dist/charts/engine/shapes/layout.js.map +1 -1
- package/dist/charts/engine/shapes/scene.cjs +1 -1
- package/dist/charts/engine/shapes/scene.cjs.map +1 -1
- package/dist/charts/engine/shapes/scene.d.cts +33 -3
- package/dist/charts/engine/shapes/scene.d.ts +33 -3
- package/dist/charts/engine/shapes/scene.js +62 -19
- package/dist/charts/engine/shapes/scene.js.map +1 -1
- package/dist/charts/engine/shapes/types.d.cts +119 -8
- package/dist/charts/engine/shapes/types.d.ts +119 -8
- package/dist/charts/engine/signature.cjs +1 -1
- package/dist/charts/engine/signature.cjs.map +1 -1
- package/dist/charts/engine/signature.js +1 -1
- package/dist/charts/engine/signature.js.map +1 -1
- package/dist/charts/engine/three-d/canvas2d.cjs +1 -1
- package/dist/charts/engine/three-d/canvas2d.cjs.map +1 -1
- package/dist/charts/engine/three-d/canvas2d.d.cts +5 -2
- package/dist/charts/engine/three-d/canvas2d.d.ts +5 -2
- package/dist/charts/engine/three-d/canvas2d.js +89 -65
- package/dist/charts/engine/three-d/canvas2d.js.map +1 -1
- package/dist/charts/engine/three-d/detect.cjs +1 -1
- package/dist/charts/engine/three-d/detect.cjs.map +1 -1
- package/dist/charts/engine/three-d/detect.d.cts +3 -2
- package/dist/charts/engine/three-d/detect.d.ts +3 -2
- package/dist/charts/engine/three-d/detect.js +22 -20
- package/dist/charts/engine/three-d/detect.js.map +1 -1
- package/dist/charts/engine/three-d/geometry.cjs +1 -1
- package/dist/charts/engine/three-d/geometry.cjs.map +1 -1
- package/dist/charts/engine/three-d/geometry.d.cts +6 -0
- package/dist/charts/engine/three-d/geometry.d.ts +6 -0
- package/dist/charts/engine/three-d/geometry.js +106 -90
- package/dist/charts/engine/three-d/geometry.js.map +1 -1
- package/dist/charts/engine/three-d/model.cjs +1 -1
- package/dist/charts/engine/three-d/model.cjs.map +1 -1
- package/dist/charts/engine/three-d/model.d.cts +2 -0
- package/dist/charts/engine/three-d/model.d.ts +2 -0
- package/dist/charts/engine/three-d/model.js +2 -0
- package/dist/charts/engine/three-d/model.js.map +1 -1
- package/dist/charts/engine/three-d/overlay.cjs +1 -1
- package/dist/charts/engine/three-d/overlay.cjs.map +1 -1
- package/dist/charts/engine/three-d/overlay.js +43 -36
- package/dist/charts/engine/three-d/overlay.js.map +1 -1
- package/dist/charts/engine/three-d/render-types.cjs +1 -1
- package/dist/charts/engine/three-d/render-types.cjs.map +1 -1
- package/dist/charts/engine/three-d/render-types.d.cts +24 -3
- package/dist/charts/engine/three-d/render-types.d.ts +24 -3
- package/dist/charts/engine/three-d/render-types.js +6 -7
- package/dist/charts/engine/three-d/render-types.js.map +1 -1
- package/dist/charts/engine/three-d/shaders.cjs +63 -28
- package/dist/charts/engine/three-d/shaders.cjs.map +1 -1
- package/dist/charts/engine/three-d/shaders.d.cts +2 -3
- package/dist/charts/engine/three-d/shaders.d.ts +2 -3
- package/dist/charts/engine/three-d/shaders.js +41 -22
- package/dist/charts/engine/three-d/shaders.js.map +1 -1
- package/dist/charts/engine/three-d/sort.cjs +1 -1
- package/dist/charts/engine/three-d/sort.cjs.map +1 -1
- package/dist/charts/engine/three-d/sort.d.cts +15 -4
- package/dist/charts/engine/three-d/sort.d.ts +15 -4
- package/dist/charts/engine/three-d/sort.js +117 -43
- package/dist/charts/engine/three-d/sort.js.map +1 -1
- package/dist/charts/engine/three-d/types.d.cts +27 -0
- package/dist/charts/engine/three-d/types.d.ts +27 -0
- package/dist/charts/engine/three-d/webgl.cjs +1 -1
- package/dist/charts/engine/three-d/webgl.cjs.map +1 -1
- package/dist/charts/engine/three-d/webgl.js +15 -13
- package/dist/charts/engine/three-d/webgl.js.map +1 -1
- package/dist/charts/engine/three-d/webgpu.cjs +1 -1
- package/dist/charts/engine/three-d/webgpu.cjs.map +1 -1
- package/dist/charts/engine/three-d/webgpu.js +50 -39
- package/dist/charts/engine/three-d/webgpu.js.map +1 -1
- package/dist/charts/engine/trading/chart.cjs +1 -1
- package/dist/charts/engine/trading/chart.cjs.map +1 -1
- package/dist/charts/engine/trading/chart.d.cts +10 -0
- package/dist/charts/engine/trading/chart.d.ts +10 -0
- package/dist/charts/engine/trading/chart.js +1475 -776
- package/dist/charts/engine/trading/chart.js.map +1 -1
- package/dist/charts/engine/trading/drawings.cjs +2 -1
- package/dist/charts/engine/trading/drawings.cjs.map +1 -1
- package/dist/charts/engine/trading/drawings.d.cts +47 -9
- package/dist/charts/engine/trading/drawings.d.ts +47 -9
- package/dist/charts/engine/trading/drawings.js +338 -75
- package/dist/charts/engine/trading/drawings.js.map +1 -1
- package/dist/charts/engine/trading/format.cjs +1 -1
- package/dist/charts/engine/trading/format.cjs.map +1 -1
- package/dist/charts/engine/trading/format.d.cts +13 -0
- package/dist/charts/engine/trading/format.d.ts +13 -0
- package/dist/charts/engine/trading/format.js +51 -19
- package/dist/charts/engine/trading/format.js.map +1 -1
- package/dist/charts/engine/trading/index.cjs +1 -1
- package/dist/charts/engine/trading/index.d.cts +2 -1
- package/dist/charts/engine/trading/index.d.ts +2 -1
- package/dist/charts/engine/trading/index.js +4 -3
- package/dist/charts/engine/trading/indicators.cjs +1 -1
- package/dist/charts/engine/trading/indicators.cjs.map +1 -1
- package/dist/charts/engine/trading/indicators.d.cts +180 -10
- package/dist/charts/engine/trading/indicators.d.ts +180 -10
- package/dist/charts/engine/trading/indicators.js +449 -173
- package/dist/charts/engine/trading/indicators.js.map +1 -1
- package/dist/charts/engine/trading/labels.cjs +1 -1
- package/dist/charts/engine/trading/labels.cjs.map +1 -1
- package/dist/charts/engine/trading/labels.js +84 -4
- package/dist/charts/engine/trading/labels.js.map +1 -1
- package/dist/charts/engine/trading/store.cjs +1 -1
- package/dist/charts/engine/trading/store.cjs.map +1 -1
- package/dist/charts/engine/trading/store.d.cts +21 -0
- package/dist/charts/engine/trading/store.d.ts +21 -0
- package/dist/charts/engine/trading/store.js +22 -1
- package/dist/charts/engine/trading/store.js.map +1 -1
- package/dist/charts/engine/trading/studies.cjs +1 -1
- package/dist/charts/engine/trading/studies.cjs.map +1 -1
- package/dist/charts/engine/trading/studies.d.cts +41 -8
- package/dist/charts/engine/trading/studies.d.ts +41 -8
- package/dist/charts/engine/trading/studies.js +349 -93
- package/dist/charts/engine/trading/studies.js.map +1 -1
- package/dist/charts/engine/trading/sync.cjs +2 -0
- package/dist/charts/engine/trading/sync.cjs.map +1 -0
- package/dist/charts/engine/trading/sync.d.cts +8 -0
- package/dist/charts/engine/trading/sync.d.ts +8 -0
- package/dist/charts/engine/trading/sync.js +25 -0
- package/dist/charts/engine/trading/sync.js.map +1 -0
- package/dist/charts/engine/trading/types.d.cts +484 -9
- package/dist/charts/engine/trading/types.d.ts +484 -9
- package/dist/charts/engine/types.d.cts +82 -8
- package/dist/charts/engine/types.d.ts +82 -8
- package/dist/charts/index.cjs +1 -1
- package/dist/charts/index.d.cts +3 -2
- package/dist/charts/index.d.ts +3 -2
- package/dist/charts/index.js +30 -22
- package/dist/charts/react/charts.cjs +1 -1
- package/dist/charts/react/charts.cjs.map +1 -1
- package/dist/charts/react/charts.js +46 -34
- package/dist/charts/react/charts.js.map +1 -1
- package/dist/charts/react/graph.cjs +2 -0
- package/dist/charts/react/graph.cjs.map +1 -0
- package/dist/charts/react/graph.d.cts +213 -0
- package/dist/charts/react/graph.d.ts +213 -0
- package/dist/charts/react/graph.js +159 -0
- package/dist/charts/react/graph.js.map +1 -0
- package/dist/charts/react/shapes.cjs +1 -1
- package/dist/charts/react/shapes.cjs.map +1 -1
- package/dist/charts/react/shapes.d.cts +87 -4
- package/dist/charts/react/shapes.d.ts +87 -4
- package/dist/charts/react/shapes.js +55 -12
- package/dist/charts/react/shapes.js.map +1 -1
- package/dist/charts/react/trading.cjs +1 -1
- package/dist/charts/react/trading.cjs.map +1 -1
- package/dist/charts/react/trading.d.cts +53 -1
- package/dist/charts/react/trading.d.ts +53 -1
- package/dist/charts/react/trading.js +68 -37
- package/dist/charts/react/trading.js.map +1 -1
- package/dist/charts/react/types.d.cts +11 -0
- package/dist/charts/react/types.d.ts +11 -0
- package/dist/core/contracts.cjs +1 -1
- package/dist/core/contracts.cjs.map +1 -1
- package/dist/core/contracts.js +1 -1
- package/dist/core/contracts.js.map +1 -1
- package/dist/native/charts/src/canvas.cjs +1 -1
- package/dist/native/charts/src/canvas.js +3 -3
- package/dist/native/charts/src/engine/axis.cjs +1 -1
- package/dist/native/charts/src/engine/axis.cjs.map +1 -1
- package/dist/native/charts/src/engine/axis.js +42 -19
- package/dist/native/charts/src/engine/axis.js.map +1 -1
- package/dist/native/charts/src/engine/color.cjs +1 -1
- package/dist/native/charts/src/engine/color.cjs.map +1 -1
- package/dist/native/charts/src/engine/color.js +47 -5
- package/dist/native/charts/src/engine/color.js.map +1 -1
- package/dist/native/charts/src/engine/controller.cjs +2 -2
- package/dist/native/charts/src/engine/controller.cjs.map +1 -1
- package/dist/native/charts/src/engine/controller.js +300 -253
- package/dist/native/charts/src/engine/controller.js.map +1 -1
- package/dist/native/charts/src/engine/data.cjs +1 -1
- package/dist/native/charts/src/engine/data.cjs.map +1 -1
- package/dist/native/charts/src/engine/data.js +6 -4
- package/dist/native/charts/src/engine/data.js.map +1 -1
- package/dist/native/charts/src/engine/format.cjs +1 -1
- package/dist/native/charts/src/engine/format.cjs.map +1 -1
- package/dist/native/charts/src/engine/format.js +15 -2
- package/dist/native/charts/src/engine/format.js.map +1 -1
- package/dist/native/charts/src/engine/labels.cjs +1 -1
- package/dist/native/charts/src/engine/labels.cjs.map +1 -1
- package/dist/native/charts/src/engine/labels.js +28 -4
- package/dist/native/charts/src/engine/labels.js.map +1 -1
- package/dist/native/charts/src/engine/layout.cjs +1 -1
- package/dist/native/charts/src/engine/layout.cjs.map +1 -1
- package/dist/native/charts/src/engine/layout.js +11 -2
- package/dist/native/charts/src/engine/layout.js.map +1 -1
- package/dist/native/charts/src/engine/model.cjs +1 -1
- package/dist/native/charts/src/engine/model.cjs.map +1 -1
- package/dist/native/charts/src/engine/model.js +252 -171
- package/dist/native/charts/src/engine/model.js.map +1 -1
- package/dist/native/charts/src/engine/overlay.cjs.map +1 -1
- package/dist/native/charts/src/engine/overlay.js.map +1 -1
- package/dist/native/charts/src/engine/presets.cjs +2 -2
- package/dist/native/charts/src/engine/presets.cjs.map +1 -1
- package/dist/native/charts/src/engine/presets.js +104 -90
- package/dist/native/charts/src/engine/presets.js.map +1 -1
- package/dist/native/charts/src/engine/scene.cjs +1 -1
- package/dist/native/charts/src/engine/scene.cjs.map +1 -1
- package/dist/native/charts/src/engine/scene.js +341 -188
- package/dist/native/charts/src/engine/scene.js.map +1 -1
- package/dist/native/charts/src/engine/shapes/bullet.cjs +1 -1
- package/dist/native/charts/src/engine/shapes/bullet.cjs.map +1 -1
- package/dist/native/charts/src/engine/shapes/bullet.js +110 -110
- package/dist/native/charts/src/engine/shapes/bullet.js.map +1 -1
- package/dist/native/charts/src/engine/shapes/calendar.cjs +1 -1
- package/dist/native/charts/src/engine/shapes/calendar.cjs.map +1 -1
- package/dist/native/charts/src/engine/shapes/calendar.js +21 -16
- package/dist/native/charts/src/engine/shapes/calendar.js.map +1 -1
- package/dist/native/charts/src/engine/shapes/chord.cjs +2 -0
- package/dist/native/charts/src/engine/shapes/chord.cjs.map +1 -0
- package/dist/native/charts/src/engine/shapes/chord.js +414 -0
- package/dist/native/charts/src/engine/shapes/chord.js.map +1 -0
- package/dist/native/charts/src/engine/shapes/draw.cjs +1 -1
- package/dist/native/charts/src/engine/shapes/draw.cjs.map +1 -1
- package/dist/native/charts/src/engine/shapes/draw.js +47 -17
- package/dist/native/charts/src/engine/shapes/draw.js.map +1 -1
- package/dist/native/charts/src/engine/shapes/hit.cjs +1 -1
- package/dist/native/charts/src/engine/shapes/hit.cjs.map +1 -1
- package/dist/native/charts/src/engine/shapes/hit.js +73 -44
- package/dist/native/charts/src/engine/shapes/hit.js.map +1 -1
- package/dist/native/charts/src/engine/shapes/labels.cjs +1 -1
- package/dist/native/charts/src/engine/shapes/labels.cjs.map +1 -1
- package/dist/native/charts/src/engine/shapes/labels.js +12 -4
- package/dist/native/charts/src/engine/shapes/labels.js.map +1 -1
- package/dist/native/charts/src/engine/shapes/layout.cjs +2 -2
- package/dist/native/charts/src/engine/shapes/layout.cjs.map +1 -1
- package/dist/native/charts/src/engine/shapes/layout.js +117 -90
- package/dist/native/charts/src/engine/shapes/layout.js.map +1 -1
- package/dist/native/charts/src/engine/shapes/scene.cjs +1 -1
- package/dist/native/charts/src/engine/shapes/scene.cjs.map +1 -1
- package/dist/native/charts/src/engine/shapes/scene.js +62 -19
- package/dist/native/charts/src/engine/shapes/scene.js.map +1 -1
- package/dist/native/components/Chart/scene.cjs +1 -1
- package/dist/native/components/Chart/scene.cjs.map +1 -1
- package/dist/native/components/Chart/scene.js +140 -71
- package/dist/native/components/Chart/scene.js.map +1 -1
- package/dist/native/components/Charts/charts.cjs +1 -1
- package/dist/native/components/Charts/charts.cjs.map +1 -1
- package/dist/native/components/Charts/charts.js +54 -42
- package/dist/native/components/Charts/charts.js.map +1 -1
- package/dist/native/components/Charts/types.d.cts +11 -0
- package/dist/native/components/Charts/types.d.ts +11 -0
- package/dist/native/components/ShapeChart/ShapeChartBase.cjs +1 -1
- package/dist/native/components/ShapeChart/ShapeChartBase.cjs.map +1 -1
- package/dist/native/components/ShapeChart/ShapeChartBase.js +1 -0
- package/dist/native/components/ShapeChart/ShapeChartBase.js.map +1 -1
- package/dist/native/components/ShapeChart/charts.cjs +1 -1
- package/dist/native/components/ShapeChart/charts.cjs.map +1 -1
- package/dist/native/components/ShapeChart/charts.d.cts +6 -1
- package/dist/native/components/ShapeChart/charts.d.ts +6 -1
- package/dist/native/components/ShapeChart/charts.js +138 -96
- package/dist/native/components/ShapeChart/charts.js.map +1 -1
- package/dist/native/components/ShapeChart/draw.cjs +1 -1
- package/dist/native/components/ShapeChart/draw.cjs.map +1 -1
- package/dist/native/components/ShapeChart/draw.d.cts +1 -1
- package/dist/native/components/ShapeChart/draw.d.ts +1 -1
- package/dist/native/components/ShapeChart/draw.js +26 -17
- package/dist/native/components/ShapeChart/draw.js.map +1 -1
- package/dist/native/components/ShapeChart/geometry.cjs +1 -1
- package/dist/native/components/ShapeChart/geometry.cjs.map +1 -1
- package/dist/native/components/ShapeChart/geometry.js +138 -59
- package/dist/native/components/ShapeChart/geometry.js.map +1 -1
- package/dist/native/components/ShapeChart/index.cjs +1 -1
- package/dist/native/components/ShapeChart/index.d.cts +1 -1
- package/dist/native/components/ShapeChart/index.d.ts +1 -1
- package/dist/native/components/ShapeChart/index.js +2 -2
- package/dist/native/components/ShapeChart/recorder.cjs +1 -1
- package/dist/native/components/ShapeChart/recorder.cjs.map +1 -1
- package/dist/native/components/ShapeChart/recorder.d.cts +10 -1
- package/dist/native/components/ShapeChart/recorder.d.ts +10 -1
- package/dist/native/components/ShapeChart/recorder.js +19 -10
- package/dist/native/components/ShapeChart/recorder.js.map +1 -1
- package/dist/native/components/ShapeChart/types.d.cts +92 -7
- package/dist/native/components/ShapeChart/types.d.ts +92 -7
- package/dist/native/index.cjs +1 -1
- package/dist/native/index.js +2 -2
- package/dist/native/source/components/Chart/scene.tsx +158 -14
- package/dist/native/source/components/Charts/charts.tsx +30 -2
- package/dist/native/source/components/Charts/types.ts +11 -0
- package/dist/native/source/components/ShapeChart/ShapeChartBase.tsx +2 -0
- package/dist/native/source/components/ShapeChart/charts.tsx +91 -35
- package/dist/native/source/components/ShapeChart/draw.tsx +39 -8
- package/dist/native/source/components/ShapeChart/geometry.ts +189 -8
- package/dist/native/source/components/ShapeChart/index.ts +1 -0
- package/dist/native/source/components/ShapeChart/recorder.ts +20 -5
- package/dist/native/source/components/ShapeChart/types.ts +96 -5
- package/dist/native/source/manifest.ts +1 -0
- package/dist/taro/charts.d.ts +25 -5
- package/dist/taro/index.js +3900 -2836
- package/dist/taro/shape-charts.d.ts +96 -4
- package/dist/uni/AreaChart.vue.d.ts +5 -1
- package/dist/uni/Badge.vue.d.ts +1 -1
- package/dist/uni/BarChart.vue.d.ts +5 -1
- package/dist/uni/BoxPlotChart.vue.d.ts +8 -0
- package/dist/uni/BubbleChart.vue.d.ts +4 -0
- package/dist/uni/BulletChart.vue.d.ts +4 -0
- package/dist/uni/CalendarHeatmap.vue.d.ts +2 -0
- package/dist/uni/CandlestickChart.vue.d.ts +4 -0
- package/dist/uni/Chart.vue.d.ts +4 -0
- package/dist/uni/ChordChart.vue +93 -0
- package/dist/uni/ChordChart.vue.d.ts +136 -0
- package/dist/uni/DonutChart.vue.d.ts +4 -0
- package/dist/uni/FunnelChart.vue.d.ts +4 -0
- package/dist/uni/GanttChart.vue.d.ts +4 -0
- package/dist/uni/GaugeChart.vue.d.ts +4 -0
- package/dist/uni/HeatmapChart.vue.d.ts +8 -2
- package/dist/uni/HistogramChart.vue.d.ts +4 -0
- package/dist/uni/HorizontalBarChart.vue.d.ts +3 -1
- package/dist/uni/LineChart.vue.d.ts +4 -0
- package/dist/uni/MixedChart.vue.d.ts +4 -0
- package/dist/uni/PieChart.vue.d.ts +4 -0
- package/dist/uni/QuadrantChart.vue.d.ts +4 -0
- package/dist/uni/RadarChart.vue.d.ts +4 -0
- package/dist/uni/RadialBarChart.vue.d.ts +4 -0
- package/dist/uni/RangeAreaChart.vue.d.ts +4 -0
- package/dist/uni/SankeyChart.vue.d.ts +4 -0
- package/dist/uni/ScatterChart.vue.d.ts +4 -0
- package/dist/uni/Sparkline.vue.d.ts +4 -0
- package/dist/uni/SunburstChart.vue.d.ts +4 -0
- package/dist/uni/ToastProvider.vue.d.ts +1 -1
- package/dist/uni/TreemapChart.vue.d.ts +4 -0
- package/dist/uni/WaterfallChart.vue.d.ts +9 -0
- package/dist/uni/chart-canvas.d.ts +3 -0
- package/dist/uni/chart-canvas.js +4 -0
- package/dist/uni/chart-types.d.ts +28 -4
- package/dist/uni/chart-types.js +26 -2
- package/dist/uni/charts-canvas.js +1 -1
- package/dist/uni/index.d.ts +2 -1
- package/dist/uni/index.js +1 -0
- package/dist/uni/manifest.d.ts +7 -0
- package/dist/uni/manifest.js +10 -0
- package/dist/uni/named-chart-options.d.ts +9 -2
- package/dist/uni/named-chart-options.js +18 -1
- package/dist/uni/shape-chart-canvas.d.ts +3 -1
- package/dist/uni/shape-chart-canvas.js +15 -24
- package/dist/uni/shape-chart-types.d.ts +52 -2
- package/dist/uni/shape-chart-types.js +44 -0
- package/dist/vue/charts-global.d.ts +48 -0
- package/dist/vue/charts.d.ts +18 -0
- package/dist/vue/charts.js +56 -0
- package/dist/vue/charts.js.map +1 -0
- package/dist/vue/components/Chart/BoxPlotChart.vue.d.ts +8 -0
- package/dist/vue/components/Chart/BoxPlotChart.vue.js.map +1 -1
- package/dist/vue/components/Chart/BoxPlotChart.vue_vue_type_script_setup_true_lang.js +8 -2
- package/dist/vue/components/Chart/BoxPlotChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/vue/components/Chart/ChordChart.vue.d.ts +153 -0
- package/dist/vue/components/Chart/ChordChart.vue.js +7 -0
- package/dist/vue/components/Chart/ChordChart.vue.js.map +1 -0
- package/dist/vue/components/Chart/ChordChart.vue_vue_type_script_setup_true_lang.js +81 -0
- package/dist/vue/components/Chart/ChordChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/vue/components/Chart/DependencyGraph.vue.d.ts +179 -0
- package/dist/vue/components/Chart/DependencyGraph.vue.js +7 -0
- package/dist/vue/components/Chart/DependencyGraph.vue.js.map +1 -0
- package/dist/vue/components/Chart/DependencyGraph.vue_vue_type_script_setup_true_lang.js +65 -0
- package/dist/vue/components/Chart/DependencyGraph.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/vue/components/Chart/GanttChart.vue.d.ts +4 -0
- package/dist/vue/components/Chart/GanttChart.vue.js.map +1 -1
- package/dist/vue/components/Chart/GanttChart.vue_vue_type_script_setup_true_lang.js +4 -1
- package/dist/vue/components/Chart/GanttChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/vue/components/Chart/GraphChart.vue.d.ts +184 -0
- package/dist/vue/components/Chart/GraphChart.vue.js +7 -0
- package/dist/vue/components/Chart/GraphChart.vue.js.map +1 -0
- package/dist/vue/components/Chart/GraphChart.vue_vue_type_script_setup_true_lang.js +62 -0
- package/dist/vue/components/Chart/GraphChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/vue/components/Chart/HeatmapChart.vue.d.ts +9 -5
- package/dist/vue/components/Chart/HeatmapChart.vue.js.map +1 -1
- package/dist/vue/components/Chart/HeatmapChart.vue_vue_type_script_setup_true_lang.js +3 -1
- package/dist/vue/components/Chart/HeatmapChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/vue/components/Chart/OrderBookHeatmap.vue.d.ts +2 -0
- package/dist/vue/components/Chart/TimeAndSales.vue.d.ts +2 -0
- package/dist/vue/components/Chart/TradingChart.vue.d.ts +49 -1
- package/dist/vue/components/Chart/TradingChart.vue.js.map +1 -1
- package/dist/vue/components/Chart/TradingChart.vue_vue_type_script_setup_true_lang.js +31 -0
- package/dist/vue/components/Chart/TradingChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/vue/components/Chart/TreeChart.vue.d.ts +172 -0
- package/dist/vue/components/Chart/TreeChart.vue.js +7 -0
- package/dist/vue/components/Chart/TreeChart.vue.js.map +1 -0
- package/dist/vue/components/Chart/TreeChart.vue_vue_type_script_setup_true_lang.js +56 -0
- package/dist/vue/components/Chart/TreeChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/vue/components/Chart/WaterfallChart.vue.d.ts +12 -1
- package/dist/vue/components/Chart/WaterfallChart.vue.js.map +1 -1
- package/dist/vue/components/Chart/WaterfallChart.vue_vue_type_script_setup_true_lang.js +8 -2
- package/dist/vue/components/Chart/WaterfallChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/vue/components/Chart/graph.d.ts +153 -0
- package/dist/vue/components/Chart/graph.js +135 -0
- package/dist/vue/components/Chart/graph.js.map +1 -0
- package/dist/vue/components/Chart/index.d.ts +5 -1
- package/dist/vue/components/Chart/index.js +5 -1
- package/dist/vue/components/Chart/orderbook.d.ts +5 -1
- package/dist/vue/components/Chart/orderbook.js +2 -0
- package/dist/vue/components/Chart/orderbook.js.map +1 -1
- package/dist/vue/components/Chart/trading.d.ts +24 -2
- package/dist/vue/components/Chart/trading.js +8 -0
- package/dist/vue/components/Chart/trading.js.map +1 -1
- package/dist/vue/components/Chart/types.d.ts +74 -2
- package/dist/vue/global.d.ts +2 -38
- package/dist/vue/groups/charts.js +10 -2
- package/dist/vue/groups/charts.js.map +1 -1
- package/dist/vue/index.js +6 -2
- package/dist/vue/internal/register.d.ts +7 -0
- package/dist/vue/internal/register.js +14 -0
- package/dist/vue/internal/register.js.map +1 -0
- package/dist/vue/plugin.d.ts +9 -4
- package/dist/vue/plugin.js +6 -11
- package/dist/vue/plugin.js.map +1 -1
- package/dist/weapp/charts/canvas.js +1687 -147
- package/dist/weapp/charts/core.js +1 -0
- package/dist/weapp/chord-chart/index.js +1 -0
- package/dist/weapp/chord-chart/index.json +1 -0
- package/dist/weapp/chord-chart/index.wxml +1 -0
- package/dist/weapp/chord-chart/index.wxss +1 -0
- package/dist/weapp/controls.js +92 -32
- package/dist/weapp/types.d.ts +87 -4
- package/dist/web-components/components/chart/charts.d.ts +4 -2
- package/dist/web-components/components/chart/charts.js +8 -1
- package/dist/web-components/components/chart/charts.js.map +1 -1
- package/dist/web-components/components/chart/extended.d.ts +17 -7
- package/dist/web-components/components/chart/extended.js +23 -9
- package/dist/web-components/components/chart/extended.js.map +1 -1
- package/dist/web-components/components/chart/shapes-extended.d.ts +37 -1
- package/dist/web-components/components/chart/shapes-extended.js +27 -1
- package/dist/web-components/components/chart/shapes-extended.js.map +1 -1
- package/dist/web-components/components/graph/graph.d.ts +154 -0
- package/dist/web-components/components/graph/graph.js +149 -0
- package/dist/web-components/components/graph/graph.js.map +1 -0
- package/dist/web-components/components/trading-chart/trading-chart.d.ts +49 -2
- package/dist/web-components/components/trading-chart/trading-chart.js +62 -0
- package/dist/web-components/components/trading-chart/trading-chart.js.map +1 -1
- package/dist/web-components/elements/chart.d.ts +1 -1
- package/dist/web-components/elements/chart.js +6 -5
- package/dist/web-components/elements/chart.js.map +1 -1
- package/dist/web-components/elements/graph.d.ts +2 -0
- package/dist/web-components/elements/graph.js +12 -0
- package/dist/web-components/elements/graph.js.map +1 -0
- package/dist/web-components/html-custom-data.json +273 -4
- package/dist/web-components/types/react.d.ts +63 -4
- package/dist/web-components/types/solid.d.ts +55 -8
- package/dist/web-components/types/svelte.d.ts +55 -8
- package/dist/web-components/types/vue.d.ts +55 -4
- package/package.json +16 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sort.js","names":["MAX_SORTED_QUADS","BUCKETS","FLOATS","sortQuads","quads","indices","scratch","row","orthographic","mx","viewProj","my","mz","min","max","q","o","x","y","z","c","v","vertices","depth","scale","b","keys","counts","sum","at","j","sameMatrix","a","i","createDepthSorter","sorted","view","order","sortable","item","items","moved","frame","seen","result","entry","stale","out","key"],"sources":["../../../../../charts/src/engine/three-d/sort.ts"],"sourcesContent":["// Back-to-front order of the transparent meshes for the GPU backends:\n// transparent items are drawn without writing depth, so their triangles must\n// come farthest first to blend correctly where a surface folds over itself.\n// Meshes are made of quads (6 indices: two triangles sharing an edge, as\n// built for surface cells and bar faces); quads are sorted by the camera\n// depth of their center with a bucket sort (O(n)), and only again when the\n// camera moved. Canvas2D sorts every triangle itself (painter's algorithm).\n\nimport type { Frame3D, Item3D, MeshItem } from \"./render-types\";\nimport { VERTEX_STRIDE } from \"./render-types\";\n\n/** Largest transparent mesh sorted (quads): a 512 × 512 surface grid */\nexport const MAX_SORTED_QUADS = 1 << 18;\n\nconst BUCKETS = 1 << 16;\nconst FLOATS = VERTEX_STRIDE / 4;\n\n/**\n * Writes into `out` the quads of `indices` (6 indices each) ordered by\n * decreasing camera depth: view depth (clip w) in perspective, clip z in\n * orthographic projection. Equal depths keep their order.\n */\nexport const sortQuads = (\n indices: Uint32Array,\n vertices: Float32Array,\n viewProj: Float32Array,\n orthographic: boolean,\n out: Uint32Array,\n scratch: { keys: Float32Array; counts: Uint32Array },\n): void => {\n const quads = Math.floor(indices.length / 6);\n const { keys, counts } = scratch;\n // depth = row 4 (w) or row 3 (z) of the column-major matrix\n const row = orthographic ? 2 : 3;\n const mx = viewProj[row] ?? 0;\n const my = viewProj[row + 4] ?? 0;\n const mz = viewProj[row + 8] ?? 0;\n let min = Infinity;\n let max = -Infinity;\n for (let q = 0; q < quads; q++) {\n const o = q * 6;\n let x = 0;\n let y = 0;\n let z = 0;\n // the 4 corners: indices 0, 1, 2 and 5 of the quad\n for (let c = 0; c < 4; c++) {\n const v = (indices[o + (c === 3 ? 5 : c)] ?? 0) * FLOATS;\n x += vertices[v] ?? 0;\n y += vertices[v + 1] ?? 0;\n z += vertices[v + 2] ?? 0;\n }\n const depth = mx * x + my * y + mz * z;\n keys[q] = depth;\n if (depth < min) min = depth;\n if (depth > max) max = depth;\n }\n counts.fill(0);\n const scale = max > min ? (BUCKETS - 1) / (max - min) : 0;\n // bucket 0 = farthest (clamped: the keys are rounded to float32)\n for (let q = 0; q < quads; q++) {\n const b = Math.min(\n BUCKETS - 1,\n Math.max(0, Math.floor((max - (keys[q] ?? max)) * scale)),\n );\n keys[q] = b;\n counts[b] = (counts[b] ?? 0) + 1;\n }\n let sum = 0;\n for (let b = 0; b < BUCKETS; b++) {\n const c = counts[b] ?? 0;\n counts[b] = sum;\n sum += c;\n }\n for (let q = 0; q < quads; q++) {\n const b = keys[q] ?? 0;\n const at = (counts[b] ?? 0) * 6;\n counts[b] = (counts[b] ?? 0) + 1;\n const o = q * 6;\n for (let j = 0; j < 6; j++) out[at + j] = indices[o + j] ?? 0;\n }\n};\n\ninterface SortedMesh {\n version: number;\n source: Uint32Array;\n indices: Uint32Array;\n order: number;\n}\n\nconst sameMatrix = (a: Float32Array | null, b: Float32Array) => {\n if (!a) return false;\n for (let i = 0; i < 16; i++) if (a[i] !== b[i]) return false;\n return true;\n};\n\n/**\n * Sorter of the transparent meshes: returns the items with the transparent\n * meshes' indices in back-to-front order (`order` changes when only the\n * indices must be uploaded again)\n */\nexport const createDepthSorter = () => {\n const sorted = new Map<string, SortedMesh>();\n let view: Float32Array | null = null;\n let orthographic = false;\n let order = 0;\n let scratch: { keys: Float32Array; counts: Uint32Array } | null = null;\n\n const sortable = (item: Item3D): item is MeshItem =>\n item.kind === \"mesh\" &&\n item.opacity < 1 &&\n item.indices.length >= 12 &&\n item.indices.length % 6 === 0 &&\n item.indices.length / 6 <= MAX_SORTED_QUADS;\n\n return (items: readonly Item3D[], frame: Frame3D): readonly Item3D[] => {\n if (!items.some(sortable)) {\n sorted.clear();\n return items;\n }\n const moved =\n !sameMatrix(view, frame.viewProj) || orthographic !== frame.orthographic;\n if (moved) {\n view = Float32Array.from(frame.viewProj);\n orthographic = frame.orthographic;\n }\n const seen = new Set<string>();\n const result = items.map((item): Item3D => {\n if (!sortable(item)) return item;\n seen.add(item.key);\n let entry = sorted.get(item.key);\n const stale =\n !entry ||\n entry.version !== item.version ||\n entry.source !== item.indices;\n if (stale || moved) {\n const quads = item.indices.length / 6;\n if (!scratch || scratch.keys.length < quads)\n scratch = {\n keys: new Float32Array(Math.max(quads, 1024)),\n counts: new Uint32Array(BUCKETS),\n };\n const out =\n entry && !stale && entry.indices.length === item.indices.length\n ? entry.indices\n : new Uint32Array(item.indices.length);\n sortQuads(\n item.indices,\n new Float32Array(item.vertices),\n frame.viewProj,\n frame.orthographic,\n out,\n scratch,\n );\n entry = {\n version: item.version,\n source: item.indices,\n indices: out,\n order: ++order,\n };\n sorted.set(item.key, entry);\n }\n return { ...item, indices: entry!.indices, order: entry!.order };\n });\n for (const key of sorted.keys()) if (!seen.has(key)) sorted.delete(key);\n return result;\n };\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sort.js","names":["MAX_SORTED_QUADS","MERGED_KEY","BUCKETS","FLOATS","sortQuads","quads","indices","scratch","row","orthographic","mx","viewProj","my","mz","min","max","q","o","x","y","z","c","v","vertices","depth","scale","b","keys","counts","sum","at","j","mergeMeshes","vertexCount","indexCount","m","meshes","bytes","base","length","opacity","a","source","sameMatrix","i","isTransparentMesh","item","writesDepth","isQuadMesh","meshCenter","f","k","createDepthSorter","sorted","centers","merged","mergedVersion","view","order","sortMesh","entry","stale","moved","out","frame","centerDepth","transparent","items","seen","result","signature","placed","it","ordered","next","key"],"sources":["../../../../../charts/src/engine/three-d/sort.ts"],"sourcesContent":["// Back-to-front order of the transparent meshes for the GPU backends:\n// transparent items are drawn without writing depth, so their triangles must\n// come farthest first to blend correctly where a surface folds over itself\n// or where several transparent surfaces / bar series overlap. Meshes are\n// made of quads (6 indices: two triangles sharing an edge, as built for\n// surface cells and bar faces); quads are sorted by the camera depth of\n// their center with a bucket sort (O(n)), and only again when the camera\n// moved. Several transparent meshes are merged into one item (opacity baked\n// into the vertex colors) so that their quads are sorted together; above\n// the sort budget, the meshes are drawn by decreasing depth of their center\n// with their own quads sorted. Canvas2D sorts every triangle of every item\n// itself (painter's algorithm).\n\nimport type { Frame3D, Item3D, MeshItem } from \"./render-types\";\nimport { VERTEX_STRIDE, writesDepth } from \"./render-types\";\n\n/** Largest number of transparent quads sorted: a 512 × 512 surface grid */\nexport const MAX_SORTED_QUADS = 1 << 18;\n\n/** Key of the merged transparent meshes */\nexport const MERGED_KEY = \"transparent\";\n\nconst BUCKETS = 1 << 16;\nconst FLOATS = VERTEX_STRIDE / 4;\n\n/**\n * Writes into `out` the quads of `indices` (6 indices each) ordered by\n * decreasing camera depth: view depth (clip w) in perspective, clip z in\n * orthographic projection. Equal depths keep their order.\n */\nexport const sortQuads = (\n indices: Uint32Array,\n vertices: Float32Array,\n viewProj: Float32Array,\n orthographic: boolean,\n out: Uint32Array,\n scratch: { keys: Float32Array; counts: Uint32Array },\n): void => {\n const quads = Math.floor(indices.length / 6);\n const { keys, counts } = scratch;\n // depth = row 4 (w) or row 3 (z) of the column-major matrix\n const row = orthographic ? 2 : 3;\n const mx = viewProj[row] ?? 0;\n const my = viewProj[row + 4] ?? 0;\n const mz = viewProj[row + 8] ?? 0;\n let min = Infinity;\n let max = -Infinity;\n for (let q = 0; q < quads; q++) {\n const o = q * 6;\n let x = 0;\n let y = 0;\n let z = 0;\n // the 4 corners: indices 0, 1, 2 and 5 of the quad\n for (let c = 0; c < 4; c++) {\n const v = (indices[o + (c === 3 ? 5 : c)] ?? 0) * FLOATS;\n x += vertices[v] ?? 0;\n y += vertices[v + 1] ?? 0;\n z += vertices[v + 2] ?? 0;\n }\n const depth = mx * x + my * y + mz * z;\n keys[q] = depth;\n if (depth < min) min = depth;\n if (depth > max) max = depth;\n }\n counts.fill(0);\n const scale = max > min ? (BUCKETS - 1) / (max - min) : 0;\n // bucket 0 = farthest (clamped: the keys are rounded to float32)\n for (let q = 0; q < quads; q++) {\n const b = Math.min(\n BUCKETS - 1,\n Math.max(0, Math.floor((max - (keys[q] ?? max)) * scale)),\n );\n keys[q] = b;\n counts[b] = (counts[b] ?? 0) + 1;\n }\n let sum = 0;\n for (let b = 0; b < BUCKETS; b++) {\n const c = counts[b] ?? 0;\n counts[b] = sum;\n sum += c;\n }\n for (let q = 0; q < quads; q++) {\n const b = keys[q] ?? 0;\n const at = (counts[b] ?? 0) * 6;\n counts[b] = (counts[b] ?? 0) + 1;\n const o = q * 6;\n for (let j = 0; j < 6; j++) out[at + j] = indices[o + j] ?? 0;\n }\n};\n\n/**\n * One transparent item made of several meshes: vertices concatenated (the\n * opacity of every mesh multiplies the alpha of its vertex colors), indices\n * shifted. Drawn with opacity 1, without writing depth.\n */\nexport const mergeMeshes = (\n meshes: readonly MeshItem[],\n key: string,\n version: number,\n): MeshItem => {\n let vertexCount = 0;\n let indexCount = 0;\n for (const m of meshes) {\n vertexCount += m.vertexCount;\n indexCount += m.indices.length;\n }\n const vertices = new ArrayBuffer(vertexCount * VERTEX_STRIDE);\n const bytes = new Uint8Array(vertices);\n const indices = new Uint32Array(indexCount);\n let base = 0;\n let at = 0;\n for (const m of meshes) {\n const length = Math.min(\n m.vertices.byteLength,\n m.vertexCount * VERTEX_STRIDE,\n );\n bytes.set(new Uint8Array(m.vertices, 0, length), base * VERTEX_STRIDE);\n const opacity = Math.max(0, Math.min(1, m.opacity));\n if (opacity < 1) {\n for (let v = 0; v < m.vertexCount; v++) {\n const a = (base + v) * VERTEX_STRIDE + 27;\n bytes[a] = Math.round((bytes[a] ?? 0) * opacity);\n }\n }\n const source = m.indices;\n for (let j = 0; j < source.length; j++)\n indices[at + j] = (source[j] ?? 0) + base;\n base += m.vertexCount;\n at += source.length;\n }\n return {\n kind: \"mesh\",\n key,\n version,\n opacity: 1,\n transparent: true,\n vertices,\n vertexCount,\n indices,\n };\n};\n\ninterface SortedMesh {\n version: number;\n source: Uint32Array;\n indices: Uint32Array;\n order: number;\n}\n\nconst sameMatrix = (a: Float32Array | null, b: Float32Array) => {\n if (!a) return false;\n for (let i = 0; i < 16; i++) if (a[i] !== b[i]) return false;\n return true;\n};\n\nconst isTransparentMesh = (item: Item3D): item is MeshItem =>\n item.kind === \"mesh\" && !writesDepth(item);\n\n/** Made of whole quads: its triangles can be sorted by pairs */\nconst isQuadMesh = (item: MeshItem) =>\n item.indices.length > 0 && item.indices.length % 6 === 0;\n\n/** Center of the bounding box of a mesh's vertices */\nconst meshCenter = (item: MeshItem): [number, number, number] => {\n const f = new Float32Array(\n item.vertices,\n 0,\n Math.min(item.vertices.byteLength / 4, item.vertexCount * FLOATS),\n );\n const min = [Infinity, Infinity, Infinity];\n const max = [-Infinity, -Infinity, -Infinity];\n for (let o = 0; o + 2 < f.length; o += FLOATS) {\n for (let k = 0; k < 3; k++) {\n const v = f[o + k] ?? 0;\n if (v < (min[k] ?? 0)) min[k] = v;\n if (v > (max[k] ?? 0)) max[k] = v;\n }\n }\n return [0, 1, 2].map((k) =>\n min[k]! <= max[k]! ? (min[k]! + max[k]!) / 2 : 0,\n ) as [number, number, number];\n};\n\n/**\n * Sorter of the transparent meshes: returns the items with the transparent\n * meshes merged into one item (`MERGED_KEY`) whose quads are in back-to-front\n * order, or — above `MAX_SORTED_QUADS` or for meshes that aren't made of\n * quads — the transparent meshes ordered by decreasing depth of their\n * center, each with its own quads sorted. `order` changes when only the\n * indices must be uploaded again.\n */\nexport const createDepthSorter = () => {\n const sorted = new Map<string, SortedMesh>();\n const centers = new Map<\n string,\n { version: number; center: [number, number, number] }\n >();\n let merged: { signature: string; item: MeshItem } | null = null;\n let mergedVersion = 0;\n let view: Float32Array | null = null;\n let orthographic = false;\n let order = 0;\n let scratch: { keys: Float32Array; counts: Uint32Array } | null = null;\n\n /** Sorts the quads of a mesh when stale or when the camera moved */\n const sortMesh = (\n item: MeshItem,\n frame: Frame3D,\n moved: boolean,\n seen: Set<string>,\n ): MeshItem => {\n const quads = item.indices.length / 6;\n if (!isQuadMesh(item) || quads < 2 || quads > MAX_SORTED_QUADS) return item;\n seen.add(item.key);\n let entry = sorted.get(item.key);\n const stale =\n !entry || entry.version !== item.version || entry.source !== item.indices;\n if (stale || moved) {\n if (!scratch || scratch.keys.length < quads)\n scratch = {\n keys: new Float32Array(Math.max(quads, 1024)),\n counts: new Uint32Array(BUCKETS),\n };\n const out =\n entry && !stale && entry.indices.length === item.indices.length\n ? entry.indices\n : new Uint32Array(item.indices.length);\n sortQuads(\n item.indices,\n new Float32Array(item.vertices),\n frame.viewProj,\n frame.orthographic,\n out,\n scratch,\n );\n entry = {\n version: item.version,\n source: item.indices,\n indices: out,\n order: ++order,\n };\n sorted.set(item.key, entry);\n }\n return { ...item, indices: entry!.indices, order: entry!.order };\n };\n\n /** Camera depth of the center of a mesh (larger: farther) */\n const centerDepth = (item: MeshItem, frame: Frame3D) => {\n let entry = centers.get(item.key);\n if (!entry || entry.version !== item.version) {\n entry = { version: item.version, center: meshCenter(item) };\n centers.set(item.key, entry);\n }\n const m = frame.viewProj;\n const row = frame.orthographic ? 2 : 3;\n const [x, y, z] = entry.center;\n return (\n (m[row] ?? 0) * x +\n (m[row + 4] ?? 0) * y +\n (m[row + 8] ?? 0) * z +\n (m[row + 12] ?? 0)\n );\n };\n\n return (items: readonly Item3D[], frame: Frame3D): readonly Item3D[] => {\n const transparent = items.filter(isTransparentMesh);\n if (transparent.length === 0) {\n sorted.clear();\n centers.clear();\n merged = null;\n return items;\n }\n const moved =\n !sameMatrix(view, frame.viewProj) || orthographic !== frame.orthographic;\n if (moved) {\n view = Float32Array.from(frame.viewProj);\n orthographic = frame.orthographic;\n }\n const seen = new Set<string>();\n let quads = 0;\n for (const m of transparent) quads += m.indices.length / 6;\n const result: Item3D[] = [];\n if (\n transparent.length >= 2 &&\n quads <= MAX_SORTED_QUADS &&\n transparent.every(isQuadMesh)\n ) {\n // one item: every transparent quad sorted together\n const signature = transparent\n .map((m) => `${m.key}@${m.version}@${m.opacity}`)\n .join(\"|\");\n if (!merged || merged.signature !== signature) {\n merged = {\n signature,\n item: mergeMeshes(transparent, MERGED_KEY, ++mergedVersion),\n };\n }\n const item = sortMesh(merged.item, frame, moved, seen);\n let placed = false;\n for (const it of items) {\n if (!isTransparentMesh(it)) result.push(it);\n else if (!placed) {\n result.push(item);\n placed = true;\n }\n }\n } else {\n merged = null;\n // farthest mesh first, its own quads sorted\n const ordered = transparent\n .map((m) => ({ m, depth: centerDepth(m, frame) }))\n .sort((a, b) => b.depth - a.depth)\n .map((e) => sortMesh(e.m, frame, moved, seen));\n let next = 0;\n for (const it of items)\n result.push(isTransparentMesh(it) ? ordered[next++]! : it);\n }\n for (const key of sorted.keys()) if (!seen.has(key)) sorted.delete(key);\n for (const key of centers.keys())\n if (!transparent.some((m) => m.key === key)) centers.delete(key);\n return result;\n };\n};\n"],"mappings":"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"}
|
|
@@ -44,9 +44,26 @@ export interface Chart3DColumnData {
|
|
|
44
44
|
size?: ArrayLike<number>;
|
|
45
45
|
/** Per-point values mapped to the color scale (`colorBy: "value"`) */
|
|
46
46
|
value?: ArrayLike<number>;
|
|
47
|
+
/**
|
|
48
|
+
* Per-point colors as `0xRRGGBB` numbers (a `Uint32Array` for large
|
|
49
|
+
* clouds); win over the series color and the color scale
|
|
50
|
+
*/
|
|
51
|
+
color?: ArrayLike<number>;
|
|
47
52
|
/** Per-point texts shown in the tooltip */
|
|
48
53
|
label?: readonly string[];
|
|
49
54
|
}
|
|
55
|
+
/**
|
|
56
|
+
* Look of the scatter dots: `"sphere"` shaded balls, `"disc"` flat
|
|
57
|
+
* anti-aliased discs, `"glow"` soft discs with a gaussian halo (stars,
|
|
58
|
+
* dense clouds; pairs well with `blend: "additive"`)
|
|
59
|
+
*/
|
|
60
|
+
export type Scatter3DPointStyle = "sphere" | "disc" | "glow";
|
|
61
|
+
/**
|
|
62
|
+
* How the dots mix with what is behind them: `"normal"` alpha blending, or
|
|
63
|
+
* `"additive"` light accumulation (dense regions get brighter; meant for
|
|
64
|
+
* dark backgrounds, the dots don't hide each other)
|
|
65
|
+
*/
|
|
66
|
+
export type Scatter3DBlend = "normal" | "additive";
|
|
50
67
|
/** Points of a scatter or line series: objects, `[x, y, z]` tuples or columns */
|
|
51
68
|
export type Chart3DPointData = readonly Chart3DPoint[] | readonly (readonly [number, number, number])[] | Chart3DColumnData;
|
|
52
69
|
/** Options shared by every 3D series */
|
|
@@ -95,6 +112,16 @@ export interface Scatter3DSeries extends Chart3DSeriesBase {
|
|
|
95
112
|
* @default true
|
|
96
113
|
*/
|
|
97
114
|
perspectiveSize?: boolean;
|
|
115
|
+
/**
|
|
116
|
+
* Look of the dots: shaded spheres, flat discs or glowing discs
|
|
117
|
+
* @default "sphere"
|
|
118
|
+
*/
|
|
119
|
+
pointStyle?: Scatter3DPointStyle;
|
|
120
|
+
/**
|
|
121
|
+
* Blending of the dots: `"additive"` accumulates light (dark backgrounds)
|
|
122
|
+
* @default "normal"
|
|
123
|
+
*/
|
|
124
|
+
blend?: Scatter3DBlend;
|
|
98
125
|
}
|
|
99
126
|
/** A 3D polyline (trajectory); `NaN` coordinates break the line */
|
|
100
127
|
export interface Line3DSeries extends Chart3DSeriesBase {
|
|
@@ -44,9 +44,26 @@ export interface Chart3DColumnData {
|
|
|
44
44
|
size?: ArrayLike<number>;
|
|
45
45
|
/** Per-point values mapped to the color scale (`colorBy: "value"`) */
|
|
46
46
|
value?: ArrayLike<number>;
|
|
47
|
+
/**
|
|
48
|
+
* Per-point colors as `0xRRGGBB` numbers (a `Uint32Array` for large
|
|
49
|
+
* clouds); win over the series color and the color scale
|
|
50
|
+
*/
|
|
51
|
+
color?: ArrayLike<number>;
|
|
47
52
|
/** Per-point texts shown in the tooltip */
|
|
48
53
|
label?: readonly string[];
|
|
49
54
|
}
|
|
55
|
+
/**
|
|
56
|
+
* Look of the scatter dots: `"sphere"` shaded balls, `"disc"` flat
|
|
57
|
+
* anti-aliased discs, `"glow"` soft discs with a gaussian halo (stars,
|
|
58
|
+
* dense clouds; pairs well with `blend: "additive"`)
|
|
59
|
+
*/
|
|
60
|
+
export type Scatter3DPointStyle = "sphere" | "disc" | "glow";
|
|
61
|
+
/**
|
|
62
|
+
* How the dots mix with what is behind them: `"normal"` alpha blending, or
|
|
63
|
+
* `"additive"` light accumulation (dense regions get brighter; meant for
|
|
64
|
+
* dark backgrounds, the dots don't hide each other)
|
|
65
|
+
*/
|
|
66
|
+
export type Scatter3DBlend = "normal" | "additive";
|
|
50
67
|
/** Points of a scatter or line series: objects, `[x, y, z]` tuples or columns */
|
|
51
68
|
export type Chart3DPointData = readonly Chart3DPoint[] | readonly (readonly [number, number, number])[] | Chart3DColumnData;
|
|
52
69
|
/** Options shared by every 3D series */
|
|
@@ -95,6 +112,16 @@ export interface Scatter3DSeries extends Chart3DSeriesBase {
|
|
|
95
112
|
* @default true
|
|
96
113
|
*/
|
|
97
114
|
perspectiveSize?: boolean;
|
|
115
|
+
/**
|
|
116
|
+
* Look of the dots: shaded spheres, flat discs or glowing discs
|
|
117
|
+
* @default "sphere"
|
|
118
|
+
*/
|
|
119
|
+
pointStyle?: Scatter3DPointStyle;
|
|
120
|
+
/**
|
|
121
|
+
* Blending of the dots: `"additive"` accumulates light (dark backgrounds)
|
|
122
|
+
* @default "normal"
|
|
123
|
+
*/
|
|
124
|
+
blend?: Scatter3DBlend;
|
|
98
125
|
}
|
|
99
126
|
/** A 3D polyline (trajectory); `NaN` coordinates break the line */
|
|
100
127
|
export interface Line3DSeries extends Chart3DSeriesBase {
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("./render-types.cjs"),t=require("./shaders.cjs");var n=/swiftshader|llvmpipe|softpipe|software|basic render driver|microsoft basic/i,r=e=>{let t=e.getExtension(`WEBGL_debug_renderer_info`),r=t?e.getParameter(t.UNMASKED_RENDERER_WEBGL):e.getParameter(e.RENDERER);return n.test(String(r??``))},i=[`u_viewProj`,`u_viewport`,`u_eye`,`u_light`,`u_material`,`u_params`,`u_fog`],a=(e,t,n)=>{let r=(t,n)=>{let r=e.createShader(t);return r?(e.shaderSource(r,n),e.compileShader(r),e.getShaderParameter(r,e.COMPILE_STATUS)?r:(e.deleteShader(r),null)):null},a=r(e.VERTEX_SHADER,t.vertex),o=r(e.FRAGMENT_SHADER,t.fragment),s=e.createProgram();if(!a||!o||!s)return null;if(e.attachShader(s,a),e.attachShader(s,o),n.forEach((t,n)=>e.bindAttribLocation(s,n,t)),e.linkProgram(s),e.deleteShader(a),e.deleteShader(o),!e.getProgramParameter(s,e.LINK_STATUS))return e.deleteProgram(s),null;let c={};for(let t of i)c[t]=e.getUniformLocation(s,t);return{program:s,uniforms:c}},o=new Float32Array([0,0,1,0,0,1,1,1]),s=4,c=(n,i,c,l=!1)=>{let u={alpha:!0,premultipliedAlpha:!0,antialias:!0,depth:!0,stencil:!1,preserveDrawingBuffer:!1,failIfMajorPerformanceCaveat:l},d=n.getContext(i===2?`webgl2`:`webgl`,u);if(!d)return null;let f=()=>d.getExtension(`WEBGL_lose_context`)?.loseContext(),p=i===2?d:null,m=p?null:d.getExtension(`ANGLE_instanced_arrays`),h=p?!0:!!d.getExtension(`OES_element_index_uint`);if(!p&&(!m||!h)||l&&r(d))return f(),null;let g=(e,t)=>{p?p.vertexAttribDivisor(e,t):m?.vertexAttribDivisorANGLE(e,t)},_=e=>{p?p.drawArraysInstanced(d.TRIANGLE_STRIP,0,4,e):m?.drawArraysInstancedANGLE(d.TRIANGLE_STRIP,0,4,e)},v=t.glslPrograms(i),y=a(d,v.points,t.GLSL_ATTRIBUTES.points),b=a(d,v.mesh,t.GLSL_ATTRIBUTES.mesh),x=a(d,v.lines,t.GLSL_ATTRIBUTES.lines),S=d.createBuffer();if(!y||!b||!x||!S)return f(),null;let C={points:y,mesh:b,lines:x};d.bindBuffer(d.ARRAY_BUFFER,S),d.bufferData(d.ARRAY_BUFFER,o,d.STATIC_DRAW);let w=!1,T=e=>{e.preventDefault(),w=!0,c()};n.addEventListener(`webglcontextlost`,T);let E=new Map,D=new Float32Array(40),O=(e,t,n,r,i,a)=>{d.enableVertexAttribArray(e),d.vertexAttribPointer(e,t,n,n===d.UNSIGNED_BYTE,r,i),g(e,+!!a)},k=(e,t)=>{let n=d.FLOAT,r=d.UNSIGNED_BYTE,i;e.kind===`mesh`?(d.bindBuffer(d.ARRAY_BUFFER,t.vertex),O(0,3,n,28,0,!1),O(1,3,n,28,12,!1),O(2,4,r,28,24,!1),i=3):(d.bindBuffer(d.ARRAY_BUFFER,S),O(0,2,n,0,0,!1),d.bindBuffer(d.ARRAY_BUFFER,t.vertex),e.kind===`points`?(O(1,3,n,20,0,!0),O(2,1,n,20,12,!0),O(3,4,r,20,16,!0)):(O(1,3,n,28,0,!0),O(2,3,n,28,12,!0),O(3,4,r,28,24,!0)),i=4);for(let e=i;e<s;e++)d.disableVertexAttribArray(e),g(e,0)},A=e=>{let t=E.get(e.key);if(t&&t.version===e.version&&t.kind===e.kind)return e.kind===`mesh`&&t.index&&(e.order??0)!==t.order&&(d.bindBuffer(d.ELEMENT_ARRAY_BUFFER,t.index),d.bufferSubData(d.ELEMENT_ARRAY_BUFFER,0,e.indices),t.order=e.order??0),t;t&&(d.deleteBuffer(t.vertex),t.index&&d.deleteBuffer(t.index),E.delete(e.key));let n=d.createBuffer();if(!n)return null;d.bindBuffer(d.ARRAY_BUFFER,n),d.bufferData(d.ARRAY_BUFFER,e.kind===`mesh`?e.vertices:e.data,d.STATIC_DRAW);let r=null;if(e.kind===`mesh`){if(r=d.createBuffer(),!r)return d.deleteBuffer(n),null;d.bindBuffer(d.ELEMENT_ARRAY_BUFFER,r),d.bufferData(d.ELEMENT_ARRAY_BUFFER,e.indices,e.order===void 0?d.STATIC_DRAW:d.DYNAMIC_DRAW)}let i={version:e.version,kind:e.kind,vertex:n,index:r,order:e.kind===`mesh`?e.order??0:0};return E.set(e.key,i),i};return{kind:i===2?`webgl2`:`webgl`,canvas:n,resize(e,t){n.width=Math.max(1,e),n.height=Math.max(1,t)},render(r,i){if(w||d.isContextLost())return;d.viewport(0,0,n.width,n.height),d.clearColor(0,0,0,0),d.clearDepth(1),d.depthMask(!0),d.clear(d.COLOR_BUFFER_BIT|d.DEPTH_BUFFER_BIT),d.enable(d.BLEND),d.blendFunc(d.ONE,d.ONE_MINUS_SRC_ALPHA),d.enable(d.DEPTH_TEST),d.depthFunc(d.LEQUAL),d.disable(d.CULL_FACE);let a=new Set;for(let n of e.drawOrder(r)){a.add(n.key);let
|
|
1
|
+
const e=require("./render-types.cjs"),t=require("./shaders.cjs");var n=/swiftshader|llvmpipe|softpipe|software|basic render driver|microsoft basic/i,r=e=>{let t=e.getExtension(`WEBGL_debug_renderer_info`),r=t?e.getParameter(t.UNMASKED_RENDERER_WEBGL):e.getParameter(e.RENDERER);return n.test(String(r??``))},i=[`u_viewProj`,`u_viewport`,`u_eye`,`u_light`,`u_material`,`u_params`,`u_fog`],a=(e,t,n)=>{let r=(t,n)=>{let r=e.createShader(t);return r?(e.shaderSource(r,n),e.compileShader(r),e.getShaderParameter(r,e.COMPILE_STATUS)?r:(e.deleteShader(r),null)):null},a=r(e.VERTEX_SHADER,t.vertex),o=r(e.FRAGMENT_SHADER,t.fragment),s=e.createProgram();if(!a||!o||!s)return null;if(e.attachShader(s,a),e.attachShader(s,o),n.forEach((t,n)=>e.bindAttribLocation(s,n,t)),e.linkProgram(s),e.deleteShader(a),e.deleteShader(o),!e.getProgramParameter(s,e.LINK_STATUS))return e.deleteProgram(s),null;let c={};for(let t of i)c[t]=e.getUniformLocation(s,t);return{program:s,uniforms:c}},o=new Float32Array([0,0,1,0,0,1,1,1]),s=4,c=(n,i,c,l=!1)=>{let u={alpha:!0,premultipliedAlpha:!0,antialias:!0,depth:!0,stencil:!1,preserveDrawingBuffer:!1,failIfMajorPerformanceCaveat:l},d=n.getContext(i===2?`webgl2`:`webgl`,u);if(!d)return null;let f=()=>d.getExtension(`WEBGL_lose_context`)?.loseContext(),p=i===2?d:null,m=p?null:d.getExtension(`ANGLE_instanced_arrays`),h=p?!0:!!d.getExtension(`OES_element_index_uint`);if(!p&&(!m||!h)||l&&r(d))return f(),null;let g=(e,t)=>{p?p.vertexAttribDivisor(e,t):m?.vertexAttribDivisorANGLE(e,t)},_=e=>{p?p.drawArraysInstanced(d.TRIANGLE_STRIP,0,4,e):m?.drawArraysInstancedANGLE(d.TRIANGLE_STRIP,0,4,e)},v=t.glslPrograms(i),y=a(d,v.points,t.GLSL_ATTRIBUTES.points),b=a(d,v.mesh,t.GLSL_ATTRIBUTES.mesh),x=a(d,v.lines,t.GLSL_ATTRIBUTES.lines),S=d.createBuffer();if(!y||!b||!x||!S)return f(),null;let C={points:y,mesh:b,lines:x};d.bindBuffer(d.ARRAY_BUFFER,S),d.bufferData(d.ARRAY_BUFFER,o,d.STATIC_DRAW);let w=!1,T=e=>{e.preventDefault(),w=!0,c()};n.addEventListener(`webglcontextlost`,T);let E=new Map,D=new Float32Array(40),O=(e,t,n,r,i,a)=>{d.enableVertexAttribArray(e),d.vertexAttribPointer(e,t,n,n===d.UNSIGNED_BYTE,r,i),g(e,+!!a)},k=(e,t)=>{let n=d.FLOAT,r=d.UNSIGNED_BYTE,i;e.kind===`mesh`?(d.bindBuffer(d.ARRAY_BUFFER,t.vertex),O(0,3,n,28,0,!1),O(1,3,n,28,12,!1),O(2,4,r,28,24,!1),i=3):(d.bindBuffer(d.ARRAY_BUFFER,S),O(0,2,n,0,0,!1),d.bindBuffer(d.ARRAY_BUFFER,t.vertex),e.kind===`points`?(O(1,3,n,20,0,!0),O(2,1,n,20,12,!0),O(3,4,r,20,16,!0)):(O(1,3,n,28,0,!0),O(2,3,n,28,12,!0),O(3,4,r,28,24,!0)),i=4);for(let e=i;e<s;e++)d.disableVertexAttribArray(e),g(e,0)},A=e=>{let t=E.get(e.key);if(t&&t.version===e.version&&t.kind===e.kind)return e.kind===`mesh`&&t.index&&(e.order??0)!==t.order&&(d.bindBuffer(d.ELEMENT_ARRAY_BUFFER,t.index),d.bufferSubData(d.ELEMENT_ARRAY_BUFFER,0,e.indices),t.order=e.order??0),t;t&&(d.deleteBuffer(t.vertex),t.index&&d.deleteBuffer(t.index),E.delete(e.key));let n=d.createBuffer();if(!n)return null;d.bindBuffer(d.ARRAY_BUFFER,n),d.bufferData(d.ARRAY_BUFFER,e.kind===`mesh`?e.vertices:e.data,d.STATIC_DRAW);let r=null;if(e.kind===`mesh`){if(r=d.createBuffer(),!r)return d.deleteBuffer(n),null;d.bindBuffer(d.ELEMENT_ARRAY_BUFFER,r),d.bufferData(d.ELEMENT_ARRAY_BUFFER,e.indices,e.order===void 0?d.STATIC_DRAW:d.DYNAMIC_DRAW)}let i={version:e.version,kind:e.kind,vertex:n,index:r,order:e.kind===`mesh`?e.order??0:0};return E.set(e.key,i),i};return{kind:i===2?`webgl2`:`webgl`,canvas:n,resize(e,t){n.width=Math.max(1,e),n.height=Math.max(1,t)},render(r,i){if(w||d.isContextLost())return;d.viewport(0,0,n.width,n.height),d.clearColor(0,0,0,0),d.clearDepth(1),d.depthMask(!0),d.clear(d.COLOR_BUFFER_BIT|d.DEPTH_BUFFER_BIT),d.enable(d.BLEND),d.blendFunc(d.ONE,d.ONE_MINUS_SRC_ALPHA),d.enable(d.DEPTH_TEST),d.depthFunc(d.LEQUAL),d.disable(d.CULL_FACE);let a=new Set,o=!1;for(let n of e.drawOrder(r)){a.add(n.key);let r=n.kind===`mesh`?n.indices.length:n.count;if(r<=0)continue;let s=A(n);if(!s)continue;let c=C[n.kind];d.useProgram(c.program);let l=t.itemUniforms(n,i,D),u=c.uniforms;d.uniformMatrix4fv(u.u_viewProj,!1,l.subarray(0,16)),d.uniform4fv(u.u_viewport,l.subarray(16,20)),d.uniform4fv(u.u_eye,l.subarray(20,24)),d.uniform4fv(u.u_light,l.subarray(24,28)),d.uniform4fv(u.u_material,l.subarray(28,32)),d.uniform4fv(u.u_params,l.subarray(32,36)),d.uniform4fv(u.u_fog,l.subarray(36,40)),d.depthMask(e.writesDepth(n));let f=n.kind===`points`&&!!n.additive;f!==o&&(f?d.blendFuncSeparate(d.ONE,d.ONE,d.ONE,d.ONE_MINUS_SRC_ALPHA):d.blendFunc(d.ONE,d.ONE_MINUS_SRC_ALPHA),o=f),k(n,s),n.kind===`mesh`?(d.bindBuffer(d.ELEMENT_ARRAY_BUFFER,s.index),d.drawElements(d.TRIANGLES,r,d.UNSIGNED_INT,0)):_(r)}d.depthMask(!0),o&&d.blendFunc(d.ONE,d.ONE_MINUS_SRC_ALPHA);for(let[e,t]of E)a.has(e)||(d.deleteBuffer(t.vertex),t.index&&d.deleteBuffer(t.index),E.delete(e))},destroy(){if(n.removeEventListener(`webglcontextlost`,T),!d.isContextLost()){for(let e of E.values())d.deleteBuffer(e.vertex),e.index&&d.deleteBuffer(e.index);for(let e of Object.values(C))d.deleteProgram(e.program);d.deleteBuffer(S)}E.clear(),f()}}};exports.SOFTWARE_RENDERER=n,exports.createWebGl3D=c,exports.isSoftwareRenderer=r;
|
|
2
2
|
//# sourceMappingURL=webgl.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgl.cjs","names":["glslPrograms","GLSL_ATTRIBUTES","drawOrder","itemUniforms","writesDepth","require_render_types","require_shaders","SOFTWARE_RENDERER","isSoftwareRenderer","info","gl","name","UNIFORMS","compile","shader","s","type","code","vs","source","fs","program","attributes","i","uniforms","CORNERS","MAX_LOCATIONS","createWebGl3D","requireHardware","canvas","version","loseContext","gl2","angle","uint","divisor","location","value","drawInstanced","count","sources","points","mesh","lines","corners","programs","lost","handleLost","event","onLost","resources","uniformData","attribute","size","stride","offset","bind","F","U8","used","item","res","upload","existing","vertex","index","width","height","seen","items","u","frame","loc","key","p"],"sources":["../../../../../charts/src/engine/three-d/webgl.ts"],"sourcesContent":["// WebGL2 / WebGL (1) backend of the 3D charts: the same GLSL for both\n// (a macro prefix makes it GLSL ES 3.0), instancing through WebGL2 or\n// ANGLE_instanced_arrays, 32-bit indices through WebGL2 or\n// OES_element_index_uint. Attributes are bound for every draw (no vertex\n// array objects in WebGL 1): a few calls per item.\n\nimport type { RendererLostHandler } from \"../renderers/types\";\nimport {\n POINT_STRIDE,\n SEGMENT_STRIDE,\n VERTEX_STRIDE,\n drawOrder,\n type Item3D,\n type Renderer3D,\n} from \"./render-types\";\nimport {\n GLSL_ATTRIBUTES,\n glslPrograms,\n itemUniforms,\n writesDepth,\n type GlslSource,\n} from \"./shaders\";\n\ntype Gl = WebGLRenderingContext | WebGL2RenderingContext;\n\n/** Software rasterizers behind a WebGL context */\nexport const SOFTWARE_RENDERER =\n /swiftshader|llvmpipe|softpipe|software|basic render driver|microsoft basic/i;\n\nexport const isSoftwareRenderer = (gl: Gl): boolean => {\n const info = gl.getExtension(\"WEBGL_debug_renderer_info\");\n const name = info\n ? gl.getParameter(info.UNMASKED_RENDERER_WEBGL)\n : gl.getParameter(gl.RENDERER);\n return SOFTWARE_RENDERER.test(String(name ?? \"\"));\n};\n\nconst UNIFORMS = [\n \"u_viewProj\",\n \"u_viewport\",\n \"u_eye\",\n \"u_light\",\n \"u_material\",\n \"u_params\",\n \"u_fog\",\n] as const;\n\ninterface Program {\n program: WebGLProgram;\n uniforms: Record<(typeof UNIFORMS)[number], WebGLUniformLocation | null>;\n}\n\nconst compile = (\n gl: Gl,\n source: GlslSource,\n attributes: readonly string[],\n): Program | null => {\n const shader = (type: number, code: string) => {\n const s = gl.createShader(type);\n if (!s) return null;\n gl.shaderSource(s, code);\n gl.compileShader(s);\n if (!gl.getShaderParameter(s, gl.COMPILE_STATUS)) {\n gl.deleteShader(s);\n return null;\n }\n return s;\n };\n const vs = shader(gl.VERTEX_SHADER, source.vertex);\n const fs = shader(gl.FRAGMENT_SHADER, source.fragment);\n const program = gl.createProgram();\n if (!vs || !fs || !program) return null;\n gl.attachShader(program, vs);\n gl.attachShader(program, fs);\n attributes.forEach((name, i) => gl.bindAttribLocation(program, i, name));\n gl.linkProgram(program);\n gl.deleteShader(vs);\n gl.deleteShader(fs);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n gl.deleteProgram(program);\n return null;\n }\n const uniforms = {} as Program[\"uniforms\"];\n for (const name of UNIFORMS)\n uniforms[name] = gl.getUniformLocation(program, name);\n return { program, uniforms };\n};\n\ninterface ItemResources {\n version: number;\n kind: Item3D[\"kind\"];\n vertex: WebGLBuffer;\n index: WebGLBuffer | null;\n /** `order` of the uploaded indices (meshes) */\n order: number;\n}\n\n/** Corners of the triangle strip of a billboard / segment */\nconst CORNERS = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]);\nconst MAX_LOCATIONS = 4;\n\nexport const createWebGl3D = (\n canvas: HTMLCanvasElement,\n version: 1 | 2,\n onLost: RendererLostHandler,\n /** Refuses software rendering: the decimating Canvas2D backend is faster there */\n requireHardware = false,\n): Renderer3D | null => {\n const attributes: WebGLContextAttributes = {\n alpha: true,\n premultipliedAlpha: true,\n antialias: true,\n depth: true,\n stencil: false,\n preserveDrawingBuffer: false,\n failIfMajorPerformanceCaveat: requireHardware,\n };\n const gl = canvas.getContext(\n version === 2 ? \"webgl2\" : \"webgl\",\n attributes,\n ) as Gl | null;\n if (!gl) return null;\n const loseContext = () =>\n gl.getExtension(\"WEBGL_lose_context\")?.loseContext();\n const gl2 = version === 2 ? (gl as WebGL2RenderingContext) : null;\n const angle = gl2 ? null : gl.getExtension(\"ANGLE_instanced_arrays\");\n const uint = gl2 ? true : !!gl.getExtension(\"OES_element_index_uint\");\n if (\n (!gl2 && (!angle || !uint)) ||\n (requireHardware && isSoftwareRenderer(gl))\n ) {\n loseContext();\n return null;\n }\n const divisor = (location: number, value: number) => {\n if (gl2) gl2.vertexAttribDivisor(location, value);\n else angle?.vertexAttribDivisorANGLE(location, value);\n };\n const drawInstanced = (count: number) => {\n if (gl2) gl2.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, 4, count);\n else angle?.drawArraysInstancedANGLE(gl.TRIANGLE_STRIP, 0, 4, count);\n };\n\n const sources = glslPrograms(version);\n const points = compile(gl, sources.points, GLSL_ATTRIBUTES.points);\n const mesh = compile(gl, sources.mesh, GLSL_ATTRIBUTES.mesh);\n const lines = compile(gl, sources.lines, GLSL_ATTRIBUTES.lines);\n const corners = gl.createBuffer();\n if (!points || !mesh || !lines || !corners) {\n loseContext();\n return null;\n }\n const programs = { points, mesh, lines };\n gl.bindBuffer(gl.ARRAY_BUFFER, corners);\n gl.bufferData(gl.ARRAY_BUFFER, CORNERS, gl.STATIC_DRAW);\n\n let lost = false;\n const handleLost = (event: Event) => {\n event.preventDefault();\n lost = true;\n onLost();\n };\n canvas.addEventListener(\"webglcontextlost\", handleLost);\n\n const resources = new Map<string, ItemResources>();\n const uniformData = new Float32Array(40);\n\n const attribute = (\n location: number,\n size: number,\n type: number,\n stride: number,\n offset: number,\n perInstance: boolean,\n ) => {\n gl.enableVertexAttribArray(location);\n gl.vertexAttribPointer(\n location,\n size,\n type,\n type === gl.UNSIGNED_BYTE,\n stride,\n offset,\n );\n divisor(location, perInstance ? 1 : 0);\n };\n\n const bind = (item: Item3D, res: ItemResources) => {\n const F = gl.FLOAT;\n const U8 = gl.UNSIGNED_BYTE;\n let used: number;\n if (item.kind === \"mesh\") {\n gl.bindBuffer(gl.ARRAY_BUFFER, res.vertex);\n attribute(0, 3, F, VERTEX_STRIDE, 0, false);\n attribute(1, 3, F, VERTEX_STRIDE, 12, false);\n attribute(2, 4, U8, VERTEX_STRIDE, 24, false);\n used = 3;\n } else {\n gl.bindBuffer(gl.ARRAY_BUFFER, corners);\n attribute(0, 2, F, 0, 0, false);\n gl.bindBuffer(gl.ARRAY_BUFFER, res.vertex);\n if (item.kind === \"points\") {\n attribute(1, 3, F, POINT_STRIDE, 0, true);\n attribute(2, 1, F, POINT_STRIDE, 12, true);\n attribute(3, 4, U8, POINT_STRIDE, 16, true);\n } else {\n attribute(1, 3, F, SEGMENT_STRIDE, 0, true);\n attribute(2, 3, F, SEGMENT_STRIDE, 12, true);\n attribute(3, 4, U8, SEGMENT_STRIDE, 24, true);\n }\n used = 4;\n }\n for (let i = used; i < MAX_LOCATIONS; i++) {\n gl.disableVertexAttribArray(i);\n divisor(i, 0);\n }\n };\n\n const upload = (item: Item3D): ItemResources | null => {\n const existing = resources.get(item.key);\n if (\n existing &&\n existing.version === item.version &&\n existing.kind === item.kind\n ) {\n // same mesh, triangles in a new order (transparent, sorted by depth)\n if (\n item.kind === \"mesh\" &&\n existing.index &&\n (item.order ?? 0) !== existing.order\n ) {\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, existing.index);\n gl.bufferSubData(gl.ELEMENT_ARRAY_BUFFER, 0, item.indices);\n existing.order = item.order ?? 0;\n }\n return existing;\n }\n if (existing) {\n gl.deleteBuffer(existing.vertex);\n if (existing.index) gl.deleteBuffer(existing.index);\n resources.delete(item.key);\n }\n const vertex = gl.createBuffer();\n if (!vertex) return null;\n gl.bindBuffer(gl.ARRAY_BUFFER, vertex);\n gl.bufferData(\n gl.ARRAY_BUFFER,\n item.kind === \"mesh\" ? item.vertices : item.data,\n gl.STATIC_DRAW,\n );\n let index: WebGLBuffer | null = null;\n if (item.kind === \"mesh\") {\n index = gl.createBuffer();\n if (!index) {\n gl.deleteBuffer(vertex);\n return null;\n }\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, index);\n gl.bufferData(\n gl.ELEMENT_ARRAY_BUFFER,\n item.indices,\n item.order === undefined ? gl.STATIC_DRAW : gl.DYNAMIC_DRAW,\n );\n }\n const res = {\n version: item.version,\n kind: item.kind,\n vertex,\n index,\n order: item.kind === \"mesh\" ? (item.order ?? 0) : 0,\n };\n resources.set(item.key, res);\n return res;\n };\n\n return {\n kind: version === 2 ? \"webgl2\" : \"webgl\",\n canvas,\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(items, frame) {\n if (lost || gl.isContextLost()) return;\n gl.viewport(0, 0, canvas.width, canvas.height);\n gl.clearColor(0, 0, 0, 0);\n gl.clearDepth(1);\n gl.depthMask(true);\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n gl.enable(gl.DEPTH_TEST);\n gl.depthFunc(gl.LEQUAL);\n gl.disable(gl.CULL_FACE);\n const seen = new Set<string>();\n for (const item of drawOrder(items)) {\n seen.add(item.key);\n const count = item.kind === \"mesh\" ? item.indices.length : item.count;\n if (count <= 0) continue;\n const res = upload(item);\n if (!res) continue;\n const program = programs[item.kind];\n gl.useProgram(program.program);\n const u = itemUniforms(item, frame, uniformData);\n const loc = program.uniforms;\n gl.uniformMatrix4fv(loc.u_viewProj, false, u.subarray(0, 16));\n gl.uniform4fv(loc.u_viewport, u.subarray(16, 20));\n gl.uniform4fv(loc.u_eye, u.subarray(20, 24));\n gl.uniform4fv(loc.u_light, u.subarray(24, 28));\n gl.uniform4fv(loc.u_material, u.subarray(28, 32));\n gl.uniform4fv(loc.u_params, u.subarray(32, 36));\n gl.uniform4fv(loc.u_fog, u.subarray(36, 40));\n gl.depthMask(writesDepth(item));\n bind(item, res);\n if (item.kind === \"mesh\") {\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, res.index);\n gl.drawElements(gl.TRIANGLES, count, gl.UNSIGNED_INT, 0);\n } else {\n drawInstanced(count);\n }\n }\n gl.depthMask(true);\n for (const [key, res] of resources) {\n if (!seen.has(key)) {\n gl.deleteBuffer(res.vertex);\n if (res.index) gl.deleteBuffer(res.index);\n resources.delete(key);\n }\n }\n },\n destroy() {\n canvas.removeEventListener(\"webglcontextlost\", handleLost);\n if (!gl.isContextLost()) {\n for (const res of resources.values()) {\n gl.deleteBuffer(res.vertex);\n if (res.index) gl.deleteBuffer(res.index);\n }\n for (const p of Object.values(programs)) gl.deleteProgram(p.program);\n gl.deleteBuffer(corners);\n }\n resources.clear();\n loseContext();\n },\n };\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"webgl.cjs","names":["glslPrograms","GLSL_ATTRIBUTES","drawOrder","itemUniforms","writesDepth","require_render_types","require_shaders","SOFTWARE_RENDERER","isSoftwareRenderer","info","gl","name","UNIFORMS","compile","shader","s","type","code","vs","source","fs","program","attributes","i","uniforms","CORNERS","MAX_LOCATIONS","createWebGl3D","requireHardware","canvas","version","loseContext","gl2","angle","uint","divisor","location","value","drawInstanced","count","sources","points","mesh","lines","corners","programs","lost","handleLost","event","onLost","resources","uniformData","attribute","size","stride","offset","bind","F","U8","used","item","res","upload","existing","vertex","index","width","height","seen","additive","items","u","frame","loc","add","key","p"],"sources":["../../../../../charts/src/engine/three-d/webgl.ts"],"sourcesContent":["// WebGL2 / WebGL (1) backend of the 3D charts: the same GLSL for both\n// (a macro prefix makes it GLSL ES 3.0), instancing through WebGL2 or\n// ANGLE_instanced_arrays, 32-bit indices through WebGL2 or\n// OES_element_index_uint. Attributes are bound for every draw (no vertex\n// array objects in WebGL 1): a few calls per item.\n\nimport type { RendererLostHandler } from \"../renderers/types\";\nimport {\n POINT_STRIDE,\n SEGMENT_STRIDE,\n VERTEX_STRIDE,\n drawOrder,\n type Item3D,\n type Renderer3D,\n} from \"./render-types\";\nimport {\n GLSL_ATTRIBUTES,\n glslPrograms,\n itemUniforms,\n writesDepth,\n type GlslSource,\n} from \"./shaders\";\n\ntype Gl = WebGLRenderingContext | WebGL2RenderingContext;\n\n/** Software rasterizers behind a WebGL context */\nexport const SOFTWARE_RENDERER =\n /swiftshader|llvmpipe|softpipe|software|basic render driver|microsoft basic/i;\n\nexport const isSoftwareRenderer = (gl: Gl): boolean => {\n const info = gl.getExtension(\"WEBGL_debug_renderer_info\");\n const name = info\n ? gl.getParameter(info.UNMASKED_RENDERER_WEBGL)\n : gl.getParameter(gl.RENDERER);\n return SOFTWARE_RENDERER.test(String(name ?? \"\"));\n};\n\nconst UNIFORMS = [\n \"u_viewProj\",\n \"u_viewport\",\n \"u_eye\",\n \"u_light\",\n \"u_material\",\n \"u_params\",\n \"u_fog\",\n] as const;\n\ninterface Program {\n program: WebGLProgram;\n uniforms: Record<(typeof UNIFORMS)[number], WebGLUniformLocation | null>;\n}\n\nconst compile = (\n gl: Gl,\n source: GlslSource,\n attributes: readonly string[],\n): Program | null => {\n const shader = (type: number, code: string) => {\n const s = gl.createShader(type);\n if (!s) return null;\n gl.shaderSource(s, code);\n gl.compileShader(s);\n if (!gl.getShaderParameter(s, gl.COMPILE_STATUS)) {\n gl.deleteShader(s);\n return null;\n }\n return s;\n };\n const vs = shader(gl.VERTEX_SHADER, source.vertex);\n const fs = shader(gl.FRAGMENT_SHADER, source.fragment);\n const program = gl.createProgram();\n if (!vs || !fs || !program) return null;\n gl.attachShader(program, vs);\n gl.attachShader(program, fs);\n attributes.forEach((name, i) => gl.bindAttribLocation(program, i, name));\n gl.linkProgram(program);\n gl.deleteShader(vs);\n gl.deleteShader(fs);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n gl.deleteProgram(program);\n return null;\n }\n const uniforms = {} as Program[\"uniforms\"];\n for (const name of UNIFORMS)\n uniforms[name] = gl.getUniformLocation(program, name);\n return { program, uniforms };\n};\n\ninterface ItemResources {\n version: number;\n kind: Item3D[\"kind\"];\n vertex: WebGLBuffer;\n index: WebGLBuffer | null;\n /** `order` of the uploaded indices (meshes) */\n order: number;\n}\n\n/** Corners of the triangle strip of a billboard / segment */\nconst CORNERS = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]);\nconst MAX_LOCATIONS = 4;\n\nexport const createWebGl3D = (\n canvas: HTMLCanvasElement,\n version: 1 | 2,\n onLost: RendererLostHandler,\n /** Refuses software rendering: the decimating Canvas2D backend is faster there */\n requireHardware = false,\n): Renderer3D | null => {\n const attributes: WebGLContextAttributes = {\n alpha: true,\n premultipliedAlpha: true,\n antialias: true,\n depth: true,\n stencil: false,\n preserveDrawingBuffer: false,\n failIfMajorPerformanceCaveat: requireHardware,\n };\n const gl = canvas.getContext(\n version === 2 ? \"webgl2\" : \"webgl\",\n attributes,\n ) as Gl | null;\n if (!gl) return null;\n const loseContext = () =>\n gl.getExtension(\"WEBGL_lose_context\")?.loseContext();\n const gl2 = version === 2 ? (gl as WebGL2RenderingContext) : null;\n const angle = gl2 ? null : gl.getExtension(\"ANGLE_instanced_arrays\");\n const uint = gl2 ? true : !!gl.getExtension(\"OES_element_index_uint\");\n if (\n (!gl2 && (!angle || !uint)) ||\n (requireHardware && isSoftwareRenderer(gl))\n ) {\n loseContext();\n return null;\n }\n const divisor = (location: number, value: number) => {\n if (gl2) gl2.vertexAttribDivisor(location, value);\n else angle?.vertexAttribDivisorANGLE(location, value);\n };\n const drawInstanced = (count: number) => {\n if (gl2) gl2.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, 4, count);\n else angle?.drawArraysInstancedANGLE(gl.TRIANGLE_STRIP, 0, 4, count);\n };\n\n const sources = glslPrograms(version);\n const points = compile(gl, sources.points, GLSL_ATTRIBUTES.points);\n const mesh = compile(gl, sources.mesh, GLSL_ATTRIBUTES.mesh);\n const lines = compile(gl, sources.lines, GLSL_ATTRIBUTES.lines);\n const corners = gl.createBuffer();\n if (!points || !mesh || !lines || !corners) {\n loseContext();\n return null;\n }\n const programs = { points, mesh, lines };\n gl.bindBuffer(gl.ARRAY_BUFFER, corners);\n gl.bufferData(gl.ARRAY_BUFFER, CORNERS, gl.STATIC_DRAW);\n\n let lost = false;\n const handleLost = (event: Event) => {\n event.preventDefault();\n lost = true;\n onLost();\n };\n canvas.addEventListener(\"webglcontextlost\", handleLost);\n\n const resources = new Map<string, ItemResources>();\n const uniformData = new Float32Array(40);\n\n const attribute = (\n location: number,\n size: number,\n type: number,\n stride: number,\n offset: number,\n perInstance: boolean,\n ) => {\n gl.enableVertexAttribArray(location);\n gl.vertexAttribPointer(\n location,\n size,\n type,\n type === gl.UNSIGNED_BYTE,\n stride,\n offset,\n );\n divisor(location, perInstance ? 1 : 0);\n };\n\n const bind = (item: Item3D, res: ItemResources) => {\n const F = gl.FLOAT;\n const U8 = gl.UNSIGNED_BYTE;\n let used: number;\n if (item.kind === \"mesh\") {\n gl.bindBuffer(gl.ARRAY_BUFFER, res.vertex);\n attribute(0, 3, F, VERTEX_STRIDE, 0, false);\n attribute(1, 3, F, VERTEX_STRIDE, 12, false);\n attribute(2, 4, U8, VERTEX_STRIDE, 24, false);\n used = 3;\n } else {\n gl.bindBuffer(gl.ARRAY_BUFFER, corners);\n attribute(0, 2, F, 0, 0, false);\n gl.bindBuffer(gl.ARRAY_BUFFER, res.vertex);\n if (item.kind === \"points\") {\n attribute(1, 3, F, POINT_STRIDE, 0, true);\n attribute(2, 1, F, POINT_STRIDE, 12, true);\n attribute(3, 4, U8, POINT_STRIDE, 16, true);\n } else {\n attribute(1, 3, F, SEGMENT_STRIDE, 0, true);\n attribute(2, 3, F, SEGMENT_STRIDE, 12, true);\n attribute(3, 4, U8, SEGMENT_STRIDE, 24, true);\n }\n used = 4;\n }\n for (let i = used; i < MAX_LOCATIONS; i++) {\n gl.disableVertexAttribArray(i);\n divisor(i, 0);\n }\n };\n\n const upload = (item: Item3D): ItemResources | null => {\n const existing = resources.get(item.key);\n if (\n existing &&\n existing.version === item.version &&\n existing.kind === item.kind\n ) {\n // same mesh, triangles in a new order (transparent, sorted by depth)\n if (\n item.kind === \"mesh\" &&\n existing.index &&\n (item.order ?? 0) !== existing.order\n ) {\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, existing.index);\n gl.bufferSubData(gl.ELEMENT_ARRAY_BUFFER, 0, item.indices);\n existing.order = item.order ?? 0;\n }\n return existing;\n }\n if (existing) {\n gl.deleteBuffer(existing.vertex);\n if (existing.index) gl.deleteBuffer(existing.index);\n resources.delete(item.key);\n }\n const vertex = gl.createBuffer();\n if (!vertex) return null;\n gl.bindBuffer(gl.ARRAY_BUFFER, vertex);\n gl.bufferData(\n gl.ARRAY_BUFFER,\n item.kind === \"mesh\" ? item.vertices : item.data,\n gl.STATIC_DRAW,\n );\n let index: WebGLBuffer | null = null;\n if (item.kind === \"mesh\") {\n index = gl.createBuffer();\n if (!index) {\n gl.deleteBuffer(vertex);\n return null;\n }\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, index);\n gl.bufferData(\n gl.ELEMENT_ARRAY_BUFFER,\n item.indices,\n item.order === undefined ? gl.STATIC_DRAW : gl.DYNAMIC_DRAW,\n );\n }\n const res = {\n version: item.version,\n kind: item.kind,\n vertex,\n index,\n order: item.kind === \"mesh\" ? (item.order ?? 0) : 0,\n };\n resources.set(item.key, res);\n return res;\n };\n\n return {\n kind: version === 2 ? \"webgl2\" : \"webgl\",\n canvas,\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(items, frame) {\n if (lost || gl.isContextLost()) return;\n gl.viewport(0, 0, canvas.width, canvas.height);\n gl.clearColor(0, 0, 0, 0);\n gl.clearDepth(1);\n gl.depthMask(true);\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n gl.enable(gl.DEPTH_TEST);\n gl.depthFunc(gl.LEQUAL);\n gl.disable(gl.CULL_FACE);\n const seen = new Set<string>();\n let additive = false;\n for (const item of drawOrder(items)) {\n seen.add(item.key);\n const count = item.kind === \"mesh\" ? item.indices.length : item.count;\n if (count <= 0) continue;\n const res = upload(item);\n if (!res) continue;\n const program = programs[item.kind];\n gl.useProgram(program.program);\n const u = itemUniforms(item, frame, uniformData);\n const loc = program.uniforms;\n gl.uniformMatrix4fv(loc.u_viewProj, false, u.subarray(0, 16));\n gl.uniform4fv(loc.u_viewport, u.subarray(16, 20));\n gl.uniform4fv(loc.u_eye, u.subarray(20, 24));\n gl.uniform4fv(loc.u_light, u.subarray(24, 28));\n gl.uniform4fv(loc.u_material, u.subarray(28, 32));\n gl.uniform4fv(loc.u_params, u.subarray(32, 36));\n gl.uniform4fv(loc.u_fog, u.subarray(36, 40));\n gl.depthMask(writesDepth(item));\n const add = item.kind === \"points\" && !!item.additive;\n if (add !== additive) {\n // additive points: the colors add up, the coverage composites as usual\n if (add)\n gl.blendFuncSeparate(\n gl.ONE,\n gl.ONE,\n gl.ONE,\n gl.ONE_MINUS_SRC_ALPHA,\n );\n else gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n additive = add;\n }\n bind(item, res);\n if (item.kind === \"mesh\") {\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, res.index);\n gl.drawElements(gl.TRIANGLES, count, gl.UNSIGNED_INT, 0);\n } else {\n drawInstanced(count);\n }\n }\n gl.depthMask(true);\n if (additive) gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n for (const [key, res] of resources) {\n if (!seen.has(key)) {\n gl.deleteBuffer(res.vertex);\n if (res.index) gl.deleteBuffer(res.index);\n resources.delete(key);\n }\n }\n },\n destroy() {\n canvas.removeEventListener(\"webglcontextlost\", handleLost);\n if (!gl.isContextLost()) {\n for (const res of resources.values()) {\n gl.deleteBuffer(res.vertex);\n if (res.index) gl.deleteBuffer(res.index);\n }\n for (const p of Object.values(programs)) gl.deleteProgram(p.program);\n gl.deleteBuffer(corners);\n }\n resources.clear();\n loseContext();\n },\n };\n};\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { drawOrder as e } from "./render-types.js";
|
|
2
|
-
import { GLSL_ATTRIBUTES as
|
|
1
|
+
import { drawOrder as e, writesDepth as t } from "./render-types.js";
|
|
2
|
+
import { GLSL_ATTRIBUTES as n, glslPrograms as r, itemUniforms as i } from "./shaders.js";
|
|
3
3
|
//#region src/engine/three-d/webgl.ts
|
|
4
4
|
var a = /swiftshader|llvmpipe|softpipe|software|basic render driver|microsoft basic/i, o = (e) => {
|
|
5
5
|
let t = e.getExtension("WEBGL_debug_renderer_info"), n = t ? e.getParameter(t.UNMASKED_RENDERER_WEBGL) : e.getParameter(e.RENDERER);
|
|
@@ -51,7 +51,7 @@ var a = /swiftshader|llvmpipe|softpipe|software|basic render driver|microsoft ba
|
|
|
51
51
|
g ? g.vertexAttribDivisor(e, t) : _?.vertexAttribDivisorANGLE(e, t);
|
|
52
52
|
}, b = (e) => {
|
|
53
53
|
g ? g.drawArraysInstanced(m.TRIANGLE_STRIP, 0, 4, e) : _?.drawArraysInstancedANGLE(m.TRIANGLE_STRIP, 0, 4, e);
|
|
54
|
-
}, x =
|
|
54
|
+
}, x = r(s), S = c(m, x.points, n.points), C = c(m, x.mesh, n.mesh), w = c(m, x.lines, n.lines), T = m.createBuffer();
|
|
55
55
|
if (!S || !C || !w || !T) return h(), null;
|
|
56
56
|
let E = {
|
|
57
57
|
points: S,
|
|
@@ -96,22 +96,24 @@ var a = /swiftshader|llvmpipe|softpipe|software|basic render driver|microsoft ba
|
|
|
96
96
|
resize(e, t) {
|
|
97
97
|
a.width = Math.max(1, e), a.height = Math.max(1, t);
|
|
98
98
|
},
|
|
99
|
-
render(
|
|
99
|
+
render(n, r) {
|
|
100
100
|
if (D || m.isContextLost()) return;
|
|
101
101
|
m.viewport(0, 0, a.width, a.height), m.clearColor(0, 0, 0, 0), m.clearDepth(1), m.depthMask(!0), m.clear(m.COLOR_BUFFER_BIT | m.DEPTH_BUFFER_BIT), m.enable(m.BLEND), m.blendFunc(m.ONE, m.ONE_MINUS_SRC_ALPHA), m.enable(m.DEPTH_TEST), m.depthFunc(m.LEQUAL), m.disable(m.CULL_FACE);
|
|
102
|
-
let o = /* @__PURE__ */ new Set();
|
|
103
|
-
for (let a of e(
|
|
102
|
+
let o = /* @__PURE__ */ new Set(), s = !1;
|
|
103
|
+
for (let a of e(n)) {
|
|
104
104
|
o.add(a.key);
|
|
105
105
|
let e = a.kind === "mesh" ? a.indices.length : a.count;
|
|
106
106
|
if (e <= 0) continue;
|
|
107
|
-
let
|
|
108
|
-
if (!
|
|
109
|
-
let
|
|
110
|
-
m.useProgram(
|
|
111
|
-
let
|
|
112
|
-
m.uniformMatrix4fv(
|
|
107
|
+
let n = N(a);
|
|
108
|
+
if (!n) continue;
|
|
109
|
+
let c = E[a.kind];
|
|
110
|
+
m.useProgram(c.program);
|
|
111
|
+
let l = i(a, r, A), u = c.uniforms;
|
|
112
|
+
m.uniformMatrix4fv(u.u_viewProj, !1, l.subarray(0, 16)), m.uniform4fv(u.u_viewport, l.subarray(16, 20)), m.uniform4fv(u.u_eye, l.subarray(20, 24)), m.uniform4fv(u.u_light, l.subarray(24, 28)), m.uniform4fv(u.u_material, l.subarray(28, 32)), m.uniform4fv(u.u_params, l.subarray(32, 36)), m.uniform4fv(u.u_fog, l.subarray(36, 40)), m.depthMask(t(a));
|
|
113
|
+
let d = a.kind === "points" && !!a.additive;
|
|
114
|
+
d !== s && (d ? m.blendFuncSeparate(m.ONE, m.ONE, m.ONE, m.ONE_MINUS_SRC_ALPHA) : m.blendFunc(m.ONE, m.ONE_MINUS_SRC_ALPHA), s = d), M(a, n), a.kind === "mesh" ? (m.bindBuffer(m.ELEMENT_ARRAY_BUFFER, n.index), m.drawElements(m.TRIANGLES, e, m.UNSIGNED_INT, 0)) : b(e);
|
|
113
115
|
}
|
|
114
|
-
m.depthMask(!0);
|
|
116
|
+
m.depthMask(!0), s && m.blendFunc(m.ONE, m.ONE_MINUS_SRC_ALPHA);
|
|
115
117
|
for (let [e, t] of k) o.has(e) || (m.deleteBuffer(t.vertex), t.index && m.deleteBuffer(t.index), k.delete(e));
|
|
116
118
|
},
|
|
117
119
|
destroy() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgl.js","names":["SOFTWARE_RENDERER","isSoftwareRenderer","info","gl","name","UNIFORMS","compile","shader","s","type","code","vs","source","fs","program","attributes","i","uniforms","CORNERS","MAX_LOCATIONS","createWebGl3D","requireHardware","canvas","version","loseContext","gl2","angle","uint","divisor","location","value","drawInstanced","count","sources","glslPrograms","points","GLSL_ATTRIBUTES","mesh","lines","corners","programs","lost","handleLost","event","onLost","resources","uniformData","attribute","size","stride","offset","bind","F","U8","used","item","res","upload","existing","vertex","index","width","height","seen","drawOrder","items","u","itemUniforms","frame","loc","writesDepth","key","p"],"sources":["../../../../../charts/src/engine/three-d/webgl.ts"],"sourcesContent":["// WebGL2 / WebGL (1) backend of the 3D charts: the same GLSL for both\n// (a macro prefix makes it GLSL ES 3.0), instancing through WebGL2 or\n// ANGLE_instanced_arrays, 32-bit indices through WebGL2 or\n// OES_element_index_uint. Attributes are bound for every draw (no vertex\n// array objects in WebGL 1): a few calls per item.\n\nimport type { RendererLostHandler } from \"../renderers/types\";\nimport {\n POINT_STRIDE,\n SEGMENT_STRIDE,\n VERTEX_STRIDE,\n drawOrder,\n type Item3D,\n type Renderer3D,\n} from \"./render-types\";\nimport {\n GLSL_ATTRIBUTES,\n glslPrograms,\n itemUniforms,\n writesDepth,\n type GlslSource,\n} from \"./shaders\";\n\ntype Gl = WebGLRenderingContext | WebGL2RenderingContext;\n\n/** Software rasterizers behind a WebGL context */\nexport const SOFTWARE_RENDERER =\n /swiftshader|llvmpipe|softpipe|software|basic render driver|microsoft basic/i;\n\nexport const isSoftwareRenderer = (gl: Gl): boolean => {\n const info = gl.getExtension(\"WEBGL_debug_renderer_info\");\n const name = info\n ? gl.getParameter(info.UNMASKED_RENDERER_WEBGL)\n : gl.getParameter(gl.RENDERER);\n return SOFTWARE_RENDERER.test(String(name ?? \"\"));\n};\n\nconst UNIFORMS = [\n \"u_viewProj\",\n \"u_viewport\",\n \"u_eye\",\n \"u_light\",\n \"u_material\",\n \"u_params\",\n \"u_fog\",\n] as const;\n\ninterface Program {\n program: WebGLProgram;\n uniforms: Record<(typeof UNIFORMS)[number], WebGLUniformLocation | null>;\n}\n\nconst compile = (\n gl: Gl,\n source: GlslSource,\n attributes: readonly string[],\n): Program | null => {\n const shader = (type: number, code: string) => {\n const s = gl.createShader(type);\n if (!s) return null;\n gl.shaderSource(s, code);\n gl.compileShader(s);\n if (!gl.getShaderParameter(s, gl.COMPILE_STATUS)) {\n gl.deleteShader(s);\n return null;\n }\n return s;\n };\n const vs = shader(gl.VERTEX_SHADER, source.vertex);\n const fs = shader(gl.FRAGMENT_SHADER, source.fragment);\n const program = gl.createProgram();\n if (!vs || !fs || !program) return null;\n gl.attachShader(program, vs);\n gl.attachShader(program, fs);\n attributes.forEach((name, i) => gl.bindAttribLocation(program, i, name));\n gl.linkProgram(program);\n gl.deleteShader(vs);\n gl.deleteShader(fs);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n gl.deleteProgram(program);\n return null;\n }\n const uniforms = {} as Program[\"uniforms\"];\n for (const name of UNIFORMS)\n uniforms[name] = gl.getUniformLocation(program, name);\n return { program, uniforms };\n};\n\ninterface ItemResources {\n version: number;\n kind: Item3D[\"kind\"];\n vertex: WebGLBuffer;\n index: WebGLBuffer | null;\n /** `order` of the uploaded indices (meshes) */\n order: number;\n}\n\n/** Corners of the triangle strip of a billboard / segment */\nconst CORNERS = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]);\nconst MAX_LOCATIONS = 4;\n\nexport const createWebGl3D = (\n canvas: HTMLCanvasElement,\n version: 1 | 2,\n onLost: RendererLostHandler,\n /** Refuses software rendering: the decimating Canvas2D backend is faster there */\n requireHardware = false,\n): Renderer3D | null => {\n const attributes: WebGLContextAttributes = {\n alpha: true,\n premultipliedAlpha: true,\n antialias: true,\n depth: true,\n stencil: false,\n preserveDrawingBuffer: false,\n failIfMajorPerformanceCaveat: requireHardware,\n };\n const gl = canvas.getContext(\n version === 2 ? \"webgl2\" : \"webgl\",\n attributes,\n ) as Gl | null;\n if (!gl) return null;\n const loseContext = () =>\n gl.getExtension(\"WEBGL_lose_context\")?.loseContext();\n const gl2 = version === 2 ? (gl as WebGL2RenderingContext) : null;\n const angle = gl2 ? null : gl.getExtension(\"ANGLE_instanced_arrays\");\n const uint = gl2 ? true : !!gl.getExtension(\"OES_element_index_uint\");\n if (\n (!gl2 && (!angle || !uint)) ||\n (requireHardware && isSoftwareRenderer(gl))\n ) {\n loseContext();\n return null;\n }\n const divisor = (location: number, value: number) => {\n if (gl2) gl2.vertexAttribDivisor(location, value);\n else angle?.vertexAttribDivisorANGLE(location, value);\n };\n const drawInstanced = (count: number) => {\n if (gl2) gl2.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, 4, count);\n else angle?.drawArraysInstancedANGLE(gl.TRIANGLE_STRIP, 0, 4, count);\n };\n\n const sources = glslPrograms(version);\n const points = compile(gl, sources.points, GLSL_ATTRIBUTES.points);\n const mesh = compile(gl, sources.mesh, GLSL_ATTRIBUTES.mesh);\n const lines = compile(gl, sources.lines, GLSL_ATTRIBUTES.lines);\n const corners = gl.createBuffer();\n if (!points || !mesh || !lines || !corners) {\n loseContext();\n return null;\n }\n const programs = { points, mesh, lines };\n gl.bindBuffer(gl.ARRAY_BUFFER, corners);\n gl.bufferData(gl.ARRAY_BUFFER, CORNERS, gl.STATIC_DRAW);\n\n let lost = false;\n const handleLost = (event: Event) => {\n event.preventDefault();\n lost = true;\n onLost();\n };\n canvas.addEventListener(\"webglcontextlost\", handleLost);\n\n const resources = new Map<string, ItemResources>();\n const uniformData = new Float32Array(40);\n\n const attribute = (\n location: number,\n size: number,\n type: number,\n stride: number,\n offset: number,\n perInstance: boolean,\n ) => {\n gl.enableVertexAttribArray(location);\n gl.vertexAttribPointer(\n location,\n size,\n type,\n type === gl.UNSIGNED_BYTE,\n stride,\n offset,\n );\n divisor(location, perInstance ? 1 : 0);\n };\n\n const bind = (item: Item3D, res: ItemResources) => {\n const F = gl.FLOAT;\n const U8 = gl.UNSIGNED_BYTE;\n let used: number;\n if (item.kind === \"mesh\") {\n gl.bindBuffer(gl.ARRAY_BUFFER, res.vertex);\n attribute(0, 3, F, VERTEX_STRIDE, 0, false);\n attribute(1, 3, F, VERTEX_STRIDE, 12, false);\n attribute(2, 4, U8, VERTEX_STRIDE, 24, false);\n used = 3;\n } else {\n gl.bindBuffer(gl.ARRAY_BUFFER, corners);\n attribute(0, 2, F, 0, 0, false);\n gl.bindBuffer(gl.ARRAY_BUFFER, res.vertex);\n if (item.kind === \"points\") {\n attribute(1, 3, F, POINT_STRIDE, 0, true);\n attribute(2, 1, F, POINT_STRIDE, 12, true);\n attribute(3, 4, U8, POINT_STRIDE, 16, true);\n } else {\n attribute(1, 3, F, SEGMENT_STRIDE, 0, true);\n attribute(2, 3, F, SEGMENT_STRIDE, 12, true);\n attribute(3, 4, U8, SEGMENT_STRIDE, 24, true);\n }\n used = 4;\n }\n for (let i = used; i < MAX_LOCATIONS; i++) {\n gl.disableVertexAttribArray(i);\n divisor(i, 0);\n }\n };\n\n const upload = (item: Item3D): ItemResources | null => {\n const existing = resources.get(item.key);\n if (\n existing &&\n existing.version === item.version &&\n existing.kind === item.kind\n ) {\n // same mesh, triangles in a new order (transparent, sorted by depth)\n if (\n item.kind === \"mesh\" &&\n existing.index &&\n (item.order ?? 0) !== existing.order\n ) {\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, existing.index);\n gl.bufferSubData(gl.ELEMENT_ARRAY_BUFFER, 0, item.indices);\n existing.order = item.order ?? 0;\n }\n return existing;\n }\n if (existing) {\n gl.deleteBuffer(existing.vertex);\n if (existing.index) gl.deleteBuffer(existing.index);\n resources.delete(item.key);\n }\n const vertex = gl.createBuffer();\n if (!vertex) return null;\n gl.bindBuffer(gl.ARRAY_BUFFER, vertex);\n gl.bufferData(\n gl.ARRAY_BUFFER,\n item.kind === \"mesh\" ? item.vertices : item.data,\n gl.STATIC_DRAW,\n );\n let index: WebGLBuffer | null = null;\n if (item.kind === \"mesh\") {\n index = gl.createBuffer();\n if (!index) {\n gl.deleteBuffer(vertex);\n return null;\n }\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, index);\n gl.bufferData(\n gl.ELEMENT_ARRAY_BUFFER,\n item.indices,\n item.order === undefined ? gl.STATIC_DRAW : gl.DYNAMIC_DRAW,\n );\n }\n const res = {\n version: item.version,\n kind: item.kind,\n vertex,\n index,\n order: item.kind === \"mesh\" ? (item.order ?? 0) : 0,\n };\n resources.set(item.key, res);\n return res;\n };\n\n return {\n kind: version === 2 ? \"webgl2\" : \"webgl\",\n canvas,\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(items, frame) {\n if (lost || gl.isContextLost()) return;\n gl.viewport(0, 0, canvas.width, canvas.height);\n gl.clearColor(0, 0, 0, 0);\n gl.clearDepth(1);\n gl.depthMask(true);\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n gl.enable(gl.DEPTH_TEST);\n gl.depthFunc(gl.LEQUAL);\n gl.disable(gl.CULL_FACE);\n const seen = new Set<string>();\n for (const item of drawOrder(items)) {\n seen.add(item.key);\n const count = item.kind === \"mesh\" ? item.indices.length : item.count;\n if (count <= 0) continue;\n const res = upload(item);\n if (!res) continue;\n const program = programs[item.kind];\n gl.useProgram(program.program);\n const u = itemUniforms(item, frame, uniformData);\n const loc = program.uniforms;\n gl.uniformMatrix4fv(loc.u_viewProj, false, u.subarray(0, 16));\n gl.uniform4fv(loc.u_viewport, u.subarray(16, 20));\n gl.uniform4fv(loc.u_eye, u.subarray(20, 24));\n gl.uniform4fv(loc.u_light, u.subarray(24, 28));\n gl.uniform4fv(loc.u_material, u.subarray(28, 32));\n gl.uniform4fv(loc.u_params, u.subarray(32, 36));\n gl.uniform4fv(loc.u_fog, u.subarray(36, 40));\n gl.depthMask(writesDepth(item));\n bind(item, res);\n if (item.kind === \"mesh\") {\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, res.index);\n gl.drawElements(gl.TRIANGLES, count, gl.UNSIGNED_INT, 0);\n } else {\n drawInstanced(count);\n }\n }\n gl.depthMask(true);\n for (const [key, res] of resources) {\n if (!seen.has(key)) {\n gl.deleteBuffer(res.vertex);\n if (res.index) gl.deleteBuffer(res.index);\n resources.delete(key);\n }\n }\n },\n destroy() {\n canvas.removeEventListener(\"webglcontextlost\", handleLost);\n if (!gl.isContextLost()) {\n for (const res of resources.values()) {\n gl.deleteBuffer(res.vertex);\n if (res.index) gl.deleteBuffer(res.index);\n }\n for (const p of Object.values(programs)) gl.deleteProgram(p.program);\n gl.deleteBuffer(corners);\n }\n resources.clear();\n loseContext();\n },\n };\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"webgl.js","names":["SOFTWARE_RENDERER","isSoftwareRenderer","info","gl","name","UNIFORMS","compile","shader","s","type","code","vs","source","fs","program","attributes","i","uniforms","CORNERS","MAX_LOCATIONS","createWebGl3D","requireHardware","canvas","version","loseContext","gl2","angle","uint","divisor","location","value","drawInstanced","count","sources","glslPrograms","points","GLSL_ATTRIBUTES","mesh","lines","corners","programs","lost","handleLost","event","onLost","resources","uniformData","attribute","size","stride","offset","bind","F","U8","used","item","res","upload","existing","vertex","index","width","height","seen","additive","drawOrder","items","u","itemUniforms","frame","loc","writesDepth","add","key","p"],"sources":["../../../../../charts/src/engine/three-d/webgl.ts"],"sourcesContent":["// WebGL2 / WebGL (1) backend of the 3D charts: the same GLSL for both\n// (a macro prefix makes it GLSL ES 3.0), instancing through WebGL2 or\n// ANGLE_instanced_arrays, 32-bit indices through WebGL2 or\n// OES_element_index_uint. Attributes are bound for every draw (no vertex\n// array objects in WebGL 1): a few calls per item.\n\nimport type { RendererLostHandler } from \"../renderers/types\";\nimport {\n POINT_STRIDE,\n SEGMENT_STRIDE,\n VERTEX_STRIDE,\n drawOrder,\n type Item3D,\n type Renderer3D,\n} from \"./render-types\";\nimport {\n GLSL_ATTRIBUTES,\n glslPrograms,\n itemUniforms,\n writesDepth,\n type GlslSource,\n} from \"./shaders\";\n\ntype Gl = WebGLRenderingContext | WebGL2RenderingContext;\n\n/** Software rasterizers behind a WebGL context */\nexport const SOFTWARE_RENDERER =\n /swiftshader|llvmpipe|softpipe|software|basic render driver|microsoft basic/i;\n\nexport const isSoftwareRenderer = (gl: Gl): boolean => {\n const info = gl.getExtension(\"WEBGL_debug_renderer_info\");\n const name = info\n ? gl.getParameter(info.UNMASKED_RENDERER_WEBGL)\n : gl.getParameter(gl.RENDERER);\n return SOFTWARE_RENDERER.test(String(name ?? \"\"));\n};\n\nconst UNIFORMS = [\n \"u_viewProj\",\n \"u_viewport\",\n \"u_eye\",\n \"u_light\",\n \"u_material\",\n \"u_params\",\n \"u_fog\",\n] as const;\n\ninterface Program {\n program: WebGLProgram;\n uniforms: Record<(typeof UNIFORMS)[number], WebGLUniformLocation | null>;\n}\n\nconst compile = (\n gl: Gl,\n source: GlslSource,\n attributes: readonly string[],\n): Program | null => {\n const shader = (type: number, code: string) => {\n const s = gl.createShader(type);\n if (!s) return null;\n gl.shaderSource(s, code);\n gl.compileShader(s);\n if (!gl.getShaderParameter(s, gl.COMPILE_STATUS)) {\n gl.deleteShader(s);\n return null;\n }\n return s;\n };\n const vs = shader(gl.VERTEX_SHADER, source.vertex);\n const fs = shader(gl.FRAGMENT_SHADER, source.fragment);\n const program = gl.createProgram();\n if (!vs || !fs || !program) return null;\n gl.attachShader(program, vs);\n gl.attachShader(program, fs);\n attributes.forEach((name, i) => gl.bindAttribLocation(program, i, name));\n gl.linkProgram(program);\n gl.deleteShader(vs);\n gl.deleteShader(fs);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n gl.deleteProgram(program);\n return null;\n }\n const uniforms = {} as Program[\"uniforms\"];\n for (const name of UNIFORMS)\n uniforms[name] = gl.getUniformLocation(program, name);\n return { program, uniforms };\n};\n\ninterface ItemResources {\n version: number;\n kind: Item3D[\"kind\"];\n vertex: WebGLBuffer;\n index: WebGLBuffer | null;\n /** `order` of the uploaded indices (meshes) */\n order: number;\n}\n\n/** Corners of the triangle strip of a billboard / segment */\nconst CORNERS = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]);\nconst MAX_LOCATIONS = 4;\n\nexport const createWebGl3D = (\n canvas: HTMLCanvasElement,\n version: 1 | 2,\n onLost: RendererLostHandler,\n /** Refuses software rendering: the decimating Canvas2D backend is faster there */\n requireHardware = false,\n): Renderer3D | null => {\n const attributes: WebGLContextAttributes = {\n alpha: true,\n premultipliedAlpha: true,\n antialias: true,\n depth: true,\n stencil: false,\n preserveDrawingBuffer: false,\n failIfMajorPerformanceCaveat: requireHardware,\n };\n const gl = canvas.getContext(\n version === 2 ? \"webgl2\" : \"webgl\",\n attributes,\n ) as Gl | null;\n if (!gl) return null;\n const loseContext = () =>\n gl.getExtension(\"WEBGL_lose_context\")?.loseContext();\n const gl2 = version === 2 ? (gl as WebGL2RenderingContext) : null;\n const angle = gl2 ? null : gl.getExtension(\"ANGLE_instanced_arrays\");\n const uint = gl2 ? true : !!gl.getExtension(\"OES_element_index_uint\");\n if (\n (!gl2 && (!angle || !uint)) ||\n (requireHardware && isSoftwareRenderer(gl))\n ) {\n loseContext();\n return null;\n }\n const divisor = (location: number, value: number) => {\n if (gl2) gl2.vertexAttribDivisor(location, value);\n else angle?.vertexAttribDivisorANGLE(location, value);\n };\n const drawInstanced = (count: number) => {\n if (gl2) gl2.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, 4, count);\n else angle?.drawArraysInstancedANGLE(gl.TRIANGLE_STRIP, 0, 4, count);\n };\n\n const sources = glslPrograms(version);\n const points = compile(gl, sources.points, GLSL_ATTRIBUTES.points);\n const mesh = compile(gl, sources.mesh, GLSL_ATTRIBUTES.mesh);\n const lines = compile(gl, sources.lines, GLSL_ATTRIBUTES.lines);\n const corners = gl.createBuffer();\n if (!points || !mesh || !lines || !corners) {\n loseContext();\n return null;\n }\n const programs = { points, mesh, lines };\n gl.bindBuffer(gl.ARRAY_BUFFER, corners);\n gl.bufferData(gl.ARRAY_BUFFER, CORNERS, gl.STATIC_DRAW);\n\n let lost = false;\n const handleLost = (event: Event) => {\n event.preventDefault();\n lost = true;\n onLost();\n };\n canvas.addEventListener(\"webglcontextlost\", handleLost);\n\n const resources = new Map<string, ItemResources>();\n const uniformData = new Float32Array(40);\n\n const attribute = (\n location: number,\n size: number,\n type: number,\n stride: number,\n offset: number,\n perInstance: boolean,\n ) => {\n gl.enableVertexAttribArray(location);\n gl.vertexAttribPointer(\n location,\n size,\n type,\n type === gl.UNSIGNED_BYTE,\n stride,\n offset,\n );\n divisor(location, perInstance ? 1 : 0);\n };\n\n const bind = (item: Item3D, res: ItemResources) => {\n const F = gl.FLOAT;\n const U8 = gl.UNSIGNED_BYTE;\n let used: number;\n if (item.kind === \"mesh\") {\n gl.bindBuffer(gl.ARRAY_BUFFER, res.vertex);\n attribute(0, 3, F, VERTEX_STRIDE, 0, false);\n attribute(1, 3, F, VERTEX_STRIDE, 12, false);\n attribute(2, 4, U8, VERTEX_STRIDE, 24, false);\n used = 3;\n } else {\n gl.bindBuffer(gl.ARRAY_BUFFER, corners);\n attribute(0, 2, F, 0, 0, false);\n gl.bindBuffer(gl.ARRAY_BUFFER, res.vertex);\n if (item.kind === \"points\") {\n attribute(1, 3, F, POINT_STRIDE, 0, true);\n attribute(2, 1, F, POINT_STRIDE, 12, true);\n attribute(3, 4, U8, POINT_STRIDE, 16, true);\n } else {\n attribute(1, 3, F, SEGMENT_STRIDE, 0, true);\n attribute(2, 3, F, SEGMENT_STRIDE, 12, true);\n attribute(3, 4, U8, SEGMENT_STRIDE, 24, true);\n }\n used = 4;\n }\n for (let i = used; i < MAX_LOCATIONS; i++) {\n gl.disableVertexAttribArray(i);\n divisor(i, 0);\n }\n };\n\n const upload = (item: Item3D): ItemResources | null => {\n const existing = resources.get(item.key);\n if (\n existing &&\n existing.version === item.version &&\n existing.kind === item.kind\n ) {\n // same mesh, triangles in a new order (transparent, sorted by depth)\n if (\n item.kind === \"mesh\" &&\n existing.index &&\n (item.order ?? 0) !== existing.order\n ) {\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, existing.index);\n gl.bufferSubData(gl.ELEMENT_ARRAY_BUFFER, 0, item.indices);\n existing.order = item.order ?? 0;\n }\n return existing;\n }\n if (existing) {\n gl.deleteBuffer(existing.vertex);\n if (existing.index) gl.deleteBuffer(existing.index);\n resources.delete(item.key);\n }\n const vertex = gl.createBuffer();\n if (!vertex) return null;\n gl.bindBuffer(gl.ARRAY_BUFFER, vertex);\n gl.bufferData(\n gl.ARRAY_BUFFER,\n item.kind === \"mesh\" ? item.vertices : item.data,\n gl.STATIC_DRAW,\n );\n let index: WebGLBuffer | null = null;\n if (item.kind === \"mesh\") {\n index = gl.createBuffer();\n if (!index) {\n gl.deleteBuffer(vertex);\n return null;\n }\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, index);\n gl.bufferData(\n gl.ELEMENT_ARRAY_BUFFER,\n item.indices,\n item.order === undefined ? gl.STATIC_DRAW : gl.DYNAMIC_DRAW,\n );\n }\n const res = {\n version: item.version,\n kind: item.kind,\n vertex,\n index,\n order: item.kind === \"mesh\" ? (item.order ?? 0) : 0,\n };\n resources.set(item.key, res);\n return res;\n };\n\n return {\n kind: version === 2 ? \"webgl2\" : \"webgl\",\n canvas,\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(items, frame) {\n if (lost || gl.isContextLost()) return;\n gl.viewport(0, 0, canvas.width, canvas.height);\n gl.clearColor(0, 0, 0, 0);\n gl.clearDepth(1);\n gl.depthMask(true);\n gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n gl.enable(gl.DEPTH_TEST);\n gl.depthFunc(gl.LEQUAL);\n gl.disable(gl.CULL_FACE);\n const seen = new Set<string>();\n let additive = false;\n for (const item of drawOrder(items)) {\n seen.add(item.key);\n const count = item.kind === \"mesh\" ? item.indices.length : item.count;\n if (count <= 0) continue;\n const res = upload(item);\n if (!res) continue;\n const program = programs[item.kind];\n gl.useProgram(program.program);\n const u = itemUniforms(item, frame, uniformData);\n const loc = program.uniforms;\n gl.uniformMatrix4fv(loc.u_viewProj, false, u.subarray(0, 16));\n gl.uniform4fv(loc.u_viewport, u.subarray(16, 20));\n gl.uniform4fv(loc.u_eye, u.subarray(20, 24));\n gl.uniform4fv(loc.u_light, u.subarray(24, 28));\n gl.uniform4fv(loc.u_material, u.subarray(28, 32));\n gl.uniform4fv(loc.u_params, u.subarray(32, 36));\n gl.uniform4fv(loc.u_fog, u.subarray(36, 40));\n gl.depthMask(writesDepth(item));\n const add = item.kind === \"points\" && !!item.additive;\n if (add !== additive) {\n // additive points: the colors add up, the coverage composites as usual\n if (add)\n gl.blendFuncSeparate(\n gl.ONE,\n gl.ONE,\n gl.ONE,\n gl.ONE_MINUS_SRC_ALPHA,\n );\n else gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n additive = add;\n }\n bind(item, res);\n if (item.kind === \"mesh\") {\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, res.index);\n gl.drawElements(gl.TRIANGLES, count, gl.UNSIGNED_INT, 0);\n } else {\n drawInstanced(count);\n }\n }\n gl.depthMask(true);\n if (additive) gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n for (const [key, res] of resources) {\n if (!seen.has(key)) {\n gl.deleteBuffer(res.vertex);\n if (res.index) gl.deleteBuffer(res.index);\n resources.delete(key);\n }\n }\n },\n destroy() {\n canvas.removeEventListener(\"webglcontextlost\", handleLost);\n if (!gl.isContextLost()) {\n for (const res of resources.values()) {\n gl.deleteBuffer(res.vertex);\n if (res.index) gl.deleteBuffer(res.index);\n }\n for (const p of Object.values(programs)) gl.deleteProgram(p.program);\n gl.deleteBuffer(corners);\n }\n resources.clear();\n loseContext();\n },\n };\n};\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("./render-types.cjs"),t=require("./shaders.cjs");var n=16,r=32,i=8,a=16,o=4,s=async(s,c,l=!1)=>{let u=typeof navigator<`u`?navigator.gpu:void 0;if(!u)return null;let d=await u.requestAdapter();if(!d)return null;let f=d;if(l&&(f.info?.isFallbackAdapter||f.isFallbackAdapter))return null;let p=await d.requestDevice(),m=s.getContext(`webgpu`);if(!m)return p.destroy(),null;let h=u.getPreferredCanvasFormat();m.configure({device:p,format:h,alphaMode:`premultiplied`});let g=!1;p.lost.then(()=>{g||c()});let _=p.createBindGroupLayout({entries:[{binding:0,visibility:3,buffer:{type:`uniform`}}]}),v=p.createPipelineLayout({bindGroupLayouts:[_]}),y={color:{srcFactor:`one`,dstFactor:`one-minus-src-alpha`,operation:`add`},alpha:{srcFactor:`one`,dstFactor:`one-minus-src-alpha`,operation:`add`}},b=(e,t,n,r)=>{let
|
|
1
|
+
const e=require("./render-types.cjs"),t=require("./shaders.cjs");var n=16,r=32,i=8,a=16,o=4,s=async(s,c,l=!1)=>{let u=typeof navigator<`u`?navigator.gpu:void 0;if(!u)return null;let d=await u.requestAdapter();if(!d)return null;let f=d;if(l&&(f.info?.isFallbackAdapter||f.isFallbackAdapter))return null;let p=await d.requestDevice(),m=s.getContext(`webgpu`);if(!m)return p.destroy(),null;let h=u.getPreferredCanvasFormat();m.configure({device:p,format:h,alphaMode:`premultiplied`});let g=!1;p.lost.then(()=>{g||c()});let _=p.createBindGroupLayout({entries:[{binding:0,visibility:3,buffer:{type:`uniform`}}]}),v=p.createPipelineLayout({bindGroupLayouts:[_]}),y={color:{srcFactor:`one`,dstFactor:`one-minus-src-alpha`,operation:`add`},alpha:{srcFactor:`one`,dstFactor:`one-minus-src-alpha`,operation:`add`}},b={color:{srcFactor:`one`,dstFactor:`one`,operation:`add`},alpha:y.alpha},x=(e,t,n,r,i=y)=>{let a=p.createShaderModule({code:e});return p.createRenderPipeline({layout:v,vertex:{module:a,entryPoint:`vs`,buffers:t},fragment:{module:a,entryPoint:`fs`,targets:[{format:h,blend:i}]},primitive:{topology:n,cullMode:`none`},depthStencil:{format:`depth24plus`,depthWriteEnabled:r,depthCompare:`less-equal`},multisample:{count:o}})},S=[{arrayStride:20,stepMode:`instance`,attributes:[{shaderLocation:0,offset:0,format:`float32x3`},{shaderLocation:1,offset:12,format:`float32`},{shaderLocation:2,offset:16,format:`unorm8x4`}]}],C=[{arrayStride:28,stepMode:`vertex`,attributes:[{shaderLocation:0,offset:0,format:`float32x3`},{shaderLocation:1,offset:12,format:`float32x3`},{shaderLocation:2,offset:24,format:`unorm8x4`}]}],w=[{arrayStride:28,stepMode:`instance`,attributes:[{shaderLocation:0,offset:0,format:`float32x3`},{shaderLocation:1,offset:12,format:`float32x3`},{shaderLocation:2,offset:24,format:`unorm8x4`}]}],T={points:[x(t.WGSL_POINTS,S,`triangle-strip`,!1),x(t.WGSL_POINTS,S,`triangle-strip`,!0)],mesh:[x(t.WGSL_MESH,C,`triangle-list`,!1),x(t.WGSL_MESH,C,`triangle-list`,!0)],lines:[x(t.WGSL_LINES,w,`triangle-strip`,!1),x(t.WGSL_LINES,w,`triangle-strip`,!0)]},E=null,D=n=>{if(n.kind===`points`&&n.additive)return E??(E=x(t.WGSL_POINTS,S,`triangle-strip`,!1,b)),E;let r=T[n.kind];return r[e.writesDepth(n)?r.length-1:0]},O=null,k=()=>{let e=s.width,t=s.height;return O&&O.width===e&&O.height===t?O:(O?.color.destroy(),O?.depth.destroy(),O={width:e,height:t,color:p.createTexture({size:[e,t],sampleCount:o,format:h,usage:a}),depth:p.createTexture({size:[e,t],sampleCount:o,format:`depth24plus`,usage:a})},O)},A=new Map,j=new Float32Array(40),M=(e,t)=>{let n=e.byteLength;if(n<=0)return null;let r=p.createBuffer({size:Math.max(16,Math.ceil(n/4)*4),usage:t|i});return e instanceof Uint32Array?p.queue.writeBuffer(r,0,e.buffer,e.byteOffset,n):p.queue.writeBuffer(r,0,e),r},N=e=>{e.vertex?.destroy(),e.index?.destroy()},P=e=>{let t=A.get(e.key);if(t&&t.version===e.version&&t.kind===e.kind){if(e.kind===`mesh`&&t.index&&(e.order??0)!==t.order){let{indices:n}=e;p.queue.writeBuffer(t.index,0,n.buffer,n.byteOffset,n.byteLength),t.order=e.order??0}return t}t&&N(t);let i=M(e.kind===`mesh`?e.vertices:e.data,r),a=e.kind===`mesh`?M(e.indices,n):null;if(t)t.version=e.version,t.kind=e.kind,t.vertex=i,t.index=a,t.order=e.kind===`mesh`?e.order??0:0;else{let n=p.createBuffer({size:160,usage:72});t={version:e.version,kind:e.kind,vertex:i,index:a,order:e.kind===`mesh`?e.order??0:0,uniform:n,bindGroup:p.createBindGroup({layout:_,entries:[{binding:0,resource:{buffer:n}}]})},A.set(e.key,t)}return t};return{kind:`webgpu`,canvas:s,resize(e,t){s.width=Math.max(1,e),s.height=Math.max(1,t)},render(n,r){if(g)return;let{color:i,depth:a}=k(),o=p.createCommandEncoder(),s=o.beginRenderPass({colorAttachments:[{view:i.createView(),resolveTarget:m.getCurrentTexture().createView(),clearValue:{r:0,g:0,b:0,a:0},loadOp:`clear`,storeOp:`discard`}],depthStencilAttachment:{view:a.createView(),depthClearValue:1,depthLoadOp:`clear`,depthStoreOp:`discard`}}),c=new Set;for(let i of e.drawOrder(n)){c.add(i.key);let e=i.kind===`mesh`?i.indices.length:i.count;if(e<=0)continue;let n=P(i);if(!n.vertex)continue;p.queue.writeBuffer(n.uniform,0,t.itemUniforms(i,r,j));let a=D(i);if(a){if(s.setPipeline(a),s.setBindGroup(0,n.bindGroup),s.setVertexBuffer(0,n.vertex),i.kind===`mesh`){if(!n.index)continue;s.setIndexBuffer(n.index,`uint32`),s.drawIndexed(e)}else s.draw(4,e)}}s.end(),p.queue.submit([o.finish()]);for(let[e,t]of A)c.has(e)||(N(t),t.uniform.destroy(),A.delete(e))},destroy(){g=!0;for(let e of A.values())N(e),e.uniform.destroy();A.clear(),O?.color.destroy(),O?.depth.destroy(),O=null,m.unconfigure(),p.destroy()}}};exports.createWebGpu3D=s;
|
|
2
2
|
//# sourceMappingURL=webgpu.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webgpu.cjs","names":["WGSL_POINTS","WGSL_MESH","WGSL_LINES","drawOrder","itemUniforms","writesDepth","require_render_types","require_shaders","BUFFER_INDEX","BUFFER_VERTEX","BUFFER_COPY_DST","TEXTURE_RENDER_ATTACHMENT","SAMPLES","createWebGpu3D","gpu","adapter","fallback","requireHardware","device","context","canvas","format","destroyed","onLost","bindGroupLayout","layout","blend","pipeline","module","depthWrite","pointBuffers","meshBuffers","lineBuffers","pipelines","targets","renderTargets","width","height","resources","uniformData","buffer","bytes","data","gpuBuffer","usage","release","res","upload","item","indices","vertex","index","uniform","encoder","pass","color","depth","seen","items","count","frame","variants","chosen","key"],"sources":["../../../../../charts/src/engine/three-d/webgpu.ts"],"sourcesContent":["// WebGPU backend of the 3D charts: 4× MSAA, a depth buffer, one draw per\n// item (instanced billboards / segments, indexed triangles).\n\nimport type { RendererLostHandler } from \"../renderers/types\";\nimport {\n POINT_STRIDE,\n SEGMENT_STRIDE,\n VERTEX_STRIDE,\n drawOrder,\n type Item3D,\n type Renderer3D,\n} from \"./render-types\";\nimport {\n UNIFORM_BYTES,\n WGSL_LINES,\n WGSL_MESH,\n WGSL_POINTS,\n itemUniforms,\n writesDepth,\n} from \"./shaders\";\n\n// lib.dom has the WebGPU interfaces but not these constant objects\nconst BUFFER_INDEX = 0x10;\nconst BUFFER_VERTEX = 0x20;\nconst BUFFER_UNIFORM = 0x40;\nconst BUFFER_COPY_DST = 0x08;\nconst STAGE_VERTEX = 0x1;\nconst STAGE_FRAGMENT = 0x2;\nconst TEXTURE_RENDER_ATTACHMENT = 0x10;\n\nconst SAMPLES = 4;\n\ninterface ItemResources {\n version: number;\n kind: Item3D[\"kind\"];\n vertex: GPUBuffer | null;\n index: GPUBuffer | null;\n /** `order` of the uploaded indices (meshes) */\n order: number;\n uniform: GPUBuffer;\n bindGroup: GPUBindGroup;\n}\n\ntype GpuNavigator = Navigator & { gpu?: GPU };\n\nexport const createWebGpu3D = async (\n canvas: HTMLCanvasElement,\n onLost: RendererLostHandler,\n /** Refuses fallback (software) adapters */\n requireHardware = false,\n): Promise<Renderer3D | null> => {\n const gpu =\n typeof navigator !== \"undefined\"\n ? (navigator as GpuNavigator).gpu\n : undefined;\n if (!gpu) return null;\n const adapter = await gpu.requestAdapter();\n if (!adapter) return null;\n const fallback = adapter as GPUAdapter & {\n isFallbackAdapter?: boolean;\n info?: { isFallbackAdapter?: boolean };\n };\n if (\n requireHardware &&\n (fallback.info?.isFallbackAdapter || fallback.isFallbackAdapter)\n ) {\n return null;\n }\n const device = await adapter.requestDevice();\n const context = canvas.getContext(\"webgpu\") as GPUCanvasContext | null;\n if (!context) {\n device.destroy();\n return null;\n }\n const format = gpu.getPreferredCanvasFormat();\n context.configure({ device, format, alphaMode: \"premultiplied\" });\n\n let destroyed = false;\n void device.lost.then(() => {\n if (!destroyed) onLost();\n });\n\n const bindGroupLayout = device.createBindGroupLayout({\n entries: [\n {\n binding: 0,\n visibility: STAGE_VERTEX | STAGE_FRAGMENT,\n buffer: { type: \"uniform\" },\n },\n ],\n });\n const layout = device.createPipelineLayout({\n bindGroupLayouts: [bindGroupLayout],\n });\n const blend: GPUBlendState = {\n color: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n alpha: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n };\n const pipeline = (\n code: string,\n buffers: GPUVertexBufferLayout[],\n topology: GPUPrimitiveTopology,\n depthWrite: boolean,\n ) => {\n const module = device.createShaderModule({ code });\n return device.createRenderPipeline({\n layout,\n vertex: { module, entryPoint: \"vs\", buffers },\n fragment: { module, entryPoint: \"fs\", targets: [{ format, blend }] },\n primitive: { topology, cullMode: \"none\" },\n depthStencil: {\n format: \"depth24plus\",\n depthWriteEnabled: depthWrite,\n depthCompare: \"less-equal\",\n },\n multisample: { count: SAMPLES },\n });\n };\n const pointBuffers: GPUVertexBufferLayout[] = [\n {\n arrayStride: POINT_STRIDE,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x3\" },\n { shaderLocation: 1, offset: 12, format: \"float32\" },\n { shaderLocation: 2, offset: 16, format: \"unorm8x4\" },\n ],\n },\n ];\n const meshBuffers: GPUVertexBufferLayout[] = [\n {\n arrayStride: VERTEX_STRIDE,\n stepMode: \"vertex\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x3\" },\n { shaderLocation: 1, offset: 12, format: \"float32x3\" },\n { shaderLocation: 2, offset: 24, format: \"unorm8x4\" },\n ],\n },\n ];\n const lineBuffers: GPUVertexBufferLayout[] = [\n {\n arrayStride: SEGMENT_STRIDE,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x3\" },\n { shaderLocation: 1, offset: 12, format: \"float32x3\" },\n { shaderLocation: 2, offset: 24, format: \"unorm8x4\" },\n ],\n },\n ];\n const pipelines = {\n points: [\n pipeline(WGSL_POINTS, pointBuffers, \"triangle-strip\", false),\n pipeline(WGSL_POINTS, pointBuffers, \"triangle-strip\", true),\n ],\n mesh: [\n pipeline(WGSL_MESH, meshBuffers, \"triangle-list\", false),\n pipeline(WGSL_MESH, meshBuffers, \"triangle-list\", true),\n ],\n lines: [\n pipeline(WGSL_LINES, lineBuffers, \"triangle-strip\", false),\n pipeline(WGSL_LINES, lineBuffers, \"triangle-strip\", true),\n ],\n };\n\n let targets: {\n width: number;\n height: number;\n color: GPUTexture;\n depth: GPUTexture;\n } | null = null;\n const renderTargets = () => {\n const width = canvas.width;\n const height = canvas.height;\n if (targets && targets.width === width && targets.height === height)\n return targets;\n targets?.color.destroy();\n targets?.depth.destroy();\n targets = {\n width,\n height,\n color: device.createTexture({\n size: [width, height],\n sampleCount: SAMPLES,\n format,\n usage: TEXTURE_RENDER_ATTACHMENT,\n }),\n depth: device.createTexture({\n size: [width, height],\n sampleCount: SAMPLES,\n format: \"depth24plus\",\n usage: TEXTURE_RENDER_ATTACHMENT,\n }),\n };\n return targets;\n };\n\n const resources = new Map<string, ItemResources>();\n const uniformData = new Float32Array(UNIFORM_BYTES / 4);\n\n const buffer = (data: ArrayBuffer | Uint32Array, usage: number) => {\n const bytes = data.byteLength;\n if (bytes <= 0) return null;\n const gpuBuffer = device.createBuffer({\n size: Math.max(16, Math.ceil(bytes / 4) * 4),\n usage: usage | BUFFER_COPY_DST,\n });\n if (data instanceof Uint32Array) {\n device.queue.writeBuffer(\n gpuBuffer,\n 0,\n data.buffer,\n data.byteOffset,\n bytes,\n );\n } else {\n device.queue.writeBuffer(gpuBuffer, 0, data);\n }\n return gpuBuffer;\n };\n\n const release = (res: ItemResources) => {\n res.vertex?.destroy();\n res.index?.destroy();\n };\n\n const upload = (item: Item3D): ItemResources => {\n let res = resources.get(item.key);\n if (res && res.version === item.version && res.kind === item.kind) {\n // same mesh, triangles in a new order (transparent, sorted by depth)\n if (\n item.kind === \"mesh\" &&\n res.index &&\n (item.order ?? 0) !== res.order\n ) {\n const { indices } = item;\n device.queue.writeBuffer(\n res.index,\n 0,\n indices.buffer,\n indices.byteOffset,\n indices.byteLength,\n );\n res.order = item.order ?? 0;\n }\n return res;\n }\n if (res) release(res);\n const vertex = buffer(\n item.kind === \"mesh\" ? item.vertices : item.data,\n BUFFER_VERTEX,\n );\n const index =\n item.kind === \"mesh\" ? buffer(item.indices, BUFFER_INDEX) : null;\n if (!res) {\n const uniform = device.createBuffer({\n size: UNIFORM_BYTES,\n usage: BUFFER_UNIFORM | BUFFER_COPY_DST,\n });\n res = {\n version: item.version,\n kind: item.kind,\n vertex,\n index,\n order: item.kind === \"mesh\" ? (item.order ?? 0) : 0,\n uniform,\n bindGroup: device.createBindGroup({\n layout: bindGroupLayout,\n entries: [{ binding: 0, resource: { buffer: uniform } }],\n }),\n };\n resources.set(item.key, res);\n } else {\n res.version = item.version;\n res.kind = item.kind;\n res.vertex = vertex;\n res.index = index;\n res.order = item.kind === \"mesh\" ? (item.order ?? 0) : 0;\n }\n return res;\n };\n\n return {\n kind: \"webgpu\",\n canvas,\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(items, frame) {\n if (destroyed) return;\n const { color, depth } = renderTargets();\n const encoder = device.createCommandEncoder();\n const pass = encoder.beginRenderPass({\n colorAttachments: [\n {\n view: color.createView(),\n resolveTarget: context.getCurrentTexture().createView(),\n clearValue: { r: 0, g: 0, b: 0, a: 0 },\n loadOp: \"clear\",\n storeOp: \"discard\",\n },\n ],\n depthStencilAttachment: {\n view: depth.createView(),\n depthClearValue: 1,\n depthLoadOp: \"clear\",\n depthStoreOp: \"discard\",\n },\n });\n const seen = new Set<string>();\n for (const item of drawOrder(items)) {\n seen.add(item.key);\n const count = item.kind === \"mesh\" ? item.indices.length : item.count;\n if (count <= 0) continue;\n const res = upload(item);\n if (!res.vertex) continue;\n device.queue.writeBuffer(\n res.uniform,\n 0,\n itemUniforms(item, frame, uniformData),\n );\n const variants = pipelines[item.kind];\n const chosen = variants[writesDepth(item) ? variants.length - 1 : 0];\n if (!chosen) continue;\n pass.setPipeline(chosen);\n pass.setBindGroup(0, res.bindGroup);\n pass.setVertexBuffer(0, res.vertex);\n if (item.kind === \"mesh\") {\n if (!res.index) continue;\n pass.setIndexBuffer(res.index, \"uint32\");\n pass.drawIndexed(count);\n } else {\n pass.draw(4, count);\n }\n }\n pass.end();\n device.queue.submit([encoder.finish()]);\n for (const [key, res] of resources) {\n if (!seen.has(key)) {\n release(res);\n res.uniform.destroy();\n resources.delete(key);\n }\n }\n },\n destroy() {\n destroyed = true;\n for (const res of resources.values()) {\n release(res);\n res.uniform.destroy();\n }\n resources.clear();\n targets?.color.destroy();\n targets?.depth.destroy();\n targets = null;\n context.unconfigure();\n device.destroy();\n },\n };\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"webgpu.cjs","names":["WGSL_POINTS","WGSL_MESH","WGSL_LINES","writesDepth","drawOrder","itemUniforms","require_render_types","require_shaders","BUFFER_INDEX","BUFFER_VERTEX","BUFFER_COPY_DST","TEXTURE_RENDER_ATTACHMENT","SAMPLES","createWebGpu3D","gpu","adapter","fallback","requireHardware","device","context","canvas","format","destroyed","onLost","bindGroupLayout","layout","blend","additive","pipeline","module","blending","depthWrite","pointBuffers","meshBuffers","lineBuffers","pipelines","additivePoints","pipelineOf","item","variants","targets","renderTargets","width","height","resources","uniformData","buffer","bytes","data","gpuBuffer","usage","release","res","upload","indices","vertex","index","uniform","encoder","pass","color","depth","seen","items","count","frame","chosen","key"],"sources":["../../../../../charts/src/engine/three-d/webgpu.ts"],"sourcesContent":["// WebGPU backend of the 3D charts: 4× MSAA, a depth buffer, one draw per\n// item (instanced billboards / segments, indexed triangles).\n\nimport type { RendererLostHandler } from \"../renderers/types\";\nimport {\n POINT_STRIDE,\n SEGMENT_STRIDE,\n VERTEX_STRIDE,\n drawOrder,\n type Item3D,\n type Renderer3D,\n} from \"./render-types\";\nimport {\n UNIFORM_BYTES,\n WGSL_LINES,\n WGSL_MESH,\n WGSL_POINTS,\n itemUniforms,\n writesDepth,\n} from \"./shaders\";\n\n// lib.dom has the WebGPU interfaces but not these constant objects\nconst BUFFER_INDEX = 0x10;\nconst BUFFER_VERTEX = 0x20;\nconst BUFFER_UNIFORM = 0x40;\nconst BUFFER_COPY_DST = 0x08;\nconst STAGE_VERTEX = 0x1;\nconst STAGE_FRAGMENT = 0x2;\nconst TEXTURE_RENDER_ATTACHMENT = 0x10;\n\nconst SAMPLES = 4;\n\ninterface ItemResources {\n version: number;\n kind: Item3D[\"kind\"];\n vertex: GPUBuffer | null;\n index: GPUBuffer | null;\n /** `order` of the uploaded indices (meshes) */\n order: number;\n uniform: GPUBuffer;\n bindGroup: GPUBindGroup;\n}\n\ntype GpuNavigator = Navigator & { gpu?: GPU };\n\nexport const createWebGpu3D = async (\n canvas: HTMLCanvasElement,\n onLost: RendererLostHandler,\n /** Refuses fallback (software) adapters */\n requireHardware = false,\n): Promise<Renderer3D | null> => {\n const gpu =\n typeof navigator !== \"undefined\"\n ? (navigator as GpuNavigator).gpu\n : undefined;\n if (!gpu) return null;\n const adapter = await gpu.requestAdapter();\n if (!adapter) return null;\n const fallback = adapter as GPUAdapter & {\n isFallbackAdapter?: boolean;\n info?: { isFallbackAdapter?: boolean };\n };\n if (\n requireHardware &&\n (fallback.info?.isFallbackAdapter || fallback.isFallbackAdapter)\n ) {\n return null;\n }\n const device = await adapter.requestDevice();\n const context = canvas.getContext(\"webgpu\") as GPUCanvasContext | null;\n if (!context) {\n device.destroy();\n return null;\n }\n const format = gpu.getPreferredCanvasFormat();\n context.configure({ device, format, alphaMode: \"premultiplied\" });\n\n let destroyed = false;\n void device.lost.then(() => {\n if (!destroyed) onLost();\n });\n\n const bindGroupLayout = device.createBindGroupLayout({\n entries: [\n {\n binding: 0,\n visibility: STAGE_VERTEX | STAGE_FRAGMENT,\n buffer: { type: \"uniform\" },\n },\n ],\n });\n const layout = device.createPipelineLayout({\n bindGroupLayouts: [bindGroupLayout],\n });\n const blend: GPUBlendState = {\n color: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n alpha: {\n srcFactor: \"one\",\n dstFactor: \"one-minus-src-alpha\",\n operation: \"add\",\n },\n };\n // additive points: the colors add up, the coverage composites as usual\n const additive: GPUBlendState = {\n color: { srcFactor: \"one\", dstFactor: \"one\", operation: \"add\" },\n alpha: blend.alpha,\n };\n const pipeline = (\n code: string,\n buffers: GPUVertexBufferLayout[],\n topology: GPUPrimitiveTopology,\n depthWrite: boolean,\n blending: GPUBlendState = blend,\n ) => {\n const module = device.createShaderModule({ code });\n return device.createRenderPipeline({\n layout,\n vertex: { module, entryPoint: \"vs\", buffers },\n fragment: {\n module,\n entryPoint: \"fs\",\n targets: [{ format, blend: blending }],\n },\n primitive: { topology, cullMode: \"none\" },\n depthStencil: {\n format: \"depth24plus\",\n depthWriteEnabled: depthWrite,\n depthCompare: \"less-equal\",\n },\n multisample: { count: SAMPLES },\n });\n };\n const pointBuffers: GPUVertexBufferLayout[] = [\n {\n arrayStride: POINT_STRIDE,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x3\" },\n { shaderLocation: 1, offset: 12, format: \"float32\" },\n { shaderLocation: 2, offset: 16, format: \"unorm8x4\" },\n ],\n },\n ];\n const meshBuffers: GPUVertexBufferLayout[] = [\n {\n arrayStride: VERTEX_STRIDE,\n stepMode: \"vertex\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x3\" },\n { shaderLocation: 1, offset: 12, format: \"float32x3\" },\n { shaderLocation: 2, offset: 24, format: \"unorm8x4\" },\n ],\n },\n ];\n const lineBuffers: GPUVertexBufferLayout[] = [\n {\n arrayStride: SEGMENT_STRIDE,\n stepMode: \"instance\",\n attributes: [\n { shaderLocation: 0, offset: 0, format: \"float32x3\" },\n { shaderLocation: 1, offset: 12, format: \"float32x3\" },\n { shaderLocation: 2, offset: 24, format: \"unorm8x4\" },\n ],\n },\n ];\n const pipelines = {\n points: [\n pipeline(WGSL_POINTS, pointBuffers, \"triangle-strip\", false),\n pipeline(WGSL_POINTS, pointBuffers, \"triangle-strip\", true),\n ],\n mesh: [\n pipeline(WGSL_MESH, meshBuffers, \"triangle-list\", false),\n pipeline(WGSL_MESH, meshBuffers, \"triangle-list\", true),\n ],\n lines: [\n pipeline(WGSL_LINES, lineBuffers, \"triangle-strip\", false),\n pipeline(WGSL_LINES, lineBuffers, \"triangle-strip\", true),\n ],\n };\n let additivePoints: GPURenderPipeline | null = null;\n const pipelineOf = (item: Item3D) => {\n if (item.kind === \"points\" && item.additive) {\n additivePoints ??= pipeline(\n WGSL_POINTS,\n pointBuffers,\n \"triangle-strip\",\n false,\n additive,\n );\n return additivePoints;\n }\n const variants = pipelines[item.kind];\n return variants[writesDepth(item) ? variants.length - 1 : 0];\n };\n\n let targets: {\n width: number;\n height: number;\n color: GPUTexture;\n depth: GPUTexture;\n } | null = null;\n const renderTargets = () => {\n const width = canvas.width;\n const height = canvas.height;\n if (targets && targets.width === width && targets.height === height)\n return targets;\n targets?.color.destroy();\n targets?.depth.destroy();\n targets = {\n width,\n height,\n color: device.createTexture({\n size: [width, height],\n sampleCount: SAMPLES,\n format,\n usage: TEXTURE_RENDER_ATTACHMENT,\n }),\n depth: device.createTexture({\n size: [width, height],\n sampleCount: SAMPLES,\n format: \"depth24plus\",\n usage: TEXTURE_RENDER_ATTACHMENT,\n }),\n };\n return targets;\n };\n\n const resources = new Map<string, ItemResources>();\n const uniformData = new Float32Array(UNIFORM_BYTES / 4);\n\n const buffer = (data: ArrayBuffer | Uint32Array, usage: number) => {\n const bytes = data.byteLength;\n if (bytes <= 0) return null;\n const gpuBuffer = device.createBuffer({\n size: Math.max(16, Math.ceil(bytes / 4) * 4),\n usage: usage | BUFFER_COPY_DST,\n });\n if (data instanceof Uint32Array) {\n device.queue.writeBuffer(\n gpuBuffer,\n 0,\n data.buffer,\n data.byteOffset,\n bytes,\n );\n } else {\n device.queue.writeBuffer(gpuBuffer, 0, data);\n }\n return gpuBuffer;\n };\n\n const release = (res: ItemResources) => {\n res.vertex?.destroy();\n res.index?.destroy();\n };\n\n const upload = (item: Item3D): ItemResources => {\n let res = resources.get(item.key);\n if (res && res.version === item.version && res.kind === item.kind) {\n // same mesh, triangles in a new order (transparent, sorted by depth)\n if (\n item.kind === \"mesh\" &&\n res.index &&\n (item.order ?? 0) !== res.order\n ) {\n const { indices } = item;\n device.queue.writeBuffer(\n res.index,\n 0,\n indices.buffer,\n indices.byteOffset,\n indices.byteLength,\n );\n res.order = item.order ?? 0;\n }\n return res;\n }\n if (res) release(res);\n const vertex = buffer(\n item.kind === \"mesh\" ? item.vertices : item.data,\n BUFFER_VERTEX,\n );\n const index =\n item.kind === \"mesh\" ? buffer(item.indices, BUFFER_INDEX) : null;\n if (!res) {\n const uniform = device.createBuffer({\n size: UNIFORM_BYTES,\n usage: BUFFER_UNIFORM | BUFFER_COPY_DST,\n });\n res = {\n version: item.version,\n kind: item.kind,\n vertex,\n index,\n order: item.kind === \"mesh\" ? (item.order ?? 0) : 0,\n uniform,\n bindGroup: device.createBindGroup({\n layout: bindGroupLayout,\n entries: [{ binding: 0, resource: { buffer: uniform } }],\n }),\n };\n resources.set(item.key, res);\n } else {\n res.version = item.version;\n res.kind = item.kind;\n res.vertex = vertex;\n res.index = index;\n res.order = item.kind === \"mesh\" ? (item.order ?? 0) : 0;\n }\n return res;\n };\n\n return {\n kind: \"webgpu\",\n canvas,\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(items, frame) {\n if (destroyed) return;\n const { color, depth } = renderTargets();\n const encoder = device.createCommandEncoder();\n const pass = encoder.beginRenderPass({\n colorAttachments: [\n {\n view: color.createView(),\n resolveTarget: context.getCurrentTexture().createView(),\n clearValue: { r: 0, g: 0, b: 0, a: 0 },\n loadOp: \"clear\",\n storeOp: \"discard\",\n },\n ],\n depthStencilAttachment: {\n view: depth.createView(),\n depthClearValue: 1,\n depthLoadOp: \"clear\",\n depthStoreOp: \"discard\",\n },\n });\n const seen = new Set<string>();\n for (const item of drawOrder(items)) {\n seen.add(item.key);\n const count = item.kind === \"mesh\" ? item.indices.length : item.count;\n if (count <= 0) continue;\n const res = upload(item);\n if (!res.vertex) continue;\n device.queue.writeBuffer(\n res.uniform,\n 0,\n itemUniforms(item, frame, uniformData),\n );\n const chosen = pipelineOf(item);\n if (!chosen) continue;\n pass.setPipeline(chosen);\n pass.setBindGroup(0, res.bindGroup);\n pass.setVertexBuffer(0, res.vertex);\n if (item.kind === \"mesh\") {\n if (!res.index) continue;\n pass.setIndexBuffer(res.index, \"uint32\");\n pass.drawIndexed(count);\n } else {\n pass.draw(4, count);\n }\n }\n pass.end();\n device.queue.submit([encoder.finish()]);\n for (const [key, res] of resources) {\n if (!seen.has(key)) {\n release(res);\n res.uniform.destroy();\n resources.delete(key);\n }\n }\n },\n destroy() {\n destroyed = true;\n for (const res of resources.values()) {\n release(res);\n res.uniform.destroy();\n }\n resources.clear();\n targets?.color.destroy();\n targets?.depth.destroy();\n targets = null;\n context.unconfigure();\n device.destroy();\n },\n };\n};\n"],"mappings":"iEAsBA,IAAMQ,EAAe,GACfC,EAAgB,GAEhBC,EAAkB,EAGlBC,EAA4B,GAE5BC,EAAU,EAeHC,EAAiB,MAC5B,EACA,EAEA,EAAkB,KACa,CAC/B,IAAMC,EACJ,OAAO,UAAc,IAChB,UAA2B,IAC5B,IAAA,GACN,GAAI,CAACA,EAAK,OAAO,KACjB,IAAMC,EAAU,MAAMD,EAAI,eAAe,EACzC,GAAI,CAACC,EAAS,OAAO,KACrB,IAAMC,EAAWD,EAIjB,GACEE,IACCD,EAAS,MAAM,mBAAqBA,EAAS,mBAE9C,OAAO,KAET,IAAME,EAAS,MAAMH,EAAQ,cAAc,EACrCI,EAAUC,EAAO,WAAW,QAAQ,EAC1C,GAAI,CAACD,EAEH,OADAD,EAAO,QAAQ,EACR,KAET,IAAMG,EAASP,EAAI,yBAAyB,EAC5CK,EAAQ,UAAU,CAAE,SAAQ,SAAQ,UAAW,eAAgB,CAAC,EAEhE,IAAIG,EAAY,GAChBJ,EAAY,KAAK,SAAW,CACrBI,GAAWC,EAAO,CACzB,CAAC,EAED,IAAMC,EAAkBN,EAAO,sBAAsB,CACnD,QAAS,CACP,CACE,QAAS,EACT,WAAY,EACZ,OAAQ,CAAE,KAAM,SAAU,CAC5B,CACF,CACF,CAAC,EACKO,EAASP,EAAO,qBAAqB,CACzC,iBAAkB,CAACM,CAAe,CACpC,CAAC,EACKE,EAAuB,CAC3B,MAAO,CACL,UAAW,MACX,UAAW,sBACX,UAAW,KACb,EACA,MAAO,CACL,UAAW,MACX,UAAW,sBACX,UAAW,KACb,CACF,EAEMC,EAA0B,CAC9B,MAAO,CAAE,UAAW,MAAO,UAAW,MAAO,UAAW,KAAM,EAC9D,MAAOD,EAAM,KACf,EACME,GACJ,EACA,EACA,EACA,EACA,EAA0BF,IACvB,CACH,IAAMG,EAASX,EAAO,mBAAmB,CAAE,MAAK,CAAC,EACjD,OAAOA,EAAO,qBAAqB,CACjC,SACA,OAAQ,CAAE,SAAQ,WAAY,KAAM,SAAQ,EAC5C,SAAU,CACR,SACA,WAAY,KACZ,QAAS,CAAC,CAAE,SAAQ,MAAOY,CAAS,CAAC,CACvC,EACA,UAAW,CAAE,WAAU,SAAU,MAAO,EACxC,aAAc,CACZ,OAAQ,cACR,kBAAmBC,EACnB,aAAc,YAChB,EACA,YAAa,CAAE,MAAOnB,CAAQ,CAChC,CAAC,CACH,EACMoB,EAAwC,CAC5C,CACE,YAAA,GACA,SAAU,WACV,WAAY,CACV,CAAE,eAAgB,EAAG,OAAQ,EAAG,OAAQ,WAAY,EACpD,CAAE,eAAgB,EAAG,OAAQ,GAAI,OAAQ,SAAU,EACnD,CAAE,eAAgB,EAAG,OAAQ,GAAI,OAAQ,UAAW,CACtD,CACF,CACF,EACMC,EAAuC,CAC3C,CACE,YAAA,GACA,SAAU,SACV,WAAY,CACV,CAAE,eAAgB,EAAG,OAAQ,EAAG,OAAQ,WAAY,EACpD,CAAE,eAAgB,EAAG,OAAQ,GAAI,OAAQ,WAAY,EACrD,CAAE,eAAgB,EAAG,OAAQ,GAAI,OAAQ,UAAW,CACtD,CACF,CACF,EACMC,EAAuC,CAC3C,CACE,YAAA,GACA,SAAU,WACV,WAAY,CACV,CAAE,eAAgB,EAAG,OAAQ,EAAG,OAAQ,WAAY,EACpD,CAAE,eAAgB,EAAG,OAAQ,GAAI,OAAQ,WAAY,EACrD,CAAE,eAAgB,EAAG,OAAQ,GAAI,OAAQ,UAAW,CACtD,CACF,CACF,EACMC,EAAY,CAChB,OAAQ,CACNP,EAAS5B,EAAAA,YAAagC,EAAc,iBAAkB,EAAK,EAC3DJ,EAAS5B,EAAAA,YAAagC,EAAc,iBAAkB,EAAI,CAC5D,EACA,KAAM,CACJJ,EAAS3B,EAAAA,UAAWgC,EAAa,gBAAiB,EAAK,EACvDL,EAAS3B,EAAAA,UAAWgC,EAAa,gBAAiB,EAAI,CACxD,EACA,MAAO,CACLL,EAAS1B,EAAAA,WAAYgC,EAAa,iBAAkB,EAAK,EACzDN,EAAS1B,EAAAA,WAAYgC,EAAa,iBAAkB,EAAI,CAC1D,CACF,EACIE,EAA2C,KACzCC,EAAc,GAAiB,CACnC,GAAIC,EAAK,OAAS,UAAYA,EAAK,SAQjC,OAPAF,IAAA,EAAmBR,EACjB5B,EAAAA,YACAgC,EACA,iBACA,GACAL,CACF,GACOS,EAET,IAAMG,EAAWJ,EAAUG,EAAK,MAChC,OAAOC,EAASpC,EAAAA,YAAYmC,CAAI,EAAIC,EAAS,OAAS,EAAI,EAC5D,EAEIC,EAKO,KACLC,MAAsB,CAC1B,IAAMC,EAAQtB,EAAO,MACfuB,EAASvB,EAAO,OAqBtB,OApBIoB,GAAWA,EAAQ,QAAUE,GAASF,EAAQ,SAAWG,EACpDH,GACTA,GAAS,MAAM,QAAQ,EACvBA,GAAS,MAAM,QAAQ,EACvB,EAAU,CACR,QACA,SACA,MAAOtB,EAAO,cAAc,CAC1B,KAAM,CAACwB,EAAOC,CAAM,EACpB,YAAa/B,EACb,SACA,MAAOD,CACT,CAAC,EACD,MAAOO,EAAO,cAAc,CAC1B,KAAM,CAACwB,EAAOC,CAAM,EACpB,YAAa/B,EACb,OAAQ,cACR,MAAOD,CACT,CAAC,CACH,EACO6B,EACT,EAEMI,EAAY,IAAI,IAChBC,EAAc,IAAI,aAAA,EAA8B,EAEhDC,GAAU,EAAiC,IAAkB,CACjE,IAAMC,EAAQC,EAAK,WACnB,GAAID,GAAS,EAAG,OAAO,KACvB,IAAME,EAAY/B,EAAO,aAAa,CACpC,KAAM,KAAK,IAAI,GAAI,KAAK,KAAK6B,EAAQ,CAAC,EAAI,CAAC,EAC3C,MAAOG,EAAQxC,CACjB,CAAC,EAYD,OAXIsC,aAAgB,YAClB9B,EAAO,MAAM,YACX+B,EACA,EACAD,EAAK,OACLA,EAAK,WACLD,CACF,EAEA7B,EAAO,MAAM,YAAY+B,EAAW,EAAGD,CAAI,EAEtCC,CACT,EAEME,EAAW,GAAuB,CACtCC,EAAI,QAAQ,QAAQ,EACpBA,EAAI,OAAO,QAAQ,CACrB,EAEMC,EAAU,GAAgC,CAC9C,IAAID,EAAMR,EAAU,IAAIN,EAAK,GAAG,EAChC,GAAIc,GAAOA,EAAI,UAAYd,EAAK,SAAWc,EAAI,OAASd,EAAK,KAAM,CAEjE,GACEA,EAAK,OAAS,QACdc,EAAI,QACHd,EAAK,OAAS,KAAOc,EAAI,MAC1B,CACA,GAAM,CAAE,WAAYd,EACpBpB,EAAO,MAAM,YACXkC,EAAI,MACJ,EACAE,EAAQ,OACRA,EAAQ,WACRA,EAAQ,UACV,EACA,EAAI,MAAQhB,EAAK,OAAS,CAC5B,CACA,OAAOc,CACT,CACIA,GAAKD,EAAQC,CAAG,EACpB,IAAMG,EAAST,EACbR,EAAK,OAAS,OAASA,EAAK,SAAWA,EAAK,KAC5C7B,CACF,EACM+C,EACJlB,EAAK,OAAS,OAASQ,EAAOR,EAAK,QAAS9B,CAAY,EAAI,KAC9D,GAAK4C,EAmBH,EAAI,QAAUd,EAAK,QACnB,EAAI,KAAOA,EAAK,KAChB,EAAI,OAASiB,EACb,EAAI,MAAQC,EACZ,EAAI,MAAQlB,EAAK,OAAS,OAAUA,EAAK,OAAS,EAAK,MAvB/C,CACR,IAAMmB,EAAUvC,EAAO,aAAa,CAClC,KAAA,IACA,MAAO,EACT,CAAC,EACD,EAAM,CACJ,QAASoB,EAAK,QACd,KAAMA,EAAK,KACX,SACA,QACA,MAAOA,EAAK,OAAS,OAAUA,EAAK,OAAS,EAAK,EAClD,UACA,UAAWpB,EAAO,gBAAgB,CAChC,OAAQM,EACR,QAAS,CAAC,CAAE,QAAS,EAAG,SAAU,CAAE,OAAQiC,CAAQ,CAAE,CAAC,CACzD,CAAC,CACH,EACAb,EAAU,IAAIN,EAAK,IAAKc,CAAG,CAC7B,CAOA,OAAOA,CACT,EAEA,MAAO,CACL,KAAM,SACN,SACA,OAAO,EAAO,EAAQ,CACpB,EAAO,MAAQ,KAAK,IAAI,EAAGV,CAAK,EAChC,EAAO,OAAS,KAAK,IAAI,EAAGC,CAAM,CACpC,EACA,OAAO,EAAO,EAAO,CACnB,GAAIrB,EAAW,OACf,GAAM,CAAE,QAAO,SAAUmB,EAAc,EACjCiB,EAAUxC,EAAO,qBAAqB,EACtCyC,EAAOD,EAAQ,gBAAgB,CACnC,iBAAkB,CAChB,CACE,KAAME,EAAM,WAAW,EACvB,cAAezC,EAAQ,kBAAkB,CAAC,CAAC,WAAW,EACtD,WAAY,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EACrC,OAAQ,QACR,QAAS,SACX,CACF,EACA,uBAAwB,CACtB,KAAM0C,EAAM,WAAW,EACvB,gBAAiB,EACjB,YAAa,QACb,aAAc,SAChB,CACF,CAAC,EACKC,EAAO,IAAI,IACjB,IAAK,IAAMxB,KAAQlC,EAAAA,UAAU2D,CAAK,EAAG,CACnCD,EAAK,IAAIxB,EAAK,GAAG,EACjB,IAAM0B,EAAQ1B,EAAK,OAAS,OAASA,EAAK,QAAQ,OAASA,EAAK,MAChE,GAAI0B,GAAS,EAAG,SAChB,IAAMZ,EAAMC,EAAOf,CAAI,EACvB,GAAI,CAACc,EAAI,OAAQ,SACjBlC,EAAO,MAAM,YACXkC,EAAI,QACJ,EACA/C,EAAAA,aAAaiC,EAAM2B,EAAOpB,CAAW,CACvC,EACA,IAAMqB,EAAS7B,EAAWC,CAAI,EAC9B,GAAK4B,EAIL,IAHAP,EAAK,YAAYO,CAAM,EACvBP,EAAK,aAAa,EAAGP,EAAI,SAAS,EAClCO,EAAK,gBAAgB,EAAGP,EAAI,MAAM,EAC9Bd,EAAK,OAAS,OAAQ,CACxB,GAAI,CAACc,EAAI,MAAO,SAChBO,EAAK,eAAeP,EAAI,MAAO,QAAQ,EACvCO,EAAK,YAAYK,CAAK,CACxB,MACEL,EAAK,KAAK,EAAGK,CAAK,CAAA,CAEtB,CACAL,EAAK,IAAI,EACTzC,EAAO,MAAM,OAAO,CAACwC,EAAQ,OAAO,CAAC,CAAC,EACtC,IAAK,GAAM,CAACS,EAAKf,KAAQR,EAClBkB,EAAK,IAAIK,CAAG,IACfhB,EAAQC,CAAG,EACXA,EAAI,QAAQ,QAAQ,EACpBR,EAAU,OAAOuB,CAAG,EAG1B,EACA,SAAU,CACR,EAAY,GACZ,IAAK,IAAMf,KAAOR,EAAU,OAAO,EACjCO,EAAQC,CAAG,EACXA,EAAI,QAAQ,QAAQ,EAEtBR,EAAU,MAAM,EAChBJ,GAAS,MAAM,QAAQ,EACvBA,GAAS,MAAM,QAAQ,EACvB,EAAU,KACVrB,EAAQ,YAAY,EACpBD,EAAO,QAAQ,CACjB,CACF,CACF"}
|