@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.
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/moduleMockTestHelper.d.ts +15 -0
- package/dist/moduleMockTestHelper.d.ts.map +1 -0
- package/dist/moduleMockTestHelper.js +25 -0
- package/dist/moduleMockTestHelper.js.map +1 -0
- package/dist/wgpuBitmap.d.ts +4 -0
- package/dist/wgpuBitmap.d.ts.map +1 -0
- package/dist/wgpuBitmap.js +80 -0
- package/dist/wgpuBitmap.js.map +1 -0
- package/dist/wgpuCache.d.ts +31 -0
- package/dist/wgpuCache.d.ts.map +1 -0
- package/dist/wgpuCache.js +232 -0
- package/dist/wgpuCache.js.map +1 -0
- package/dist/wgpuClip.d.ts +3 -0
- package/dist/wgpuClip.d.ts.map +1 -0
- package/dist/wgpuClip.js +44 -0
- package/dist/wgpuClip.js.map +1 -0
- package/dist/wgpuClipContours.d.ts +4 -0
- package/dist/wgpuClipContours.d.ts.map +1 -0
- package/dist/wgpuClipContours.js +174 -0
- package/dist/wgpuClipContours.js.map +1 -0
- package/dist/wgpuClipRectangle.d.ts +4 -0
- package/dist/wgpuClipRectangle.d.ts.map +1 -0
- package/dist/wgpuClipRectangle.js +80 -0
- package/dist/wgpuClipRectangle.js.map +1 -0
- package/dist/wgpuColorTransformMaterial.d.ts +5 -0
- package/dist/wgpuColorTransformMaterial.d.ts.map +1 -0
- package/dist/wgpuColorTransformMaterial.js +97 -0
- package/dist/wgpuColorTransformMaterial.js.map +1 -0
- package/dist/wgpuDefaultMaterial.d.ts +4 -0
- package/dist/wgpuDefaultMaterial.d.ts.map +1 -0
- package/dist/wgpuDefaultMaterial.js +46 -0
- package/dist/wgpuDefaultMaterial.js.map +1 -0
- package/dist/wgpuDisplayObject.d.ts +5 -0
- package/dist/wgpuDisplayObject.d.ts.map +1 -0
- package/dist/wgpuDisplayObject.js +41 -0
- package/dist/wgpuDisplayObject.js.map +1 -0
- package/dist/wgpuMaterials.d.ts +15 -0
- package/dist/wgpuMaterials.d.ts.map +1 -0
- package/dist/wgpuMaterials.js +34 -0
- package/dist/wgpuMaterials.js.map +1 -0
- package/dist/wgpuParticleEmitter.d.ts +4 -0
- package/dist/wgpuParticleEmitter.d.ts.map +1 -0
- package/dist/wgpuParticleEmitter.js +288 -0
- package/dist/wgpuParticleEmitter.js.map +1 -0
- package/dist/wgpuQuadBatch.d.ts +7 -0
- package/dist/wgpuQuadBatch.d.ts.map +1 -0
- package/dist/wgpuQuadBatch.js +85 -0
- package/dist/wgpuQuadBatch.js.map +1 -0
- package/dist/wgpuRegistration.d.ts +19 -0
- package/dist/wgpuRegistration.d.ts.map +1 -0
- package/dist/wgpuRegistration.js +53 -0
- package/dist/wgpuRegistration.js.map +1 -0
- package/dist/wgpuRenderStats.d.ts +20 -0
- package/dist/wgpuRenderStats.d.ts.map +1 -0
- package/dist/wgpuRenderStats.js +50 -0
- package/dist/wgpuRenderStats.js.map +1 -0
- package/dist/wgpuRendererData.d.ts +26 -0
- package/dist/wgpuRendererData.d.ts.map +1 -0
- package/dist/wgpuRendererData.js +29 -0
- package/dist/wgpuRendererData.js.map +1 -0
- package/dist/wgpuRichText.d.ts +9 -0
- package/dist/wgpuRichText.d.ts.map +1 -0
- package/dist/wgpuRichText.js +163 -0
- package/dist/wgpuRichText.js.map +1 -0
- package/dist/wgpuScale9Mapper.d.ts +3 -0
- package/dist/wgpuScale9Mapper.d.ts.map +1 -0
- package/dist/wgpuScale9Mapper.js +42 -0
- package/dist/wgpuScale9Mapper.js.map +1 -0
- package/dist/wgpuScale9Shape.d.ts +9 -0
- package/dist/wgpuScale9Shape.d.ts.map +1 -0
- package/dist/wgpuScale9Shape.js +123 -0
- package/dist/wgpuScale9Shape.js.map +1 -0
- package/dist/wgpuShape.d.ts +4 -0
- package/dist/wgpuShape.d.ts.map +1 -0
- package/dist/wgpuShape.js +157 -0
- package/dist/wgpuShape.js.map +1 -0
- package/dist/wgpuShapeMesh.d.ts +9 -0
- package/dist/wgpuShapeMesh.d.ts.map +1 -0
- package/dist/wgpuShapeMesh.js +204 -0
- package/dist/wgpuShapeMesh.js.map +1 -0
- package/dist/wgpuSprite.d.ts +3 -0
- package/dist/wgpuSprite.d.ts.map +1 -0
- package/dist/wgpuSprite.js +28 -0
- package/dist/wgpuSprite.js.map +1 -0
- package/dist/wgpuSpriteBatch.d.ts +18 -0
- package/dist/wgpuSpriteBatch.d.ts.map +1 -0
- package/dist/wgpuSpriteBatch.js +320 -0
- package/dist/wgpuSpriteBatch.js.map +1 -0
- package/dist/wgpuSpriteRenderer.d.ts +3 -0
- package/dist/wgpuSpriteRenderer.d.ts.map +1 -0
- package/dist/wgpuSpriteRenderer.js +51 -0
- package/dist/wgpuSpriteRenderer.js.map +1 -0
- package/dist/wgpuTextInput.d.ts +4 -0
- package/dist/wgpuTextInput.d.ts.map +1 -0
- package/dist/wgpuTextInput.js +44 -0
- package/dist/wgpuTextInput.js.map +1 -0
- package/dist/wgpuTextLabel.d.ts +4 -0
- package/dist/wgpuTextLabel.d.ts.map +1 -0
- package/dist/wgpuTextLabel.js +157 -0
- package/dist/wgpuTextLabel.js.map +1 -0
- package/dist/wgpuTilemap.d.ts +3 -0
- package/dist/wgpuTilemap.d.ts.map +1 -0
- package/dist/wgpuTilemap.js +76 -0
- package/dist/wgpuTilemap.js.map +1 -0
- package/dist/wgpuVelocity.d.ts +23 -0
- package/dist/wgpuVelocity.d.ts.map +1 -0
- package/dist/wgpuVelocity.js +365 -0
- package/dist/wgpuVelocity.js.map +1 -0
- package/dist/wgpuVideo.d.ts +6 -0
- package/dist/wgpuVideo.d.ts.map +1 -0
- package/dist/wgpuVideo.js +63 -0
- package/dist/wgpuVideo.js.map +1 -0
- package/package.json +52 -0
- package/src/wgpuBitmap.test.ts +40 -0
- package/src/wgpuCache.test.ts +230 -0
- package/src/wgpuClip.test.ts +15 -0
- package/src/wgpuClipContours.test.ts +101 -0
- package/src/wgpuClipRectangle.test.ts +45 -0
- package/src/wgpuColorTransformMaterial.test.ts +62 -0
- package/src/wgpuDefaultMaterial.test.ts +21 -0
- package/src/wgpuDisplayObject.test.ts +36 -0
- package/src/wgpuMaterials.test.ts +44 -0
- package/src/wgpuParticleEmitter.test.ts +34 -0
- package/src/wgpuQuadBatch.test.ts +69 -0
- package/src/wgpuRegistration.test.ts +115 -0
- package/src/wgpuRenderStats.test.ts +89 -0
- package/src/wgpuRendererData.test.ts +29 -0
- package/src/wgpuRichText.test.ts +100 -0
- package/src/wgpuScale9Mapper.test.ts +20 -0
- package/src/wgpuScale9Shape.test.ts +97 -0
- package/src/wgpuShape.test.ts +95 -0
- package/src/wgpuShapeMesh.test.ts +124 -0
- package/src/wgpuSprite.test.ts +19 -0
- package/src/wgpuSpriteBatch.test.ts +180 -0
- package/src/wgpuSpriteRenderer.test.ts +38 -0
- package/src/wgpuTextInput.test.ts +37 -0
- package/src/wgpuTextLabel.test.ts +113 -0
- package/src/wgpuTilemap.test.ts +47 -0
- package/src/wgpuVelocity.test.ts +147 -0
- 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":"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"}
|
|
@@ -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"}
|