diff options
| author | KiritoDv <kiritodev01@gmail.com> | 2025-02-08 20:59:18 -0600 |
|---|---|---|
| committer | KiritoDv <kiritodev01@gmail.com> | 2025-02-08 20:59:18 -0600 |
| commit | 348fc75e9902a653d7cd0cee7c4d9aae7c0f3c43 (patch) | |
| tree | 1ef56231c50508a85ebdcad2ec1fac8f7b5463c6 /src | |
| parent | a1a50c60ece9854422cd2b9896525f4591fc6b87 (diff) | |
Added a validation for geo layouts
Diffstat (limited to 'src')
| -rw-r--r-- | src/factories/sm64/GeoLayoutFactory.cpp | 28 | ||||
| -rw-r--r-- | src/factories/sm64/GeoLayoutFactory.h | 1 |
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 { |
