CEntity and C(Vu)Vector fixes and cleanup

This commit is contained in:
aap 2021-05-23 17:45:07 +02:00 committed by Sergeanur
parent ce0a097392
commit 50058371ef
11 changed files with 55 additions and 38 deletions

View file

@ -3675,16 +3675,18 @@ CCamera::IsSphereVisible(const CVector &center, float radius, const CMatrix *mat
bool bool
CCamera::IsSphereVisible(const CVector &center, float radius) CCamera::IsSphereVisible(const CVector &center, float radius)
{ {
CMatrix mat = m_cameraMatrix; #if GTA_VERSION < GTA3_PC_10 // not sure this condition is the right one
// Maybe this was a copy of the other function with m_cameraMatrix
return IsSphereVisible(center, radius, &m_cameraMatrix);
#else
// ...and on PC they decided to call the other one with a default matrix.
CMatrix mat(m_cameraMatrix); // this matrix construction is stupid and gone in VC
return IsSphereVisible(center, radius, &mat); return IsSphereVisible(center, radius, &mat);
#endif
} }
bool bool
#ifdef GTA_PS2 CCamera::IsBoxVisible(CVUVECTOR *box, const CMatrix *mat)
CCamera::IsBoxVisible(CVuVector *box, const CMatrix *mat)
#else
CCamera::IsBoxVisible(CVector *box, const CMatrix *mat)
#endif
{ {
int i; int i;
int frustumTests[6] = { 0 }; int frustumTests[6] = { 0 };

View file

@ -641,11 +641,7 @@ public:
bool IsPointVisible(const CVector &center, const CMatrix *mat); bool IsPointVisible(const CVector &center, const CMatrix *mat);
bool IsSphereVisible(const CVector &center, float radius, const CMatrix *mat); bool IsSphereVisible(const CVector &center, float radius, const CMatrix *mat);
bool IsSphereVisible(const CVector &center, float radius); bool IsSphereVisible(const CVector &center, float radius);
#ifdef GTA_PS2 bool IsBoxVisible(CVUVECTOR *box, const CMatrix *mat);
bool IsBoxVisible(CVuVector *box, const CMatrix *mat);
#else
bool IsBoxVisible(CVector *box, const CMatrix *mat);
#endif
}; };
VALIDATE_SIZE(CCamera, 0xE9D8); VALIDATE_SIZE(CCamera, 0xE9D8);

View file

@ -39,9 +39,7 @@ CEntity::RegisterReference(CEntity **pent)
ref->pentity = pent; ref->pentity = pent;
ref->next = m_pFirstReference; ref->next = m_pFirstReference;
m_pFirstReference = ref; m_pFirstReference = ref;
return;
} }
return;
} }
// Clear all references to this entity // Clear all references to this entity

View file

@ -216,6 +216,12 @@ inline uint32 ldb(uint32 p, uint32 s, uint32 w)
#include "maths.h" #include "maths.h"
#include "Vector.h" #include "Vector.h"
#ifdef GTA_PS2
#include "VuVector.h"
#define CVUVECTOR CVuVector
#else
#define CVUVECTOR CVector
#endif
#include "Vector2D.h" #include "Vector2D.h"
#include "Matrix.h" #include "Matrix.h"
#include "Rect.h" #include "Rect.h"

View file

