@flighthq/displayobject-gl 0.1.0 → 0.2.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 (60) hide show
  1. package/dist/enableGlColorAdjustmentGuards.d.ts +4 -0
  2. package/dist/enableGlColorAdjustmentGuards.d.ts.map +1 -0
  3. package/dist/enableGlColorAdjustmentGuards.js +21 -0
  4. package/dist/enableGlColorAdjustmentGuards.js.map +1 -0
  5. package/dist/glBitmap.d.ts.map +1 -1
  6. package/dist/glBitmap.js +2 -1
  7. package/dist/glBitmap.js.map +1 -1
  8. package/dist/glCache.d.ts.map +1 -1
  9. package/dist/glCache.js +4 -1
  10. package/dist/glCache.js.map +1 -1
  11. package/dist/glColorAdjustment.d.ts +3 -0
  12. package/dist/glColorAdjustment.d.ts.map +1 -0
  13. package/dist/glColorAdjustment.js +279 -0
  14. package/dist/glColorAdjustment.js.map +1 -0
  15. package/dist/glQuadBatch.d.ts.map +1 -1
  16. package/dist/glQuadBatch.js +8 -5
  17. package/dist/glQuadBatch.js.map +1 -1
  18. package/dist/glRichText.js +2 -1
  19. package/dist/glRichText.js.map +1 -1
  20. package/dist/glShape.d.ts.map +1 -1
  21. package/dist/glShape.js +2 -1
  22. package/dist/glShape.js.map +1 -1
  23. package/dist/glSpriteBatch.d.ts +2 -2
  24. package/dist/glSpriteBatch.d.ts.map +1 -1
  25. package/dist/glSpriteBatch.js +42 -19
  26. package/dist/glSpriteBatch.js.map +1 -1
  27. package/dist/glSpriteRenderer.d.ts.map +1 -1
  28. package/dist/glSpriteRenderer.js +2 -1
  29. package/dist/glSpriteRenderer.js.map +1 -1
  30. package/dist/glTextLabel.d.ts.map +1 -1
  31. package/dist/glTextLabel.js +3 -1
  32. package/dist/glTextLabel.js.map +1 -1
  33. package/dist/glTilemap.d.ts.map +1 -1
  34. package/dist/glTilemap.js +8 -4
  35. package/dist/glTilemap.js.map +1 -1
  36. package/dist/index.d.ts +2 -3
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +2 -3
  39. package/dist/index.js.map +1 -1
  40. package/package.json +22 -15
  41. package/src/enableGlColorAdjustmentGuards.test.ts +76 -0
  42. package/src/glColorAdjustment.test.ts +165 -0
  43. package/src/glRichText.test.ts +7 -2
  44. package/src/glSpriteBatch.test.ts +58 -1
  45. package/src/glVelocity.test.ts +2 -1
  46. package/dist/glColorTransformMaterial.d.ts +0 -4
  47. package/dist/glColorTransformMaterial.d.ts.map +0 -1
  48. package/dist/glColorTransformMaterial.js +0 -116
  49. package/dist/glColorTransformMaterial.js.map +0 -1
  50. package/dist/glMaterials.d.ts +0 -4
  51. package/dist/glMaterials.d.ts.map +0 -1
  52. package/dist/glMaterials.js +0 -97
  53. package/dist/glMaterials.js.map +0 -1
  54. package/dist/glUniformColorTransformMaterial.d.ts +0 -4
  55. package/dist/glUniformColorTransformMaterial.d.ts.map +0 -1
  56. package/dist/glUniformColorTransformMaterial.js +0 -56
  57. package/dist/glUniformColorTransformMaterial.js.map +0 -1
  58. package/src/glColorTransformMaterial.test.ts +0 -45
  59. package/src/glMaterials.test.ts +0 -91
  60. package/src/glUniformColorTransformMaterial.test.ts +0 -24
