summaryrefslogtreecommitdiff
path: root/src/factories/GenericArrayFactory.cpp
diff options
context:
space:
mode:
authorinspectredc <inspectredc@gmail.com>2024-04-03 21:54:26 +0100
committerLywx <kiritodev01@gmail.com>2024-04-04 08:54:15 -0600
commit378575792b9f0eeddae6e9fa53e1412d129a89a5 (patch)
tree698ae48cfbb75e568bb3e3b4b7c576e5a5d13449 /src/factories/GenericArrayFactory.cpp
parent8e3f1cf09337f0c373861b4b9dc6c7cb55c0e869 (diff)
fix generic array factory for u8/s8 and add binary exporter
Diffstat (limited to 'src/factories/GenericArrayFactory.cpp')
-rw-r--r--src/factories/GenericArrayFactory.cpp107
1 files changed, 103 insertions, 4 deletions
diff --git a/src/factories/GenericArrayFactory.cpp b/src/factories/GenericArrayFactory.cpp
index 87affed..81144f5 100644
--- a/src/factories/GenericArrayFactory.cpp
+++ b/src/factories/GenericArrayFactory.cpp
@@ -83,11 +83,11 @@ GenericArray::GenericArray(std::vector<ArrayDatum> data) : mData(std::move(data)
for (auto &datum : mData) {
switch (static_cast<ArrayType>(datum.index())) {
case ArrayType::u8: {
- mMaxWidth = std::max(mMaxWidth, GET_MAG_U(std::get<uint32_t>(datum)));
+ mMaxWidth = std::max(mMaxWidth, GET_MAG_U((uint32_t)std::get<uint8_t>(datum)));
break;
}
case ArrayType::s8: {
- mMaxWidth = std::max(mMaxWidth, GET_MAG(std::get<int32_t>(datum)));
+ mMaxWidth = std::max(mMaxWidth, GET_MAG((int32_t)std::get<int8_t>(datum)));
break;
}
case ArrayType::u16: {
@@ -192,10 +192,10 @@ ExportResult ArrayCodeExporter::Export(std::ostream &write, std::shared_ptr<IPar
}
switch (static_cast<ArrayType>(datum.index())) {
case ArrayType::u8:
- write << FORMAT_INT(std::get<uint8_t>(datum), array->mMaxWidth) << ", ";
+ write << FORMAT_INT((uint32_t)std::get<uint8_t>(datum), array->mMaxWidth) << ", ";
break;
case ArrayType::s8:
- write << FORMAT_INT(std::get<int8_t>(datum), array->mMaxWidth) << ", ";
+ write << FORMAT_INT((int32_t)std::get<int8_t>(datum), array->mMaxWidth) << ", ";
break;
case ArrayType::u16:
write << FORMAT_INT(std::get<uint16_t>(datum), array->mMaxWidth) << ", ";
@@ -249,6 +249,105 @@ ExportResult ArrayCodeExporter::Export(std::ostream &write, std::shared_ptr<IPar
}
ExportResult ArrayBinaryExporter::Export(std::ostream &write, std::shared_ptr<IParsedData> raw, std::string& entryName, YAML::Node &node, std::string* replacement ) {
+ auto writer = LUS::BinaryWriter();
+ const auto type = GetSafeNode<std::string>(node, "array_type");
+ auto array = std::static_pointer_cast<GenericArray>(raw);
+
+ if (arrayTypeMap.find(type) == arrayTypeMap.end()) {
+ SPDLOG_ERROR("Unknown Generic Array type '{}'", type);
+ throw std::runtime_error("Unknown Generic Array type " + type);
+ }
+
+ ArrayType arrayType = arrayTypeMap.at(type);
+
+ WriteHeader(writer, LUS::ResourceType::Blob, 0);
+ writer.Write((uint32_t) array->mData.size());
+
+ for (auto &datum : array->mData) {
+ switch (static_cast<ArrayType>(datum.index())) {
+ case ArrayType::u8: {
+ writer.Write(std::get<uint8_t>(datum));
+ break;
+ }
+ case ArrayType::s8: {
+ writer.Write(std::get<int8_t>(datum));
+ break;
+ }
+ case ArrayType::u16: {
+ writer.Write(std::get<uint16_t>(datum));
+ break;
+ }
+ case ArrayType::s16: {
+ writer.Write(std::get<int16_t>(datum));
+ break;
+ }
+ case ArrayType::u32: {
+ writer.Write(std::get<uint32_t>(datum));
+ break;
+ }
+ case ArrayType::s32: {
+ writer.Write(std::get<int32_t>(datum));
+ break;
+ }
+ case ArrayType::u64: {
+ writer.Write(std::get<uint64_t>(datum));
+ break;
+ }
+ case ArrayType::f32: {
+ writer.Write(std::get<float>(datum));
+ break;
+ }
+ case ArrayType::f64: {
+ writer.Write(std::get<double>(datum));
+ break;
+ }
+ case ArrayType::Vec2f: {
+ auto [x, y] = std::get<Vec2f>(datum);
+ writer.Write(x);
+ writer.Write(y);
+ break;
+ }
+ case ArrayType::Vec3f: {
+ auto [x, y, z] = std::get<Vec3f>(datum);
+ writer.Write(x);
+ writer.Write(y);
+ writer.Write(z);
+ break;
+ }
+ case ArrayType::Vec3s: {
+ auto [x, y, z] = std::get<Vec3s>(datum);
+ writer.Write(x);
+ writer.Write(y);
+ writer.Write(z);
+ break;
+ }
+ case ArrayType::Vec3i: {
+ auto [x, y, z] = std::get<Vec3i>(datum);
+ writer.Write(x);
+ writer.Write(y);
+ writer.Write(z);
+ break;
+ }
+ case ArrayType::Vec4f: {
+ auto [x, y, z, w] = std::get<Vec4f>(datum);
+ writer.Write(x);
+ writer.Write(y);
+ writer.Write(z);
+ writer.Write(w);
+ break;
+ }
+ case ArrayType::Vec4s: {
+ auto [x, y, z, w] = std::get<Vec4s>(datum);
+ writer.Write(x);
+ writer.Write(y);
+ writer.Write(z);
+ writer.Write(w);
+ break;
+ }
+ }
+ }
+
+ writer.Finish(write);
return std::nullopt;
}