@ -191,7 +191,7 @@ CEntity::GetBoundRect(void)
{ {
CRect rect; CRect rect;
CVector v; CVector v;
CColModel *col = CModelInfo::GetModelInfo(m_modelIndex)->GetColModel(); CColModel *col = CModelInfo::GetColModel(m_modelIndex);
rect.ContainPoint(GetMatrix() * col->boundingBox.min); rect.ContainPoint(GetMatrix() * col->boundingBox.min);
rect.ContainPoint(GetMatrix() * col->boundingBox.max); rect.ContainPoint(GetMatrix() * col->boundingBox.max);
@ -210,21 +210,27 @@ CEntity::GetBoundRect(void)
CVector CVector
CEntity::GetBoundCentre(void) CEntity::GetBoundCentre(void)
{ {
CVector v; return GetMatrix() * CModelInfo::GetColModel(m_modelIndex)->boundingSphere.center;
GetBoundCentre(v);
return v;
} }
#ifdef GTA_PS2
void
CEntity::GetBoundCentre(CVuVector &out)
{
TransformPoint(out, GetMatrix(), CModelInfo::GetColModel(m_modelIndex)->boundingSphere.center);
}
#else
void void
CEntity::GetBoundCentre(CVector &out) CEntity::GetBoundCentre(CVector &out)
{ {
out = GetMatrix() * CModelInfo::GetModelInfo(m_modelIndex)->GetColModel()->boundingSphere.center; out = GetMatrix() * CModelInfo::GetColModel(m_modelIndex)->boundingSphere.center;
} }
#endif
float float
CEntity::GetBoundRadius(void) CEntity::GetBoundRadius(void)
{ {
return CModelInfo::GetModelInfo(m_modelIndex)->GetColModel()->boundingSphere.radius; return CModelInfo::GetColModel(m_modelIndex)->boundingSphere.radius;
} }
void void
@ -379,10 +385,13 @@ CEntity::Render(void)
} }
} }
bool bool
CEntity::GetIsTouching(CVector const &center, float radius) CEntity::GetIsTouching(CVUVECTOR const &center, float radius)
{ {
return sq(GetBoundRadius()+radius) > (GetBoundCentre()-center).MagnitudeSqr(); CVUVECTOR boundCenter;
GetBoundCentre(boundCenter);
return sq(GetBoundRadius()+radius) > (boundCenter-center).MagnitudeSqr();
} }
bool bool
@ -400,8 +409,7 @@ CEntity::IsVisibleComplex(void)
bool bool
CEntity::GetIsOnScreen(void) CEntity::GetIsOnScreen(void)
{ {
return TheCamera.IsSphereVisible(GetBoundCentre(), GetBoundRadius(), return TheCamera.IsSphereVisible(GetBoundCentre(), GetBoundRadius());
&TheCamera.GetCameraMatrix());
} }
bool bool
@ -417,7 +425,7 @@ CEntity::GetIsOnScreenComplex(void)
return true; return true;
CRect rect = GetBoundRect(); CRect rect = GetBoundRect();
CColModel *colmodel = CModelInfo::GetModelInfo(m_modelIndex)->GetColModel(); CColModel *colmodel = CModelInfo::GetColModel(m_modelIndex);
float z = GetPosition().z; float z = GetPosition().z;
float minz = z + colmodel->boundingBox.min.z; float minz = z + colmodel->boundingBox.min.z;
float maxz = z + colmodel->boundingBox.max.z; float maxz = z + colmodel->boundingBox.max.z;
@ -572,7 +580,7 @@ CEntity::Remove(void)
float float
CEntity::GetDistanceFromCentreOfMassToBaseOfModel(void) CEntity::GetDistanceFromCentreOfMassToBaseOfModel(void)
{ {
return -CModelInfo::GetModelInfo(m_modelIndex)->GetColModel()->boundingBox.min.z; return -CModelInfo::GetColModel(m_modelIndex)->boundingBox.min.z;
} }
void void

View file

@ -141,11 +141,11 @@ public:
return (RpClump*)m_rwObject; return (RpClump*)m_rwObject;
} }
void GetBoundCentre(CVector &out); void GetBoundCentre(CVUVECTOR &out);
CVector GetBoundCentre(void); CVector GetBoundCentre(void);
float GetBoundRadius(void); float GetBoundRadius(void);
float GetDistanceFromCentreOfMassToBaseOfModel(void); float GetDistanceFromCentreOfMassToBaseOfModel(void);
bool GetIsTouching(CVector const &center, float r); bool GetIsTouching(CVUVECTOR const &center, float r);
bool GetIsOnScreen(void); bool GetIsOnScreen(void);
bool GetIsOnScreenComplex(void); bool GetIsOnScreenComplex(void);
bool IsVisible(void); bool IsVisible(void);

View file

