@flighthq/displayobject-wgpu 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 (144) hide show
  1. package/dist/index.d.ts +29 -0
  2. package/dist/index.d.ts.map +1 -0
  3. package/dist/index.js +29 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/moduleMockTestHelper.d.ts +15 -0
  6. package/dist/moduleMockTestHelper.d.ts.map +1 -0
  7. package/dist/moduleMockTestHelper.js +25 -0
  8. package/dist/moduleMockTestHelper.js.map +1 -0
  9. package/dist/wgpuBitmap.d.ts +4 -0
  10. package/dist/wgpuBitmap.d.ts.map +1 -0
  11. package/dist/wgpuBitmap.js +80 -0
  12. package/dist/wgpuBitmap.js.map +1 -0
  13. package/dist/wgpuCache.d.ts +31 -0
  14. package/dist/wgpuCache.d.ts.map +1 -0
  15. package/dist/wgpuCache.js +232 -0
  16. package/dist/wgpuCache.js.map +1 -0
  17. package/dist/wgpuClip.d.ts +3 -0
  18. package/dist/wgpuClip.d.ts.map +1 -0
  19. package/dist/wgpuClip.js +44 -0
  20. package/dist/wgpuClip.js.map +1 -0
  21. package/dist/wgpuClipContours.d.ts +4 -0
  22. package/dist/wgpuClipContours.d.ts.map +1 -0
  23. package/dist/wgpuClipContours.js +174 -0
  24. package/dist/wgpuClipContours.js.map +1 -0
  25. package/dist/wgpuClipRectangle.d.ts +4 -0
  26. package/dist/wgpuClipRectangle.d.ts.map +1 -0
  27. package/dist/wgpuClipRectangle.js +80 -0
  28. package/dist/wgpuClipRectangle.js.map +1 -0
  29. package/dist/wgpuColorTransformMaterial.d.ts +5 -0
  30. package/dist/wgpuColorTransformMaterial.d.ts.map +1 -0
  31. package/dist/wgpuColorTransformMaterial.js +97 -0
  32. package/dist/wgpuColorTransformMaterial.js.map +1 -0
  33. package/dist/wgpuDefaultMaterial.d.ts +4 -0
  34. package/dist/wgpuDefaultMaterial.d.ts.map +1 -0
  35. package/dist/wgpuDefaultMaterial.js +46 -0
  36. package/dist/wgpuDefaultMaterial.js.map +1 -0
  37. package/dist/wgpuDisplayObject.d.ts +5 -0
  38. package/dist/wgpuDisplayObject.d.ts.map +1 -0
  39. package/dist/wgpuDisplayObject.js +41 -0
  40. package/dist/wgpuDisplayObject.js.map +1 -0
  41. package/dist/wgpuMaterials.d.ts +15 -0
  42. package/dist/wgpuMaterials.d.ts.map +1 -0
  43. package/dist/wgpuMaterials.js +34 -0
  44. package/dist/wgpuMaterials.js.map +1 -0
  45. package/dist/wgpuParticleEmitter.d.ts +4 -0
  46. package/dist/wgpuParticleEmitter.d.ts.map +1 -0
  47. package/dist/wgpuParticleEmitter.js +288 -0
  48. package/dist/wgpuParticleEmitter.js.map +1 -0
  49. package/dist/wgpuQuadBatch.d.ts +7 -0
  50. package/dist/wgpuQuadBatch.d.ts.map +1 -0
  51. package/dist/wgpuQuadBatch.js +85 -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 +9 -0
  66. package/dist/wgpuRichText.d.ts.map +1 -0
  67. package/dist/wgpuRichText.js +163 -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 +157 -0
  80. package/dist/wgpuShape.js.map +1 -0
  81. package/dist/wgpuShapeMesh.d.ts +9 -0
  82. package/dist/wgpuShapeMesh.d.ts.map +1 -0
  83. package/dist/wgpuShapeMesh.js +204 -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 +18 -0
  90. package/dist/wgpuSpriteBatch.d.ts.map +1 -0
  91. package/dist/wgpuSpriteBatch.js +320 -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 +51 -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 +157 -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 +76 -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 +52 -0
  118. package/src/wgpuBitmap.test.ts +40 -0
  119. package/src/wgpuCache.test.ts +230 -0
  120. package/src/wgpuClip.test.ts +15 -0
  121. package/src/wgpuClipContours.test.ts +101 -0
  122. package/src/wgpuClipRectangle.test.ts +45 -0
  123. package/src/wgpuColorTransformMaterial.test.ts +62 -0
  124. package/src/wgpuDefaultMaterial.test.ts +21 -0
  125. package/src/wgpuDisplayObject.test.ts +36 -0
  126. package/src/wgpuMaterials.test.ts +44 -0
  127. package/src/wgpuParticleEmitter.test.ts +34 -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 +95 -0
  136. package/src/wgpuShapeMesh.test.ts +124 -0
  137. package/src/wgpuSprite.test.ts +19 -0
  138. package/src/wgpuSpriteBatch.test.ts +180 -0
  139. package/src/wgpuSpriteRenderer.test.ts +38 -0
  140. package/src/wgpuTextInput.test.ts +37 -0
  141. package/src/wgpuTextLabel.test.ts +113 -0
  142. package/src/wgpuTilemap.test.ts +47 -0
  143. package/src/wgpuVelocity.test.ts +147 -0
  144. package/src/wgpuVideo.test.ts +59 -0
