@lightningjs/renderer 0.4.1 → 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.
- package/README.md +13 -13
- package/dist/exports/utils.d.ts +1 -1
- package/dist/exports/utils.js +1 -1
- package/dist/exports/utils.js.map +1 -1
- package/dist/src/common/CommonTypes.d.ts +32 -12
- package/dist/src/core/CoreNode.d.ts +14 -18
- package/dist/src/core/CoreNode.js +90 -124
- package/dist/src/core/CoreNode.js.map +1 -1
- package/dist/src/core/CoreTextNode.d.ts +0 -2
- package/dist/src/core/CoreTextNode.js +39 -17
- package/dist/src/core/CoreTextNode.js.map +1 -1
- package/dist/src/core/Stage.js +11 -8
- package/dist/src/core/Stage.js.map +1 -1
- package/dist/src/core/lib/Matrix3d.d.ts +59 -0
- package/dist/src/core/lib/Matrix3d.js +253 -0
- package/dist/src/core/lib/Matrix3d.js.map +1 -0
- package/dist/src/core/lib/utils.d.ts +1 -0
- package/dist/src/core/lib/utils.js +3 -0
- package/dist/src/core/lib/utils.js.map +1 -1
- package/dist/src/core/renderers/CoreRenderer.d.ts +2 -4
- package/dist/src/core/renderers/CoreRenderer.js.map +1 -1
- package/dist/src/core/renderers/webgl/WebGlCoreRenderer.d.ts +1 -1
- package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js +16 -16
- package/dist/src/core/renderers/webgl/WebGlCoreRenderer.js.map +1 -1
- package/dist/src/core/renderers/webgl/WebGlCoreShader.d.ts +1 -1
- package/dist/src/core/renderers/webgl/WebGlCoreShader.js +2 -2
- package/dist/src/core/renderers/webgl/WebGlCoreShader.js.map +1 -1
- package/dist/src/core/renderers/webgl/shaders/SdfShader.d.ts +2 -1
- package/dist/src/core/renderers/webgl/shaders/SdfShader.js +15 -6
- package/dist/src/core/renderers/webgl/shaders/SdfShader.js.map +1 -1
- package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.d.ts +2 -1
- package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js +27 -30
- package/dist/src/core/text-rendering/renderers/CanvasTextRenderer.js.map +1 -1
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.d.ts +2 -1
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js +7 -9
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.js.map +1 -1
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js +0 -1
- package/dist/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.js.map +1 -1
- package/dist/src/core/text-rendering/renderers/TextRenderer.d.ts +24 -2
- package/dist/src/core/text-rendering/renderers/TextRenderer.js +6 -3
- package/dist/src/core/text-rendering/renderers/TextRenderer.js.map +1 -1
- package/dist/src/core/textures/SubTexture.js +1 -1
- package/dist/src/core/textures/SubTexture.js.map +1 -1
- package/dist/src/core/textures/Texture.d.ts +13 -1
- package/dist/src/core/textures/Texture.js.map +1 -1
- package/dist/src/main-api/INode.d.ts +30 -5
- package/dist/src/main-api/RendererMain.js +3 -1
- package/dist/src/main-api/RendererMain.js.map +1 -1
- package/dist/src/render-drivers/main/MainOnlyNode.d.ts +6 -4
- package/dist/src/render-drivers/main/MainOnlyNode.js +31 -16
- package/dist/src/render-drivers/main/MainOnlyNode.js.map +1 -1
- package/dist/src/render-drivers/main/MainOnlyTextNode.d.ts +0 -2
- package/dist/src/render-drivers/main/MainOnlyTextNode.js +3 -10
- package/dist/src/render-drivers/main/MainOnlyTextNode.js.map +1 -1
- package/dist/src/render-drivers/threadx/NodeStruct.d.ts +6 -3
- package/dist/src/render-drivers/threadx/NodeStruct.js +12 -3
- package/dist/src/render-drivers/threadx/NodeStruct.js.map +1 -1
- package/dist/src/render-drivers/threadx/SharedNode.d.ts +2 -1
- package/dist/src/render-drivers/threadx/SharedNode.js +2 -1
- package/dist/src/render-drivers/threadx/SharedNode.js.map +1 -1
- package/dist/src/render-drivers/threadx/ThreadXMainNode.d.ts +2 -0
- package/dist/src/render-drivers/threadx/ThreadXMainNode.js +14 -0
- package/dist/src/render-drivers/threadx/ThreadXMainNode.js.map +1 -1
- package/dist/src/render-drivers/threadx/ThreadXRenderDriver.js +4 -2
- package/dist/src/render-drivers/threadx/ThreadXRenderDriver.js.map +1 -1
- package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.js +6 -5
- package/dist/src/render-drivers/threadx/worker/ThreadXRendererNode.js.map +1 -1
- package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js +2 -7
- package/dist/src/render-drivers/threadx/worker/ThreadXRendererTextNode.js.map +1 -1
- package/dist/src/render-drivers/threadx/worker/renderer.js +2 -1
- package/dist/src/render-drivers/threadx/worker/renderer.js.map +1 -1
- package/dist/src/utils.d.ts +7 -12
- package/dist/src/utils.js +9 -25
- package/dist/src/utils.js.map +1 -1
- package/dist/tsconfig.dist.tsbuildinfo +1 -1
- package/exports/utils.ts +1 -1
- package/package.json +22 -19
- package/src/common/CommonTypes.ts +42 -16
- package/src/core/CoreNode.ts +120 -158
- package/src/core/CoreTextNode.ts +54 -24
- package/src/core/Stage.ts +16 -11
- package/src/core/lib/Matrix3d.ts +290 -0
- package/src/core/lib/utils.ts +4 -0
- package/src/core/renderers/CoreRenderer.ts +2 -4
- package/src/core/renderers/webgl/WebGlCoreRenderer.ts +18 -21
- package/src/core/renderers/webgl/WebGlCoreShader.ts +2 -2
- package/src/core/renderers/webgl/shaders/SdfShader.ts +17 -8
- package/src/core/text-rendering/renderers/CanvasTextRenderer.ts +30 -28
- package/src/core/text-rendering/renderers/SdfTextRenderer/SdfTextRenderer.ts +9 -20
- package/src/core/text-rendering/renderers/SdfTextRenderer/internal/layoutText.ts +0 -1
- package/src/core/text-rendering/renderers/TextRenderer.ts +37 -5
- package/src/core/textures/SubTexture.ts +6 -5
- package/src/core/textures/Texture.ts +19 -6
- package/src/main-api/INode.ts +32 -5
- package/src/main-api/RendererMain.ts +3 -1
- package/src/render-drivers/main/MainOnlyNode.ts +39 -22
- package/src/render-drivers/main/MainOnlyTextNode.ts +2 -15
- package/src/render-drivers/threadx/NodeStruct.ts +13 -3
- package/src/render-drivers/threadx/SharedNode.ts +4 -2
- package/src/render-drivers/threadx/ThreadXMainNode.ts +16 -0
- package/src/render-drivers/threadx/ThreadXRenderDriver.ts +4 -2
- package/src/render-drivers/threadx/worker/ThreadXRendererNode.ts +18 -8
- package/src/render-drivers/threadx/worker/ThreadXRendererTextNode.ts +2 -14
- package/src/render-drivers/threadx/worker/renderer.ts +2 -1
- package/src/utils.ts +10 -27
- package/dist/src/core/Matrix2DContext.d.ts +0 -15
- package/dist/src/core/Matrix2DContext.js +0 -45
- package/dist/src/core/Matrix2DContext.js.map +0 -1
- package/dist/src/core/lib/glm/common.d.ts +0 -162
- package/dist/src/core/lib/glm/common.js +0 -81
- package/dist/src/core/lib/glm/common.js.map +0 -1
- package/dist/src/core/lib/glm/index.d.ts +0 -11
- package/dist/src/core/lib/glm/index.js +0 -30
- package/dist/src/core/lib/glm/index.js.map +0 -1
- package/dist/src/core/lib/glm/mat2.d.ts +0 -219
- package/dist/src/core/lib/glm/mat2.js +0 -396
- package/dist/src/core/lib/glm/mat2.js.map +0 -1
- package/dist/src/core/lib/glm/mat2d.d.ts +0 -237
- package/dist/src/core/lib/glm/mat2d.js +0 -442
- package/dist/src/core/lib/glm/mat2d.js.map +0 -1
- package/dist/src/core/lib/glm/mat3.d.ts +0 -283
- package/dist/src/core/lib/glm/mat3.js +0 -680
- package/dist/src/core/lib/glm/mat3.js.map +0 -1
- package/dist/src/core/lib/glm/mat4.d.ts +0 -550
- package/dist/src/core/lib/glm/mat4.js +0 -1802
- package/dist/src/core/lib/glm/mat4.js.map +0 -1
- package/dist/src/core/lib/glm/quat.d.ts +0 -363
- package/dist/src/core/lib/glm/quat.js +0 -693
- package/dist/src/core/lib/glm/quat.js.map +0 -1
- package/dist/src/core/lib/glm/quat2.d.ts +0 -356
- package/dist/src/core/lib/glm/quat2.js +0 -754
- package/dist/src/core/lib/glm/quat2.js.map +0 -1
- package/dist/src/core/lib/glm/vec2.d.ts +0 -365
- package/dist/src/core/lib/glm/vec2.js +0 -569
- package/dist/src/core/lib/glm/vec2.js.map +0 -1
- package/dist/src/core/lib/glm/vec3.d.ts +0 -406
- package/dist/src/core/lib/glm/vec3.js +0 -720
- package/dist/src/core/lib/glm/vec3.js.map +0 -1
- package/dist/src/core/lib/glm/vec4.d.ts +0 -330
- package/dist/src/core/lib/glm/vec4.js +0 -608
- package/dist/src/core/lib/glm/vec4.js.map +0 -1
- package/dist/src/core/textures/utils.d.ts +0 -11
- package/dist/src/core/textures/utils.js +0 -32
- package/dist/src/core/textures/utils.js.map +0 -1
- package/dist/src/main-api/TextureRegistry.d.ts +0 -33
- package/dist/src/main-api/TextureRegistry.js +0 -97
- package/dist/src/main-api/TextureRegistry.js.map +0 -1
- package/dist/src/main-api/TextureUsageRegistry/TextureRegistry.d.ts +0 -33
- package/dist/src/main-api/TextureUsageRegistry/TextureRegistry.js +0 -97
- package/dist/src/main-api/TextureUsageRegistry/TextureRegistry.js.map +0 -1
- package/src/core/Matrix2DContext.ts +0 -52
- package/src/core/lib/glm/common.ts +0 -231
- package/src/core/lib/glm/index.ts +0 -31
- package/src/core/lib/glm/mat2.ts +0 -499
- package/src/core/lib/glm/mat2d.ts +0 -547
- package/src/core/lib/glm/mat3.ts +0 -849
- package/src/core/lib/glm/mat4.ts +0 -2169
- package/src/core/lib/glm/quat.ts +0 -828
- package/src/core/lib/glm/quat2.ts +0 -951
- package/src/core/lib/glm/vec2.ts +0 -671
- package/src/core/lib/glm/vec3.ts +0 -859
- package/src/core/lib/glm/vec4.ts +0 -708
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-non-null-assertion */
|
|
2
|
+
|
|
3
|
+
// Matrix3d is a 3x3 matrix in column-major order because that's how WebGL likes it.
|
|
4
|
+
// The matrix is stored in a Float32Array in the following order:
|
|
5
|
+
// | 0 3 6 |
|
|
6
|
+
// | 1 4 7 |
|
|
7
|
+
// | 2 5 8 |
|
|
8
|
+
// The following constants are used to index into the array in a row-major way.
|
|
9
|
+
const m0 = 0;
|
|
10
|
+
const m1 = 3;
|
|
11
|
+
const m2 = 6;
|
|
12
|
+
const m3 = 1;
|
|
13
|
+
const m4 = 4;
|
|
14
|
+
const m5 = 7;
|
|
15
|
+
const m6 = 2;
|
|
16
|
+
const m7 = 5;
|
|
17
|
+
const m8 = 8;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* A 3x3 matrix representing a 2D transformation.
|
|
21
|
+
*
|
|
22
|
+
* @remarks
|
|
23
|
+
* The matrix is stored in column-major order in the `data` property which can
|
|
24
|
+
* be passed directly to a WebGL shader uniform.
|
|
25
|
+
*
|
|
26
|
+
* The matrix is stored in a Float32Array in the following index order:
|
|
27
|
+
* | 0 3 6 |
|
|
28
|
+
* | 1 4 7 |
|
|
29
|
+
* | 2 5 8 |
|
|
30
|
+
*
|
|
31
|
+
* Only the first two rows are really used for the transformation. The last row is
|
|
32
|
+
* generally always `[0, 0, 1]` if you only use the 2D transformation methods
|
|
33
|
+
* provided by this class.
|
|
34
|
+
*
|
|
35
|
+
* For convenience, entries in the first two rows can be accessed by the following
|
|
36
|
+
* getter properties:
|
|
37
|
+
* | ta tb tx |
|
|
38
|
+
* | tc td ty |
|
|
39
|
+
* | 0 0 1 |
|
|
40
|
+
*/
|
|
41
|
+
export class Matrix3d {
|
|
42
|
+
public data: Float32Array;
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Creates a new 3x3 matrix.
|
|
46
|
+
*
|
|
47
|
+
* @param entries Row-major 3x3 matrix
|
|
48
|
+
*/
|
|
49
|
+
public constructor(
|
|
50
|
+
entries?:
|
|
51
|
+
| [number, number, number, number, number, number, number, number, number]
|
|
52
|
+
| Float32Array,
|
|
53
|
+
) {
|
|
54
|
+
if (entries) {
|
|
55
|
+
// Transpose the input matrix so that it's in column-major order.
|
|
56
|
+
this.data = new Float32Array(9);
|
|
57
|
+
this.data[m0] = entries[0]!;
|
|
58
|
+
this.data[m1] = entries[3]!;
|
|
59
|
+
this.data[m2] = entries[6]!;
|
|
60
|
+
this.data[m3] = entries[1]!;
|
|
61
|
+
this.data[m4] = entries[4]!;
|
|
62
|
+
this.data[m5] = entries[7]!;
|
|
63
|
+
this.data[m6] = entries[2]!;
|
|
64
|
+
this.data[m7] = entries[5]!;
|
|
65
|
+
this.data[m8] = entries[8]!;
|
|
66
|
+
} else {
|
|
67
|
+
this.data = new Float32Array(9);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Returns a temporary matrix that can be used for calculations.
|
|
73
|
+
*
|
|
74
|
+
* @remarks
|
|
75
|
+
* This is useful for avoiding allocations in tight loops.
|
|
76
|
+
*
|
|
77
|
+
* The matrix is not guaranteed to be the same between calls.
|
|
78
|
+
*
|
|
79
|
+
* @returns
|
|
80
|
+
*/
|
|
81
|
+
public static get temp(): Matrix3d {
|
|
82
|
+
return tempMatrix;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
public static multiply(a: Matrix3d, b: Matrix3d, out?: Matrix3d): Matrix3d {
|
|
86
|
+
const e0 =
|
|
87
|
+
a.data[m0]! * b.data[m0]! +
|
|
88
|
+
a.data[m1]! * b.data[m3]! +
|
|
89
|
+
a.data[m2]! * b.data[m6]!;
|
|
90
|
+
const e1 =
|
|
91
|
+
a.data[m0]! * b.data[m1]! +
|
|
92
|
+
a.data[m1]! * b.data[m4]! +
|
|
93
|
+
a.data[m2]! * b.data[m7]!;
|
|
94
|
+
const e2 =
|
|
95
|
+
a.data[m0]! * b.data[m2]! +
|
|
96
|
+
a.data[m1]! * b.data[m5]! +
|
|
97
|
+
a.data[m2]! * b.data[m8]!;
|
|
98
|
+
const e3 =
|
|
99
|
+
a.data[m3]! * b.data[m0]! +
|
|
100
|
+
a.data[m4]! * b.data[m3]! +
|
|
101
|
+
a.data[m5]! * b.data[m6]!;
|
|
102
|
+
const e4 =
|
|
103
|
+
a.data[m3]! * b.data[m1]! +
|
|
104
|
+
a.data[m4]! * b.data[m4]! +
|
|
105
|
+
a.data[m5]! * b.data[m7]!;
|
|
106
|
+
const e5 =
|
|
107
|
+
a.data[m3]! * b.data[m2]! +
|
|
108
|
+
a.data[m4]! * b.data[m5]! +
|
|
109
|
+
a.data[m5]! * b.data[m8]!;
|
|
110
|
+
const e6 =
|
|
111
|
+
a.data[m6]! * b.data[m0]! +
|
|
112
|
+
a.data[m7]! * b.data[m3]! +
|
|
113
|
+
a.data[m8]! * b.data[m6]!;
|
|
114
|
+
const e7 =
|
|
115
|
+
a.data[m6]! * b.data[m1]! +
|
|
116
|
+
a.data[m7]! * b.data[m4]! +
|
|
117
|
+
a.data[m8]! * b.data[m7]!;
|
|
118
|
+
const e8 =
|
|
119
|
+
a.data[m6]! * b.data[m2]! +
|
|
120
|
+
a.data[m7]! * b.data[m5]! +
|
|
121
|
+
a.data[m8]! * b.data[m8]!;
|
|
122
|
+
if (!out) {
|
|
123
|
+
out = new Matrix3d();
|
|
124
|
+
}
|
|
125
|
+
out.data[m0] = e0;
|
|
126
|
+
out.data[m1] = e1;
|
|
127
|
+
out.data[m2] = e2;
|
|
128
|
+
out.data[m3] = e3;
|
|
129
|
+
out.data[m4] = e4;
|
|
130
|
+
out.data[m5] = e5;
|
|
131
|
+
out.data[m6] = e6;
|
|
132
|
+
out.data[m7] = e7;
|
|
133
|
+
out.data[m8] = e8;
|
|
134
|
+
return out;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
public static identity(out?: Matrix3d): Matrix3d {
|
|
138
|
+
if (!out) {
|
|
139
|
+
out = new Matrix3d();
|
|
140
|
+
}
|
|
141
|
+
out.data[m0] = 1;
|
|
142
|
+
out.data[m1] = 0;
|
|
143
|
+
out.data[m2] = 0;
|
|
144
|
+
out.data[m3] = 0;
|
|
145
|
+
out.data[m4] = 1;
|
|
146
|
+
out.data[m5] = 0;
|
|
147
|
+
out.data[m6] = 0;
|
|
148
|
+
out.data[m7] = 0;
|
|
149
|
+
out.data[m8] = 1;
|
|
150
|
+
return out;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
public static translate(x: number, y: number, out?: Matrix3d): Matrix3d {
|
|
154
|
+
if (!out) {
|
|
155
|
+
out = new Matrix3d();
|
|
156
|
+
}
|
|
157
|
+
out.data[m0] = 1;
|
|
158
|
+
out.data[m1] = 0;
|
|
159
|
+
out.data[m2] = x;
|
|
160
|
+
out.data[m3] = 0;
|
|
161
|
+
out.data[m4] = 1;
|
|
162
|
+
out.data[m5] = y;
|
|
163
|
+
out.data[m6] = 0;
|
|
164
|
+
out.data[m7] = 0;
|
|
165
|
+
out.data[m8] = 1;
|
|
166
|
+
return out;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
public static scale(sx: number, sy: number, out?: Matrix3d): Matrix3d {
|
|
170
|
+
if (!out) {
|
|
171
|
+
out = new Matrix3d();
|
|
172
|
+
}
|
|
173
|
+
out.data[m0] = sx;
|
|
174
|
+
out.data[m1] = 0;
|
|
175
|
+
out.data[m2] = 0;
|
|
176
|
+
out.data[m3] = 0;
|
|
177
|
+
out.data[m4] = sy;
|
|
178
|
+
out.data[m5] = 0;
|
|
179
|
+
out.data[m6] = 0;
|
|
180
|
+
out.data[m7] = 0;
|
|
181
|
+
out.data[m8] = 1;
|
|
182
|
+
return out;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
public static rotate(angle: number, out?: Matrix3d): Matrix3d {
|
|
186
|
+
const cos = Math.cos(angle);
|
|
187
|
+
const sin = Math.sin(angle);
|
|
188
|
+
if (!out) {
|
|
189
|
+
out = new Matrix3d();
|
|
190
|
+
}
|
|
191
|
+
out.data[m0] = cos;
|
|
192
|
+
out.data[m1] = -sin;
|
|
193
|
+
out.data[m2] = 0;
|
|
194
|
+
out.data[m3] = sin;
|
|
195
|
+
out.data[m4] = cos;
|
|
196
|
+
out.data[m5] = 0;
|
|
197
|
+
out.data[m6] = 0;
|
|
198
|
+
out.data[m7] = 0;
|
|
199
|
+
out.data[m8] = 1;
|
|
200
|
+
return out;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
public static copy(
|
|
204
|
+
src: Matrix3d,
|
|
205
|
+
dst?: Matrix3d,
|
|
206
|
+
transpose?: boolean,
|
|
207
|
+
): Matrix3d {
|
|
208
|
+
if (!dst) {
|
|
209
|
+
dst = new Matrix3d();
|
|
210
|
+
}
|
|
211
|
+
dst.data[0] = src.data[0]!;
|
|
212
|
+
dst.data[1] = src.data[1]!;
|
|
213
|
+
dst.data[2] = src.data[2]!;
|
|
214
|
+
dst.data[3] = src.data[3]!;
|
|
215
|
+
dst.data[4] = src.data[4]!;
|
|
216
|
+
dst.data[5] = src.data[5]!;
|
|
217
|
+
dst.data[6] = src.data[6]!;
|
|
218
|
+
dst.data[7] = src.data[7]!;
|
|
219
|
+
dst.data[8] = src.data[8]!;
|
|
220
|
+
return dst;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
public translate(x: number, y: number): Matrix3d {
|
|
224
|
+
this.data[m2] = this.data[m0]! * x + this.data[m1]! * y + this.data[m2]!;
|
|
225
|
+
this.data[m5] = this.data[m3]! * x + this.data[m4]! * y + this.data[m5]!;
|
|
226
|
+
return this;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
public scale(sx: number, sy: number): Matrix3d {
|
|
230
|
+
this.data[m0] = this.data[m0]! * sx;
|
|
231
|
+
this.data[m1] = this.data[m1]! * sy;
|
|
232
|
+
this.data[m3] = this.data[m3]! * sx;
|
|
233
|
+
this.data[m4] = this.data[m4]! * sy;
|
|
234
|
+
return this;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
public rotate(angle: number): Matrix3d {
|
|
238
|
+
if (angle === 0 || !((angle % Math.PI) * 2)) {
|
|
239
|
+
return this;
|
|
240
|
+
}
|
|
241
|
+
const cos = Math.cos(angle);
|
|
242
|
+
const sin = Math.sin(angle);
|
|
243
|
+
const e0 = this.data[m0]! * cos + this.data[m1]! * sin;
|
|
244
|
+
const e1 = this.data[m1]! * cos - this.data[m0]! * sin;
|
|
245
|
+
const e3 = this.data[m3]! * cos + this.data[m4]! * sin;
|
|
246
|
+
const e4 = this.data[m4]! * cos - this.data[m3]! * sin;
|
|
247
|
+
this.data[m0] = e0;
|
|
248
|
+
this.data[m1] = e1;
|
|
249
|
+
this.data[m3] = e3;
|
|
250
|
+
this.data[m4] = e4;
|
|
251
|
+
return this;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
public multiply(other: Matrix3d): Matrix3d {
|
|
255
|
+
return Matrix3d.multiply(this, other, this);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
get tx(): number {
|
|
259
|
+
return this.data[m2]!;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
get ty(): number {
|
|
263
|
+
return this.data[m5]!;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
get ta(): number {
|
|
267
|
+
return this.data[m0]!;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
get tb(): number {
|
|
271
|
+
return this.data[m1]!;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
get tc(): number {
|
|
275
|
+
return this.data[m3]!;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
get td(): number {
|
|
279
|
+
return this.data[m4]!;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
transformPoint(x: number, y: number): [number, number] {
|
|
283
|
+
return [
|
|
284
|
+
this.data[m0]! * x + this.data[m1]! * y + this.data[m2]!,
|
|
285
|
+
this.data[m3]! * x + this.data[m4]! * y + this.data[m3]!,
|
|
286
|
+
];
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
const tempMatrix = new Matrix3d();
|
package/src/core/lib/utils.ts
CHANGED
|
@@ -39,15 +39,13 @@ export interface QuadOptions {
|
|
|
39
39
|
shader: CoreShader | null;
|
|
40
40
|
shaderProps: Record<string, unknown> | null;
|
|
41
41
|
alpha: number;
|
|
42
|
-
scale: number;
|
|
43
42
|
clippingRect: Rect | null;
|
|
44
|
-
|
|
45
|
-
|
|
43
|
+
tx: number;
|
|
44
|
+
ty: number;
|
|
46
45
|
ta: number;
|
|
47
46
|
tb: number;
|
|
48
47
|
tc: number;
|
|
49
48
|
td: number;
|
|
50
|
-
worldScale: number;
|
|
51
49
|
}
|
|
52
50
|
|
|
53
51
|
export abstract class CoreRenderer {
|
|
@@ -23,10 +23,7 @@ import {
|
|
|
23
23
|
hasOwn,
|
|
24
24
|
mergeColorAlphaPremultiplied,
|
|
25
25
|
} from '../../../utils.js';
|
|
26
|
-
import {
|
|
27
|
-
CoreRenderer,
|
|
28
|
-
type QuadOptions as QuadOptions,
|
|
29
|
-
} from '../CoreRenderer.js';
|
|
26
|
+
import { CoreRenderer, type QuadOptions } from '../CoreRenderer.js';
|
|
30
27
|
import { WebGlCoreRenderOp } from './WebGlCoreRenderOp.js';
|
|
31
28
|
import type { CoreContextTexture } from '../CoreContextTexture.js';
|
|
32
29
|
import {
|
|
@@ -220,7 +217,6 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
220
217
|
const {
|
|
221
218
|
width,
|
|
222
219
|
height,
|
|
223
|
-
clippingRect,
|
|
224
220
|
colorTl,
|
|
225
221
|
colorTr,
|
|
226
222
|
colorBl,
|
|
@@ -229,8 +225,9 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
229
225
|
shader,
|
|
230
226
|
shaderProps,
|
|
231
227
|
alpha,
|
|
232
|
-
|
|
233
|
-
|
|
228
|
+
clippingRect,
|
|
229
|
+
tx,
|
|
230
|
+
ty,
|
|
234
231
|
ta,
|
|
235
232
|
tb,
|
|
236
233
|
tc,
|
|
@@ -331,8 +328,8 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
331
328
|
// render quad advanced
|
|
332
329
|
if (tb !== 0 || tc !== 0) {
|
|
333
330
|
// Upper-Left
|
|
334
|
-
fQuadBuffer[bufferIdx++] =
|
|
335
|
-
fQuadBuffer[bufferIdx++] =
|
|
331
|
+
fQuadBuffer[bufferIdx++] = tx; // vertexX
|
|
332
|
+
fQuadBuffer[bufferIdx++] = ty; // vertexY
|
|
336
333
|
fQuadBuffer[bufferIdx++] = texCoordX1; // texCoordX
|
|
337
334
|
fQuadBuffer[bufferIdx++] = texCoordY1; // texCoordY
|
|
338
335
|
uiQuadBuffer[bufferIdx++] = mergeColorAlphaPremultiplied(
|
|
@@ -343,8 +340,8 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
343
340
|
fQuadBuffer[bufferIdx++] = textureIdx; // texIndex
|
|
344
341
|
|
|
345
342
|
// Upper-Right
|
|
346
|
-
fQuadBuffer[bufferIdx++] =
|
|
347
|
-
fQuadBuffer[bufferIdx++] =
|
|
343
|
+
fQuadBuffer[bufferIdx++] = tx + width * ta;
|
|
344
|
+
fQuadBuffer[bufferIdx++] = ty + width * tc;
|
|
348
345
|
fQuadBuffer[bufferIdx++] = texCoordX2;
|
|
349
346
|
fQuadBuffer[bufferIdx++] = texCoordY1;
|
|
350
347
|
uiQuadBuffer[bufferIdx++] = mergeColorAlphaPremultiplied(
|
|
@@ -355,8 +352,8 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
355
352
|
fQuadBuffer[bufferIdx++] = textureIdx;
|
|
356
353
|
|
|
357
354
|
// Lower-Left
|
|
358
|
-
fQuadBuffer[bufferIdx++] =
|
|
359
|
-
fQuadBuffer[bufferIdx++] =
|
|
355
|
+
fQuadBuffer[bufferIdx++] = tx + height * tb;
|
|
356
|
+
fQuadBuffer[bufferIdx++] = ty + height * td;
|
|
360
357
|
fQuadBuffer[bufferIdx++] = texCoordX1;
|
|
361
358
|
fQuadBuffer[bufferIdx++] = texCoordY2;
|
|
362
359
|
uiQuadBuffer[bufferIdx++] = mergeColorAlphaPremultiplied(
|
|
@@ -367,8 +364,8 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
367
364
|
fQuadBuffer[bufferIdx++] = textureIdx;
|
|
368
365
|
|
|
369
366
|
// Lower-Right
|
|
370
|
-
fQuadBuffer[bufferIdx++] =
|
|
371
|
-
fQuadBuffer[bufferIdx++] =
|
|
367
|
+
fQuadBuffer[bufferIdx++] = tx + width * ta + height * tb;
|
|
368
|
+
fQuadBuffer[bufferIdx++] = ty + width * tc + height * td;
|
|
372
369
|
fQuadBuffer[bufferIdx++] = texCoordX2;
|
|
373
370
|
fQuadBuffer[bufferIdx++] = texCoordY2;
|
|
374
371
|
uiQuadBuffer[bufferIdx++] = mergeColorAlphaPremultiplied(
|
|
@@ -380,12 +377,12 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
380
377
|
} else {
|
|
381
378
|
// Calculate the right corner of the quad
|
|
382
379
|
// multiplied by the scale
|
|
383
|
-
const rightCornerX =
|
|
384
|
-
const rightCornerY =
|
|
380
|
+
const rightCornerX = tx + width * ta;
|
|
381
|
+
const rightCornerY = ty + height * td;
|
|
385
382
|
|
|
386
383
|
// Upper-Left
|
|
387
|
-
fQuadBuffer[bufferIdx++] =
|
|
388
|
-
fQuadBuffer[bufferIdx++] =
|
|
384
|
+
fQuadBuffer[bufferIdx++] = tx; // vertexX
|
|
385
|
+
fQuadBuffer[bufferIdx++] = ty; // vertexY
|
|
389
386
|
fQuadBuffer[bufferIdx++] = texCoordX1; // texCoordX
|
|
390
387
|
fQuadBuffer[bufferIdx++] = texCoordY1; // texCoordY
|
|
391
388
|
uiQuadBuffer[bufferIdx++] = mergeColorAlphaPremultiplied(
|
|
@@ -397,7 +394,7 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
397
394
|
|
|
398
395
|
// Upper-Right
|
|
399
396
|
fQuadBuffer[bufferIdx++] = rightCornerX;
|
|
400
|
-
fQuadBuffer[bufferIdx++] =
|
|
397
|
+
fQuadBuffer[bufferIdx++] = ty;
|
|
401
398
|
fQuadBuffer[bufferIdx++] = texCoordX2;
|
|
402
399
|
fQuadBuffer[bufferIdx++] = texCoordY1;
|
|
403
400
|
uiQuadBuffer[bufferIdx++] = mergeColorAlphaPremultiplied(
|
|
@@ -408,7 +405,7 @@ export class WebGlCoreRenderer extends CoreRenderer {
|
|
|
408
405
|
fQuadBuffer[bufferIdx++] = textureIdx;
|
|
409
406
|
|
|
410
407
|
// Lower-Left
|
|
411
|
-
fQuadBuffer[bufferIdx++] =
|
|
408
|
+
fQuadBuffer[bufferIdx++] = tx;
|
|
412
409
|
fQuadBuffer[bufferIdx++] = rightCornerY;
|
|
413
410
|
fQuadBuffer[bufferIdx++] = texCoordX1;
|
|
414
411
|
fQuadBuffer[bufferIdx++] = texCoordY2;
|
|
@@ -282,9 +282,9 @@ export abstract class WebGlCoreShader extends CoreShader {
|
|
|
282
282
|
}
|
|
283
283
|
}
|
|
284
284
|
|
|
285
|
-
setUniform(name: string, value: any): void {
|
|
285
|
+
setUniform(name: string, ...value: any[]): void {
|
|
286
286
|
// @ts-expect-error Typing of args is too funky apparently for TS
|
|
287
|
-
this.gl[this.uniformTypes[name]](this.uniformLocations[name], value);
|
|
287
|
+
this.gl[this.uniformTypes[name]](this.uniformLocations[name], ...value);
|
|
288
288
|
}
|
|
289
289
|
|
|
290
290
|
bindBufferCollection(buffer: BufferCollection) {
|
|
@@ -16,13 +16,14 @@
|
|
|
16
16
|
* See the License for the specific language governing permissions and
|
|
17
17
|
* limitations under the License.
|
|
18
18
|
*/
|
|
19
|
-
|
|
20
19
|
import { getNormalizedRgbaComponents } from '../../../lib/utils.js';
|
|
21
20
|
import type { WebGlCoreCtxTexture } from '../WebGlCoreCtxTexture.js';
|
|
22
21
|
import type { WebGlCoreRenderer } from '../WebGlCoreRenderer.js';
|
|
23
22
|
import { WebGlCoreShader } from '../WebGlCoreShader.js';
|
|
24
23
|
import type { ShaderProgramSources } from '../internal/ShaderUtils.js';
|
|
25
24
|
|
|
25
|
+
const IDENTITY_MATRIX_3x3 = new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]);
|
|
26
|
+
|
|
26
27
|
declare module '../../../CoreShaderManager.js' {
|
|
27
28
|
interface ShaderMap {
|
|
28
29
|
SdfShader: typeof SdfShader;
|
|
@@ -33,7 +34,8 @@ declare module '../../../CoreShaderManager.js' {
|
|
|
33
34
|
* Properties of the {@link SdfShader}
|
|
34
35
|
*/
|
|
35
36
|
export interface SdfShaderProps {
|
|
36
|
-
|
|
37
|
+
transform?: Float32Array;
|
|
38
|
+
scrollY?: number;
|
|
37
39
|
/**
|
|
38
40
|
* Color in RGBA format
|
|
39
41
|
*
|
|
@@ -65,9 +67,10 @@ export class SdfShader extends WebGlCoreShader {
|
|
|
65
67
|
attributes: ['a_position', 'a_textureCoordinate'],
|
|
66
68
|
uniforms: [
|
|
67
69
|
{ name: 'u_resolution', uniform: 'uniform2fv' },
|
|
70
|
+
{ name: 'u_transform', uniform: 'uniformMatrix3fv' },
|
|
71
|
+
{ name: 'u_scrollY', uniform: 'uniform1f' },
|
|
68
72
|
{ name: 'u_pixelRatio', uniform: 'uniform1f' },
|
|
69
73
|
{ name: 'u_texture', uniform: 'uniform2f' },
|
|
70
|
-
{ name: 'u_offset', uniform: 'uniform2fv' },
|
|
71
74
|
{ name: 'u_color', uniform: 'uniform4fv' },
|
|
72
75
|
{ name: 'u_size', uniform: 'uniform1f' },
|
|
73
76
|
{ name: 'u_distanceRange', uniform: 'uniform1f' },
|
|
@@ -85,8 +88,10 @@ export class SdfShader extends WebGlCoreShader {
|
|
|
85
88
|
protected override bindProps(props: SdfShaderProps): void {
|
|
86
89
|
const resolvedProps = SdfShader.resolveDefaults(props);
|
|
87
90
|
for (const key in resolvedProps) {
|
|
88
|
-
if (key === '
|
|
89
|
-
this.setUniform('
|
|
91
|
+
if (key === 'transform') {
|
|
92
|
+
this.setUniform('u_transform', false, resolvedProps[key]);
|
|
93
|
+
} else if (key === 'scrollY') {
|
|
94
|
+
this.setUniform('u_scrollY', resolvedProps[key]);
|
|
90
95
|
} else if (key === 'color') {
|
|
91
96
|
const components = getNormalizedRgbaComponents(resolvedProps.color);
|
|
92
97
|
this.setUniform('u_color', components);
|
|
@@ -104,7 +109,8 @@ export class SdfShader extends WebGlCoreShader {
|
|
|
104
109
|
props: SdfShaderProps = {},
|
|
105
110
|
): Required<SdfShaderProps> {
|
|
106
111
|
return {
|
|
107
|
-
|
|
112
|
+
transform: props.transform ?? IDENTITY_MATRIX_3x3,
|
|
113
|
+
scrollY: props.scrollY ?? 0,
|
|
108
114
|
color: props.color ?? 0xffffffff,
|
|
109
115
|
size: props.size ?? 16,
|
|
110
116
|
distanceRange: props.distanceRange ?? 1.0,
|
|
@@ -119,15 +125,18 @@ export class SdfShader extends WebGlCoreShader {
|
|
|
119
125
|
attribute vec2 a_position;
|
|
120
126
|
attribute vec2 a_textureCoordinate;
|
|
121
127
|
|
|
122
|
-
uniform vec2 u_offset;
|
|
123
128
|
uniform vec2 u_resolution;
|
|
129
|
+
uniform mat3 u_transform;
|
|
130
|
+
uniform float u_scrollY;
|
|
124
131
|
uniform float u_pixelRatio;
|
|
125
132
|
uniform float u_size;
|
|
126
133
|
|
|
127
134
|
varying vec2 v_texcoord;
|
|
128
135
|
|
|
129
136
|
void main() {
|
|
130
|
-
|
|
137
|
+
vec2 scrolledPosition = a_position * u_size - vec2(0, u_scrollY);
|
|
138
|
+
vec2 transformedPosition = (u_transform * vec3(scrolledPosition, 1)).xy;
|
|
139
|
+
gl_Position = vec4((transformedPosition * u_pixelRatio / u_resolution * 2.0 - 1.0) * vec2(1, -1), 0, 1);
|
|
131
140
|
v_texcoord = a_textureCoordinate;
|
|
132
141
|
}
|
|
133
142
|
`,
|
|
@@ -20,12 +20,14 @@
|
|
|
20
20
|
import { EventEmitter } from '../../../common/EventEmitter.js';
|
|
21
21
|
import { assertTruthy } from '../../../utils.js';
|
|
22
22
|
import type { Stage } from '../../Stage.js';
|
|
23
|
+
import type { Matrix3d } from '../../lib/Matrix3d.js';
|
|
23
24
|
import {
|
|
24
25
|
intersectRect,
|
|
25
26
|
type Bound,
|
|
26
27
|
intersectBound,
|
|
27
28
|
getNormalizedRgbaComponents,
|
|
28
29
|
type Rect,
|
|
30
|
+
getNormalizedAlphaComponent,
|
|
29
31
|
} from '../../lib/utils.js';
|
|
30
32
|
import type { ImageTexture } from '../../textures/ImageTexture.js';
|
|
31
33
|
import type { TrFontFace } from '../font-face-types/TrFontFace.js';
|
|
@@ -456,7 +458,9 @@ export class CanvasTextRenderer extends TextRenderer<CanvasTextRendererState> {
|
|
|
456
458
|
|
|
457
459
|
override renderQuads(
|
|
458
460
|
state: CanvasTextRendererState,
|
|
461
|
+
transform: Matrix3d,
|
|
459
462
|
clippingRect: Rect | null,
|
|
463
|
+
alpha: number,
|
|
460
464
|
): void {
|
|
461
465
|
const { stage } = this;
|
|
462
466
|
|
|
@@ -498,11 +502,15 @@ export class CanvasTextRenderer extends TextRenderer<CanvasTextRendererState> {
|
|
|
498
502
|
const renderWindowHeight = renderWindow.y2 - renderWindow.y1;
|
|
499
503
|
const pageSize = renderWindowHeight / 3.0;
|
|
500
504
|
|
|
501
|
-
const { zIndex,
|
|
505
|
+
const { zIndex, color } = state.props;
|
|
506
|
+
|
|
507
|
+
// Color alpha of text is not properly rendered to the Canvas texture, so we
|
|
508
|
+
// need to apply it here.
|
|
509
|
+
const combinedAlpha = alpha * getNormalizedAlphaComponent(color);
|
|
502
510
|
|
|
503
511
|
if (canvasPages[0].valid) {
|
|
504
512
|
this.stage.renderer.addRenderable({
|
|
505
|
-
alpha,
|
|
513
|
+
alpha: combinedAlpha,
|
|
506
514
|
clippingRect,
|
|
507
515
|
colorBl: 0xffffffff,
|
|
508
516
|
colorBr: 0xffffffff,
|
|
@@ -515,19 +523,17 @@ export class CanvasTextRenderer extends TextRenderer<CanvasTextRendererState> {
|
|
|
515
523
|
shader: null,
|
|
516
524
|
shaderProps: null,
|
|
517
525
|
zIndex,
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
tc: 0,
|
|
525
|
-
td: 1,
|
|
526
|
+
tx: transform.tx,
|
|
527
|
+
ty: transform.ty - scrollY + renderWindow.y1,
|
|
528
|
+
ta: transform.ta,
|
|
529
|
+
tb: transform.tb,
|
|
530
|
+
tc: transform.tc,
|
|
531
|
+
td: transform.td,
|
|
526
532
|
});
|
|
527
533
|
}
|
|
528
534
|
if (canvasPages[1].valid) {
|
|
529
535
|
this.stage.renderer.addRenderable({
|
|
530
|
-
alpha,
|
|
536
|
+
alpha: combinedAlpha,
|
|
531
537
|
clippingRect,
|
|
532
538
|
colorBl: 0xffffffff,
|
|
533
539
|
colorBr: 0xffffffff,
|
|
@@ -540,19 +546,17 @@ export class CanvasTextRenderer extends TextRenderer<CanvasTextRendererState> {
|
|
|
540
546
|
shader: null,
|
|
541
547
|
shaderProps: null,
|
|
542
548
|
zIndex,
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
tc: 0,
|
|
550
|
-
td: 1,
|
|
549
|
+
tx: transform.tx,
|
|
550
|
+
ty: transform.ty - scrollY + renderWindow.y1 + pageSize,
|
|
551
|
+
ta: transform.ta,
|
|
552
|
+
tb: transform.tb,
|
|
553
|
+
tc: transform.tc,
|
|
554
|
+
td: transform.td,
|
|
551
555
|
});
|
|
552
556
|
}
|
|
553
557
|
if (canvasPages[2].valid) {
|
|
554
558
|
this.stage.renderer.addRenderable({
|
|
555
|
-
alpha,
|
|
559
|
+
alpha: combinedAlpha,
|
|
556
560
|
clippingRect,
|
|
557
561
|
colorBl: 0xffffffff,
|
|
558
562
|
colorBr: 0xffffffff,
|
|
@@ -565,14 +569,12 @@ export class CanvasTextRenderer extends TextRenderer<CanvasTextRendererState> {
|
|
|
565
569
|
shader: null,
|
|
566
570
|
shaderProps: null,
|
|
567
571
|
zIndex,
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
tc: 0,
|
|
575
|
-
td: 1,
|
|
572
|
+
tx: transform.tx,
|
|
573
|
+
ty: transform.ty - scrollY + renderWindow.y1 + pageSize + pageSize,
|
|
574
|
+
ta: transform.ta,
|
|
575
|
+
tb: transform.tb,
|
|
576
|
+
tc: transform.tc,
|
|
577
|
+
td: transform.td,
|
|
576
578
|
});
|
|
577
579
|
}
|
|
578
580
|
|