@ai-game-assets/dev 0.5.6 → 0.7.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 (38) hide show
  1. package/dist/asset-store.d.ts +27 -1
  2. package/dist/asset-store.d.ts.map +1 -1
  3. package/dist/asset-store.js +314 -8
  4. package/dist/asset-store.js.map +1 -1
  5. package/dist/audio-provider.d.ts +1 -0
  6. package/dist/audio-provider.d.ts.map +1 -1
  7. package/dist/audio-provider.js +23 -1
  8. package/dist/audio-provider.js.map +1 -1
  9. package/dist/build-manifest.d.ts.map +1 -1
  10. package/dist/build-manifest.js +14 -0
  11. package/dist/build-manifest.js.map +1 -1
  12. package/dist/image-generation-sizes.d.ts +7 -0
  13. package/dist/image-generation-sizes.d.ts.map +1 -0
  14. package/dist/image-generation-sizes.js +15 -0
  15. package/dist/image-generation-sizes.js.map +1 -0
  16. package/dist/index.d.ts +6 -6
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +3 -3
  19. package/dist/index.js.map +1 -1
  20. package/dist/internal.d.ts +1 -1
  21. package/dist/internal.d.ts.map +1 -1
  22. package/dist/provider-image-processing.d.ts +5 -1
  23. package/dist/provider-image-processing.d.ts.map +1 -1
  24. package/dist/provider-image-processing.js +278 -9
  25. package/dist/provider-image-processing.js.map +1 -1
  26. package/dist/provider.d.ts +45 -1
  27. package/dist/provider.d.ts.map +1 -1
  28. package/dist/provider.js +477 -57
  29. package/dist/provider.js.map +1 -1
  30. package/dist/server.d.ts +78 -2
  31. package/dist/server.d.ts.map +1 -1
  32. package/dist/server.js +339 -28
  33. package/dist/server.js.map +1 -1
  34. package/dist/tileset-sheet-processing.d.ts +49 -0
  35. package/dist/tileset-sheet-processing.d.ts.map +1 -0
  36. package/dist/tileset-sheet-processing.js +357 -0
  37. package/dist/tileset-sheet-processing.js.map +1 -0
  38. package/package.json +5 -3
