summaryrefslogtreecommitdiff
path: root/src/factories/ViewportFactory.cpp
diff options
context:
space:
mode:
authorinspectredc <78732756+inspectredc@users.noreply.github.com>2024-10-21 16:49:32 +0100
committerGitHub <noreply@github.com>2024-10-21 09:49:32 -0600
commit2381a1cd0dd834707d34ce59c88c9970e2bd2929 (patch)
tree92a980fa744342ac263f73cec34ddccb36638bcd /src/factories/ViewportFactory.cpp
parent90ab0eaaaba99d26961280efb4ea0d3a259ac87a (diff)
Viewport Factory (#154)
* Viewport Factory * newline * dont make static * reformat to valid c
Diffstat (limited to 'src/factories/ViewportFactory.cpp')
-rw-r--r--src/factories/ViewportFactory.cpp84
1 files changed, 84 insertions, 0 deletions
diff --git a/src/factories/ViewportFactory.cpp b/src/factories/ViewportFactory.cpp
new file mode 100644
index 0000000..beed8b8
--- /dev/null
+++ b/src/factories/ViewportFactory.cpp
@@ -0,0 +1,84 @@
+#include "ViewportFactory.h"
+
+#include "utils/Decompressor.h"
+#include "spdlog/spdlog.h"
+#include "Companion.h"
+
+ExportResult ViewportHeaderExporter::Export(std::ostream &write, std::shared_ptr<IParsedData> raw, std::string& entryName, YAML::Node &node, std::string* replacement) {
+ const auto symbol = GetSafeNode(node, "symbol", entryName);
+
+ if(Companion::Instance->IsOTRMode()){
+ write << "static const ALIGN_ASSET(2) char " << symbol << "[] = \"__OTR__" << (*replacement) << "\";\n\n";
+ return std::nullopt;
+ }
+
+ write << "extern Vp " << symbol << ";\n";
+
+ return std::nullopt;
+}
+
+ExportResult ViewportCodeExporter::Export(std::ostream &write, std::shared_ptr<IParsedData> raw, std::string& entryName, YAML::Node &node, std::string* replacement ) {
+ const auto symbol = GetSafeNode(node, "symbol", entryName);
+ const auto offset = GetSafeNode<uint32_t>(node, "offset");
+ auto viewport = std::static_pointer_cast<VpData>(raw);
+
+ write << "Vp " << symbol << " = {\n";
+
+ write << fourSpaceTab;
+ for (size_t i = 0; i < 4; i++) {
+ write << viewport->mViewport.vscale[i];
+ if (i != 3) {
+ write << ", ";
+ }
+ }
+ write << ",\n";
+
+ write << fourSpaceTab;
+ for (size_t i = 0; i < 4; i++) {
+ write << viewport->mViewport.vtrans[i];
+ if (i != 3) {
+ write << ", ";
+ }
+ }
+ write << ",\n";
+
+ write << "};\n\n";
+
+ return offset + sizeof(VpRaw);
+}
+
+ExportResult ViewportBinaryExporter::Export(std::ostream &write, std::shared_ptr<IParsedData> raw, std::string& entryName, YAML::Node &node, std::string* replacement ) {
+ auto writer = LUS::BinaryWriter();
+ auto viewport = std::static_pointer_cast<VpData>(raw);
+
+ WriteHeader(writer, Torch::ResourceType::Viewport, 0);
+
+ for (size_t i = 0; i < 4; i++) {
+ writer.Write(viewport->mViewport.vscale[i]);
+ }
+
+ for (size_t i = 0; i < 4; i++) {
+ writer.Write(viewport->mViewport.vtrans[i]);
+ }
+
+ writer.Finish(write);
+ return std::nullopt;
+}
+
+std::optional<std::shared_ptr<IParsedData>> ViewportFactory::parse(std::vector<uint8_t>& buffer, YAML::Node& node) {
+ auto [_, segment] = Decompressor::AutoDecode(node, buffer);
+ LUS::BinaryReader reader(segment.data, segment.size);
+ VpRaw viewport;
+
+ reader.SetEndianness(Torch::Endianness::Big);
+
+ for (size_t i = 0; i < 4; i++) {
+ viewport.vscale[i] = reader.ReadInt16();
+ }
+
+ for (size_t i = 0; i < 4; i++) {
+ viewport.vtrans[i] = reader.ReadInt16();
+ }
+
+ return std::make_shared<VpData>(viewport);
+}