summaryrefslogtreecommitdiff
path: root/src
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
parent15a0cf5498b60fa1442d049dbe5bb856022b5641 (diff)
Added animation factory and some random tools
Diffstat (limited to 'src')
-rw-r--r--src/Companion.cpp6
-rw-r--r--src/factories/AnimFactory.cpp67
-rw-r--r--src/factories/AnimFactory.h9
-rw-r--r--src/factories/BlobFactory.cpp6
-rw-r--r--src/factories/BlobFactory.h3
-rw-r--r--src/factories/RawFactory.cpp4
-rw-r--r--src/factories/RawFactory.h5
-rw-r--r--src/factories/ResourceType.h1
-rw-r--r--src/factories/TextureFactory.cpp1
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