@flighthq/displayobject-gl 0.1.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 (143) hide show
  1. package/dist/glBitmap.d.ts +4 -0
  2. package/dist/glBitmap.d.ts.map +1 -0
  3. package/dist/glBitmap.js +106 -0
  4. package/dist/glBitmap.js.map +1 -0
  5. package/dist/glCache.d.ts +30 -0
  6. package/dist/glCache.d.ts.map +1 -0
  7. package/dist/glCache.js +185 -0
  8. package/dist/glCache.js.map +1 -0
  9. package/dist/glClip.d.ts +3 -0
  10. package/dist/glClip.d.ts.map +1 -0
  11. package/dist/glClip.js +46 -0
  12. package/dist/glClip.js.map +1 -0
  13. package/dist/glClipContours.d.ts +4 -0
  14. package/dist/glClipContours.d.ts.map +1 -0
  15. package/dist/glClipContours.js +148 -0
  16. package/dist/glClipContours.js.map +1 -0
  17. package/dist/glClipRectangle.d.ts +4 -0
  18. package/dist/glClipRectangle.d.ts.map +1 -0
  19. package/dist/glClipRectangle.js +68 -0
  20. package/dist/glClipRectangle.js.map +1 -0
  21. package/dist/glColorTransformMaterial.d.ts +4 -0
  22. package/dist/glColorTransformMaterial.d.ts.map +1 -0
  23. package/dist/glColorTransformMaterial.js +116 -0
  24. package/dist/glColorTransformMaterial.js.map +1 -0
  25. package/dist/glDefaultMaterial.d.ts +4 -0
  26. package/dist/glDefaultMaterial.d.ts.map +1 -0
  27. package/dist/glDefaultMaterial.js +20 -0
  28. package/dist/glDefaultMaterial.js.map +1 -0
  29. package/dist/glDisplayObject.d.ts +5 -0
  30. package/dist/glDisplayObject.d.ts.map +1 -0
  31. package/dist/glDisplayObject.js +41 -0
  32. package/dist/glDisplayObject.js.map +1 -0
  33. package/dist/glDisplayObjectRegistration.d.ts +25 -0
  34. package/dist/glDisplayObjectRegistration.d.ts.map +1 -0
  35. package/dist/glDisplayObjectRegistration.js +51 -0
  36. package/dist/glDisplayObjectRegistration.js.map +1 -0
  37. package/dist/glMaterials.d.ts +4 -0
  38. package/dist/glMaterials.d.ts.map +1 -0
  39. package/dist/glMaterials.js +97 -0
  40. package/dist/glMaterials.js.map +1 -0
  41. package/dist/glParticleEmitter.d.ts +4 -0
  42. package/dist/glParticleEmitter.d.ts.map +1 -0
  43. package/dist/glParticleEmitter.js +258 -0
  44. package/dist/glParticleEmitter.js.map +1 -0
  45. package/dist/glQuadBatch.d.ts +3 -0
  46. package/dist/glQuadBatch.d.ts.map +1 -0
  47. package/dist/glQuadBatch.js +88 -0
  48. package/dist/glQuadBatch.js.map +1 -0
  49. package/dist/glRichText.d.ts +9 -0
  50. package/dist/glRichText.d.ts.map +1 -0
  51. package/dist/glRichText.js +149 -0
  52. package/dist/glRichText.js.map +1 -0
  53. package/dist/glScale9Mapper.d.ts +3 -0
  54. package/dist/glScale9Mapper.d.ts.map +1 -0
  55. package/dist/glScale9Mapper.js +37 -0
  56. package/dist/glScale9Mapper.js.map +1 -0
  57. package/dist/glScale9Shape.d.ts +9 -0
  58. package/dist/glScale9Shape.d.ts.map +1 -0
  59. package/dist/glScale9Shape.js +118 -0
  60. package/dist/glScale9Shape.js.map +1 -0
  61. package/dist/glShape.d.ts +4 -0
  62. package/dist/glShape.d.ts.map +1 -0
  63. package/dist/glShape.js +125 -0
  64. package/dist/glShape.js.map +1 -0
  65. package/dist/glShapeMesh.d.ts +9 -0
  66. package/dist/glShapeMesh.d.ts.map +1 -0
  67. package/dist/glShapeMesh.js +90 -0
  68. package/dist/glShapeMesh.js.map +1 -0
  69. package/dist/glSprite.d.ts +3 -0
  70. package/dist/glSprite.d.ts.map +1 -0
  71. package/dist/glSprite.js +28 -0
  72. package/dist/glSprite.js.map +1 -0
  73. package/dist/glSpriteBatch.d.ts +11 -0
  74. package/dist/glSpriteBatch.d.ts.map +1 -0
  75. package/dist/glSpriteBatch.js +241 -0
  76. package/dist/glSpriteBatch.js.map +1 -0
  77. package/dist/glSpriteRenderer.d.ts +3 -0
  78. package/dist/glSpriteRenderer.d.ts.map +1 -0
  79. package/dist/glSpriteRenderer.js +50 -0
  80. package/dist/glSpriteRenderer.js.map +1 -0
  81. package/dist/glTestHelper.d.ts +9 -0
  82. package/dist/glTestHelper.d.ts.map +1 -0
  83. package/dist/glTestHelper.js +17 -0
  84. package/dist/glTestHelper.js.map +1 -0
  85. package/dist/glTextInput.d.ts +4 -0
  86. package/dist/glTextInput.d.ts.map +1 -0
  87. package/dist/glTextInput.js +43 -0
  88. package/dist/glTextInput.js.map +1 -0
  89. package/dist/glTextLabel.d.ts +4 -0
  90. package/dist/glTextLabel.d.ts.map +1 -0
  91. package/dist/glTextLabel.js +130 -0
  92. package/dist/glTextLabel.js.map +1 -0
  93. package/dist/glTilemap.d.ts +3 -0
  94. package/dist/glTilemap.d.ts.map +1 -0
  95. package/dist/glTilemap.js +74 -0
  96. package/dist/glTilemap.js.map +1 -0
  97. package/dist/glUniformColorTransformMaterial.d.ts +4 -0
  98. package/dist/glUniformColorTransformMaterial.d.ts.map +1 -0
  99. package/dist/glUniformColorTransformMaterial.js +56 -0
  100. package/dist/glUniformColorTransformMaterial.js.map +1 -0
  101. package/dist/glVelocity.d.ts +22 -0
  102. package/dist/glVelocity.d.ts.map +1 -0
  103. package/dist/glVelocity.js +319 -0
  104. package/dist/glVelocity.js.map +1 -0
  105. package/dist/glVideo.d.ts +6 -0
  106. package/dist/glVideo.d.ts.map +1 -0
  107. package/dist/glVideo.js +60 -0
  108. package/dist/glVideo.js.map +1 -0
  109. package/dist/index.d.ts +28 -0
  110. package/dist/index.d.ts.map +1 -0
  111. package/dist/index.js +29 -0
  112. package/dist/index.js.map +1 -0
  113. package/dist/moduleMockTestHelper.d.ts +15 -0
  114. package/dist/moduleMockTestHelper.d.ts.map +1 -0
  115. package/dist/moduleMockTestHelper.js +25 -0
  116. package/dist/moduleMockTestHelper.js.map +1 -0
  117. package/package.json +51 -0
  118. package/src/glBitmap.test.ts +128 -0
  119. package/src/glCache.test.ts +230 -0
  120. package/src/glClip.test.ts +101 -0
  121. package/src/glClipContours.test.ts +61 -0
  122. package/src/glClipRectangle.test.ts +47 -0
  123. package/src/glColorTransformMaterial.test.ts +45 -0
  124. package/src/glDefaultMaterial.test.ts +19 -0
  125. package/src/glDisplayObject.test.ts +85 -0
  126. package/src/glDisplayObjectRegistration.test.ts +130 -0
  127. package/src/glMaterials.test.ts +91 -0
  128. package/src/glParticleEmitter.test.ts +98 -0
  129. package/src/glQuadBatch.test.ts +132 -0
  130. package/src/glRichText.test.ts +135 -0
  131. package/src/glScale9Mapper.test.ts +20 -0
  132. package/src/glScale9Shape.test.ts +90 -0
  133. package/src/glShape.test.ts +115 -0
  134. package/src/glShapeMesh.test.ts +64 -0
  135. package/src/glSprite.test.ts +79 -0
  136. package/src/glSpriteBatch.test.ts +153 -0
  137. package/src/glSpriteRenderer.test.ts +75 -0
  138. package/src/glTextInput.test.ts +51 -0
  139. package/src/glTextLabel.test.ts +151 -0
  140. package/src/glTilemap.test.ts +127 -0
  141. package/src/glUniformColorTransformMaterial.test.ts +24 -0
  142. package/src/glVelocity.test.ts +155 -0
  143. package/src/glVideo.test.ts +65 -0