@@ -0,0 +1,165 @@
1
+ import { getGlRenderStateRuntime } from '@flighthq/render-gl';
2
+ import type { ColorTransform } from '@flighthq/types';
3
+
4
+ import { enableGlColorAdjustment } from './glColorAdjustment';
5
+ import { defaultGlMaterialRenderer } from './glDefaultMaterial';
6
+ import { flushGlSpriteBatch, prepareGlSpriteBatchWrite, recordGlSpriteBatchColorTransform } from './glSpriteBatch';
7
+ import { createGlState } from './glTestHelper';
8
+
9
+ function makeTexture(): HTMLImageElement {
10
+ return document.createElement('img');
11
+ }
12
+
13
+ function ct(
14
+ redMultiplier = 1,
15
+ greenMultiplier = 1,
16
+ blueMultiplier = 1,
17
+ alphaMultiplier = 1,
18
+ redOffset = 0,
19
+ greenOffset = 0,
20
+ blueOffset = 0,
21
+ alphaOffset = 0,
22
+ ): ColorTransform {
23
+ return {
24
+ redMultiplier,
25
+ greenMultiplier,
26
+ blueMultiplier,
27
+ alphaMultiplier,
28
+ redOffset,
29
+ greenOffset,
30
+ blueOffset,
31
+ alphaOffset,
32
+ } as ColorTransform;
33
+ }
34
+
35
+ const CT_MODE_NONE = 0;
36
+ const CT_MODE_UNIFORM = 1;
37
+ const CT_MODE_PER_INSTANCE = 2;
38
+
39
+ describe('enableGlColorAdjustment', () => {
40
+ it('installs the fold so recorded tints drive the color-adjustment state machine', () => {
41
+ const { state } = createGlState();
42
+ const runtime = getGlRenderStateRuntime(state);
43
+ enableGlColorAdjustment(state);
44
+ expect(runtime.glColorAdjustmentFold).not.toBeNull();
45
+ expect(runtime.glColorAdjustmentFold).toBeDefined();
46
+ });
47
+
48
+ it('is idempotent', () => {
49
+ const { state } = createGlState();
50
+ const runtime = getGlRenderStateRuntime(state);
51
+ enableGlColorAdjustment(state);
52
+ const fold = runtime.glColorAdjustmentFold;
53
+ enableGlColorAdjustment(state);
54
+ expect(runtime.glColorAdjustmentFold).toBe(fold);
55
+ });
56
+
57
+ it('stays untinted (mode NONE) when no instance carries a color transform', () => {
58
+ const { state } = createGlState();
59
+ const runtime = getGlRenderStateRuntime(state);
60
+ enableGlColorAdjustment(state);
61
+ recordGlSpriteBatchColorTransform(state, null, 0);
62
+ recordGlSpriteBatchColorTransform(state, null, 1);
63
+ expect(runtime.spriteBatchColorTransformMode).toBe(CT_MODE_NONE);
64
+ });
65
+
66
+ it('uses one whole-batch uniform when every instance shares one tint', () => {
67
+ const { state } = createGlState();
68
+ const runtime = getGlRenderStateRuntime(state);
69
+ enableGlColorAdjustment(state);
70
+ const tint = ct(0.5);
71
+ recordGlSpriteBatchColorTransform(state, tint, 0);
72
+ recordGlSpriteBatchColorTransform(state, tint, 1);
73
+ recordGlSpriteBatchColorTransform(state, tint, 2);
74
+ expect(runtime.spriteBatchColorTransformMode).toBe(CT_MODE_UNIFORM);
75
+ expect(runtime.spriteBatchUniformColorTransform).toBe(tint);
76
+ });
77
+
78
+ it('keeps the uniform path for a distinct-but-equal tint', () => {
79
+ const { state } = createGlState();
80
+ const runtime = getGlRenderStateRuntime(state);
81
+ enableGlColorAdjustment(state);
82
+ recordGlSpriteBatchColorTransform(state, ct(0.5), 0);
83
+ recordGlSpriteBatchColorTransform(state, ct(0.5), 1);
84
+ expect(runtime.spriteBatchColorTransformMode).toBe(CT_MODE_UNIFORM);
85
+ });
86
+
87
+ it('promotes to per-instance (never splits) when tints diverge, back-filling the earlier tint', () => {
88
+ const { state } = createGlState();
89
+ const runtime = getGlRenderStateRuntime(state);
90
+ enableGlColorAdjustment(state);
91
+ recordGlSpriteBatchColorTransform(state, ct(0.5), 0);
92
+ recordGlSpriteBatchColorTransform(state, ct(0.25), 1);
93
+ expect(runtime.spriteBatchColorTransformMode).toBe(CT_MODE_PER_INSTANCE);
94
+ expect(runtime.spriteBatchColorTransformData![0]).toBe(0.5);
95
+ expect(runtime.spriteBatchColorTransformData![8]).toBe(0.25);
96
+ });
97
+
98
+ it('promotes with identity fill when a tinted instance follows an untinted one', () => {
99
+ const { state } = createGlState();
100
+ const runtime = getGlRenderStateRuntime(state);
101
+ enableGlColorAdjustment(state);
102
+ recordGlSpriteBatchColorTransform(state, null, 0);
103
+ recordGlSpriteBatchColorTransform(state, ct(0.5), 1);
104
+ expect(runtime.spriteBatchColorTransformMode).toBe(CT_MODE_PER_INSTANCE);
105
+ expect(runtime.spriteBatchColorTransformData![0]).toBe(1);
106
+ expect(runtime.spriteBatchColorTransformData![8]).toBe(0.5);
107
+ });
108
+
109
+ it('writes identity for an untinted instance once the batch is per-instance', () => {
110
+ const { state } = createGlState();
111
+ const runtime = getGlRenderStateRuntime(state);
112
+ enableGlColorAdjustment(state);
113
+ recordGlSpriteBatchColorTransform(state, ct(0.5), 0);
114
+ recordGlSpriteBatchColorTransform(state, ct(0.25), 1);
115
+ recordGlSpriteBatchColorTransform(state, null, 2);
116
+ expect(runtime.spriteBatchColorTransformData![16]).toBe(1);
117
+ expect(runtime.spriteBatchColorTransformData![20]).toBe(0);
118
+ });
119
+
120
+ it('normalizes color offsets by 255', () => {
121
+ const { state } = createGlState();
122
+ const runtime = getGlRenderStateRuntime(state);
123
+ enableGlColorAdjustment(state);
124
+ recordGlSpriteBatchColorTransform(state, ct(1, 1, 1, 1, 255, 0, 0, 0), 0);
125
+ recordGlSpriteBatchColorTransform(state, ct(0.5), 1);
126
+ expect(runtime.spriteBatchColorTransformData![4]).toBe(1);
127
+ });
128
+
129
+ it('drives the uniform color-transform shader on flush', () => {
130
+ const { state, gl } = createGlState();
131
+ const runtime = getGlRenderStateRuntime(state);
132
+ enableGlColorAdjustment(state);
133
+ prepareGlSpriteBatchWrite(state, makeTexture(), null, null, defaultGlMaterialRenderer, 1);
134
+ recordGlSpriteBatchColorTransform(state, ct(0.5), 0);
135
+ runtime.spriteBatchCount = 1;
136
+ flushGlSpriteBatch(state);
137
+ expect(gl.uniform4f).toHaveBeenCalled();
138
+ expect(gl.drawElementsInstanced).toHaveBeenCalled();
139
+ });
140
+
141
+ it('uploads a per-instance color-transform buffer on flush when tints vary', () => {
142
+ const { state, gl } = createGlState();
143
+ const runtime = getGlRenderStateRuntime(state);
144
+ enableGlColorAdjustment(state);
145
+ prepareGlSpriteBatchWrite(state, makeTexture(), null, null, defaultGlMaterialRenderer, 2);
146
+ recordGlSpriteBatchColorTransform(state, ct(0.5), 0);
147
+ recordGlSpriteBatchColorTransform(state, ct(0.25), 1);
148
+ runtime.spriteBatchCount = 2;
149
+ flushGlSpriteBatch(state);
150
+ expect(runtime.spriteBatchColorTransformBuffer).not.toBeNull();
151
+ expect(gl.drawElementsInstanced).toHaveBeenCalledWith(expect.anything(), 6, expect.anything(), 0, 2);
152
+ });
153
+
154
+ it('leaves the lean base shader untouched for an untinted batch on flush', () => {
155
+ const { state, gl } = createGlState();
156
+ const runtime = getGlRenderStateRuntime(state);
157
+ enableGlColorAdjustment(state);
158
+ prepareGlSpriteBatchWrite(state, makeTexture(), null, null, defaultGlMaterialRenderer, 1);
159
+ recordGlSpriteBatchColorTransform(state, null, 0);
160
+ runtime.spriteBatchCount = 1;
161
+ flushGlSpriteBatch(state);
162
+ expect(runtime.spriteBatchColorTransformBuffer ?? null).toBeNull();
163
+ expect(gl.drawElementsInstanced).toHaveBeenCalled();
164
+ });
165
+ });
@@ -85,10 +85,15 @@ describe('drawGlRichText', () => {
85
85
  expect(gl.drawElements).toHaveBeenCalled();
86
86
  });
