summaryrefslogtreecommitdiff
path: root/src/factories/AnimFactory.cpp
diff options
context:
space:
mode:
authorKiritoDv <kiritodev01@gmail.com>2023-08-24 23:13:48 -0600
committerKiritoDv <kiritodev01@gmail.com>2023-08-24 23:13:48 -0600
commit64eddebf4d45b4775f6e9f248cbfaa1cb3ab55f2 (patch)
treec0fc5b1aedb1021544bf50454d6b44ef20f2bffb /src/factories/AnimFactory.cpp
parent15a0cf5498b60fa1442d049dbe5bb856022b5641 (diff)
Added animation factory and some random tools
Diffstat (limited to 'src/factories/AnimFactory.cpp')
-rw-r--r--src/factories/AnimFactory.cpp67
1 files changed, 67 insertions, 0 deletions
diff --git a/src/factories/AnimFactory.cpp b/src/factories/AnimFactory.cpp
new file mode 100644
index 0000000..3ba83fe
--- /dev/null
+++ b/src/factories/AnimFactory.cpp
@@ -0,0 +1,67 @@
+#include "AnimFactory.h"
+
+#include <iostream>
+#include <filesystem>
+#include "Companion.h"
+#include "utils/MIODecoder.h"
+#include "binarytools/BinaryReader.h"
+
+namespace fs = std::filesystem;
+
+void WriteAnimationHeader(LUS::BinaryWriter* writer, nlohmann::json& offsets, std::vector<uint8_t>& buffer) {
+ LUS::BinaryReader reader((char*) buffer.data() + offsets[0], offsets[1]);
+ reader.SetEndianness(LUS::Endianness::Big);
+
+ auto flags = reader.ReadInt16();
+ auto animYTransDivisor = reader.ReadInt16();
+ auto startFrame = reader.ReadInt16();
+ auto loopStart = reader.ReadInt16();
+ auto loopEnd = reader.ReadInt16();
+ auto unusedBoneCount = reader.ReadInt16();
+ reader.ReadUInt32();
+ reader.ReadUInt32();
+ auto length = reader.ReadUInt32();
+
+ WRITE_I16(flags);
+ WRITE_I16(animYTransDivisor);
+ WRITE_I16(startFrame);
+ WRITE_I16(loopStart);
+ WRITE_I16(loopEnd);
+ WRITE_I16(unusedBoneCount);
+ WRITE_U64(length);
+ reader.Close();
+}
+
+void WriteAnimationIndex(LUS::BinaryWriter* writer, nlohmann::json& offsets, std::vector<uint8_t>& buffer) {
+ LUS::BinaryReader reader((char*) buffer.data() + offsets[0], offsets[1]);
+ reader.SetEndianness(LUS::Endianness::Big);
+ size_t entries = ((size_t) offsets[1]);
+ WRITE_U32(entries);
+ for(size_t id = 0; id < entries; id++) {
+ WRITE_I16(reader.ReadInt16());
+ }
+ reader.Close();
+}
+
+void WriteAnimationValues(LUS::BinaryWriter* writer, nlohmann::json& offsets, std::vector<uint8_t>& buffer) {
+ LUS::BinaryReader reader((char*) buffer.data() + offsets[0], offsets[1]);
+ reader.SetEndianness(LUS::Endianness::Big);
+ size_t entries = ((size_t) offsets[1]);
+ WRITE_U32(entries);
+ for(size_t id = 0; id < entries; id++) {
+ WRITE_U16(reader.ReadUInt16());
+ }
+ reader.Close();
+}
+
+bool AnimFactory::process(LUS::BinaryWriter* writer, nlohmann::json& data, std::vector<uint8_t>& buffer) {
+ auto metadata = data["offsets"];
+
+ WRITE_HEADER(LUS::ResourceType::Anim, 0);
+
+ WriteAnimationHeader(writer, metadata["header"], buffer);
+ WriteAnimationIndex( writer, metadata["indices"], buffer);
+ WriteAnimationValues(writer, metadata["values"], buffer);
+
+ return true;
+} \ No newline at end of file