From c319ece8b6346502da2c56f66739095340ac6ac0 Mon Sep 17 00:00:00 2001 From: MegaMech Date: Sun, 31 Mar 2024 20:45:23 -0600 Subject: Implement tables for LightsFactory --- src/factories/LightsFactory.cpp | 95 ++++++++++++++++++++++++++++++++--------- 1 file changed, 75 insertions(+), 20 deletions(-) diff --git a/src/factories/LightsFactory.cpp b/src/factories/LightsFactory.cpp index b1cd91e..beaacd2 100644 --- a/src/factories/LightsFactory.cpp +++ b/src/factories/LightsFactory.cpp @@ -12,39 +12,94 @@ ExportResult LightsHeaderExporter::Export(std::ostream &write, std::shared_ptr(node, "offset"); + const auto searchTable = Companion::Instance->SearchTable(offset); + + if(searchTable.has_value()){ + const auto [name, start, end, mode] = searchTable.value(); + + if(start != offset){ + return std::nullopt; + } + + write << "extern Lights1" << name << "[];\n"; + } else { + write << "extern Lights1 " << symbol << ";\n"; + } return std::nullopt; } ExportResult LightsCodeExporter::Export(std::ostream &write, std::shared_ptr raw, std::string& entryName, YAML::Node &node, std::string* replacement ) { auto light = std::static_pointer_cast(raw)->mLights; auto symbol = GetSafeNode(node, "symbol", entryName); + const auto offset = GetSafeNode(node, "offset"); + const auto searchTable = Companion::Instance->SearchTable(offset); - write << "Lights1 " << symbol << " = gdSPDefLights1(\n"; + if(searchTable.has_value()){ + const auto [name, start, end, mode] = searchTable.value(); + - // Ambient - auto r = (int16_t) light.a.l.col[0]; - auto g = (int16_t) light.a.l.col[1]; - auto b = (int16_t) light.a.l.col[2]; + if(start == offset){ + write << "Lights1 " << name << "[] = {\n"; + } - // Diffuse - auto r2 = (int16_t) light.l[0].l.col[0]; - auto g2 = (int16_t) light.l[0].l.col[1]; - auto b2 = (int16_t) light.l[0].l.col[2]; + // Ambient + auto r = (int16_t) light.a.l.col[0]; + auto g = (int16_t) light.a.l.col[1]; + auto b = (int16_t) light.a.l.col[2]; - // Direction - auto x = (int16_t) light.l[0].l.dir[0]; - auto y = (int16_t) light.l[0].l.dir[1]; - auto z = (int16_t) light.l[0].l.dir[2]; + // Diffuse + auto r2 = (int16_t) light.l[0].l.col[0]; + auto g2 = (int16_t) light.l[0].l.col[1]; + auto b2 = (int16_t) light.l[0].l.col[2]; + + // Direction + auto x = (int16_t) light.l[0].l.dir[0]; + auto y = (int16_t) light.l[0].l.dir[1]; + auto z = (int16_t) light.l[0].l.dir[2]; + + SPDLOG_INFO("Read light: {:X} {:X} {:X} {:X} {:X}", r, g, b, r2, g2); + + write << fourSpaceTab << "gdSPDefLights1(\n"; - SPDLOG_INFO("Read light: {:X} {:X} {:X} {:X} {:X}", r, g, b, r2, g2); + write << fourSpaceTab; + write << r << ", " << g << ", " << b << ",\n"; + write << fourSpaceTab; + write << r2 << ", " << g2 << ", " << b2 << ", " << x << ", " << y << ", " << z << "\n"; - write << fourSpaceTab; - write << r << ", " << g << ", " << b << ",\n"; - write << fourSpaceTab; - write << r2 << ", " << g2 << ", " << b2 << ", " << x << ", " << y << ", " << z << "\n"; + write << fourSpaceTab << "),\n"; - write << ");\n\n"; + if (end == offset) { + write << "};\n\n"; + } + + } else { + write << "Lights1 " << symbol << " = gdSPDefLights1(\n"; + + // Ambient + auto r = (int16_t) light.a.l.col[0]; + auto g = (int16_t) light.a.l.col[1]; + auto b = (int16_t) light.a.l.col[2]; + + // Diffuse + auto r2 = (int16_t) light.l[0].l.col[0]; + auto g2 = (int16_t) light.l[0].l.col[1]; + auto b2 = (int16_t) light.l[0].l.col[2]; + + // Direction + auto x = (int16_t) light.l[0].l.dir[0]; + auto y = (int16_t) light.l[0].l.dir[1]; + auto z = (int16_t) light.l[0].l.dir[2]; + + SPDLOG_INFO("Read light: {:X} {:X} {:X} {:X} {:X}", r, g, b, r2, g2); + + write << fourSpaceTab; + write << r << ", " << g << ", " << b << ",\n"; + write << fourSpaceTab; + write << r2 << ", " << g2 << ", " << b2 << ", " << x << ", " << y << ", " << z << "\n"; + + write << ");\n\n"; + } return std::nullopt; } -- cgit v1.2.3