diff options
| author | KiritoDv <kiritodev01@gmail.com> | 2023-08-24 23:13:48 -0600 |
|---|---|---|
| committer | KiritoDv <kiritodev01@gmail.com> | 2023-08-24 23:13:48 -0600 |
| commit | 64eddebf4d45b4775f6e9f248cbfaa1cb3ab55f2 (patch) | |
| tree | c0fc5b1aedb1021544bf50454d6b44ef20f2bffb /src | |
| parent | 15a0cf5498b60fa1442d049dbe5bb856022b5641 (diff) | |
Added animation factory and some random tools
Diffstat (limited to 'src')
| -rw-r--r-- | src/Companion.cpp | 6 | ||||
| -rw-r--r-- | src/factories/AnimFactory.cpp | 67 | ||||
| -rw-r--r-- | src/factories/AnimFactory.h | 9 | ||||
| -rw-r--r-- | src/factories/BlobFactory.cpp | 6 | ||||
| -rw-r--r-- | src/factories/BlobFactory.h | 3 | ||||
| -rw-r--r-- | src/factories/RawFactory.cpp | 4 | ||||
| -rw-r--r-- | src/factories/RawFactory.h | 5 | ||||
| -rw-r--r-- | src/factories/ResourceType.h | 1 | ||||
| -rw-r--r-- | src/factories/TextureFactory.cpp | 1 |
9 files changed, 95 insertions, 7 deletions
diff --git a/src/Companion.cpp b/src/Companion.cpp index 9b38118..16d6c11 100644 --- a/src/Companion.cpp +++ b/src/Companion.cpp @@ -5,6 +5,7 @@ #include "factories/RawFactory.h" #include "factories/BlobFactory.h" #include "factories/TextureFactory.h" +#include "factories/AnimFactory.h" #include <fstream> #include <iostream> @@ -16,8 +17,10 @@ namespace fs = std::filesystem; static const std::unordered_map<std::string, RawFactory*> gFactories = { { ".png", new TextureFactory() }, + { ".anim", new AnimFactory() }, { ".bin", new BlobFactory(LUS::ResourceType::Blob) }, { ".sbox", new BlobFactory(LUS::ResourceType::Blob, true) }, + { ".aud", new BlobFactory(LUS::ResourceType::Blob, false) }, }; void Companion::Start() { @@ -58,7 +61,6 @@ void Companion::ProcessAssets() { continue; } - std::cout << "Processed " << path << std::endl; bool isTexture = typeid(*factory) == typeid(TextureFactory); auto buffer = write.ToVector(); @@ -74,6 +76,8 @@ void Companion::ProcessAssets() { output.close(); } + std::cout << "Processed " << path << std::endl; + write.Close(); } 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 diff --git a/src/factories/AnimFactory.h b/src/factories/AnimFactory.h new file mode 100644 index 0000000..7641099 --- /dev/null +++ b/src/factories/AnimFactory.h @@ -0,0 +1,9 @@ +#pragma once + +#include "RawFactory.h" + +class AnimFactory : public RawFactory { +public: + AnimFactory() = default; + bool process(LUS::BinaryWriter* write, nlohmann::json& data, std::vector<uint8_t>& buffer) override; +};
\ No newline at end of file diff --git a/src/factories/BlobFactory.cpp b/src/factories/BlobFactory.cpp index c9e52a9..b70c4e7 100644 --- a/src/factories/BlobFactory.cpp +++ b/src/factories/BlobFactory.cpp @@ -13,7 +13,11 @@ bool BlobFactory::process(LUS::BinaryWriter* writer, nlohmann::json& data, std:: return false; } - WRITE_HEADER(this->type, 0); + if(this->bigEndian){ + WRITE_BHEADER(this->type, 0); + } else { + WRITE_HEADER(this->type, 0); + } size_t size = metadata[0]; auto offsets = metadata[1]["us"]; diff --git a/src/factories/BlobFactory.h b/src/factories/BlobFactory.h index 0f80c1d..73cb80b 100644 --- a/src/factories/BlobFactory.h +++ b/src/factories/BlobFactory.h @@ -4,9 +4,10 @@ class BlobFactory : public RawFactory { public: - BlobFactory(LUS::ResourceType type, bool isMIOChunk = false) : type(type), isMIOChunk(isMIOChunk) {} + BlobFactory(LUS::ResourceType type, bool isMIOChunk = false, bool bigEndian = false) : type(type), isMIOChunk(isMIOChunk), bigEndian(bigEndian) {} bool process(LUS::BinaryWriter* write, nlohmann::json& data, std::vector<uint8_t>& buffer) override; private: bool isMIOChunk = false; + bool bigEndian = false; LUS::ResourceType type = LUS::ResourceType::Blob; };
\ No newline at end of file diff --git a/src/factories/RawFactory.cpp b/src/factories/RawFactory.cpp index 708d91b..f997238 100644 --- a/src/factories/RawFactory.cpp +++ b/src/factories/RawFactory.cpp @@ -1,7 +1,7 @@ #include "RawFactory.h" -void RawFactory::WriteHeader(LUS::BinaryWriter* writer, LUS::ResourceType resType, int32_t version){ - writer->Write((uint8_t)LUS::Endianness::Little); // 0x00 +void RawFactory::WriteHeader(LUS::BinaryWriter* writer, LUS::ResourceType resType, int32_t version, bool bigEndian) { + writer->Write((uint8_t)(bigEndian ? LUS::Endianness::Big : LUS::Endianness::Little)); // 0x00 writer->Write((uint8_t)0); // 0x01 writer->Write((uint8_t)0); // 0x02 writer->Write((uint8_t)0); // 0x03 diff --git a/src/factories/RawFactory.h b/src/factories/RawFactory.h index 05909fb..7057740 100644 --- a/src/factories/RawFactory.h +++ b/src/factories/RawFactory.h @@ -7,8 +7,11 @@ #include <nlohmann/json.hpp> #define WRITE_HEADER(type, version) this->WriteHeader(writer, type, version) +#define WRITE_BHEADER(type, version) this->WriteHeader(writer, type, version, true) +#define WRITE_U16(value) writer->Write((uint16_t) value) #define WRITE_U32(value) writer->Write((uint32_t) value) #define WRITE_U64(value) writer->Write((uint64_t) value) +#define WRITE_I16(value) writer->Write((int16_t) value) #define WRITE_DATA(vec) writer->Write((char*) vec.data(), data.size()) #define WRITE_ARRAY(data, size) writer->Write((char*) data, size) @@ -16,5 +19,5 @@ class RawFactory { public: RawFactory() = default; virtual bool process(LUS::BinaryWriter* write, nlohmann::json& data, std::vector<uint8_t>& buffer) = 0; - void WriteHeader(LUS::BinaryWriter* write, LUS::ResourceType resType, int32_t version); + void WriteHeader(LUS::BinaryWriter* write, LUS::ResourceType resType, int32_t version, bool bigEndian = false); };
\ No newline at end of file diff --git a/src/factories/ResourceType.h b/src/factories/ResourceType.h index 202e732..3d4013b 100644 --- a/src/factories/ResourceType.h +++ b/src/factories/ResourceType.h @@ -18,5 +18,6 @@ enum class ResourceType { // CubeOS Demo = 0x44454D4F, // DEMO Skybox = 0x534B5942, // SKYB + Anim = 0x414E494D, // ANIM }; } // namespace LUS diff --git a/src/factories/TextureFactory.cpp b/src/factories/TextureFactory.cpp index 8bacc2f..9fd431a 100644 --- a/src/factories/TextureFactory.cpp +++ b/src/factories/TextureFactory.cpp @@ -73,6 +73,5 @@ bool TextureFactory::process(LUS::BinaryWriter* writer, nlohmann::json& data, st WRITE_ARRAY(texture, size); // Texture Data delete[] texture; - std::cout << "Processed " << path << '\n'; return true; }
\ No newline at end of file |
