@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.
- package/dist/asset-store.d.ts +27 -1
- package/dist/asset-store.d.ts.map +1 -1
- package/dist/asset-store.js +314 -8
- package/dist/asset-store.js.map +1 -1
- package/dist/audio-provider.d.ts +1 -0
- package/dist/audio-provider.d.ts.map +1 -1
- package/dist/audio-provider.js +23 -1
- package/dist/audio-provider.js.map +1 -1
- package/dist/build-manifest.d.ts.map +1 -1
- package/dist/build-manifest.js +14 -0
- package/dist/build-manifest.js.map +1 -1
- package/dist/image-generation-sizes.d.ts +7 -0
- package/dist/image-generation-sizes.d.ts.map +1 -0
- package/dist/image-generation-sizes.js +15 -0
- package/dist/image-generation-sizes.js.map +1 -0
- package/dist/index.d.ts +6 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/internal.d.ts +1 -1
- package/dist/internal.d.ts.map +1 -1
- package/dist/provider-image-processing.d.ts +5 -1
- package/dist/provider-image-processing.d.ts.map +1 -1
- package/dist/provider-image-processing.js +278 -9
- package/dist/provider-image-processing.js.map +1 -1
- package/dist/provider.d.ts +45 -1
- package/dist/provider.d.ts.map +1 -1
- package/dist/provider.js +477 -57
- package/dist/provider.js.map +1 -1
- package/dist/server.d.ts +78 -2
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +339 -28
- package/dist/server.js.map +1 -1
- package/dist/tileset-sheet-processing.d.ts +49 -0
- package/dist/tileset-sheet-processing.d.ts.map +1 -0
- package/dist/tileset-sheet-processing.js +357 -0
- package/dist/tileset-sheet-processing.js.map +1 -0
- 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.
|
|
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.
|
|
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"
|