@ -216,7 +216,7 @@ CPhysical::RemoveAndAdd(void)
CRect CRect
CPhysical::GetBoundRect(void) CPhysical::GetBoundRect(void)
{ {
CVector center; CVUVECTOR center;
float radius; float radius;
GetBoundCentre(center); GetBoundCentre(center);
radius = GetBoundRadius(); radius = GetBoundRadius();
@ -1086,7 +1086,7 @@ CPhysical::ProcessShiftSectorList(CPtrList *lists)
CPhysical *A, *B; CPhysical *A, *B;
CObject *Bobj; CObject *Bobj;
bool canshift; bool canshift;
CVector center; CVUVECTOR center;
float radius; float radius;
int numCollisions; int numCollisions;
@ -1244,7 +1244,7 @@ CPhysical::ProcessCollisionSectorList_SimpleCar(CPtrList *lists)
{ {
static CColPoint aColPoints[MAX_COLLISION_POINTS]; static CColPoint aColPoints[MAX_COLLISION_POINTS];
float radius; float radius;
CVector center; CVUVECTOR center;
int listtype; int listtype;
CPhysical *A, *B; CPhysical *A, *B;
int numCollisions; int numCollisions;
@ -1406,7 +1406,7 @@ CPhysical::ProcessCollisionSectorList(CPtrList *lists)
{ {
static CColPoint aColPoints[MAX_COLLISION_POINTS]; static CColPoint aColPoints[MAX_COLLISION_POINTS];
float radius; float radius;
CVector center; CVUVECTOR center;
CPtrList *list; CPtrList *list;
CPhysical *A, *B; CPhysical *A, *B;
CObject *Aobj, *Bobj; CObject *Aobj, *Bobj;

View file

@ -22,6 +22,8 @@ public:
x = 1.0f; x = 1.0f;
} }
*/ */
// TODO: operator-
}; };
void TransformPoint(CVuVector &out, const CMatrix &mat, const CVuVector &in); void TransformPoint(CVuVector &out, const CMatrix &mat, const CVuVector &in);

View file

@ -43,6 +43,9 @@ public:
static CBaseModelInfo *GetModelInfo(int id){ static CBaseModelInfo *GetModelInfo(int id){
return ms_modelInfoPtrs[id]; return ms_modelInfoPtrs[id];
} }
static CColModel *GetColModel(int id){
return ms_modelInfoPtrs[id]->GetColModel();
}
static bool IsBoatModel(int32 id); static bool IsBoatModel(int32 id);
static bool IsBikeModel(int32 id); static bool IsBikeModel(int32 id);

View file

@ -1011,27 +1011,30 @@ CPopulation::TestSafeForRealObject(CDummyObject *dummy)
{ {
CPtrNode *ptrNode; CPtrNode *ptrNode;
CColModel *dummyCol = dummy->GetColModel(); CColModel *dummyCol = dummy->GetColModel();
float colRadius = dummy->GetBoundRadius();
CVector colCentre = dummy->GetBoundCentre();
int minX = CWorld::GetSectorIndexX(dummy->GetPosition().x - colRadius); float radius = dummyCol->boundingSphere.radius;
int minX = CWorld::GetSectorIndexX(dummy->GetPosition().x - radius);
if (minX < 0) minX = 0; if (minX < 0) minX = 0;
int minY = CWorld::GetSectorIndexY(dummy->GetPosition().y - colRadius); int minY = CWorld::GetSectorIndexY(dummy->GetPosition().y - radius);
if (minY < 0) minY = 0; if (minY < 0) minY = 0;
int maxX = CWorld::GetSectorIndexX(dummy->GetPosition().x + colRadius); int maxX = CWorld::GetSectorIndexX(dummy->GetPosition().x + radius);
#ifdef FIX_BUGS #ifdef FIX_BUGS
if (maxX >= NUMSECTORS_X) maxX = NUMSECTORS_X - 1; if (maxX >= NUMSECTORS_X) maxX = NUMSECTORS_X - 1;
#else #else
if (maxX >= NUMSECTORS_X) maxX = NUMSECTORS_X; if (maxX >= NUMSECTORS_X) maxX = NUMSECTORS_X;
#endif #endif
int maxY = CWorld::GetSectorIndexY(dummy->GetPosition().y + colRadius); int maxY = CWorld::GetSectorIndexY(dummy->GetPosition().y + radius);
#ifdef FIX_BUGS #ifdef FIX_BUGS
if (maxY >= NUMSECTORS_Y) maxY = NUMSECTORS_Y - 1; if (maxY >= NUMSECTORS_Y) maxY = NUMSECTORS_Y - 1;
#else #else
if (maxY >= NUMSECTORS_Y) maxY = NUMSECTORS_Y; if (maxY >= NUMSECTORS_Y) maxY = NUMSECTORS_Y;
#endif #endif
float colRadius = dummy->GetBoundRadius();
CVUVECTOR colCentre;
dummy->GetBoundCentre(colCentre);
static CColPoint aTempColPoints[MAX_COLLISION_POINTS]; static CColPoint aTempColPoints[MAX_COLLISION_POINTS];
for (int curY = minY; curY <= maxY; curY++) { for (int curY = minY; curY <= maxY; curY++) {

View file

@ -117,7 +117,6 @@ public:
int32 offset, int32 len); int32 offset, int32 len);
static int32 ms_framePluginOffset; static int32 ms_framePluginOffset;
// Not actually used
struct ClumpExt struct ClumpExt
{ {
ClumpVisibilityCB visibilityCB; ClumpVisibilityCB visibilityCB;