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.
Files changed (40) hide show
  1. package/README.md +56 -45
  2. package/browser/index.min.js +1 -1
  3. package/node/debug-shaders.d.ts +9 -0
  4. package/node/debug-shaders.js +28 -0
  5. package/node/debug-shaders.js.map +1 -0
  6. package/node/generate-sdf.d.ts +1 -1
  7. package/node/generate-sdf.js +5 -10
  8. package/node/generate-sdf.js.map +1 -1
  9. package/node/main-program.d.ts +1 -1
  10. package/node/main-program.js +16 -17
  11. package/node/main-program.js.map +1 -1
  12. package/node/prepare-buffers.js +21 -18
  13. package/node/prepare-buffers.js.map +1 -1
  14. package/node/shaders/fragment.js +28 -20
  15. package/node/shaders/fragment.js.map +1 -1
  16. package/node/shaders/vertex.d.ts +1 -1
  17. package/node/shaders/vertex.js +1 -5
  18. package/node/shaders/vertex.js.map +1 -1
  19. package/node/svg/get-paths-from-str.d.ts +1 -0
  20. package/node/svg/get-paths-from-str.js +1 -0
  21. package/node/svg/get-paths-from-str.js.map +1 -1
  22. package/node/svg/path-data-polyfill/source.d.ts +0 -1
  23. package/node/svg/path-data-polyfill/source.js +0 -2
  24. package/node/svg/path-data-polyfill/source.js.map +1 -1
  25. package/node/svg/path-state.d.ts +0 -1
  26. package/node/types/gl-context.d.ts +1 -1
  27. package/node/webgl-utils/get-web-gl-context.js +7 -14
  28. package/node/webgl-utils/get-web-gl-context.js.map +1 -1
  29. package/package.json +1 -1
  30. package/src/debug-shaders.ts +4 -4
  31. package/src/generate-sdf.ts +12 -18
  32. package/src/main-program.ts +26 -21
  33. package/src/prepare-buffers.ts +24 -21
  34. package/src/shaders/fragment.ts +28 -20
  35. package/src/shaders/vertex.ts +1 -5
  36. package/src/svg/get-paths-from-str.ts +1 -0
  37. package/src/svg/path-data-polyfill/source.ts +0 -2
  38. package/src/svg/path-state.ts +0 -1
  39. package/src/types/gl-context.ts +1 -1
  40. package/src/webgl-utils/get-web-gl-context.ts +10 -18
@@ -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 * lineDir;
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
- bool isEven = crossIdx % 2 == 0;
56
+ ivec2 uSegIdxRange = crossIdx % 2 == 0
57
+ ? uSegIdxRangePerCell[crossIdx / 2].xy
58
+ : uSegIdxRangePerCell[crossIdx / 2].zw;
58
59
 
59
- ivec4 uSegIdxRange = uSegIdxRangePerCell[crossIdx / 2];
60
- int segIdx = isEven ? uSegIdxRange.x : uSegIdxRange.z;
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, 0), 0);
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
- bool isEven = (instanceId % ${ROW_COUNT}) % 2 == 0;
79
+ int cellIdx = (instanceId % ${ROW_COUNT});
80
+
81
+ bool isEven = cellIdx % 2 == 0;
80
82
 
81
- ivec4 uSegIdxRange = uSegIdxRangePerStrip[(instanceId % ${ROW_COUNT}) / 2];
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, 0), 0);
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
- bool isEven = cellIdx % 2 == 0;
115
- ivec4 uSegIdxRange = uSegIdxRangePerCell[cellIdx / 2];
116
- int segIdx = isEven ? uSegIdxRange.x : uSegIdxRange.z;
117
- int segLen = isEven ? uSegIdxRange.y : uSegIdxRange.w;
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, 0), 0);
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 TODO
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(50.0 * res));
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;;;;;;;;;;;;gCAYwB,CAAC,SAAS,GAAG,CAAC,GAAC,QAAQ,CAAC,GAAC,CAAC,QAAQ,GAAG,CAAC,GAAC,QAAQ,CAAC,GAAG,CAAC;;;iCAGnD,SAAS,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sCAuDR,SAAS;;kEAEmB,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iDAsD1B,SAAS;;;;;;;;;;CAUzD,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"}
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"}
@@ -1,2 +1,2 @@
1
- declare const vertex = "#version 300 es\n\nprecision highp float;\n\nuniform vec2 uWidthHeight;\nuniform vec2 uOffset;\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 float x = (uOffset.x / 2.0*width) - 1.0;\n float y = (uOffset.y / 2.0*height) - 1.0;\n\n gl_Position = vec4(\n vec2(\n (2.0*(uv.x / aspectRatio) - 1.0),\n (2.0*uv.y - 1.0)\n ) + vec2(x,y),\n 0.0, 1.0\n );\n}\n";
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 };
@@ -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
- ) + vec2(x,y),
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;;;;;;;;;;;;;;;;;;;;;mCAqBY,SAAS;mCACT,SAAS;;;oBAGxB,SAAS;oBACT,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;CA0B5B,CAAC;AAGF,OAAO,EAAE,MAAM,EAAE,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;;;;;;GAMG;AACH,SAAS,eAAe,CAAC,GAAW;IAChC,OAAO,sBAAsB,CACzB,mBAAmB,CAAC,GAAG,CAAC,CAC3B,CAAC;AACN,CAAC;AAGD,OAAO,EAAE,eAAe,EAAE,CAAA"}
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,4 +1,3 @@
1
- /** @hidden */
2
1
  declare class Source {
3
2
  _string: string;
4
3
  _currentIndex: number;
@@ -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":"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"}
1
+ {"version":3,"file":"source.js","sourceRoot":"","sources":["../../../src/svg/path-data-polyfill/source.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,3 @@
1
- /** @hidden */
2
1
  interface PathState {
3
2
  initialPoint?: number[] | undefined;
4
3
  p: number[];
@@ -22,6 +22,6 @@ interface GlContext {
22
22
  readonly programs: {
23
23
  [index: string]: Program;
24
24
  };
25
- readonly onContextLoss: () => void;
25
+ onContextLoss?: (event: Event) => void;
26
26
  }
27
27
  export type { GlContext };
@@ -15,23 +15,16 @@ function getWebGlContext(gl) {
15
15
  }
16
16
  const programs = {};
17
17
  const textures = {};
18
- gl.canvas.addEventListener('webglcontextlost', e => {
19
- onContextLoss();
20
- e.preventDefault();
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,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"}
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
@@ -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",
5
+ "version": "0.0.7",
6
6
  "author": {
7
7
  "name": "Floris Steenkamp"
8
8
  },
@@ -1,5 +1,5 @@
1
- import { getMainFragment } from "./shaders/main.fragment.js";
2
- import { main_Vertex } from "./shaders/main.vertex.js";
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, main_Vertex);
30
- debugGlsl(gl, gl.FRAGMENT_SHADER, getMainFragment(32,4));
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;
@@ -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
- // import { debugShaders } from './debug-shaders.js';
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
- viewbox: [number,number,number,number],
42
+ x = 0, y = 0,
42
43
  maxDistance: number,
43
- sdfExponent = 1,
44
44
  inclInside = true,
45
45
  inclOutside = true,
46
- x = 0, y = 0,
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, psss,
84
- viewbox, maxDistance, sdfExponent, x, y, width, height, colCount,
85
- cellSize, inclInside, inclOutside, padCount, stretch
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
 
@@ -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
- sdfExponent = 1,
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( // really 1d
94
+ gl.texImage2D(
94
95
  gl.TEXTURE_2D,
95
- 0, // level - irrelevant
96
- gl.RGBA32F, // internalFormat - we're using 4 floats for the 2 line segment endpoints
97
- lineSegPtCoords_Arr.length/4, // width === number of lines
98
- 1, // height - linear data texture so we only need height of 1
99
- 0, // border - whatever
100
- gl.RGBA, // format
101
- gl.FLOAT, // it holds floats
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( // really 1d
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 === number of indexes
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( // really 1d
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 === number of indexes
135
- crossCellIdxs_PerCell_Arr.length / TEX_WIDTH, // height - linear data texture so we only need height of 1
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(0, 0, width, height/stretch)
152
+ gl.scissor(x, y, width, height/stretch)
148
153
  }
149
154
 
150
- gl.viewport(0, 0, width, height);
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);
@@ -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: [number,number][] = [];
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: [number,number][] = [];
47
+ const closeCellIdxs_PerCell_Range: number[] = [];
48
48
 
49
49
  // crossing cells
50
50
  const crossCellIdxs_PerCell: number[] = [];
51
- const crossCellIdxs_PerCell_Range: [number,number][] = [];
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
- closeCellIdxs_PerCell_Range.push([S2, L2]);
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([S3, L3]);
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.flat(2));
110
- const segIdxs_PerCell_Range_Arr = new Int32Array(segIdxs_PerCell_Range.flat());
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.flat());
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.flat());
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());