three-text 0.4.11 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/LICENSE +5 -660
  2. package/LICENSE_THIRD_PARTY +15 -49
  3. package/README.md +265 -44
  4. package/dist/index.cjs +3424 -3450
  5. package/dist/index.d.ts +163 -9
  6. package/dist/index.js +3420 -3451
  7. package/dist/index.min.cjs +718 -676
  8. package/dist/index.min.js +721 -679
  9. package/dist/index.umd.js +3561 -3579
  10. package/dist/index.umd.min.js +803 -756
  11. package/dist/p5/index.cjs +2738 -5
  12. package/dist/p5/index.js +2738 -5
  13. package/dist/patterns/index.js +0 -4
  14. package/dist/slug/index.cjs +380 -0
  15. package/dist/slug/index.d.ts +62 -0
  16. package/dist/slug/index.js +374 -0
  17. package/dist/three/index.cjs +50 -35
  18. package/dist/three/index.js +50 -35
  19. package/dist/three/react.cjs +5 -2
  20. package/dist/three/react.d.ts +66 -120
  21. package/dist/three/react.js +6 -3
  22. package/dist/types/core/Text.d.ts +3 -10
  23. package/dist/types/core/cache/sharedCaches.d.ts +2 -1
  24. package/dist/types/core/shaping/DrawCallbacks.d.ts +11 -3
  25. package/dist/types/core/shaping/TextShaper.d.ts +1 -5
  26. package/dist/types/core/types.d.ts +84 -0
  27. package/dist/types/index.d.ts +7 -3
  28. package/dist/types/{core/cache → mesh}/GlyphContourCollector.d.ts +4 -4
  29. package/dist/types/{core/cache → mesh}/GlyphGeometryBuilder.d.ts +5 -5
  30. package/dist/types/mesh/MeshGeometryBuilder.d.ts +18 -0
  31. package/dist/types/{core → mesh}/geometry/BoundaryClusterer.d.ts +1 -1
  32. package/dist/types/{core → mesh}/geometry/Extruder.d.ts +1 -1
  33. package/dist/types/{core → mesh}/geometry/PathOptimizer.d.ts +1 -1
  34. package/dist/types/{core → mesh}/geometry/Polygonizer.d.ts +1 -1
  35. package/dist/types/{core → mesh}/geometry/Tessellator.d.ts +1 -1
  36. package/dist/types/react/utils.d.ts +2 -0
  37. package/dist/types/vector/GlyphOutlineCollector.d.ts +25 -0
  38. package/dist/types/vector/GlyphVectorGeometryBuilder.d.ts +26 -0
  39. package/dist/types/vector/LoopBlinnGeometry.d.ts +68 -0
  40. package/dist/types/vector/index.d.ts +29 -0
  41. package/dist/types/vector/loopBlinnTSL.d.ts +11 -0
  42. package/dist/types/vector/react.d.ts +24 -0
  43. package/dist/types/vector/webgl/index.d.ts +7 -0
  44. package/dist/types/vector/webgpu/index.d.ts +11 -0
  45. package/dist/vector/index.cjs +1458 -0
  46. package/dist/vector/index.d.ts +122 -0
  47. package/dist/vector/index.js +1434 -0
  48. package/dist/vector/react.cjs +153 -0
  49. package/dist/vector/react.d.ts +317 -0
  50. package/dist/vector/react.js +132 -0
  51. package/dist/vector/types/slug-lib/src/SlugPacker.d.ts +17 -0
  52. package/dist/vector/types/slug-lib/src/WebGL2Renderer.d.ts +21 -0
  53. package/dist/vector/types/slug-lib/src/WebGPURenderer.d.ts +16 -0
  54. package/dist/vector/types/slug-lib/src/index.d.ts +15 -0
  55. package/dist/vector/types/slug-lib/src/shaderStrings.d.ts +9 -0
  56. package/dist/vector/types/slug-lib/src/types.d.ts +34 -0
  57. package/dist/vector/types/src/core/types.d.ts +381 -0
  58. package/dist/vector/types/src/hyphenation/HyphenationPatternLoader.d.ts +2 -0
  59. package/dist/vector/types/src/hyphenation/index.d.ts +7 -0
  60. package/dist/vector/types/src/hyphenation/types.d.ts +6 -0
  61. package/dist/vector/types/src/utils/Cache.d.ts +14 -0
  62. package/dist/vector/types/src/utils/vectors.d.ts +75 -0
  63. package/dist/vector/types/src/vector/VectorDataBuilder.d.ts +30 -0
  64. package/dist/vector/types/src/vector/VectorThreeAdapter.d.ts +27 -0
  65. package/dist/vector/types/src/vector/index.d.ts +15 -0
  66. package/dist/vector/webgl/index.cjs +229 -0
  67. package/dist/vector/webgl/index.d.ts +53 -0
  68. package/dist/vector/webgl/index.js +227 -0
  69. package/dist/vector/webgpu/index.cjs +321 -0
  70. package/dist/vector/webgpu/index.d.ts +57 -0
  71. package/dist/vector/webgpu/index.js +319 -0
  72. package/dist/webgl-vector/index.cjs +243 -0
  73. package/dist/webgl-vector/index.d.ts +34 -0
  74. package/dist/webgl-vector/index.js +241 -0
  75. package/dist/webgpu-vector/index.cjs +336 -0
  76. package/dist/webgpu-vector/index.d.ts +38 -0
  77. package/dist/webgpu-vector/index.js +334 -0
  78. package/package.json +49 -4
  79. package/dist/patterns/cs.cjs +0 -14
  80. package/dist/patterns/cs.d.ts +0 -28
  81. package/dist/patterns/cs.js +0 -14
  82. package/dist/patterns/cs.umd.js +0 -14
  83. package/dist/patterns/id.cjs +0 -14
  84. package/dist/patterns/id.d.ts +0 -28
  85. package/dist/patterns/id.js +0 -14
  86. package/dist/patterns/id.umd.js +0 -14
  87. package/dist/patterns/mk.cjs +0 -14
  88. package/dist/patterns/mk.d.ts +0 -28
  89. package/dist/patterns/mk.js +0 -14
  90. package/dist/patterns/mk.umd.js +0 -14
  91. package/dist/patterns/sr-cyrl.cjs +0 -14
  92. package/dist/patterns/sr-cyrl.d.ts +0 -28
  93. package/dist/patterns/sr-cyrl.js +0 -14
  94. package/dist/patterns/sr-cyrl.umd.js +0 -14
