diff options
Diffstat (limited to 'src/factories/sf64/TriangleFactory.cpp')
| -rw-r--r-- | src/factories/sf64/TriangleFactory.cpp | 158 |
1 files changed, 101 insertions, 57 deletions
diff --git a/src/factories/sf64/TriangleFactory.cpp b/src/factories/sf64/TriangleFactory.cpp index 9e50879..ea098e5 100644 --- a/src/factories/sf64/TriangleFactory.cpp +++ b/src/factories/sf64/TriangleFactory.cpp @@ -4,13 +4,18 @@ #include "Companion.h" #include "utils/Decompressor.h" #include "utils/TorchUtils.h" +#include <regex> #define NUM(x, w) std::dec << std::setfill(' ') << std::setw(w) << x -// #define FLOAT(x, w) std::dec << std::setfill(' ') << (((int) x == x) ? "" : " ") << std::setw(w - 2) << x << (((int) x == x) ? ".0f" : "f") +#define FORMAT_FLOAT(x, w, p) std::dec << std::setfill(' ') << std::fixed << std::setprecision(p) << std::setw(w) << x +#define STRIP_SEGMENT(offset) (IS_SEGMENTED(offset) ? SEGMENT_OFFSET(offset) : (offset)) -SF64::TriangleData::TriangleData(std::vector<Vec3s> tris, std::vector<std::vector<Vec3f>> meshes): mTris(tris), mMeshes(meshes) { +// SF64::TriangleData::TriangleData(std::vector<Vec3s> tris, std::vector<std::vector<Vec3f>> meshes): mTris(tris), mMeshes(meshes) { +// } + +SF64::TriangleData::TriangleData(std::vector<Vec3s> tris, std::vector<YAML::Node> meshNodes): mTris(tris), mMeshNodes(meshNodes) { } void SF64::TriangleHeaderExporter::Export(std::ostream &write, std::shared_ptr<IParsedData> raw, std::string& entryName, YAML::Node &node, std::string* replacement) { @@ -28,17 +33,19 @@ void SF64::TriangleCodeExporter::Export(std::ostream &write, std::shared_ptr<IPa const auto symbol = GetSafeNode(node, "symbol", entryName); const auto offset = GetSafeNode<uint32_t>(node, "offset"); auto triData = std::static_pointer_cast<SF64::TriangleData>(raw); + const auto meshSize = GetSafeNode(triData->mMeshNodes[0], "count", 0); auto off = offset; + auto segment = 0; int i; if(IS_SEGMENTED(off)) { off = SEGMENT_OFFSET(off); } if (Companion::Instance->IsDebug()) { - write << "// 0x" << std::uppercase << std::hex << off << "\n"; + write << "// 0x" << std::uppercase << std::hex << STRIP_SEGMENT(offset) << "\n"; } write << "Triangle " << symbol << "[] = {"; - int width = std::log10(triData->mMeshes[0].size()) + 1; + int width = std::log10(meshSize) + 1; i = 0; for(Vec3s tri : triData->mTris) { if((i++ % 6) == 0) { @@ -57,43 +64,46 @@ void SF64::TriangleCodeExporter::Export(std::ostream &write, std::shared_ptr<IPa write << "\n"; - auto meshOffset = offset + triData->mTris.size() * sizeof(Vec3s); - off = meshOffset; - if(IS_SEGMENTED(off)) { - off = SEGMENT_OFFSET(off); - } - for(int j = 0; j < triData->mMeshes.size(); j++) { - std::string indexTag = ""; - std::ostringstream defaultMeshSymbol; - if(triData->mMeshes.size() != 1) { - indexTag = std::to_string(j) + "_"; - } - defaultMeshSymbol << symbol << "_mesh_" << indexTag << std::uppercase << std::hex << off; - const auto meshSymbol = GetSafeNode(node, "mesh_symbol", defaultMeshSymbol.str()); - if (Companion::Instance->IsDebug()) { - write << "// 0x" << std::uppercase << std::hex << off << "\n"; - } - - write << "Vec3f " << meshSymbol << "[] = {"; - i = 0; - for(Vec3f vtx : triData->mMeshes[j]) { - if((i++ % 4) == 0) { - write << "\n" << fourSpaceTab; - } - write << NUM(vtx, 5) << ", "; - } - - write << "\n};\n"; - off += triData->mMeshes[j].size() * sizeof(Vec3f); - if (Companion::Instance->IsDebug()) { - write << "// Mesh vertex count: " << triData->mMeshes[j].size() << "\n"; - write << "// 0x" << std::uppercase << std::hex << off << "\n"; - } - write << "\n"; - } - - - + // auto meshOffset = offset + triData->mTris.size() * sizeof(Vec3s); + + // for(int j = 0; j < triData->mMeshes.size(); j++) { + // std::string indexTag = ""; + // std::ostringstream offsetStr; + // std::string meshSymbol; + // if(triData->mMeshes.size() != 1) { + // indexTag = std::to_string(j) + "_"; + // } + // offsetStr << std::uppercase << std::hex << STRIP_SEGMENT(meshOffset); + // if(!node["mesh_symbol"]) { + // meshSymbol = symbol + "_mesh_" + indexTag + offsetStr.str(); + // } else { + // meshSymbol = GetSafeNode<std::string>(node, "mesh_symbol"); + // if(!ReplaceOffset(meshSymbol, meshOffset)) { + // meshSymbol += indexTag; + // } + // } + + // if (Companion::Instance->IsDebug()) { + // write << "// 0x" << std::uppercase << std::hex << off << "\n"; + // } + + // write << "Vec3f " << meshSymbol << "[] = {"; + // i = 0; + // for(Vec3f vtx : triData->mMeshes[j]) { + // if((i++ % 4) == 0) { + // write << "\n" << fourSpaceTab; + // } + // write << NUM(vtx, 5) << ", "; + // } + + // write << "\n};\n"; + // off += triData->mMeshes[j].size() * sizeof(Vec3f); + // if (Companion::Instance->IsDebug()) { + // write << "// Mesh vertex count: " << triData->mMeshes[j].size() << "\n"; + // write << "// 0x" << std::uppercase << std::hex << off << "\n"; + // } + // write << "\n"; + // } } void SF64::TriangleBinaryExporter::Export(std::ostream &write, std::shared_ptr<IParsedData> raw, std::string& entryName, YAML::Node &node, std::string* replacement ) { @@ -105,6 +115,7 @@ std::optional<std::shared_ptr<IParsedData>> SF64::TriangleFactory::parse(std::ve const auto count = GetSafeNode<uint32_t>(node, "count"); const auto meshCount = GetSafeNode<uint32_t>(node, "mesh_count", 1); std::vector<Vec3s> tris; + std::vector<YAML::Node> meshNodes; int meshSize = 0; auto [_, segment] = Decompressor::AutoDecode(node, buffer, count * sizeof(Vec3s)); LUS::BinaryReader reader(segment.data, segment.size); @@ -123,24 +134,57 @@ std::optional<std::shared_ptr<IParsedData>> SF64::TriangleFactory::parse(std::ve tris.push_back(tri); } meshSize++; - const auto meshOffset = GetSafeNode<uint32_t>(node, "mesh_offset", offset + count * sizeof(Vec3s)); - YAML::Node meshNode; - meshNode["offset"] = meshOffset; - auto [__, meshSegment] = Decompressor::AutoDecode(meshNode, buffer, meshSize * meshCount * sizeof(Vec3f)); - LUS::BinaryReader meshReader(meshSegment.data, meshSegment.size); - meshReader.SetEndianness(LUS::Endianness::Big); - std::vector<std::vector<Vec3f>> meshes; + auto meshOffset = GetSafeNode<uint32_t>(node, "mesh_offset", offset + count * sizeof(Vec3s)); for(int j = 0; j < meshCount; j++) { - std::vector<Vec3f> mesh; - Vec3f vtx; - for(int i = 0; i < meshSize; i++) { - vtx.x = meshReader.ReadFloat(); - vtx.y = meshReader.ReadFloat(); - vtx.z = meshReader.ReadFloat(); - mesh.push_back(vtx); + YAML::Node meshNode; + + if(node["mesh_symbol"]) { + auto meshSymbol = GetSafeNode<std::string>(node, "mesh_symbol"); + if (meshSymbol.find("OFFSET") == std::string::npos) { + if(meshCount > 1) { + meshSymbol += "_" + std::to_string(j); + } + } else { + std::ostringstream offsetSeg; + std::string replaceOff = "OFFSET"; + std::string off; + offsetSeg << std::uppercase << std::hex << meshOffset; + off = offsetSeg.str(); + meshSymbol = std::regex_replace(meshSymbol, std::regex(R"(OFFSET)"), offsetSeg.str()); + // std::replace(meshSymbol.begin(), meshSymbol.end(), replaceOff, off); + } + meshNode["symbol"] = meshSymbol; } - meshes.push_back(mesh); + meshNode["type"] = "VEC3F"; + meshNode["count"] = meshSize; + meshNode["offset"] = meshOffset; + + meshNode = Companion::Instance->AddAsset(meshNode).value(); + meshNodes.push_back(meshNode); + meshOffset += meshSize * sizeof(Vec3f); } - return std::make_shared<SF64::TriangleData>(tris, meshes); + + + + // YAML::Node meshNode; + // meshNode["offset"] = meshOffset; + // auto [__, meshSegment] = Decompressor::AutoDecode(meshNode, buffer, meshSize * meshCount * sizeof(Vec3f)); + // LUS::BinaryReader meshReader(meshSegment.data, meshSegment.size); + // meshReader.SetEndianness(LUS::Endianness::Big); + // std::vector<std::vector<Vec3f>> meshes; + + // for(int j = 0; j < meshCount; j++) { + // std::vector<Vec3f> mesh; + // Vec3f vtx; + // for(int i = 0; i < meshSize; i++) { + // vtx.x = meshReader.ReadFloat(); + // vtx.y = meshReader.ReadFloat(); + // vtx.z = meshReader.ReadFloat(); + // mesh.push_back(vtx); + // } + // meshes.push_back(mesh); + // } + + return std::make_shared<SF64::TriangleData>(tris, meshNodes); } |
