50 lines
2.1 KiB
C++
50 lines
2.1 KiB
C++
#include "gc/GcTargetEffect.hpp"
|
|
|
|
#include <cstdlib>
|
|
#include <iostream>
|
|
#include <set>
|
|
#include <string>
|
|
|
|
int main(int argc, char** argv) {
|
|
if (argc < 3) {
|
|
std::cerr << "usage: opencoaster-effect-probe EFC_DATA UV_DATA [first [last]]\n";
|
|
return 2;
|
|
}
|
|
|
|
GcTargetEffectBank bank;
|
|
std::string error;
|
|
if (!bank.load(argv[1], argv[2], &error)) {
|
|
std::cerr << error << '\n';
|
|
return 1;
|
|
}
|
|
|
|
const int first = argc > 3 ? std::atoi(argv[3]) : 0;
|
|
const int last = argc > 4 ? std::atoi(argv[4]) : first;
|
|
const int uvBase = argc > 5 ? std::atoi(argv[5]) : 0;
|
|
for (int effect = first; effect <= last; ++effect) {
|
|
std::cout << "effect " << effect << " lifetime=" << bank.lifetime(effect) << '\n';
|
|
const int lifetime = bank.lifetime(effect);
|
|
const int sampleTicks[] = {0, 1, lifetime / 2, lifetime > 0 ? lifetime - 1 : 0};
|
|
std::set<int> seenTicks;
|
|
for (const int tick : sampleTicks) {
|
|
if (!seenTicks.insert(tick).second) continue;
|
|
const auto sprites = bank.evaluate(effect, static_cast<float>(tick), uvBase);
|
|
std::cout << " tick " << tick << " sprites=" << sprites.size() << '\n';
|
|
for (const auto& sprite : sprites) {
|
|
const GcUvCell* cell = bank.uvCell(sprite.uvRecord, sprite.frame);
|
|
std::cout << " uv=" << sprite.uvRecord << " tex="
|
|
<< bank.uvTexture(sprite.uvRecord) << " frame=" << sprite.frame;
|
|
if (cell) {
|
|
std::cout << " cell=" << cell->x << ',' << cell->y << ' '
|
|
<< cell->width << 'x' << cell->height;
|
|
}
|
|
std::cout << " pos=" << sprite.offsetPixels.x << ',' << sprite.offsetPixels.y
|
|
<< " scale=" << sprite.scale.x << ',' << sprite.scale.y
|
|
<< " rot=" << sprite.rotationDegrees
|
|
<< " rgba=" << sprite.color.r << ',' << sprite.color.g << ','
|
|
<< sprite.color.b << ',' << sprite.color.a << '\n';
|
|
}
|
|
}
|
|
}
|
|
}
|