@flighthq/scene2d-wgpu 0.2.1-next.840.857425c

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 (144) hide show
  1. package/dist/enableWgpuColorAdjustmentGuards.d.ts +4 -0
  2. package/dist/enableWgpuColorAdjustmentGuards.d.ts.map +1 -0
  3. package/dist/enableWgpuColorAdjustmentGuards.js +21 -0
  4. package/dist/enableWgpuColorAdjustmentGuards.js.map +1 -0
  5. package/dist/index.d.ts +29 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +29 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/moduleMockTestHelper.d.ts +15 -0
  10. package/dist/moduleMockTestHelper.d.ts.map +1 -0
  11. package/dist/moduleMockTestHelper.js +25 -0
  12. package/dist/moduleMockTestHelper.js.map +1 -0
  13. package/dist/wgpuBitmap.d.ts +4 -0
  14. package/dist/wgpuBitmap.d.ts.map +1 -0
  15. package/dist/wgpuBitmap.js +84 -0
  16. package/dist/wgpuBitmap.js.map +1 -0
  17. package/dist/wgpuCache.d.ts +31 -0
  18. package/dist/wgpuCache.d.ts.map +1 -0
  19. package/dist/wgpuCache.js +244 -0
  20. package/dist/wgpuCache.js.map +1 -0
  21. package/dist/wgpuClip.d.ts +3 -0
  22. package/dist/wgpuClip.d.ts.map +1 -0
  23. package/dist/wgpuClip.js +44 -0
  24. package/dist/wgpuClip.js.map +1 -0
  25. package/dist/wgpuClipContours.d.ts +4 -0
  26. package/dist/wgpuClipContours.d.ts.map +1 -0
  27. package/dist/wgpuClipContours.js +174 -0
  28. package/dist/wgpuClipContours.js.map +1 -0
  29. package/dist/wgpuClipRectangle.d.ts +4 -0
  30. package/dist/wgpuClipRectangle.d.ts.map +1 -0
  31. package/dist/wgpuClipRectangle.js +80 -0
  32. package/dist/wgpuClipRectangle.js.map +1 -0
  33. package/dist/wgpuColorAdjustment.d.ts +3 -0
  34. package/dist/wgpuColorAdjustment.d.ts.map +1 -0
  35. package/dist/wgpuColorAdjustment.js +201 -0
  36. package/dist/wgpuColorAdjustment.js.map +1 -0
  37. package/dist/wgpuDefaultMaterial.d.ts +4 -0
  38. package/dist/wgpuDefaultMaterial.d.ts.map +1 -0
  39. package/dist/wgpuDefaultMaterial.js +49 -0
  40. package/dist/wgpuDefaultMaterial.js.map +1 -0
  41. package/dist/wgpuNode2D.d.ts +5 -0
  42. package/dist/wgpuNode2D.d.ts.map +1 -0
  43. package/dist/wgpuNode2D.js +41 -0
  44. package/dist/wgpuNode2D.js.map +1 -0
  45. package/dist/wgpuParticleEmitter2D.d.ts +4 -0
  46. package/dist/wgpuParticleEmitter2D.d.ts.map +1 -0
  47. package/dist/wgpuParticleEmitter2D.js +293 -0
  48. package/dist/wgpuParticleEmitter2D.js.map +1 -0
  49. package/dist/wgpuQuadBatch.d.ts +5 -0
  50. package/dist/wgpuQuadBatch.d.ts.map +1 -0
  51. package/dist/wgpuQuadBatch.js +90 -0
  52. package/dist/wgpuQuadBatch.js.map +1 -0
  53. package/dist/wgpuRegistration.d.ts +19 -0
  54. package/dist/wgpuRegistration.d.ts.map +1 -0
  55. package/dist/wgpuRegistration.js +53 -0
  56. package/dist/wgpuRegistration.js.map +1 -0
  57. package/dist/wgpuRenderStats.d.ts +20 -0
  58. package/dist/wgpuRenderStats.d.ts.map +1 -0
  59. package/dist/wgpuRenderStats.js +50 -0
  60. package/dist/wgpuRenderStats.js.map +1 -0
  61. package/dist/wgpuRendererData.d.ts +26 -0
  62. package/dist/wgpuRendererData.d.ts.map +1 -0
  63. package/dist/wgpuRendererData.js +29 -0
  64. package/dist/wgpuRendererData.js.map +1 -0
  65. package/dist/wgpuRichText.d.ts +8 -0
  66. package/dist/wgpuRichText.d.ts.map +1 -0
  67. package/dist/wgpuRichText.js +175 -0
  68. package/dist/wgpuRichText.js.map +1 -0
  69. package/dist/wgpuScale9Mapper.d.ts +3 -0
  70. package/dist/wgpuScale9Mapper.d.ts.map +1 -0
  71. package/dist/wgpuScale9Mapper.js +42 -0
  72. package/dist/wgpuScale9Mapper.js.map +1 -0
  73. package/dist/wgpuScale9Shape.d.ts +9 -0
  74. package/dist/wgpuScale9Shape.d.ts.map +1 -0
  75. package/dist/wgpuScale9Shape.js +123 -0
  76. package/dist/wgpuScale9Shape.js.map +1 -0
  77. package/dist/wgpuShape.d.ts +4 -0
  78. package/dist/wgpuShape.d.ts.map +1 -0
  79. package/dist/wgpuShape.js +164 -0
  80. package/dist/wgpuShape.js.map +1 -0
  81. package/dist/wgpuShapeMesh.d.ts +3 -0
  82. package/dist/wgpuShapeMesh.d.ts.map +1 -0
  83. package/dist/wgpuShapeMesh.js +224 -0
  84. package/dist/wgpuShapeMesh.js.map +1 -0
  85. package/dist/wgpuSprite.d.ts +3 -0
  86. package/dist/wgpuSprite.d.ts.map +1 -0
  87. package/dist/wgpuSprite.js +28 -0
  88. package/dist/wgpuSprite.js.map +1 -0
  89. package/dist/wgpuSpriteBatch.d.ts +12 -0
  90. package/dist/wgpuSpriteBatch.d.ts.map +1 -0
  91. package/dist/wgpuSpriteBatch.js +341 -0
  92. package/dist/wgpuSpriteBatch.js.map +1 -0
  93. package/dist/wgpuSpriteRenderer.d.ts +3 -0
  94. package/dist/wgpuSpriteRenderer.d.ts.map +1 -0
  95. package/dist/wgpuSpriteRenderer.js +55 -0
  96. package/dist/wgpuSpriteRenderer.js.map +1 -0
  97. package/dist/wgpuTextInput.d.ts +4 -0
  98. package/dist/wgpuTextInput.d.ts.map +1 -0
  99. package/dist/wgpuTextInput.js +44 -0
  100. package/dist/wgpuTextInput.js.map +1 -0
  101. package/dist/wgpuTextLabel.d.ts +4 -0
  102. package/dist/wgpuTextLabel.d.ts.map +1 -0
  103. package/dist/wgpuTextLabel.js +149 -0
  104. package/dist/wgpuTextLabel.js.map +1 -0
  105. package/dist/wgpuTilemap.d.ts +3 -0
  106. package/dist/wgpuTilemap.d.ts.map +1 -0
  107. package/dist/wgpuTilemap.js +81 -0
  108. package/dist/wgpuTilemap.js.map +1 -0
  109. package/dist/wgpuVelocity.d.ts +23 -0
  110. package/dist/wgpuVelocity.d.ts.map +1 -0
  111. package/dist/wgpuVelocity.js +365 -0
  112. package/dist/wgpuVelocity.js.map +1 -0
  113. package/dist/wgpuVideo.d.ts +6 -0
  114. package/dist/wgpuVideo.d.ts.map +1 -0
  115. package/dist/wgpuVideo.js +63 -0
  116. package/dist/wgpuVideo.js.map +1 -0
  117. package/package.json +60 -0
  118. package/src/enableWgpuColorAdjustmentGuards.test.ts +82 -0
  119. package/src/wgpuBitmap.test.ts +40 -0
  120. package/src/wgpuCache.test.ts +272 -0
  121. package/src/wgpuClip.test.ts +15 -0
  122. package/src/wgpuClipContours.test.ts +101 -0
  123. package/src/wgpuClipRectangle.test.ts +45 -0
  124. package/src/wgpuColorAdjustment.test.ts +120 -0
  125. package/src/wgpuDefaultMaterial.test.ts +21 -0
  126. package/src/wgpuNode2D.test.ts +36 -0
  127. package/src/wgpuParticleEmitter2D.test.ts +85 -0
  128. package/src/wgpuQuadBatch.test.ts +69 -0
  129. package/src/wgpuRegistration.test.ts +115 -0
  130. package/src/wgpuRenderStats.test.ts +89 -0
  131. package/src/wgpuRendererData.test.ts +29 -0
  132. package/src/wgpuRichText.test.ts +100 -0
  133. package/src/wgpuScale9Mapper.test.ts +20 -0
  134. package/src/wgpuScale9Shape.test.ts +97 -0
  135. package/src/wgpuShape.test.ts +96 -0
  136. package/src/wgpuShapeMesh.test.ts +164 -0
  137. package/src/wgpuSprite.test.ts +19 -0
  138. package/src/wgpuSpriteBatch.test.ts +272 -0
  139. package/src/wgpuSpriteRenderer.test.ts +63 -0
  140. package/src/wgpuTextInput.test.ts +37 -0
  141. package/src/wgpuTextLabel.test.ts +124 -0
  142. package/src/wgpuTilemap.test.ts +47 -0
  143. package/src/wgpuVelocity.test.ts +148 -0
  144. package/src/wgpuVideo.test.ts +59 -0
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Casts `data` to `RendererData` for storage in a renderer's `createData` return value.
3
+ * Use in `createData` implementations to avoid the repeated `as unknown as RendererData` double cast:
4
+ *
5
+ * ```ts
6
+ * function createWgpuFooData(...): RendererData {
7
+ * return createWgpuRendererData<WgpuFooData>({ ... });
8
+ * }
9
+ * ```
10
+ */
11
+ export function createWgpuRendererData(data) {
12
+ return data;
13
+ }
14
+ /**
15
+ * Casts `RendererData` back to `T` for reading inside `submit`/`destroyData` implementations.
16
+ * Use in renderer callbacks to avoid the repeated `as unknown as WgpuFooData` double cast:
17
+ *
18
+ * ```ts
19
+ * function drawWgpuFoo(state: WgpuRenderState, renderProxy: RenderProxy2D): void {
20
+ * const data = getWgpuRendererData<WgpuFooData>(renderProxy.rendererData);
21
+ * if (data === null) return;
22
+ * ...
23
+ * }
24
+ * ```
25
+ */
26
+ export function getWgpuRendererData(data) {
27
+ return data;
28
+ }
29
+ //# sourceMappingURL=wgpuRendererData.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuRendererData.js","sourceRoot":"","sources":["../src/wgpuRendererData.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,MAAM,UAAU,sBAAsB,CAAmB,IAAO;IAC9D,OAAO,IAA+B,CAAC;AACzC,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,mBAAmB,CAAmB,IAAyB;IAC7E,OAAO,IAA2B,CAAC;AACrC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { Scene2DRenderer, Renderable, RendererData, RenderProxy2D, RenderState, WgpuRenderState, WgpuRichTextOverlay } from '@flighthq/types';
2
+ export declare function createWgpuRichTextData(_state: RenderState, _source: Renderable): RendererData;
3
+ export declare function destroyWgpuRichTextData(_state: RenderState, data: RendererData): void;
4
+ export declare function drawWgpuRichText(state: WgpuRenderState, renderProxy: RenderProxy2D): void;
5
+ export declare function drawWgpuRichTextWithOverlay(state: WgpuRenderState, renderProxy: RenderProxy2D, overlay?: WgpuRichTextOverlay): void;
6
+ export declare function registerWgpuTextInputOverlay(overlay: WgpuRichTextOverlay): void;
7
+ export declare const defaultWgpuRichTextRenderer: Scene2DRenderer;
8
+ //# sourceMappingURL=wgpuRichText.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuRichText.d.ts","sourceRoot":"","sources":["../src/wgpuRichText.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EACV,eAAe,EACf,UAAU,EACV,YAAY,EACZ,aAAa,EACb,WAAW,EAKX,eAAe,EACf,mBAAmB,EAEpB,MAAM,iBAAiB,CAAC;AAiBzB,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,GAAG,YAAY,CAE7F;AAGD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI,CAIrF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,aAAa,GAAG,IAAI,CASzF;AAED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,eAAe,EACtB,WAAW,EAAE,aAAa,EAC1B,OAAO,CAAC,EAAE,mBAAmB,GAC5B,IAAI,CA6DN;AAED,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAE/E;AAED,eAAO,MAAM,2BAA2B,EAAE,eAIzC,CAAC"}
@@ -0,0 +1,175 @@
1
+ import { computeRgbHexString } from '@flighthq/color';
2
+ import { createWgpuTextureEntry, drawWgpuQuad, updateWgpuTextureEntry } from '@flighthq/render-wgpu';
3
+ import { getWgpuRenderStateRuntime } from '@flighthq/render-wgpu';
4
+ import { computeTextFormatFontString } from '@flighthq/text';
5
+ import { getRichTextPasswordCharacter, getRichTextRuntime } from '@flighthq/text';
6
+ import { computeRichTextContent, computeTextBoundsHeight, computeTextBoundsOffsetX, computeTextBoundsWidth, computeTextLayout, getRichTextContent, getRichTextScrollYOffset, getTextLayoutResult, } from '@flighthq/textlayout';
7
+ import { createWgpuRendererData, getWgpuRendererData } from './wgpuRendererData';
8
+ import { flushWgpuSpriteBatch } from './wgpuSpriteBatch';
9
+ let _offscreenCanvas = null;
10
+ let _offscreenCtx = null;
11
+ let _webgpuTextInputOverlay = null;
12
+ export function createWgpuRichTextData(_state, _source) {
13
+ return createWgpuRendererData({ entry: null, h: 0, w: 0 });
14
+ }
15
+ // Destroys the GPU texture this rich text node owns when it is torn down via disposeScene2DRender.
16
+ export function destroyWgpuRichTextData(_state, data) {
17
+ const richData = getWgpuRendererData(data);
18
+ if (richData === null)
19
+ return;
20
+ richData.entry?.texture.destroy();
21
+ }
22
+ export function drawWgpuRichText(state, renderProxy) {
23
+ // The editable-input overlay rasterizes onto the offscreen field texture, so it is passed into the
24
+ // rasterization pass — only when the input slot is present. registerWgpuTextInputOverlay
25
+ // (enableWgpuTextInput) installs it; a static RichText leaves the slot null and pulls no text-input code.
26
+ const overlay = _webgpuTextInputOverlay !== null && getRichTextRuntime(renderProxy.source).input !== null
27
+ ? _webgpuTextInputOverlay
28
+ : undefined;
29
+ drawWgpuRichTextWithOverlay(state, renderProxy, overlay);
30
+ }
31
+ export function drawWgpuRichTextWithOverlay(state, renderProxy, overlay) {
32
+ const runtime = getWgpuRenderStateRuntime(state);
33
+ if (runtime.renderPass === null)
34
+ return;
35
+ flushWgpuSpriteBatch(state);
36
+ const source = renderProxy.source;
37
+ const data = source.data;
38
+ const richTextRuntime = getRichTextRuntime(source);
39
+ const content = getRichTextContent(richTextRuntime);
40
+ computeRichTextContent(content, data, getRichTextPasswordCharacter(source));
41
+ if (content.text.length === 0 && !data.background && !data.border)
42
+ return;
43
+ const result = layoutRichText(source, richTextRuntime, content.text, content.formatRanges, state);
44
+ const maxTexDim = state.device.limits.maxTextureDimension2D;
45
+ const pixelRatio = state.pixelRatio;
46
+ const maxLogical = Math.floor(maxTexDim / pixelRatio);
47
+ const fieldW = Math.min(Math.ceil(computeTextBoundsWidth(data, result)), maxLogical);
48
+ const fieldH = Math.min(Math.ceil(computeTextBoundsHeight(data, result)), maxLogical);
49
+ if (fieldW <= 0 || fieldH <= 0)
50
+ return;
51
+ const offCtx = getOffscreenCanvas(fieldW, fieldH, pixelRatio);
52
+ offCtx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);
53
+ offCtx.clearRect(0, 0, fieldW, fieldH);
54
+ if (data.background) {
55
+ offCtx.fillStyle = computeRgbHexString(data.backgroundColor);
56
+ offCtx.fillRect(0, 0, fieldW, fieldH);
57
+ }
58
+ if (data.border) {
59
+ offCtx.strokeStyle = computeRgbHexString(data.borderColor);
60
+ offCtx.lineWidth = 1;
61
+ offCtx.strokeRect(0, 0, fieldW, fieldH);
62
+ }
63
+ if (content.text.length > 0) {
64
+ drawRichTextToCanvas(offCtx, source, result, fieldW, fieldH, content.text);
65
+ }
66
+ overlay?.(offCtx, source, result, fieldW, fieldH, content.text);
67
+ state.applyBlendMode?.(state, renderProxy.blendMode);
68
+ const richData = getWgpuRendererData(renderProxy.rendererData);
69
+ if (richData === null)
70
+ return;
71
+ const pw = _offscreenCanvas.width;
72
+ const ph = _offscreenCanvas.height;
73
+ let entry = richData.entry;
74
+ if (entry === null || richData.w !== pw || richData.h !== ph) {
75
+ entry?.texture.destroy();
76
+ entry = createWgpuTextureEntry(state, pw, ph, _offscreenCanvas);
77
+ richData.entry = entry;
78
+ richData.w = pw;
79
+ richData.h = ph;
80
+ }
81
+ else {
82
+ updateWgpuTextureEntry(state, entry, _offscreenCanvas);
83
+ }
84
+ // Anchor the field box for autoSize 'right'/'center' so the rendered quad lines up with the local
85
+ // bounds (computeRichTextLocalBoundsRectangle applies the same offset). Zero for 'none'/'left'.
86
+ const offsetX = computeTextBoundsOffsetX(data, result);
87
+ drawWgpuQuad(state, renderProxy, entry, offsetX, 0, offsetX + fieldW, fieldH, 0, 0, 1, 1);
88
+ }
89
+ export function registerWgpuTextInputOverlay(overlay) {
90
+ _webgpuTextInputOverlay = overlay;
91
+ }
92
+ export const defaultWgpuRichTextRenderer = {
93
+ createData: createWgpuRichTextData,
94
+ destroyData: destroyWgpuRichTextData,
95
+ submit: drawWgpuRichText,
96
+ };
97
+ function drawRichTextToCanvas(context, source, result, fieldW, fieldH, text) {
98
+ const data = source.data;
99
+ const firstVisibleLine = data.scrollV - 1;
100
+ const scrollYOffset = firstVisibleLine > 0 ? getRichTextScrollYOffset(result.lineHeights, firstVisibleLine) : 0;
101
+ const scrollXOffset = data.scrollH;
102
+ context.save();
103
+ context.beginPath();
104
+ context.rect(0, 0, fieldW, fieldH);
105
+ context.clip();
106
+ context.textBaseline = 'alphabetic';
107
+ context.textAlign = 'start';
108
+ for (const group of result.groups) {
109
+ if (group.lineIndex < firstVisibleLine)
110
+ continue;
111
+ context.font = computeTextFormatFontString(group.format);
112
+ context.fillStyle = computeRgbHexString(group.format.color ?? data.textColor);
113
+ const slice = text.substring(group.startIndex, group.endIndex);
114
+ const x = group.offsetX - scrollXOffset;
115
+ const y = group.offsetY + group.ascent - scrollYOffset;
116
+ context.fillText(slice, x, y);
117
+ if (group.format.underline || group.format.strikethrough) {
118
+ context.strokeStyle = computeRgbHexString(group.format.color ?? data.textColor);
119
+ context.lineWidth = Math.max(1, (group.format.size ?? 12) / 16);
120
+ if (group.format.underline) {
121
+ const lineY = y + group.descent;
122
+ context.beginPath();
123
+ context.moveTo(x, lineY);
124
+ context.lineTo(x + group.width, lineY);
125
+ context.stroke();
126
+ }
127
+ // Strikethrough sits ~35% of the ascent above the baseline — through the middle of the glyphs,
128
+ // matching scene2d-canvas's canvasRichText.
129
+ if (group.format.strikethrough) {
130
+ const lineY = y - group.ascent * 0.35;
131
+ context.beginPath();
132
+ context.moveTo(x, lineY);
133
+ context.lineTo(x + group.width, lineY);
134
+ context.stroke();
135
+ }
136
+ }
137
+ }
138
+ context.restore();
139
+ }
140
+ function getOffscreenCanvas(width, height, pixelRatio = 1) {
141
+ if (!_offscreenCanvas) {
142
+ _offscreenCanvas = document.createElement('canvas');
143
+ _offscreenCtx = _offscreenCanvas.getContext('2d');
144
+ }
145
+ const pw = Math.ceil(width * pixelRatio);
146
+ const ph = Math.ceil(height * pixelRatio);
147
+ if (_offscreenCanvas.width !== pw)
148
+ _offscreenCanvas.width = pw;
149
+ if (_offscreenCanvas.height !== ph)
150
+ _offscreenCanvas.height = ph;
151
+ return _offscreenCtx;
152
+ }
153
+ function layoutRichText(source, richTextRuntime, text, formatRanges, state) {
154
+ const data = source.data;
155
+ const maxTexDim = state.device.limits.maxTextureDimension2D;
156
+ const maxLogical = Math.floor(maxTexDim / state.pixelRatio);
157
+ const measure = (value, format) => {
158
+ const context = getOffscreenCanvas(1, 1);
159
+ context.font = computeTextFormatFontString(format);
160
+ return context.measureText(value).width;
161
+ };
162
+ const result = getTextLayoutResult(richTextRuntime);
163
+ computeTextLayout(result, {
164
+ formatRanges,
165
+ height: Math.min(data.height, maxLogical),
166
+ measure,
167
+ multiline: data.multiline,
168
+ text,
169
+ verticalAlign: data.autoSize === 'none' ? data.verticalAlign : 'top',
170
+ width: Math.min(data.wordWrap ? data.width : 10000, maxLogical),
171
+ wordWrap: data.wordWrap,
172
+ });
173
+ return result;
174
+ }
175
+ //# sourceMappingURL=wgpuRichText.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuRichText.js","sourceRoot":"","sources":["../src/wgpuRichText.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { RectangleLike, Scale9Mapper } from '@flighthq/types';
2
+ export declare function buildWgpuScale9Mapper(bounds: Readonly<RectangleLike>, scale9Grid: Readonly<RectangleLike>, scaleX: number, scaleY: number): Scale9Mapper | null;
3
+ //# sourceMappingURL=wgpuScale9Mapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuScale9Mapper.d.ts","sourceRoot":"","sources":["../src/wgpuScale9Mapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAOnE,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,QAAQ,CAAC,aAAa,CAAC,EAC/B,UAAU,EAAE,QAAQ,CAAC,aAAa,CAAC,EACnC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb,YAAY,GAAG,IAAI,CAcrB"}
@@ -0,0 +1,42 @@
1
+ // Pure 9-slice coordinate mapping (no GPU calls): builds a Scale9Mapper that maps unscaled shape
2
+ // coordinates into the scaled field, leaving the grid corners fixed and stretching the center. This
3
+ // is an exact copy of the Gl mapper — the math is renderer-agnostic and is duplicated per backend
4
+ // to keep each render package self-contained; a shared home (e.g. scene2d-canvas, which already owns
5
+ // mapCanvasScale9ShapeCommands) would let both backends drop their copy.
6
+ export function buildWgpuScale9Mapper(bounds, scale9Grid, scaleX, scaleY) {
7
+ if (scaleX <= 0 || scaleY <= 0 || bounds.width <= 0 || bounds.height <= 0)
8
+ return null;
9
+ const gx = scale9Grid.x;
10
+ const gy = scale9Grid.y;
11
+ const gw = scale9Grid.width;
12
+ const gh = scale9Grid.height;
13
+ const bw = bounds.width;
14
+ const bh = bounds.height;
15
+ return {
16
+ mapX: (x) => toScale9Position(x, gx, gw, bw, scaleX),
17
+ mapY: (y) => toScale9Position(y, gy, gh, bh, scaleY),
18
+ };
19
+ }
20
+ function toScale9Position(pos, scale9Start, scale9Center, unscaledSize, scale) {
21
+ const scale9End = unscaledSize - scale9Center - scale9Start;
22
+ const size = unscaledSize * scale;
23
+ const center = size - scale9Start - scale9End;
24
+ if (pos <= scale9Start) {
25
+ if (center < 0) {
26
+ return (pos * (scale9Start + scale9End + center)) / (scale9Start + scale9End);
27
+ }
28
+ return pos;
29
+ }
30
+ if (pos >= scale9Start + scale9Center) {
31
+ if (center < 0) {
32
+ return (((scale9Start + (pos - scale9Start - scale9Center)) * (scale9Start + scale9End + center)) /
33
+ (scale9Start + scale9End));
34
+ }
35
+ return scale9Start + center + (pos - scale9Start - scale9Center);
36
+ }
37
+ if (center < 0) {
38
+ return (scale9Start * (scale9Start + scale9End + center)) / (scale9Start + scale9End);
39
+ }
40
+ return scale9Start + (center * (pos - scale9Start)) / scale9Center;
41
+ }
42
+ //# sourceMappingURL=wgpuScale9Mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuScale9Mapper.js","sourceRoot":"","sources":["../src/wgpuScale9Mapper.ts"],"names":[],"mappings":"AAEA,iGAAiG;AACjG,oGAAoG;AACpG,kGAAkG;AAClG,qGAAqG;AACrG,yEAAyE;AACzE,MAAM,UAAU,qBAAqB,CACnC,MAA+B,EAC/B,UAAmC,EACnC,MAAc,EACd,MAAc;IAEd,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAEvF,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC;IACxB,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC;IACxB,MAAM,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC;IAC5B,MAAM,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC;IAC7B,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC;IACxB,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC;IAEzB,OAAO;QACL,IAAI,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC;QAC5D,IAAI,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC;KAC7D,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CACvB,GAAW,EACX,WAAmB,EACnB,YAAoB,EACpB,YAAoB,EACpB,KAAa;IAEb,MAAM,SAAS,GAAG,YAAY,GAAG,YAAY,GAAG,WAAW,CAAC;IAC5D,MAAM,IAAI,GAAG,YAAY,GAAG,KAAK,CAAC;IAClC,MAAM,MAAM,GAAG,IAAI,GAAG,WAAW,GAAG,SAAS,CAAC;IAE9C,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC;QACvB,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,GAAG,CAAC,WAAW,GAAG,SAAS,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC;QAChF,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,GAAG,IAAI,WAAW,GAAG,YAAY,EAAE,CAAC;QACtC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YACf,OAAO,CACL,CAAC,CAAC,WAAW,GAAG,CAAC,GAAG,GAAG,WAAW,GAAG,YAAY,CAAC,CAAC,GAAG,CAAC,WAAW,GAAG,SAAS,GAAG,MAAM,CAAC,CAAC;gBACzF,CAAC,WAAW,GAAG,SAAS,CAAC,CAC1B,CAAC;QACJ,CAAC;QACD,OAAO,WAAW,GAAG,MAAM,GAAG,CAAC,GAAG,GAAG,WAAW,GAAG,YAAY,CAAC,CAAC;IACnE,CAAC;IAED,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QACf,OAAO,CAAC,WAAW,GAAG,CAAC,WAAW,GAAG,SAAS,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC;IACxF,CAAC;IACD,OAAO,WAAW,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG,GAAG,WAAW,CAAC,CAAC,GAAG,YAAY,CAAC;AACrE,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { mapCanvasScale9ShapeCommands } from '@flighthq/scene2d-canvas';
2
+ import type { Scene2DRenderer, Renderable, RendererData, RenderProxy2D, RenderState, WgpuRenderState } from '@flighthq/types';
3
+ export declare function createWgpuScale9ShapeData(_state: RenderState, _source: Renderable): RendererData;
4
+ export declare function destroyWgpuScale9ShapeData(_state: RenderState, data: RendererData): void;
5
+ export declare function drawWgpuScale9Shape(state: WgpuRenderState, renderProxy: RenderProxy2D): void;
6
+ export declare function drawWgpuScale9ShapeMask(state: WgpuRenderState, data: RenderProxy2D): void;
7
+ export declare function remapWgpuScale9Commands(out: unknown[], source: readonly unknown[], mapper: Parameters<typeof mapCanvasScale9ShapeCommands>[2]): void;
8
+ export declare const defaultWgpuScale9ShapeRenderer: Scene2DRenderer;
9
+ //# sourceMappingURL=wgpuScale9Shape.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuScale9Shape.d.ts","sourceRoot":"","sources":["../src/wgpuScale9Shape.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,4BAA4B,EAA6B,MAAM,0BAA0B,CAAC;AACnG,OAAO,KAAK,EACV,eAAe,EACf,UAAU,EACV,YAAY,EACZ,aAAa,EACb,WAAW,EAEX,eAAe,EAEhB,MAAM,iBAAiB,CAAC;AAsBzB,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,GAAG,YAAY,CAehG;AAGD,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI,CAIxF;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,aAAa,GAAG,IAAI,CAgF5F;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI,CAEzF;AAED,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,OAAO,EAAE,EACd,MAAM,EAAE,SAAS,OAAO,EAAE,EAC1B,MAAM,EAAE,UAAU,CAAC,OAAO,4BAA4B,CAAC,CAAC,CAAC,CAAC,GACzD,IAAI,CAeN;AAED,eAAO,MAAM,8BAA8B,EAAE,eAI5C,CAAC"}
@@ -0,0 +1,123 @@
1
+ import { getNodeLocalBoundsRectangle, getNodeLocalContentRevision } from '@flighthq/node';
2
+ import { createWgpuTextureEntry, drawWgpuQuadWithTransform, updateWgpuTextureEntry } from '@flighthq/render-wgpu';
3
+ import { getWgpuRenderStateRuntime } from '@flighthq/render-wgpu';
4
+ import { mapCanvasScale9ShapeCommands, renderCanvasShapeCommands } from '@flighthq/scene2d-canvas';
5
+ import { createWgpuRendererData, getWgpuRendererData } from './wgpuRendererData';
6
+ import { buildWgpuScale9Mapper } from './wgpuScale9Mapper';
7
+ import { drawWgpuShape } from './wgpuShape';
8
+ import { flushWgpuSpriteBatch } from './wgpuSpriteBatch';
9
+ export function createWgpuScale9ShapeData(_state, _source) {
10
+ const canvas = document.createElement('canvas');
11
+ canvas.width = 1;
12
+ canvas.height = 1;
13
+ const ctx = canvas.getContext('2d');
14
+ return createWgpuRendererData({
15
+ canvas,
16
+ ctx,
17
+ lastH: 0,
18
+ lastScaleX: -1,
19
+ lastScaleY: -1,
20
+ lastContentId: -1,
21
+ lastW: 0,
22
+ entry: null,
23
+ });
24
+ }
25
+ // Scale9 owns its texture directly (created lazily on first draw), so destroy it on teardown.
26
+ export function destroyWgpuScale9ShapeData(_state, data) {
27
+ const shapeData = getWgpuRendererData(data);
28
+ if (shapeData === null)
29
+ return;
30
+ shapeData.entry?.texture.destroy();
31
+ }
32
+ export function drawWgpuScale9Shape(state, renderProxy) {
33
+ const runtime = getWgpuRenderStateRuntime(state);
34
+ if (runtime.renderPass === null)
35
+ return;
36
+ flushWgpuSpriteBatch(state);
37
+ const source = renderProxy.source;
38
+ const { commands, scale9Grid } = source.data;
39
+ const version = getNodeLocalContentRevision(source);
40
+ if (commands.length === 0)
41
+ return;
42
+ if (renderProxy.rendererData === null)
43
+ return;
44
+ const bounds = getNodeLocalBoundsRectangle(source);
45
+ const mapper = buildWgpuScale9Mapper(bounds, scale9Grid, source.scaleX, source.scaleY);
46
+ if (mapper === null) {
47
+ drawWgpuShape(state, renderProxy);
48
+ return;
49
+ }
50
+ const shapeData = getWgpuRendererData(renderProxy.rendererData);
51
+ if (shapeData === null)
52
+ return;
53
+ const w = Math.ceil(bounds.width * source.scaleX);
54
+ const h = Math.ceil(bounds.height * source.scaleY);
55
+ if (w <= 0 || h <= 0)
56
+ return;
57
+ if (version !== shapeData.lastContentId ||
58
+ w !== shapeData.lastW ||
59
+ h !== shapeData.lastH ||
60
+ source.scaleX !== shapeData.lastScaleX ||
61
+ source.scaleY !== shapeData.lastScaleY) {
62
+ shapeData.canvas.width = w;
63
+ shapeData.canvas.height = h;
64
+ const ctx = shapeData.ctx;
65
+ ctx.clearRect(0, 0, w, h);
66
+ ctx.save();
67
+ remapWgpuScale9Commands(_remappedCommands, commands, mapper);
68
+ ctx.translate(-bounds.x, -bounds.y);
69
+ renderCanvasShapeCommands(ctx, _remappedCommands);
70
+ ctx.restore();
71
+ // GPU textures are fixed-size: recreate the entry when the field size changes, otherwise reupload
72
+ // the canvas pixels into the existing entry.
73
+ if (shapeData.entry === null || shapeData.lastW !== w || shapeData.lastH !== h) {
74
+ shapeData.entry?.texture.destroy();
75
+ shapeData.entry = createWgpuTextureEntry(state, w, h, shapeData.canvas);
76
+ }
77
+ else {
78
+ updateWgpuTextureEntry(state, shapeData.entry, shapeData.canvas);
79
+ }
80
+ shapeData.lastH = h;
81
+ shapeData.lastScaleX = source.scaleX;
82
+ shapeData.lastScaleY = source.scaleY;
83
+ shapeData.lastContentId = version;
84
+ shapeData.lastW = w;
85
+ }
86
+ if (shapeData.entry === null)
87
+ return;
88
+ // Strip the node scale from the transform: the texture is already rasterized at the scaled size, so
89
+ // the quad must be drawn at unit scale (only the non-scale parts of the transform apply).
90
+ const t = renderProxy.transform2D;
91
+ const a = source.scaleX !== 0 ? t.a / source.scaleX : t.a;
92
+ const b = source.scaleX !== 0 ? t.b / source.scaleX : t.b;
93
+ const c = source.scaleY !== 0 ? t.c / source.scaleY : t.c;
94
+ const d = source.scaleY !== 0 ? t.d / source.scaleY : t.d;
95
+ drawWgpuQuadWithTransform(state, renderProxy, { a, b, c, d, tx: t.tx, ty: t.ty }, shapeData.entry, 0, 0, w, h, 0, 0, 1, 1);
96
+ }
97
+ export function drawWgpuScale9ShapeMask(state, data) {
98
+ drawWgpuScale9Shape(state, data);
99
+ }
100
+ export function remapWgpuScale9Commands(out, source, mapper) {
101
+ mapCanvasScale9ShapeCommands(out, source, mapper);
102
+ let i = 0;
103
+ while (i < out.length) {
104
+ const key = out[i];
105
+ const argCount = out[i + 1];
106
+ if (key === 'drawPath') {
107
+ const pathData = out[i + 3];
108
+ _remappedPathData.length = pathData.length;
109
+ for (let k = 0; k < pathData.length; k++)
110
+ _remappedPathData[k] = pathData[k];
111
+ out[i + 3] = _remappedPathData;
112
+ }
113
+ i += argCount + 2;
114
+ }
115
+ }
116
+ export const defaultWgpuScale9ShapeRenderer = {
117
+ createData: createWgpuScale9ShapeData,
118
+ destroyData: destroyWgpuScale9ShapeData,
119
+ submit: drawWgpuScale9Shape,
120
+ };
121
+ const _remappedCommands = [];
122
+ const _remappedPathData = [];
123
+ //# sourceMappingURL=wgpuScale9Shape.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuScale9Shape.js","sourceRoot":"","sources":["../src/wgpuScale9Shape.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Scene2DRenderer, RenderProxy2D, WgpuRenderState } from '@flighthq/types';
2
+ export declare function drawWgpuShape(state: WgpuRenderState, renderProxy: RenderProxy2D): void;
3
+ export declare const defaultWgpuShapeRenderer: Scene2DRenderer;
4
+ //# sourceMappingURL=wgpuShape.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuShape.d.ts","sourceRoot":"","sources":["../src/wgpuShape.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,eAAe,EAIf,aAAa,EAKb,eAAe,EAEhB,MAAM,iBAAiB,CAAC;AAyFzB,wBAAgB,aAAa,CAAC,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,aAAa,GAAG,IAAI,CA+FtF;AAED,eAAO,MAAM,wBAAwB,EAAE,eAKtC,CAAC"}
@@ -0,0 +1,164 @@
1
+ import { createImageResource, setImageResourceSource } from '@flighthq/image';
2
+ import { getNodeLocalBoundsRectangle, getNodeLocalContentRevision } from '@flighthq/node';
3
+ import { tessellatePath } from '@flighthq/path';
4
+ import { resolveWgpuMaterialRenderer } from '@flighthq/render-wgpu';
5
+ import { getWgpuRenderStateRuntime } from '@flighthq/render-wgpu';
6
+ import { renderCanvasShapeCommands } from '@flighthq/scene2d-canvas';
7
+ import { getShapeFillRegions, getShapeStrokeRegions, hasShapeFill } from '@flighthq/shape';
8
+ import { BatchFormat } from '@flighthq/types';
9
+ import { createWgpuRendererData, getWgpuRendererData } from './wgpuRendererData';
10
+ import { drawWgpuShapeMeshes } from './wgpuShapeMesh';
11
+ import { ensureWgpuQuadBatchResources, packWgpuSpriteBatchMaterialInstance, prepareWgpuSpriteBatchWrite, recordWgpuSpriteBatchColorTransform, } from './wgpuSpriteBatch';
12
+ function createWgpuShapeData(_state, _source) {
13
+ const canvas = document.createElement('canvas');
14
+ canvas.width = 1;
15
+ canvas.height = 1;
16
+ const ctx = canvas.getContext('2d');
17
+ return createWgpuRendererData({
18
+ canvas,
19
+ ctx,
20
+ image: createImageResource(canvas),
21
+ lastContentId: -1,
22
+ lastW: 0,
23
+ lastH: 0,
24
+ meshVersion: -1,
25
+ meshes: null,
26
+ meshBuffers: {
27
+ vertexBuffer: null,
28
+ vertexCapacity: 0,
29
+ indexBuffer: null,
30
+ indexCapacity: 0,
31
+ uniformBuffer: null,
32
+ bindGroup: null,
33
+ },
34
+ });
35
+ }
36
+ // Destroy the GPU texture the batch uploaded for this shape's canvas, plus the mesh path's per-shape
37
+ // vertex/index/uniform buffers, when the shape is torn down.
38
+ function destroyWgpuShapeData(state, data) {
39
+ const runtime = getWgpuRenderStateRuntime(state);
40
+ const shapeData = getWgpuRendererData(data);
41
+ if (shapeData === null)
42
+ return;
43
+ const entry = runtime.imageResourceTextureCache.get(shapeData.image);
44
+ if (entry !== undefined) {
45
+ entry.texture.destroy();
46
+ runtime.imageResourceTextureCache.delete(shapeData.image);
47
+ }
48
+ const b = shapeData.meshBuffers;
49
+ b.vertexBuffer?.destroy();
50
+ b.indexBuffer?.destroy();
51
+ b.uniformBuffer?.destroy();
52
+ b.vertexBuffer = null;
53
+ b.indexBuffer = null;
54
+ b.uniformBuffer = null;
55
+ b.bindGroup = null;
56
+ }
57
+ // Chooses the fillable regions to tessellate into GPU meshes for a shape: its solid-fill regions when it
58
+ // is fill-only, or its stroke-outline regions (via getShapeStrokeRegions → strokePath) when it is
59
+ // stroke-only. Returns null when the shape must use the raster fallback — a gradient/bitmap fill or
60
+ // stroke, a closed-primitive (ring) stroke, or a shape that BOTH fills and strokes. Mirrors
61
+ // scene2d-gl/glShape's resolveGlShapeMeshRegions.
62
+ function resolveWgpuShapeMeshRegions(commands) {
63
+ const fillRegions = getShapeFillRegions(commands);
64
+ if (fillRegions !== null)
65
+ return fillRegions.length > 0 ? fillRegions : null;
66
+ if (hasShapeFill(commands))
67
+ return null;
68
+ return getShapeStrokeRegions(commands);
69
+ }
70
+ export function drawWgpuShape(state, renderProxy) {
71
+ const runtime = getWgpuRenderStateRuntime(state);
72
+ if (runtime.renderPass === null)
73
+ return;
74
+ const source = renderProxy.source;
75
+ const { commands } = source.data;
76
+ const version = getNodeLocalContentRevision(source);
77
+ if (commands.length === 0)
78
+ return;
79
+ if (renderProxy.rendererData === null)
80
+ return;
81
+ // GPU mesh path: solid-fill shapes tessellate to colored meshes (crisp at any zoom), and a STROKE-ONLY
82
+ // shape offsets its strokes to fillable outlines via getShapeStrokeRegions (real joins/caps/dashing,
83
+ // resolution-independent — no offscreen raster). Falls through to the canvas-raster path for
84
+ // gradient/bitmap fills/strokes, closed-primitive (ring) strokes, and filled-and-stroked shapes (the
85
+ // fill + stroke mesh paths don't compose yet). Mirrors scene2d-gl/glShape.
86
+ const regions = resolveWgpuShapeMeshRegions(commands);
87
+ if (regions !== null && regions.length > 0) {
88
+ const meshData = getWgpuRendererData(renderProxy.rendererData);
89
+ if (meshData === null)
90
+ return;
91
+ if (meshData.meshVersion !== version) {
92
+ meshData.meshes = regions.map((region) => {
93
+ const mesh = tessellatePath(region.path);
94
+ return {
95
+ vertices: new Float32Array(mesh.vertices),
96
+ indices: new Uint16Array(mesh.indices),
97
+ color: region.color,
98
+ alpha: region.alpha,
99
+ };
100
+ });
101
+ meshData.meshVersion = version;
102
+ }
103
+ drawWgpuShapeMeshes(state, renderProxy, meshData.meshes ?? [], meshData.meshBuffers);
104
+ return;
105
+ }
106
+ const material = renderProxy.material;
107
+ const materialRenderer = resolveWgpuMaterialRenderer(state, material);
108
+ if (materialRenderer === null)
109
+ return;
110
+ const shapeData = getWgpuRendererData(renderProxy.rendererData);
111
+ if (shapeData === null)
112
+ return;
113
+ const bounds = getNodeLocalBoundsRectangle(source);
114
+ const w = Math.ceil(bounds.width);
115
+ const h = Math.ceil(bounds.height);
116
+ if (w <= 0 || h <= 0)
117
+ return;
118
+ if (version !== shapeData.lastContentId || w !== shapeData.lastW || h !== shapeData.lastH) {
119
+ shapeData.canvas.width = w;
120
+ shapeData.canvas.height = h;
121
+ const ctx = shapeData.ctx;
122
+ ctx.clearRect(0, 0, w, h);
123
+ ctx.save();
124
+ ctx.translate(-bounds.x, -bounds.y);
125
+ renderCanvasShapeCommands(ctx, commands);
126
+ ctx.restore();
127
+ // Re-read the canvas dimensions and bump the resource version so the batch's version-aware cache
128
+ // re-uploads (recreating the GPU texture, which covers a size change too).
129
+ setImageResourceSource(shapeData.image, shapeData.canvas);
130
+ shapeData.lastContentId = version;
131
+ shapeData.lastW = w;
132
+ shapeData.lastH = h;
133
+ }
134
+ ensureWgpuQuadBatchResources(state);
135
+ const t = renderProxy.transform2D;
136
+ const tx = t.tx + t.a * bounds.x + t.c * bounds.y;
137
+ const ty = t.ty + t.b * bounds.x + t.d * bounds.y;
138
+ const startCount = runtime.spriteBatchCount;
139
+ const base = prepareWgpuSpriteBatchWrite(state, shapeData.image, renderProxy.blendMode, material, materialRenderer, 1);
140
+ const d = runtime.spriteBatchInstanceData;
141
+ d[base] = t.a;
142
+ d[base + 1] = t.b;
143
+ d[base + 2] = t.c;
144
+ d[base + 3] = t.d;
145
+ d[base + 4] = tx;
146
+ d[base + 5] = ty;
147
+ d[base + 6] = w;
148
+ d[base + 7] = h;
149
+ d[base + 8] = 0;
150
+ d[base + 9] = 0;
151
+ d[base + 10] = 1;
152
+ d[base + 11] = 1;
153
+ d[base + 12] = renderProxy.alpha;
154
+ packWgpuSpriteBatchMaterialInstance(state, renderProxy.materialData, startCount);
155
+ recordWgpuSpriteBatchColorTransform(state, renderProxy.colorTransform, startCount);
156
+ runtime.spriteBatchCount++;
157
+ }
158
+ export const defaultWgpuShapeRenderer = {
159
+ format: BatchFormat.Quad,
160
+ createData: createWgpuShapeData,
161
+ destroyData: destroyWgpuShapeData,
162
+ submit: drawWgpuShape,
163
+ };
164
+ //# sourceMappingURL=wgpuShape.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuShape.js","sourceRoot":"","sources":["../src/wgpuShape.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { RenderProxy2D, WgpuRenderState, WgpuShapeMesh, WgpuShapeMeshBuffers } from '@flighthq/types';
2
+ export declare function drawWgpuShapeMeshes(state: WgpuRenderState, renderProxy: RenderProxy2D, meshes: readonly WgpuShapeMesh[], buffers: WgpuShapeMeshBuffers): void;
3
+ //# sourceMappingURL=wgpuShapeMesh.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuShapeMesh.d.ts","sourceRoot":"","sources":["../src/wgpuShapeMesh.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,aAAa,EACb,eAAe,EACf,aAAa,EACb,oBAAoB,EAErB,MAAM,iBAAiB,CAAC;AAyBzB,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,eAAe,EACtB,WAAW,EAAE,aAAa,EAC1B,MAAM,EAAE,SAAS,aAAa,EAAE,EAChC,OAAO,EAAE,oBAAoB,GAC5B,IAAI,CAiDN"}