From 3b7f5cffc3db945a2c8ea4acbf85fa28ebfe775c Mon Sep 17 00:00:00 2001 From: Stefanos Kornilios Mitsis Poiitidis Date: Sun, 23 Mar 2025 07:39:22 +0200 Subject: [PATCH] collision fixes: fix miami linked list corruption, liberty replica --- src/liberty/collision/Collision.cpp | 9 +++++++++ src/liberty/collision/Collision.h | 1 + src/liberty/core/FileLoader.cpp | 18 ++++++++++++++++++ src/liberty/modelinfo/BaseModelInfo.cpp | 8 ++++++++ src/liberty/modelinfo/BaseModelInfo.h | 3 +-- src/miami/core/FileLoader.cpp | 2 +- 6 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/liberty/collision/Collision.cpp b/src/liberty/collision/Collision.cpp index 832d773e..9248a9ce 100644 --- a/src/liberty/collision/Collision.cpp +++ b/src/liberty/collision/Collision.cpp @@ -2287,6 +2287,15 @@ CCollision::DistToLine(const CVector *l0, const CVector *l1, const CVector *poin return (*point - closest).Magnitude(); } +void +CCollision::RemoveTrianglePlanes(CColModel *model) +{ + if(model->trianglePlanes){ + ms_colModelCache.Remove(model->GetLinkPtr()); + model->RemoveTrianglePlanes(); + } +} + void CCollision::CalculateTrianglePlanes(CColModel *model) { diff --git a/src/liberty/collision/Collision.h b/src/liberty/collision/Collision.h index f4270bc5..4960d88a 100644 --- a/src/liberty/collision/Collision.h +++ b/src/liberty/collision/Collision.h @@ -41,6 +41,7 @@ public: static void DrawColModel(const CMatrix &mat, const CColModel &colModel); static void DrawColModel_Coloured(const CMatrix &mat, const CColModel &colModel, int32 id); + static void RemoveTrianglePlanes(CColModel *model); static void CalculateTrianglePlanes(CColModel *model); // all these return true if there's a collision diff --git a/src/liberty/core/FileLoader.cpp b/src/liberty/core/FileLoader.cpp index e07baf8f..1945b419 100644 --- a/src/liberty/core/FileLoader.cpp +++ b/src/liberty/core/FileLoader.cpp @@ -257,6 +257,24 @@ CFileLoader::LoadCollisionModel(uint8 *buf, CColModel &model, char *modelname) model.boundingBox.max.z = *(float*)(buf+36); model.numSpheres = *(int16*)(buf+40); buf += 44; + if (model.spheres) { + RwFree(model.spheres); + } + if (model.lines) { + RwFree(model.lines); + } + if (model.boxes) { + RwFree(model.boxes); + } + if (model.vertices) { + RwFree(model.vertices); + } + if (model.triangles) { + RwFree(model.triangles); + } + if (model.trianglePlanes) { + CCollision::RemoveTrianglePlanes(&model); + } if(model.numSpheres > 0){ model.spheres = (CColSphere*)RwMalloc(model.numSpheres*sizeof(CColSphere)); REGISTER_MEMPTR(&model.spheres); diff --git a/src/liberty/modelinfo/BaseModelInfo.cpp b/src/liberty/modelinfo/BaseModelInfo.cpp index 7137c604..f48a580a 100644 --- a/src/liberty/modelinfo/BaseModelInfo.cpp +++ b/src/liberty/modelinfo/BaseModelInfo.cpp @@ -38,6 +38,14 @@ CBaseModelInfo::DeleteCollisionModel(void) } } +void CBaseModelInfo::SetColModel(CColModel *col, bool owns) { + if (m_bOwnsColModel) { + delete m_colModel; + } + m_colModel = col; + m_bOwnsColModel = owns; +} + void CBaseModelInfo::AddRef(void) { diff --git a/src/liberty/modelinfo/BaseModelInfo.h b/src/liberty/modelinfo/BaseModelInfo.h index f46cea84..98b57b2d 100644 --- a/src/liberty/modelinfo/BaseModelInfo.h +++ b/src/liberty/modelinfo/BaseModelInfo.h @@ -56,8 +56,7 @@ public: } char *GetModelName(void) { return m_name; } void SetModelName(const char *name) { strncpy(m_name, name, MAX_MODEL_NAME); } - void SetColModel(CColModel *col, bool owns = false){ - m_colModel = col; m_bOwnsColModel = owns; } + void SetColModel(CColModel *col, bool owns = false); CColModel *GetColModel(void) { return m_colModel; } bool DoesOwnColModel(void) { return m_bOwnsColModel; } void DeleteCollisionModel(void); diff --git a/src/miami/core/FileLoader.cpp b/src/miami/core/FileLoader.cpp index 7e12914d..eca128f7 100644 --- a/src/miami/core/FileLoader.cpp +++ b/src/miami/core/FileLoader.cpp @@ -321,7 +321,7 @@ CFileLoader::LoadCollisionModel(uint8 *buf, CColModel &model, char *modelname) RwFree(model.triangles); } if (model.trianglePlanes) { - RwFree(model.trianglePlanes); + CCollision::RemoveTrianglePlanes(&model); } if(model.numSpheres > 0){ model.spheres = (CColSphere*)RwMalloc(model.numSpheres*sizeof(CColSphere));