@@ -0,0 +1,118 @@
1
+ import { mapCanvasScale9ShapeCommands, renderCanvasShapeCommands } from '@flighthq/displayobject-canvas';
2
+ import { getNodeLocalBoundsRectangle, getNodeLocalContentRevision } from '@flighthq/node';
3
+ import { createGlTexture, drawGlQuad, updateGlTexture, useGlProgram } from '@flighthq/render-gl';
4
+ import { getGlRenderStateRuntime } from '@flighthq/render-gl';
5
+ import { setGlBaseUniforms, setGlMatrixFromValues } from '@flighthq/render-gl';
6
+ import { buildGlScale9Mapper } from './glScale9Mapper';
7
+ import { drawGlShape } from './glShape';
8
+ import { flushGlSpriteBatch } from './glSpriteBatch';
9
+ const _remappedCommands = [];
10
+ const _remappedPathData = [];
11
+ export function createGlScale9ShapeData(state, _source) {
12
+ const canvas = document.createElement('canvas');
13
+ canvas.width = 1;
14
+ canvas.height = 1;
15
+ const ctx = canvas.getContext('2d');
16
+ const texture = createGlTexture(state);
17
+ return {
18
+ canvas,
19
+ ctx,
20
+ lastH: 0,
21
+ lastScaleX: -1,
22
+ lastScaleY: -1,
23
+ lastContentId: -1,
24
+ lastW: 0,
25
+ texture,
26
+ };
27
+ }
28
+ // Scale9 owns its texture directly (allocated in createData), so free it on teardown.
29
+ export function destroyGlScale9ShapeData(state, data) {
30
+ const { texture } = data;
31
+ state.gl.deleteTexture(texture);
32
+ }
33
+ export function drawGlScale9Shape(state, renderProxy) {
34
+ const runtime = getGlRenderStateRuntime(state);
35
+ flushGlSpriteBatch(state);
36
+ const source = renderProxy.source;
37
+ const { commands, scale9Grid } = source.data;
38
+ const version = getNodeLocalContentRevision(source);
39
+ if (commands.length === 0)
40
+ return;
41
+ if (renderProxy.rendererData === null)
42
+ return;
43
+ const bounds = getNodeLocalBoundsRectangle(source);
44
+ const mapper = buildGlScale9Mapper(bounds, scale9Grid, source.scaleX, source.scaleY);
45
+ if (mapper === null) {
46
+ drawGlShape(state, renderProxy);
47
+ return;
48
+ }
49
+ const shapeData = renderProxy.rendererData;
50
+ const w = Math.ceil(bounds.width * source.scaleX);
51
+ const h = Math.ceil(bounds.height * source.scaleY);
52
+ if (w <= 0 || h <= 0)
53
+ return;
54
+ if (version !== shapeData.lastContentId ||
55
+ w !== shapeData.lastW ||
56
+ h !== shapeData.lastH ||
57
+ source.scaleX !== shapeData.lastScaleX ||
58
+ source.scaleY !== shapeData.lastScaleY) {
59
+ shapeData.canvas.width = w;
60
+ shapeData.canvas.height = h;
61
+ const ctx = shapeData.ctx;
62
+ ctx.clearRect(0, 0, w, h);
63
+ ctx.save();
64
+ remapGlScale9Commands(_remappedCommands, commands, mapper);
65
+ ctx.translate(-bounds.x, -bounds.y);
66
+ renderCanvasShapeCommands(ctx, _remappedCommands);
67
+ ctx.restore();
68
+ updateGlTexture(state, shapeData.texture, shapeData.canvas);
69
+ shapeData.lastH = h;
70
+ shapeData.lastScaleX = source.scaleX;
71
+ shapeData.lastScaleY = source.scaleY;
72
+ shapeData.lastContentId = version;
73
+ shapeData.lastW = w;
74
+ }
75
+ useGlProgram(state);
76
+ const gl = state.gl;
77
+ if (runtime.currentTexture !== shapeData.texture) {
78
+ gl.bindTexture(gl.TEXTURE_2D, shapeData.texture);
79
+ runtime.currentTexture = shapeData.texture;
80
+ }
81
+ const { shaderLoc, matrixArray } = runtime;
82
+ setGlBaseUniforms(gl, shaderLoc, renderProxy);
83
+ const t = renderProxy.transform2D;
84
+ setStrippedGlMatrixFromValues(gl, shaderLoc, matrixArray, t, source.scaleX, source.scaleY, runtime.renderTargetViewport ?? state.canvas);
85
+ drawGlQuad(state, 0, 0, w, h, 0, 0, 1, 1);
86
+ }
87
+ export function drawGlScale9ShapeMask(state, data) {
88
+ drawGlScale9Shape(state, data);
89
+ }
90
+ export function remapGlScale9Commands(out, source, mapper) {
91
+ mapCanvasScale9ShapeCommands(out, source, mapper);
92
+ let i = 0;
93
+ while (i < out.length) {
94
+ const key = out[i];
95
+ const argCount = out[i + 1];
96
+ if (key === 'drawPath') {
97
+ const pathData = out[i + 3];
98
+ _remappedPathData.length = pathData.length;
99
+ for (let k = 0; k < pathData.length; k++)
100
+ _remappedPathData[k] = pathData[k];
101
+ out[i + 3] = _remappedPathData;
102
+ }
103
+ i += argCount + 2;
104
+ }
105
+ }
106
+ export const defaultGlScale9ShapeRenderer = {
107
+ createData: createGlScale9ShapeData,
108
+ destroyData: destroyGlScale9ShapeData,
109
+ submit: drawGlScale9Shape,
110
+ };
111
+ function setStrippedGlMatrixFromValues(gl, loc, m, t, scaleX, scaleY, viewport) {
112
+ const a = scaleX !== 0 ? t.a / scaleX : t.a;
113
+ const b = scaleX !== 0 ? t.b / scaleX : t.b;
114
+ const c = scaleY !== 0 ? t.c / scaleY : t.c;
115
+ const d = scaleY !== 0 ? t.d / scaleY : t.d;
116
+ setGlMatrixFromValues(gl, loc, m, a, b, c, d, t.tx, t.ty, viewport);
117
+ }
118
+ //# sourceMappingURL=glScale9Shape.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glScale9Shape.js","sourceRoot":"","sources":["../src/glScale9Shape.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { DisplayObjectRenderer, GlRenderState, RenderProxy2D } from '@flighthq/types';
2
+ export declare function drawGlShape(state: GlRenderState, renderProxy: RenderProxy2D): void;
3
+ export declare const defaultGlShapeRenderer: DisplayObjectRenderer;
4
+ //# sourceMappingURL=glShape.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glShape.d.ts","sourceRoot":"","sources":["../src/glShape.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,qBAAqB,EACrB,aAAa,EAGb,aAAa,EAEd,MAAM,iBAAiB,CAAC;AA2DzB,wBAAgB,WAAW,CAAC,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,GAAG,IAAI,CA+ElF;AAED,eAAO,MAAM,sBAAsB,EAAE,qBAKpC,CAAC"}
@@ -0,0 +1,125 @@
1
+ import { renderCanvasShapeCommands } from '@flighthq/displayobject-canvas';
2
+ import { getNodeLocalBoundsRectangle, getNodeLocalContentRevision } from '@flighthq/node';
3
+ import { tessellatePath } from '@flighthq/path';
4
+ import { resolveGlMaterialRenderer } from '@flighthq/render-gl';
5
+ import { getGlRenderStateRuntime } from '@flighthq/render-gl';
6
+ import { getShapeFillRegions } from '@flighthq/shape';
7
+ import { BatchFormat } from '@flighthq/types';
8
+ import { drawGlShapeMeshes } from './glShapeMesh';
9
+ import { ensureGlQuadBatchShader, packGlSpriteBatchMaterialInstance, prepareGlSpriteBatchWrite } from './glSpriteBatch';
10
+ function getGlShapeData(data) {
11
+ return data;
12
+ }
13
+ function toGlShapeRendererData(data) {
14
+ return data;
15
+ }
16
+ function createGlShapeData(_state, _source) {
17
+ const canvas = document.createElement('canvas');
18
+ canvas.width = 1;
19
+ canvas.height = 1;
20
+ const ctx = canvas.getContext('2d');
21
+ return toGlShapeRendererData({
22
+ canvas,
23
+ ctx,
24
+ lastContentId: -1,
25
+ lastW: 0,
26
+ lastH: 0,
27
+ meshVersion: -1,
28
+ meshes: null,
29
+ });
30
+ }
31
+ // The batch uploads this shape's canvas into the shared texture cache; free that GPU texture when
32
+ // the shape is torn down so it does not leak past the canvas it was keyed on.
33
+ function destroyGlShapeData(state, data) {
34
+ const runtime = getGlRenderStateRuntime(state);
35
+ const { canvas } = getGlShapeData(data);
36
+ const texture = runtime.textureCache.get(canvas);
37
+ if (texture !== undefined) {
38
+ state.gl.deleteTexture(texture);
39
+ runtime.textureCache.delete(canvas);
40
+ }
41
+ }
42
+ export function drawGlShape(state, renderProxy) {
43
+ const runtime = getGlRenderStateRuntime(state);
44
+ const source = renderProxy.source;
45
+ const { commands } = source.data;
46
+ const version = getNodeLocalContentRevision(source);
47
+ if (commands.length === 0)
48
+ return;
49
+ if (renderProxy.rendererData === null)
50
+ return;
51
+ // GPU fill path: solid-fill shapes tessellate to colored meshes (crisp at any zoom). Falls through to
52
+ // the canvas-raster path for gradient/bitmap fills and strokes (getShapeFillRegions returns null).
53
+ const regions = getShapeFillRegions(commands);
54
+ if (regions !== null && regions.length > 0) {
55
+ const meshData = getGlShapeData(renderProxy.rendererData);
56
+ if (meshData.meshVersion !== version) {
57
+ meshData.meshes = regions.map((region) => {
58
+ const mesh = tessellatePath(region.path);
59
+ return {
60
+ vertices: new Float32Array(mesh.vertices),
61
+ indices: new Uint16Array(mesh.indices),
62
+ color: region.color,
63
+ alpha: region.alpha,
64
+ };
65
+ });
66
+ meshData.meshVersion = version;
67
+ }
68
+ drawGlShapeMeshes(state, renderProxy, meshData.meshes ?? []);
69
+ return;
70
+ }
71
+ const material = renderProxy.material;
72
+ const materialRenderer = resolveGlMaterialRenderer(state, material);
73
+ if (materialRenderer === null)
74
+ return;
75
+ const shapeData = getGlShapeData(renderProxy.rendererData);
76
+ const bounds = getNodeLocalBoundsRectangle(source);
77
+ const w = Math.ceil(bounds.width);
78
+ const h = Math.ceil(bounds.height);
79
+ if (w <= 0 || h <= 0)
80
+ return;
81
+ if (version !== shapeData.lastContentId || w !== shapeData.lastW || h !== shapeData.lastH) {
82
+ shapeData.canvas.width = w;
83
+ shapeData.canvas.height = h;
84
+ const ctx = shapeData.ctx;
85
+ ctx.clearRect(0, 0, w, h);
86
+ ctx.save();
87
+ ctx.translate(-bounds.x, -bounds.y);
88
+ renderCanvasShapeCommands(ctx, commands);
89
+ ctx.restore();
90
+ // Invalidate the cached GPU texture so the batch re-uploads from the updated canvas.
91
+ runtime.textureCache.delete(shapeData.canvas);
92
+ shapeData.lastContentId = version;
93
+ shapeData.lastW = w;
94
+ shapeData.lastH = h;
95
+ }
96
+ ensureGlQuadBatchShader(state);
97
+ const t = renderProxy.transform2D;
98
+ const tx = t.tx + t.a * bounds.x + t.c * bounds.y;
99
+ const ty = t.ty + t.b * bounds.x + t.d * bounds.y;
100
+ const startCount = runtime.spriteBatchCount;
101
+ const base = prepareGlSpriteBatchWrite(state, shapeData.canvas, renderProxy.blendMode, material, materialRenderer, 1);
102
+ const d = runtime.spriteBatchInstanceData;
103
+ d[base] = t.a;
104
+ d[base + 1] = t.b;
105
+ d[base + 2] = t.c;
106
+ d[base + 3] = t.d;
107
+ d[base + 4] = tx;
108
+ d[base + 5] = ty;
109
+ d[base + 6] = w;
110
+ d[base + 7] = h;
111
+ d[base + 8] = 0;
112
+ d[base + 9] = 0;
113
+ d[base + 10] = 1;
114
+ d[base + 11] = 1;
115
+ d[base + 12] = renderProxy.alpha;
116
+ packGlSpriteBatchMaterialInstance(state, renderProxy.materialData, startCount);
117
+ runtime.spriteBatchCount++;
118
+ }
119
+ export const defaultGlShapeRenderer = {
120
+ format: BatchFormat.Quad,
121
+ createData: createGlShapeData,
122
+ destroyData: destroyGlShapeData,
123
+ submit: drawGlShape,
124
+ };
125
+ //# sourceMappingURL=glShape.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glShape.js","sourceRoot":"","sources":["../src/glShape.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,2BAA2B,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAC;AAC1F,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAStD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAG9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,uBAAuB,EAAE,iCAAiC,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAkBxH,SAAS,cAAc,CAAC,IAAkB;IACxC,OAAO,IAA8B,CAAC;AACxC,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAiB;IAC9C,OAAO,IAA+B,CAAC;AACzC,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAqB,EAAE,OAAmB;IACnE,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;IACjB,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IAClB,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAE,CAAC;IACrC,OAAO,qBAAqB,CAAC;QAC3B,MAAM;QACN,GAAG;QACH,aAAa,EAAE,CAAC,CAAC;QACjB,KAAK,EAAE,CAAC;QACR,KAAK,EAAE,CAAC;QACR,WAAW,EAAE,CAAC,CAAC;QACf,MAAM,EAAE,IAAI;KACb,CAAC,CAAC;AACL,CAAC;AAED,kGAAkG;AAClG,8EAA8E;AAC9E,SAAS,kBAAkB,CAAC,KAAoB,EAAE,IAAkB;IAClE,MAAM,OAAO,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,EAAE,MAAM,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACjD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAChC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAoB,EAAE,WAA0B;IAC1E,MAAM,OAAO,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,WAAW,CAAC,MAAe,CAAC;IAC3C,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;IACjC,MAAM,OAAO,GAAG,2BAA2B,CAAC,MAAM,CAAC,CAAC;IACpD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAClC,IAAI,WAAW,CAAC,YAAY,KAAK,IAAI;QAAE,OAAO;IAE9C,sGAAsG;IACtG,mGAAmG;IACnG,MAAM,OAAO,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAC9C,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAAG,cAAc,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;QAC1D,IAAI,QAAQ,CAAC,WAAW,KAAK,OAAO,EAAE,CAAC;YACrC,QAAQ,CAAC,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;gBACvC,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBACzC,OAAO;oBACL,QAAQ,EAAE,IAAI,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC;oBACzC,OAAO,EAAE,IAAI,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC;oBACtC,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,KAAK,EAAE,MAAM,CAAC,KAAK;iBACpB,CAAC;YACJ,CAAC,CAAC,CAAC;YACH,QAAQ,CAAC,WAAW,GAAG,OAAO,CAAC;QACjC,CAAC;QACD,iBAAiB,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QAC7D,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC;IACtC,MAAM,gBAAgB,GAAG,yBAAyB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACpE,IAAI,gBAAgB,KAAK,IAAI;QAAE,OAAO;IAEtC,MAAM,SAAS,GAAG,cAAc,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,2BAA2B,CAAC,MAAM,CAAC,CAAC;IACnD,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAClC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACnC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO;IAE7B,IAAI,OAAO,KAAK,SAAS,CAAC,aAAa,IAAI,CAAC,KAAK,SAAS,CAAC,KAAK,IAAI,CAAC,KAAK,SAAS,CAAC,KAAK,EAAE,CAAC;QAC1F,SAAS,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;QAC3B,SAAS,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;QAC5B,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC;QAC1B,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1B,GAAG,CAAC,IAAI,EAAE,CAAC;QACX,GAAG,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACpC,yBAAyB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACzC,GAAG,CAAC,OAAO,EAAE,CAAC;QACd,qFAAqF;QACrF,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC9C,SAAS,CAAC,aAAa,GAAG,OAAO,CAAC;QAClC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC;QACpB,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC;IACtB,CAAC;IAED,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAE/B,MAAM,CAAC,GAAG,WAAW,CAAC,WAAW,CAAC;IAClC,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IAClD,MAAM,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IAElD,MAAM,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAC5C,MAAM,IAAI,GAAG,yBAAyB,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,WAAW,CAAC,SAAS,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC;IACtH,MAAM,CAAC,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAC1C,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACd,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IACjB,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IACjB,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAChB,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAChB,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAChB,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAChB,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;IACjB,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;IACjB,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC;IACjC,iCAAiC,CAAC,KAAK,EAAE,WAAW,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IAC/E,OAAO,CAAC,gBAAgB,EAAE,CAAC;AAC7B,CAAC;AAED,MAAM,CAAC,MAAM,sBAAsB,GAA0B;IAC3D,MAAM,EAAE,WAAW,CAAC,IAAI;IACxB,UAAU,EAAE,iBAAiB;IAC7B,WAAW,EAAE,kBAAkB;IAC/B,MAAM,EAAE,WAAW;CACpB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { GlRenderState, RenderProxy2D } from '@flighthq/types';
2
+ export interface GlShapeMesh {
3
+ vertices: Float32Array;
4
+ indices: Uint16Array;
5
+ color: number;
6
+ alpha: number;
7
+ }
8
+ export declare function drawGlShapeMeshes(state: GlRenderState, renderProxy: RenderProxy2D, meshes: readonly GlShapeMesh[]): void;
9
+ //# sourceMappingURL=glShapeMesh.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glShapeMesh.d.ts","sourceRoot":"","sources":["../src/glShapeMesh.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAUpE,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,YAAY,CAAC;IACvB,OAAO,EAAE,WAAW,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAMD,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,aAAa,EACpB,WAAW,EAAE,aAAa,EAC1B,MAAM,EAAE,SAAS,WAAW,EAAE,GAC7B,IAAI,CAmCN"}
@@ -0,0 +1,90 @@
1
+ import { createGlProgram } from '@flighthq/render-gl';
2
+ import { getGlRenderStateRuntime } from '@flighthq/render-gl';
3
+ import { flushGlSpriteBatch } from './glSpriteBatch';
4
+ // Draws the shape's tessellated fill meshes. Flushes the sprite batch first (these go through a separate
5
+ // program), honors the node blend mode and alpha, and is gated by any active clip stencil (GL state set
6
+ // by the clip hooks is left untouched). Records the mesh program as currentProgram so the next content
7
+ // draw re-binds its own program (same hazard the clip path guards against).
8
+ export function drawGlShapeMeshes(state, renderProxy, meshes) {
9
+ if (meshes.length === 0)
10
+ return;
11
+ const runtime = getGlRenderStateRuntime(state);
12
+ flushGlSpriteBatch(state);
13
+ const gl = state.gl;
14
+ const program = ensureShapeMeshProgram(state);
15
+ gl.useProgram(program.program);
16
+ runtime.currentProgram = program.program;
17
+ state.applyBlendMode?.(state, renderProxy.blendMode);
18
+ gl.uniformMatrix3fv(program.matrixLocation, false, shapeMeshMatrix(state, renderProxy));
19
+ gl.bindBuffer(gl.ARRAY_BUFFER, program.vertexBuffer);
20
+ gl.enableVertexAttribArray(program.positionLocation);
21
+ gl.vertexAttribPointer(program.positionLocation, 2, gl.FLOAT, false, 0, 0);
22
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, program.indexBuffer);
23
+ const nodeAlpha = renderProxy.alpha;
24
+ for (let i = 0; i < meshes.length; i++) {
25
+ const mesh = meshes[i];
26
+ if (mesh.indices.length === 0)
27
+ continue;
28
+ const a = mesh.alpha * nodeAlpha;
29
+ if (a <= 0)
30
+ continue;
31
+ // Premultiplied color for the standard ONE / ONE_MINUS_SRC_ALPHA blend the renderer uses.
32
+ const r = ((mesh.color >> 16) & 0xff) / 255;
33
+ const g = ((mesh.color >> 8) & 0xff) / 255;
34
+ const b = (mesh.color & 0xff) / 255;
35
+ gl.uniform4f(program.colorLocation, r * a, g * a, b * a, a);
36
+ gl.bufferData(gl.ARRAY_BUFFER, mesh.vertices, gl.STREAM_DRAW);
37
+ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, mesh.indices, gl.STREAM_DRAW);
38
+ gl.drawElements(gl.TRIANGLES, mesh.indices.length, gl.UNSIGNED_SHORT, 0);
39
+ }
40
+ gl.disableVertexAttribArray(program.positionLocation);
41
+ }
42
+ const VERTEX_SOURCE = `
43
+ attribute vec2 a_position;
44
+ uniform mat3 u_matrix;
45
+ void main() {
46
+ vec3 p = u_matrix * vec3(a_position, 1.0);
47
+ gl_Position = vec4(p.xy, 0.0, 1.0);
48
+ }
49
+ `;
50
+ const FRAGMENT_SOURCE = `
51
+ precision mediump float;
52
+ uniform vec4 u_color;
53
+ void main() { gl_FragColor = u_color; }
54
+ `;
55
+ const shapeMeshPrograms = new WeakMap();
56
+ function ensureShapeMeshProgram(state) {
57
+ const gl = state.gl;
58
+ const existing = shapeMeshPrograms.get(gl);
59
+ if (existing !== undefined)
60
+ return existing;
61
+ const program = compileShapeMeshProgram(gl);
62
+ const created = {
63
+ program,
64
+ vertexBuffer: gl.createBuffer(),
65
+ indexBuffer: gl.createBuffer(),
66
+ positionLocation: gl.getAttribLocation(program, 'a_position'),
67
+ matrixLocation: gl.getUniformLocation(program, 'u_matrix'),
68
+ colorLocation: gl.getUniformLocation(program, 'u_color'),
69
+ };
70
+ shapeMeshPrograms.set(gl, created);
71
+ return created;
72
+ }
73
+ function compileShapeMeshProgram(gl) {
74
+ return createGlProgram(gl, VERTEX_SOURCE, FRAGMENT_SOURCE, 'Shape-mesh');
75
+ }
76
+ // Column-major mat3 = projection · world transform, mapping shape-local points to clip space — identical
77
+ // to the sprite batch's projection so the mesh aligns with everything else.
78
+ function shapeMeshMatrix(state, renderProxy) {
79
+ const viewport = getGlRenderStateRuntime(state).renderTargetViewport ?? state.canvas;
80
+ const iw = 2 / (viewport.width || 1);
81
+ const ih = 2 / (viewport.height || 1);
82
+ const t = renderProxy.transform2D;
83
+ // prettier-ignore
84
+ return new Float32Array([
85
+ t.a * iw, -t.b * ih, 0,
86
+ t.c * iw, -t.d * ih, 0,
87
+ t.tx * iw - 1, -t.ty * ih + 1, 1,
88
+ ]);
89
+ }
90
+ //# sourceMappingURL=glShapeMesh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glShapeMesh.js","sourceRoot":"","sources":["../src/glShapeMesh.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAG9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAerD,yGAAyG;AACzG,wGAAwG;AACxG,uGAAuG;AACvG,4EAA4E;AAC5E,MAAM,UAAU,iBAAiB,CAC/B,KAAoB,EACpB,WAA0B,EAC1B,MAA8B;IAE9B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAChC,MAAM,OAAO,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAC/C,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAE1B,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;IACpB,MAAM,OAAO,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAC9C,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/B,OAAO,CAAC,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IAEzC,KAAK,CAAC,cAAc,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;IACrD,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC,cAAc,EAAE,KAAK,EAAE,eAAe,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;IAExF,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,YAAY,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IACrD,EAAE,CAAC,uBAAuB,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACrD,EAAE,CAAC,mBAAmB,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3E,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,oBAAoB,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAE5D,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC;IACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACvB,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACxC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;QACjC,IAAI,CAAC,IAAI,CAAC;YAAE,SAAS;QACrB,0FAA0F;QAC1F,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC;QAC5C,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC;QAC3C,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC;QACpC,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5D,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,YAAY,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC;QAC9D,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,oBAAoB,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC;QACrE,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;IAC3E,CAAC;IAED,EAAE,CAAC,wBAAwB,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;AACxD,CAAC;AAWD,MAAM,aAAa,GAAG;;;;;;;CAOrB,CAAC;AAEF,MAAM,eAAe,GAAG;;;;CAIvB,CAAC;AAEF,MAAM,iBAAiB,GAAG,IAAI,OAAO,EAA2C,CAAC;AAEjF,SAAS,sBAAsB,CAAC,KAAoB;IAClD,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;IACpB,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC3C,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IAE5C,MAAM,OAAO,GAAG,uBAAuB,CAAC,EAAE,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAqB;QAChC,OAAO;QACP,YAAY,EAAE,EAAE,CAAC,YAAY,EAAG;QAChC,WAAW,EAAE,EAAE,CAAC,YAAY,EAAG;QAC/B,gBAAgB,EAAE,EAAE,CAAC,iBAAiB,CAAC,OAAO,EAAE,YAAY,CAAC;QAC7D,cAAc,EAAE,EAAE,CAAC,kBAAkB,CAAC,OAAO,EAAE,UAAU,CAAC;QAC1D,aAAa,EAAE,EAAE,CAAC,kBAAkB,CAAC,OAAO,EAAE,SAAS,CAAC;KACzD,CAAC;IACF,iBAAiB,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IACnC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,uBAAuB,CAAC,EAA0B;IACzD,OAAO,eAAe,CAAC,EAAE,EAAE,aAAa,EAAE,eAAe,EAAE,YAAY,CAAC,CAAC;AAC3E,CAAC;AAED,yGAAyG;AACzG,4EAA4E;AAC5E,SAAS,eAAe,CAAC,KAAoB,EAAE,WAA0B;IACvE,MAAM,QAAQ,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC,oBAAoB,IAAI,KAAK,CAAC,MAAM,CAAC;IACrF,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;IACrC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;IACtC,MAAM,CAAC,GAAG,WAAW,CAAC,WAAW,CAAC;IAClC,kBAAkB;IAClB,OAAO,IAAI,YAAY,CAAC;QACtB,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;QACtB,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;QACtB,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;KACjC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { DisplayObject, GlRenderState } from '@flighthq/types';
2
+ export declare function renderGlSprite(state: GlRenderState, source: DisplayObject): void;
3
+ //# sourceMappingURL=glSprite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glSprite.d.ts","sourceRoot":"","sources":["../src/glSprite.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAIpE,wBAAgB,cAAc,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CAwBhF"}
@@ -0,0 +1,28 @@
1
+ import { getDisplayObjectRuntime } from '@flighthq/displayobject';
2
+ import { getRenderProxy2D, isRenderProxyVisible } from '@flighthq/render';
3
+ import { getGlRenderStateRuntime } from '@flighthq/render-gl';
4
+ import { flushGlSpriteBatch } from './glSpriteBatch';
5
+ export function renderGlSprite(state, source) {
6
+ const tempStack = getGlRenderStateRuntime(state).tempStack;
7
+ let stackLength = 1;
8
+ tempStack[0] = source;
9
+ while (stackLength > 0) {
10
+ const current = tempStack[--stackLength];
11
+ if (!current.enabled)
12
+ continue;
13
+ const data = getRenderProxy2D(state, current);
14
+ if (data === undefined || !isRenderProxyVisible(data))
15
+ continue;
16
+ data.renderer?.submit(state, data);
17
+ if (data.traverseChildren) {
18
+ const children = getDisplayObjectRuntime(current).children;
19
+ if (children !== null) {
20
+ for (let i = children.length - 1; i >= 0; i--) {
21
+ tempStack[stackLength++] = children[i];
22
+ }
23
+ }
24
+ }
25
+ }
26
+ flushGlSpriteBatch(state);
27
+ }
28
+ //# sourceMappingURL=glSprite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glSprite.js","sourceRoot":"","sources":["../src/glSprite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAG9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD,MAAM,UAAU,cAAc,CAAC,KAAoB,EAAE,MAAqB;IACxE,MAAM,SAAS,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC;IAC3D,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,SAAS,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;IAEtB,OAAO,WAAW,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,SAAS,CAAC,EAAE,WAAW,CAAkB,CAAC;QAC1D,IAAI,CAAC,OAAO,CAAC,OAAO;YAAE,SAAS;QAC/B,MAAM,IAAI,GAAG,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC9C,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC;YAAE,SAAS;QAEhE,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAEnC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,MAAM,QAAQ,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC;YAC3D,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;gBACtB,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC9C,SAAS,CAAC,WAAW,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAkB,CAAC;gBAC1D,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,kBAAkB,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { BlendMode, GlMaterialRenderer, GlRenderState, Material, MaterialData } from '@flighthq/types';
2
+ import type { GlQuadBatchShader } from '@flighthq/types';
3
+ export declare const QUAD_BATCH_VS = "#version 300 es\nprecision mediump float;\n\nlayout(location = 0) in vec2 a_corner;\nlayout(location = 1) in vec2 a_matAB;\nlayout(location = 2) in vec2 a_matCD;\nlayout(location = 3) in vec2 a_matTXTY;\nlayout(location = 4) in vec2 a_size;\nlayout(location = 5) in vec4 a_uvRect;\nlayout(location = 6) in float a_alpha;\n\nuniform mat3 u_world;\n\nout vec2 v_texCoord;\nout float v_alpha;\n\nvoid main() {\n vec2 local = a_corner * a_size;\n vec2 worldPos = vec2(\n a_matAB.x * local.x + a_matCD.x * local.y + a_matTXTY.x,\n a_matAB.y * local.x + a_matCD.y * local.y + a_matTXTY.y\n );\n vec3 clip = u_world * vec3(worldPos, 1.0);\n gl_Position = vec4(clip.xy, 0.0, 1.0);\n v_texCoord = mix(a_uvRect.xy, a_uvRect.zw, a_corner);\n v_alpha = a_alpha;\n}";
4
+ export declare function bindGlQuadBatchBaseAttributes(state: GlRenderState, locCorner: number): void;
5
+ export declare function ensureGlQuadBatchShader(state: GlRenderState): GlQuadBatchShader;
6
+ export declare function flushGlSpriteBatch(state: GlRenderState): void;
7
+ export declare function packGlSpriteBatchMaterialInstance(state: GlRenderState, materialData: MaterialData | null, instanceIndex: number): void;
8
+ export declare function prepareGlSpriteBatchWrite(state: GlRenderState, texture: CanvasImageSource, blendMode: BlendMode | null, material: Material | null, materialRenderer: GlMaterialRenderer, maxInstances: number): number;
9
+ export declare function setGlQuadBatchWorldAndTexture(state: GlRenderState, locWorldMatrix: WebGLUniformLocation, locTexture: WebGLUniformLocation): void;
10
+ export declare function useGlQuadBatchProgram(state: GlRenderState, program: WebGLProgram): void;
11
+ //# sourceMappingURL=glSpriteBatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"glSpriteBatch.d.ts","sourceRoot":"","sources":["../src/glSpriteBatch.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,aAAa,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC5G,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAmBzD,eAAO,MAAM,aAAa,kwBA0BxB,CAAC;AAiCH,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CA4B3F;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,aAAa,GAAG,iBAAiB,CAc/E;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAmD7D;AAKD,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,aAAa,EACpB,YAAY,EAAE,YAAY,GAAG,IAAI,EACjC,aAAa,EAAE,MAAM,GACpB,IAAI,CAUN;AAOD,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,iBAAiB,EAC1B,SAAS,EAAE,SAAS,GAAG,IAAI,EAC3B,QAAQ,EAAE,QAAQ,GAAG,IAAI,EACzB,gBAAgB,EAAE,kBAAkB,EACpC,YAAY,EAAE,MAAM,GACnB,MAAM,CAyCR;AAED,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,aAAa,EACpB,cAAc,EAAE,oBAAoB,EACpC,UAAU,EAAE,oBAAoB,GAC/B,IAAI,CAkBN;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI,CAMvF"}