summaryrefslogtreecommitdiff
path: root/ZAPD/ZVector.cpp
diff options
context:
space:
mode:
authorKenix3 <kenixwhisperwind@gmail.com>2021-01-08 16:55:47 -0500
committerGitHub <noreply@github.com>2021-01-08 16:55:47 -0500
commit1bacd7fdc964ad9eec9d8b56373eb10e10723d2f (patch)
treef943fdde4c84520be7a05903f7c5812f47d5c942 /ZAPD/ZVector.cpp
parent6a97e0479b7b7ee3aa979303d76c4381d3efc813 (diff)
ZAPD now supports Vector types. (#64)
Diffstat (limited to 'ZAPD/ZVector.cpp')
-rw-r--r--ZAPD/ZVector.cpp111
1 files changed, 111 insertions, 0 deletions
diff --git a/ZAPD/ZVector.cpp b/ZAPD/ZVector.cpp
new file mode 100644
index 0000000..874f684
--- /dev/null
+++ b/ZAPD/ZVector.cpp
@@ -0,0 +1,111 @@
+#include "ZVector.h"
+#include "ZFile.h"
+#include "BitConverter.h"
+#include "StringHelper.h"
+#include "File.h"
+#include "Globals.h"
+#include <assert.h>
+
+ZVector::ZVector() : ZResource()
+{
+ scalars = std::vector<ZScalar*>();
+ this->scalarType = ZSCALAR_NONE;
+ this->dimensions = 0;
+}
+
+ZVector* ZVector::ExtractFromXML(tinyxml2::XMLElement* reader, const std::vector<uint8_t>& nRawData, const int rawDataIndex, const std::string& nRelPath)
+{
+ ZVector* vector = new ZVector();
+ vector->rawData = nRawData;
+ vector->rawDataIndex = rawDataIndex;
+ vector->ParseXML(reader);
+ vector->ParseRawData();
+
+ return vector;
+}
+
+void ZVector::ParseXML(tinyxml2::XMLElement* reader)
+{
+ ZResource::ParseXML(reader);
+
+ name = reader->Attribute("Name");
+
+ std::string type = reader->Attribute("Type");
+ this->scalarType = ZScalar::MapOutputTypeToScalarType(type);
+
+ std::string dimensions = reader->Attribute("Dimensions");
+ this->dimensions = strtol(dimensions.c_str(), NULL, 16);
+}
+
+void ZVector::ParseRawData()
+{
+ int currentRawDataIndex = this->rawDataIndex;
+
+ scalars.clear();
+ for (int i = 0; i < this->dimensions; i++) {
+ ZScalar* scalar = new ZScalar(this->scalarType);
+ scalar->rawDataIndex = currentRawDataIndex;
+ scalar->rawData = this->rawData;
+ scalar->ParseRawData();
+ currentRawDataIndex += scalar->GetRawDataSize();
+
+ this->scalars.push_back(scalar);
+ }
+
+ // Ensure the scalars vector has the same number of elements as the vector dimension.
+ assert(this->scalars.size() == this->dimensions);
+}
+
+int ZVector::GetRawDataSize()
+{
+ int size = 0;
+ for (int i = 0; i < this->scalars.size(); i++)
+ size += this->scalars[i]->GetRawDataSize();
+ return size;
+}
+
+std::string ZVector::GetSourceTypeName()
+{
+ if (dimensions == 3 && scalarType == ZSCALAR_F32)
+ {
+ return "Vec3f";
+ }
+ else if (dimensions == 3 && scalarType == ZSCALAR_S16)
+ {
+ return "Vec3s";
+ }
+ else if (dimensions == 3 && scalarType == ZSCALAR_S32)
+ {
+ return "Vec3i";
+ }
+ else
+ {
+ std::string output = StringHelper::Sprintf("Encountered unsupported vector type: %d dimensions, %s type", dimensions, ZScalar::MapScalarTypeToOutputType(scalarType));
+
+ if (Globals::Instance->verbosity >= VERBOSITY_DEBUG)
+ printf("%s\n", output.c_str());
+
+ throw output;
+ }
+}
+
+std::string ZVector::GetSourceValue()
+{
+ std::vector<std::string> strings = std::vector<std::string>();
+ for (int i = 0; i < this->scalars.size(); i++)
+ strings.push_back(scalars[i]->GetSourceValue());
+ return StringHelper::Implode(strings, ", ");
+}
+
+std::string ZVector::GetSourceOutputCode(const std::string& prefix)
+{
+ if (parent != nullptr)
+ parent->AddDeclaration(rawDataIndex, DeclarationAlignment::None, GetRawDataSize(), GetSourceTypeName(), GetName(), GetSourceValue());
+
+ return "";
+}
+
+ZResourceType ZVector::GetResourceType()
+{
+ return ZResourceType::Vector;
+} \ No newline at end of file