@@ -0,0 +1,9 @@
1
+ import type { DisplayObjectRenderer, Renderable, RendererData, RenderProxy2D, RenderState, RichText, TextLayoutResult, WgpuRenderState } from '@flighthq/types';
2
+ export type WgpuRichTextOverlay = (context: CanvasRenderingContext2D, source: RichText, result: TextLayoutResult, fieldW: number, fieldH: number, text: string) => void;
3
+ export declare function createWgpuRichTextData(_state: RenderState, _source: Renderable): RendererData;
4
+ export declare function destroyWgpuRichTextData(_state: RenderState, data: RendererData): void;
5
+ export declare function drawWgpuRichText(state: WgpuRenderState, renderProxy: RenderProxy2D): void;
6
+ export declare function drawWgpuRichTextWithOverlay(state: WgpuRenderState, renderProxy: RenderProxy2D, overlay?: WgpuRichTextOverlay): void;
7
+ export declare function registerWgpuTextInputOverlay(overlay: WgpuRichTextOverlay): void;
8
+ export declare const defaultWgpuRichTextRenderer: DisplayObjectRenderer;
9
+ //# 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,qBAAqB,EACrB,UAAU,EACV,YAAY,EACZ,aAAa,EACb,WAAW,EACX,QAAQ,EAIR,gBAAgB,EAChB,eAAe,EAEhB,MAAM,iBAAiB,CAAC;AAKzB,MAAM,MAAM,mBAAmB,GAAG,CAChC,OAAO,EAAE,wBAAwB,EACjC,MAAM,EAAE,QAAQ,EAChB,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,KACT,IAAI,CAAC;AAcV,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,qBAIzC,CAAC"}
@@ -0,0 +1,163 @@
1
+ import { computeRgbHexString } from '@flighthq/materials';
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 disposeDisplayObjectRender.
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) {
118
+ const lineY = y + group.descent;
119
+ context.strokeStyle = computeRgbHexString(group.format.color ?? data.textColor);
120
+ context.lineWidth = Math.max(1, (group.format.size ?? 12) / 16);
121
+ context.beginPath();
122
+ context.moveTo(x, lineY);
123
+ context.lineTo(x + group.width, lineY);
124
+ context.stroke();
125
+ }
126
+ }
127
+ context.restore();
128
+ }
129
+ function getOffscreenCanvas(width, height, pixelRatio = 1) {
130
+ if (!_offscreenCanvas) {
131
+ _offscreenCanvas = document.createElement('canvas');
132
+ _offscreenCtx = _offscreenCanvas.getContext('2d');
133
+ }
134
+ const pw = Math.ceil(width * pixelRatio);
135
+ const ph = Math.ceil(height * pixelRatio);
136
+ if (_offscreenCanvas.width !== pw)
137
+ _offscreenCanvas.width = pw;
138
+ if (_offscreenCanvas.height !== ph)
139
+ _offscreenCanvas.height = ph;
140
+ return _offscreenCtx;
141
+ }
142
+ function layoutRichText(source, richTextRuntime, text, formatRanges, state) {
143
+ const data = source.data;
144
+ const maxTexDim = state.device.limits.maxTextureDimension2D;
145
+ const maxLogical = Math.floor(maxTexDim / state.pixelRatio);
146
+ const measure = (value, format) => {
147
+ const context = getOffscreenCanvas(1, 1);
148
+ context.font = computeTextFormatFontString(format);
149
+ return context.measureText(value).width;
150
+ };
151
+ const result = getTextLayoutResult(richTextRuntime);
152
+ computeTextLayout(result, {
153
+ formatRanges,
154
+ height: Math.min(data.height, maxLogical),
155
+ measure,
156
+ multiline: data.multiline,
157
+ text,
158
+ width: Math.min(data.wordWrap ? data.width : 10000, maxLogical),
159
+ wordWrap: data.wordWrap,
160
+ });
161
+ return result;
162
+ }
163
+ //# 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. displayobject-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,2GAA2G;AAC3G,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/displayobject-canvas';
2
+ import type { DisplayObjectRenderer, 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: DisplayObjectRenderer;
9
+ //# sourceMappingURL=wgpuScale9Shape.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuScale9Shape.d.ts","sourceRoot":"","sources":["../src/wgpuScale9Shape.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAA6B,MAAM,gCAAgC,CAAC;AAIzG,OAAO,KAAK,EACV,qBAAqB,EACrB,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,qBAI5C,CAAC"}
@@ -0,0 +1,123 @@
1
+ import { mapCanvasScale9ShapeCommands, renderCanvasShapeCommands } from '@flighthq/displayobject-canvas';
2
+ import { getNodeLocalBoundsRectangle, getNodeLocalContentRevision } from '@flighthq/node';
3
+ import { createWgpuTextureEntry, drawWgpuQuadWithTransform, updateWgpuTextureEntry } from '@flighthq/render-wgpu';
4
+ import { getWgpuRenderStateRuntime } from '@flighthq/render-wgpu';
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 { DisplayObjectRenderer, RenderProxy2D, WgpuRenderState } from '@flighthq/types';
2
+ export declare function drawWgpuShape(state: WgpuRenderState, renderProxy: RenderProxy2D): void;
3
+ export declare const defaultWgpuShapeRenderer: DisplayObjectRenderer;
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,qBAAqB,EAGrB,aAAa,EAGb,eAAe,EAEhB,MAAM,iBAAiB,CAAC;AAwEzB,wBAAgB,aAAa,CAAC,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,aAAa,GAAG,IAAI,CAqGtF;AAED,eAAO,MAAM,wBAAwB,EAAE,qBAKtC,CAAC"}
@@ -0,0 +1,157 @@
1
+ import { renderCanvasShapeCommands } from '@flighthq/displayobject-canvas';
2
+ import { getNodeLocalBoundsRectangle, getNodeLocalContentRevision } from '@flighthq/node';
3
+ import { tessellatePath } from '@flighthq/path';
4
+ import { updateWgpuTextureEntry } from '@flighthq/render-wgpu';
5
+ import { resolveWgpuMaterialRenderer } from '@flighthq/render-wgpu';
6
+ import { getWgpuRenderStateRuntime } from '@flighthq/render-wgpu';
7
+ import { getShapeFillRegions } 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, } 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
+ lastContentId: -1,
21
+ lastW: 0,
22
+ lastH: 0,
23
+ meshVersion: -1,
24
+ meshes: null,
25
+ meshBuffers: {
26
+ vertexBuffer: null,
27
+ vertexCapacity: 0,
28
+ indexBuffer: null,
29
+ indexCapacity: 0,
30
+ uniformBuffer: null,
31
+ bindGroup: null,
32
+ },
33
+ });
34
+ }
35
+ // Destroy the GPU texture the batch uploaded for this shape's canvas, plus the mesh path's per-shape
36
+ // vertex/index/uniform buffers, when the shape is torn down.
37
+ function destroyWgpuShapeData(state, data) {
38
+ const runtime = getWgpuRenderStateRuntime(state);
39
+ const shapeData = getWgpuRendererData(data);
40
+ if (shapeData === null)
41
+ return;
42
+ const { canvas } = shapeData;
43
+ const entry = runtime.textureCache.get(canvas);
44
+ if (entry !== undefined) {
45
+ entry.texture.destroy();
46
+ runtime.textureCache.delete(canvas);
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
+ export function drawWgpuShape(state, renderProxy) {
58
+ const runtime = getWgpuRenderStateRuntime(state);
59
+ if (runtime.renderPass === null)
60
+ return;
61
+ const source = renderProxy.source;
62
+ const { commands } = source.data;
63
+ const version = getNodeLocalContentRevision(source);
64
+ if (commands.length === 0)
65
+ return;
66
+ if (renderProxy.rendererData === null)
67
+ return;
68
+ // GPU fill path: solid-fill shapes tessellate to colored meshes (crisp at any zoom). Falls through to
69
+ // the canvas-raster path for gradient/bitmap fills and strokes (getShapeFillRegions returns null).
70
+ const regions = getShapeFillRegions(commands);
71
+ if (regions !== null && regions.length > 0) {
72
+ const meshData = getWgpuRendererData(renderProxy.rendererData);
73
+ if (meshData === null)
74
+ return;
75
+ if (meshData.meshVersion !== version) {
76
+ meshData.meshes = regions.map((region) => {
77
+ const mesh = tessellatePath(region.path);
78
+ return {
79
+ vertices: new Float32Array(mesh.vertices),
80
+ indices: new Uint16Array(mesh.indices),
81
+ color: region.color,
82
+ alpha: region.alpha,
83
+ };
84
+ });
85
+ meshData.meshVersion = version;
86
+ }
87
+ drawWgpuShapeMeshes(state, renderProxy, meshData.meshes ?? [], meshData.meshBuffers);
88
+ return;
89
+ }
90
+ const material = renderProxy.material;
91
+ const materialRenderer = resolveWgpuMaterialRenderer(state, material);
92
+ if (materialRenderer === null)
93
+ return;
94
+ const shapeData = getWgpuRendererData(renderProxy.rendererData);
95
+ if (shapeData === null)
96
+ return;
97
+ const bounds = getNodeLocalBoundsRectangle(source);
98
+ const w = Math.ceil(bounds.width);
99
+ const h = Math.ceil(bounds.height);
100
+ if (w <= 0 || h <= 0)
101
+ return;
102
+ if (version !== shapeData.lastContentId || w !== shapeData.lastW || h !== shapeData.lastH) {
103
+ const sizeChanged = w !== shapeData.lastW || h !== shapeData.lastH;
104
+ shapeData.canvas.width = w;
105
+ shapeData.canvas.height = h;
106
+ const ctx = shapeData.ctx;
107
+ ctx.clearRect(0, 0, w, h);
108
+ ctx.save();
109
+ ctx.translate(-bounds.x, -bounds.y);
110
+ renderCanvasShapeCommands(ctx, commands);
111
+ ctx.restore();
112
+ const cached = runtime.textureCache.get(shapeData.canvas);
113
+ if (cached !== undefined) {
114
+ if (sizeChanged) {
115
+ // Physical size changed: destroy old GPU texture, let the batch create a new one.
116
+ cached.texture.destroy();
117
+ runtime.textureCache.delete(shapeData.canvas);
118
+ }
119
+ else {
120
+ // Same size: update content in-place.
121
+ updateWgpuTextureEntry(state, cached, shapeData.canvas);
122
+ }
123
+ }
124
+ shapeData.lastContentId = version;
125
+ shapeData.lastW = w;
126
+ shapeData.lastH = h;
127
+ }
128
+ ensureWgpuQuadBatchResources(state);
129
+ const t = renderProxy.transform2D;
130
+ const tx = t.tx + t.a * bounds.x + t.c * bounds.y;
131
+ const ty = t.ty + t.b * bounds.x + t.d * bounds.y;
132
+ const startCount = runtime.spriteBatchCount;
133
+ const base = prepareWgpuSpriteBatchWrite(state, shapeData.canvas, renderProxy.blendMode, material, materialRenderer, 1);
134
+ const d = runtime.spriteBatchInstanceData;
135
+ d[base] = t.a;
136
+ d[base + 1] = t.b;
137
+ d[base + 2] = t.c;
138
+ d[base + 3] = t.d;
139
+ d[base + 4] = tx;
140
+ d[base + 5] = ty;
141
+ d[base + 6] = w;
142
+ d[base + 7] = h;
143
+ d[base + 8] = 0;
144
+ d[base + 9] = 0;
145
+ d[base + 10] = 1;
146
+ d[base + 11] = 1;
147
+ d[base + 12] = renderProxy.alpha;
148
+ packWgpuSpriteBatchMaterialInstance(state, renderProxy.materialData, startCount);
149
+ runtime.spriteBatchCount++;
150
+ }
151
+ export const defaultWgpuShapeRenderer = {
152
+ format: BatchFormat.Quad,
153
+ createData: createWgpuShapeData,
154
+ destroyData: destroyWgpuShapeData,
155
+ submit: drawWgpuShape,
156
+ };
157
+ //# sourceMappingURL=wgpuShape.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuShape.js","sourceRoot":"","sources":["../src/wgpuShape.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,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAWtD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EACL,4BAA4B,EAC5B,mCAAmC,EACnC,2BAA2B,GAC5B,MAAM,mBAAmB,CAAC;AAgB3B,SAAS,mBAAmB,CAAC,MAAmB,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,sBAAsB,CAAgB;QAC3C,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;QACZ,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,cAAc,EAAE,CAAC;YACjB,WAAW,EAAE,IAAI;YACjB,aAAa,EAAE,CAAC;YAChB,aAAa,EAAE,IAAI;YACnB,SAAS,EAAE,IAAI;SAChB;KACF,CAAC,CAAC;AACL,CAAC;AAED,qGAAqG;AACrG,6DAA6D;AAC7D,SAAS,oBAAoB,CAAC,KAAsB,EAAE,IAAkB;IACtE,MAAM,OAAO,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;IACjD,MAAM,SAAS,GAAG,mBAAmB,CAAgB,IAAI,CAAC,CAAC;IAC3D,IAAI,SAAS,KAAK,IAAI;QAAE,OAAO;IAC/B,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACxB,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IACD,MAAM,CAAC,GAAG,SAAS,CAAC,WAAW,CAAC;IAChC,CAAC,CAAC,YAAY,EAAE,OAAO,EAAE,CAAC;IAC1B,CAAC,CAAC,WAAW,EAAE,OAAO,EAAE,CAAC;IACzB,CAAC,CAAC,aAAa,EAAE,OAAO,EAAE,CAAC;IAC3B,CAAC,CAAC,YAAY,GAAG,IAAI,CAAC;IACtB,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC;IACrB,CAAC,CAAC,aAAa,GAAG,IAAI,CAAC;IACvB,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAsB,EAAE,WAA0B;IAC9E,MAAM,OAAO,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;IACjD,IAAI,OAAO,CAAC,UAAU,KAAK,IAAI;QAAE,OAAO;IAExC,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,mBAAmB,CAAgB,WAAW,CAAC,YAAY,CAAC,CAAC;QAC9E,IAAI,QAAQ,KAAK,IAAI;YAAE,OAAO;QAC9B,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,mBAAmB,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,CAAC,MAAM,IAAI,EAAE,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;QACrF,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC;IACtC,MAAM,gBAAgB,GAAG,2BAA2B,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACtE,IAAI,gBAAgB,KAAK,IAAI;QAAE,OAAO;IAEtC,MAAM,SAAS,GAAG,mBAAmB,CAAgB,WAAW,CAAC,YAAY,CAAC,CAAC;IAC/E,IAAI,SAAS,KAAK,IAAI;QAAE,OAAO;IAC/B,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,MAAM,WAAW,GAAG,CAAC,KAAK,SAAS,CAAC,KAAK,IAAI,CAAC,KAAK,SAAS,CAAC,KAAK,CAAC;QACnE,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;QAEd,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC1D,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,IAAI,WAAW,EAAE,CAAC;gBAChB,kFAAkF;gBAClF,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBACzB,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAChD,CAAC;iBAAM,CAAC;gBACN,sCAAsC;gBACtC,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;YAC1D,CAAC;QACH,CAAC;QACD,SAAS,CAAC,aAAa,GAAG,OAAO,CAAC;QAClC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC;QACpB,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC;IACtB,CAAC;IAED,4BAA4B,CAAC,KAAK,CAAC,CAAC;IAEpC,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,2BAA2B,CACtC,KAAK,EACL,SAAS,CAAC,MAAM,EAChB,WAAW,CAAC,SAAS,EACrB,QAAQ,EACR,gBAAgB,EAChB,CAAC,CACF,CAAC;IACF,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,mCAAmC,CAAC,KAAK,EAAE,WAAW,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IACjF,OAAO,CAAC,gBAAgB,EAAE,CAAC;AAC7B,CAAC;AAED,MAAM,CAAC,MAAM,wBAAwB,GAA0B;IAC7D,MAAM,EAAE,WAAW,CAAC,IAAI;IACxB,UAAU,EAAE,mBAAmB;IAC/B,WAAW,EAAE,oBAAoB;IACjC,MAAM,EAAE,aAAa;CACtB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { RenderProxy2D, WgpuRenderState, WgpuShapeMeshBuffers } from '@flighthq/types';
2
+ export interface WgpuShapeMesh {
3
+ vertices: Float32Array;
4
+ indices: Uint16Array;
5
+ color: number;
6
+ alpha: number;
7
+ }
8
+ export declare function drawWgpuShapeMeshes(state: WgpuRenderState, renderProxy: RenderProxy2D, meshes: readonly WgpuShapeMesh[], buffers: WgpuShapeMeshBuffers): void;
9
+ //# 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,EAAE,aAAa,EAAE,eAAe,EAAE,oBAAoB,EAAyB,MAAM,iBAAiB,CAAC;AAqBnH,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,YAAY,CAAC;IACvB,OAAO,EAAE,WAAW,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAOD,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,eAAe,EACtB,WAAW,EAAE,aAAa,EAC1B,MAAM,EAAE,SAAS,aAAa,EAAE,EAChC,OAAO,EAAE,oBAAoB,GAC5B,IAAI,CAiDN"}