summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlouist103 <35883445+louist103@users.noreply.github.com>2023-05-24 21:38:23 -0400
committerGitHub <noreply@github.com>2023-05-24 21:38:23 -0400
commit55bb75eaa6ebf95858931e1557ed90105a150d80 (patch)
tree0511036a6400899d9ce5c07e531cbf3cd770a47f
parenta97f3dda17347e72c4aacdd1e7c54e0db120a570 (diff)
Cam data Fixes (#294)
* Detects the right amount of entries but doesn't extract points. * It works but its bad. * Fixed something? * Cleanups * segptr_t * Final fixes. * Fixes.
-rw-r--r--ExporterTest/CollisionExporter.cpp6
-rw-r--r--ZAPD/ZCollision.cpp90
-rw-r--r--ZAPD/ZCollision.h6
3 files changed, 64 insertions, 38 deletions
diff --git a/ExporterTest/CollisionExporter.cpp b/ExporterTest/CollisionExporter.cpp
index db5ad1a..6431a45 100644
--- a/ExporterTest/CollisionExporter.cpp
+++ b/ExporterTest/CollisionExporter.cpp
@@ -67,9 +67,9 @@ void ExporterExample_Collision::Save(ZResource* res, [[maybe_unused]] fs::path o
for (auto entry : col->camData->entries)
{
- writer->Write(entry->cameraSType);
- writer->Write(entry->numData);
- writer->Write(entry->cameraPosDataSeg);
+ writer->Write(entry.cameraSType);
+ writer->Write(entry.numData);
+ writer->Write(entry.cameraPosDataSeg);
}
writer->Seek(oldOffset, SeekOffsetType::Start);
diff --git a/ZAPD/ZCollision.cpp b/ZAPD/ZCollision.cpp
index e0350d9..71835e7 100644
--- a/ZAPD/ZCollision.cpp
+++ b/ZAPD/ZCollision.cpp
@@ -106,23 +106,34 @@ void ZCollisionHeader::ParseRawData()
// - WaterBoxes
// - CollisionHeader
offset_t upperCameraBoundary = polyTypeDefSegmentOffset;
- if (upperCameraBoundary == 0)
+ if (upperCameraBoundary == SEGMENTED_NULL)
{
upperCameraBoundary = polySegmentOffset;
}
- if (upperCameraBoundary == 0)
+ if (upperCameraBoundary == SEGMENTED_NULL)
{
upperCameraBoundary = vtxSegmentOffset;
}
- if (upperCameraBoundary == 0)
+ if (upperCameraBoundary == SEGMENTED_NULL)
{
upperCameraBoundary = waterBoxSegmentOffset;
}
- if (upperCameraBoundary == 0)
+ if (upperCameraBoundary == SEGMENTED_NULL)
{
upperCameraBoundary = rawDataIndex;
}
+ // Sharp Ocarina places the CamDataEntries above the list so we need to calculate the number of cameras differently.
+ if (upperCameraBoundary < camDataSegmentOffset)
+ {
+ offset_t offset = camDataSegmentOffset;
+ while (rawData[offset] == 0x00 && rawData[offset + 0x4] == 0x02)
+ {
+ offset += 0x08;
+ }
+ upperCameraBoundary = offset;
+ }
+
camData =
new CameraDataList(parent, name, rawData, camDataSegmentOffset, upperCameraBoundary);
}
@@ -291,73 +302,93 @@ CameraDataList::CameraDataList(ZFile* parent, const std::string& prefix,
assert(numElements < 10000);
offset_t cameraPosDataSeg = rawDataIndex;
+ uint32_t numDataTotal;
+ uint32_t cameraPosDataSegEnd = rawDataIndex;
+ bool isSharpOcarina = false;
+
for (size_t i = 0; i < numElements; i++)
{
- CameraDataEntry* entry = new CameraDataEntry();
+ CameraDataEntry entry;
- entry->cameraSType =
+ entry.cameraSType =
BitConverter::ToInt16BE(rawData, rawDataIndex + (entries.size() * 8) + 0);
- entry->numData = BitConverter::ToInt16BE(rawData, rawDataIndex + (entries.size() * 8) + 2);
- entry->cameraPosDataSeg =
+ entry.numData = BitConverter::ToInt16BE(rawData, rawDataIndex + (entries.size() * 8) + 2);
+ entry.cameraPosDataSeg =
BitConverter::ToInt32BE(rawData, rawDataIndex + (entries.size() * 8) + 4);
- if (entry->cameraPosDataSeg != 0 && GETSEGNUM(entry->cameraPosDataSeg) != SEGMENT_SCENE)
+ if (entry.cameraPosDataSeg != 0 && GETSEGNUM(entry.cameraPosDataSeg) != SEGMENT_SCENE)
{
cameraPosDataSeg = rawDataIndex + (entries.size() * 8);
break;
}
- if (entry->cameraPosDataSeg != 0 && cameraPosDataSeg > (entry->cameraPosDataSeg & 0xFFFFFF))
- cameraPosDataSeg = (entry->cameraPosDataSeg & 0xFFFFFF);
+ if (rawDataIndex > GETSEGOFFSET(entry.cameraPosDataSeg))
+ {
+ if (entry.cameraPosDataSeg != 0 &&
+ cameraPosDataSeg > GETSEGOFFSET(entry.cameraPosDataSeg))
+ cameraPosDataSeg = GETSEGOFFSET(entry.cameraPosDataSeg);
+ }
+ else
+ {
+ // Sharp Ocarina will place the cam data after the list as opposed to the original maps which have it before.
+ isSharpOcarina = true;
+ cameraPosDataSeg = rawDataIndex + (numElements * 0x8);
+ if (cameraPosDataSegEnd < GETSEGOFFSET(entry.cameraPosDataSeg))
+ cameraPosDataSegEnd = GETSEGOFFSET(entry.cameraPosDataSeg);
+ }
- entries.push_back(entry);
+ entries.emplace_back(entry);
}
// Setting cameraPosDataAddr to rawDataIndex give a pos list length of 0
- uint32_t cameraPosDataOffset = cameraPosDataSeg & 0xFFFFFF;
+ uint32_t cameraPosDataOffset = GETSEGOFFSET(cameraPosDataSeg);
for (size_t i = 0; i < entries.size(); i++)
{
char camSegLine[2048];
- if (entries[i]->cameraPosDataSeg != 0)
+ if (entries[i].cameraPosDataSeg != 0)
{
- int32_t index =
- ((entries[i]->cameraPosDataSeg & 0x00FFFFFF) - cameraPosDataOffset) / 0x6;
- sprintf(camSegLine, "&%sCamPosData[%i]", prefix.c_str(), index);
+ uint32_t index =
+ (GETSEGOFFSET(entries[i].cameraPosDataSeg) - cameraPosDataOffset) /
+ 0x6;
+ snprintf(camSegLine, 2048, "&%sCamPosData[%i]", prefix.c_str(), index);
}
else
- sprintf(camSegLine, "NULL");
+ snprintf(camSegLine, 2048, "NULL");
declaration +=
- StringHelper::Sprintf(" { 0x%04X, %i, %s },", entries[i]->cameraSType,
- entries[i]->numData, camSegLine, rawDataIndex + (i * 8));
+ StringHelper::Sprintf(" { 0x%04X, %i, %s },", entries[i].cameraSType,
+ entries[i].numData, camSegLine, rawDataIndex + (i * 8));
if (i < entries.size() - 1)
declaration += "\n";
}
-
+
parent->AddDeclarationArray(
rawDataIndex, DeclarationAlignment::Align4, entries.size() * 8, "CamData",
StringHelper::Sprintf("%sCamDataList", prefix.c_str(), rawDataIndex), entries.size(),
declaration);
- uint32_t numDataTotal = (rawDataIndex - cameraPosDataOffset) / 0x6;
+ if (!isSharpOcarina)
+ numDataTotal = (rawDataIndex - cameraPosDataOffset) / 0x6;
+ else
+ numDataTotal = ((cameraPosDataSegEnd - cameraPosDataSeg) + 18) / 0x6;
if (numDataTotal > 0)
{
declaration.clear();
+ cameraPositionData.reserve(numDataTotal);
for (uint32_t i = 0; i < numDataTotal; i++)
{
- CameraPositionData* data =
- new CameraPositionData(rawData, cameraPosDataOffset + (i * 6));
- cameraPositionData.push_back(data);
+ CameraPositionData data = CameraPositionData(rawData, cameraPosDataOffset + (i * 6));
- declaration += StringHelper::Sprintf("\t{ %6i, %6i, %6i },", data->x, data->y, data->z);
+ declaration += StringHelper::Sprintf("\t{ %6i, %6i, %6i },", data.x, data.y, data.z);
+ cameraPositionData.emplace_back(data);
if (i + 1 < numDataTotal)
declaration += "\n";
}
- int32_t cameraPosDataIndex = GETSEGOFFSET(cameraPosDataSeg);
+ uint32_t cameraPosDataIndex = GETSEGOFFSET(cameraPosDataSeg);
uint32_t entrySize = numDataTotal * 0x6;
parent->AddDeclarationArray(cameraPosDataIndex, DeclarationAlignment::Align4, entrySize,
"Vec3s", StringHelper::Sprintf("%sCamPosData", prefix.c_str()),
@@ -367,11 +398,6 @@ 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)
diff --git a/ZAPD/ZCollision.h b/ZAPD/ZCollision.h
index 8298986..8c73d2e 100644
--- a/ZAPD/ZCollision.h
+++ b/ZAPD/ZCollision.h
@@ -21,14 +21,14 @@ class CameraDataEntry
public:
int16_t cameraSType;
int16_t numData;
- int32_t cameraPosDataSeg;
+ offset_t cameraPosDataSeg;
};
class CameraDataList
{
public:
- std::vector<CameraDataEntry*> entries;
- std::vector<CameraPositionData*> cameraPositionData;
+ std::vector<CameraDataEntry> entries;
+ std::vector<CameraPositionData> cameraPositionData;
CameraDataList(ZFile* parent, const std::string& prefix, const std::vector<uint8_t>& rawData,
offset_t rawDataIndex, offset_t upperCameraBoundary);