87
87
 
88
- it('draws resolved htmlText spans', () => {
88
+ it('draws resolved multi-format spans', () => {
89
89
  const { state, gl } = createGlState();
90
90
  const renderProxy = makeRichTextNode();
91
- (renderProxy.source as RichText).data.htmlText = '<b>Bold</b><font color="#00ff00">Green</font>';
91
+ const node = renderProxy.source as RichText;
92
+ node.data.text = 'BoldGreen';
93
+ node.data.textFormatRanges = [
94
+ { start: 0, end: 4, format: { bold: true } },
95
+ { start: 4, end: 9, format: { color: 0x00ff00 } },
96
+ ];
92
97
  drawGlRichText(state, renderProxy);
93
98
  expect(gl.drawElements).toHaveBeenCalled();
94
99
  });
@@ -1,6 +1,7 @@
1
1
  import { getGlRenderStateRuntime } from '@flighthq/render-gl';
2
- import type { Material } from '@flighthq/types';
2
+ import type { ColorTransform, Material } from '@flighthq/types';
3
3
 
4
+ import { enableGlColorAdjustment } from './glColorAdjustment';
4
5
  import { defaultGlMaterialRenderer } from './glDefaultMaterial';
5
6
  import {
6
7
  bindGlQuadBatchBaseAttributes,
@@ -8,6 +9,7 @@ import {
8
9
  flushGlSpriteBatch,
9
10
  packGlSpriteBatchMaterialInstance,
10
11
  prepareGlSpriteBatchWrite,
12
+ recordGlSpriteBatchColorTransform,
11
13
  setGlQuadBatchWorldAndTexture,
12
14
  useGlQuadBatchProgram,
13
15
  } from './glSpriteBatch';
@@ -21,6 +23,31 @@ function makeMaterial(): Material {
21
23
  return { kind: 'TestMaterial' } as Material;
22
24
  }
23
25
 
26
+ function ct(
27
+ redMultiplier = 1,
28
+ greenMultiplier = 1,
29
+ blueMultiplier = 1,
30
+ alphaMultiplier = 1,
31
+ redOffset = 0,
32
+ greenOffset = 0,
33
+ blueOffset = 0,
34
+ alphaOffset = 0,
35
+ ): ColorTransform {
36
+ return {
37
+ redMultiplier,
38
+ greenMultiplier,
39
+ blueMultiplier,
40
+ alphaMultiplier,
41
+ redOffset,
42
+ greenOffset,
43
+ blueOffset,
44
+ alphaOffset,
45
+ } as ColorTransform;
46
+ }
47
+
48
+ const CT_MODE_NONE = 0;
49
+ const CT_MODE_UNIFORM = 1;
50
+
24
51
  describe('bindGlQuadBatchBaseAttributes', () => {
25
52
  it('sets up the corner and base instance attribute pointers', () => {
26
53
  const { state, gl } = createGlState();
@@ -133,6 +160,36 @@ describe('prepareGlSpriteBatchWrite', () => {
133
160
  });
134
161
  });
135
162
 
163
+ describe('recordGlSpriteBatchColorTransform', () => {
164
+ it('skips the tint (draws untinted) and records no fold state when color adjustment is not enabled', () => {
165
+ const { state, gl } = createGlState();
166
+ const runtime = getGlRenderStateRuntime(state);
167
+ prepareGlSpriteBatchWrite(state, makeTexture(), null, null, defaultGlMaterialRenderer, 1);
168
+ recordGlSpriteBatchColorTransform(state, ct(0.5), 0);
169
+ runtime.spriteBatchCount = 1;
170
+ // No fold installed → the CT mode stays uninitialized and no CT program is bound.
171
+ expect(runtime.spriteBatchColorTransformMode ?? CT_MODE_NONE).toBe(CT_MODE_NONE);
172
+ flushGlSpriteBatch(state);
173
+ expect(gl.uniform4f).not.toHaveBeenCalled();
174
+ expect(gl.drawElementsInstanced).toHaveBeenCalled();
175
+ });
176
+
177
+ it('is a no-op for an untinted instance whether or not the fold is enabled', () => {
178
+ const { state } = createGlState();
179
+ const runtime = getGlRenderStateRuntime(state);
180
+ expect(() => recordGlSpriteBatchColorTransform(state, null, 0)).not.toThrow();
181
+ expect(runtime.spriteBatchColorTransformMode ?? CT_MODE_NONE).toBe(CT_MODE_NONE);
182
+ });
183
+
184
+ it('delegates to the installed fold when color adjustment is enabled', () => {
185
+ const { state } = createGlState();
186
+ const runtime = getGlRenderStateRuntime(state);
187
+ enableGlColorAdjustment(state);
188
+ recordGlSpriteBatchColorTransform(state, ct(0.5), 0);
189
+ expect(runtime.spriteBatchColorTransformMode).toBe(CT_MODE_UNIFORM);
190
+ });
191
+ });
192
+
136
193
  describe('setGlQuadBatchWorldAndTexture', () => {
137
194
  it('uploads the world matrix and texture unit', () => {
138
195
  const { state, gl } = createGlState();
@@ -1,5 +1,6 @@
1
1
  import { createDisplayObject } from '@flighthq/displayobject';
2
- import { createParticleEmitter, createQuadBatch, getQuadBatchRuntime, reserveParticleEmitter } from '@flighthq/sprite';
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';
@@ -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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"}
@@ -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"}
@@ -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
@@ -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
- });