summaryrefslogtreecommitdiff
path: root/ZAPD/ZCollision.cpp
diff options
context:
space:
mode:
authorAnghelo Carvajal <angheloalf95@gmail.com>2021-10-05 13:55:55 -0300
committerGitHub <noreply@github.com>2021-10-05 12:55:55 -0400
commit4994e732406ffa2942f9c9ea6ff14c424cd0b896 (patch)
tree0b40b20db17139c58f5c205643940494c20cbc43 /ZAPD/ZCollision.cpp
parent17fca1e0cdda5476c4158940ca405b7eb250ec72 (diff)
ZResource cleanup (#178)
* Add some general use methods to ZResource * change zarray * adapt ztexture * Clean up ZCollision, ZPath, ZScalar and ZVector * cleanup background * cleanup zmtx * Clean up skeleton and limb * mark GetSourceTypeName as abstract * Remove redundant ExtractFromXML * Reorder stuff to minimize changes in github * remove extra ZDisplayList constructor * Remove using namespace tinyxml2; * run formatter * Add some brief descriptions, and remove some methods * Remove trivials GetSourceOutputCode and a bit of cleanup * Add more descriptions to methods * Fix blob build * improve descriptions a bit * Run formatter * Now builds * Add attributes and fix some warnings * format * fix merge issues * fix merge issues and some clang warnings * format * Run formatter * Fix merge issues * Format * add SEGMENTED_NULL * Fix merge issues * Run format * dumb fix * whoops * format * whoops
Diffstat (limited to 'ZAPD/ZCollision.cpp')
-rw-r--r--ZAPD/ZCollision.cpp130
1 files changed, 76 insertions, 54 deletions
diff --git a/ZAPD/ZCollision.cpp b/ZAPD/ZCollision.cpp
index 17d173d..8f2a6e6 100644
--- a/ZAPD/ZCollision.cpp
+++ b/ZAPD/ZCollision.cpp
@@ -1,6 +1,8 @@
#include "ZCollision.h"
-#include <stdint.h>
+
+#include <cstdint>
#include <string>
+
#include "Globals.h"
#include "Utils/BitConverter.h"
#include "Utils/StringHelper.h"
@@ -13,9 +15,6 @@ ZCollisionHeader::ZCollisionHeader(ZFile* nParent) : ZResource(nParent)
ZCollisionHeader::~ZCollisionHeader()
{
- for (WaterBoxHeader* waterBox : waterBoxes)
- delete waterBox;
-
delete camData;
}
@@ -51,8 +50,16 @@ void ZCollisionHeader::ParseRawData()
vertices.reserve(numVerts);
polygons.reserve(numPolygons);
+ uint32_t currentPtr = vtxSegmentOffset;
+
for (uint16_t i = 0; i < numVerts; i++)
- vertices.push_back(VertexEntry(rawData, vtxSegmentOffset + (i * 6)));
+ {
+ ZVector vec(parent);
+ vec.ExtractFromBinary(currentPtr, ZScalarType::ZSCALAR_S16, 3);
+
+ currentPtr += vec.GetRawDataSize();
+ vertices.push_back(vec);
+ }
for (uint16_t i = 0; i < numPolygons; i++)
polygons.push_back(PolygonEntry(rawData, polySegmentOffset + (i * 16)));
@@ -74,30 +81,34 @@ void ZCollisionHeader::ParseRawData()
polyTypeDefSegmentOffset, polygonTypes.size());
for (uint16_t i = 0; i < numWaterBoxes; i++)
- waterBoxes.push_back(new WaterBoxHeader(
+ waterBoxes.push_back(WaterBoxHeader(
rawData,
waterBoxSegmentOffset + (i * (Globals::Instance->game == ZGame::OOT_SW97 ? 12 : 16))));
+}
+void ZCollisionHeader::DeclareReferences(const std::string& prefix)
+{
std::string declaration = "";
+ std::string auxName = name;
+
+ if (name == "")
+ auxName = GetDefaultName(prefix);
if (waterBoxes.size() > 0)
{
for (size_t i = 0; i < waterBoxes.size(); i++)
{
- declaration += StringHelper::Sprintf("\t{ %i, %i, %i, %i, %i, 0x%08X },",
- waterBoxes[i]->xMin, waterBoxes[i]->ySurface,
- waterBoxes[i]->zMin, waterBoxes[i]->xLength,
- waterBoxes[i]->zLength, waterBoxes[i]->properties);
+ declaration +=
+ StringHelper::Sprintf("\t{ %s },", waterBoxes[i].GetBodySourceCode().c_str());
if (i + 1 < waterBoxes.size())
declaration += "\n";
}
- }
- if (waterBoxAddress != 0)
parent->AddDeclarationArray(
waterBoxSegmentOffset, DeclarationAlignment::Align4, 16 * waterBoxes.size(), "WaterBox",
- StringHelper::Sprintf("%s_waterBoxes_%06X", name.c_str(), waterBoxSegmentOffset), 0,
+ StringHelper::Sprintf("%s_waterBoxes_%06X", auxName.c_str(), waterBoxSegmentOffset), 0,
declaration);
+ }
if (polygons.size() > 0)
{
@@ -113,14 +124,10 @@ void ZCollisionHeader::ParseRawData()
declaration += "\n";
}
- if (polyAddress != 0)
- {
- parent->AddDeclarationArray(
- polySegmentOffset, DeclarationAlignment::Align4, polygons.size() * 16,
- "CollisionPoly",
- StringHelper::Sprintf("%s_polygons_%08X", name.c_str(), polySegmentOffset),
- polygons.size(), declaration);
- }
+ parent->AddDeclarationArray(
+ polySegmentOffset, DeclarationAlignment::Align4, polygons.size() * 16, "CollisionPoly",
+ StringHelper::Sprintf("%s_polygons_%08X", auxName.c_str(), polySegmentOffset), 0,
+ declaration);
}
declaration = "";
@@ -137,7 +144,7 @@ void ZCollisionHeader::ParseRawData()
parent->AddDeclarationArray(
polyTypeDefSegmentOffset, DeclarationAlignment::Align4, polygonTypes.size() * 8,
"SurfaceType",
- StringHelper::Sprintf("%s_surfaceType_%08X", name.c_str(), polyTypeDefSegmentOffset),
+ StringHelper::Sprintf("%s_surfaceType_%08X", auxName.c_str(), polyTypeDefSegmentOffset),
polygonTypes.size(), declaration);
declaration = "";
@@ -148,46 +155,55 @@ void ZCollisionHeader::ParseRawData()
for (size_t i = 0; i < vertices.size(); i++)
{
- declaration += StringHelper::Sprintf("\t{ %6i, %6i, %6i },", vertices[i].x,
- vertices[i].y, vertices[i].z);
+ declaration +=
+ StringHelper::Sprintf("\t{ %s },", vertices[i].GetBodySourceCode().c_str());
if (i < vertices.size() - 1)
declaration += "\n";
}
+ const auto& first = vertices.front();
if (vtxAddress != 0)
parent->AddDeclarationArray(
- vtxSegmentOffset, DeclarationAlignment::Align4, vertices.size() * 6, "Vec3s",
- StringHelper::Sprintf("%s_vtx_%08X", name.c_str(), vtxSegmentOffset), 0,
+ vtxSegmentOffset, first.GetDeclarationAlignment(),
+ vertices.size() * first.GetRawDataSize(), first.GetSourceTypeName(),
+ StringHelper::Sprintf("%s_vtx_%08X", auxName.c_str(), vtxSegmentOffset), 0,
declaration);
declaration = "";
}
+}
- declaration = "";
- char waterBoxStr[2048];
-
- if (waterBoxAddress != 0)
- sprintf(waterBoxStr, "%s_waterBoxes_%06X", name.c_str(), waterBoxSegmentOffset);
- else
- sprintf(waterBoxStr, "NULL");
+std::string ZCollisionHeader::GetBodySourceCode() const
+{
+ std::string declaration = "";
declaration += "\n";
- declaration += StringHelper::Sprintf(" { %i, %i, %i },\n { %i, %i, %i },\n", absMinX,
- absMinY, absMinZ, absMaxX, absMaxY, absMaxZ);
+ declaration += StringHelper::Sprintf("\t{ %i, %i, %i },\n", absMinX, absMinY, absMinZ);
+ declaration += StringHelper::Sprintf("\t{ %i, %i, %i },\n", absMaxX, absMaxY, absMaxZ);
+
+ std::string vtxName = parent->GetDeclarationPtrName(vtxAddress);
+ declaration += StringHelper::Sprintf("\t%i,\n\t%s,\n", numVerts, vtxName.c_str());
+
+ std::string polyName = parent->GetDeclarationPtrName(polyAddress);
+ declaration += StringHelper::Sprintf("\t%i,\n\t%s,\n", numPolygons, polyName.c_str());
+
+ std::string surfaceName = parent->GetDeclarationPtrName(polyTypeDefAddress);
+ declaration += StringHelper::Sprintf("\t%s,\n", surfaceName.c_str());
+
+ std::string camName = parent->GetDeclarationPtrName(camDataAddress);
+ declaration += StringHelper::Sprintf("\t%s,\n", camName.c_str());
- declaration += StringHelper::Sprintf(
- " %i,\n %s_vtx_%08X,\n %i,\n %s_polygons_%08X,\n %s_surfaceType_%08X,\n "
- "%s_camDataList_%08X,\n %i,\n %s\n",
- numVerts, name.c_str(), vtxSegmentOffset, numPolygons, name.c_str(), polySegmentOffset,
- name.c_str(), polyTypeDefSegmentOffset, name.c_str(), camDataSegmentOffset, numWaterBoxes,
- waterBoxStr);
+ std::string waterBoxName = parent->GetDeclarationPtrName(waterBoxAddress);
+ declaration += StringHelper::Sprintf("\t%i,\n\t%s\n", numWaterBoxes, waterBoxName.c_str());
- Declaration* decl =
- parent->AddDeclaration(rawDataIndex, DeclarationAlignment::Align4, GetRawDataSize(),
- GetSourceTypeName(), name, declaration);
- decl->staticConf = staticConf;
+ return declaration;
+}
+
+std::string ZCollisionHeader::GetDefaultName(const std::string& prefix) const
+{
+ return StringHelper::Sprintf("%sCol_%06X", prefix.c_str(), rawDataIndex);
}
std::string ZCollisionHeader::GetSourceTypeName() const
@@ -219,15 +235,6 @@ PolygonEntry::PolygonEntry(const std::vector<uint8_t>& rawData, uint32_t rawData
d = BitConverter::ToUInt16BE(data, rawDataIndex + 14);
}
-VertexEntry::VertexEntry(const std::vector<uint8_t>& rawData, uint32_t rawDataIndex)
-{
- const uint8_t* data = rawData.data();
-
- x = BitConverter::ToInt16BE(data, rawDataIndex + 0);
- y = BitConverter::ToInt16BE(data, rawDataIndex + 2);
- z = BitConverter::ToInt16BE(data, rawDataIndex + 4);
-}
-
WaterBoxHeader::WaterBoxHeader(const std::vector<uint8_t>& rawData, uint32_t rawDataIndex)
{
const uint8_t* data = rawData.data();
@@ -244,6 +251,12 @@ WaterBoxHeader::WaterBoxHeader(const std::vector<uint8_t>& rawData, uint32_t raw
properties = BitConverter::ToInt32BE(data, rawDataIndex + 12);
}
+std::string WaterBoxHeader::GetBodySourceCode() const
+{
+ return StringHelper::Sprintf("%i, %i, %i, %i, %i, 0x%08X", xMin, ySurface, zMin, xLength,
+ zLength, properties);
+}
+
CameraDataList::CameraDataList(ZFile* parent, const std::string& prefix,
const std::vector<uint8_t>& rawData, uint32_t rawDataIndex,
uint32_t polyTypeDefSegmentOffset,
@@ -330,6 +343,15 @@ CameraDataList::CameraDataList(ZFile* parent, const std::string& prefix,
}
}
+CameraDataList::~CameraDataList()
+{
+ for (auto entry : entries)
+ delete entry;
+
+ for (auto camPosData : cameraPositionData)
+ delete camPosData;
+}
+
CameraPositionData::CameraPositionData(const std::vector<uint8_t>& rawData, uint32_t rawDataIndex)
{
x = BitConverter::ToInt16BE(rawData, rawDataIndex + 0);