From 64eddebf4d45b4775f6e9f248cbfaa1cb3ab55f2 Mon Sep 17 00:00:00 2001 From: KiritoDv Date: Thu, 24 Aug 2023 23:13:48 -0600 Subject: Added animation factory and some random tools --- src/Companion.cpp | 6 +++- src/factories/AnimFactory.cpp | 67 ++++++++++++++++++++++++++++++++++++++++ src/factories/AnimFactory.h | 9 ++++++ src/factories/BlobFactory.cpp | 6 +++- src/factories/BlobFactory.h | 3 +- src/factories/RawFactory.cpp | 4 +-- src/factories/RawFactory.h | 5 ++- src/factories/ResourceType.h | 1 + src/factories/TextureFactory.cpp | 1 - 9 files changed, 95 insertions(+), 7 deletions(-) create mode 100644 src/factories/AnimFactory.cpp create mode 100644 src/factories/AnimFactory.h (limited to 'src') 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 #include @@ -16,8 +17,10 @@ namespace fs = std::filesystem; static const std::unordered_map 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 +#include +#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& 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& 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& 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& 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& 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& 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 #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& 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 -- cgit v1.2.3