webgl2-sdf 0.0.5 → 0.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +56 -45
- package/browser/index.min.js +1 -1
- package/node/debug-shaders.d.ts +9 -0
- package/node/debug-shaders.js +28 -0
- package/node/debug-shaders.js.map +1 -0
- package/node/generate-sdf.d.ts +1 -1
- package/node/generate-sdf.js +5 -10
- package/node/generate-sdf.js.map +1 -1
- package/node/main-program.d.ts +1 -1
- package/node/main-program.js +16 -17
- package/node/main-program.js.map +1 -1
- package/node/prepare-buffers.js +21 -18
- package/node/prepare-buffers.js.map +1 -1
- package/node/shaders/fragment.js +28 -20
- package/node/shaders/fragment.js.map +1 -1
- package/node/shaders/vertex.d.ts +1 -1
- package/node/shaders/vertex.js +1 -5
- package/node/shaders/vertex.js.map +1 -1
- package/node/svg/get-paths-from-str.d.ts +1 -0
- package/node/svg/get-paths-from-str.js +1 -0
- package/node/svg/get-paths-from-str.js.map +1 -1
- package/node/svg/path-data-polyfill/source.d.ts +0 -1
- package/node/svg/path-data-polyfill/source.js +0 -2
- package/node/svg/path-data-polyfill/source.js.map +1 -1
- package/node/svg/path-state.d.ts +0 -1
- package/node/types/gl-context.d.ts +1 -1
- package/node/webgl-utils/get-web-gl-context.js +7 -14
- package/node/webgl-utils/get-web-gl-context.js.map +1 -1
- package/package.json +1 -1
- package/src/debug-shaders.ts +4 -4
- package/src/generate-sdf.ts +12 -18
- package/src/main-program.ts +26 -21
- package/src/prepare-buffers.ts +24 -21
- package/src/shaders/fragment.ts +28 -20
- package/src/shaders/vertex.ts +1 -5
- package/src/svg/get-paths-from-str.ts +1 -0
- package/src/svg/path-data-polyfill/source.ts +0 -2
- package/src/svg/path-state.ts +0 -1
- package/src/types/gl-context.ts +1 -1
- package/src/webgl-utils/get-web-gl-context.ts +10 -18
package/node/shaders/fragment.js
CHANGED
|
@@ -11,7 +11,6 @@ function getFragment(colCount, padCount) {
|
|
|
11
11
|
precision highp float;
|
|
12
12
|
|
|
13
13
|
uniform float uMaxDistance;
|
|
14
|
-
uniform float uExponent;
|
|
15
14
|
uniform highp sampler2D uSegs;
|
|
16
15
|
uniform highp isampler2D uCloseCellIdxs;
|
|
17
16
|
uniform highp isampler2D uCrossCellIdxs;
|
|
@@ -35,7 +34,7 @@ float absDistToSegment(vec2 point, vec2 lineA, vec2 lineB) {
|
|
|
35
34
|
vec2 lineDir = lineB - lineA;
|
|
36
35
|
float lenSq = dot(lineDir, lineDir);
|
|
37
36
|
float t = clamp(dot(point - lineA, lineDir) / lenSq, 0.0, 1.0);
|
|
38
|
-
vec2 linePt = lineA + t
|
|
37
|
+
vec2 linePt = lineA + t*lineDir;
|
|
39
38
|
|
|
40
39
|
return distance(point, linePt);
|
|
41
40
|
}
|
|
@@ -54,15 +53,16 @@ void main() {
|
|
|
54
53
|
for (int i = crossIdxS; i < crossIdxS + crossLen; i++) {
|
|
55
54
|
int crossIdx = texelFetch(uCrossCellIdxs, ivec2(i%256, i/256), 0).x;
|
|
56
55
|
|
|
57
|
-
|
|
56
|
+
ivec2 uSegIdxRange = crossIdx % 2 == 0
|
|
57
|
+
? uSegIdxRangePerCell[crossIdx / 2].xy
|
|
58
|
+
: uSegIdxRangePerCell[crossIdx / 2].zw;
|
|
58
59
|
|
|
59
|
-
|
|
60
|
-
int
|
|
61
|
-
int segLen = isEven ? uSegIdxRange.y : uSegIdxRange.w;
|
|
60
|
+
int segIdx = uSegIdxRange.x;
|
|
61
|
+
int segLen = uSegIdxRange.y;
|
|
62
62
|
|
|
63
63
|
for (int j = segIdx; j < segIdx + segLen; j++) {
|
|
64
64
|
// Fetch segment from texture
|
|
65
|
-
vec4 seg = texelFetch(uSegs, ivec2(j,
|
|
65
|
+
vec4 seg = texelFetch(uSegs, ivec2(j%256, j/256), 0);
|
|
66
66
|
|
|
67
67
|
// line segment's min-y is excluded
|
|
68
68
|
bool crossing =
|
|
@@ -76,15 +76,18 @@ void main() {
|
|
|
76
76
|
}
|
|
77
77
|
|
|
78
78
|
{
|
|
79
|
-
|
|
79
|
+
int cellIdx = (instanceId % ${ROW_COUNT});
|
|
80
|
+
|
|
81
|
+
bool isEven = cellIdx % 2 == 0;
|
|
80
82
|
|
|
81
|
-
ivec4 uSegIdxRange = uSegIdxRangePerStrip[
|
|
83
|
+
ivec4 uSegIdxRange = uSegIdxRangePerStrip[cellIdx / 2];
|
|
82
84
|
int segIdx = isEven ? uSegIdxRange.x : uSegIdxRange.z;
|
|
83
85
|
int segLen = isEven ? uSegIdxRange.y : uSegIdxRange.w;
|
|
86
|
+
|
|
84
87
|
|
|
85
88
|
for (int j = segIdx; j < segIdx + segLen; j++) {
|
|
86
89
|
// Fetch segment from texture
|
|
87
|
-
vec4 seg = texelFetch(uSegs, ivec2(j,
|
|
90
|
+
vec4 seg = texelFetch(uSegs, ivec2(j%256, j/256), 0);
|
|
88
91
|
|
|
89
92
|
// line segment's min-y is excluded
|
|
90
93
|
bool crossing =
|
|
@@ -111,20 +114,22 @@ void main() {
|
|
|
111
114
|
for (int i = cellIdxS; i < cellIdxS + cellLen; i++) {
|
|
112
115
|
int cellIdx = texelFetch(uCloseCellIdxs, ivec2(i%256, i/256), 0).x;
|
|
113
116
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
117
|
+
ivec2 uSegIdxRange = cellIdx % 2 == 0
|
|
118
|
+
? uSegIdxRangePerCell[cellIdx / 2].xy
|
|
119
|
+
: uSegIdxRangePerCell[cellIdx / 2].zw;
|
|
120
|
+
|
|
121
|
+
int segIdx = uSegIdxRange.x;
|
|
122
|
+
int segLen = uSegIdxRange.y;
|
|
118
123
|
|
|
119
124
|
for (int j = segIdx; j < segIdx + segLen; j++) {
|
|
120
125
|
// Fetch segment from texture
|
|
121
|
-
vec4 seg = texelFetch(uSegs, ivec2(j,
|
|
126
|
+
vec4 seg = texelFetch(uSegs, ivec2(j%256, j/256), 0);
|
|
122
127
|
|
|
123
128
|
// Find unsigned distance to the segment; only the nearest will be kept
|
|
124
129
|
float d = absDistToSegment(vXY, seg.xy, seg.zw);
|
|
125
|
-
// Apply exponential transform
|
|
126
|
-
// val = pow(1.0 - clamp(d / uMaxDistance, 0.0, 1.0), uExponent) * 0.5;
|
|
130
|
+
// Apply exponential transform
|
|
127
131
|
float val = clamp(d / uMaxDistance, 0.0, 1.0);
|
|
132
|
+
|
|
128
133
|
res = min(res, val);
|
|
129
134
|
}
|
|
130
135
|
}
|
|
@@ -133,12 +138,15 @@ void main() {
|
|
|
133
138
|
|
|
134
139
|
// DEBUG!
|
|
135
140
|
// float alpha = ((instanceId + instanceId/${ROW_COUNT}) % 2 == 0 ? 0.3 : 0.5);
|
|
136
|
-
float alpha = res == 1.0 ? 0.0 : 0.5;
|
|
137
141
|
|
|
142
|
+
|
|
143
|
+
float exponent = 2;
|
|
144
|
+
res = pow(1.0 - val, exponent) * 0.5;
|
|
145
|
+
|
|
146
|
+
float alpha = res == 1.0 ? 0.0 : 0.5;
|
|
138
147
|
float red = inside ? 0.2 : 0.8;
|
|
139
|
-
float green = abs(sin(
|
|
148
|
+
float green = abs(sin(25.0 * res));
|
|
140
149
|
float blue = 0.5;
|
|
141
|
-
// float alpha = inside ? 0.5 : 0.0;
|
|
142
150
|
|
|
143
151
|
FragColor = vec4(red, green, blue, alpha);
|
|
144
152
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fragment.js","sourceRoot":"","sources":["../../src/shaders/fragment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,MAAM,KAAK,GAAkD,EAAE,CAAC;AAGhE,SAAS,WAAW,CACZ,QAAgB,EAChB,QAAgB;IAEpB,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,GAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC;IACjD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAAC,OAAO,QAAQ,CAAC;IAAC,CAAC;IAEpD,MAAM,aAAa;IACnB,QAAQ,CAAA
|
|
1
|
+
{"version":3,"file":"fragment.js","sourceRoot":"","sources":["../../src/shaders/fragment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,MAAM,KAAK,GAAkD,EAAE,CAAC;AAGhE,SAAS,WAAW,CACZ,QAAgB,EAChB,QAAgB;IAEpB,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,GAAC,QAAQ,GAAG,QAAQ,CAAC,CAAC;IACjD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAAC,OAAO,QAAQ,CAAC;IAAC,CAAC;IAEpD,MAAM,aAAa;IACnB,QAAQ,CAAA;;;;;;;;;;;gCAWwB,CAAC,SAAS,GAAG,CAAC,GAAC,QAAQ,CAAC,GAAC,CAAC,QAAQ,GAAG,CAAC,GAAC,QAAQ,CAAC,GAAG,CAAC;;;iCAGnD,SAAS,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sCAwDR,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iDA6DE,SAAS;;;;;;;;;;;;;CAazD,CAAA;IAEG,KAAK,CAAC,IAAI,GAAC,QAAQ,GAAG,QAAQ,CAAC,GAAG,aAAa,CAAC;IAChD,OAAO,aAAa,CAAC;AACzB,CAAC;AAGD,OAAO,EAAE,WAAW,EAAE,CAAA"}
|
package/node/shaders/vertex.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
declare const vertex = "#version 300 es\n\nprecision highp float;\n\nuniform vec2 uWidthHeight;\
|
|
1
|
+
declare const vertex = "#version 300 es\n\nprecision highp float;\n\nuniform vec2 uWidthHeight;\nin vec2 aUV;\nin ivec2 aCloseCellIdxRangePerCell;\nin ivec2 aCrossIdxRangePerCell;\nout vec2 vXY;\nflat out int instanceId;\nflat out ivec2 closeCellIdxRange;\nflat out ivec2 crossCellIdxRange;\n\n\nvoid main() {\n instanceId = gl_InstanceID;\n closeCellIdxRange = aCloseCellIdxRangePerCell;\n crossCellIdxRange = aCrossIdxRangePerCell;\n\n // drawn column-by-column\n float i = float(instanceId / 32); // column index\n float j = float(instanceId % 32); // row index\n\n vec2 trans = vec2(\n i / float(32),\n j / float(32)\n );\n\n vec2 uv = aUV + trans;\n\n float width = uWidthHeight.x;\n float height = uWidthHeight.y;\n\n vXY = vec2(\n height * uv.x,\n height * uv.y\n );\n\n float aspectRatio = width / height;\n\n gl_Position = vec4(\n vec2(\n (2.0*(uv.x / aspectRatio) - 1.0),\n (2.0*uv.y - 1.0)\n ),\n 0.0, 1.0\n );\n}\n";
|
|
2
2
|
export { vertex };
|
package/node/shaders/vertex.js
CHANGED
|
@@ -4,7 +4,6 @@ const vertex = /*glsl*/ `#version 300 es
|
|
|
4
4
|
precision highp float;
|
|
5
5
|
|
|
6
6
|
uniform vec2 uWidthHeight;
|
|
7
|
-
uniform vec2 uOffset;
|
|
8
7
|
in vec2 aUV;
|
|
9
8
|
in ivec2 aCloseCellIdxRangePerCell;
|
|
10
9
|
in ivec2 aCrossIdxRangePerCell;
|
|
@@ -40,14 +39,11 @@ void main() {
|
|
|
40
39
|
|
|
41
40
|
float aspectRatio = width / height;
|
|
42
41
|
|
|
43
|
-
float x = (uOffset.x / 2.0*width) - 1.0;
|
|
44
|
-
float y = (uOffset.y / 2.0*height) - 1.0;
|
|
45
|
-
|
|
46
42
|
gl_Position = vec4(
|
|
47
43
|
vec2(
|
|
48
44
|
(2.0*(uv.x / aspectRatio) - 1.0),
|
|
49
45
|
(2.0*uv.y - 1.0)
|
|
50
|
-
)
|
|
46
|
+
),
|
|
51
47
|
0.0, 1.0
|
|
52
48
|
);
|
|
53
49
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vertex.js","sourceRoot":"","sources":["../../src/shaders/vertex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,MAAM,GAAG,QAAQ,CAAA
|
|
1
|
+
{"version":3,"file":"vertex.js","sourceRoot":"","sources":["../../src/shaders/vertex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,MAAM,GAAG,QAAQ,CAAA;;;;;;;;;;;;;;;;;;;;mCAoBY,SAAS;mCACT,SAAS;;;oBAGxB,SAAS;oBACT,SAAS;;;;;;;;;;;;;;;;;;;;;;;CAuB5B,CAAC;AAGF,OAAO,EAAE,MAAM,EAAE,CAAA"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* and each bezier in turn consisting of an array of control points from the
|
|
4
4
|
* given SVG path string. An array of loops are returned (as opposed to a single
|
|
5
5
|
* loop) since an SVG path may have sub-paths.
|
|
6
|
+
*
|
|
6
7
|
* @param str The SVG path string, e.g. 'M1 1 C 5 1 5 2 4 2 C 3 3 1 3 1 1 z'
|
|
7
8
|
*/
|
|
8
9
|
declare function getPathsFromStr(str: string): number[][][][];
|
|
@@ -5,6 +5,7 @@ import { parsePathDataString } from './path-data-polyfill/parse-path-data-string
|
|
|
5
5
|
* and each bezier in turn consisting of an array of control points from the
|
|
6
6
|
* given SVG path string. An array of loops are returned (as opposed to a single
|
|
7
7
|
* loop) since an SVG path may have sub-paths.
|
|
8
|
+
*
|
|
8
9
|
* @param str The SVG path string, e.g. 'M1 1 C 5 1 5 2 4 2 C 3 3 1 3 1 1 z'
|
|
9
10
|
*/
|
|
10
11
|
function getPathsFromStr(str) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-paths-from-str.js","sourceRoot":"","sources":["../../src/svg/get-paths-from-str.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gDAAgD,CAAC;AAGrF
|
|
1
|
+
{"version":3,"file":"get-paths-from-str.js","sourceRoot":"","sources":["../../src/svg/get-paths-from-str.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gDAAgD,CAAC;AAGrF;;;;;;;GAOG;AACH,SAAS,eAAe,CAAC,GAAW;IAChC,OAAO,sBAAsB,CACzB,mBAAmB,CAAC,GAAG,CAAC,CAC3B,CAAC;AACN,CAAC;AAGD,OAAO,EAAE,eAAe,EAAE,CAAA"}
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import { parseNumber } from './parse-number.js';
|
|
2
|
-
/** @hidden */
|
|
3
2
|
const COMMAND_MAP = {
|
|
4
3
|
Z: "Z", M: "M", L: "L", C: "C", Q: "Q", A: "A", H: "H", V: "V", S: "S", T: "T",
|
|
5
4
|
z: "Z", m: "m", l: "l", c: "c", q: "q", a: "a", h: "h", v: "v", s: "s", t: "t"
|
|
6
5
|
};
|
|
7
|
-
/** @hidden */
|
|
8
6
|
class Source {
|
|
9
7
|
_string;
|
|
10
8
|
_currentIndex;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source.js","sourceRoot":"","sources":["../../../src/svg/path-data-polyfill/source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,
|
|
1
|
+
{"version":3,"file":"source.js","sourceRoot":"","sources":["../../../src/svg/path-data-polyfill/source.ts"],"names":[],"mappings":"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"}
|
package/node/svg/path-state.d.ts
CHANGED
|
@@ -15,23 +15,16 @@ function getWebGlContext(gl) {
|
|
|
15
15
|
}
|
|
16
16
|
const programs = {};
|
|
17
17
|
const textures = {};
|
|
18
|
-
gl
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
const glContext = { gl, textures, programs };
|
|
19
|
+
gl.canvas.addEventListener('webglcontextlost', event => {
|
|
20
|
+
// event.preventDefault(); // Prevent the default action (which is to not restore automatically)
|
|
21
|
+
deleteAllProps(programs);
|
|
22
|
+
deleteAllProps(textures);
|
|
23
|
+
cache.delete(gl);
|
|
24
|
+
glContext.onContextLoss?.(event);
|
|
21
25
|
}, false);
|
|
22
|
-
const glContext = {
|
|
23
|
-
gl,
|
|
24
|
-
onContextLoss,
|
|
25
|
-
textures,
|
|
26
|
-
programs
|
|
27
|
-
};
|
|
28
26
|
cache.set(gl, glContext);
|
|
29
27
|
return glContext;
|
|
30
|
-
////////////////////////
|
|
31
|
-
function onContextLoss() {
|
|
32
|
-
deleteAllProps(programs);
|
|
33
|
-
deleteAllProps(textures);
|
|
34
|
-
}
|
|
35
28
|
}
|
|
36
29
|
function deleteAllProps(o) {
|
|
37
30
|
Object.keys(o).forEach(key => { delete o[key]; });
|
|
@@ -1 +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,
|
|
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,MAAM,SAAS,GAAc,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;IAExD,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,KAAK,CAAC,EAAE;QACnD,iGAAiG;QAEjG,cAAc,CAAC,QAAQ,CAAC,CAAC;QACzB,cAAc,CAAC,QAAQ,CAAC,CAAC;QACzB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAEjB,SAAS,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC,EAAE,KAAK,CAAC,CAAC;IAEV,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;IAEzB,OAAO,SAAS,CAAC;AACrB,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"}
|
package/package.json
CHANGED
package/src/debug-shaders.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { getFragment } from "./shaders/fragment.js";
|
|
2
|
+
import { vertex } from "./shaders/vertex.js";
|
|
3
3
|
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -26,8 +26,8 @@ function debugShaders(
|
|
|
26
26
|
gl: WebGL2RenderingContext) {
|
|
27
27
|
|
|
28
28
|
try {
|
|
29
|
-
debugGlsl(gl, gl.VERTEX_SHADER,
|
|
30
|
-
debugGlsl(gl, gl.FRAGMENT_SHADER,
|
|
29
|
+
debugGlsl(gl, gl.VERTEX_SHADER, vertex);
|
|
30
|
+
debugGlsl(gl, gl.FRAGMENT_SHADER, getFragment(32,4));
|
|
31
31
|
} catch (e) {
|
|
32
32
|
console.log(e);
|
|
33
33
|
throw e;
|
package/src/generate-sdf.ts
CHANGED
|
@@ -7,7 +7,7 @@ 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
9
|
import { GlContext } from './types/gl-context.js';
|
|
10
|
-
|
|
10
|
+
import { debugShaders } from './debug-shaders.js';
|
|
11
11
|
|
|
12
12
|
const { ceil, min, max } = Math;
|
|
13
13
|
|
|
@@ -36,26 +36,24 @@ const { ceil, min, max } = Math;
|
|
|
36
36
|
function generateSdf(
|
|
37
37
|
glContext: GlContext,
|
|
38
38
|
bezierCurves_or_svgStr: (number[][])[][] | string,
|
|
39
|
+
viewbox: [number,number,number,number],
|
|
39
40
|
width: number,
|
|
40
41
|
height: number,
|
|
41
|
-
|
|
42
|
+
x = 0, y = 0,
|
|
42
43
|
maxDistance: number,
|
|
43
|
-
sdfExponent = 1,
|
|
44
44
|
inclInside = true,
|
|
45
45
|
inclOutside = true,
|
|
46
|
-
|
|
46
|
+
customData: [number,number,number,number],
|
|
47
|
+
|
|
48
|
+
// TODO
|
|
47
49
|
channel = 0) {
|
|
48
50
|
|
|
49
|
-
// debugShaders(gl); // comment for production
|
|
50
|
-
|
|
51
51
|
const psss = typeof bezierCurves_or_svgStr === 'string'
|
|
52
52
|
? getPathsFromStr(bezierCurves_or_svgStr)
|
|
53
53
|
: bezierCurves_or_svgStr;
|
|
54
54
|
|
|
55
55
|
// const glContext = getWebGLContext(gl);
|
|
56
56
|
|
|
57
|
-
const { onContextLoss } = glContext;
|
|
58
|
-
|
|
59
57
|
let stretch = 1;
|
|
60
58
|
const aspectRatio = width/height;
|
|
61
59
|
if (aspectRatio > MAX_ASPECT_RATIO_BEFORE_STRETCH) {
|
|
@@ -78,19 +76,15 @@ function generateSdf(
|
|
|
78
76
|
|
|
79
77
|
const { gl } = glContext;
|
|
80
78
|
|
|
79
|
+
// debugShaders(gl); // comment for production
|
|
80
|
+
|
|
81
81
|
gl.useProgram(programMain.program);
|
|
82
82
|
mainProgram(
|
|
83
|
-
glContext, programMain,
|
|
84
|
-
viewbox, maxDistance,
|
|
85
|
-
|
|
83
|
+
glContext, programMain,
|
|
84
|
+
psss, viewbox, maxDistance, inclInside, inclOutside, customData,
|
|
85
|
+
x, y, width, height,
|
|
86
|
+
colCount, cellSize, padCount, stretch
|
|
86
87
|
);
|
|
87
|
-
|
|
88
|
-
// Handle context loss occurring during any of the above calls
|
|
89
|
-
if (gl.isContextLost()) {
|
|
90
|
-
onContextLoss();
|
|
91
|
-
|
|
92
|
-
throw new Error('Webgl2 context lost.');
|
|
93
|
-
}
|
|
94
88
|
}
|
|
95
89
|
|
|
96
90
|
|
package/src/main-program.ts
CHANGED
|
@@ -17,18 +17,20 @@ const CROSS_TEX_INDEX = 2;
|
|
|
17
17
|
function mainProgram(
|
|
18
18
|
glContext: GlContext,
|
|
19
19
|
programMain: Program,
|
|
20
|
+
|
|
20
21
|
psss: number[][][][],
|
|
21
22
|
viewbox: [number,number,number,number],
|
|
22
23
|
maxDistance: number,
|
|
23
|
-
|
|
24
|
+
inclInside: boolean,
|
|
25
|
+
inclOutside: boolean,
|
|
26
|
+
customData: [number, number, number, number],
|
|
27
|
+
|
|
24
28
|
x: number,
|
|
25
29
|
y: number,
|
|
26
30
|
width: number,
|
|
27
31
|
height: number,
|
|
28
32
|
colCount: number,
|
|
29
33
|
cellSize: number,
|
|
30
|
-
inclInside: boolean,
|
|
31
|
-
inclOutside: boolean,
|
|
32
34
|
padCount: number,
|
|
33
35
|
stretch: number) {
|
|
34
36
|
|
|
@@ -78,11 +80,10 @@ function mainProgram(
|
|
|
78
80
|
);
|
|
79
81
|
|
|
80
82
|
// Init/update uniforms
|
|
81
|
-
setUniform_('2f', 'uOffset', x, y);
|
|
82
83
|
setUniform_('2f', 'uWidthHeight', width, height);
|
|
83
84
|
setUniform_('1f', 'uMaxDistance', maxDistance);
|
|
84
|
-
setUniform_('1f', 'uExponent', sdfExponent); // TODO
|
|
85
85
|
setUniform_('1i', 'uIncl', (inclInside ? 1 : 0) + (inclOutside ? 2 : 0));
|
|
86
|
+
setUniform_('4f', 'uCustom', ...customData);
|
|
86
87
|
|
|
87
88
|
setUniformBlock(programMain)('SegIdxRangePerCellBlock', 0, segIdxs_PerCell_Range_Arr);
|
|
88
89
|
setUniformBlock(programMain)('SegIdxRangePerStripBlock', 1, segIdxs_PerStrip_Range_Arr);
|
|
@@ -90,15 +91,19 @@ function mainProgram(
|
|
|
90
91
|
///////////////////////////////////////
|
|
91
92
|
// Create buffer for line segment data
|
|
92
93
|
useTexture(glContext, SEG_TEX_INDEX, 'segs');
|
|
93
|
-
gl.texImage2D(
|
|
94
|
+
gl.texImage2D(
|
|
94
95
|
gl.TEXTURE_2D,
|
|
95
|
-
0,
|
|
96
|
-
gl.RGBA32F,
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
96
|
+
0, // level - irrelevant
|
|
97
|
+
gl.RGBA32F, // internalFormat - we're using 4 floats for the 2 line segment endpoints
|
|
98
|
+
|
|
99
|
+
TEX_WIDTH, // fixed width
|
|
100
|
+
lineSegPtCoords_Arr.length / 4 / TEX_WIDTH, // height === number of point coordinates
|
|
101
|
+
// lineSegPtCoords_Arr.length/4,
|
|
102
|
+
// 1,
|
|
103
|
+
|
|
104
|
+
0, // border - whatever
|
|
105
|
+
gl.RGBA, // format
|
|
106
|
+
gl.FLOAT, // it holds floats
|
|
102
107
|
lineSegPtCoords_Arr // texture data
|
|
103
108
|
);
|
|
104
109
|
const segTexLoc = gl.getUniformLocation(programMain.program, "uSegs");
|
|
@@ -108,12 +113,12 @@ function mainProgram(
|
|
|
108
113
|
///////////////////////////////////////////////
|
|
109
114
|
// Create buffer for close cell indexes per cell
|
|
110
115
|
useTexture(glContext, CELL_TEX_INDEX, 'closeCellIdxsPerCell');
|
|
111
|
-
gl.texImage2D(
|
|
116
|
+
gl.texImage2D(
|
|
112
117
|
gl.TEXTURE_2D,
|
|
113
118
|
0, // level - irrelevant
|
|
114
119
|
gl.R32I, // internalFormat - we're using 1 signed 32-bit int for indexes
|
|
115
|
-
TEX_WIDTH, // width
|
|
116
|
-
closeCellIdxs_PerCell_Arr.length / TEX_WIDTH,
|
|
120
|
+
TEX_WIDTH, // fixed width
|
|
121
|
+
closeCellIdxs_PerCell_Arr.length / TEX_WIDTH, // height === number of indexes
|
|
117
122
|
0, // border - whatever
|
|
118
123
|
gl.RED_INTEGER, // format
|
|
119
124
|
gl.INT, // it holds ints
|
|
@@ -127,12 +132,12 @@ function mainProgram(
|
|
|
127
132
|
///////////////////////////////////////////////
|
|
128
133
|
// Create buffer for crossing cell indexes per cell
|
|
129
134
|
useTexture(glContext, CROSS_TEX_INDEX, 'crossCellIdxsPerCell');
|
|
130
|
-
gl.texImage2D(
|
|
135
|
+
gl.texImage2D(
|
|
131
136
|
gl.TEXTURE_2D,
|
|
132
137
|
0, // level - irrelevant
|
|
133
138
|
gl.R32I, // internalFormat - we're using 1 signed 32-bit int for indexes
|
|
134
|
-
TEX_WIDTH, // width
|
|
135
|
-
crossCellIdxs_PerCell_Arr.length / TEX_WIDTH, // height
|
|
139
|
+
TEX_WIDTH, // fixed width
|
|
140
|
+
crossCellIdxs_PerCell_Arr.length / TEX_WIDTH, // height === number of indexes
|
|
136
141
|
0, // border - whatever
|
|
137
142
|
gl.RED_INTEGER, // format
|
|
138
143
|
gl.INT, // it holds ints
|
|
@@ -144,10 +149,10 @@ function mainProgram(
|
|
|
144
149
|
|
|
145
150
|
if (stretch > 1) {
|
|
146
151
|
gl.enable(gl.SCISSOR_TEST);
|
|
147
|
-
gl.scissor(
|
|
152
|
+
gl.scissor(x, y, width, height/stretch)
|
|
148
153
|
}
|
|
149
154
|
|
|
150
|
-
gl.viewport(
|
|
155
|
+
gl.viewport(x, y, width, height);
|
|
151
156
|
|
|
152
157
|
// draw a square colCount * ROW_COUNT times - 6 vertics
|
|
153
158
|
gl.drawArraysInstanced(gl.TRIANGLES, 0, 6, colCount*ROW_COUNT);
|
package/src/prepare-buffers.ts
CHANGED
|
@@ -26,7 +26,7 @@ function prepareBuffers(
|
|
|
26
26
|
|
|
27
27
|
const lineSegs = bezierCurvesToLineSegs(psss_);
|
|
28
28
|
const grid = createEmptyGrid(colCount, padCount);
|
|
29
|
-
const strips = new Array(ROW_COUNT).fill(undefined).map(v => []);
|
|
29
|
+
const strips = new Array(ROW_COUNT).fill(undefined).map(v => [] as number[][][]);
|
|
30
30
|
|
|
31
31
|
for (let i=0; i<lineSegs.length; i++) {
|
|
32
32
|
const seg = lineSegs[i];
|
|
@@ -39,16 +39,16 @@ function prepareBuffers(
|
|
|
39
39
|
findCrossingCells(grid, colCount, padCount); // add crossing cells
|
|
40
40
|
////////////////////////////////////////////////////////////////////////////
|
|
41
41
|
|
|
42
|
-
const allSegs: number[]
|
|
43
|
-
const segIdxs_PerCell_Range:
|
|
42
|
+
const allSegs: number[] = [];
|
|
43
|
+
const segIdxs_PerCell_Range: number[] = [];
|
|
44
44
|
|
|
45
45
|
// close cells
|
|
46
46
|
const closeCellIdxs_PerCell: number[] = [];
|
|
47
|
-
const closeCellIdxs_PerCell_Range:
|
|
47
|
+
const closeCellIdxs_PerCell_Range: number[] = [];
|
|
48
48
|
|
|
49
49
|
// crossing cells
|
|
50
50
|
const crossCellIdxs_PerCell: number[] = [];
|
|
51
|
-
const crossCellIdxs_PerCell_Range:
|
|
51
|
+
const crossCellIdxs_PerCell_Range: number[] = [];
|
|
52
52
|
|
|
53
53
|
// const closeCellIdxsPerCell_: number[][] = []; // testing
|
|
54
54
|
|
|
@@ -66,13 +66,15 @@ function prepareBuffers(
|
|
|
66
66
|
const { closeCells, crossingCells } = cell;
|
|
67
67
|
|
|
68
68
|
const L1 = crossingCells.length;
|
|
69
|
-
crossCellIdxs_PerCell.push(...crossingCells);
|
|
70
|
-
crossCellIdxs_PerCell_Range.push([S1, L1]);
|
|
71
|
-
S1 += L1;
|
|
72
|
-
|
|
73
69
|
const L2 = closeCells.length;
|
|
70
|
+
|
|
71
|
+
crossCellIdxs_PerCell.push(...crossingCells);
|
|
74
72
|
closeCellIdxs_PerCell.push(...closeCells);
|
|
75
|
-
|
|
73
|
+
|
|
74
|
+
crossCellIdxs_PerCell_Range.push(S1, L1);
|
|
75
|
+
closeCellIdxs_PerCell_Range.push(S2, L2);
|
|
76
|
+
|
|
77
|
+
S1 += L1;
|
|
76
78
|
S2 += L2;
|
|
77
79
|
|
|
78
80
|
// closeCellIdxsPerCell_.push(closeCells); // testing
|
|
@@ -82,16 +84,12 @@ function prepareBuffers(
|
|
|
82
84
|
const { lineSegs } = cell;
|
|
83
85
|
|
|
84
86
|
const L3 = lineSegs.length;
|
|
85
|
-
segIdxs_PerCell_Range.push(
|
|
87
|
+
segIdxs_PerCell_Range.push(S3, L3);
|
|
86
88
|
S3 += L3;
|
|
87
|
-
allSegs.push(...lineSegs);
|
|
89
|
+
allSegs.push(...lineSegs.flat(2));
|
|
88
90
|
}
|
|
89
91
|
}
|
|
90
92
|
|
|
91
|
-
// It is a requirement to fill in multiples of `TEX_WIDTH`
|
|
92
|
-
while (closeCellIdxs_PerCell.length % TEX_WIDTH !== 0) { closeCellIdxs_PerCell.push(0); }
|
|
93
|
-
while (crossCellIdxs_PerCell.length % TEX_WIDTH !== 0) { crossCellIdxs_PerCell.push(0); }
|
|
94
|
-
|
|
95
93
|
// Add line segs from strips
|
|
96
94
|
const segIdxs_PerStrip_Range: [number,number][] = [];
|
|
97
95
|
for (let i=0; i<ROW_COUNT; i++) {
|
|
@@ -101,21 +99,26 @@ function prepareBuffers(
|
|
|
101
99
|
const L = lineSegs.length;
|
|
102
100
|
segIdxs_PerStrip_Range.push([S3, L]);
|
|
103
101
|
S3 += L;
|
|
104
|
-
allSegs.push(...lineSegs);
|
|
102
|
+
allSegs.push(...lineSegs.flat(2));
|
|
105
103
|
}
|
|
106
104
|
|
|
105
|
+
// It is a requirement to fill in multiples of `TEX_WIDTH`
|
|
106
|
+
while (closeCellIdxs_PerCell.length % TEX_WIDTH !== 0) { closeCellIdxs_PerCell.push(0); }
|
|
107
|
+
while (crossCellIdxs_PerCell.length % TEX_WIDTH !== 0) { crossCellIdxs_PerCell.push(0); }
|
|
108
|
+
while (allSegs.length % (4*TEX_WIDTH) !== 0) { allSegs.push(0); }
|
|
109
|
+
|
|
107
110
|
|
|
108
111
|
// all line segments, with their ranges per cell and per strip
|
|
109
|
-
const lineSegPtCoords_Arr = new Float32Array(allSegs
|
|
110
|
-
const segIdxs_PerCell_Range_Arr = new Int32Array(segIdxs_PerCell_Range
|
|
112
|
+
const lineSegPtCoords_Arr = new Float32Array(allSegs);
|
|
113
|
+
const segIdxs_PerCell_Range_Arr = new Int32Array(segIdxs_PerCell_Range);
|
|
111
114
|
|
|
112
115
|
// close cell idxs and range
|
|
113
|
-
const closeCellIdxs_PerCell_Range_Arr = new Int32Array(closeCellIdxs_PerCell_Range
|
|
116
|
+
const closeCellIdxs_PerCell_Range_Arr = new Int32Array(closeCellIdxs_PerCell_Range);
|
|
114
117
|
const closeCellIdxs_PerCell_Arr = new Int32Array(closeCellIdxs_PerCell);
|
|
115
118
|
|
|
116
119
|
// cross cell idxs and range
|
|
117
120
|
const crossCellIdxs_PerCell_Arr = new Int32Array(crossCellIdxs_PerCell);
|
|
118
|
-
const crossCellIdxs_perCell_Range_Arr = new Int32Array(crossCellIdxs_PerCell_Range
|
|
121
|
+
const crossCellIdxs_perCell_Range_Arr = new Int32Array(crossCellIdxs_PerCell_Range);
|
|
119
122
|
|
|
120
123
|
// segment index ranges per strip
|
|
121
124
|
const segIdxs_PerStrip_Range_Arr = new Int32Array(segIdxs_PerStrip_Range.flat());
|