@@ -0,0 +1,243 @@
1
+ 'use strict';
2
+
3
+ function assertCreate(value, label) {
4
+ if (!value) {
5
+ throw new Error(`Failed to create ${label}`);
6
+ }
7
+ return value;
8
+ }
9
+ function compileShader(gl, type, source) {
10
+ const shader = assertCreate(gl.createShader(type), 'shader');
11
+ gl.shaderSource(shader, source);
12
+ gl.compileShader(shader);
13
+ if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
14
+ const info = gl.getShaderInfoLog(shader) || 'unknown shader compile error';
15
+ gl.deleteShader(shader);
16
+ throw new Error(info);
17
+ }
18
+ return shader;
19
+ }
20
+ function linkProgram(gl, vertexSource, fragmentSource) {
21
+ const vertexShader = compileShader(gl, gl.VERTEX_SHADER, vertexSource);
22
+ const fragmentShader = compileShader(gl, gl.FRAGMENT_SHADER, fragmentSource);
23
+ const program = assertCreate(gl.createProgram(), 'program');
24
+ gl.attachShader(program, vertexShader);
25
+ gl.attachShader(program, fragmentShader);
26
+ gl.linkProgram(program);
27
+ gl.deleteShader(vertexShader);
28
+ gl.deleteShader(fragmentShader);
29
+ if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
30
+ const info = gl.getProgramInfoLog(program) || 'unknown program link error';
31
+ gl.deleteProgram(program);
32
+ throw new Error(info);
33
+ }
34
+ return program;
35
+ }
36
+ function getUniform(gl, program, name) {
37
+ const location = gl.getUniformLocation(program, name);
38
+ if (!location) {
39
+ throw new Error(`Missing uniform "${name}"`);
40
+ }
41
+ return location;
42
+ }
43
+ function createProgramWithMvp(gl, vertexSource, fragmentSource) {
44
+ const program = linkProgram(gl, vertexSource, fragmentSource);
45
+ return {
46
+ program,
47
+ mvp: getUniform(gl, program, 'u_mvp')
48
+ };
49
+ }
50
+ function createColorProgram(gl, vertexSource, fragmentSource) {
51
+ const program = linkProgram(gl, vertexSource, fragmentSource);
52
+ return {
53
+ program,
54
+ mvp: getUniform(gl, program, 'u_mvp'),
55
+ color: getUniform(gl, program, 'u_color')
56
+ };
57
+ }
58
+ function createGeometryResources(gl, data) {
59
+ const interiorVAO = assertCreate(gl.createVertexArray(), 'interior VAO');
60
+ const interiorPositionBuffer = assertCreate(gl.createBuffer(), 'interior position buffer');
61
+ const interiorIndexBuffer = assertCreate(gl.createBuffer(), 'interior index buffer');
62
+ gl.bindVertexArray(interiorVAO);
63
+ gl.bindBuffer(gl.ARRAY_BUFFER, interiorPositionBuffer);
64
+ gl.bufferData(gl.ARRAY_BUFFER, data.interiorPositions, gl.STATIC_DRAW);
65
+ gl.enableVertexAttribArray(0);
66
+ gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0);
67
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, interiorIndexBuffer);
68
+ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, data.interiorIndices, gl.STATIC_DRAW);
69
+ const curveVAO = assertCreate(gl.createVertexArray(), 'curve VAO');
70
+ const curvePositionBuffer = assertCreate(gl.createBuffer(), 'curve position buffer');
71
+ gl.bindVertexArray(curveVAO);
72
+ gl.bindBuffer(gl.ARRAY_BUFFER, curvePositionBuffer);
73
+ gl.bufferData(gl.ARRAY_BUFFER, data.curvePositions, gl.STATIC_DRAW);
74
+ gl.enableVertexAttribArray(0);
75
+ gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0);
76
+ const fillVAO = assertCreate(gl.createVertexArray(), 'fill VAO');
77
+ const fillPositionBuffer = assertCreate(gl.createBuffer(), 'fill position buffer');
78
+ const fillIndexBuffer = assertCreate(gl.createBuffer(), 'fill index buffer');
79
+ const fillPositions = new Float32Array([
80
+ data.planeBounds.min.x,
81
+ data.planeBounds.min.y,
82
+ 0,
83
+ data.planeBounds.max.x,
84
+ data.planeBounds.min.y,
85
+ 0,
86
+ data.planeBounds.max.x,
87
+ data.planeBounds.max.y,
88
+ 0,
89
+ data.planeBounds.min.x,
90
+ data.planeBounds.max.y,
91
+ 0
92
+ ]);
93
+ const fillIndices = new Uint16Array([0, 1, 2, 0, 2, 3]);
94
+ gl.bindVertexArray(fillVAO);
95
+ gl.bindBuffer(gl.ARRAY_BUFFER, fillPositionBuffer);
96
+ gl.bufferData(gl.ARRAY_BUFFER, fillPositions, gl.STATIC_DRAW);
97
+ gl.enableVertexAttribArray(0);
98
+ gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0);
99
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, fillIndexBuffer);
100
+ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, fillIndices, gl.STATIC_DRAW);
101
+ gl.bindVertexArray(null);
102
+ gl.bindBuffer(gl.ARRAY_BUFFER, null);
103
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);
104
+ return {
105
+ interiorVAO,
106
+ interiorPositionBuffer,
107
+ interiorIndexBuffer,
108
+ interiorIndexCount: data.interiorIndices.length,
109
+ curveVAO,
110
+ curvePositionBuffer,
111
+ curveVertexCount: data.curvePositions.length / 3,
112
+ fillVAO,
113
+ fillPositionBuffer,
114
+ fillIndexBuffer,
115
+ fillIndexCount: fillIndices.length
116
+ };
117
+ }
118
+ function destroyGeometryResources(gl, resources) {
119
+ gl.deleteVertexArray(resources.interiorVAO);
120
+ gl.deleteBuffer(resources.interiorPositionBuffer);
121
+ gl.deleteBuffer(resources.interiorIndexBuffer);
122
+ gl.deleteVertexArray(resources.curveVAO);
123
+ gl.deleteBuffer(resources.curvePositionBuffer);
124
+ gl.deleteVertexArray(resources.fillVAO);
125
+ gl.deleteBuffer(resources.fillPositionBuffer);
126
+ gl.deleteBuffer(resources.fillIndexBuffer);
127
+ }
128
+ function createWebGLVectorRenderer(gl) {
129
+ const interiorVertexShader = `#version 300 es
130
+ layout(location = 0) in vec3 a_position;
131
+ uniform mat4 u_mvp;
132
+ void main() {
133
+ gl_Position = u_mvp * vec4(a_position, 1.0);
134
+ }`;
135
+ const interiorFragmentShader = `#version 300 es
136
+ precision highp float;
137
+ out vec4 outColor;
138
+ void main() {
139
+ outColor = vec4(1.0);
140
+ }`;
141
+ const curveVertexShader = `#version 300 es
142
+ layout(location = 0) in vec3 a_position;
143
+ uniform mat4 u_mvp;
144
+ out vec2 v_uv;
145
+ void main() {
146
+ int localVertex = gl_VertexID % 3;
147
+ float u = float(localVertex) * 0.5;
148
+ v_uv = vec2(u, floor(u));
149
+ gl_Position = u_mvp * vec4(a_position, 1.0);
150
+ }`;
151
+ const curveFragmentShader = `#version 300 es
152
+ precision highp float;
153
+ in vec2 v_uv;
154
+ out vec4 outColor;
155
+ void main() {
156
+ vec2 px = dFdx(v_uv);
157
+ vec2 py = dFdy(v_uv);
158
+ float fx = 2.0 * v_uv.x * px.x - px.y;
159
+ float fy = 2.0 * v_uv.x * py.x - py.y;
160
+ float denom = sqrt(fx * fx + fy * fy);
161
+ if (denom < 1e-6) {
162
+ discard;
163
+ }
164
+ float sd = (v_uv.x * v_uv.x - v_uv.y) / denom;
165
+ float alpha = clamp(0.5 - sd, 0.0, 1.0);
166
+ if (alpha <= 0.0) {
167
+ discard;
168
+ }
169
+ outColor = vec4(1.0, 1.0, 1.0, alpha);
170
+ }`;
171
+ const colorVertexShader = interiorVertexShader;
172
+ const colorFragmentShader = `#version 300 es
173
+ precision highp float;
174
+ uniform vec4 u_color;
175
+ out vec4 outColor;
176
+ void main() {
177
+ outColor = u_color;
178
+ }`;
179
+ const interiorProgram = createProgramWithMvp(gl, interiorVertexShader, interiorFragmentShader);
180
+ const curveProgram = createProgramWithMvp(gl, curveVertexShader, curveFragmentShader);
181
+ const colorProgram = createColorProgram(gl, colorVertexShader, colorFragmentShader);
182
+ let geometryResources = null;
183
+ return {
184
+ setGeometry(data) {
185
+ if (geometryResources) {
186
+ destroyGeometryResources(gl, geometryResources);
187
+ }
188
+ geometryResources = createGeometryResources(gl, data);
189
+ },
190
+ render(mvp, color) {
191
+ if (!geometryResources) {
192
+ return;
193
+ }
194
+ gl.disable(gl.CULL_FACE);
195
+ gl.disable(gl.DEPTH_TEST);
196
+ gl.depthMask(false);
197
+ gl.clearStencil(0);
198
+ gl.stencilMask(0xff);
199
+ gl.clear(gl.STENCIL_BUFFER_BIT);
200
+ gl.enable(gl.STENCIL_TEST);
201
+ gl.stencilFunc(gl.ALWAYS, 0, 0xff);
202
+ gl.stencilOp(gl.KEEP, gl.KEEP, gl.INVERT);
203
+ gl.colorMask(false, false, false, false);
204
+ if (geometryResources.interiorIndexCount > 0) {
205
+ gl.useProgram(interiorProgram.program);
206
+ gl.uniformMatrix4fv(interiorProgram.mvp, false, mvp);
207
+ gl.bindVertexArray(geometryResources.interiorVAO);
208
+ gl.drawElements(gl.TRIANGLES, geometryResources.interiorIndexCount, gl.UNSIGNED_INT, 0);
209
+ }
210
+ if (geometryResources.curveVertexCount > 0) {
211
+ gl.enable(gl.SAMPLE_ALPHA_TO_COVERAGE);
212
+ gl.useProgram(curveProgram.program);
213
+ gl.uniformMatrix4fv(curveProgram.mvp, false, mvp);
214
+ gl.bindVertexArray(geometryResources.curveVAO);
215
+ gl.drawArrays(gl.TRIANGLES, 0, geometryResources.curveVertexCount);
216
+ gl.disable(gl.SAMPLE_ALPHA_TO_COVERAGE);
217
+ }
218
+ gl.stencilFunc(gl.NOTEQUAL, 0, 0xff);
219
+ gl.stencilOp(gl.KEEP, gl.KEEP, gl.ZERO);
220
+ gl.colorMask(true, true, true, true);
221
+ gl.useProgram(colorProgram.program);
222
+ gl.uniformMatrix4fv(colorProgram.mvp, false, mvp);
223
+ gl.uniform4fv(colorProgram.color, color);
224
+ gl.bindVertexArray(geometryResources.fillVAO);
225
+ gl.drawElements(gl.TRIANGLES, geometryResources.fillIndexCount, gl.UNSIGNED_SHORT, 0);
226
+ gl.bindVertexArray(null);
227
+ gl.useProgram(null);
228
+ gl.disable(gl.STENCIL_TEST);
229
+ gl.depthMask(true);
230
+ },
231
+ dispose() {
232
+ if (geometryResources) {
233
+ destroyGeometryResources(gl, geometryResources);
234
+ geometryResources = null;
235
+ }
236
+ gl.deleteProgram(interiorProgram.program);
237
+ gl.deleteProgram(curveProgram.program);
238
+ gl.deleteProgram(colorProgram.program);
239
+ }
240
+ };
241
+ }
242
+
243
+ exports.createWebGLVectorRenderer = createWebGLVectorRenderer;
@@ -0,0 +1,34 @@
1
+ interface BoundingBox {
2
+ min: {
3
+ x: number;
4
+ y: number;
5
+ z: number;
6
+ };
7
+ max: {
8
+ x: number;
9
+ y: number;
10
+ z: number;
11
+ };
12
+ }
13
+
14
+ interface LoopBlinnMeshData {
15
+ interiorPositions: Float32Array;
16
+ interiorIndices: Uint32Array;
17
+ curvePositions: Float32Array;
18
+ planeBounds: BoundingBox;
19
+ stats: {
20
+ glyphCount: number;
21
+ contourCount: number;
22
+ interiorTriangleCount: number;
23
+ curveTriangleCount: number;
24
+ };
25
+ }
26
+
27
+ interface WebGLVectorRenderer {
28
+ setGeometry(data: LoopBlinnMeshData): void;
29
+ render(mvp: Float32Array, color: Float32Array): void;
30
+ dispose(): void;
31
+ }
32
+ declare function createWebGLVectorRenderer(gl: WebGL2RenderingContext): WebGLVectorRenderer;
33
+
34
+ export { WebGLVectorRenderer, createWebGLVectorRenderer };
@@ -0,0 +1,241 @@
1
+ function assertCreate(value, label) {
2
+ if (!value) {
3
+ throw new Error(`Failed to create ${label}`);
4
+ }
5
+ return value;
6
+ }
7
+ function compileShader(gl, type, source) {
8
+ const shader = assertCreate(gl.createShader(type), 'shader');
9
+ gl.shaderSource(shader, source);
10
+ gl.compileShader(shader);
11
+ if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
12
+ const info = gl.getShaderInfoLog(shader) || 'unknown shader compile error';
13
+ gl.deleteShader(shader);
14
+ throw new Error(info);
15
+ }
16
+ return shader;
17
+ }
18
+ function linkProgram(gl, vertexSource, fragmentSource) {
19
+ const vertexShader = compileShader(gl, gl.VERTEX_SHADER, vertexSource);
20
+ const fragmentShader = compileShader(gl, gl.FRAGMENT_SHADER, fragmentSource);
21
+ const program = assertCreate(gl.createProgram(), 'program');
22
+ gl.attachShader(program, vertexShader);
23
+ gl.attachShader(program, fragmentShader);
24
+ gl.linkProgram(program);
25
+ gl.deleteShader(vertexShader);
26
+ gl.deleteShader(fragmentShader);
27
+ if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
28
+ const info = gl.getProgramInfoLog(program) || 'unknown program link error';
29
+ gl.deleteProgram(program);
30
+ throw new Error(info);
31
+ }
32
+ return program;
33
+ }
34
+ function getUniform(gl, program, name) {
35
+ const location = gl.getUniformLocation(program, name);
36
+ if (!location) {
37
+ throw new Error(`Missing uniform "${name}"`);
38
+ }
39
+ return location;
40
+ }
41
+ function createProgramWithMvp(gl, vertexSource, fragmentSource) {
42
+ const program = linkProgram(gl, vertexSource, fragmentSource);
43
+ return {
44
+ program,
45
+ mvp: getUniform(gl, program, 'u_mvp')
46
+ };
47
+ }
48
+ function createColorProgram(gl, vertexSource, fragmentSource) {
49
+ const program = linkProgram(gl, vertexSource, fragmentSource);
50
+ return {
51
+ program,
52
+ mvp: getUniform(gl, program, 'u_mvp'),
53
+ color: getUniform(gl, program, 'u_color')
54
+ };
55
+ }
56
+ function createGeometryResources(gl, data) {
57
+ const interiorVAO = assertCreate(gl.createVertexArray(), 'interior VAO');
58
+ const interiorPositionBuffer = assertCreate(gl.createBuffer(), 'interior position buffer');
59
+ const interiorIndexBuffer = assertCreate(gl.createBuffer(), 'interior index buffer');
60
+ gl.bindVertexArray(interiorVAO);
61
+ gl.bindBuffer(gl.ARRAY_BUFFER, interiorPositionBuffer);
62
+ gl.bufferData(gl.ARRAY_BUFFER, data.interiorPositions, gl.STATIC_DRAW);
63
+ gl.enableVertexAttribArray(0);
64
+ gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0);
65
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, interiorIndexBuffer);
66
+ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, data.interiorIndices, gl.STATIC_DRAW);
67
+ const curveVAO = assertCreate(gl.createVertexArray(), 'curve VAO');
68
+ const curvePositionBuffer = assertCreate(gl.createBuffer(), 'curve position buffer');
69
+ gl.bindVertexArray(curveVAO);
70
+ gl.bindBuffer(gl.ARRAY_BUFFER, curvePositionBuffer);
71
+ gl.bufferData(gl.ARRAY_BUFFER, data.curvePositions, gl.STATIC_DRAW);
72
+ gl.enableVertexAttribArray(0);
73
+ gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0);
74
+ const fillVAO = assertCreate(gl.createVertexArray(), 'fill VAO');
75
+ const fillPositionBuffer = assertCreate(gl.createBuffer(), 'fill position buffer');
76
+ const fillIndexBuffer = assertCreate(gl.createBuffer(), 'fill index buffer');
77
+ const fillPositions = new Float32Array([
78
+ data.planeBounds.min.x,
79
+ data.planeBounds.min.y,
80
+ 0,
81
+ data.planeBounds.max.x,
82
+ data.planeBounds.min.y,
83
+ 0,
84
+ data.planeBounds.max.x,
85
+ data.planeBounds.max.y,
86
+ 0,
87
+ data.planeBounds.min.x,
88
+ data.planeBounds.max.y,
89
+ 0
90
+ ]);
91
+ const fillIndices = new Uint16Array([0, 1, 2, 0, 2, 3]);
92
+ gl.bindVertexArray(fillVAO);
93
+ gl.bindBuffer(gl.ARRAY_BUFFER, fillPositionBuffer);
94
+ gl.bufferData(gl.ARRAY_BUFFER, fillPositions, gl.STATIC_DRAW);
95
+ gl.enableVertexAttribArray(0);
96
+ gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0);
97
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, fillIndexBuffer);
98
+ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, fillIndices, gl.STATIC_DRAW);
99
+ gl.bindVertexArray(null);
100
+ gl.bindBuffer(gl.ARRAY_BUFFER, null);
101
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);
102
+ return {
103
+ interiorVAO,
104
+ interiorPositionBuffer,
105
+ interiorIndexBuffer,
106
+ interiorIndexCount: data.interiorIndices.length,
107
+ curveVAO,
108
+ curvePositionBuffer,
109
+ curveVertexCount: data.curvePositions.length / 3,
110
+ fillVAO,
111
+ fillPositionBuffer,
112
+ fillIndexBuffer,
113
+ fillIndexCount: fillIndices.length
114
+ };
115
+ }
116
+ function destroyGeometryResources(gl, resources) {
117
+ gl.deleteVertexArray(resources.interiorVAO);
118
+ gl.deleteBuffer(resources.interiorPositionBuffer);
119
+ gl.deleteBuffer(resources.interiorIndexBuffer);
120
+ gl.deleteVertexArray(resources.curveVAO);
121
+ gl.deleteBuffer(resources.curvePositionBuffer);
122
+ gl.deleteVertexArray(resources.fillVAO);
123
+ gl.deleteBuffer(resources.fillPositionBuffer);
124
+ gl.deleteBuffer(resources.fillIndexBuffer);
125
+ }
126
+ function createWebGLVectorRenderer(gl) {
127
+ const interiorVertexShader = `#version 300 es
128
+ layout(location = 0) in vec3 a_position;
129
+ uniform mat4 u_mvp;
130
+ void main() {
131
+ gl_Position = u_mvp * vec4(a_position, 1.0);
132
+ }`;
133
+ const interiorFragmentShader = `#version 300 es
134
+ precision highp float;
135
+ out vec4 outColor;
136
+ void main() {
137
+ outColor = vec4(1.0);
138
+ }`;
139
+ const curveVertexShader = `#version 300 es
140
+ layout(location = 0) in vec3 a_position;
141
+ uniform mat4 u_mvp;
142
+ out vec2 v_uv;
143
+ void main() {
144
+ int localVertex = gl_VertexID % 3;
145
+ float u = float(localVertex) * 0.5;
146
+ v_uv = vec2(u, floor(u));
147
+ gl_Position = u_mvp * vec4(a_position, 1.0);
148
+ }`;
149
+ const curveFragmentShader = `#version 300 es
150
+ precision highp float;
151
+ in vec2 v_uv;
152
+ out vec4 outColor;
153
+ void main() {
154
+ vec2 px = dFdx(v_uv);
155
+ vec2 py = dFdy(v_uv);
156
+ float fx = 2.0 * v_uv.x * px.x - px.y;
157
+ float fy = 2.0 * v_uv.x * py.x - py.y;
158
+ float denom = sqrt(fx * fx + fy * fy);
159
+ if (denom < 1e-6) {
160
+ discard;
161
+ }
162
+ float sd = (v_uv.x * v_uv.x - v_uv.y) / denom;
163
+ float alpha = clamp(0.5 - sd, 0.0, 1.0);
164
+ if (alpha <= 0.0) {
165
+ discard;
166
+ }
167
+ outColor = vec4(1.0, 1.0, 1.0, alpha);
168
+ }`;
169
+ const colorVertexShader = interiorVertexShader;
170
+ const colorFragmentShader = `#version 300 es
171
+ precision highp float;
172
+ uniform vec4 u_color;
173
+ out vec4 outColor;
174
+ void main() {
175
+ outColor = u_color;
176
+ }`;
177
+ const interiorProgram = createProgramWithMvp(gl, interiorVertexShader, interiorFragmentShader);
178
+ const curveProgram = createProgramWithMvp(gl, curveVertexShader, curveFragmentShader);
179
+ const colorProgram = createColorProgram(gl, colorVertexShader, colorFragmentShader);
180
+ let geometryResources = null;
181
+ return {
182
+ setGeometry(data) {
183
+ if (geometryResources) {
184
+ destroyGeometryResources(gl, geometryResources);
185
+ }
186
+ geometryResources = createGeometryResources(gl, data);
187
+ },
188
+ render(mvp, color) {
189
+ if (!geometryResources) {
190
+ return;
191
+ }
192
+ gl.disable(gl.CULL_FACE);
193
+ gl.disable(gl.DEPTH_TEST);
194
+ gl.depthMask(false);
195
+ gl.clearStencil(0);
196
+ gl.stencilMask(0xff);
197
+ gl.clear(gl.STENCIL_BUFFER_BIT);
198
+ gl.enable(gl.STENCIL_TEST);
199
+ gl.stencilFunc(gl.ALWAYS, 0, 0xff);
200
+ gl.stencilOp(gl.KEEP, gl.KEEP, gl.INVERT);
201
+ gl.colorMask(false, false, false, false);
202
+ if (geometryResources.interiorIndexCount > 0) {
203
+ gl.useProgram(interiorProgram.program);
204
+ gl.uniformMatrix4fv(interiorProgram.mvp, false, mvp);
205
+ gl.bindVertexArray(geometryResources.interiorVAO);
206
+ gl.drawElements(gl.TRIANGLES, geometryResources.interiorIndexCount, gl.UNSIGNED_INT, 0);
207
+ }
208
+ if (geometryResources.curveVertexCount > 0) {
209
+ gl.enable(gl.SAMPLE_ALPHA_TO_COVERAGE);
210
+ gl.useProgram(curveProgram.program);
211
+ gl.uniformMatrix4fv(curveProgram.mvp, false, mvp);
212
+ gl.bindVertexArray(geometryResources.curveVAO);
213
+ gl.drawArrays(gl.TRIANGLES, 0, geometryResources.curveVertexCount);
214
+ gl.disable(gl.SAMPLE_ALPHA_TO_COVERAGE);
215
+ }
216
+ gl.stencilFunc(gl.NOTEQUAL, 0, 0xff);
217
+ gl.stencilOp(gl.KEEP, gl.KEEP, gl.ZERO);
218
+ gl.colorMask(true, true, true, true);
219
+ gl.useProgram(colorProgram.program);
220
+ gl.uniformMatrix4fv(colorProgram.mvp, false, mvp);
221
+ gl.uniform4fv(colorProgram.color, color);
222
+ gl.bindVertexArray(geometryResources.fillVAO);
223
+ gl.drawElements(gl.TRIANGLES, geometryResources.fillIndexCount, gl.UNSIGNED_SHORT, 0);
224
+ gl.bindVertexArray(null);
225
+ gl.useProgram(null);
226
+ gl.disable(gl.STENCIL_TEST);
227
+ gl.depthMask(true);
228
+ },
229
+ dispose() {
230
+ if (geometryResources) {
231
+ destroyGeometryResources(gl, geometryResources);
232
+ geometryResources = null;
233
+ }
234
+ gl.deleteProgram(interiorProgram.program);
235
+ gl.deleteProgram(curveProgram.program);
236
+ gl.deleteProgram(colorProgram.program);
237
+ }
238
+ };
239
+ }
240
+
241
+ export { createWebGLVectorRenderer };