summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--tools/sprite_dumper/main.cpp60
1 files changed, 48 insertions, 12 deletions
diff --git a/tools/sprite_dumper/main.cpp b/tools/sprite_dumper/main.cpp index e84a2d7..4183e43 100644 --- a/tools/sprite_dumper/main.cpp +++ b/tools/sprite_dumper/main.cpp
@@ -170,13 +170,21 @@ private:
170 static constexpr int HEIGHTS[3][4] = { { 8, 16, 32, 64 }, { 8, 8, 16, 32 }, { 16, 32, 32, 64 } }; 170 static constexpr int HEIGHTS[3][4] = { { 8, 16, 32, 64 }, { 8, 8, 16, 32 }, { 16, 32, 32, 64 } };
171}; 171};
172 172
173struct FrameOutput {
174 Magick::Image image;
175 int width;
176 int height;
177 int centerX;
178 int centerY;
179};
180
173struct Sprite { 181struct Sprite {
174 std::vector<Subsprite> subsprites; 182 std::vector<Subsprite> subsprites;
175 183
176 Magick::Image render(Rom& m3, const Palette& palette, const int gfxPtr) const { 184 FrameOutput render(Rom& m3, const Palette& palette, const int gfxPtr) const {
177 Magick::Image result; 185 FrameOutput output;
178 186
179 if (subsprites.empty()) return result; 187 if (subsprites.empty()) return output;
180 188
181 int minX = subsprites[0].x; 189 int minX = subsprites[0].x;
182 int minY = subsprites[0].y; 190 int minY = subsprites[0].y;
@@ -197,10 +205,14 @@ struct Sprite {
197 int centerX = -minX; 205 int centerX = -minX;
198 int centerY = -minY; 206 int centerY = -minY;
199 207
200 result = Magick::Image(Magick::Geometry(width, height), "transparent"); 208 output.width = width;
201 result.modifyImage(); 209 output.height = height;
210 output.centerX = centerX;
211 output.centerY = centerY;
212 output.image = Magick::Image(Magick::Geometry(width, height), "transparent");
213 output.image.modifyImage();
202 214
203 Magick::Pixels view(result); 215 Magick::Pixels view(output.image);
204 216
205 for (const Subsprite& o : subsprites) { 217 for (const Subsprite& o : subsprites) {
206 int tilePointer = o.tile << 5; 218 int tilePointer = o.tile << 5;
@@ -235,10 +247,10 @@ struct Sprite {
235 int actualTx = o.flipH ? (7-tx) : tx; 247 int actualTx = o.flipH ? (7-tx) : tx;
236 248
237 if (tileData[actualTx][actualTy] != 0) { 249 if (tileData[actualTx][actualTy] != 0) {
238 auto& c = palette.Colors().at(tileData[actualTx][actualTy]); 250 //auto& c = palette.Colors().at(tileData[actualTx][actualTy]);
239 std::cout << c.redQuantum() << "," << c.greenQuantum() << "," << c.blueQuantum() << std::endl; 251 //std::cout << c.redQuantum() << "," << c.greenQuantum() << "," << c.blueQuantum() << std::endl;
240 *pixels = palette.Colors().at(tileData[actualTx][actualTy]); 252 *pixels = palette.Colors().at(tileData[actualTx][actualTy]);
241 std::cout << tileData[actualTx][actualTy] << std::endl; 253 //std::cout << tileData[actualTx][actualTy] << std::endl;
242 } 254 }
243 pixels++; 255 pixels++;
244 } 256 }
@@ -249,7 +261,7 @@ struct Sprite {
249 } 261 }
250 } 262 }
251 263
252 return result; 264 return output;
253 } 265 }
254}; 266};
255 267
@@ -258,13 +270,37 @@ struct SpriteSheet {
258 std::vector<Sprite> sprites; 270 std::vector<Sprite> sprites;
259 271
260 Magick::Image render(Rom& m3, PaletteSet& palettes) const { 272 Magick::Image render(Rom& m3, PaletteSet& palettes) const {
261 273 int maxWidth = 0;
274 int maxHeight = 0;
275 std::vector<FrameOutput> frames;
262 276
263 for (int i=0; i<sprites.size(); i++) { 277 for (int i=0; i<sprites.size(); i++) {
264 const Palette& palette = palettes.GetPalette(i); 278 const Palette& palette = palettes.GetPalette(i);
265 return sprites[0].render(m3, palette, gfxPtr); 279 FrameOutput f = sprites[i].render(m3, palette, gfxPtr);
280 if (f.width > maxWidth) maxWidth = f.width;
281 if (f.height > maxHeight) maxHeight = f.height;
282 frames.push_back(std::move(f));
283 }
284
285 const int FRAMES_PER_ROW = 10;
286 int sheetWidth;
287 int sheetHeight;
266 288
289 if (frames.size() < FRAMES_PER_ROW) {
290 sheetWidth = frames.size() * maxWidth;
291 sheetHeight = maxHeight;
292 } else {
293 sheetWidth = FRAMES_PER_ROW * maxWidth;
294 sheetHeight = (frames.size() / FRAMES_PER_ROW + 1) * maxHeight;
295 }
296
297 Magick::Image sheet(Magick::Geometry(sheetWidth, sheetHeight), "transparent");
298 for (int i=0; i<frames.size(); i++) {
299 const FrameOutput& f = frames.at(i);
300 sheet.composite(f.image, (i%FRAMES_PER_ROW)*maxWidth, (i/FRAMES_PER_ROW)*maxHeight, Magick::OverCompositeOp);
267 } 301 }
302
303 return sheet;
268 } 304 }
269}; 305};
270 306