webgl2-sdf 0.0.3 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +76 -65
- package/browser/index.min.js +1 -1
- package/node/bezier/bezier-curves-to-line-segs.d.ts +1 -1
- package/node/bezier/bezier-curves-to-line-segs.js +2 -2
- package/node/bezier/bezier-curves-to-line-segs.js.map +1 -1
- package/node/bezier/split-into-line-segments.d.ts +1 -1
- package/node/bezier/split-into-line-segments.js +5 -4
- package/node/bezier/split-into-line-segments.js.map +1 -1
- package/node/generate-sdf.d.ts +21 -15
- package/node/generate-sdf.js +30 -26
- package/node/generate-sdf.js.map +1 -1
- package/node/index.d.ts +3 -1
- package/node/index.js +3 -1
- package/node/index.js.map +1 -1
- package/node/main-program.d.ts +1 -1
- package/node/main-program.js +3 -3
- package/node/main-program.js.map +1 -1
- package/node/prepare-buffers.d.ts +1 -1
- package/node/prepare-buffers.js +6 -8
- package/node/prepare-buffers.js.map +1 -1
- package/node/shaders/fragment.d.ts +2 -0
- package/node/shaders/{main.fragment.js → fragment.js} +5 -4
- package/node/shaders/fragment.js.map +1 -0
- package/node/shaders/vertex.d.ts +2 -0
- package/node/shaders/{main.vertex.js → vertex.js} +9 -6
- package/node/shaders/vertex.js.map +1 -0
- package/node/types/gl-context.d.ts +0 -1
- package/node/types/program.d.ts +2 -0
- package/node/utils/calc-circs.js.map +1 -1
- package/node/utils/clip-line-segment-to-grid.d.ts +1 -1
- package/node/utils/clip-line-segment-to-grid.js +1 -4
- package/node/utils/clip-line-segment-to-grid.js.map +1 -1
- package/node/utils/clip-line-segment-to-strips.d.ts +2 -3
- package/node/utils/clip-line-segment-to-strips.js +5 -57
- package/node/utils/clip-line-segment-to-strips.js.map +1 -1
- package/node/utils/find-close-cells.js +14 -70
- package/node/utils/find-close-cells.js.map +1 -1
- package/node/utils/find-crossing-cells.js +0 -15
- package/node/utils/find-crossing-cells.js.map +1 -1
- package/node/utils/jump-idx.js +20 -18
- package/node/utils/jump-idx.js.map +1 -1
- package/node/utils/seg-box-x.js +27 -17
- package/node/utils/seg-box-x.js.map +1 -1
- package/node/webgl-utils/free-gl-context.d.ts +3 -0
- package/node/webgl-utils/free-gl-context.js +26 -0
- package/node/webgl-utils/free-gl-context.js.map +1 -0
- package/node/webgl-utils/{get-gl-context.d.ts → get-web-gl-context.d.ts} +2 -2
- package/node/webgl-utils/{get-gl-context.js → get-web-gl-context.js} +7 -10
- package/node/webgl-utils/get-web-gl-context.js.map +1 -0
- package/node/webgl-utils/set-attribute.js +1 -1
- package/node/webgl-utils/set-attribute.js.map +1 -1
- package/node/webgl-utils/set-uniform-block.js +1 -3
- package/node/webgl-utils/set-uniform-block.js.map +1 -1
- package/node/webgl-utils/use-program.js +13 -3
- package/node/webgl-utils/use-program.js.map +1 -1
- package/package.json +3 -3
- package/src/bezier/bezier-curves-to-line-segs.ts +2 -3
- package/src/bezier/split-into-line-segments.ts +7 -5
- package/src/generate-sdf.ts +36 -30
- package/src/index.ts +3 -1
- package/src/main-program.ts +4 -3
- package/src/prepare-buffers.ts +6 -8
- package/src/shaders/{main.fragment.ts → fragment.ts} +4 -3
- package/src/shaders/{main.vertex.ts → vertex.ts} +8 -5
- package/src/types/gl-context.ts +0 -1
- package/src/types/program.ts +2 -0
- package/src/utils/calc-circs.ts +0 -2
- package/src/utils/clip-line-segment-to-grid.ts +1 -5
- package/src/utils/clip-line-segment-to-strips.ts +6 -73
- package/src/utils/find-close-cells.ts +27 -87
- package/src/utils/find-crossing-cells.ts +1 -18
- package/src/utils/jump-idx.ts +25 -20
- package/src/utils/seg-box-x.ts +30 -17
- package/src/webgl-utils/free-gl-context.ts +35 -0
- package/src/webgl-utils/{get-gl-context.ts → get-web-gl-context.ts} +6 -9
- package/src/webgl-utils/set-attribute.ts +1 -1
- package/src/webgl-utils/set-uniform-block.ts +1 -3
- package/src/webgl-utils/use-program.ts +14 -3
- package/node/debug-shaders.d.ts +0 -9
- package/node/shaders/main.fragment.d.ts +0 -2
- package/node/shaders/main.fragment.js.map +0 -1
- package/node/shaders/main.vertex.d.ts +0 -2
- package/node/shaders/main.vertex.js.map +0 -1
- package/node/types/strip.d.ts +0 -8
- package/node/types/strip.js +0 -2
- package/node/types/strip.js.map +0 -1
- package/node/utils/create-empty-strips.d.ts +0 -7
- package/node/utils/create-empty-strips.js +0 -16
- package/node/utils/create-empty-strips.js.map +0 -1
- package/node/utils/distance-seg-to-p.d.ts +0 -5
- package/node/utils/distance-seg-to-p.js +0 -35
- package/node/utils/distance-seg-to-p.js.map +0 -1
- package/node/webgl-utils/get-gl-context.js.map +0 -1
- package/node/webgl2.d.ts +0 -2
- package/src/types/strip.ts +0 -11
- package/src/utils/create-empty-strips.ts +0 -21
package/node/utils/seg-box-x.js
CHANGED
|
@@ -15,16 +15,18 @@ function segBoxX(seg, square) {
|
|
|
15
15
|
const dx = x1 - x0;
|
|
16
16
|
const dy = y1 - y0;
|
|
17
17
|
// Parametric line equation: P(t) = P1 + t*(P2-P1), where 0 <= t <= 1
|
|
18
|
-
const ts = [];
|
|
19
|
-
const ps = [];
|
|
18
|
+
// const ts: number[] = [];
|
|
19
|
+
// const ps: number[][] = [];
|
|
20
|
+
const xs = [];
|
|
20
21
|
if (dx !== 0) {
|
|
21
22
|
// Check intersection with left edge (x = minX)
|
|
22
23
|
const tL = (minX - x0) / dx;
|
|
23
24
|
if (tL >= 0 && tL <= 1) {
|
|
24
25
|
const y = y0 + tL * dy;
|
|
25
26
|
if (y >= minY && y <= maxY) {
|
|
26
|
-
ts.push(tL);
|
|
27
|
-
ps.push([minX, y]);
|
|
27
|
+
// ts.push(tL);
|
|
28
|
+
// ps.push([minX, y]);
|
|
29
|
+
xs.push({ t: tL, p: [minX, y] });
|
|
28
30
|
}
|
|
29
31
|
}
|
|
30
32
|
// Check intersection with right edge (x = maxX)
|
|
@@ -32,8 +34,9 @@ function segBoxX(seg, square) {
|
|
|
32
34
|
if (tR >= 0 && tR <= 1) {
|
|
33
35
|
const y = y0 + tR * dy;
|
|
34
36
|
if (y >= minY && y <= maxY) {
|
|
35
|
-
ts.push(tR);
|
|
36
|
-
ps.push([maxX, y]);
|
|
37
|
+
// ts.push(tR);
|
|
38
|
+
// ps.push([maxX, y]);
|
|
39
|
+
xs.push({ t: tR, p: [maxX, y] });
|
|
37
40
|
}
|
|
38
41
|
}
|
|
39
42
|
}
|
|
@@ -43,8 +46,9 @@ function segBoxX(seg, square) {
|
|
|
43
46
|
if (tT >= 0 && tT <= 1) {
|
|
44
47
|
const x = x0 + tT * dx;
|
|
45
48
|
if (x >= minX && x <= maxX) {
|
|
46
|
-
ts.push(tT);
|
|
47
|
-
ps.push([x, minY]);
|
|
49
|
+
// ts.push(tT);
|
|
50
|
+
// ps.push([x, minY]);
|
|
51
|
+
xs.push({ t: tT, p: [x, minY] });
|
|
48
52
|
}
|
|
49
53
|
}
|
|
50
54
|
// Check intersection with top edge (y = maxY)
|
|
@@ -52,18 +56,24 @@ function segBoxX(seg, square) {
|
|
|
52
56
|
if (tB >= 0 && tB <= 1) {
|
|
53
57
|
const x = x0 + tB * dx;
|
|
54
58
|
if (x >= minX && x <= maxX) {
|
|
55
|
-
ts.push(tB);
|
|
56
|
-
ps.push([x, maxY]);
|
|
59
|
+
// ts.push(tB);
|
|
60
|
+
// ps.push([x, maxY]);
|
|
61
|
+
xs.push({ t: tB, p: [x, maxY] });
|
|
57
62
|
}
|
|
58
63
|
}
|
|
59
64
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
65
|
+
const seen = new Set(); // Store unique t values
|
|
66
|
+
const xs_ = xs.filter(x => {
|
|
67
|
+
const { t } = x;
|
|
68
|
+
if (seen.has(t)) {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
seen.add(t);
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
return xs_.sort((a, b) => a.t - b.t).map(x => x.p);
|
|
67
77
|
}
|
|
68
78
|
export { segBoxX };
|
|
69
79
|
//# sourceMappingURL=seg-box-x.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seg-box-x.js","sourceRoot":"","sources":["../../src/utils/seg-box-x.ts"],"names":[],"mappings":"AACA;;;;;;;GAOG;AACH,SAAS,OAAO,CACR,GAAe,EACf,MAAkB;IAEtB,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC;IACrB,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC;IAEpB,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC;IAE5C,gEAAgE;IAChE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IACnB,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IAEnB,qEAAqE;IAErE,
|
|
1
|
+
{"version":3,"file":"seg-box-x.js","sourceRoot":"","sources":["../../src/utils/seg-box-x.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
function freeGlContext(glContext) {
|
|
2
|
+
if (glContext === undefined) {
|
|
3
|
+
return;
|
|
4
|
+
}
|
|
5
|
+
const { gl, programs, textures } = glContext;
|
|
6
|
+
for (let key in programs) {
|
|
7
|
+
const { attributes, fragmentShader, vertexShader, uniformBlocks, program } = programs[key];
|
|
8
|
+
for (let key in uniformBlocks) {
|
|
9
|
+
const { buf } = uniformBlocks[key];
|
|
10
|
+
gl.deleteBuffer(buf);
|
|
11
|
+
}
|
|
12
|
+
for (let key in attributes) {
|
|
13
|
+
const { buf } = attributes[key];
|
|
14
|
+
gl.deleteBuffer(buf);
|
|
15
|
+
}
|
|
16
|
+
gl.deleteShader(fragmentShader);
|
|
17
|
+
gl.deleteShader(vertexShader);
|
|
18
|
+
gl.deleteProgram(program);
|
|
19
|
+
}
|
|
20
|
+
for (let key in textures) {
|
|
21
|
+
const { tex } = textures[key];
|
|
22
|
+
gl.deleteTexture(tex);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export { freeGlContext };
|
|
26
|
+
//# sourceMappingURL=free-gl-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"free-gl-context.js","sourceRoot":"","sources":["../../src/webgl-utils/free-gl-context.ts"],"names":[],"mappings":"AAGA,SAAS,aAAa,CACd,SAAgC;IAEpC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAAC,OAAO;IAAC,CAAC;IAExC,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC;IAE7C,KAAK,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;QACvB,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;QAE3F,KAAK,IAAI,GAAG,IAAI,aAAa,EAAE,CAAC;YAC5B,MAAM,EAAE,GAAG,EAAE,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;YACnC,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;QACD,KAAK,IAAI,GAAG,IAAI,UAAU,EAAE,CAAC;YACzB,MAAM,EAAE,GAAG,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;YAChC,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;QACD,EAAE,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;QAChC,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QAC9B,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;QACvB,MAAM,EAAE,GAAG,EAAE,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC9B,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IAE1B,CAAC;AACL,CAAC;AAGD,OAAO,EAAE,aAAa,EAAE,CAAA"}
|
|
@@ -6,5 +6,5 @@ import type { GlContext } from "../types/gl-context.js";
|
|
|
6
6
|
* @param gl the `WebGL2RenderingContext` context to wrap
|
|
7
7
|
* @param callback
|
|
8
8
|
*/
|
|
9
|
-
declare function
|
|
10
|
-
export {
|
|
9
|
+
declare function getWebGlContext(gl: WebGL2RenderingContext): GlContext;
|
|
10
|
+
export { getWebGlContext };
|
|
@@ -6,7 +6,7 @@ const cache = new WeakMap();
|
|
|
6
6
|
* @param gl the `WebGL2RenderingContext` context to wrap
|
|
7
7
|
* @param callback
|
|
8
8
|
*/
|
|
9
|
-
function
|
|
9
|
+
function getWebGlContext(gl) {
|
|
10
10
|
{
|
|
11
11
|
const glContext = cache.get(gl);
|
|
12
12
|
if (glContext) {
|
|
@@ -15,29 +15,26 @@ function getWebGLContext(gl) {
|
|
|
15
15
|
}
|
|
16
16
|
const programs = {};
|
|
17
17
|
const textures = {};
|
|
18
|
-
const framebufferStack = [];
|
|
19
18
|
gl.canvas.addEventListener('webglcontextlost', e => {
|
|
20
|
-
|
|
19
|
+
onContextLoss();
|
|
21
20
|
e.preventDefault();
|
|
22
21
|
}, false);
|
|
23
22
|
const glContext = {
|
|
24
23
|
gl,
|
|
25
|
-
onContextLoss
|
|
24
|
+
onContextLoss,
|
|
26
25
|
textures,
|
|
27
|
-
programs
|
|
28
|
-
framebufferStack
|
|
26
|
+
programs
|
|
29
27
|
};
|
|
30
28
|
cache.set(gl, glContext);
|
|
31
29
|
return glContext;
|
|
32
30
|
////////////////////////
|
|
33
|
-
function
|
|
31
|
+
function onContextLoss() {
|
|
34
32
|
deleteAllProps(programs);
|
|
35
33
|
deleteAllProps(textures);
|
|
36
|
-
framebufferStack.length = 0;
|
|
37
34
|
}
|
|
38
35
|
}
|
|
39
36
|
function deleteAllProps(o) {
|
|
40
37
|
Object.keys(o).forEach(key => { delete o[key]; });
|
|
41
38
|
}
|
|
42
|
-
export {
|
|
43
|
-
//# sourceMappingURL=get-gl-context.js.map
|
|
39
|
+
export { getWebGlContext };
|
|
40
|
+
//# sourceMappingURL=get-web-gl-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-web-gl-context.js","sourceRoot":"","sources":["../../src/webgl-utils/get-web-gl-context.ts"],"names":[],"mappings":"AAKA,MAAM,KAAK,GAAG,IAAI,OAAO,EAAqC,CAAC;AAG/D;;;;;;GAMG;AACH,SAAS,eAAe,CAChB,EAA0B;IAE9B,CAAC;QACG,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChC,IAAI,SAAS,EAAE,CAAC;YAAC,OAAO,SAAS,CAAC;QAAC,CAAC;IACxC,CAAC;IAED,MAAM,QAAQ,GAAgC,EAAE,CAAC;IACjD,MAAM,QAAQ,GAAgC,EAAE,CAAC;IAEjD,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,CAAC,CAAC,EAAE;QAC/C,aAAa,EAAE,CAAC;QAChB,CAAC,CAAC,cAAc,EAAE,CAAC;IACvB,CAAC,EAAE,KAAK,CAAC,CAAC;IAEV,MAAM,SAAS,GAAc;QACzB,EAAE;QACF,aAAa;QACb,QAAQ;QACR,QAAQ;KACX,CAAC;IAEF,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;IAEzB,OAAO,SAAS,CAAC;IAGjB,wBAAwB;IAExB,SAAS,aAAa;QAClB,cAAc,CAAC,QAAQ,CAAC,CAAC;QACzB,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC;AACL,CAAC;AAGD,SAAS,cAAc,CAAC,CAA6B;IACjD,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACtD,CAAC;AAGD,OAAO,EAAE,eAAe,EAAE,CAAA"}
|
|
@@ -26,7 +26,7 @@ function setAttribute(program) {
|
|
|
26
26
|
return (name, size, type, usage, data, instancingDivisor = 0, stride = 0, offset = 0) => {
|
|
27
27
|
const { gl, attributes } = program;
|
|
28
28
|
const attr = attributes[name] = attributes[name] ?? {
|
|
29
|
-
buf: gl.createBuffer(),
|
|
29
|
+
buf: gl.createBuffer(),
|
|
30
30
|
loc: gl.getAttribLocation(program.program, name),
|
|
31
31
|
data: null
|
|
32
32
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"set-attribute.js","sourceRoot":"","sources":["../../src/webgl-utils/set-attribute.ts"],"names":[],"mappings":"AAKA,MAAM;AACF,gBAAgB;AAChB,IAAI,EAAa,OAAO;AACxB,aAAa,EAAI,OAAO;AACxB,KAAK,EAAY,OAAO;AACxB,cAAc,EAAG,OAAO;AACxB,GAAG,EAAc,OAAO;AACxB,YAAY,EAAK,OAAO;AACxB,cAAc;AACd,KAAK,EAAY,OAAO;AACxB,UAAU,EAAO,OAAO;AAExB,kBAAkB,EAAY,QAAQ;AACtC,2BAA2B,CAAG,QAAQ;EACzC,GAAG,sBAAsB,CAAC;AAG3B;;;;;;;;;GASG;AACH,SAAS,YAAY,CACb,OAAgB;IAEpB,OAAO,CAAC,IAAY,EACZ,IAAY,EACZ,IAAgB,EAChB,KAAc,EACd,IAAoC,EACpC,iBAAiB,GAAG,CAAC,EACrB,MAAM,GAAG,CAAC,EACV,MAAM,GAAG,CAAC,EAAE,EAAE;QAElB,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;QAEnC,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI;YAChD,GAAG,EAAE,EAAE,CAAC,YAAY,EAAE
|
|
1
|
+
{"version":3,"file":"set-attribute.js","sourceRoot":"","sources":["../../src/webgl-utils/set-attribute.ts"],"names":[],"mappings":"AAKA,MAAM;AACF,gBAAgB;AAChB,IAAI,EAAa,OAAO;AACxB,aAAa,EAAI,OAAO;AACxB,KAAK,EAAY,OAAO;AACxB,cAAc,EAAG,OAAO;AACxB,GAAG,EAAc,OAAO;AACxB,YAAY,EAAK,OAAO;AACxB,cAAc;AACd,KAAK,EAAY,OAAO;AACxB,UAAU,EAAO,OAAO;AAExB,kBAAkB,EAAY,QAAQ;AACtC,2BAA2B,CAAG,QAAQ;EACzC,GAAG,sBAAsB,CAAC;AAG3B;;;;;;;;;GASG;AACH,SAAS,YAAY,CACb,OAAgB;IAEpB,OAAO,CAAC,IAAY,EACZ,IAAY,EACZ,IAAgB,EAChB,KAAc,EACd,IAAoC,EACpC,iBAAiB,GAAG,CAAC,EACrB,MAAM,GAAG,CAAC,EACV,MAAM,GAAG,CAAC,EAAE,EAAE;QAElB,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;QAEnC,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI;YAChD,GAAG,EAAE,EAAE,CAAC,YAAY,EAAE;YACtB,GAAG,EAAE,EAAE,CAAC,iBAAiB,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC;YAChD,IAAI,EAAE,IAAI;SACb,CAAA;QAED,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QAE1B,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;QACpC,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YACxC,EAAE,CAAC,mBAAmB,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QACnE,CAAC;aAAM,CAAC;YACJ,EAAE,CAAC,oBAAoB,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAC7D,CAAC;QACD,EAAE,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,iBAAiB,KAAK,CAAC,EAAE,CAAC;YAC1B,EAAE,CAAC,mBAAmB,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;QACnD,CAAC;QAED,IAAI,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;YACrB,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,YAAY,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YAC5C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACrB,CAAC;IACL,CAAC,CAAA;AACL,CAAC;AAGD,OAAO,EAAE,YAAY,EAAE,CAAA"}
|
|
@@ -21,10 +21,8 @@ function setUniformBlock(program_) {
|
|
|
21
21
|
gl.bindBuffer(gl.UNIFORM_BUFFER, uniformBlock.buf);
|
|
22
22
|
}
|
|
23
23
|
const { buf } = uniformBlock;
|
|
24
|
-
gl.bufferData(gl.UNIFORM_BUFFER, buffer, gl.
|
|
25
|
-
// gl.bindBuffer(gl.UNIFORM_BUFFER, null);
|
|
24
|
+
gl.bufferData(gl.UNIFORM_BUFFER, buffer, gl.STATIC_DRAW);
|
|
26
25
|
gl.bindBufferBase(gl.UNIFORM_BUFFER, bindingPoint, buf);
|
|
27
|
-
// gl.bindBufferRange(gl.UNIFORM_BUFFER, bindingPoint, ubo, 0, sizeInBytes);
|
|
28
26
|
};
|
|
29
27
|
}
|
|
30
28
|
export { setUniformBlock };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"set-uniform-block.js","sourceRoot":"","sources":["../../src/webgl-utils/set-uniform-block.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,SAAS,eAAe,CAChB,QAAiB;IAErB,OAAO,CAAC,SAAiB,EACjB,YAAoB,EACpB,MAA+B,EAAE,EAAE;QAEvC,MAAM,EAAE,EAAE,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC;QAEhD,yCAAyC;QAEzC,IAAI,YAAY,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;QAC5C,IAAI,aAAa,CAAC,SAAS,CAAC,KAAK,SAAS,EAAE,CAAC;YACzC,MAAM,UAAU,GAAG,EAAE,CAAC,oBAAoB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YAC/D,EAAE,CAAC,mBAAmB,CAAC,OAAO,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;YAC1D,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC;YAE9B,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;YAEtC,YAAY,GAAG,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;YAC9C,aAAa,CAAC,SAAS,CAAC,GAAG,YAAY,CAAC;QAC5C,CAAC;aAAM,CAAC;YACJ,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,cAAc,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC;QACvD,CAAC;QAED,MAAM,EAAE,GAAG,EAAE,GAAG,YAAY,CAAC;QAE7B,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"set-uniform-block.js","sourceRoot":"","sources":["../../src/webgl-utils/set-uniform-block.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,SAAS,eAAe,CAChB,QAAiB;IAErB,OAAO,CAAC,SAAiB,EACjB,YAAoB,EACpB,MAA+B,EAAE,EAAE;QAEvC,MAAM,EAAE,EAAE,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC;QAEhD,yCAAyC;QAEzC,IAAI,YAAY,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;QAC5C,IAAI,aAAa,CAAC,SAAS,CAAC,KAAK,SAAS,EAAE,CAAC;YACzC,MAAM,UAAU,GAAG,EAAE,CAAC,oBAAoB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YAC/D,EAAE,CAAC,mBAAmB,CAAC,OAAO,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;YAC1D,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC;YAE9B,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;YAEtC,YAAY,GAAG,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;YAC9C,aAAa,CAAC,SAAS,CAAC,GAAG,YAAY,CAAC;QAC5C,CAAC;aAAM,CAAC;YACJ,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,cAAc,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC;QACvD,CAAC;QAED,MAAM,EAAE,GAAG,EAAE,GAAG,YAAY,CAAC;QAE7B,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC;QACzD,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC,cAAc,EAAE,YAAY,EAAE,GAAG,CAAC,CAAC;IAC5D,CAAC,CAAA;AACL,CAAC;AAGD,OAAO,EAAE,eAAe,EAAE,CAAA"}
|
|
@@ -21,10 +21,20 @@ function initProgram(glContext, name, vert, frag) {
|
|
|
21
21
|
const uniforms = {};
|
|
22
22
|
const uniformBlocks = {};
|
|
23
23
|
const program = gl.createProgram();
|
|
24
|
-
|
|
25
|
-
|
|
24
|
+
const vertexShader = compileShader(gl, vert, gl.VERTEX_SHADER);
|
|
25
|
+
const fragmentShader = compileShader(gl, frag, gl.FRAGMENT_SHADER);
|
|
26
|
+
gl.attachShader(program, vertexShader);
|
|
27
|
+
gl.attachShader(program, fragmentShader);
|
|
26
28
|
gl.linkProgram(program);
|
|
27
|
-
programs[name] = {
|
|
29
|
+
programs[name] = {
|
|
30
|
+
gl,
|
|
31
|
+
program,
|
|
32
|
+
attributes,
|
|
33
|
+
uniforms,
|
|
34
|
+
uniformBlocks,
|
|
35
|
+
vertexShader,
|
|
36
|
+
fragmentShader
|
|
37
|
+
};
|
|
28
38
|
return programs[name];
|
|
29
39
|
}
|
|
30
40
|
export { initProgram };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-program.js","sourceRoot":"","sources":["../../src/webgl-utils/use-program.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD;;;;;;;;;;;;GAYG;AACH,SAAS,WAAW,CACR,SAAoB,EACpB,IAAY,EACZ,IAAY,EACZ,IAAY;IAEpB,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC;IAEnC,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACjB,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,UAAU,GAAkC,EAAE,CAAC;IACrD,MAAM,QAAQ,GAAoD,EAAE,CAAC;IACrE,MAAM,aAAa,GAAqC,EAAE,CAAC;IAE3D,MAAM,OAAO,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC;IACnC,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"use-program.js","sourceRoot":"","sources":["../../src/webgl-utils/use-program.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD;;;;;;;;;;;;GAYG;AACH,SAAS,WAAW,CACR,SAAoB,EACpB,IAAY,EACZ,IAAY,EACZ,IAAY;IAEpB,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC;IAEnC,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACjB,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,UAAU,GAAkC,EAAE,CAAC;IACrD,MAAM,QAAQ,GAAoD,EAAE,CAAC;IACrE,MAAM,aAAa,GAAqC,EAAE,CAAC;IAE3D,MAAM,OAAO,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC;IACnC,MAAM,YAAY,GAAG,aAAa,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC;IAC/D,MAAM,cAAc,GAAG,aAAa,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC;IAEnE,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACvC,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IACzC,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAExB,QAAQ,CAAC,IAAI,CAAC,GAAG;QACb,EAAE;QACF,OAAO;QACP,UAAU;QACV,QAAQ;QACR,aAAa;QACb,YAAY;QACZ,cAAc;KACjB,CAAC;IAEF,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAGD,OAAO,EAAE,WAAW,EAAE,CAAA"}
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "webgl2-sdf",
|
|
3
3
|
"sideEffects": false,
|
|
4
4
|
"description": "Fast sdf generator from bezier curves or svg string.",
|
|
5
|
-
"version": "0.0.
|
|
5
|
+
"version": "0.0.5",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Floris Steenkamp"
|
|
8
8
|
},
|
|
@@ -31,14 +31,14 @@
|
|
|
31
31
|
],
|
|
32
32
|
"dependencies": {},
|
|
33
33
|
"devDependencies": {
|
|
34
|
-
"@types/node": "^25.0.
|
|
34
|
+
"@types/node": "^25.0.10",
|
|
35
35
|
"c8": "^10.1.3",
|
|
36
36
|
"rimraf": "^6.1.2",
|
|
37
37
|
"ts-loader": "^9.5.4",
|
|
38
38
|
"ts-node": "^10.9.2",
|
|
39
39
|
"typescript": "^5.9.3",
|
|
40
40
|
"webpack": "^5.104.1",
|
|
41
|
-
"webpack-bundle-analyzer": "^5.
|
|
41
|
+
"webpack-bundle-analyzer": "^5.2.0",
|
|
42
42
|
"webpack-cli": "^6.0.1",
|
|
43
43
|
"source-map-support": "^0.5.21"
|
|
44
44
|
},
|
|
@@ -11,8 +11,7 @@ import { splitIntoLineSegments } from "./split-into-line-segments.js";
|
|
|
11
11
|
* from the line connecting it's endpoints are less than this value
|
|
12
12
|
*/
|
|
13
13
|
function bezierCurvesToLineSegs(
|
|
14
|
-
bezierLoops: (number[][])[][]
|
|
15
|
-
resolution: 0.5|1) {
|
|
14
|
+
bezierLoops: (number[][])[][]) {
|
|
16
15
|
|
|
17
16
|
let lineSegs: number[][][] = [];
|
|
18
17
|
for (let i=0; i<bezierLoops.length; i++) {
|
|
@@ -26,7 +25,7 @@ function bezierCurvesToLineSegs(
|
|
|
26
25
|
continue;
|
|
27
26
|
}
|
|
28
27
|
|
|
29
|
-
const lineSegs_ = splitIntoLineSegments(ps
|
|
28
|
+
const lineSegs_ = splitIntoLineSegments(ps);
|
|
30
29
|
|
|
31
30
|
lineSegs.push(...lineSegs_.filter(ps => !isReallyPoint(ps)));
|
|
32
31
|
}
|
|
@@ -4,6 +4,9 @@ import { splitByDeviationFromStraighLine_Cubic_Crude } from './split-by-deviatio
|
|
|
4
4
|
import { splitByDeviationFromStraighLine_Quad } from './split-by-deviation-from-straight-line-quad.js';
|
|
5
5
|
|
|
6
6
|
|
|
7
|
+
const RESOLUTION = 0.5;
|
|
8
|
+
|
|
9
|
+
|
|
7
10
|
/**
|
|
8
11
|
* Returns the result of splitting the given bezier curve into straight line
|
|
9
12
|
* segments up to `maxDeviation`
|
|
@@ -13,13 +16,12 @@ import { splitByDeviationFromStraighLine_Quad } from './split-by-deviation-from-
|
|
|
13
16
|
* @param maxDeviation maximum deviation from straight line
|
|
14
17
|
*/
|
|
15
18
|
function splitIntoLineSegments(
|
|
16
|
-
ps: number[][]
|
|
17
|
-
maxDeviation: number) {
|
|
19
|
+
ps: number[][]) {
|
|
18
20
|
|
|
19
21
|
const ts = ps.length === 3
|
|
20
|
-
? splitByDeviationFromStraighLine_Quad(ps,
|
|
21
|
-
// : splitByDeviationFromStraighLine_Cubic_Precise(ps,
|
|
22
|
-
: splitByDeviationFromStraighLine_Cubic_Crude(ps,
|
|
22
|
+
? splitByDeviationFromStraighLine_Quad(ps, RESOLUTION)
|
|
23
|
+
// : splitByDeviationFromStraighLine_Cubic_Precise(ps, RESOLUTION)
|
|
24
|
+
: splitByDeviationFromStraighLine_Cubic_Crude(ps, RESOLUTION)
|
|
23
25
|
|
|
24
26
|
const segs: number[][][] = [];
|
|
25
27
|
for (let i=0; i<ts.length - 1; i++) {
|
package/src/generate-sdf.ts
CHANGED
|
@@ -1,35 +1,41 @@
|
|
|
1
|
-
import { getWebGLContext } from './webgl-utils/get-gl-context.js';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
// import { getWebGLContext } from './webgl-utils/get-gl-context.js';
|
|
2
|
+
import { vertex } from './shaders/vertex.js';
|
|
3
|
+
import { getFragment } from './shaders/fragment.js';
|
|
4
4
|
import { initProgram } from './webgl-utils/use-program.js';
|
|
5
5
|
import { mainProgram } from './main-program.js';
|
|
6
6
|
import { ROW_COUNT } from './row-count.js';
|
|
7
7
|
import { getPathsFromStr } from './svg/get-paths-from-str.js';
|
|
8
8
|
import { MAX_ASPECT_RATIO_BEFORE_STRETCH } from './max-aspect-ratio-before-stretch.js';
|
|
9
|
+
import { GlContext } from './types/gl-context.js';
|
|
9
10
|
// import { debugShaders } from './debug-shaders.js';
|
|
10
11
|
|
|
11
12
|
const { ceil, min, max } = Math;
|
|
12
13
|
|
|
13
14
|
|
|
14
15
|
/**
|
|
16
|
+
* Generates an sdf (signed distance field) from the given bezier curves,
|
|
17
|
+
* viewbox, etc. and renders the result
|
|
15
18
|
*
|
|
16
|
-
* @param gl
|
|
17
|
-
* @param
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* @param
|
|
23
|
-
* @param
|
|
24
|
-
* @param
|
|
25
|
-
* @param
|
|
26
|
-
* @param
|
|
27
|
-
* @param
|
|
28
|
-
* @param
|
|
19
|
+
* @param glContext a `GlConext` previously created by `getWebGlContext(gl: WebGL2RenderingContext)`
|
|
20
|
+
* @param bezierCurves_or_svgStr either of
|
|
21
|
+
* * an array of linear (lines), quadratic or cubic bezier curves (or a mix
|
|
22
|
+
* thereof) given by given by their ordered control points,
|
|
23
|
+
* e.g. `[ [[0,0],[1,1],[2,1],[2,0]], [[2,0],[7,2],[1,5],[8,6]], ... ]` **OR**
|
|
24
|
+
* * an SVG string, e.g. "M26.53 478.83 C028.89 481.61 031.33 484.32 ..."
|
|
25
|
+
* @param width the width of the drawing rectangle
|
|
26
|
+
* @param height the height of the drawing rectangle
|
|
27
|
+
* @param viewbox the viewbox
|
|
28
|
+
* @param maxDistance maximum sdf distance
|
|
29
|
+
* @param sdfExponent TODO
|
|
30
|
+
* @param inclInside if `true` the sdf will be calculate for the inside of the shape
|
|
31
|
+
* @param inclOutside if `true` the sdf will be calculate for the outside of the shape
|
|
32
|
+
* @param x the position where to draw, x-coordinate
|
|
33
|
+
* @param y the position where to draw, y-coordinate
|
|
34
|
+
* @param channel TODO
|
|
29
35
|
*/
|
|
30
|
-
function
|
|
31
|
-
|
|
32
|
-
|
|
36
|
+
function generateSdf(
|
|
37
|
+
glContext: GlContext,
|
|
38
|
+
bezierCurves_or_svgStr: (number[][])[][] | string,
|
|
33
39
|
width: number,
|
|
34
40
|
height: number,
|
|
35
41
|
viewbox: [number,number,number,number],
|
|
@@ -37,18 +43,16 @@ function generateIntoFramebuffer(
|
|
|
37
43
|
sdfExponent = 1,
|
|
38
44
|
inclInside = true,
|
|
39
45
|
inclOutside = true,
|
|
40
|
-
// framebuffer: WebGLFramebuffer | null,
|
|
41
46
|
x = 0, y = 0,
|
|
42
|
-
channel = 0
|
|
43
|
-
resolution: 0.5|1 = 0.5) {
|
|
47
|
+
channel = 0) {
|
|
44
48
|
|
|
45
49
|
// debugShaders(gl); // comment for production
|
|
46
50
|
|
|
47
|
-
const
|
|
48
|
-
? getPathsFromStr(
|
|
49
|
-
:
|
|
51
|
+
const psss = typeof bezierCurves_or_svgStr === 'string'
|
|
52
|
+
? getPathsFromStr(bezierCurves_or_svgStr)
|
|
53
|
+
: bezierCurves_or_svgStr;
|
|
50
54
|
|
|
51
|
-
const glContext = getWebGLContext(gl);
|
|
55
|
+
// const glContext = getWebGLContext(gl);
|
|
52
56
|
|
|
53
57
|
const { onContextLoss } = glContext;
|
|
54
58
|
|
|
@@ -69,13 +73,15 @@ function generateIntoFramebuffer(
|
|
|
69
73
|
|
|
70
74
|
const programMain = initProgram(
|
|
71
75
|
glContext, `main${colCount}-${padCount}`,
|
|
72
|
-
|
|
76
|
+
vertex, getFragment(colCount, padCount)
|
|
73
77
|
);
|
|
74
78
|
|
|
79
|
+
const { gl } = glContext;
|
|
80
|
+
|
|
75
81
|
gl.useProgram(programMain.program);
|
|
76
82
|
mainProgram(
|
|
77
|
-
glContext, programMain,
|
|
78
|
-
viewbox, maxDistance, sdfExponent, width, height, colCount,
|
|
83
|
+
glContext, programMain, psss,
|
|
84
|
+
viewbox, maxDistance, sdfExponent, x, y, width, height, colCount,
|
|
79
85
|
cellSize, inclInside, inclOutside, padCount, stretch
|
|
80
86
|
);
|
|
81
87
|
|
|
@@ -88,4 +94,4 @@ function generateIntoFramebuffer(
|
|
|
88
94
|
}
|
|
89
95
|
|
|
90
96
|
|
|
91
|
-
export {
|
|
97
|
+
export { generateSdf }
|
package/src/index.ts
CHANGED
package/src/main-program.ts
CHANGED
|
@@ -17,11 +17,12 @@ const CROSS_TEX_INDEX = 2;
|
|
|
17
17
|
function mainProgram(
|
|
18
18
|
glContext: GlContext,
|
|
19
19
|
programMain: Program,
|
|
20
|
-
resolution: 0.5|1,
|
|
21
20
|
psss: number[][][][],
|
|
22
21
|
viewbox: [number,number,number,number],
|
|
23
22
|
maxDistance: number,
|
|
24
23
|
sdfExponent = 1,
|
|
24
|
+
x: number,
|
|
25
|
+
y: number,
|
|
25
26
|
width: number,
|
|
26
27
|
height: number,
|
|
27
28
|
colCount: number,
|
|
@@ -53,7 +54,7 @@ function mainProgram(
|
|
|
53
54
|
segIdxs_PerStrip_Range_Arr
|
|
54
55
|
} = prepareBuffers(
|
|
55
56
|
psss, width, height, colCount, cellSize, maxDistance,
|
|
56
|
-
padCount,
|
|
57
|
+
padCount, viewbox, stretch
|
|
57
58
|
);
|
|
58
59
|
|
|
59
60
|
// Init/update attributes
|
|
@@ -77,11 +78,11 @@ function mainProgram(
|
|
|
77
78
|
);
|
|
78
79
|
|
|
79
80
|
// Init/update uniforms
|
|
81
|
+
setUniform_('2f', 'uOffset', x, y);
|
|
80
82
|
setUniform_('2f', 'uWidthHeight', width, height);
|
|
81
83
|
setUniform_('1f', 'uMaxDistance', maxDistance);
|
|
82
84
|
setUniform_('1f', 'uExponent', sdfExponent); // TODO
|
|
83
85
|
setUniform_('1i', 'uIncl', (inclInside ? 1 : 0) + (inclOutside ? 2 : 0));
|
|
84
|
-
setUniform_('1f', 'uStretch', stretch); // TODO
|
|
85
86
|
|
|
86
87
|
setUniformBlock(programMain)('SegIdxRangePerCellBlock', 0, segIdxs_PerCell_Range_Arr);
|
|
87
88
|
setUniformBlock(programMain)('SegIdxRangePerStripBlock', 1, segIdxs_PerStrip_Range_Arr);
|
package/src/prepare-buffers.ts
CHANGED
|
@@ -5,10 +5,9 @@ import { createEmptyGrid } from './utils/create-empty-grid.js';
|
|
|
5
5
|
import { findCrossingCells } from './utils/find-crossing-cells.js';
|
|
6
6
|
import { TEX_WIDTH } from './tex-width.js';
|
|
7
7
|
import { ROW_COUNT } from './row-count.js';
|
|
8
|
-
import { createEmptyStrips } from './utils/create-empty-strips.js';
|
|
9
8
|
import { clipLineSegmentToStrips } from './utils/clip-line-segment-to-strips.js';
|
|
10
9
|
import { mapToViewbox } from './utils/map-to-viewbox.js';
|
|
11
|
-
// import { sum } from './utils/sum.js';
|
|
10
|
+
// import { sum } from './utils/sum.js'; // testing
|
|
12
11
|
|
|
13
12
|
|
|
14
13
|
function prepareBuffers(
|
|
@@ -19,20 +18,20 @@ function prepareBuffers(
|
|
|
19
18
|
cellSize: number,
|
|
20
19
|
maxDistance: number,
|
|
21
20
|
padCount: number,
|
|
22
|
-
resolution: 0.5|1 = 0.5,
|
|
23
21
|
viewbox: [number,number,number,number] = [0,0,width,height],
|
|
24
22
|
stretch = 1) {
|
|
25
23
|
|
|
26
24
|
////////////////////////////////////////////////////////////////////////////
|
|
27
25
|
const psss_ = mapToViewbox(viewbox, width, height/stretch, psss);
|
|
28
26
|
|
|
29
|
-
const lineSegs = bezierCurvesToLineSegs(psss_
|
|
27
|
+
const lineSegs = bezierCurvesToLineSegs(psss_);
|
|
30
28
|
const grid = createEmptyGrid(colCount, padCount);
|
|
31
|
-
const strips =
|
|
29
|
+
const strips = new Array(ROW_COUNT).fill(undefined).map(v => []);
|
|
30
|
+
|
|
32
31
|
for (let i=0; i<lineSegs.length; i++) {
|
|
33
32
|
const seg = lineSegs[i];
|
|
34
33
|
// Split the line segment into multiple segments that fit within grid cells
|
|
35
|
-
clipLineSegmentToGrid(grid, width, height,
|
|
34
|
+
clipLineSegmentToGrid(grid, width, height, cellSize, seg, padCount); // add segments to grid
|
|
36
35
|
clipLineSegmentToStrips(strips, height, seg); // add segments to strips
|
|
37
36
|
}
|
|
38
37
|
|
|
@@ -96,8 +95,7 @@ function prepareBuffers(
|
|
|
96
95
|
// Add line segs from strips
|
|
97
96
|
const segIdxs_PerStrip_Range: [number,number][] = [];
|
|
98
97
|
for (let i=0; i<ROW_COUNT; i++) {
|
|
99
|
-
const
|
|
100
|
-
const { lineSegs } = strip;
|
|
98
|
+
const lineSegs = strips[i];
|
|
101
99
|
|
|
102
100
|
//////////
|
|
103
101
|
const L = lineSegs.length;
|
|
@@ -4,7 +4,7 @@ import { ROW_COUNT } from "../row-count.js";
|
|
|
4
4
|
const cache: { [padCount_times_colCount: number]: string } = {};
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
function
|
|
7
|
+
function getFragment(
|
|
8
8
|
colCount: number,
|
|
9
9
|
padCount: number): string {
|
|
10
10
|
|
|
@@ -138,7 +138,8 @@ void main() {
|
|
|
138
138
|
///////////////////////////////////////////////////////////////////////////
|
|
139
139
|
|
|
140
140
|
// DEBUG!
|
|
141
|
-
float alpha = ((instanceId + instanceId/${ROW_COUNT}) % 2 == 0 ? 0.3 : 0.5);
|
|
141
|
+
// float alpha = ((instanceId + instanceId/${ROW_COUNT}) % 2 == 0 ? 0.3 : 0.5);
|
|
142
|
+
float alpha = res == 1.0 ? 0.0 : 0.5;
|
|
142
143
|
|
|
143
144
|
float red = inside ? 0.2 : 0.8;
|
|
144
145
|
float green = abs(sin(50.0 * res));
|
|
@@ -154,4 +155,4 @@ void main() {
|
|
|
154
155
|
}
|
|
155
156
|
|
|
156
157
|
|
|
157
|
-
export {
|
|
158
|
+
export { getFragment }
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { ROW_COUNT } from "../row-count.js";
|
|
2
2
|
|
|
3
|
-
const
|
|
3
|
+
const vertex = /*glsl*/`#version 300 es
|
|
4
4
|
|
|
5
5
|
precision highp float;
|
|
6
6
|
|
|
7
7
|
uniform vec2 uWidthHeight;
|
|
8
|
-
uniform
|
|
8
|
+
uniform vec2 uOffset;
|
|
9
9
|
in vec2 aUV;
|
|
10
10
|
in ivec2 aCloseCellIdxRangePerCell;
|
|
11
11
|
in ivec2 aCrossIdxRangePerCell;
|
|
@@ -41,15 +41,18 @@ void main() {
|
|
|
41
41
|
|
|
42
42
|
float aspectRatio = width / height;
|
|
43
43
|
|
|
44
|
+
float x = (uOffset.x / 2.0*width) - 1.0;
|
|
45
|
+
float y = (uOffset.y / 2.0*height) - 1.0;
|
|
46
|
+
|
|
44
47
|
gl_Position = vec4(
|
|
45
48
|
vec2(
|
|
46
49
|
(2.0*(uv.x / aspectRatio) - 1.0),
|
|
47
|
-
2.0*uv.y - 1.0
|
|
48
|
-
),
|
|
50
|
+
(2.0*uv.y - 1.0)
|
|
51
|
+
) + vec2(x,y),
|
|
49
52
|
0.0, 1.0
|
|
50
53
|
);
|
|
51
54
|
}
|
|
52
55
|
`;
|
|
53
56
|
|
|
54
57
|
|
|
55
|
-
export {
|
|
58
|
+
export { vertex }
|
package/src/types/gl-context.ts
CHANGED
package/src/types/program.ts
CHANGED
|
@@ -8,6 +8,8 @@ interface Program {
|
|
|
8
8
|
readonly attributes: { [index:string]: Attribute };
|
|
9
9
|
readonly uniforms: { [index:string]: WebGLUniformLocation | null };
|
|
10
10
|
readonly uniformBlocks: { [index:string]: UniformBlock };
|
|
11
|
+
readonly vertexShader: WebGLShader;
|
|
12
|
+
readonly fragmentShader: WebGLShader;
|
|
11
13
|
}
|
|
12
14
|
|
|
13
15
|
|