CCollisionLoader: Make use of unsigned helper functions where applicable

Same behavior minus several sign conversion warnings.
This commit is contained in:
Lioncash 2020-06-19 00:19:42 -04:00
parent bcc27ddd5c
commit e875c2bf08
1 changed files with 76 additions and 78 deletions

View File

@ -34,11 +34,11 @@ std::unique_ptr<SOBBTreeNode> CCollisionLoader::ParseOBBNode(IInputStream& DCLN)
if (IsLeaf)
{
auto pLeaf = std::make_unique<SOBBTreeLeaf>();
const uint NumTris = DCLN.ReadLong();
const uint32 NumTris = DCLN.ReadULong();
pLeaf->TriangleIndices.resize(NumTris);
for (uint i = 0; i < NumTris; i++)
pLeaf->TriangleIndices[i] = DCLN.ReadShort();
for (auto& index : pLeaf->TriangleIndices)
index = DCLN.ReadShort();
pOut = std::move(pLeaf);
}
@ -57,82 +57,80 @@ std::unique_ptr<SOBBTreeNode> CCollisionLoader::ParseOBBNode(IInputStream& DCLN)
void CCollisionLoader::LoadCollisionMaterial(IInputStream& Src, CCollisionMaterial& OutMaterial)
{
uint64 RawFlags = (mVersion <= EGame::Prime ? Src.ReadLong() : Src.ReadLongLong());
const uint64 RawFlags = mVersion <= EGame::Prime ? Src.ReadULong() : Src.ReadULongLong();
OutMaterial.mRawFlags = RawFlags;
if (mVersion <= EGame::Prime)
{
if (RawFlags & 0x00000001) OutMaterial |= eCF_Unknown;
if (RawFlags & 0x00000002) OutMaterial |= eCF_Stone;
if (RawFlags & 0x00000004) OutMaterial |= eCF_Metal;
if (RawFlags & 0x00000008) OutMaterial |= eCF_Grass;
if (RawFlags & 0x00000010) OutMaterial |= eCF_Ice;
if (RawFlags & 0x00000040) OutMaterial |= eCF_MetalGrating;
if (RawFlags & 0x00000080) OutMaterial |= eCF_Phazon;
if (RawFlags & 0x00000100) OutMaterial |= eCF_Dirt;
if (RawFlags & 0x00000200) OutMaterial |= eCF_Lava;
if (RawFlags & 0x00000800) OutMaterial |= eCF_Snow;
if (RawFlags & 0x00001000) OutMaterial |= eCF_SlowMud;
if (RawFlags & 0x00004000) OutMaterial |= eCF_Mud;
if (RawFlags & 0x00008000) OutMaterial |= eCF_Glass;
if (RawFlags & 0x00010000) OutMaterial |= eCF_Shield;
if (RawFlags & 0x00020000) OutMaterial |= eCF_Sand;
if (RawFlags & 0x00040000) OutMaterial |= eCF_ShootThru;
if (RawFlags & 0x00200000) OutMaterial |= eCF_CameraThru;
if (RawFlags & 0x00400000) OutMaterial |= eCF_Wood;
if (RawFlags & 0x00800000) OutMaterial |= eCF_Organic;
if (RawFlags & 0x02000000) OutMaterial |= eCF_FlippedTri;
if (RawFlags & 0x08000000) OutMaterial |= eCF_ScanThru;
if (RawFlags & 0x10000000) OutMaterial |= eCF_AiWalkThru;
if (RawFlags & 0x20000000) OutMaterial |= eCF_Ceiling;
if (RawFlags & 0x40000000) OutMaterial |= eCF_Wall;
if (RawFlags & 0x80000000) OutMaterial |= eCF_Floor;
if ((RawFlags & 0x00000001) != 0) OutMaterial |= eCF_Unknown;
if ((RawFlags & 0x00000002) != 0) OutMaterial |= eCF_Stone;
if ((RawFlags & 0x00000004) != 0) OutMaterial |= eCF_Metal;
if ((RawFlags & 0x00000008) != 0) OutMaterial |= eCF_Grass;
if ((RawFlags & 0x00000010) != 0) OutMaterial |= eCF_Ice;
if ((RawFlags & 0x00000040) != 0) OutMaterial |= eCF_MetalGrating;
if ((RawFlags & 0x00000080) != 0) OutMaterial |= eCF_Phazon;
if ((RawFlags & 0x00000100) != 0) OutMaterial |= eCF_Dirt;
if ((RawFlags & 0x00000200) != 0) OutMaterial |= eCF_Lava;
if ((RawFlags & 0x00000800) != 0) OutMaterial |= eCF_Snow;
if ((RawFlags & 0x00001000) != 0) OutMaterial |= eCF_SlowMud;
if ((RawFlags & 0x00004000) != 0) OutMaterial |= eCF_Mud;
if ((RawFlags & 0x00008000) != 0) OutMaterial |= eCF_Glass;
if ((RawFlags & 0x00010000) != 0) OutMaterial |= eCF_Shield;
if ((RawFlags & 0x00020000) != 0) OutMaterial |= eCF_Sand;
if ((RawFlags & 0x00040000) != 0) OutMaterial |= eCF_ShootThru;
if ((RawFlags & 0x00200000) != 0) OutMaterial |= eCF_CameraThru;
if ((RawFlags & 0x00400000) != 0) OutMaterial |= eCF_Wood;
if ((RawFlags & 0x00800000) != 0) OutMaterial |= eCF_Organic;
if ((RawFlags & 0x02000000) != 0) OutMaterial |= eCF_FlippedTri;
if ((RawFlags & 0x08000000) != 0) OutMaterial |= eCF_ScanThru;
if ((RawFlags & 0x10000000) != 0) OutMaterial |= eCF_AiWalkThru;
if ((RawFlags & 0x20000000) != 0) OutMaterial |= eCF_Ceiling;
if ((RawFlags & 0x40000000) != 0) OutMaterial |= eCF_Wall;
if ((RawFlags & 0x80000000) != 0) OutMaterial |= eCF_Floor;
}
else if (mVersion <= EGame::Corruption)
{
if (RawFlags & 0x00000001) OutMaterial |= eCF_Unknown;
if (RawFlags & 0x00000002) OutMaterial |= eCF_Stone;
if (RawFlags & 0x00000004) OutMaterial |= eCF_Metal;
if (RawFlags & 0x00000008) OutMaterial |= eCF_Grass;
if (RawFlags & 0x00000010) OutMaterial |= eCF_Ice;
if (RawFlags & 0x00000040) OutMaterial |= eCF_MetalGrating;
if (RawFlags & 0x00000080) OutMaterial |= eCF_Phazon;
if (RawFlags & 0x00000100) OutMaterial |= eCF_Dirt;
if (RawFlags & 0x00000200) OutMaterial |= eCF_AltMetal;
if (RawFlags & 0x00000400) OutMaterial |= eCF_Glass;
if (RawFlags & 0x00000800) OutMaterial |= eCF_Snow;
if (RawFlags & 0x00001000) OutMaterial |= eCF_Fabric;
if (RawFlags & 0x00010000) OutMaterial |= eCF_Shield;
if (RawFlags & 0x00020000) OutMaterial |= eCF_Sand;
if (RawFlags & 0x00040000) OutMaterial |= eCF_MothSeedOrganics;
if (RawFlags & 0x00080000) OutMaterial |= eCF_Web;
if (RawFlags & 0x00100000) OutMaterial |= eCF_ShootThru;
if (RawFlags & 0x00200000) OutMaterial |= eCF_CameraThru;
if (RawFlags & 0x00400000) OutMaterial |= eCF_Wood;
if (RawFlags & 0x00800000) OutMaterial |= eCF_Organic;
if (RawFlags & 0x01000000) OutMaterial |= eCF_FlippedTri;
if (RawFlags & 0x02000000) OutMaterial |= eCF_Rubber;
if (RawFlags & 0x08000000) OutMaterial |= eCF_ScanThru;
if (RawFlags & 0x10000000) OutMaterial |= eCF_AiWalkThru;
if (RawFlags & 0x20000000) OutMaterial |= eCF_Ceiling;
if (RawFlags & 0x40000000) OutMaterial |= eCF_Wall;
if (RawFlags & 0x80000000) OutMaterial |= eCF_Floor;
if ((RawFlags & 0x00000001) != 0) OutMaterial |= eCF_Unknown;
if ((RawFlags & 0x00000002) != 0) OutMaterial |= eCF_Stone;
if ((RawFlags & 0x00000004) != 0) OutMaterial |= eCF_Metal;
if ((RawFlags & 0x00000008) != 0) OutMaterial |= eCF_Grass;
if ((RawFlags & 0x00000010) != 0) OutMaterial |= eCF_Ice;
if ((RawFlags & 0x00000040) != 0) OutMaterial |= eCF_MetalGrating;
if ((RawFlags & 0x00000080) != 0) OutMaterial |= eCF_Phazon;
if ((RawFlags & 0x00000100) != 0) OutMaterial |= eCF_Dirt;
if ((RawFlags & 0x00000200) != 0) OutMaterial |= eCF_AltMetal;
if ((RawFlags & 0x00000400) != 0) OutMaterial |= eCF_Glass;
if ((RawFlags & 0x00000800) != 0) OutMaterial |= eCF_Snow;
if ((RawFlags & 0x00001000) != 0) OutMaterial |= eCF_Fabric;
if ((RawFlags & 0x00010000) != 0) OutMaterial |= eCF_Shield;
if ((RawFlags & 0x00020000) != 0) OutMaterial |= eCF_Sand;
if ((RawFlags & 0x00040000) != 0) OutMaterial |= eCF_MothSeedOrganics;
if ((RawFlags & 0x00080000) != 0) OutMaterial |= eCF_Web;
if ((RawFlags & 0x00100000) != 0) OutMaterial |= eCF_ShootThru;
if ((RawFlags & 0x00200000) != 0) OutMaterial |= eCF_CameraThru;
if ((RawFlags & 0x00400000) != 0) OutMaterial |= eCF_Wood;
if ((RawFlags & 0x00800000) != 0) OutMaterial |= eCF_Organic;
if ((RawFlags & 0x01000000) != 0) OutMaterial |= eCF_FlippedTri;
if ((RawFlags & 0x02000000) != 0) OutMaterial |= eCF_Rubber;
if ((RawFlags & 0x08000000) != 0) OutMaterial |= eCF_ScanThru;
if ((RawFlags & 0x10000000) != 0) OutMaterial |= eCF_AiWalkThru;
if ((RawFlags & 0x20000000) != 0) OutMaterial |= eCF_Ceiling;
if ((RawFlags & 0x40000000) != 0) OutMaterial |= eCF_Wall;
if ((RawFlags & 0x80000000) != 0) OutMaterial |= eCF_Floor;
if (RawFlags & 0x0001000000000000) OutMaterial |= eCF_AiBlock;
if (RawFlags & 0x0400000000000000) OutMaterial |= eCF_JumpNotAllowed;
if ((RawFlags & 0x0001000000000000) != 0) OutMaterial |= eCF_AiBlock;
if ((RawFlags & 0x0400000000000000) != 0) OutMaterial |= eCF_JumpNotAllowed;
}
else if (mVersion == EGame::DKCReturns)
{
if (RawFlags & 0x10000000) OutMaterial |= eCF_FlippedTri;
if ((RawFlags & 0x10000000) != 0) OutMaterial |= eCF_FlippedTri;
}
}
void CCollisionLoader::LoadCollisionIndices(IInputStream& File, SCollisionIndexData& OutData)
{
// Materials
const uint NumMaterials = File.ReadLong();
const uint32 NumMaterials = File.ReadULong();
OutData.Materials.resize(NumMaterials);
for (auto& material : OutData.Materials)
@ -141,45 +139,45 @@ void CCollisionLoader::LoadCollisionIndices(IInputStream& File, SCollisionIndexD
}
// Property indices for vertices/edges/triangles
const uint32 VertexMaterialCount = File.ReadLong();
const uint32 VertexMaterialCount = File.ReadULong();
OutData.VertexMaterialIndices.resize(VertexMaterialCount);
File.ReadBytes(OutData.VertexMaterialIndices.data(), VertexMaterialCount);
const uint32 EdgeMaterialCount = File.ReadLong();
const uint32 EdgeMaterialCount = File.ReadULong();
OutData.EdgeMaterialIndices.resize(EdgeMaterialCount);
File.ReadBytes(OutData.EdgeMaterialIndices.data(), EdgeMaterialCount);
const uint32 TriMaterialCount = File.ReadLong();
const uint32 TriMaterialCount = File.ReadULong();
OutData.TriangleMaterialIndices.resize(TriMaterialCount);
File.ReadBytes(OutData.TriangleMaterialIndices.data(), TriMaterialCount);
// Edges
const uint32 NumEdges = File.ReadLong();
const uint32 NumEdges = File.ReadULong();
OutData.EdgeIndices.resize(NumEdges * 2);
for (auto& edge : OutData.EdgeIndices)
{
edge = File.ReadShort();
edge = File.ReadUShort();
}
// Triangles
const uint32 NumTris = File.ReadLong();
const uint32 NumTris = File.ReadULong();
OutData.TriangleIndices.resize(NumTris);
for (auto& triangle : OutData.TriangleIndices)
{
triangle = File.ReadShort();
triangle = File.ReadUShort();
}
// Echoes introduces a new data chunk; don't know what it is yet, skipping for now
if (mVersion >= EGame::Echoes)
{
const uint32 UnknownCount = File.ReadLong();
const uint32 UnknownCount = File.ReadULong();
File.Skip(UnknownCount * 2);
}
// Vertices
const uint32 NumVertices = File.ReadLong();
const uint32 NumVertices = File.ReadULong();
OutData.Vertices.resize(NumVertices);
for (auto& vert : OutData.Vertices)
@ -197,7 +195,7 @@ std::unique_ptr<CCollisionMeshGroup> CCollisionLoader::LoadAreaCollision(IInputS
rMREA.Skip(0x8); // Skipping unknown value + collion section size
// Validate magic
uint32 DeafBabe = rMREA.ReadLong();
const uint32 DeafBabe = rMREA.ReadULong();
if (DeafBabe != 0xDEAFBABE)
{
errorf("%s [0x%X]: Invalid collision magic: 0x%08X", *rMREA.GetSourceString(), rMREA.Tell() - 4, DeafBabe);
@ -207,13 +205,13 @@ std::unique_ptr<CCollisionMeshGroup> CCollisionLoader::LoadAreaCollision(IInputS
auto mesh = std::make_unique<CCollisionMesh>();
CCollisionLoader Loader;
Loader.mVersion = GetFormatVersion(rMREA.ReadLong());
Loader.mVersion = GetFormatVersion(rMREA.ReadULong());
Loader.mpMesh = mesh.get();
// Octree - structure is known, but not coding this right now
Loader.mpMesh->mAABox = CAABox(rMREA);
rMREA.Skip(0x4);
uint32 OctreeSize = rMREA.ReadLong();
const uint32 OctreeSize = rMREA.ReadULong();
rMREA.Skip(OctreeSize); // Skipping the octree for now
// Read collision indices and return
@ -233,11 +231,11 @@ std::unique_ptr<CCollisionMeshGroup> CCollisionLoader::LoadDCLN(IInputStream& rD
CCollisionLoader Loader;
Loader.mpGroup = ptr.get();
const uint32 NumMeshes = rDCLN.ReadLong();
const uint32 NumMeshes = rDCLN.ReadULong();
for (uint32 MeshIdx = 0; MeshIdx < NumMeshes; MeshIdx++)
{
const uint32 DeafBabe = rDCLN.ReadLong();
const uint32 DeafBabe = rDCLN.ReadULong();
if (DeafBabe != 0xDEAFBABE)
{
@ -246,7 +244,7 @@ std::unique_ptr<CCollisionMeshGroup> CCollisionLoader::LoadDCLN(IInputStream& rD
}
auto mesh = std::make_unique<CCollidableOBBTree>();
Loader.mVersion = GetFormatVersion(rDCLN.ReadLong());
Loader.mVersion = GetFormatVersion(rDCLN.ReadULong());
Loader.mpMesh = mesh.get();
if (Loader.mVersion == EGame::DKCReturns)
@ -269,7 +267,7 @@ std::unique_ptr<CCollisionMeshGroup> CCollisionLoader::LoadDCLN(IInputStream& rD
}
// Parse OBB tree
CCollidableOBBTree* pOBBTree = static_cast<CCollidableOBBTree*>(Loader.mpMesh);
auto* pOBBTree = static_cast<CCollidableOBBTree*>(Loader.mpMesh);
pOBBTree->mpOBBTree = Loader.ParseOBBNode(rDCLN);
}