webgl2-sdf 0.0.2 → 0.0.4
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/browser/index.min.js +1 -1
- package/node/bezier/is-cubic-obtuse.js +2 -2
- package/node/bezier/is-cubic-obtuse.js.map +1 -1
- package/node/bezier/is-quad-obtuse.js +2 -2
- package/node/bezier/is-quad-obtuse.js.map +1 -1
- package/node/bezier/split-by-deviation-from-straight-line-quad.js +3 -3
- package/node/bezier/split-by-deviation-from-straight-line-quad.js.map +1 -1
- package/node/bezier/split-into-line-segments.js +3 -3
- package/node/bezier/split-into-line-segments.js.map +1 -1
- package/node/generate-sdf.d.ts +3 -2
- package/node/generate-sdf.js +5 -6
- package/node/generate-sdf.js.map +1 -1
- package/node/index.d.ts +2 -0
- package/node/index.js +2 -0
- package/node/index.js.map +1 -1
- package/node/main-program.js +0 -1
- package/node/main-program.js.map +1 -1
- package/node/prepare-buffers.js +4 -6
- package/node/prepare-buffers.js.map +1 -1
- package/node/shaders/main.fragment.js +1 -1
- package/node/shaders/main.fragment.js.map +1 -1
- package/node/shaders/main.vertex.d.ts +1 -1
- package/node/shaders/main.vertex.js +1 -2
- package/node/shaders/main.vertex.js.map +1 -1
- package/node/types/gl-context.d.ts +0 -1
- package/node/types/program.d.ts +4 -2
- package/node/utils/calc-circs.js +3 -3
- package/node/utils/calc-circs.js.map +1 -1
- package/node/utils/clip-line-segment-to-grid.d.ts +2 -2
- package/node/utils/clip-line-segment-to-grid.js +2 -5
- 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 +6 -58
- package/node/utils/clip-line-segment-to-strips.js.map +1 -1
- package/node/utils/create-empty-grid.d.ts +1 -1
- package/node/utils/create-empty-grid.js +1 -1
- package/node/utils/create-empty-grid.js.map +1 -1
- package/node/utils/find-close-cells.d.ts +1 -1
- package/node/utils/find-close-cells.js +17 -73
- package/node/utils/find-close-cells.js.map +1 -1
- package/node/utils/find-crossing-cells.d.ts +1 -1
- package/node/utils/find-crossing-cells.js +1 -16
- package/node/utils/find-crossing-cells.js.map +1 -1
- package/node/utils/jump-idx.js +21 -19
- package/node/utils/jump-idx.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 +3 -3
- package/node/webgl-utils/get-gl-context.js +6 -9
- package/node/webgl-utils/get-gl-context.js.map +1 -1
- package/node/webgl-utils/set-attribute.d.ts +3 -3
- 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.d.ts +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/set-uniform.d.ts +2 -2
- package/node/webgl-utils/use-program.d.ts +2 -2
- package/node/webgl-utils/use-program.js +14 -4
- package/node/webgl-utils/use-program.js.map +1 -1
- package/package.json +1 -1
- package/src/bezier/is-cubic-obtuse.ts +2 -2
- package/src/bezier/is-quad-obtuse.ts +2 -2
- package/src/bezier/split-by-deviation-from-straight-line-quad.ts +3 -3
- package/src/bezier/split-into-line-segments.ts +3 -3
- package/src/debug-shaders.ts +2 -2
- package/src/generate-sdf.ts +7 -5
- package/src/index.ts +2 -0
- package/src/main-program.ts +0 -1
- package/src/prepare-buffers.ts +5 -6
- package/src/shaders/main.fragment.ts +1 -1
- package/src/shaders/main.vertex.ts +1 -2
- package/src/types/gl-context.ts +0 -1
- package/src/types/program.ts +4 -2
- package/src/utils/calc-circs.ts +3 -5
- package/src/utils/clip-line-segment-to-grid.ts +3 -8
- package/src/utils/clip-line-segment-to-strips.ts +7 -74
- package/src/utils/create-empty-grid.ts +2 -2
- package/src/utils/find-close-cells.ts +31 -91
- package/src/utils/find-crossing-cells.ts +2 -19
- package/src/utils/jump-idx.ts +26 -21
- package/src/webgl-utils/free-gl-context.ts +35 -0
- package/src/webgl-utils/get-gl-context.ts +9 -12
- package/src/webgl-utils/set-attribute.ts +4 -4
- package/src/webgl-utils/set-uniform-block.ts +2 -4
- package/src/webgl-utils/set-uniform.ts +2 -2
- package/src/webgl-utils/use-program.ts +19 -8
- 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/src/types/strip.ts +0 -11
- package/src/utils/create-empty-strips.ts +0 -21
- package/src/utils/path.ts +0 -137
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { segStripX } from "./seg-strip-x";
|
|
1
|
+
import { segStripX } from "./seg-strip-x.js";
|
|
2
2
|
const { floor, ceil } = Math;
|
|
3
3
|
/**
|
|
4
4
|
* Clips a line segment to strip boundaries and returns multiple segments.
|
|
@@ -6,7 +6,7 @@ const { floor, ceil } = Math;
|
|
|
6
6
|
* * modifies strips by adding line segments to each strip
|
|
7
7
|
* * size/count *must* be a power of 2
|
|
8
8
|
*
|
|
9
|
-
* @param
|
|
9
|
+
* @param strips array of strips - each contains an array line segments
|
|
10
10
|
* @param height the height of a strip
|
|
11
11
|
* @param seg the line segment (array of 2 points)
|
|
12
12
|
*/
|
|
@@ -66,7 +66,7 @@ function clipLineSegmentToStrips(strips, height, seg) {
|
|
|
66
66
|
// if we're past the line endpoint
|
|
67
67
|
if ((tX > 1 || dX === 0) && tY > 1) {
|
|
68
68
|
const v = floor(p1[1] / cellSize);
|
|
69
|
-
strips[v]?.
|
|
69
|
+
strips[v]?.push([[x, y], p1]);
|
|
70
70
|
break;
|
|
71
71
|
}
|
|
72
72
|
if (((xX >= 0 && (x0 !== 0 || dX !== 0)) || xY <= 0 || xY >= height)) {
|
|
@@ -81,70 +81,18 @@ function clipLineSegmentToStrips(strips, height, seg) {
|
|
|
81
81
|
else {
|
|
82
82
|
const v = fY(y / cellSize) - (btt ? 0 : 1); // previous v
|
|
83
83
|
const seg_ = [[x, y], ps[i]];
|
|
84
|
-
strips[v]?.
|
|
84
|
+
strips[v]?.push(seg_);
|
|
85
85
|
break;
|
|
86
86
|
}
|
|
87
87
|
}
|
|
88
88
|
// previous v
|
|
89
89
|
const v = fY(y / cellSize) - (btt ? 0 : 1);
|
|
90
|
-
strips[v]?.
|
|
90
|
+
strips[v]?.push([[x, y], [xX, xY]]);
|
|
91
91
|
// update current position
|
|
92
92
|
x = xX;
|
|
93
93
|
y = xY;
|
|
94
94
|
}
|
|
95
95
|
}
|
|
96
96
|
export { clipLineSegmentToStrips };
|
|
97
|
-
|
|
98
|
-
// import { createEmptyStrips } from "./create-empty-strips";
|
|
99
|
-
// {
|
|
100
|
-
// const strips = createEmptyStrips(8);
|
|
101
|
-
// const seg = [[0, 100], [0, 400]];
|
|
102
|
-
// toDesmosStr(seg);
|
|
103
|
-
// clipLineSegmentToStrips(strips, 512, seg);
|
|
104
|
-
// testAllEmptyExcept(strips,[1,2,3,4,5,6]);
|
|
105
|
-
// }
|
|
106
|
-
// {
|
|
107
|
-
// const strips = createEmptyStrips(8);
|
|
108
|
-
// const seg = [[83, 166], [-90, 440]];
|
|
109
|
-
// toDesmosStr(seg);
|
|
110
|
-
// clipLineSegmentToStrips(strips, 512, seg);
|
|
111
|
-
// testAllEmptyExcept(strips,[4,5,6]);
|
|
112
|
-
// }
|
|
113
|
-
// {
|
|
114
|
-
// const strips = createEmptyStrips(8);
|
|
115
|
-
// const seg = [[-570, 236], [-392, 546]];
|
|
116
|
-
// toDesmosStr(seg);
|
|
117
|
-
// clipLineSegmentToStrips(strips, 512, seg);
|
|
118
|
-
// testAllEmptyExcept(strips,[3,4,5,6,7]);
|
|
119
|
-
// }
|
|
120
|
-
// {
|
|
121
|
-
// const strips = createEmptyStrips(8);
|
|
122
|
-
// const seg = [[-462, 632], [-152, 611]];
|
|
123
|
-
// toDesmosStr(seg);
|
|
124
|
-
// clipLineSegmentToStrips(strips, 512, seg);
|
|
125
|
-
// testAllEmptyExcept(strips,[]);
|
|
126
|
-
// }
|
|
127
|
-
// function toDesmosStr(seg: number[][]) {
|
|
128
|
-
// const [[x0,y0],[x1,y1]] = seg;
|
|
129
|
-
// return `\\left(\\left(1-t\\right)\\cdot${x0.toFixed(2)}+t\\cdot\\left(${x1.toFixed(2)}\\right),\\left(1-t\\right)\\cdot${y0.toFixed(2)}+t\\cdot${y1.toFixed(2)}\\right)`;
|
|
130
|
-
// }
|
|
131
|
-
// function testAllEmptyExcept(
|
|
132
|
-
// strips: Strip[],
|
|
133
|
-
// exceptions: number[]) {
|
|
134
|
-
// for (let i=0; i<strips.length; i++) {
|
|
135
|
-
// const strip = strips[i];
|
|
136
|
-
// const idx = exceptions.findIndex(v => v === i);
|
|
137
|
-
// const exception = exceptions[idx];
|
|
138
|
-
// const len = strip.lineSegs.length;
|
|
139
|
-
// if (exception === undefined) {
|
|
140
|
-
// if (len !== 0) {
|
|
141
|
-
// throw new Error(`Strip ${i} must be empty`);
|
|
142
|
-
// }
|
|
143
|
-
// } else {
|
|
144
|
-
// if (len !== 1) {
|
|
145
|
-
// throw new Error(`Strip ${i} must contain 1 segments, found ${len}`);
|
|
146
|
-
// }
|
|
147
|
-
// }
|
|
148
|
-
// }
|
|
149
|
-
// }
|
|
97
|
+
var a = [[1, 1], [1, 1]];
|
|
150
98
|
//# sourceMappingURL=clip-line-segment-to-strips.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clip-line-segment-to-strips.js","sourceRoot":"","sources":["../../src/utils/clip-line-segment-to-strips.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"clip-line-segment-to-strips.js","sourceRoot":"","sources":["../../src/utils/clip-line-segment-to-strips.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAG7C,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;AAG7B;;;;;;;;;GASG;AACH,SAAS,uBAAuB,CACxB,MAAsB,EACtB,MAAc,EACd,GAAe;IAEnB,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;IAC5B,0CAA0C;IAC1C,MAAM,QAAQ,GAAG,MAAM,GAAC,KAAK,CAAC;IAE9B,MAAM,CAAC,EAAE,EAAC,EAAE,CAAC,GAAG,GAAG,CAAC;IACpB,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,MAAM,CAAC,CAAC,CAAC;IACxC,MAAM,CAAC,EAAE,EAAC,EAAE,CAAC,GAAG,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,EAAC,EAAE,CAAC,GAAG,EAAE,CAAC;IAEnB,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IACnB,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IAEnB,MAAM,WAAW,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC;IACpD,MAAM,WAAW,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC;IAEpD,sCAAsC;IACtC,IAAI,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,CAAC;QAC/C,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACtB,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,MAAM,IAAI,EAAE,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAE7D,OAAO;IACX,CAAC;IAED,iDAAiD;IAEjD,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,CAAE,wBAAwB;QACrC,OAAO;IACX,CAAC;IAED,kEAAkE;IAClE,MAAM,KAAK,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAE7C,kDAAkD;IAElD,yBAAyB;IACzB,IAAI,CAAC,GAAG,EAAE,CAAC;IACX,yBAAyB;IACzB,IAAI,CAAC,GAAG,EAAE,CAAC;IAEX,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,gBAAgB;IAChB,MAAM,GAAG,GAAG,EAAE,GAAG,EAAE,CAAC;IACpB,gBAAgB;IAChB,MAAM,GAAG,GAAG,EAAE,GAAG,EAAE,CAAC;IAEpB,iCAAiC;IACjC,mBAAmB;IACnB,kCAAkC;IAClC,mEAAmE;IAEnE,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9B,OAAO,IAAI,EAAE,CAAC;QACV,2BAA2B;QAC3B,IAAI,SAAS,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC;QAEnF,IAAI,SAAS,GAAG,QAAQ,GAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,GAAC,QAAQ,CAAC,CAAC;QAElD,qEAAqE;QACrE,UAAU;QACV,MAAM,EAAE,GAAG,CAAC,SAAS,GAAG,EAAE,CAAC,GAAC,EAAE,CAAC;QAC/B,UAAU;QACV,MAAM,EAAE,GAAG,CAAC,SAAS,GAAG,EAAE,CAAC,GAAC,EAAE,CAAC;QAE/B,MAAM,KAAK,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAElC,qBAAqB;QACrB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAC,EAAE,CAAC;QAClC,qBAAqB;QACrB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAE1C,kCAAkC;QAClC,IAAI,CAAC,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;YACjC,MAAM,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,GAAC,QAAQ,CAAC,CAAC;YAChC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,EAAE,CAAC,CAAC,CAAC;YAC5B,MAAM;QACV,CAAC;QAED,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,EAAE,CAAC;YACnE,+CAA+C;YAC/C,MAAM,QAAQ,GAAG,CAAC,WAAW,IAAI,CAAC,KAAK,CAAC,CAAC;YAEzC,IAAI,QAAQ,EAAE,CAAC;gBACX,8BAA8B;gBAC9B,CAAC,CAAC,EAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;gBACd,CAAC,EAAE,CAAC;gBACJ,SAAS;YACb,CAAC;iBAAM,CAAC;gBACJ,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,GAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,aAAa;gBACxD,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC3B,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;gBACtB,MAAM;YACV,CAAC;QACL,CAAC;QAED,aAAa;QACb,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,GAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAEzC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAElC,0BAA0B;QAC1B,CAAC,GAAG,EAAE,CAAC;QACP,CAAC,GAAG,EAAE,CAAC;IACX,CAAC;AACL,CAAC;AAGD,OAAO,EAAE,uBAAuB,EAAE,CAAA;AAClC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,CAAC,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-empty-grid.js","sourceRoot":"","sources":["../../src/utils/create-empty-grid.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"create-empty-grid.js","sourceRoot":"","sources":["../../src/utils/create-empty-grid.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAI5C;;;;GAIG;AACH,SAAS,eAAe,CAChB,QAAgB,EAChB,QAAgB;IAEpB,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,iDAAiD;IACjD,KAAK,IAAI,CAAC,GAAC,CAAC,EAAE,CAAC,GAAC,QAAQ,GAAG,CAAC,GAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,KAAK,GAAW,EAAE,CAAC;QACzB,KAAK,IAAI,CAAC,GAAC,CAAC,EAAE,CAAC,GAAC,SAAS,GAAG,CAAC,GAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,KAAK,CAAC,IAAI,CAAC;gBACP,QAAQ,EAAE,EAAE;gBACZ,UAAU,EAAE,EAAE;gBACd,aAAa,EAAE,EAAE;aACpB,CAAC,CAAC;QACP,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC;AAGD,OAAO,EAAE,eAAe,EAAE,CAAA"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import { ROW_COUNT } from "../row-count";
|
|
2
|
-
import { circsCache } from "./calc-circs";
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
const { min, SQRT2 } = Math;
|
|
1
|
+
import { ROW_COUNT } from "../row-count.js";
|
|
2
|
+
import { circsCache } from "./calc-circs.js";
|
|
3
|
+
import { jumpIdx } from "./jump-idx.js";
|
|
4
|
+
const { min, max, SQRT2 } = Math;
|
|
6
5
|
function findCloseCells(grid, colCount, cellSize, maxDistance, padCount) {
|
|
7
6
|
const findCloseCellsFor_ = findCloseCellsFor(grid, colCount, cellSize, maxDistance, padCount);
|
|
8
7
|
let _minD = 0; // minimum for previous row, col 0
|
|
@@ -22,15 +21,17 @@ function findCloseCellsFor(grid, colCount, cellSize, maxDistance, padCount) {
|
|
|
22
21
|
// reduce current circle search range since we moved one square
|
|
23
22
|
let k = jumpIdx((_minD - SQRT2 * cellSize) / cellSize);
|
|
24
23
|
let minD = Number.POSITIVE_INFINITY;
|
|
25
|
-
while (
|
|
26
|
-
|
|
24
|
+
while (true) {
|
|
25
|
+
if (k >= circsCache.length) {
|
|
26
|
+
minD = cellSize * (circsCache[circsCache.length - 1].from - SQRT2);
|
|
27
|
+
break;
|
|
28
|
+
}
|
|
29
|
+
const { u, v, from } = circsCache[k];
|
|
27
30
|
// `SQRT2` to account for diagonal
|
|
28
31
|
if (cellSize * from > maxDistance + SQRT2 * cellSize) {
|
|
32
|
+
minD = cellSize * (from - 2 * SQRT2);
|
|
29
33
|
break;
|
|
30
34
|
}
|
|
31
|
-
// uncomment loop below to search all equidistant squares
|
|
32
|
-
// while (circsCache?.[k].from === from) {
|
|
33
|
-
const { u, v } = circsCache[k];
|
|
34
35
|
const u_ = u + i;
|
|
35
36
|
const v_ = v + j;
|
|
36
37
|
if (u_ < 0 || u_ >= colCount + 2 * padCount ||
|
|
@@ -39,29 +40,18 @@ function findCloseCellsFor(grid, colCount, cellSize, maxDistance, padCount) {
|
|
|
39
40
|
continue;
|
|
40
41
|
}
|
|
41
42
|
const { lineSegs } = grid[u_][v_];
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
const c = [(i - padCount + 0.5) * cellSize, (j - padCount + 0.5) * cellSize];
|
|
45
|
-
const d = distanceSegToP(lineSegs[l], c);
|
|
46
|
-
if (d < minD) {
|
|
47
|
-
minD = d;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
k++;
|
|
51
|
-
// }
|
|
52
|
-
if (minD !== Number.POSITIVE_INFINITY) {
|
|
43
|
+
if (lineSegs.length > 0) {
|
|
44
|
+
minD = cellSize * (from - SQRT2);
|
|
53
45
|
break;
|
|
54
46
|
}
|
|
55
|
-
|
|
56
|
-
if (minD === Number.POSITIVE_INFINITY) {
|
|
57
|
-
return min(maxDistance + SQRT2 * cellSize, cellSize * circsCache[circsCache.length - 1].from);
|
|
47
|
+
k++;
|
|
58
48
|
}
|
|
59
49
|
const { closeCells } = grid[i][j];
|
|
60
|
-
let l =
|
|
50
|
+
let l = max(0, k - 1);
|
|
61
51
|
while (l < circsCache.length) {
|
|
62
52
|
const { from, u, v } = circsCache[l];
|
|
63
|
-
// `SQRT2` to account for diagonal
|
|
64
|
-
if (cellSize * from > min(minD, maxDistance) + SQRT2 * cellSize) {
|
|
53
|
+
// `SQRT2` to account for diagonal (times 2 since we minused it off earlier)
|
|
54
|
+
if (cellSize * from > min(minD, maxDistance) + 2 * SQRT2 * cellSize) {
|
|
65
55
|
break;
|
|
66
56
|
}
|
|
67
57
|
const u_ = u + i;
|
|
@@ -81,50 +71,4 @@ function findCloseCellsFor(grid, colCount, cellSize, maxDistance, padCount) {
|
|
|
81
71
|
};
|
|
82
72
|
}
|
|
83
73
|
export { findCloseCells };
|
|
84
|
-
// Quokka tests
|
|
85
|
-
// const grid: Cell[][] = [
|
|
86
|
-
// [
|
|
87
|
-
// { u: 0, v: 0, lineSegs: [], closeCells: [], crossingCells: [] },
|
|
88
|
-
// { u: 0, v: 1, lineSegs: [], closeCells: [], crossingCells: [] },
|
|
89
|
-
// { u: 0, v: 2, lineSegs: [], closeCells: [], crossingCells: [] },
|
|
90
|
-
// { u: 0, v: 3, lineSegs: [], closeCells: [], crossingCells: [] }
|
|
91
|
-
// ],
|
|
92
|
-
// [
|
|
93
|
-
// { u: 1, v: 0, lineSegs: [], closeCells: [], crossingCells: [] },
|
|
94
|
-
// {
|
|
95
|
-
// u: 1, v: 1,
|
|
96
|
-
// lineSegs: [[[175, 163], [175, 355]]],
|
|
97
|
-
// closeCells: [], crossingCells: []
|
|
98
|
-
// },
|
|
99
|
-
// {
|
|
100
|
-
// u: 1, v: 2,
|
|
101
|
-
// lineSegs: [[[175, 355], [335, 355]]],
|
|
102
|
-
// closeCells: [], crossingCells: []
|
|
103
|
-
// },
|
|
104
|
-
// { u: 1, v: 3, lineSegs: [], closeCells: [], crossingCells: [] }
|
|
105
|
-
// ],
|
|
106
|
-
// [
|
|
107
|
-
// { u: 2, v: 0, lineSegs: [], closeCells: [], crossingCells: [] },
|
|
108
|
-
// {
|
|
109
|
-
// u: 2, v: 1,
|
|
110
|
-
// lineSegs: [[[335, 163], [175, 163]]],
|
|
111
|
-
// closeCells: [], crossingCells: []
|
|
112
|
-
// },
|
|
113
|
-
// {
|
|
114
|
-
// u: 2, v: 2,
|
|
115
|
-
// lineSegs: [[[335, 355], [335, 163]]],
|
|
116
|
-
// closeCells: [], crossingCells: []
|
|
117
|
-
// },
|
|
118
|
-
// { u: 2, v: 3, lineSegs: [], closeCells: [], crossingCells: [] }
|
|
119
|
-
// ],
|
|
120
|
-
// [
|
|
121
|
-
// { u: 3, v: 0, lineSegs: [], closeCells: [], crossingCells: [] },
|
|
122
|
-
// { u: 3, v: 1, lineSegs: [], closeCells: [], crossingCells: [] },
|
|
123
|
-
// { u: 3, v: 2, lineSegs: [], closeCells: [], crossingCells: [] },
|
|
124
|
-
// { u: 3, v: 3, lineSegs: [], closeCells: [], crossingCells: [] }
|
|
125
|
-
// ]
|
|
126
|
-
// ];
|
|
127
|
-
// findCloseCells(grid);
|
|
128
|
-
// const v = grid.map(cells => cells.map(c => ({ u: c.u, v: c.v, closeCells: c.closeCells })));
|
|
129
|
-
// v;//?
|
|
130
74
|
//# sourceMappingURL=find-close-cells.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"find-close-cells.js","sourceRoot":"","sources":["../../src/utils/find-close-cells.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"find-close-cells.js","sourceRoot":"","sources":["../../src/utils/find-close-cells.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
import { ROW_COUNT } from "../row-count";
|
|
2
|
-
// TODO - simplify?
|
|
3
|
-
// TODO - could be made much faster by also checking intersections here
|
|
4
|
-
// and passing the result to the next cell
|
|
1
|
+
import { ROW_COUNT } from "../row-count.js";
|
|
5
2
|
function findCrossingCells(grid, colCount, padCount) {
|
|
6
3
|
for (let i = padCount; i < colCount + padCount; i++) {
|
|
7
4
|
for (let j = padCount; j < ROW_COUNT + padCount; j++) {
|
|
@@ -16,16 +13,4 @@ function findCrossingCells(grid, colCount, padCount) {
|
|
|
16
13
|
}
|
|
17
14
|
}
|
|
18
15
|
export { findCrossingCells };
|
|
19
|
-
// Quokka tests
|
|
20
|
-
// import { createEmptyGrid } from "./create-empty-grid";
|
|
21
|
-
// // const g = createEmptyGrid(0);
|
|
22
|
-
// const g = createEmptyGrid(0);
|
|
23
|
-
// // g[0][0].lineSegs.push([[]]);
|
|
24
|
-
// g[2][0].lineSegs.push([[]]);
|
|
25
|
-
// g[2][2].lineSegs.push([[]]);
|
|
26
|
-
// findCrossingCells(g);
|
|
27
|
-
// let r = 2;
|
|
28
|
-
// // g.map(r => r.map(c => c.crossingCells))[r].map(v => v);//?
|
|
29
|
-
// g.map(r => r.map(c => c.crossingCells))[r].map(v => v.map(r => r[1]));//?
|
|
30
|
-
// g;//?
|
|
31
16
|
//# sourceMappingURL=find-crossing-cells.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"find-crossing-cells.js","sourceRoot":"","sources":["../../src/utils/find-crossing-cells.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"find-crossing-cells.js","sourceRoot":"","sources":["../../src/utils/find-crossing-cells.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,SAAS,iBAAiB,CAClB,IAAc,EACd,QAAgB,EAChB,QAAgB;IAEpB,KAAK,IAAI,CAAC,GAAC,QAAQ,EAAE,CAAC,GAAC,QAAQ,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,KAAK,IAAI,CAAC,GAAC,QAAQ,EAAE,CAAC,GAAC,SAAS,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/C,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;YAEpC,KAAK,IAAI,CAAC,GAAC,QAAQ,EAAE,CAAC,IAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC7B,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAAC,SAAS;gBAAC,CAAC;gBACnD,EAAE,CAAC,IAAI,CAAC,CAAC,SAAS,GAAG,CAAC,GAAC,QAAQ,CAAC,GAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC5C,CAAC;QACL,CAAC;IACL,CAAC;AACL,CAAC;AAGD,OAAO,EAAE,iBAAiB,EAAE,CAAA"}
|
package/node/utils/jump-idx.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { circsCache } from "./calc-circs";
|
|
2
|
-
const {
|
|
1
|
+
import { circsCache } from "./calc-circs.js";
|
|
2
|
+
const { max, E } = Math;
|
|
3
3
|
/**
|
|
4
4
|
* @param v
|
|
5
5
|
*/
|
|
@@ -8,10 +8,9 @@ function binarySearchRange(v) {
|
|
|
8
8
|
let max = circsCache.length - 1;
|
|
9
9
|
let mid = 0;
|
|
10
10
|
while (min <= max) {
|
|
11
|
-
mid = (min + max) >>> 1;
|
|
11
|
+
mid = (min + max) >>> 1;
|
|
12
12
|
const midVal = circsCache[mid].from;
|
|
13
13
|
if (midVal === v) {
|
|
14
|
-
// return [min,mid,max];
|
|
15
14
|
return mid;
|
|
16
15
|
}
|
|
17
16
|
else if (v > midVal) {
|
|
@@ -21,9 +20,19 @@ function binarySearchRange(v) {
|
|
|
21
20
|
max = mid - 1;
|
|
22
21
|
}
|
|
23
22
|
}
|
|
24
|
-
// return [min,mid,max];
|
|
25
23
|
return mid;
|
|
26
24
|
}
|
|
25
|
+
function jumpIdx(c) {
|
|
26
|
+
let idx = binarySearchRange(c);
|
|
27
|
+
c = max(0, c);
|
|
28
|
+
if (idx === 0) {
|
|
29
|
+
return 0;
|
|
30
|
+
}
|
|
31
|
+
while (circsCache[idx].from === circsCache[idx - 1].from) {
|
|
32
|
+
idx--;
|
|
33
|
+
}
|
|
34
|
+
return idx;
|
|
35
|
+
}
|
|
27
36
|
// const [Q,R] = [10.606601717798213, 35.531676008879735];
|
|
28
37
|
// const [A1,B1,F1] = [102.42126, 0.153169, -117.56077];
|
|
29
38
|
// const [A2,B2,C2,D2,F2] = [-0.000660087, 0.388148, 841.25744, -0.0529616, -1089.49916];
|
|
@@ -43,25 +52,18 @@ function binarySearchRange(v) {
|
|
|
43
52
|
// while (circsCache[idx + 1].from < c) { idx++; }
|
|
44
53
|
// return idx;
|
|
45
54
|
// }
|
|
46
|
-
function jumpIdx(c) {
|
|
47
|
-
let idx = binarySearchRange(c);
|
|
48
|
-
c = max(0, c);
|
|
49
|
-
while (idx !== 0 && circsCache[idx].from >= c) {
|
|
50
|
-
idx--;
|
|
51
|
-
}
|
|
52
|
-
while (idx < circsCache.length - 2 && circsCache[idx + 1].from < c) {
|
|
53
|
-
idx++;
|
|
54
|
-
}
|
|
55
|
-
return idx;
|
|
56
|
-
}
|
|
57
55
|
export { jumpIdx };
|
|
58
56
|
// Quokka tests
|
|
59
|
-
//
|
|
57
|
+
// circsCache.slice(0,10);//?
|
|
58
|
+
// circsCache.slice(0,30).map(c => c.from);//?
|
|
59
|
+
// circsCache[5].from;//?
|
|
60
60
|
// circsCache[12].from;//?
|
|
61
61
|
// circsCache[15].from;//?
|
|
62
62
|
// // circsCache.length;//?
|
|
63
|
-
//
|
|
64
|
-
//
|
|
63
|
+
// jumpIdxOld(1.5811388300841898);//?
|
|
64
|
+
// const v = (53.08771209782213 - Math.SQRT2*24.09375)/24.09375;//?
|
|
65
|
+
// jumpIdx(v);//?
|
|
66
|
+
// circsCache[8].from;//?
|
|
65
67
|
// binarySearchRange(1.5811388300841898);//?
|
|
66
68
|
// jumpIdxOld(3.7);//?
|
|
67
69
|
// jumpIdx(3.7);//?
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jump-idx.js","sourceRoot":"","sources":["../../src/utils/jump-idx.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"jump-idx.js","sourceRoot":"","sources":["../../src/utils/jump-idx.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC;AAGxB;;GAEG;AACH,SAAS,iBAAiB,CAClB,CAAS;IAEb,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,GAAG,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;IAEhC,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;QAChB,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;QACxB,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;QACpC,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;YACf,OAAO,GAAG,CAAC;QACf,CAAC;aAAM,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC;YACpB,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;QAClB,CAAC;aAAM,CAAC;YACJ,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;QAClB,CAAC;IACL,CAAC;IAED,OAAO,GAAG,CAAC;AACf,CAAC;AAGD,SAAS,OAAO,CACR,CAAS;IAEb,IAAI,GAAG,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAE/B,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACd,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC;QAAC,OAAO,CAAC,CAAC;IAAC,CAAC;IAE5B,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACvD,GAAG,EAAE,CAAC;IACV,CAAC;IAED,OAAO,GAAG,CAAC;AACf,CAAC;AAGD,0DAA0D;AAC1D,wDAAwD;AACxD,yFAAyF;AACzF,yFAAyF;AACzF,uBAAuB;AACvB,uBAAuB;AAEvB,uBAAuB;AACvB,kEAAkE;AAClE,4EAA4E;AAC5E,sBAAsB;AACtB,gCAAgC;AAChC,mBAAmB;AACnB,kDAAkD;AAClD,oDAAoD;AAEpD,qBAAqB;AACrB,kDAAkD;AAClD,sDAAsD;AAEtD,kBAAkB;AAClB,IAAI;AAGJ,OAAO,EAAE,OAAO,EAAE,CAAA;AAGlB,eAAe;AACf,6BAA6B;AAC7B,8CAA8C;AAC9C,yBAAyB;AACzB,0BAA0B;AAC1B,0BAA0B;AAC1B,2BAA2B;AAE3B,qCAAqC;AACrC,mEAAmE;AACnE,iBAAiB;AACjB,yBAAyB;AACzB,4CAA4C;AAG5C,sBAAsB;AACtB,mBAAmB;AACnB,gCAAgC;AAEhC,oBAAoB;AACpB,iBAAiB;AACjB,8BAA8B;AAE9B,uBAAuB;AACvB,oBAAoB;AACpB,iCAAiC;AAEjC,uBAAuB;AACvB,oBAAoB;AACpB,iCAAiC;AAEjC,wBAAwB;AACxB,qBAAqB;AACrB,4BAA4B"}
|
|
@@ -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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { GlContext } from "../types/gl-context";
|
|
1
|
+
import type { GlContext } from "../types/gl-context.js";
|
|
2
2
|
/**
|
|
3
3
|
* Returns a `GlContext` by reference via a cache of `WebGL2RenderingContext`s.
|
|
4
4
|
* * if `gl` doesn't exist in the cache yet a new context is created.
|
|
@@ -6,5 +6,5 @@ import type { GlContext } from "../types/gl-context";
|
|
|
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 {
|
|
39
|
+
export { getWebGlContext };
|
|
43
40
|
//# sourceMappingURL=get-gl-context.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-gl-context.js","sourceRoot":"","sources":["../../src/webgl-utils/get-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;
|
|
1
|
+
{"version":3,"file":"get-gl-context.js","sourceRoot":"","sources":["../../src/webgl-utils/get-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,6 +1,6 @@
|
|
|
1
|
-
import { Program } from "../types/program";
|
|
2
|
-
import { GLattrType } from "../types/gl-type";
|
|
3
|
-
import { GLusage } from "../types/gl-usage";
|
|
1
|
+
import { Program } from "../types/program.js";
|
|
2
|
+
import { GLattrType } from "../types/gl-type.js";
|
|
3
|
+
import { GLusage } from "../types/gl-usage.js";
|
|
4
4
|
/**
|
|
5
5
|
*
|
|
6
6
|
* @param name name used in glsl shaders
|
|
@@ -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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Program } from "../types/program";
|
|
2
|
-
import { UniformType } from "./uniform-type";
|
|
1
|
+
import { Program } from "../types/program.js";
|
|
2
|
+
import { UniformType } from "./uniform-type.js";
|
|
3
3
|
declare function setUniform(program: Program): (type: UniformType, name: string, ...values: any[]) => void;
|
|
4
4
|
export { setUniform };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { compileShader } from "./compile-shader";
|
|
1
|
+
import { compileShader } from "./compile-shader.js";
|
|
2
2
|
/**
|
|
3
3
|
* Initiates a WebGL2 program by:
|
|
4
4
|
*
|
|
@@ -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 };
|