summaryrefslogtreecommitdiff
path: root/src/factories
diff options
context:
space:
mode:
authorKiritoDv <kiritodev01@gmail.com>2025-02-08 20:59:18 -0600
committerKiritoDv <kiritodev01@gmail.com>2025-02-08 20:59:18 -0600
commit348fc75e9902a653d7cd0cee7c4d9aae7c0f3c43 (patch)
tree1ef56231c50508a85ebdcad2ec1fac8f7b5463c6 /src/factories
parenta1a50c60ece9854422cd2b9896525f4591fc6b87 (diff)
Added a validation for geo layouts
Diffstat (limited to 'src/factories')
-rw-r--r--src/factories/sm64/GeoLayoutFactory.cpp28
-rw-r--r--src/factories/sm64/GeoLayoutFactory.h1
2 files changed, 24 insertions, 5 deletions
diff --git a/src/factories/sm64/GeoLayoutFactory.cpp b/src/factories/sm64/GeoLayoutFactory.cpp
index ebe679c..d853e00 100644
--- a/src/factories/sm64/GeoLayoutFactory.cpp
+++ b/src/factories/sm64/GeoLayoutFactory.cpp
@@ -65,7 +65,7 @@ ExportResult SM64::GeoCodeExporter::Export(std::ostream&write, std::shared_ptr<I
write << "GeoLayout " << symbol << "[] = {\n";
- for(auto& [opcode, arguments] : cmds) {
+ for(auto& [opcode, arguments, skip] : cmds) {
bool commaFlag = false;
if (opcode == GeoOpcode::OpenNode) {
@@ -170,7 +170,11 @@ ExportResult SM64::GeoCodeExporter::Export(std::ostream&write, std::shared_ptr<I
}
}
}
- write << "),\n";
+ if(skip){
+ write << "), //! more close than open nodes\n";
+ } else {
+ write << "),\n";
+ }
++cmdCount;
}
@@ -190,7 +194,10 @@ ExportResult SM64::GeoBinaryExporter::Export(std::ostream&write, std::shared_ptr
auto writer = LUS::BinaryWriter();
- for(auto& [opcode, arguments] : layout->commands) {
+ for(auto& [opcode, arguments, skip] : layout->commands) {
+ if(skip){
+ continue;
+ }
writer.Write(static_cast<uint8_t>(opcode));
for(auto& args : arguments) {
@@ -314,10 +321,12 @@ std::optional<std::shared_ptr<IParsedData>> SM64::GeoLayoutFactory::parse(std::v
auto cmd = segment.data;
bool processing = true;
+ int32_t openCount = 0;
std::vector<GeoCommand> commands;
while(processing) {
auto opcode = static_cast<GeoOpcode>(cmd[0x00]);
+ auto skip = false;
SPDLOG_INFO("Processing Command {}", opcode);
@@ -352,9 +361,18 @@ std::optional<std::shared_ptr<IParsedData>> SM64::GeoLayoutFactory::parse(std::v
processing = false;
break;
}
- case GeoOpcode::OpenNode:
+ case GeoOpcode::OpenNode: {
+ openCount++;
+ cmd += 0x04 << CMD_SIZE_SHIFT;
+ break;
+ }
case GeoOpcode::CloseNode: {
cmd += 0x04 << CMD_SIZE_SHIFT;
+ if (openCount - 1 < 0) {
+ skip = true;
+ } else {
+ openCount--;
+ }
break;
}
case GeoOpcode::AssignAsView: {
@@ -690,7 +708,7 @@ std::optional<std::shared_ptr<IParsedData>> SM64::GeoLayoutFactory::parse(std::v
}
}
- commands.push_back({ opcode, arguments });
+ commands.push_back({ opcode, arguments, skip });
}
return std::make_shared<GeoLayout>(commands);
diff --git a/src/factories/sm64/GeoLayoutFactory.h b/src/factories/sm64/GeoLayoutFactory.h
index 8792990..b572896 100644
--- a/src/factories/sm64/GeoLayoutFactory.h
+++ b/src/factories/sm64/GeoLayoutFactory.h
@@ -16,6 +16,7 @@ namespace SM64 {
struct GeoCommand {
GeoOpcode opcode;
std::vector<GeoArgument> arguments;
+ bool skipped;
};
class GeoLayout : public IParsedData {