@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,174 @@
1
+ import { getWgpuRenderStateRuntime } from '@flighthq/render-wgpu';
2
+ import { flushWgpuSpriteBatch } from './wgpuSpriteBatch';
3
+ // Wgpu contour clip via stencil nesting — the Wgpu counterpart to webglClipContours. A path
4
+ // ClipRegion is realized by stamping its covered pixels into the stencil buffer, then content draws in
5
+ // the existing 'masked' stencil mode (compare equal, reference = currentMaskDepth). Crisp at any zoom:
6
+ // the contours are transformed by the node world transform in the vertex shader, never cached as a
7
+ // texture.
8
+ //
9
+ // NESTING MODEL — Wgpu cannot clear the stencil mid render pass (the pass clears it once at start,
10
+ // stencilLoadOp:'clear'), so the webgl clear-per-sibling trick is unavailable. Instead each clip
11
+ // INCREMENTS the stencil from its parent depth d to d+1 inside the polygon (compare 'equal' d, passOp
12
+ // 'increment-clamp'); pop redraws the same geometry to DECREMENT back to d (compare 'equal' d+1, passOp
13
+ // 'decrement-clamp'). This is sibling-safe (each pop restores its own region) and nests cleanly. Scissor
14
+ // (rect) clips compose independently via setScissorRect, exactly as before.
15
+ //
16
+ // LIMITATION: increment-clamp counts coverage, not winding, so a single simple/convex contour clips
17
+ // exactly (circles, rounded rects, convex polygons) but holes / self-intersecting even-odd fills are not
18
+ // yet honored — `winding` is accepted but not applied. The webgl backend has the same single-level
19
+ // coverage behavior. A true winding pass (separate front/back ops + a cover stamp) is a follow-up.
20
+ //
21
+ // Cannot be visually captured headless (no GPU adapter); the unit test asserts the pipeline/stencil call
22
+ // shape against the mock device. Mirror this against the verified webgl result when a GPU is available.
23
+ const CLIP_WGSL = /* wgsl */ `
24
+ struct ClipUniforms { matrix : mat3x3f }
25
+ @group(0) @binding(0) var<uniform> u : ClipUniforms;
26
+ @vertex fn vs_main(@location(0) position : vec2f) -> @builtin(position) vec4f {
27
+ let p = u.matrix * vec3f(position, 1.0);
28
+ return vec4f(p.x, p.y, 0.0, 1.0);
29
+ }
30
+ @fragment fn fs_main() -> @location(0) vec4f { return vec4f(0.0); }
31
+ `;
32
+ // mat3x3f in a uniform buffer has a 16-byte column stride (each column is a vec3 padded to vec4): 48 bytes.
33
+ const CLIP_UNIFORM_BYTES = 48;
34
+ export function popWgpuClipContours(state) {
35
+ const runtime = getWgpuRenderStateRuntime(state);
36
+ flushWgpuSpriteBatch(state);
37
+ const entry = runtime.clipContourStack.pop();
38
+ runtime.currentMaskDepth = Math.max(0, runtime.currentMaskDepth - 1);
39
+ const pass = runtime.renderPass;
40
+ if (pass !== null && entry !== undefined) {
41
+ const pipelines = ensureClipContourPipelines(state);
42
+ // Decrement this clip's covered pixels from (entry.depth + 1) back to entry.depth, restoring the
43
+ // parent's stencil so sibling clips and the parent's own content test correctly.
44
+ pass.setPipeline(pipelines.erase);
45
+ pass.setBindGroup(0, entry.bindGroup);
46
+ pass.setVertexBuffer(0, entry.vertexBuffer);
47
+ pass.setStencilReference(entry.depth + 1);
48
+ if (entry.vertexCount > 0)
49
+ pass.draw(entry.vertexCount);
50
+ }
51
+ if (entry !== undefined) {
52
+ // The erase draw just recorded references these buffers; the frame's submit is deferred to
53
+ // submitWgpuRenderPass, so defer their destruction until after that submit.
54
+ (runtime.retiredBuffers ?? (runtime.retiredBuffers = [])).push(entry.vertexBuffer, entry.uniformBuffer);
55
+ }
56
+ }
57
+ export function pushWgpuClipContours(state, contours, winding, worldTransform) {
58
+ const runtime = getWgpuRenderStateRuntime(state);
59
+ flushWgpuSpriteBatch(state);
60
+ // Coverage-based; winding (even-odd vs non-zero, holes) is not yet applied — see file header.
61
+ void winding;
62
+ const device = state.device;
63
+ const depth = runtime.currentMaskDepth;
64
+ const pipelines = ensureClipContourPipelines(state);
65
+ const { vertexBuffer, vertexCount } = createClipContourVertexBuffer(state, contours);
66
+ const uniformBuffer = createClipContourUniformBuffer(state, worldTransform);
67
+ const bindGroup = device.createBindGroup({
68
+ layout: pipelines.bindGroupLayout,
69
+ entries: [{ binding: 0, resource: { buffer: uniformBuffer } }],
70
+ });
71
+ const pass = runtime.renderPass;
72
+ if (pass !== null) {
73
+ // Increment the polygon's covered pixels from the parent depth to depth + 1. The 'equal' compare on
74
+ // the parent depth keeps the increment confined to the parent clip's interior (or the whole cleared
75
+ // buffer at depth 0) and makes overlapping fan triangles idempotent (only the first pass increments).
76
+ pass.setPipeline(pipelines.write);
77
+ pass.setBindGroup(0, bindGroup);
78
+ pass.setVertexBuffer(0, vertexBuffer);
79
+ pass.setStencilReference(depth);
80
+ if (vertexCount > 0)
81
+ pass.draw(vertexCount);
82
+ }
83
+ runtime.clipContourStack.push({ vertexBuffer, vertexCount, uniformBuffer, bindGroup, depth });
84
+ // Content drawn now tests stencil == currentMaskDepth (webgpuDraw/webgpuShader select 'masked' mode).
85
+ runtime.currentMaskDepth = depth + 1;
86
+ }
87
+ function createClipContourUniformBuffer(state, t) {
88
+ const runtime = getWgpuRenderStateRuntime(state);
89
+ const viewport = runtime.renderTargetViewport ?? state.canvas;
90
+ const iw = 2 / viewport.width;
91
+ const ih = 2 / viewport.height;
92
+ // Column-major mat3x3f = projection · worldTransform, mapping clip-local points to clip space exactly
93
+ // as webgpuDraw builds the content matrix (so clip and content land in identical clip space). Each
94
+ // column is padded to 4 floats (vec3 -> vec4 std140-style layout).
95
+ const m = new Float32Array(12);
96
+ m[0] = t.a * iw;
97
+ m[1] = -t.b * ih;
98
+ m[2] = 0;
99
+ m[4] = t.c * iw;
100
+ m[5] = -t.d * ih;
101
+ m[6] = 0;
102
+ m[8] = t.tx * iw - 1;
103
+ m[9] = -t.ty * ih + 1;
104
+ m[10] = 1;
105
+ const buffer = state.device.createBuffer({
106
+ size: CLIP_UNIFORM_BYTES,
107
+ usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,
108
+ });
109
+ state.device.queue.writeBuffer(buffer, 0, m);
110
+ return buffer;
111
+ }
112
+ // Expands each contour's triangle fan (origin, i, i+1) into a triangle-list vertex buffer — Wgpu has
113
+ // no TRIANGLE_FAN topology. Color writes are masked off in the pipeline, so only the stencil moves.
114
+ function createClipContourVertexBuffer(state, contours) {
115
+ const tris = [];
116
+ for (let c = 0; c < contours.length; c++) {
117
+ const contour = contours[c];
118
+ const pointCount = contour.length >> 1;
119
+ if (pointCount < 3)
120
+ continue;
121
+ for (let i = 1; i < pointCount - 1; i++) {
122
+ tris.push(contour[0], contour[1], contour[i * 2], contour[i * 2 + 1], contour[(i + 1) * 2], contour[(i + 1) * 2 + 1]);
123
+ }
124
+ }
125
+ const data = new Float32Array(tris);
126
+ const vertexCount = data.length >> 1;
127
+ const vertexBuffer = state.device.createBuffer({
128
+ size: Math.max(4, data.byteLength),
129
+ usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,
130
+ });
131
+ if (data.byteLength > 0)
132
+ state.device.queue.writeBuffer(vertexBuffer, 0, data);
133
+ return { vertexBuffer, vertexCount };
134
+ }
135
+ function ensureClipContourPipelines(state) {
136
+ const runtime = getWgpuRenderStateRuntime(state);
137
+ const format = runtime.currentColorFormat ?? state.format;
138
+ const cache = runtime.clipContourPipelines ?? (runtime.clipContourPipelines = new Map());
139
+ const existing = cache.get(format);
140
+ if (existing !== undefined)
141
+ return existing;
142
+ const device = state.device;
143
+ const module = device.createShaderModule({ code: CLIP_WGSL });
144
+ const bindGroupLayout = device.createBindGroupLayout({
145
+ entries: [{ binding: 0, visibility: GPUShaderStage.VERTEX, buffer: { type: 'uniform' } }],
146
+ });
147
+ const layout = device.createPipelineLayout({ bindGroupLayouts: [bindGroupLayout] });
148
+ const vertexBuffers = [
149
+ { arrayStride: 8, attributes: [{ shaderLocation: 0, offset: 0, format: 'float32x2' }] },
150
+ ];
151
+ const make = (passOp) => device.createRenderPipeline({
152
+ layout,
153
+ vertex: { module, entryPoint: 'vs_main', buffers: vertexBuffers },
154
+ fragment: { module, entryPoint: 'fs_main', targets: [{ format, writeMask: 0 }] },
155
+ primitive: { topology: 'triangle-list', cullMode: 'none' },
156
+ depthStencil: {
157
+ format: 'depth24plus-stencil8',
158
+ depthWriteEnabled: false,
159
+ depthCompare: 'always',
160
+ stencilFront: { compare: 'equal', passOp, failOp: 'keep', depthFailOp: 'keep' },
161
+ stencilBack: { compare: 'equal', passOp, failOp: 'keep', depthFailOp: 'keep' },
162
+ stencilReadMask: 0xff,
163
+ stencilWriteMask: 0xff,
164
+ },
165
+ });
166
+ const pipelines = {
167
+ write: make('increment-clamp'),
168
+ erase: make('decrement-clamp'),
169
+ bindGroupLayout,
170
+ };
171
+ cache.set(format, pipelines);
172
+ return pipelines;
173
+ }
174
+ //# sourceMappingURL=wgpuClipContours.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuClipContours.js","sourceRoot":"","sources":["../src/wgpuClipContours.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { MatrixLike, RectangleLike, WgpuRenderState } from '@flighthq/types';
2
+ export declare function popWgpuClipRectangle(state: WgpuRenderState): void;
3
+ export declare function pushWgpuClipRectangle(state: WgpuRenderState, rect: Readonly<RectangleLike>, transform: Readonly<MatrixLike>): void;
4
+ //# sourceMappingURL=wgpuClipRectangle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuClipRectangle.d.ts","sourceRoot":"","sources":["../src/wgpuClipRectangle.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,eAAe,EAAmB,MAAM,iBAAiB,CAAC;AAInG,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAoBjE;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,eAAe,EACtB,IAAI,EAAE,QAAQ,CAAC,aAAa,CAAC,EAC7B,SAAS,EAAE,QAAQ,CAAC,UAAU,CAAC,GAC9B,IAAI,CAmBN"}
@@ -0,0 +1,80 @@
1
+ import { getWgpuRenderStateRuntime } from '@flighthq/render-wgpu';
2
+ import { flushWgpuSpriteBatch } from './wgpuSpriteBatch';
3
+ export function popWgpuClipRectangle(state) {
4
+ const runtime = getWgpuRenderStateRuntime(state);
5
+ flushWgpuSpriteBatch(state);
6
+ const stack = runtime.scissorStack;
7
+ stack.pop();
8
+ const previous = stack.length > 0 ? stack[stack.length - 1] : null;
9
+ runtime.currentScissorRect = previous;
10
+ const pass = runtime.renderPass;
11
+ if (pass === null)
12
+ return;
13
+ if (previous === null) {
14
+ const viewport = runtime.renderTargetViewport ?? state.canvas;
15
+ pass.setScissorRect(0, 0, viewport.width, viewport.height);
16
+ }
17
+ else if (previous.width <= 0 || previous.height <= 0) {
18
+ // Empty intersection stored during push — maintain degenerate scissor until fully popped.
19
+ pass.setScissorRect(0, 0, 1, 1);
20
+ }
21
+ else {
22
+ pass.setScissorRect(previous.x, previous.y, previous.width, previous.height);
23
+ }
24
+ }
25
+ export function pushWgpuClipRectangle(state, rect, transform) {
26
+ const runtime = getWgpuRenderStateRuntime(state);
27
+ flushWgpuSpriteBatch(state);
28
+ const next = intersectWgpuScissorRect(runtime.currentScissorRect ?? null, computeWgpuScissorRect(state, rect, transform));
29
+ runtime.currentScissorRect = next;
30
+ runtime.scissorStack.push(next);
31
+ const pass = runtime.renderPass;
32
+ if (pass === null)
33
+ return;
34
+ if (next.width <= 0 || next.height <= 0) {
35
+ // Clip rect projects entirely outside the viewport — use a 1×1 degenerate scissor at
36
+ // the origin so the node is effectively invisible while the rect remains Wgpu-valid.
37
+ pass.setScissorRect(0, 0, 1, 1);
38
+ }
39
+ else {
40
+ pass.setScissorRect(next.x, next.y, next.width, next.height);
41
+ }
42
+ }
43
+ function computeWgpuScissorRect(state, rect, transform) {
44
+ const runtime = getWgpuRenderStateRuntime(state);
45
+ const x0 = transform.a * rect.x + transform.c * rect.y + transform.tx;
46
+ const y0 = transform.b * rect.x + transform.d * rect.y + transform.ty;
47
+ const x1 = transform.a * (rect.x + rect.width) + transform.c * rect.y + transform.tx;
48
+ const y1 = transform.b * (rect.x + rect.width) + transform.d * rect.y + transform.ty;
49
+ const x2 = transform.a * rect.x + transform.c * (rect.y + rect.height) + transform.tx;
50
+ const y2 = transform.b * rect.x + transform.d * (rect.y + rect.height) + transform.ty;
51
+ const x3 = transform.a * (rect.x + rect.width) + transform.c * (rect.y + rect.height) + transform.tx;
52
+ const y3 = transform.b * (rect.x + rect.width) + transform.d * (rect.y + rect.height) + transform.ty;
53
+ const viewport = runtime.renderTargetViewport ?? state.canvas;
54
+ const minX = Math.max(0, Math.floor(Math.min(x0, x1, x2, x3)));
55
+ const maxX = Math.min(viewport.width, Math.ceil(Math.max(x0, x1, x2, x3)));
56
+ const minY = Math.max(0, Math.floor(Math.min(y0, y1, y2, y3)));
57
+ const maxY = Math.min(viewport.height, Math.ceil(Math.max(y0, y1, y2, y3)));
58
+ // Wgpu uses top-left origin for scissor, same as the canvas coordinate system
59
+ return {
60
+ height: Math.max(0, maxY - minY),
61
+ width: Math.max(0, maxX - minX),
62
+ x: minX,
63
+ y: minY,
64
+ };
65
+ }
66
+ function intersectWgpuScissorRect(a, b) {
67
+ if (a === null)
68
+ return { height: b.height, width: b.width, x: b.x, y: b.y };
69
+ const x = Math.max(a.x, b.x);
70
+ const y = Math.max(a.y, b.y);
71
+ const right = Math.min(a.x + a.width, b.x + b.width);
72
+ const bottom = Math.min(a.y + a.height, b.y + b.height);
73
+ return {
74
+ height: Math.max(0, bottom - y),
75
+ width: Math.max(0, right - x),
76
+ x,
77
+ y,
78
+ };
79
+ }
80
+ //# sourceMappingURL=wgpuClipRectangle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuClipRectangle.js","sourceRoot":"","sources":["../src/wgpuClipRectangle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { WgpuMaterialRenderer, WgpuRenderState } from '@flighthq/types';
2
+ export declare function registerWgpuColorTransformMaterials(state: WgpuRenderState): void;
3
+ export declare const colorTransformWgpuMaterialRenderer: WgpuMaterialRenderer;
4
+ export declare const uniformColorTransformWgpuMaterialRenderer: WgpuMaterialRenderer;
5
+ //# sourceMappingURL=wgpuColorTransformMaterial.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuColorTransformMaterial.d.ts","sourceRoot":"","sources":["../src/wgpuColorTransformMaterial.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAGV,oBAAoB,EACpB,eAAe,EAChB,MAAM,iBAAiB,CAAC;AAOzB,wBAAgB,mCAAmC,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAGhF;AAGD,eAAO,MAAM,kCAAkC,EAAE,oBAMhD,CAAC;AAKF,eAAO,MAAM,yCAAyC,EAAE,oBAOvD,CAAC"}
@@ -0,0 +1,97 @@
1
+ import { registerWgpuMaterialRenderer } from '@flighthq/render-wgpu';
2
+ import { ColorTransformMaterialKind, UniformColorTransformMaterialKind } from '@flighthq/types';
3
+ import { getWgpuQuadBatchPreludeWGSL } from './wgpuSpriteBatch';
4
+ const COLOR_TRANSFORM_INSTANCE_FLOATS = 8;
5
+ export function registerWgpuColorTransformMaterials(state) {
6
+ registerWgpuMaterialRenderer(state, UniformColorTransformMaterialKind, uniformColorTransformWgpuMaterialRenderer);
7
+ registerWgpuMaterialRenderer(state, ColorTransformMaterialKind, colorTransformWgpuMaterialRenderer);
8
+ }
9
+ // Per-instance color transform: packs each node's materialData color transform into the instance.
10
+ export const colorTransformWgpuMaterialRenderer = {
11
+ instanceFloatCount: COLOR_TRANSFORM_INSTANCE_FLOATS,
12
+ getShaderModule: getColorTransformShaderModule,
13
+ packInstance(_state, _material, materialData, out, offset) {
14
+ packWgpuColorTransform(out, offset, materialData);
15
+ },
16
+ };
17
+ // Per-batch color transform: packs the material's own color transform into every instance. Wgpu
18
+ // carries color transform per-instance, so a "uniform" color transform is the same value on each
19
+ // instance of the batch — it shares the per-instance shader module.
20
+ export const uniformColorTransformWgpuMaterialRenderer = {
21
+ instanceFloatCount: COLOR_TRANSFORM_INSTANCE_FLOATS,
22
+ getShaderModule: getColorTransformShaderModule,
23
+ packInstance(_state, material, _materialData, out, offset) {
24
+ const ct = material !== null ? material.colorTransform : null;
25
+ packWgpuColorTransform(out, offset, ct);
26
+ },
27
+ };
28
+ function getColorTransformShaderModule(state) {
29
+ const cached = _modules.get(state.device);
30
+ if (cached !== undefined)
31
+ return cached;
32
+ const module = state.device.createShaderModule({
33
+ code: getWgpuQuadBatchPreludeWGSL() + COLOR_TRANSFORM_MATERIAL_WGSL,
34
+ });
35
+ _modules.set(state.device, module);
36
+ return module;
37
+ }
38
+ function packWgpuColorTransform(out, offset, ct) {
39
+ if (ct !== null) {
40
+ out[offset] = ct.redMultiplier;
41
+ out[offset + 1] = ct.greenMultiplier;
42
+ out[offset + 2] = ct.blueMultiplier;
43
+ out[offset + 3] = ct.alphaMultiplier;
44
+ out[offset + 4] = ct.redOffset / 255;
45
+ out[offset + 5] = ct.greenOffset / 255;
46
+ out[offset + 6] = ct.blueOffset / 255;
47
+ out[offset + 7] = ct.alphaOffset / 255;
48
+ }
49
+ else {
50
+ out[offset] = 1;
51
+ out[offset + 1] = 1;
52
+ out[offset + 2] = 1;
53
+ out[offset + 3] = 1;
54
+ out[offset + 4] = 0;
55
+ out[offset + 5] = 0;
56
+ out[offset + 6] = 0;
57
+ out[offset + 7] = 0;
58
+ }
59
+ }
60
+ // Reads 8 per-instance floats (color multiplier rgba, color offset rgba) from the material storage
61
+ // buffer at @group(3), applies them in unpremultiplied space. The base path never sees these — color
62
+ // transform is contained entirely in this module and its packInstance.
63
+ const COLOR_TRANSFORM_MATERIAL_WGSL = /* wgsl */ `
64
+ @group(3) @binding(0) var<storage, read> ctData : array<f32>;
65
+
66
+ struct VertexOut {
67
+ @builtin(position) position : vec4f,
68
+ @location(0) uv : vec2f,
69
+ @location(1) alpha : f32,
70
+ @location(2) ctMult : vec4f,
71
+ @location(3) ctOff : vec4f,
72
+ }
73
+
74
+ @vertex
75
+ fn vs_main(@builtin(vertex_index) vi : u32, @builtin(instance_index) ii : u32) -> VertexOut {
76
+ let bv = quadBaseVertex(vi, ii);
77
+ let b = ii * 8u;
78
+ let ctMult = vec4f(ctData[b + 0u], ctData[b + 1u], ctData[b + 2u], ctData[b + 3u]);
79
+ let ctOff = vec4f(ctData[b + 4u], ctData[b + 5u], ctData[b + 6u], ctData[b + 7u]);
80
+ return VertexOut(bv.position, bv.uv, bv.alpha, ctMult, ctOff);
81
+ }
82
+
83
+ @fragment
84
+ fn fs_main(in : VertexOut) -> @location(0) vec4f {
85
+ var color = textureSample(tex, smp, in.uv);
86
+ if (color.a <= 0.0) { discard; }
87
+ color = color * clamp(in.alpha, 0.0, 1.0);
88
+ if (color.a > 0.0) {
89
+ color = vec4f(color.rgb / color.a, color.a);
90
+ color = clamp(color * in.ctMult + in.ctOff, vec4f(0.0), vec4f(1.0));
91
+ color = vec4f(color.rgb * color.a, color.a);
92
+ }
93
+ return color;
94
+ }
95
+ `;
96
+ const _modules = new WeakMap();
97
+ //# sourceMappingURL=wgpuColorTransformMaterial.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuColorTransformMaterial.js","sourceRoot":"","sources":["../src/wgpuColorTransformMaterial.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { WgpuMaterialRenderer, WgpuRenderState } from '@flighthq/types';
2
+ export declare function registerDefaultWgpuMaterial(state: WgpuRenderState): void;
3
+ export declare const defaultWgpuMaterialRenderer: WgpuMaterialRenderer;
4
+ //# sourceMappingURL=wgpuDefaultMaterial.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuDefaultMaterial.d.ts","sourceRoot":"","sources":["../src/wgpuDefaultMaterial.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAQ7E,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAExE;AAID,eAAO,MAAM,2BAA2B,EAAE,oBAWzC,CAAC"}
@@ -0,0 +1,46 @@
1
+ import { registerWgpuMaterialRenderer } from '@flighthq/render-wgpu';
2
+ import { DefaultMaterialKind } from '@flighthq/types';
3
+ import { getWgpuQuadBatchPreludeWGSL } from './wgpuSpriteBatch';
4
+ // Registers the bundled default material under DefaultMaterialKind. It is a bundled material like any
5
+ // other — no privileged status in the render path; a node with no material renders only if a renderer
6
+ // is registered for DefaultMaterialKind. A user can copy this file and register their own default.
7
+ export function registerDefaultWgpuMaterial(state) {
8
+ registerWgpuMaterialRenderer(state, DefaultMaterialKind, defaultWgpuMaterialRenderer);
9
+ }
10
+ // Textured quad with per-instance alpha and no other effect. The batch holds no shader of its own, so
11
+ // even the plain path is just a registered material — this module IS the base sprite-batch shader.
12
+ export const defaultWgpuMaterialRenderer = {
13
+ instanceFloatCount: 0,
14
+ getShaderModule(state) {
15
+ const cached = _modules.get(state.device);
16
+ if (cached !== undefined)
17
+ return cached;
18
+ const module = state.device.createShaderModule({
19
+ code: getWgpuQuadBatchPreludeWGSL() + DEFAULT_MATERIAL_WGSL,
20
+ });
21
+ _modules.set(state.device, module);
22
+ return module;
23
+ },
24
+ };
25
+ const DEFAULT_MATERIAL_WGSL = /* wgsl */ `
26
+ struct VertexOut {
27
+ @builtin(position) position : vec4f,
28
+ @location(0) uv : vec2f,
29
+ @location(1) alpha : f32,
30
+ }
31
+
32
+ @vertex
33
+ fn vs_main(@builtin(vertex_index) vi : u32, @builtin(instance_index) ii : u32) -> VertexOut {
34
+ let bv = quadBaseVertex(vi, ii);
35
+ return VertexOut(bv.position, bv.uv, bv.alpha);
36
+ }
37
+
38
+ @fragment
39
+ fn fs_main(in : VertexOut) -> @location(0) vec4f {
40
+ var color = textureSample(tex, smp, in.uv);
41
+ if (color.a <= 0.0) { discard; }
42
+ return color * clamp(in.alpha, 0.0, 1.0);
43
+ }
44
+ `;
45
+ const _modules = new WeakMap();
46
+ //# sourceMappingURL=wgpuDefaultMaterial.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuDefaultMaterial.js","sourceRoot":"","sources":["../src/wgpuDefaultMaterial.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AAErE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEtD,OAAO,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AAEhE,sGAAsG;AACtG,sGAAsG;AACtG,mGAAmG;AACnG,MAAM,UAAU,2BAA2B,CAAC,KAAsB;IAChE,4BAA4B,CAAC,KAAK,EAAE,mBAAmB,EAAE,2BAA2B,CAAC,CAAC;AACxF,CAAC;AAED,sGAAsG;AACtG,mGAAmG;AACnG,MAAM,CAAC,MAAM,2BAA2B,GAAyB;IAC/D,kBAAkB,EAAE,CAAC;IACrB,eAAe,CAAC,KAAsB;QACpC,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC;QACxC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,kBAAkB,CAAC;YAC7C,IAAI,EAAE,2BAA2B,EAAE,GAAG,qBAAqB;SAC5D,CAAC,CAAC;QACH,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACnC,OAAO,MAAM,CAAC;IAChB,CAAC;CACF,CAAC;AAEF,MAAM,qBAAqB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;CAmBxC,CAAC;AAEF,MAAM,QAAQ,GAAG,IAAI,OAAO,EAA8B,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { DisplayObject, DisplayObjectRenderer, RenderProxy2D, WgpuRenderState } from '@flighthq/types';
2
+ export declare function drawWgpuDisplayObject(_state: WgpuRenderState, _renderProxy: RenderProxy2D): void;
3
+ export declare function renderWgpuDisplayObject(state: WgpuRenderState, source: DisplayObject): void;
4
+ export declare const defaultWgpuDisplayObjectRenderer: DisplayObjectRenderer;
5
+ //# sourceMappingURL=wgpuDisplayObject.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuDisplayObject.d.ts","sourceRoot":"","sources":["../src/wgpuDisplayObject.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,qBAAqB,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAI5G,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,GAAG,IAAI,CAEhG;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CAiC3F;AAED,eAAO,MAAM,gCAAgC,EAAE,qBAG9C,CAAC"}
@@ -0,0 +1,41 @@
1
+ import { getDisplayObjectRuntime } from '@flighthq/displayobject';
2
+ import { getRenderProxy2D, isRenderProxyVisible, noopRendererData } from '@flighthq/render';
3
+ import { getWgpuRenderStateRuntime } from '@flighthq/render-wgpu';
4
+ import { flushWgpuSpriteBatch } from './wgpuSpriteBatch';
5
+ export function drawWgpuDisplayObject(_state, _renderProxy) {
6
+ // Plain display objects have no visual geometry of their own.
7
+ }
8
+ export function renderWgpuDisplayObject(state, source) {
9
+ const tempStack = getWgpuRenderStateRuntime(state).tempStack;
10
+ const clipHooks = state.displayObjectClipHooks;
11
+ let stackLength = 1;
12
+ tempStack[0] = source;
13
+ while (stackLength > 0) {
14
+ const current = tempStack[--stackLength];
15
+ if (!current.enabled)
16
+ continue;
17
+ const data = getRenderProxy2D(state, current);
18
+ if (data === undefined)
19
+ continue;
20
+ clipHooks?.popClip(state, data, current);
21
+ if (!isRenderProxyVisible(data))
22
+ continue;
23
+ clipHooks?.pushClip(state, data, current);
24
+ data.renderer?.submit(state, data);
25
+ if (data.traverseChildren) {
26
+ const children = getDisplayObjectRuntime(current).children;
27
+ if (children !== null) {
28
+ for (let i = children.length - 1; i >= 0; i--) {
29
+ tempStack[stackLength++] = children[i];
30
+ }
31
+ }
32
+ }
33
+ }
34
+ flushWgpuSpriteBatch(state);
35
+ clipHooks?.finalize(state);
36
+ }
37
+ export const defaultWgpuDisplayObjectRenderer = {
38
+ createData: noopRendererData,
39
+ submit: drawWgpuDisplayObject,
40
+ };
41
+ //# sourceMappingURL=wgpuDisplayObject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuDisplayObject.js","sourceRoot":"","sources":["../src/wgpuDisplayObject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAC5F,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAGlE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAEzD,MAAM,UAAU,qBAAqB,CAAC,MAAuB,EAAE,YAA2B;IACxF,8DAA8D;AAChE,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAsB,EAAE,MAAqB;IACnF,MAAM,SAAS,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC;IAC7D,MAAM,SAAS,GAAG,KAAK,CAAC,sBAAsB,CAAC;IAE/C,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,SAAS,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;IAEtB,OAAO,WAAW,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,SAAS,CAAC,EAAE,WAAW,CAAkB,CAAC;QAC1D,IAAI,CAAC,OAAO,CAAC,OAAO;YAAE,SAAS;QAE/B,MAAM,IAAI,GAAG,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC9C,IAAI,IAAI,KAAK,SAAS;YAAE,SAAS;QAEjC,SAAS,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAEzC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC;YAAE,SAAS;QAE1C,SAAS,EAAE,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAE1C,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACnC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,MAAM,QAAQ,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC;YAC3D,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;gBACtB,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC9C,SAAS,CAAC,WAAW,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAkB,CAAC;gBAC1D,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC5B,SAAS,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,CAAC,MAAM,gCAAgC,GAA0B;IACrE,UAAU,EAAE,gBAAgB;IAC5B,MAAM,EAAE,qBAAqB;CAC9B,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { BlendMode, WgpuRenderState } from '@flighthq/types';
2
+ export declare function drawWgpuColorTransformBitmap(state: WgpuRenderState, renderProxy: {
3
+ alpha: number;
4
+ transform2D: {
5
+ a: number;
6
+ b: number;
7
+ c: number;
8
+ d: number;
9
+ tx: number;
10
+ ty: number;
11
+ };
12
+ blendMode: BlendMode | null;
13
+ }, imageSource: CanvasImageSource, x0: number, y0: number, x1: number, y1: number, u0: number, v0: number, u1: number, v1: number): void;
14
+ export declare function registerWgpuColorTransformShader(state: WgpuRenderState): void;
15
+ //# sourceMappingURL=wgpuMaterials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuMaterials.d.ts","sourceRoot":"","sources":["../src/wgpuMaterials.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAoB,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAOpF,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,eAAe,EACtB,WAAW,EAAE;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IACpF,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;CAC7B,EACD,WAAW,EAAE,iBAAiB,EAC9B,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,GACT,IAAI,CASN;AAED,wBAAgB,gCAAgC,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAkB7E"}
@@ -0,0 +1,34 @@
1
+ import { bindWgpuTexture, getWgpuRenderStateRuntime, submitWgpuQuadDraw, writeWgpuQuadUniforms, } from '@flighthq/render-wgpu';
2
+ // The color transform shader is the same WGSL as the bitmap shader since color transform
3
+ // support is built directly into the standard WGSL uniform struct (hasColorTransform flag).
4
+ // Registering a color transform "shader" simply sets the useColorTransform flag on nodes
5
+ // that have a color transform, which the existing uniform upload already handles.
6
+ export function drawWgpuColorTransformBitmap(state, renderProxy, imageSource, x0, y0, x1, y1, u0, v0, u1, v1) {
7
+ const runtime = getWgpuRenderStateRuntime(state);
8
+ const pass = runtime.renderPass;
9
+ if (pass === null)
10
+ return;
11
+ state.applyBlendMode?.(state, renderProxy.blendMode);
12
+ const textureEntry = bindWgpuTexture(state, imageSource);
13
+ const uniformOffset = writeWgpuQuadUniforms(state, renderProxy, null, x0, y0, x1, y1, u0, v0, u1, v1);
14
+ submitWgpuQuadDraw(state, uniformOffset, textureEntry.bindGroup);
15
+ }
16
+ export function registerWgpuColorTransformShader(state) {
17
+ const runtime = getWgpuRenderStateRuntime(state);
18
+ if (runtime.colorTransformBitmapShader !== undefined)
19
+ return;
20
+ // The color transform shader is the default pipeline — color transform data is
21
+ // already baked into the uniform buffer and handled by the WGSL fragment shader.
22
+ // This function exists for API symmetry with registerGlColorTransformShader.
23
+ const shader = {
24
+ pipeline: null, // pipeline is resolved dynamically via getActiveWgpuPipeline
25
+ bind(bindState, renderProxy) {
26
+ // bind() is called by the user when customising draw; for color transform the default
27
+ // pipeline handles everything automatically via the uniform buffer.
28
+ void bindState;
29
+ void renderProxy;
30
+ },
31
+ };
32
+ runtime.colorTransformBitmapShader = shader;
33
+ }
34
+ //# sourceMappingURL=wgpuMaterials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuMaterials.js","sourceRoot":"","sources":["../src/wgpuMaterials.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,yBAAyB,EACzB,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAG/B,yFAAyF;AACzF,4FAA4F;AAC5F,yFAAyF;AACzF,kFAAkF;AAElF,MAAM,UAAU,4BAA4B,CAC1C,KAAsB,EACtB,WAIC,EACD,WAA8B,EAC9B,EAAU,EACV,EAAU,EACV,EAAU,EACV,EAAU,EACV,EAAU,EACV,EAAU,EACV,EAAU,EACV,EAAU;IAEV,MAAM,OAAO,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC;IAChC,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO;IAE1B,KAAK,CAAC,cAAc,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;IACrD,MAAM,YAAY,GAAG,eAAe,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACzD,MAAM,aAAa,GAAG,qBAAqB,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACtG,kBAAkB,CAAC,KAAK,EAAE,aAAa,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,gCAAgC,CAAC,KAAsB;IACrE,MAAM,OAAO,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;IACjD,IAAI,OAAO,CAAC,0BAA0B,KAAK,SAAS;QAAE,OAAO;IAE7D,+EAA+E;IAC/E,iFAAiF;IACjF,6EAA6E;IAC7E,MAAM,MAAM,GAAqB;QAC/B,QAAQ,EAAE,IAAa,EAAE,6DAA6D;QACtF,IAAI,CAAC,SAA0B,EAAE,WAA8B;YAC7D,sFAAsF;YACtF,oEAAoE;YACpE,KAAK,SAAS,CAAC;YACf,KAAK,WAAW,CAAC;QACnB,CAAC;KACF,CAAC;IAEF,OAAO,CAAC,0BAA0B,GAAG,MAAM,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { RenderProxy2D, SpriteRenderer, WgpuRenderState } from '@flighthq/types';
2
+ export declare function drawWgpuParticleEmitter(state: WgpuRenderState, renderProxy: RenderProxy2D): void;
3
+ export declare const defaultWgpuParticleEmitterRenderer: SpriteRenderer;
4
+ //# sourceMappingURL=wgpuParticleEmitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuParticleEmitter.d.ts","sourceRoot":"","sources":["../src/wgpuParticleEmitter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAmB,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAmLvG,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,aAAa,GAAG,IAAI,CAgIhG;AAED,eAAO,MAAM,kCAAkC,EAAE,cAMhD,CAAC"}