diff options
author | Kelly Rauchenberger <fefferburbia@gmail.com> | 2021-01-31 11:43:53 -0500 |
---|---|---|
committer | Kelly Rauchenberger <fefferburbia@gmail.com> | 2021-01-31 11:43:53 -0500 |
commit | f648c6776e0a1c5e1e3f6fcf9c81fefcb67a0c3e (patch) | |
tree | 9ade8b7da4a4165b6c898a8d18f88bf4a5d6b485 | |
parent | 3720e9bcdd15a30058bc5f8a2913a924760796a0 (diff) | |
download | tanetane-f648c6776e0a1c5e1e3f6fcf9c81fefcb67a0c3e.tar.gz tanetane-f648c6776e0a1c5e1e3f6fcf9c81fefcb67a0c3e.tar.bz2 tanetane-f648c6776e0a1c5e1e3f6fcf9c81fefcb67a0c3e.zip |
Sprite dumper combines arbitrary sheets now
-rw-r--r-- | tools/sprite_dumper/main.cpp | 109 |
1 files changed, 68 insertions, 41 deletions
diff --git a/tools/sprite_dumper/main.cpp b/tools/sprite_dumper/main.cpp index c8dd956..2ba37c8 100644 --- a/tools/sprite_dumper/main.cpp +++ b/tools/sprite_dumper/main.cpp | |||
@@ -7,6 +7,7 @@ | |||
7 | #include <vector> | 7 | #include <vector> |
8 | #include <iostream> | 8 | #include <iostream> |
9 | #include <Magick++.h> | 9 | #include <Magick++.h> |
10 | #include <sstream> | ||
10 | 11 | ||
11 | class Rom { | 12 | class Rom { |
12 | public: | 13 | public: |
@@ -270,46 +271,12 @@ struct SpriteSheet { | |||
270 | int gfxPtr; | 271 | int gfxPtr; |
271 | std::vector<Sprite> sprites; | 272 | std::vector<Sprite> sprites; |
272 | 273 | ||
273 | Magick::Image render(Rom& m3, PaletteSet& palettes) const { | 274 | void render(Rom& m3, PaletteSet& palettes, std::vector<FrameOutput>& frames) const { |
274 | int maxWidth = 0; | ||
275 | int maxHeight = 0; | ||
276 | std::vector<FrameOutput> frames; | ||
277 | |||
278 | const Palette& palette = palettes.GetPalette(spriteindex); | 275 | const Palette& palette = palettes.GetPalette(spriteindex); |
279 | for (int i=0; i<sprites.size(); i++) { | 276 | for (int i=0; i<sprites.size(); i++) { |
280 | FrameOutput f = sprites[i].render(m3, palette, gfxPtr); | 277 | FrameOutput f = sprites[i].render(m3, palette, gfxPtr); |
281 | |||
282 | if (f.width > maxWidth) maxWidth = f.width; | ||
283 | if (f.height > maxHeight) maxHeight = f.height; | ||
284 | frames.push_back(std::move(f)); | 278 | frames.push_back(std::move(f)); |
285 | } | 279 | } |
286 | |||
287 | const int FRAMES_PER_ROW = 10; | ||
288 | int sheetWidth; | ||
289 | int sheetHeight; | ||
290 | |||
291 | std::ofstream datafile("out.txt"); | ||
292 | datafile << maxWidth << "," << maxHeight << " cell size" << std::endl; | ||
293 | datafile << FRAMES_PER_ROW << " frames per row" << std::endl; | ||
294 | datafile << frames.size() << " frames" << std::endl; | ||
295 | datafile << std::endl; | ||
296 | |||
297 | if (frames.size() < FRAMES_PER_ROW) { | ||
298 | sheetWidth = frames.size() * maxWidth; | ||
299 | sheetHeight = maxHeight; | ||
300 | } else { | ||
301 | sheetWidth = FRAMES_PER_ROW * maxWidth; | ||
302 | sheetHeight = (frames.size() / FRAMES_PER_ROW + 1) * maxHeight; | ||
303 | } | ||
304 | |||
305 | Magick::Image sheet(Magick::Geometry(sheetWidth, sheetHeight), "transparent"); | ||
306 | for (int i=0; i<frames.size(); i++) { | ||
307 | const FrameOutput& f = frames.at(i); | ||
308 | sheet.composite(f.image, (i%FRAMES_PER_ROW)*maxWidth, (i/FRAMES_PER_ROW)*maxHeight, Magick::OverCompositeOp); | ||
309 | datafile << f.width << "," << f.height << "," << f.centerX << "," << f.centerY << std::endl; | ||
310 | } | ||
311 | |||
312 | return sheet; | ||
313 | } | 280 | } |
314 | }; | 281 | }; |
315 | 282 | ||
@@ -388,8 +355,10 @@ private: | |||
388 | }; | 355 | }; |
389 | 356 | ||
390 | int main(int argc, char** argv) { | 357 | int main(int argc, char** argv) { |
391 | if (argc != 2) { | 358 | if (argc < 3) { |
392 | std::cout << "Usage" << std::endl; | 359 | std::cout << "Usage: ./sprite_dumper [path to rom] {sheet IDs}" << std::endl; |
360 | std::cout << "sheet IDs should be space separated references to the sheets to concatenate" << std::endl; | ||
361 | std::cout << "the format of the ID is BankNum.SheetNum" << std::endl; | ||
393 | return -1; | 362 | return -1; |
394 | } | 363 | } |
395 | 364 | ||
@@ -397,14 +366,72 @@ int main(int argc, char** argv) { | |||
397 | 366 | ||
398 | Rom m3(argv[1]); | 367 | Rom m3(argv[1]); |
399 | PaletteSet palettes(m3); | 368 | PaletteSet palettes(m3); |
400 | //const int banks[] = {0x1A442A4, 0x1AE0638, 0x1AEE4C4, 0x1AF1ED0}; | ||
401 | Bank b1(m3, 0x1A442A4, 0x14383E4); | 369 | Bank b1(m3, 0x1A442A4, 0x14383E4); |
402 | Bank b2(m3, 0x1AE0638, 0x194BC30); | 370 | Bank b2(m3, 0x1AE0638, 0x194BC30); |
403 | Bank b3(m3, 0x1AEE4C4, 0x1A012B8); | 371 | Bank b3(m3, 0x1AEE4C4, 0x1A012B8); |
404 | Bank b4(m3, 0x1AF1ED0, 0x1A36AA0); | 372 | Bank b4(m3, 0x1AF1ED0, 0x1A36AA0); |
405 | Magick::Image im = b2.SpriteSheets().at(3).render(m3, palettes); | 373 | |
406 | im.magick("png"); | 374 | std::vector<FrameOutput> frames; |
407 | im.write("out.png"); | 375 | |
376 | for (int i=2; i<argc; i++) { | ||
377 | std::stringstream argfmt; | ||
378 | argfmt << argv[i]; | ||
379 | |||
380 | int bankNum; | ||
381 | char ch; | ||
382 | int sheetNum; | ||
383 | argfmt >> bankNum; | ||
384 | argfmt >> ch; //. | ||
385 | argfmt >> sheetNum; | ||
386 | |||
387 | const Bank& bankToRead = [&](){ | ||
388 | switch (bankNum) { | ||
389 | case 0: return b1; | ||
390 | case 1: return b2; | ||
391 | case 2: return b3; | ||
392 | case 3: return b4; | ||
393 | default: throw std::invalid_argument("Invalid bank num: " + std::to_string(bankNum)); | ||
394 | } | ||
395 | }(); | ||
396 | |||
397 | bankToRead.SpriteSheets().at(sheetNum).render(m3, palettes, frames); | ||
398 | } | ||
399 | |||
400 | int maxWidth = 0; | ||
401 | int maxHeight = 0; | ||
402 | for (const FrameOutput& f : frames) { | ||
403 | if (f.width > maxWidth) maxWidth = f.width; | ||
404 | if (f.height > maxHeight) maxHeight = f.height; | ||
405 | } | ||
406 | |||
407 | const int FRAMES_PER_ROW = 10; | ||
408 | int sheetWidth; | ||
409 | int sheetHeight; | ||
410 | |||
411 | std::ofstream datafile("out.txt"); | ||
412 | datafile << maxWidth << "," << maxHeight << " cell size" << std::endl; | ||
413 | datafile << FRAMES_PER_ROW << " frames per row" << std::endl; | ||
414 | datafile << frames.size() << " frames" << std::endl; | ||
415 | datafile << std::endl; | ||
416 | |||
417 | if (frames.size() < FRAMES_PER_ROW) { | ||
418 | sheetWidth = frames.size() * maxWidth; | ||
419 | sheetHeight = maxHeight; | ||
420 | } else { | ||
421 | sheetWidth = FRAMES_PER_ROW * maxWidth; | ||
422 | sheetHeight = (frames.size() / FRAMES_PER_ROW + 1) * maxHeight; | ||
423 | } | ||
424 | |||
425 | Magick::Image sheet(Magick::Geometry(sheetWidth, sheetHeight), "transparent"); | ||
426 | for (int i=0; i<frames.size(); i++) { | ||
427 | const FrameOutput& f = frames.at(i); | ||
428 | sheet.composite(f.image, (i%FRAMES_PER_ROW)*maxWidth, (i/FRAMES_PER_ROW)*maxHeight, Magick::OverCompositeOp); | ||
429 | datafile << f.width << "," << f.height << "," << f.centerX << "," << f.centerY << std::endl; | ||
430 | } | ||
431 | |||
432 | //Magick::Image im = b2.SpriteSheets().at(3).render(m3, palettes); | ||
433 | sheet.magick("png"); | ||
434 | sheet.write("out.png"); | ||
408 | 435 | ||
409 | return 0; | 436 | return 0; |
410 | } \ No newline at end of file | 437 | } \ No newline at end of file |