summaryrefslogtreecommitdiff
path: root/src/factories/Vec3sFactory.cpp
diff options
context:
space:
mode:
authorpetrie911 <69443847+petrie911@users.noreply.github.com>2024-03-26 18:02:12 -0500
committerGitHub <noreply@github.com>2024-03-26 17:02:12 -0600
commit8196258d2b06afcb06bd71b4b95d4db6e9be0208 (patch)
treeb14cbdd8265ad5d45dbf3c908d1278c693537026 /src/factories/Vec3sFactory.cpp
parentb101ad14bf80730a30d67cfed974f77113a41ab6 (diff)
Add Vec3s factory, fix colpoly, add some support for palettes (#54)
* tlut? * tlut
Diffstat (limited to 'src/factories/Vec3sFactory.cpp')
-rw-r--r--src/factories/Vec3sFactory.cpp79
1 files changed, 79 insertions, 0 deletions
diff --git a/src/factories/Vec3sFactory.cpp b/src/factories/Vec3sFactory.cpp
new file mode 100644
index 0000000..7e62d89
--- /dev/null
+++ b/src/factories/Vec3sFactory.cpp
@@ -0,0 +1,79 @@
+#include "Vec3sFactory.h"
+#include "spdlog/spdlog.h"
+
+#include "Companion.h"
+#include "utils/Decompressor.h"
+#include "utils/TorchUtils.h"
+
+#define FORMAT_INT(x, w) std::dec << std::setfill(' ') << std::setw(w) << x
+
+Vec3sData::Vec3sData(std::vector<Vec3s> vecs): mVecs(vecs) {
+ mMaxWidth = 3;
+ for(Vec3s v : vecs) {
+ mMaxWidth = std::max(mMaxWidth, v.width());
+ }
+}
+
+ExportResult Vec3sHeaderExporter::Export(std::ostream &write, std::shared_ptr<IParsedData> raw, std::string& entryName, YAML::Node &node, std::string* replacement) {
+ const auto symbol = GetSafeNode(node, "symbol", entryName);
+
+ if(Companion::Instance->IsOTRMode()){
+ write << "static const char " << symbol << "[] = \"__OTR__" << (*replacement) << "\";\n\n";
+ return std::nullopt;
+ }
+
+ write << "extern Vec3s " << symbol << "[];\n";
+ return std::nullopt;
+}
+
+
+int GetPrecision(Vec3s v) {
+ return std::max(std::max(GetPrecision(v.x), GetPrecision(v.y)), GetPrecision(v.z));
+}
+
+ExportResult Vec3sCodeExporter::Export(std::ostream &write, std::shared_ptr<IParsedData> raw, std::string& entryName, YAML::Node &node, std::string* replacement ) {
+ const auto symbol = GetSafeNode(node, "symbol", entryName);
+ const auto offset = GetSafeNode<uint32_t>(node, "offset");
+ auto vecData = std::static_pointer_cast<Vec3sData>(raw);
+ int i = 0;
+
+ write << "Vec3s " << symbol << "[] = {";
+
+ int cols = 120 / (3 * vecData->mMaxWidth + 8);
+ for(Vec3s v : vecData->mVecs) {
+ if((i++ % cols) == 0) {
+ write << "\n" << fourSpaceTab;
+ }
+ write << FORMAT_INT(v, vecData->mMaxWidth) << ", ";
+ }
+
+ write << "\n};\n";
+
+ if (Companion::Instance->IsDebug()) {
+ write << "// Count: " << vecData->mVecs.size() << " Vec3s\n";
+ }
+
+ return offset + vecData->mVecs.size() * sizeof(Vec3s);
+}
+
+ExportResult Vec3sBinaryExporter::Export(std::ostream &write, std::shared_ptr<IParsedData> raw, std::string& entryName, YAML::Node &node, std::string* replacement ) {
+ return std::nullopt;
+}
+
+std::optional<std::shared_ptr<IParsedData>> Vec3sFactory::parse(std::vector<uint8_t>& buffer, YAML::Node& node) {
+ std::vector<Vec3s> vecs;
+ const auto count = GetSafeNode<int>(node, "count");
+ auto [root, segment] = Decompressor::AutoDecode(node, buffer, count * sizeof(Vec3s));
+ LUS::BinaryReader reader(segment.data, segment.size);
+ reader.SetEndianness(LUS::Endianness::Big);
+
+ for(int i = 0; i < count; i++) {
+ auto vx = reader.ReadInt16();
+ auto vy = reader.ReadInt16();
+ auto vz = reader.ReadInt16();
+
+ vecs.push_back(Vec3s(vx, vy, vz));
+ }
+
+ return std::make_shared<Vec3sData>(vecs);
+}