@flighthq/displayobject-gl 0.1.0 → 0.2.1-next.410.a23f189
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/dist/enableGlColorAdjustmentGuards.d.ts +4 -0
- package/dist/enableGlColorAdjustmentGuards.d.ts.map +1 -0
- package/dist/enableGlColorAdjustmentGuards.js +21 -0
- package/dist/enableGlColorAdjustmentGuards.js.map +1 -0
- package/dist/glBitmap.d.ts.map +1 -1
- package/dist/glBitmap.js +17 -32
- package/dist/glBitmap.js.map +1 -1
- package/dist/glCache.d.ts.map +1 -1
- package/dist/glCache.js +11 -4
- package/dist/glCache.js.map +1 -1
- package/dist/glColorAdjustment.d.ts +3 -0
- package/dist/glColorAdjustment.d.ts.map +1 -0
- package/dist/glColorAdjustment.js +353 -0
- package/dist/glColorAdjustment.js.map +1 -0
- package/dist/glParticleEmitter.d.ts.map +1 -1
- package/dist/glParticleEmitter.js +4 -3
- package/dist/glParticleEmitter.js.map +1 -1
- package/dist/glQuadBatch.d.ts.map +1 -1
- package/dist/glQuadBatch.js +11 -7
- package/dist/glQuadBatch.js.map +1 -1
- package/dist/glRichText.js +3 -2
- package/dist/glRichText.js.map +1 -1
- package/dist/glShape.d.ts.map +1 -1
- package/dist/glShape.js +15 -11
- package/dist/glShape.js.map +1 -1
- package/dist/glShapeMesh.d.ts +10 -6
- package/dist/glShapeMesh.d.ts.map +1 -1
- package/dist/glShapeMesh.js +48 -29
- package/dist/glShapeMesh.js.map +1 -1
- package/dist/glSpriteBatch.d.ts +3 -3
- package/dist/glSpriteBatch.d.ts.map +1 -1
- package/dist/glSpriteBatch.js +43 -20
- package/dist/glSpriteBatch.js.map +1 -1
- package/dist/glSpriteRenderer.d.ts.map +1 -1
- package/dist/glSpriteRenderer.js +5 -3
- package/dist/glSpriteRenderer.js.map +1 -1
- package/dist/glTextInput.js +1 -1
- package/dist/glTextInput.js.map +1 -1
- package/dist/glTextLabel.d.ts.map +1 -1
- package/dist/glTextLabel.js +23 -12
- package/dist/glTextLabel.js.map +1 -1
- package/dist/glTilemap.d.ts.map +1 -1
- package/dist/glTilemap.js +11 -6
- package/dist/glTilemap.js.map +1 -1
- package/dist/glVelocity.js +5 -5
- package/dist/glVelocity.js.map +1 -1
- package/dist/glVideo.d.ts.map +1 -1
- package/dist/glVideo.js +34 -32
- package/dist/glVideo.js.map +1 -1
- package/dist/index.d.ts +2 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -3
- package/dist/index.js.map +1 -1
- package/package.json +24 -15
- package/src/enableGlColorAdjustmentGuards.test.ts +76 -0
- package/src/glBitmap.test.ts +11 -3
- package/src/glCache.test.ts +6 -2
- package/src/glColorAdjustment.test.ts +166 -0
- package/src/glRichText.test.ts +7 -2
- package/src/glShape.test.ts +2 -1
- package/src/glShapeMesh.test.ts +103 -3
- package/src/glSpriteBatch.test.ts +61 -3
- package/src/glTextLabel.test.ts +17 -12
- package/src/glVelocity.test.ts +2 -1
- package/src/glVideo.test.ts +47 -14
- package/dist/glColorTransformMaterial.d.ts +0 -4
- package/dist/glColorTransformMaterial.d.ts.map +0 -1
- package/dist/glColorTransformMaterial.js +0 -116
- package/dist/glColorTransformMaterial.js.map +0 -1
- package/dist/glMaterials.d.ts +0 -4
- package/dist/glMaterials.d.ts.map +0 -1
- package/dist/glMaterials.js +0 -97
- package/dist/glMaterials.js.map +0 -1
- package/dist/glUniformColorTransformMaterial.d.ts +0 -4
- package/dist/glUniformColorTransformMaterial.d.ts.map +0 -1
- package/dist/glUniformColorTransformMaterial.js +0 -56
- package/dist/glUniformColorTransformMaterial.js.map +0 -1
- package/src/glColorTransformMaterial.test.ts +0 -45
- package/src/glMaterials.test.ts +0 -91
- package/src/glUniformColorTransformMaterial.test.ts +0 -24
package/src/glTextLabel.test.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { createImageResource } from '@flighthq/image';
|
|
1
2
|
import { getGlRenderStateRuntime } from '@flighthq/render-gl';
|
|
2
3
|
import { createTextLabel, setTextLabelString } from '@flighthq/text';
|
|
3
4
|
import type { RenderProxy2D, TextLabel } from '@flighthq/types';
|
|
@@ -45,7 +46,7 @@ function makeTextData() {
|
|
|
45
46
|
canvas.width = 1;
|
|
46
47
|
canvas.height = 1;
|
|
47
48
|
const ctx = canvas.getContext('2d')!;
|
|
48
|
-
return { canvas, ctx, lastHash: '', logW: 0, logH: 0 };
|
|
49
|
+
return { canvas, ctx, image: createImageResource(canvas), lastHash: '', logW: 0, logH: 0 };
|
|
49
50
|
}
|
|
50
51
|
|
|
51
52
|
function makeTextProxy(text = '', rendererData: unknown = null): RenderProxy2D {
|
|
@@ -118,34 +119,38 @@ describe('drawGlTextLabel', () => {
|
|
|
118
119
|
it('skips layout and rasterization on repeated calls when the content version is unchanged', () => {
|
|
119
120
|
const { state } = createGlState();
|
|
120
121
|
registerDefaultGlMaterial(state);
|
|
121
|
-
const
|
|
122
|
-
const
|
|
122
|
+
const data = makeTextData();
|
|
123
|
+
const proxy = makeTextProxy('hello', data);
|
|
123
124
|
drawGlTextLabel(state, proxy);
|
|
125
|
+
// Rasterization bumps the canvas resource's version (setImageResourceSource); a skipped raster leaves
|
|
126
|
+
// it untouched. First draw rasterizes (version → 1); the repeat is skipped.
|
|
127
|
+
const rasterized = data.image.version;
|
|
124
128
|
drawGlTextLabel(state, proxy);
|
|
125
|
-
|
|
126
|
-
expect(deleteSpy).toHaveBeenCalledTimes(1);
|
|
129
|
+
expect(data.image.version).toBe(rasterized);
|
|
127
130
|
});
|
|
128
131
|
|
|
129
132
|
it('re-rasterizes when the content version is bumped', () => {
|
|
130
133
|
const { state } = createGlState();
|
|
131
134
|
registerDefaultGlMaterial(state);
|
|
132
|
-
const
|
|
133
|
-
const
|
|
135
|
+
const data = makeTextData();
|
|
136
|
+
const proxy = makeTextProxy('hello', data);
|
|
134
137
|
drawGlTextLabel(state, proxy);
|
|
138
|
+
const rasterized = data.image.version;
|
|
135
139
|
setTextLabelString(proxy.source as TextLabel, 'world');
|
|
136
140
|
drawGlTextLabel(state, proxy);
|
|
137
|
-
expect(
|
|
141
|
+
expect(data.image.version).toBeGreaterThan(rasterized);
|
|
138
142
|
});
|
|
139
143
|
|
|
140
144
|
it('does not re-rasterize when only alpha changes (version unchanged)', () => {
|
|
141
145
|
const { state } = createGlState();
|
|
142
146
|
registerDefaultGlMaterial(state);
|
|
143
|
-
const
|
|
144
|
-
const
|
|
147
|
+
const data = makeTextData();
|
|
148
|
+
const proxy = makeTextProxy('hello', data);
|
|
145
149
|
drawGlTextLabel(state, proxy);
|
|
150
|
+
const rasterized = data.image.version;
|
|
146
151
|
proxy.alpha = 0.5;
|
|
147
152
|
drawGlTextLabel(state, proxy);
|
|
148
|
-
// Alpha is applied per-instance in the batch; the expensive raster
|
|
149
|
-
expect(
|
|
153
|
+
// Alpha is applied per-instance in the batch; the expensive raster (and its version bump) is untouched.
|
|
154
|
+
expect(data.image.version).toBe(rasterized);
|
|
150
155
|
});
|
|
151
156
|
});
|
package/src/glVelocity.test.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createDisplayObject } from '@flighthq/displayobject';
|
|
2
|
-
import { createParticleEmitter,
|
|
2
|
+
import { createParticleEmitter, reserveParticleEmitter } from '@flighthq/particleemitter';
|
|
3
|
+
import { createQuadBatch, getQuadBatchRuntime } from '@flighthq/sprite';
|
|
3
4
|
import type { QuadBatchRuntime, TextureAtlas, TextureAtlasRegion } from '@flighthq/types';
|
|
4
5
|
import { QuadBatchKind } from '@flighthq/types';
|
|
5
6
|
import { beginVelocityFrame, contributeVelocity, createVelocityField } from '@flighthq/velocity';
|
package/src/glVideo.test.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
import type { RendererData, RenderProxy2D } from '@flighthq/types';
|
|
1
|
+
import { getGlRenderStateRuntime } from '@flighthq/render-gl';
|
|
2
|
+
import type { RendererData, RenderProxy2D, VideoTexture } from '@flighthq/types';
|
|
3
3
|
|
|
4
4
|
import { createGlState } from './glTestHelper';
|
|
5
5
|
import { createGlVideoData, defaultGlVideoRenderer, destroyGlVideoData, drawGlVideo } from './glVideo';
|
|
@@ -10,15 +10,27 @@ function makeVideoNode(element: HTMLVideoElement | null = null): RenderProxy2D {
|
|
|
10
10
|
blendMode: 0,
|
|
11
11
|
alpha: 1,
|
|
12
12
|
transform2D: { a: 1, b: 0, c: 0, d: 1, tx: 0, ty: 0 },
|
|
13
|
-
rendererData: {
|
|
13
|
+
rendererData: { source: null, videoTexture: null },
|
|
14
14
|
} as unknown as RenderProxy2D;
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
+
function makeReadyElement(): HTMLVideoElement {
|
|
18
|
+
const element = document.createElement('video');
|
|
19
|
+
Object.defineProperty(element, 'readyState', { value: 4, configurable: true });
|
|
20
|
+
Object.defineProperty(element, 'videoWidth', { value: 320, configurable: true });
|
|
21
|
+
Object.defineProperty(element, 'videoHeight', { value: 240, configurable: true });
|
|
22
|
+
return element;
|
|
23
|
+
}
|
|
24
|
+
|
|
17
25
|
describe('createGlVideoData', () => {
|
|
18
|
-
it('allocates per-node data with no
|
|
26
|
+
it('allocates per-node data with no stream or texture recorded yet', () => {
|
|
19
27
|
const { state } = createGlState();
|
|
20
|
-
const data = createGlVideoData(state, {} as never) as unknown as {
|
|
21
|
-
|
|
28
|
+
const data = createGlVideoData(state, {} as never) as unknown as {
|
|
29
|
+
source: unknown;
|
|
30
|
+
videoTexture: VideoTexture | null;
|
|
31
|
+
};
|
|
32
|
+
expect(data.source).toBeNull();
|
|
33
|
+
expect(data.videoTexture).toBeNull();
|
|
22
34
|
});
|
|
23
35
|
});
|
|
24
36
|
|
|
@@ -30,22 +42,23 @@ describe('defaultGlVideoRenderer', () => {
|
|
|
30
42
|
});
|
|
31
43
|
|
|
32
44
|
describe('destroyGlVideoData', () => {
|
|
33
|
-
it('deletes the cached GPU texture for the recorded
|
|
45
|
+
it('deletes the cached GPU texture for the recorded VideoTexture', () => {
|
|
34
46
|
const { state, gl } = createGlState();
|
|
35
47
|
const runtime = getGlRenderStateRuntime(state);
|
|
36
|
-
const
|
|
37
|
-
const texture = gl.createTexture();
|
|
38
|
-
runtime.
|
|
48
|
+
const videoTexture = { frameId: -1 } as unknown as VideoTexture;
|
|
49
|
+
const texture = gl.createTexture() as WebGLTexture;
|
|
50
|
+
runtime.videoTextureCache = new WeakMap();
|
|
51
|
+
runtime.videoTextureCache.set(videoTexture, { texture, uploadedFrameId: -1 });
|
|
39
52
|
const deleteSpy = vi.spyOn(gl, 'deleteTexture');
|
|
40
|
-
destroyGlVideoData(state, {
|
|
53
|
+
destroyGlVideoData(state, { source: null, videoTexture } as unknown as RendererData);
|
|
41
54
|
expect(deleteSpy).toHaveBeenCalledWith(texture);
|
|
42
|
-
expect(runtime.
|
|
55
|
+
expect(runtime.videoTextureCache.has(videoTexture)).toBe(false);
|
|
43
56
|
});
|
|
44
57
|
|
|
45
|
-
it('is a no-op when no
|
|
58
|
+
it('is a no-op when no VideoTexture was recorded', () => {
|
|
46
59
|
const { state, gl } = createGlState();
|
|
47
60
|
const deleteSpy = vi.spyOn(gl, 'deleteTexture');
|
|
48
|
-
destroyGlVideoData(state, {
|
|
61
|
+
destroyGlVideoData(state, { source: null, videoTexture: null } as unknown as RendererData);
|
|
49
62
|
expect(deleteSpy).not.toHaveBeenCalled();
|
|
50
63
|
});
|
|
51
64
|
});
|
|
@@ -62,4 +75,24 @@ describe('drawGlVideo', () => {
|
|
|
62
75
|
drawGlVideo(state, makeVideoNode(document.createElement('video')));
|
|
63
76
|
expect(gl.drawElements).not.toHaveBeenCalled();
|
|
64
77
|
});
|
|
78
|
+
|
|
79
|
+
it('builds a VideoTexture and uploads the ready frame through the gated bind', () => {
|
|
80
|
+
const { state, gl } = createGlState();
|
|
81
|
+
const node = makeVideoNode(makeReadyElement());
|
|
82
|
+
drawGlVideo(state, node);
|
|
83
|
+
const data = node.rendererData as unknown as { videoTexture: VideoTexture | null };
|
|
84
|
+
expect(data.videoTexture).not.toBeNull();
|
|
85
|
+
expect(gl.texImage2D).toHaveBeenCalled();
|
|
86
|
+
expect(gl.drawElements).toHaveBeenCalled();
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it('reuses the VideoTexture across draws of the same stream', () => {
|
|
90
|
+
const { state } = createGlState();
|
|
91
|
+
const node = makeVideoNode(makeReadyElement());
|
|
92
|
+
drawGlVideo(state, node);
|
|
93
|
+
const first = (node.rendererData as unknown as { videoTexture: VideoTexture | null }).videoTexture;
|
|
94
|
+
drawGlVideo(state, node);
|
|
95
|
+
const second = (node.rendererData as unknown as { videoTexture: VideoTexture | null }).videoTexture;
|
|
96
|
+
expect(second).toBe(first);
|
|
97
|
+
});
|
|
65
98
|
});
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import type { GlMaterialRenderer, GlRenderState } from '@flighthq/types';
|
|
2
|
-
export declare function registerGlColorTransformMaterial(state: GlRenderState): void;
|
|
3
|
-
export declare const colorTransformGlMaterialRenderer: GlMaterialRenderer;
|
|
4
|
-
//# sourceMappingURL=glColorTransformMaterial.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"glColorTransformMaterial.d.ts","sourceRoot":"","sources":["../src/glColorTransformMaterial.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAkB,kBAAkB,EAAE,aAAa,EAAgB,MAAM,iBAAiB,CAAC;AA2EvG,wBAAgB,gCAAgC,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAE3E;AAID,eAAO,MAAM,gCAAgC,EAAE,kBAwC9C,CAAC"}
|
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
import { createGlProgram } from '@flighthq/render-gl';
|
|
2
|
-
import { registerGlMaterialRenderer } from '@flighthq/render-gl';
|
|
3
|
-
import { getGlRenderStateRuntime } from '@flighthq/render-gl';
|
|
4
|
-
import { ColorTransformMaterialKind } from '@flighthq/types';
|
|
5
|
-
import { bindGlQuadBatchBaseAttributes, setGlQuadBatchWorldAndTexture, useGlQuadBatchProgram } from './glSpriteBatch';
|
|
6
|
-
const COLOR_TRANSFORM_INSTANCE_FLOATS = 8;
|
|
7
|
-
const COLOR_TRANSFORM_INSTANCE_STRIDE = COLOR_TRANSFORM_INSTANCE_FLOATS * 4;
|
|
8
|
-
const CT_INSTANCED_VS = `#version 300 es
|
|
9
|
-
precision mediump float;
|
|
10
|
-
|
|
11
|
-
layout(location = 0) in vec2 a_corner;
|
|
12
|
-
layout(location = 1) in vec2 a_matAB;
|
|
13
|
-
layout(location = 2) in vec2 a_matCD;
|
|
14
|
-
layout(location = 3) in vec2 a_matTXTY;
|
|
15
|
-
layout(location = 4) in vec2 a_size;
|
|
16
|
-
layout(location = 5) in vec4 a_uvRect;
|
|
17
|
-
layout(location = 6) in float a_alpha;
|
|
18
|
-
layout(location = 7) in vec4 a_ctMult;
|
|
19
|
-
layout(location = 8) in vec4 a_ctOff;
|
|
20
|
-
|
|
21
|
-
uniform mat3 u_world;
|
|
22
|
-
|
|
23
|
-
out vec2 v_texCoord;
|
|
24
|
-
out float v_alpha;
|
|
25
|
-
out vec4 v_ctMult;
|
|
26
|
-
out vec4 v_ctOff;
|
|
27
|
-
|
|
28
|
-
void main() {
|
|
29
|
-
vec2 local = a_corner * a_size;
|
|
30
|
-
vec2 worldPos = vec2(
|
|
31
|
-
a_matAB.x * local.x + a_matCD.x * local.y + a_matTXTY.x,
|
|
32
|
-
a_matAB.y * local.x + a_matCD.y * local.y + a_matTXTY.y
|
|
33
|
-
);
|
|
34
|
-
vec3 clip = u_world * vec3(worldPos, 1.0);
|
|
35
|
-
gl_Position = vec4(clip.xy, 0.0, 1.0);
|
|
36
|
-
v_texCoord = mix(a_uvRect.xy, a_uvRect.zw, a_corner);
|
|
37
|
-
v_alpha = a_alpha;
|
|
38
|
-
v_ctMult = a_ctMult;
|
|
39
|
-
v_ctOff = a_ctOff;
|
|
40
|
-
}`;
|
|
41
|
-
const CT_INSTANCED_FS = `#version 300 es
|
|
42
|
-
precision mediump float;
|
|
43
|
-
in vec2 v_texCoord;
|
|
44
|
-
in float v_alpha;
|
|
45
|
-
in vec4 v_ctMult;
|
|
46
|
-
in vec4 v_ctOff;
|
|
47
|
-
uniform sampler2D u_texture;
|
|
48
|
-
out vec4 fragColor;
|
|
49
|
-
void main() {
|
|
50
|
-
vec4 color = texture(u_texture, v_texCoord) * clamp(v_alpha, 0.0, 1.0);
|
|
51
|
-
if (color.a <= 0.0) discard;
|
|
52
|
-
color = vec4(color.rgb / color.a, color.a);
|
|
53
|
-
color = clamp(color * v_ctMult + v_ctOff, vec4(0.0), vec4(1.0));
|
|
54
|
-
fragColor = vec4(color.rgb * color.a, color.a);
|
|
55
|
-
}`;
|
|
56
|
-
function ensureGlColorTransformInstancedShader(state) {
|
|
57
|
-
const runtime = getGlRenderStateRuntime(state);
|
|
58
|
-
if (runtime.colorTransformInstancedShader)
|
|
59
|
-
return runtime.colorTransformInstancedShader;
|
|
60
|
-
const gl = state.gl;
|
|
61
|
-
const program = createGlProgram(gl, CT_INSTANCED_VS, CT_INSTANCED_FS, 'Color-transform material');
|
|
62
|
-
runtime.colorTransformInstancedShader = {
|
|
63
|
-
program,
|
|
64
|
-
locCorner: 0,
|
|
65
|
-
locWorldMatrix: gl.getUniformLocation(program, 'u_world'),
|
|
66
|
-
locTexture: gl.getUniformLocation(program, 'u_texture'),
|
|
67
|
-
};
|
|
68
|
-
return runtime.colorTransformInstancedShader;
|
|
69
|
-
}
|
|
70
|
-
export function registerGlColorTransformMaterial(state) {
|
|
71
|
-
registerGlMaterialRenderer(state, ColorTransformMaterialKind, colorTransformGlMaterialRenderer);
|
|
72
|
-
}
|
|
73
|
-
// Per-instance color transform: reads each node's resolved color transform (materialData) and packs
|
|
74
|
-
// it as two vec4 instance attributes, so independently-tinted nodes share one batch.
|
|
75
|
-
export const colorTransformGlMaterialRenderer = {
|
|
76
|
-
instanceFloatCount: COLOR_TRANSFORM_INSTANCE_FLOATS,
|
|
77
|
-
bind(state) {
|
|
78
|
-
const runtime = getGlRenderStateRuntime(state);
|
|
79
|
-
const shader = ensureGlColorTransformInstancedShader(state);
|
|
80
|
-
useGlQuadBatchProgram(state, shader.program);
|
|
81
|
-
setGlQuadBatchWorldAndTexture(state, shader.locWorldMatrix, shader.locTexture);
|
|
82
|
-
bindGlQuadBatchBaseAttributes(state, shader.locCorner);
|
|
83
|
-
const gl = state.gl;
|
|
84
|
-
gl.bindBuffer(gl.ARRAY_BUFFER, runtime.spriteBatchMaterialBuffer);
|
|
85
|
-
gl.enableVertexAttribArray(7);
|
|
86
|
-
gl.vertexAttribPointer(7, 4, gl.FLOAT, false, COLOR_TRANSFORM_INSTANCE_STRIDE, 0);
|
|
87
|
-
gl.vertexAttribDivisor(7, 1);
|
|
88
|
-
gl.enableVertexAttribArray(8);
|
|
89
|
-
gl.vertexAttribPointer(8, 4, gl.FLOAT, false, COLOR_TRANSFORM_INSTANCE_STRIDE, 16);
|
|
90
|
-
gl.vertexAttribDivisor(8, 1);
|
|
91
|
-
},
|
|
92
|
-
packInstance(_state, materialData, out, offset) {
|
|
93
|
-
const ct = materialData;
|
|
94
|
-
if (ct !== null) {
|
|
95
|
-
out[offset] = ct.redMultiplier;
|
|
96
|
-
out[offset + 1] = ct.greenMultiplier;
|
|
97
|
-
out[offset + 2] = ct.blueMultiplier;
|
|
98
|
-
out[offset + 3] = ct.alphaMultiplier;
|
|
99
|
-
out[offset + 4] = ct.redOffset / 255;
|
|
100
|
-
out[offset + 5] = ct.greenOffset / 255;
|
|
101
|
-
out[offset + 6] = ct.blueOffset / 255;
|
|
102
|
-
out[offset + 7] = ct.alphaOffset / 255;
|
|
103
|
-
}
|
|
104
|
-
else {
|
|
105
|
-
out[offset] = 1;
|
|
106
|
-
out[offset + 1] = 1;
|
|
107
|
-
out[offset + 2] = 1;
|
|
108
|
-
out[offset + 3] = 1;
|
|
109
|
-
out[offset + 4] = 0;
|
|
110
|
-
out[offset + 5] = 0;
|
|
111
|
-
out[offset + 6] = 0;
|
|
112
|
-
out[offset + 7] = 0;
|
|
113
|
-
}
|
|
114
|
-
},
|
|
115
|
-
};
|
|
116
|
-
//# sourceMappingURL=glColorTransformMaterial.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"glColorTransformMaterial.js","sourceRoot":"","sources":["../src/glColorTransformMaterial.ts"],"names":[],"mappings":"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"}
|
package/dist/glMaterials.d.ts
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import type { ColorTransform, GlRenderState, RenderProxy } from '@flighthq/types';
|
|
2
|
-
export declare function getGlRenderProxyColorTransform(renderProxy: Readonly<RenderProxy>): ColorTransform | null;
|
|
3
|
-
export declare function registerGlColorTransformShader(state: GlRenderState): void;
|
|
4
|
-
//# sourceMappingURL=glMaterials.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"glMaterials.d.ts","sourceRoot":"","sources":["../src/glMaterials.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACb,WAAW,EAGZ,MAAM,iBAAiB,CAAC;AAOzB,wBAAgB,8BAA8B,CAAC,WAAW,EAAE,QAAQ,CAAC,WAAW,CAAC,GAAG,cAAc,GAAG,IAAI,CAUxG;AAKD,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CASzE"}
|
package/dist/glMaterials.js
DELETED
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
import { createGlProgram } from '@flighthq/render-gl';
|
|
2
|
-
import { getGlRenderStateRuntime } from '@flighthq/render-gl';
|
|
3
|
-
import { setGlAttributes, setGlBaseUniforms, setGlMatrixFromTransform } from '@flighthq/render-gl';
|
|
4
|
-
import { registerGlMaterialShader } from '@flighthq/render-gl';
|
|
5
|
-
import { ColorTransformMaterialKind, UniformColorTransformMaterialKind } from '@flighthq/types';
|
|
6
|
-
// Effective color transform for a render node from its material: the value carried on a
|
|
7
|
-
// UniformColorTransformMaterial, or the per-node materialData for a ColorTransformMaterial. Null
|
|
8
|
-
// for any other (or no) material — display objects are tinted purely through the material system.
|
|
9
|
-
export function getGlRenderProxyColorTransform(renderProxy) {
|
|
10
|
-
const material = renderProxy.material;
|
|
11
|
-
if (material === null)
|
|
12
|
-
return null;
|
|
13
|
-
if (material.kind === UniformColorTransformMaterialKind) {
|
|
14
|
-
return material.colorTransform;
|
|
15
|
-
}
|
|
16
|
-
if (material.kind === ColorTransformMaterialKind) {
|
|
17
|
-
return renderProxy.materialData;
|
|
18
|
-
}
|
|
19
|
-
return null;
|
|
20
|
-
}
|
|
21
|
-
// Compiles the color-transform bitmap shader and stores it on the state. Unlike before, it does NOT
|
|
22
|
-
// become the default shader — resolveGlShader selects it only for nodes whose material is a color
|
|
23
|
-
// transform, so the standard pipeline pays nothing for it.
|
|
24
|
-
export function registerGlColorTransformShader(state) {
|
|
25
|
-
const runtime = getGlRenderStateRuntime(state);
|
|
26
|
-
if (runtime.colorTransformBitmapShader !== undefined)
|
|
27
|
-
return;
|
|
28
|
-
const shaderLoc = compileGlColorTransformProgram(state.gl);
|
|
29
|
-
const shader = createGlColorTransformBitmapShader(shaderLoc, runtime.matrixArray);
|
|
30
|
-
runtime.colorTransformBitmapShader = shader;
|
|
31
|
-
registerGlMaterialShader(state, ColorTransformMaterialKind, shader);
|
|
32
|
-
registerGlMaterialShader(state, UniformColorTransformMaterialKind, shader);
|
|
33
|
-
}
|
|
34
|
-
function compileGlColorTransformProgram(gl) {
|
|
35
|
-
const program = createGlProgram(gl, COLOR_TRANSFORM_VERTEX_SRC, COLOR_TRANSFORM_FRAGMENT_SRC, 'Color-transform bitmap');
|
|
36
|
-
return {
|
|
37
|
-
program,
|
|
38
|
-
locPosition: gl.getAttribLocation(program, 'a_position'),
|
|
39
|
-
locTexCoord: gl.getAttribLocation(program, 'a_texCoord'),
|
|
40
|
-
locMatrix: gl.getUniformLocation(program, 'u_matrix'),
|
|
41
|
-
locAlpha: gl.getUniformLocation(program, 'u_alpha'),
|
|
42
|
-
locColorMultiplier: gl.getUniformLocation(program, 'u_cm'),
|
|
43
|
-
locColorOffset: gl.getUniformLocation(program, 'u_co'),
|
|
44
|
-
locHasColorTransform: gl.getUniformLocation(program, 'u_ct'),
|
|
45
|
-
locTexture: gl.getUniformLocation(program, 'u_texture'),
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
function createGlColorTransformBitmapShader(shaderLoc, matrixArray) {
|
|
49
|
-
return {
|
|
50
|
-
locations: shaderLoc,
|
|
51
|
-
program: shaderLoc.program,
|
|
52
|
-
bind(gl, state, renderProxy) {
|
|
53
|
-
setGlAttributes(gl, shaderLoc);
|
|
54
|
-
setGlMatrixFromTransform(gl, shaderLoc, matrixArray, renderProxy.transform2D, getGlRenderStateRuntime(state).renderTargetViewport ?? state.canvas);
|
|
55
|
-
setGlBaseUniforms(gl, shaderLoc, renderProxy);
|
|
56
|
-
setGlColorTransformUniforms(gl, shaderLoc, renderProxy);
|
|
57
|
-
},
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
function setGlColorTransformUniforms(gl, loc, renderProxy) {
|
|
61
|
-
const colorTransform = getGlRenderProxyColorTransform(renderProxy);
|
|
62
|
-
if (colorTransform === null) {
|
|
63
|
-
gl.uniform1i(loc.locHasColorTransform, 0);
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
gl.uniform1i(loc.locHasColorTransform, 1);
|
|
67
|
-
gl.uniform4f(loc.locColorMultiplier, colorTransform.redMultiplier, colorTransform.greenMultiplier, colorTransform.blueMultiplier, colorTransform.alphaMultiplier);
|
|
68
|
-
gl.uniform4f(loc.locColorOffset, colorTransform.redOffset / 255, colorTransform.greenOffset / 255, colorTransform.blueOffset / 255, colorTransform.alphaOffset / 255);
|
|
69
|
-
}
|
|
70
|
-
const COLOR_TRANSFORM_FRAGMENT_SRC = `#version 300 es
|
|
71
|
-
precision mediump float;
|
|
72
|
-
in vec2 v_texCoord;
|
|
73
|
-
uniform sampler2D u_texture;
|
|
74
|
-
uniform float u_alpha;
|
|
75
|
-
uniform bool u_ct;
|
|
76
|
-
uniform vec4 u_cm,u_co;
|
|
77
|
-
out vec4 fragColor;
|
|
78
|
-
void main(){
|
|
79
|
-
vec4 c=texture(u_texture,v_texCoord);
|
|
80
|
-
if(u_ct&&c.a>0.){
|
|
81
|
-
c.rgb/=c.a;
|
|
82
|
-
c=clamp(c*u_cm+u_co,0.,1.);
|
|
83
|
-
c.rgb*=c.a;
|
|
84
|
-
}
|
|
85
|
-
fragColor=c*clamp(u_alpha,0.,1.);
|
|
86
|
-
}`;
|
|
87
|
-
const COLOR_TRANSFORM_VERTEX_SRC = `#version 300 es
|
|
88
|
-
in vec2 a_position;
|
|
89
|
-
in vec2 a_texCoord;
|
|
90
|
-
uniform mat3 u_matrix;
|
|
91
|
-
out vec2 v_texCoord;
|
|
92
|
-
void main() {
|
|
93
|
-
vec3 pos = u_matrix * vec3(a_position, 1.0);
|
|
94
|
-
gl_Position = vec4(pos.xy, 0.0, 1.0);
|
|
95
|
-
v_texCoord = a_texCoord;
|
|
96
|
-
}`;
|
|
97
|
-
//# sourceMappingURL=glMaterials.js.map
|
package/dist/glMaterials.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"glMaterials.js","sourceRoot":"","sources":["../src/glMaterials.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import type { GlMaterialRenderer, GlRenderState } from '@flighthq/types';
|
|
2
|
-
export declare function registerGlUniformColorTransformMaterial(state: GlRenderState): void;
|
|
3
|
-
export declare const uniformColorTransformGlMaterialRenderer: GlMaterialRenderer;
|
|
4
|
-
//# sourceMappingURL=glUniformColorTransformMaterial.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"glUniformColorTransformMaterial.d.ts","sourceRoot":"","sources":["../src/glUniformColorTransformMaterial.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,aAAa,EAA2C,MAAM,iBAAiB,CAAC;AA6ClH,wBAAgB,uCAAuC,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAElF;AAKD,eAAO,MAAM,uCAAuC,EAAE,kBAyBrD,CAAC"}
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import { createGlProgram } from '@flighthq/render-gl';
|
|
2
|
-
import { registerGlMaterialRenderer } from '@flighthq/render-gl';
|
|
3
|
-
import { getGlRenderStateRuntime } from '@flighthq/render-gl';
|
|
4
|
-
import { UniformColorTransformMaterialKind } from '@flighthq/types';
|
|
5
|
-
import { bindGlQuadBatchBaseAttributes, QUAD_BATCH_VS, setGlQuadBatchWorldAndTexture, useGlQuadBatchProgram, } from './glSpriteBatch';
|
|
6
|
-
const UNIFORM_CT_FS = `#version 300 es
|
|
7
|
-
precision mediump float;
|
|
8
|
-
in vec2 v_texCoord;
|
|
9
|
-
in float v_alpha;
|
|
10
|
-
uniform sampler2D u_texture;
|
|
11
|
-
uniform vec4 u_ctMult;
|
|
12
|
-
uniform vec4 u_ctOff;
|
|
13
|
-
out vec4 fragColor;
|
|
14
|
-
void main() {
|
|
15
|
-
vec4 color = texture(u_texture, v_texCoord) * clamp(v_alpha, 0.0, 1.0);
|
|
16
|
-
if (color.a <= 0.0) discard;
|
|
17
|
-
color = vec4(color.rgb / color.a, color.a);
|
|
18
|
-
color = clamp(color * u_ctMult + u_ctOff, vec4(0.0), vec4(1.0));
|
|
19
|
-
fragColor = vec4(color.rgb * color.a, color.a);
|
|
20
|
-
}`;
|
|
21
|
-
function ensureGlUniformColorTransformShader(state) {
|
|
22
|
-
const runtime = getGlRenderStateRuntime(state);
|
|
23
|
-
if (runtime.uniformColorTransformShader)
|
|
24
|
-
return runtime.uniformColorTransformShader;
|
|
25
|
-
const gl = state.gl;
|
|
26
|
-
const program = createGlProgram(gl, QUAD_BATCH_VS, UNIFORM_CT_FS, 'Uniform color-transform material');
|
|
27
|
-
runtime.uniformColorTransformShader = {
|
|
28
|
-
program,
|
|
29
|
-
locCorner: 0,
|
|
30
|
-
locWorldMatrix: gl.getUniformLocation(program, 'u_world'),
|
|
31
|
-
locTexture: gl.getUniformLocation(program, 'u_texture'),
|
|
32
|
-
locColorMultiplier: gl.getUniformLocation(program, 'u_ctMult'),
|
|
33
|
-
locColorOffset: gl.getUniformLocation(program, 'u_ctOff'),
|
|
34
|
-
};
|
|
35
|
-
return runtime.uniformColorTransformShader;
|
|
36
|
-
}
|
|
37
|
-
export function registerGlUniformColorTransformMaterial(state) {
|
|
38
|
-
registerGlMaterialRenderer(state, UniformColorTransformMaterialKind, uniformColorTransformGlMaterialRenderer);
|
|
39
|
-
}
|
|
40
|
-
// Per-batch color transform: the value lives on the material and uploads as a uniform shared by the
|
|
41
|
-
// whole batch. Uses its own shader (the base vertex shader + a color-transform fragment shader) so
|
|
42
|
-
// the default quad-batch shader carries no color-transform record.
|
|
43
|
-
export const uniformColorTransformGlMaterialRenderer = {
|
|
44
|
-
instanceFloatCount: 0,
|
|
45
|
-
bind(state, material) {
|
|
46
|
-
const shader = ensureGlUniformColorTransformShader(state);
|
|
47
|
-
useGlQuadBatchProgram(state, shader.program);
|
|
48
|
-
setGlQuadBatchWorldAndTexture(state, shader.locWorldMatrix, shader.locTexture);
|
|
49
|
-
const gl = state.gl;
|
|
50
|
-
const ct = material.colorTransform;
|
|
51
|
-
gl.uniform4f(shader.locColorMultiplier, ct.redMultiplier, ct.greenMultiplier, ct.blueMultiplier, ct.alphaMultiplier);
|
|
52
|
-
gl.uniform4f(shader.locColorOffset, ct.redOffset / 255, ct.greenOffset / 255, ct.blueOffset / 255, ct.alphaOffset / 255);
|
|
53
|
-
bindGlQuadBatchBaseAttributes(state, shader.locCorner);
|
|
54
|
-
},
|
|
55
|
-
};
|
|
56
|
-
//# sourceMappingURL=glUniformColorTransformMaterial.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"glUniformColorTransformMaterial.js","sourceRoot":"","sources":["../src/glUniformColorTransformMaterial.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,0BAA0B,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAG9D,OAAO,EAAE,iCAAiC,EAAE,MAAM,iBAAiB,CAAC;AAEpE,OAAO,EACL,6BAA6B,EAC7B,aAAa,EACb,6BAA6B,EAC7B,qBAAqB,GACtB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,aAAa,GAAG;;;;;;;;;;;;;;EAcpB,CAAC;AAEH,SAAS,mCAAmC,CAAC,KAAoB;IAC/D,MAAM,OAAO,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAC/C,IAAI,OAAO,CAAC,2BAA2B;QAAE,OAAO,OAAO,CAAC,2BAA2B,CAAC;IAEpF,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;IACpB,MAAM,OAAO,GAAG,eAAe,CAAC,EAAE,EAAE,aAAa,EAAE,aAAa,EAAE,kCAAkC,CAAC,CAAC;IAEtG,OAAO,CAAC,2BAA2B,GAAG;QACpC,OAAO;QACP,SAAS,EAAE,CAAC;QACZ,cAAc,EAAE,EAAE,CAAC,kBAAkB,CAAC,OAAO,EAAE,SAAS,CAAE;QAC1D,UAAU,EAAE,EAAE,CAAC,kBAAkB,CAAC,OAAO,EAAE,WAAW,CAAE;QACxD,kBAAkB,EAAE,EAAE,CAAC,kBAAkB,CAAC,OAAO,EAAE,UAAU,CAAE;QAC/D,cAAc,EAAE,EAAE,CAAC,kBAAkB,CAAC,OAAO,EAAE,SAAS,CAAE;KAC3D,CAAC;IACF,OAAO,OAAO,CAAC,2BAA2B,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,uCAAuC,CAAC,KAAoB;IAC1E,0BAA0B,CAAC,KAAK,EAAE,iCAAiC,EAAE,uCAAuC,CAAC,CAAC;AAChH,CAAC;AAED,oGAAoG;AACpG,mGAAmG;AACnG,mEAAmE;AACnE,MAAM,CAAC,MAAM,uCAAuC,GAAuB;IACzE,kBAAkB,EAAE,CAAC;IACrB,IAAI,CAAC,KAAoB,EAAE,QAAmC;QAC5D,MAAM,MAAM,GAAG,mCAAmC,CAAC,KAAK,CAAC,CAAC;QAC1D,qBAAqB,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QAC7C,6BAA6B,CAAC,KAAK,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;QAE/E,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,EAAE,GAAI,QAA0C,CAAC,cAAc,CAAC;QACtE,EAAE,CAAC,SAAS,CACV,MAAM,CAAC,kBAAkB,EACzB,EAAE,CAAC,aAAa,EAChB,EAAE,CAAC,eAAe,EAClB,EAAE,CAAC,cAAc,EACjB,EAAE,CAAC,eAAe,CACnB,CAAC;QACF,EAAE,CAAC,SAAS,CACV,MAAM,CAAC,cAAc,EACrB,EAAE,CAAC,SAAS,GAAG,GAAG,EAClB,EAAE,CAAC,WAAW,GAAG,GAAG,EACpB,EAAE,CAAC,UAAU,GAAG,GAAG,EACnB,EAAE,CAAC,WAAW,GAAG,GAAG,CACrB,CAAC;QACF,6BAA6B,CAAC,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IACzD,CAAC;CACF,CAAC"}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import { getGlMaterialRenderer } from '@flighthq/render-gl';
|
|
2
|
-
import { ColorTransformMaterialKind } from '@flighthq/types';
|
|
3
|
-
|
|
4
|
-
import { colorTransformGlMaterialRenderer, registerGlColorTransformMaterial } from './glColorTransformMaterial';
|
|
5
|
-
import { createGlState } from './glTestHelper';
|
|
6
|
-
|
|
7
|
-
function makeColorTransform(redMultiplier: number) {
|
|
8
|
-
return {
|
|
9
|
-
redMultiplier,
|
|
10
|
-
greenMultiplier: 1,
|
|
11
|
-
blueMultiplier: 1,
|
|
12
|
-
alphaMultiplier: 1,
|
|
13
|
-
redOffset: 0,
|
|
14
|
-
greenOffset: 0,
|
|
15
|
-
blueOffset: 0,
|
|
16
|
-
alphaOffset: 0,
|
|
17
|
-
};
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
describe('colorTransformGlMaterialRenderer', () => {
|
|
21
|
-
it('declares 8 per-instance floats', () => {
|
|
22
|
-
expect(colorTransformGlMaterialRenderer.instanceFloatCount).toBe(8);
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
it('packs the supplied material data color transform', () => {
|
|
26
|
-
const out = new Float32Array(8);
|
|
27
|
-
colorTransformGlMaterialRenderer.packInstance!(null as any, makeColorTransform(0.5) as any, out, 0);
|
|
28
|
-
expect(out[0]).toBe(0.5);
|
|
29
|
-
expect(out[3]).toBe(1);
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
it('packs identity when material data is null', () => {
|
|
33
|
-
const out = new Float32Array(8);
|
|
34
|
-
colorTransformGlMaterialRenderer.packInstance!(null as any, null, out, 0);
|
|
35
|
-
expect(Array.from(out)).toEqual([1, 1, 1, 1, 0, 0, 0, 0]);
|
|
36
|
-
});
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
describe('registerGlColorTransformMaterial', () => {
|
|
40
|
-
it('registers the per-instance color transform material renderer', () => {
|
|
41
|
-
const { state } = createGlState();
|
|
42
|
-
registerGlColorTransformMaterial(state);
|
|
43
|
-
expect(getGlMaterialRenderer(state, ColorTransformMaterialKind)).toBe(colorTransformGlMaterialRenderer);
|
|
44
|
-
});
|
|
45
|
-
});
|
package/src/glMaterials.test.ts
DELETED
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
import { getGlRenderStateRuntime } from '@flighthq/render-gl';
|
|
2
|
-
import { ColorTransformMaterialKind, UniformColorTransformMaterialKind } from '@flighthq/types';
|
|
3
|
-
|
|
4
|
-
import { getGlRenderProxyColorTransform, registerGlColorTransformShader } from './glMaterials';
|
|
5
|
-
import { createGlState } from './glTestHelper';
|
|
6
|
-
|
|
7
|
-
describe('getGlRenderProxyColorTransform', () => {
|
|
8
|
-
it('returns null when the node has no material', () => {
|
|
9
|
-
expect(getGlRenderProxyColorTransform({ material: null } as never)).toBeNull();
|
|
10
|
-
});
|
|
11
|
-
|
|
12
|
-
it('returns the value carried on a uniform color transform material', () => {
|
|
13
|
-
const colorTransform = { redMultiplier: 0.5 };
|
|
14
|
-
const node = { material: { kind: UniformColorTransformMaterialKind, colorTransform } } as never;
|
|
15
|
-
expect(getGlRenderProxyColorTransform(node)).toBe(colorTransform);
|
|
16
|
-
});
|
|
17
|
-
|
|
18
|
-
it('returns the per-node material data for a color transform material', () => {
|
|
19
|
-
const colorTransform = { redMultiplier: 0.5 };
|
|
20
|
-
const node = { material: { kind: ColorTransformMaterialKind }, materialData: colorTransform } as never;
|
|
21
|
-
expect(getGlRenderProxyColorTransform(node)).toBe(colorTransform);
|
|
22
|
-
});
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
describe('registerGlColorTransformShader', () => {
|
|
26
|
-
it('registers a color transform shader on the render state', () => {
|
|
27
|
-
const { state } = createGlState();
|
|
28
|
-
|
|
29
|
-
registerGlColorTransformShader(state);
|
|
30
|
-
|
|
31
|
-
expect(getGlRenderStateRuntime(state).colorTransformBitmapShader).toBeDefined();
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
it('does not make the color transform shader the state default shader', () => {
|
|
35
|
-
const { state } = createGlState();
|
|
36
|
-
|
|
37
|
-
registerGlColorTransformShader(state);
|
|
38
|
-
|
|
39
|
-
const runtime = getGlRenderStateRuntime(state);
|
|
40
|
-
expect(runtime.defaultBitmapShader).not.toBe(runtime.colorTransformBitmapShader);
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
it('includes color transform uniform locations', () => {
|
|
44
|
-
const { state } = createGlState();
|
|
45
|
-
|
|
46
|
-
registerGlColorTransformShader(state);
|
|
47
|
-
|
|
48
|
-
const runtime = getGlRenderStateRuntime(state);
|
|
49
|
-
expect(runtime.colorTransformBitmapShader?.locations.locColorMultiplier).toBeDefined();
|
|
50
|
-
expect(runtime.colorTransformBitmapShader?.locations.locColorOffset).toBeDefined();
|
|
51
|
-
expect(runtime.colorTransformBitmapShader?.locations.locHasColorTransform).toBeDefined();
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
it('binds color transform uniforms from the node material data', () => {
|
|
55
|
-
const { state, gl } = createGlState();
|
|
56
|
-
const renderProxy = {
|
|
57
|
-
alpha: 0.75,
|
|
58
|
-
material: { kind: ColorTransformMaterialKind },
|
|
59
|
-
materialData: {
|
|
60
|
-
redMultiplier: 0.5,
|
|
61
|
-
greenMultiplier: 0.25,
|
|
62
|
-
blueMultiplier: 1.5,
|
|
63
|
-
alphaMultiplier: 0.8,
|
|
64
|
-
redOffset: 10,
|
|
65
|
-
greenOffset: 20,
|
|
66
|
-
blueOffset: 30,
|
|
67
|
-
alphaOffset: 40,
|
|
68
|
-
},
|
|
69
|
-
transform2D: { a: 1, b: 0, c: 0, d: 1, tx: 0, ty: 0 },
|
|
70
|
-
};
|
|
71
|
-
|
|
72
|
-
registerGlColorTransformShader(state);
|
|
73
|
-
const runtime = getGlRenderStateRuntime(state);
|
|
74
|
-
runtime.colorTransformBitmapShader!.bind(gl, state, renderProxy as never);
|
|
75
|
-
|
|
76
|
-
const loc = runtime.colorTransformBitmapShader!.locations;
|
|
77
|
-
expect(gl.uniform1i).toHaveBeenCalledWith(loc.locHasColorTransform, 1);
|
|
78
|
-
expect(gl.uniform4f).toHaveBeenCalledWith(loc.locColorMultiplier, 0.5, 0.25, 1.5, 0.8);
|
|
79
|
-
expect(gl.uniform4f).toHaveBeenCalledWith(loc.locColorOffset, 10 / 255, 20 / 255, 30 / 255, 40 / 255);
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
it('does not replace an existing color transform shader', () => {
|
|
83
|
-
const { state } = createGlState();
|
|
84
|
-
|
|
85
|
-
registerGlColorTransformShader(state);
|
|
86
|
-
const first = getGlRenderStateRuntime(state).colorTransformBitmapShader;
|
|
87
|
-
registerGlColorTransformShader(state);
|
|
88
|
-
|
|
89
|
-
expect(getGlRenderStateRuntime(state).colorTransformBitmapShader).toBe(first);
|
|
90
|
-
});
|
|
91
|
-
});
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { getGlMaterialRenderer } from '@flighthq/render-gl';
|
|
2
|
-
import { UniformColorTransformMaterialKind } from '@flighthq/types';
|
|
3
|
-
|
|
4
|
-
import { createGlState } from './glTestHelper';
|
|
5
|
-
import {
|
|
6
|
-
registerGlUniformColorTransformMaterial,
|
|
7
|
-
uniformColorTransformGlMaterialRenderer,
|
|
8
|
-
} from './glUniformColorTransformMaterial';
|
|
9
|
-
|
|
10
|
-
describe('registerGlUniformColorTransformMaterial', () => {
|
|
11
|
-
it('registers the uniform color transform material renderer', () => {
|
|
12
|
-
const { state } = createGlState();
|
|
13
|
-
registerGlUniformColorTransformMaterial(state);
|
|
14
|
-
expect(getGlMaterialRenderer(state, UniformColorTransformMaterialKind)).toBe(
|
|
15
|
-
uniformColorTransformGlMaterialRenderer,
|
|
16
|
-
);
|
|
17
|
-
});
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
describe('uniformColorTransformGlMaterialRenderer', () => {
|
|
21
|
-
it('declares no per-instance float data', () => {
|
|
22
|
-
expect(uniformColorTransformGlMaterialRenderer.instanceFloatCount).toBe(0);
|
|
23
|
-
});
|
|
24
|
-
});
|