mirror of
https://gitlab.com/skmp/dca3-game.git
synced 2025-08-31 02:20:04 +02:00
collision fixes: fix miami linked list corruption, liberty replica
This commit is contained in:
committed by
Stefanos Kornilios Mitsis Poiitidis
parent
aba5bdac62
commit
3b7f5cffc3
@@ -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)
|
||||
{
|
||||
|
@@ -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
|
||||
|
@@ -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);
|
||||
|
@@ -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)
|
||||
{
|
||||
|
@@ -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);
|
||||
|
@@ -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));
|
||||
|
Reference in New Issue
Block a user