@@ -0,0 +1,49 @@
1
+ import type { AiAssetDefinition, AiAssetDimensions } from "@ai-game-assets/core";
2
+ import type { GenerateAssetReference } from "./provider.js";
3
+ import type { RgbColor } from "./provider-image-processing.js";
4
+ export type TilesetSheetRect = {
5
+ x: number;
6
+ y: number;
7
+ width: number;
8
+ height: number;
9
+ };
10
+ export type TilesetSheetCell = TilesetSheetRect & {
11
+ index: number;
12
+ usable: boolean;
13
+ logical: TilesetSheetRect;
14
+ };
15
+ export type TilesetSheetUnusedSlot = TilesetSheetRect & {
16
+ index: number;
17
+ };
18
+ export type TilesetSheetOuterPadding = {
19
+ left: number;
20
+ top: number;
21
+ right: number;
22
+ bottom: number;
23
+ };
24
+ export type TilesetSheetGenerationGeometry = {
25
+ canvas: AiAssetDimensions;
26
+ logical: AiAssetDimensions;
27
+ sheet: TilesetSheetRect;
28
+ placementRegions: TilesetSheetUnusedSlot[];
29
+ cells: TilesetSheetCell[];
30
+ unusedSlots: TilesetSheetUnusedSlot[];
31
+ generationColumns: number;
32
+ generationRows: number;
33
+ scale: number;
34
+ /** Smallest blank band between a tile rectangle and a neighbor or canvas edge. */
35
+ gutter: number;
36
+ outerPadding: TilesetSheetOuterPadding;
37
+ size: string;
38
+ };
39
+ export type TilesetSheetOutputPadding = {
40
+ color: RgbColor;
41
+ transparent: boolean;
42
+ };
43
+ export declare function parseImageGenerationSize(size: string): AiAssetDimensions | undefined;
44
+ export declare function tilesetSheetGenerationGeometry(asset: AiAssetDefinition, requestedSize: string): TilesetSheetGenerationGeometry;
45
+ export declare function planTilesetSheetGeneration(asset: AiAssetDefinition, requestedSize?: string): TilesetSheetGenerationGeometry;
46
+ export declare function stageTilesetSheetReference(reference: GenerateAssetReference, geometry: TilesetSheetGenerationGeometry, chromaKey: RgbColor): Promise<GenerateAssetReference>;
47
+ export declare function cropTilesetSheetFromGeneration(image: Uint8Array, geometry: TilesetSheetGenerationGeometry, outputFormat: "png" | "webp" | "jpeg", padding?: TilesetSheetOutputPadding): Promise<Buffer>;
48
+ export declare function tilesetSheetRectLabel(rect: TilesetSheetRect): string;
49
+ //# sourceMappingURL=tileset-sheet-processing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tileset-sheet-processing.d.ts","sourceRoot":"","sources":["../src/tileset-sheet-processing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,sBAAsB,CAAC;AAI9B,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAO/D,MAAM,MAAM,gBAAgB,GAAG;IAC7B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,gBAAgB,GAAG;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,gBAAgB,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,gBAAgB,GAAG;IACtD,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,MAAM,EAAE,iBAAiB,CAAC;IAC1B,OAAO,EAAE,iBAAiB,CAAC;IAC3B,KAAK,EAAE,gBAAgB,CAAC;IACxB,gBAAgB,EAAE,sBAAsB,EAAE,CAAC;IAC3C,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,WAAW,EAAE,sBAAsB,EAAE,CAAC;IACtC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,kFAAkF;IAClF,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,wBAAwB,CAAC;IACvC,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,KAAK,EAAE,QAAQ,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS,CAWpF;AAED,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,iBAAiB,EACxB,aAAa,EAAE,MAAM,GACpB,8BAA8B,CAMhC;AAED,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,iBAAiB,EACxB,aAAa,CAAC,EAAE,MAAM,GACrB,8BAA8B,CAMhC;AAkRD,wBAAsB,0BAA0B,CAC9C,SAAS,EAAE,sBAAsB,EACjC,QAAQ,EAAE,8BAA8B,EACxC,SAAS,EAAE,QAAQ,GAClB,OAAO,CAAC,sBAAsB,CAAC,CAoDjC;AAED,wBAAsB,8BAA8B,CAClD,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,8BAA8B,EACxC,YAAY,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,EACrC,OAAO,CAAC,EAAE,yBAAyB,GAClC,OAAO,CAAC,MAAM,CAAC,CAmEjB;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAEpE"}
@@ -0,0 +1,357 @@
1
+ import sharp from "sharp";
2
+ import { OPENAI_IMAGE_GENERATION_SIZES } from "./image-generation-sizes.js";
3
+ // Every tile owns one region of the model canvas. Keeping a small, symmetric
4
+ // guard band inside each region makes the ownership boundary unambiguous while
5
+ // leaving most of the available pixels for the tile itself.
6
+ const TILESET_GENERATION_REGION_EDGE_GUARD = 1 / 16;
7
+ export function parseImageGenerationSize(size) {
8
+ const match = /^(\d+)x(\d+)$/.exec(size.trim());
9
+ if (!match)
10
+ return undefined;
11
+ const width = Number(match[1]);
12
+ const height = Number(match[2]);
13
+ if (!Number.isInteger(width) || width <= 0 || !Number.isInteger(height) || height <= 0) {
14
+ return undefined;
15
+ }
16
+ return { width, height };
17
+ }
18
+ export function tilesetSheetGenerationGeometry(asset, requestedSize) {
19
+ const canvas = parseImageGenerationSize(requestedSize);
20
+ if (!canvas) {
21
+ throw new Error(`Tileset generation size "${requestedSize}" must use WIDTHxHEIGHT pixels.`);
22
+ }
23
+ return selectTilesetGenerationPlan(asset, [canvas]);
24
+ }
25
+ export function planTilesetSheetGeneration(asset, requestedSize) {
26
+ if (requestedSize && requestedSize !== "auto") {
27
+ return tilesetSheetGenerationGeometry(asset, requestedSize);
28
+ }
29
+ return selectTilesetGenerationPlan(asset, OPENAI_IMAGE_GENERATION_SIZES);
30
+ }
31
+ function selectTilesetGenerationPlan(asset, canvases) {
32
+ const { tileCount, tileset } = requireTilesetGenerationAsset(asset);
33
+ let best;
34
+ for (const canvas of canvases) {
35
+ for (let columns = 1; columns <= tileCount; columns += 1) {
36
+ const rows = Math.ceil(tileCount / columns);
37
+ if (columns > canvas.width || rows > canvas.height)
38
+ continue;
39
+ const geometry = buildTilesetSheetGenerationGeometry(asset, canvas, {
40
+ columns,
41
+ rows
42
+ });
43
+ const cell = geometry.cells[0];
44
+ const unused = columns * rows - tileCount;
45
+ const packedAspect = (columns * tileset.tileWidth) /
46
+ (rows * tileset.tileHeight);
47
+ const candidate = {
48
+ geometry,
49
+ // Useful coverage is the fraction of model pixels owned by actual tiles.
50
+ // It rewards a canvas whose aspect matches the temporary grid and
51
+ // naturally penalizes empty packing slots and wasted canvas space.
52
+ coverage: (tileCount * cell.width * cell.height) /
53
+ (canvas.width * canvas.height),
54
+ aspectDelta: Math.abs(Math.log(packedAspect / (canvas.width / canvas.height))),
55
+ unused,
56
+ logicalColumnDelta: Math.abs(columns - tileset.columns)
57
+ };
58
+ if (!best || isBetterTilesetGenerationCandidate(candidate, best)) {
59
+ best = candidate;
60
+ }
61
+ }
62
+ }
63
+ if (!best) {
64
+ throw new Error(`Tileset "${asset.id}" cannot fit on an image generation canvas.`);
65
+ }
66
+ return best.geometry;
67
+ }
68
+ function isBetterTilesetGenerationCandidate(candidate, current) {
69
+ const epsilon = 1e-12;
70
+ if (Math.abs(candidate.coverage - current.coverage) > epsilon) {
71
+ return candidate.coverage > current.coverage;
72
+ }
73
+ if (Math.abs(candidate.aspectDelta - current.aspectDelta) > epsilon) {
74
+ return candidate.aspectDelta < current.aspectDelta;
75
+ }
76
+ if (candidate.unused !== current.unused)
77
+ return candidate.unused < current.unused;
78
+ if (candidate.geometry.scale !== current.geometry.scale) {
79
+ return candidate.geometry.scale > current.geometry.scale;
80
+ }
81
+ if (candidate.logicalColumnDelta !== current.logicalColumnDelta) {
82
+ return candidate.logicalColumnDelta < current.logicalColumnDelta;
83
+ }
84
+ const candidateArea = candidate.geometry.canvas.width * candidate.geometry.canvas.height;
85
+ const currentArea = current.geometry.canvas.width * current.geometry.canvas.height;
86
+ if (candidateArea !== currentArea)
87
+ return candidateArea < currentArea;
88
+ return candidate.geometry.generationColumns < current.geometry.generationColumns;
89
+ }
90
+ function buildTilesetSheetGenerationGeometry(asset, canvas, packing) {
91
+ const { logical, tileset, capacity, tileCount } = requireTilesetGenerationAsset(asset);
92
+ const margin = tileset.margin ?? 0;
93
+ const spacing = tileset.spacing ?? 0;
94
+ // The generation grid is intentionally independent of the final sheet grid.
95
+ // Canvas, packing, ownership regions, and crop rectangles are planned as one
96
+ // coordinate system. The final logical order is restored during composition.
97
+ const minimumRegionWidth = Math.floor(canvas.width / packing.columns);
98
+ const minimumRegionHeight = Math.floor(canvas.height / packing.rows);
99
+ const usableRegionWidth = Math.max(1, Math.floor(minimumRegionWidth * (1 - 2 * TILESET_GENERATION_REGION_EDGE_GUARD)));
100
+ const usableRegionHeight = Math.max(1, Math.floor(minimumRegionHeight * (1 - 2 * TILESET_GENERATION_REGION_EDGE_GUARD)));
101
+ const maximumScale = Math.min(usableRegionWidth / tileset.tileWidth, usableRegionHeight / tileset.tileHeight);
102
+ if (!Number.isFinite(maximumScale) || maximumScale <= 0) {
103
+ throw new Error(`Tileset "${asset.id}" cannot fit in a ${packing.columns}x${packing.rows} ` +
104
+ `grid on a ${canvas.width}x${canvas.height} generation canvas.`);
105
+ }
106
+ const scale = maximumScale >= 1 ? Math.floor(maximumScale) : maximumScale;
107
+ const cellWidth = Math.max(1, Math.floor(tileset.tileWidth * scale));
108
+ const cellHeight = Math.max(1, Math.floor(tileset.tileHeight * scale));
109
+ const logicalCells = Array.from({ length: capacity }, (_, index) => {
110
+ const column = index % tileset.columns;
111
+ const row = Math.floor(index / tileset.columns);
112
+ const logicalX = margin + column * (tileset.tileWidth + spacing);
113
+ const logicalY = margin + row * (tileset.tileHeight + spacing);
114
+ const logicalRect = {
115
+ x: logicalX,
116
+ y: logicalY,
117
+ width: tileset.tileWidth,
118
+ height: tileset.tileHeight
119
+ };
120
+ if (logicalRect.x < 0 ||
121
+ logicalRect.y < 0 ||
122
+ logicalRect.x + logicalRect.width > logical.width ||
123
+ logicalRect.y + logicalRect.height > logical.height) {
124
+ throw new Error(`Tileset "${asset.id}" cell ${index + 1} falls outside its logical canvas.`);
125
+ }
126
+ return logicalRect;
127
+ });
128
+ const placementRegions = Array.from({ length: packing.columns * packing.rows }, (_, index) => {
129
+ const column = index % packing.columns;
130
+ const row = Math.floor(index / packing.columns);
131
+ return {
132
+ index,
133
+ ...tilesetGenerationRegion(canvas, packing, column, row)
134
+ };
135
+ });
136
+ const slots = placementRegions.map((region) => {
137
+ return {
138
+ index: region.index,
139
+ x: region.x + Math.floor((region.width - cellWidth) / 2),
140
+ y: region.y + Math.floor((region.height - cellHeight) / 2),
141
+ width: cellWidth,
142
+ height: cellHeight
143
+ };
144
+ });
145
+ const sheetLeft = Math.min(...slots.map((slot) => slot.x));
146
+ const sheetTop = Math.min(...slots.map((slot) => slot.y));
147
+ const sheetRight = Math.max(...slots.map((slot) => slot.x + slot.width));
148
+ const sheetBottom = Math.max(...slots.map((slot) => slot.y + slot.height));
149
+ const sheet = {
150
+ x: sheetLeft,
151
+ y: sheetTop,
152
+ width: sheetRight - sheetLeft,
153
+ height: sheetBottom - sheetTop
154
+ };
155
+ const gutter = tilesetGenerationMinimumGutter(slots, packing.columns, packing.rows, canvas);
156
+ const cells = slots.slice(0, tileCount).map((slot, index) => ({
157
+ ...slot,
158
+ usable: true,
159
+ logical: logicalCells[index]
160
+ }));
161
+ const unusedSlots = slots.slice(tileCount);
162
+ return {
163
+ canvas,
164
+ logical,
165
+ sheet,
166
+ placementRegions,
167
+ cells,
168
+ unusedSlots,
169
+ generationColumns: packing.columns,
170
+ generationRows: packing.rows,
171
+ scale,
172
+ gutter,
173
+ outerPadding: {
174
+ left: sheet.x,
175
+ top: sheet.y,
176
+ right: canvas.width - sheet.x - sheet.width,
177
+ bottom: canvas.height - sheet.y - sheet.height
178
+ },
179
+ size: `${canvas.width}x${canvas.height}`
180
+ };
181
+ }
182
+ function requireTilesetGenerationAsset(asset) {
183
+ if (asset.kind !== "tileset" || !asset.tileset || !asset.dimensions) {
184
+ throw new Error(`AI asset "${asset.id}" is not a dimensioned tileset.`);
185
+ }
186
+ const capacity = asset.tileset.columns * asset.tileset.rows;
187
+ const tileCount = Math.min(asset.tileset.tileCount ?? capacity, capacity);
188
+ if (tileCount <= 0) {
189
+ throw new Error("A tileset generation layout requires at least one usable tile.");
190
+ }
191
+ return {
192
+ logical: asset.dimensions,
193
+ tileset: asset.tileset,
194
+ capacity,
195
+ tileCount
196
+ };
197
+ }
198
+ function tilesetGenerationRegion(canvas, packing, column, row) {
199
+ const left = Math.floor((column / packing.columns) * canvas.width);
200
+ const top = Math.floor((row / packing.rows) * canvas.height);
201
+ const right = Math.floor(((column + 1) / packing.columns) * canvas.width);
202
+ const bottom = Math.floor(((row + 1) / packing.rows) * canvas.height);
203
+ return { x: left, y: top, width: right - left, height: bottom - top };
204
+ }
205
+ function tilesetGenerationMinimumGutter(slots, columns, rows, canvas) {
206
+ const gaps = [
207
+ ...slots.map((slot) => slot.x),
208
+ ...slots.map((slot) => canvas.width - slot.x - slot.width),
209
+ ...slots.map((slot) => slot.y),
210
+ ...slots.map((slot) => canvas.height - slot.y - slot.height)
211
+ ];
212
+ for (let row = 0; row < rows; row += 1) {
213
+ for (let column = 0; column < columns - 1; column += 1) {
214
+ const current = slots[row * columns + column];
215
+ const next = slots[row * columns + column + 1];
216
+ gaps.push(next.x - current.x - current.width);
217
+ }
218
+ }
219
+ for (let row = 0; row < rows - 1; row += 1) {
220
+ for (let column = 0; column < columns; column += 1) {
221
+ const current = slots[row * columns + column];
222
+ const next = slots[(row + 1) * columns + column];
223
+ gaps.push(next.y - current.y - current.height);
224
+ }
225
+ }
226
+ const positiveGaps = gaps.filter((gap) => gap > 0);
227
+ return positiveGaps.length > 0 ? Math.max(1, Math.min(...positiveGaps)) : 0;
228
+ }
229
+ export async function stageTilesetSheetReference(reference, geometry, chromaKey) {
230
+ const background = {
231
+ r: chromaKey.red,
232
+ g: chromaKey.green,
233
+ b: chromaKey.blue,
234
+ alpha: 1
235
+ };
236
+ const normalizedReference = await sharp(Buffer.from(reference.image), { failOn: "error" })
237
+ .resize(geometry.logical.width, geometry.logical.height, {
238
+ fit: "fill",
239
+ kernel: sharp.kernel.nearest
240
+ })
241
+ .png()
242
+ .toBuffer();
243
+ const cellOverlays = await Promise.all(geometry.cells.filter((cell) => cell.usable).map(async (cell) => ({
244
+ input: await sharp(normalizedReference, { failOn: "error" })
245
+ .extract({
246
+ left: cell.logical.x,
247
+ top: cell.logical.y,
248
+ width: cell.logical.width,
249
+ height: cell.logical.height
250
+ })
251
+ .resize(cell.width, cell.height, {
252
+ fit: "fill",
253
+ kernel: sharp.kernel.nearest
254
+ })
255
+ .flatten({ background })
256
+ .png()
257
+ .toBuffer(),
258
+ left: cell.x,
259
+ top: cell.y,
260
+ blend: "over"
261
+ })));
262
+ const image = await sharp({
263
+ create: {
264
+ width: geometry.canvas.width,
265
+ height: geometry.canvas.height,
266
+ channels: 4,
267
+ background
268
+ }
269
+ })
270
+ .composite(cellOverlays)
271
+ .png()
272
+ .toBuffer();
273
+ return {
274
+ image,
275
+ mimeType: "image/png",
276
+ fileName: `${reference.fileName.replace(/\.[^.]+$/, "") || "tileset-reference"}.staged.png`
277
+ };
278
+ }
279
+ export async function cropTilesetSheetFromGeneration(image, geometry, outputFormat, padding) {
280
+ const sourceImage = Buffer.from(image);
281
+ const source = sharp(sourceImage, { failOn: "error" });
282
+ const metadata = await source.metadata();
283
+ if (!metadata.width || !metadata.height) {
284
+ throw new Error("Could not read generated tileset image dimensions.");
285
+ }
286
+ const outputBackground = padding
287
+ ? {
288
+ r: padding.color.red,
289
+ g: padding.color.green,
290
+ b: padding.color.blue,
291
+ alpha: padding.transparent ? 0 : 1
292
+ }
293
+ : { r: 0, g: 0, b: 0, alpha: 0 };
294
+ const actualCanvas = { width: metadata.width, height: metadata.height };
295
+ const aspectDelta = Math.abs(Math.log((actualCanvas.width / actualCanvas.height) /
296
+ (geometry.canvas.width / geometry.canvas.height)));
297
+ if (aspectDelta > 1e-3) {
298
+ throw new Error(`Generated tileset raster is ${actualCanvas.width}x${actualCanvas.height}, ` +
299
+ `which does not match the planned ${geometry.canvas.width}x${geometry.canvas.height} ` +
300
+ "canvas aspect ratio. Refusing to stretch tile ownership regions.");
301
+ }
302
+ const cellOverlays = await Promise.all(geometry.cells.filter((cell) => cell.usable).map(async (cell) => {
303
+ const crop = scaleGenerationRect(cell, geometry.canvas, actualCanvas);
304
+ return {
305
+ input: await sharp(sourceImage, { failOn: "error" })
306
+ .extract({
307
+ left: crop.x,
308
+ top: crop.y,
309
+ width: crop.width,
310
+ height: crop.height
311
+ })
312
+ .resize(cell.logical.width, cell.logical.height, {
313
+ fit: "fill",
314
+ kernel: sharp.kernel.nearest
315
+ })
316
+ .png()
317
+ .toBuffer(),
318
+ left: cell.logical.x,
319
+ top: cell.logical.y,
320
+ blend: "over"
321
+ };
322
+ }));
323
+ const processed = sharp({
324
+ create: {
325
+ width: geometry.logical.width,
326
+ height: geometry.logical.height,
327
+ channels: 4,
328
+ background: outputBackground
329
+ }
330
+ }).composite(cellOverlays);
331
+ if (outputFormat === "webp") {
332
+ return processed.webp({ quality: 100 }).toBuffer();
333
+ }
334
+ if (outputFormat === "jpeg") {
335
+ return processed.jpeg({ quality: 95 }).toBuffer();
336
+ }
337
+ return processed.png().toBuffer();
338
+ }
339
+ export function tilesetSheetRectLabel(rect) {
340
+ return `x=${rect.x}-${rect.x + rect.width - 1}, y=${rect.y}-${rect.y + rect.height - 1}`;
341
+ }
342
+ function scaleGenerationRect(rect, declaredCanvas, actualCanvas) {
343
+ const left = clamp(Math.round((rect.x / declaredCanvas.width) * actualCanvas.width), 0, actualCanvas.width - 1);
344
+ const top = clamp(Math.round((rect.y / declaredCanvas.height) * actualCanvas.height), 0, actualCanvas.height - 1);
345
+ const right = clamp(Math.round(((rect.x + rect.width) / declaredCanvas.width) * actualCanvas.width), left + 1, actualCanvas.width);
346
+ const bottom = clamp(Math.round(((rect.y + rect.height) / declaredCanvas.height) * actualCanvas.height), top + 1, actualCanvas.height);
347
+ return {
348
+ x: left,
349
+ y: top,
350
+ width: right - left,
351
+ height: bottom - top
352
+ };
353
+ }
354
+ function clamp(value, minimum, maximum) {
355
+ return Math.max(minimum, Math.min(maximum, value));
356
+ }
357
+ //# sourceMappingURL=tileset-sheet-processing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tileset-sheet-processing.js","sourceRoot":"","sources":["../src/tileset-sheet-processing.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-game-assets/dev",
3
- "version": "0.5.6",
3
+ "version": "0.7.0",
4
4
  "description": "Development server and AI providers for prompt-aware AI game assets.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -26,12 +26,14 @@
26
26
  },
27
27
  "scripts": {
28
28
  "build": "tsc -p tsconfig.json",
29
+ "test": "npm run build && node --test test/*.test.mjs",
29
30
  "typecheck": "tsc -p tsconfig.json --noEmit"
30
31
  },
31
32
  "dependencies": {
32
- "@ai-game-assets/core": "0.5.6",
33
+ "@ai-game-assets/core": "0.7.0",
33
34
  "@types/pngjs": "^6.0.5",
34
- "pngjs": "^7.0.0"
35
+ "pngjs": "^7.0.0",
36
+ "sharp": "^0.35.3"
35
37
  },
36
38
  "peerDependencies": {
37
39
  "openai": ">=5"