summaryrefslogtreecommitdiff
path: root/src/factories/sf64/TriangleFactory.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/factories/sf64/TriangleFactory.cpp')
-rw-r--r--src/factories/sf64/TriangleFactory.cpp158
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);
}