mirror of
https://github.com/HarbourMasters/Shipwright.git
synced 2025-02-08 03:10:29 -05:00
![M4xw](/assets/img/avatar_default.png)
subrepo: subdir: "OTRExporter" merged: "1503d3eef" upstream: origin: "https://github.com/HarbourMasters/OTRExporter.git" branch: "master" commit: "1503d3eef" git-subrepo: version: "0.4.1" origin: "???" commit: "???"
83 lines
2.2 KiB
C++
83 lines
2.2 KiB
C++
#include "CollisionExporter.h"
|
|
#include <Resource.h>
|
|
|
|
void OTRExporter_Collision::Save(ZResource* res, const fs::path& outPath, BinaryWriter* writer)
|
|
{
|
|
ZCollisionHeader* col = (ZCollisionHeader*)res;
|
|
|
|
WriteHeader(res, outPath, writer, Ship::ResourceType::CollisionHeader);
|
|
|
|
writer->Write(col->absMinX);
|
|
writer->Write(col->absMinY);
|
|
writer->Write(col->absMinZ);
|
|
|
|
writer->Write(col->absMaxX);
|
|
writer->Write(col->absMaxY);
|
|
writer->Write(col->absMaxZ);
|
|
|
|
writer->Write((uint32_t)col->vertices.size());
|
|
|
|
for (uint16_t i = 0; i < col->vertices.size(); i++)
|
|
{
|
|
writer->Write(col->vertices[i].scalars[0].scalarData.s16);
|
|
writer->Write(col->vertices[i].scalars[1].scalarData.s16);
|
|
writer->Write(col->vertices[i].scalars[2].scalarData.s16);
|
|
}
|
|
|
|
writer->Write((uint32_t)col->polygons.size());
|
|
|
|
for (uint16_t i = 0; i < col->polygons.size(); i++)
|
|
{
|
|
writer->Write(col->polygons[i].type);
|
|
writer->Write(col->polygons[i].vtxA);
|
|
writer->Write(col->polygons[i].vtxB);
|
|
writer->Write(col->polygons[i].vtxC);
|
|
writer->Write(col->polygons[i].a);
|
|
writer->Write(col->polygons[i].b);
|
|
writer->Write(col->polygons[i].c);
|
|
writer->Write(col->polygons[i].d);
|
|
}
|
|
|
|
writer->Write((uint32_t)col->polygonTypes.size());
|
|
|
|
for (uint16_t i = 0; i < col->polygonTypes.size(); i++)
|
|
writer->Write(col->polygonTypes[i]);
|
|
|
|
writer->Write((uint32_t)col->camData->entries.size());
|
|
|
|
for (auto entry : col->camData->entries)
|
|
{
|
|
auto camPosDecl = col->parent->GetDeclarationRanged(Seg2Filespace(entry->cameraPosDataSeg, col->parent->baseAddress));
|
|
|
|
int idx = 0;
|
|
|
|
if (camPosDecl != nullptr)
|
|
idx = ((entry->cameraPosDataSeg & 0x00FFFFFF) - camPosDecl->address) / 6;
|
|
|
|
writer->Write(entry->cameraSType);
|
|
writer->Write(entry->numData);
|
|
writer->Write((uint32_t)idx);
|
|
}
|
|
|
|
writer->Write((uint32_t)col->camData->cameraPositionData.size());
|
|
|
|
for (auto entry : col->camData->cameraPositionData)
|
|
{
|
|
writer->Write(entry->x);
|
|
writer->Write(entry->y);
|
|
writer->Write(entry->z);
|
|
}
|
|
|
|
writer->Write((uint32_t)col->waterBoxes.size());
|
|
|
|
for (auto waterBox : col->waterBoxes)
|
|
{
|
|
writer->Write(waterBox.xMin);
|
|
writer->Write(waterBox.ySurface);
|
|
writer->Write(waterBox.zMin);
|
|
writer->Write(waterBox.xLength);
|
|
writer->Write(waterBox.zLength);
|
|
writer->Write(waterBox.properties);
|
|
}
|
|
}
|