diff options
| author | petrie911 <69443847+petrie911@users.noreply.github.com> | 2024-03-27 18:31:28 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-03-27 17:31:28 -0600 |
| commit | f9efdcf634a57c1d607199b70a69dffc3b863f1c (patch) | |
| tree | 0ef805d9c47eb620afa39a807a0ddc53577dd0fa | |
| parent | db11318e5cbf915cf483395672b8409d2564dd98 (diff) | |
Hitbox export fix (#56)
| -rw-r--r-- | src/factories/sf64/HitboxFactory.cpp | 30 |
1 files changed, 25 insertions, 5 deletions
diff --git a/src/factories/sf64/HitboxFactory.cpp b/src/factories/sf64/HitboxFactory.cpp index 5762ada..ea700a4 100644 --- a/src/factories/sf64/HitboxFactory.cpp +++ b/src/factories/sf64/HitboxFactory.cpp @@ -5,7 +5,26 @@ #include "utils/Decompressor.h" #include "utils/TorchUtils.h" -#define FLOAT(x, w) std::dec << std::setfill(' ') << (((int) x == x) ? "" : " ") << std::setw(w - 2) << x << (((int) x == x) ? ".0f" : "f") +static int GetPrecision(float f) { + int p = 0; + int shift = 1; + float approx = std::round(f); + + while(f != approx && p < 12 ){ + shift *= 10; + p++; + approx = std::round(f * shift) / shift; + } + return p; +} + +static std::ostream& FormatFloat(std::ostream& out, const float x, int w) { + if(x == (int) x) { + out << std::dec << std::fixed << std::setprecision(0) << std::setfill(' ') << std::setw(w - 2) << x << ".0f"; + } else { + out << std::dec << std::fixed << std::setprecision(GetPrecision(x)) << std::setfill(' ') << std::setw(w) << x << "f"; + } +} SF64::HitboxData::HitboxData(std::vector<float> data, std::vector<int> types): mData(data), mTypes(types) { @@ -53,20 +72,21 @@ ExportResult SF64::HitboxCodeExporter::Export(std::ostream &write, std::shared_p index++; for(int j = 0; j < 3; j++) { auto tempf = hitbox->mData[index++]; - write << FLOAT(tempf, 6) << ", "; + FormatFloat(write, tempf, 6); + write << ", "; } - write << fourSpaceTab; } else { write << " /* HITBOX_TYPE_1 */ "; } if(hasType2 && hitbox->mTypes[i] != 2) { - for(int j = 0; j < 8; j++) { + for(int j = 0; j < 7; j++) { write << fourSpaceTab; } } for(int j = 0; j < 6; j++) { auto tempf = hitbox->mData[index++]; - write << FLOAT(tempf, 7) << ", "; + FormatFloat(write, tempf, 7); + write << ", "; } write << "\n"; } |
