From a284cebe6422b66d2f059e24600d029e6e48f677 Mon Sep 17 00:00:00 2001 From: parax0 Date: Sat, 26 Sep 2015 19:08:31 -0600 Subject: [PATCH] Added support for DKCR collision --- Resource/factory/CAreaLoader.cpp | 2 +- Resource/factory/CCollisionLoader.cpp | 32 ++++++++++++--------------- 2 files changed, 15 insertions(+), 19 deletions(-) diff --git a/Resource/factory/CAreaLoader.cpp b/Resource/factory/CAreaLoader.cpp index 874d0bf6..2cd3286b 100644 --- a/Resource/factory/CAreaLoader.cpp +++ b/Resource/factory/CAreaLoader.cpp @@ -507,7 +507,7 @@ CGameArea* CAreaLoader::LoadMREA(CInputStream& MREA) Loader.ReadHeaderCorruption(); Loader.ReadGeometryCorruption(); Loader.ReadSCLYEchoes(); - if (Loader.mVersion != eReturns) Loader.ReadCollision(); + Loader.ReadCollision(); break; default: Log::FileError(MREA.GetSourceString(), "Unsupported MREA version: " + StringUtil::ToHexString(version)); diff --git a/Resource/factory/CCollisionLoader.cpp b/Resource/factory/CCollisionLoader.cpp index aaf3d1ce..8abbee44 100644 --- a/Resource/factory/CCollisionLoader.cpp +++ b/Resource/factory/CCollisionLoader.cpp @@ -49,12 +49,18 @@ void CCollisionLoader::ReadPropertyFlags(CInputStream& src) property.Invert = (flag >> 25) & 0x1; } - if (mVersion == eEchoes) + else if (mVersion == eEchoes) { u64 flag = src.ReadLongLong(); property.Invert = (flag >> 24) & 0x1; } + else if (mVersion == eReturns) + { + u64 flag = src.ReadLongLong(); + property.Invert = (flag >> 28) & 0x1; + } + mProperties.push_back(property); } @@ -103,7 +109,7 @@ void CCollisionLoader::LoadCollisionIndices(CInputStream &file, bool buildAABox) } // Echoes introduces a new data chunk; don't know what it is yet, skipping for now - if (mVersion == eEchoes) + if (mVersion >= eEchoes) { u32 unknownCount = file.ReadLong(); file.Seek(unknownCount * 2, SEEK_CUR); @@ -138,13 +144,7 @@ CCollisionMeshGroup* CCollisionLoader::LoadAreaCollision(CInputStream& MREA) return nullptr; } - u32 version = MREA.ReadLong(); - loader.mVersion = GetFormatVersion(version); - if ((loader.mVersion != ePrime) && (loader.mVersion != eEchoes)) - { - Log::FileError(MREA.GetSourceString(), MREA.Tell() - 4, "Unsupported collision version: " + StringUtil::ToHexString(version)); - return nullptr; - } + loader.mVersion = GetFormatVersion(MREA.ReadLong()); loader.mpGroup = new CCollisionMeshGroup; loader.mpMesh = new CCollisionMesh; @@ -182,21 +182,17 @@ CCollisionMeshGroup* CCollisionLoader::LoadDCLN(CInputStream &DCLN) return nullptr; } - u32 version = DCLN.ReadLong(); - loader.mVersion = GetFormatVersion(version); - - if ((loader.mVersion != ePrime) && (loader.mVersion != eEchoes)) - { - Log::FileError(DCLN.GetSourceString(), DCLN.Tell() - 4, "Unsupported collision version: " + StringUtil::ToHexString(version)); - return nullptr; - } + loader.mVersion = GetFormatVersion(DCLN.ReadLong()); loader.mpMesh = new CCollisionMesh; loader.mpMesh->mOctreeLoaded = false; + if (loader.mVersion == eReturns) + loader.mpMesh->mAABox = CAABox(DCLN); + // Read indices and return DCLN.Seek(0x4, SEEK_CUR); - loader.LoadCollisionIndices(DCLN, true); + loader.LoadCollisionIndices(DCLN, loader.mVersion != eReturns); loader.mpGroup->AddMesh(loader.mpMesh); // Parse OBB tree