mirror of
https://github.com/GTAmodding/re3.git
synced 2024-11-25 14:43:44 +00:00
CEntity and C(Vu)Vector fixes and cleanup
This commit is contained in:
parent
ce0a097392
commit
50058371ef
11 changed files with 55 additions and 38 deletions
|
@ -3675,16 +3675,18 @@ CCamera::IsSphereVisible(const CVector ¢er, float radius, const CMatrix *mat
|
||||||
bool
|
bool
|
||||||
CCamera::IsSphereVisible(const CVector ¢er, float radius)
|
CCamera::IsSphereVisible(const CVector ¢er, 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 };
|
||||||
|
|
|
@ -641,11 +641,7 @@ public:
|
||||||
bool IsPointVisible(const CVector ¢er, const CMatrix *mat);
|
bool IsPointVisible(const CVector ¢er, const CMatrix *mat);
|
||||||
bool IsSphereVisible(const CVector ¢er, float radius, const CMatrix *mat);
|
bool IsSphereVisible(const CVector ¢er, float radius, const CMatrix *mat);
|
||||||
bool IsSphereVisible(const CVector ¢er, float radius);
|
bool IsSphereVisible(const CVector ¢er, 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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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 ¢er, float radius)
|
CEntity::GetIsTouching(CVUVECTOR const ¢er, 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
|
||||||
|
|
|
@ -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 ¢er, float r);
|
bool GetIsTouching(CVUVECTOR const ¢er, float r);
|
||||||
bool GetIsOnScreen(void);
|
bool GetIsOnScreen(void);
|
||||||
bool GetIsOnScreenComplex(void);
|
bool GetIsOnScreenComplex(void);
|
||||||
bool IsVisible(void);
|
bool IsVisible(void);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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++) {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue