mirror of
				https://github.com/halpz/re3.git
				synced 2025-11-04 09:54:54 +00:00 
			
		
		
		
	CEntity and C(Vu)Vector fixes and cleanup
This commit is contained in:
		
							parent
							
								
									ce0a097392
								
							
						
					
					
						commit
						50058371ef
					
				| 
						 | 
				
			
			@ -3675,16 +3675,18 @@ CCamera::IsSphereVisible(const CVector ¢er, float radius, const CMatrix *mat
 | 
			
		|||
bool
 | 
			
		||||
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);
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool
 | 
			
		||||
#ifdef GTA_PS2
 | 
			
		||||
CCamera::IsBoxVisible(CVuVector *box, const CMatrix *mat)
 | 
			
		||||
#else
 | 
			
		||||
CCamera::IsBoxVisible(CVector *box, const CMatrix *mat)
 | 
			
		||||
#endif
 | 
			
		||||
CCamera::IsBoxVisible(CVUVECTOR *box, const CMatrix *mat)
 | 
			
		||||
{
 | 
			
		||||
	int i;
 | 
			
		||||
	int frustumTests[6] = { 0 };
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -641,11 +641,7 @@ public:
 | 
			
		|||
	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);
 | 
			
		||||
#ifdef GTA_PS2
 | 
			
		||||
	bool IsBoxVisible(CVuVector *box, const CMatrix *mat);
 | 
			
		||||
#else
 | 
			
		||||
	bool IsBoxVisible(CVector *box, const CMatrix *mat);
 | 
			
		||||
#endif
 | 
			
		||||
	bool IsBoxVisible(CVUVECTOR *box, const CMatrix *mat);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
VALIDATE_SIZE(CCamera, 0xE9D8);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -39,9 +39,7 @@ CEntity::RegisterReference(CEntity **pent)
 | 
			
		|||
		ref->pentity = pent;
 | 
			
		||||
		ref->next = m_pFirstReference;
 | 
			
		||||
		m_pFirstReference = ref;
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
	return;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Clear all references to this entity
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -216,6 +216,12 @@ inline uint32 ldb(uint32 p, uint32 s, uint32 w)
 | 
			
		|||
 | 
			
		||||
#include "maths.h"
 | 
			
		||||
#include "Vector.h"
 | 
			
		||||
#ifdef GTA_PS2
 | 
			
		||||
#include "VuVector.h"
 | 
			
		||||
#define CVUVECTOR CVuVector
 | 
			
		||||
#else
 | 
			
		||||
#define CVUVECTOR CVector
 | 
			
		||||
#endif
 | 
			
		||||
#include "Vector2D.h"
 | 
			
		||||
#include "Matrix.h"
 | 
			
		||||
#include "Rect.h"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -191,7 +191,7 @@ CEntity::GetBoundRect(void)
 | 
			
		|||
{
 | 
			
		||||
	CRect rect;
 | 
			
		||||
	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.max);
 | 
			
		||||
| 
						 | 
				
			
			@ -210,21 +210,27 @@ CEntity::GetBoundRect(void)
 | 
			
		|||
CVector
 | 
			
		||||
CEntity::GetBoundCentre(void)
 | 
			
		||||
{
 | 
			
		||||
	CVector v;
 | 
			
		||||
	GetBoundCentre(v);
 | 
			
		||||
	return v;
 | 
			
		||||
	return GetMatrix() * CModelInfo::GetColModel(m_modelIndex)->boundingSphere.center;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef GTA_PS2
 | 
			
		||||
void
 | 
			
		||||
CEntity::GetBoundCentre(CVuVector &out)
 | 
			
		||||
{
 | 
			
		||||
	TransformPoint(out, GetMatrix(), CModelInfo::GetColModel(m_modelIndex)->boundingSphere.center);
 | 
			
		||||
}
 | 
			
		||||
#else
 | 
			
		||||
void
 | 
			
		||||
CEntity::GetBoundCentre(CVector &out)
 | 
			
		||||
{
 | 
			
		||||
	out = GetMatrix() * CModelInfo::GetModelInfo(m_modelIndex)->GetColModel()->boundingSphere.center;
 | 
			
		||||
	out = GetMatrix() * CModelInfo::GetColModel(m_modelIndex)->boundingSphere.center;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
float
 | 
			
		||||
CEntity::GetBoundRadius(void)
 | 
			
		||||
{
 | 
			
		||||
	return CModelInfo::GetModelInfo(m_modelIndex)->GetColModel()->boundingSphere.radius;
 | 
			
		||||
	return CModelInfo::GetColModel(m_modelIndex)->boundingSphere.radius;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
| 
						 | 
				
			
			@ -379,10 +385,13 @@ CEntity::Render(void)
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
| 
						 | 
				
			
			@ -400,8 +409,7 @@ CEntity::IsVisibleComplex(void)
 | 
			
		|||
bool
 | 
			
		||||
CEntity::GetIsOnScreen(void)
 | 
			
		||||
{
 | 
			
		||||
	return TheCamera.IsSphereVisible(GetBoundCentre(), GetBoundRadius(),
 | 
			
		||||
		&TheCamera.GetCameraMatrix());
 | 
			
		||||
	return TheCamera.IsSphereVisible(GetBoundCentre(), GetBoundRadius());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool
 | 
			
		||||
| 
						 | 
				
			
			@ -417,7 +425,7 @@ CEntity::GetIsOnScreenComplex(void)
 | 
			
		|||
		return true;
 | 
			
		||||
 | 
			
		||||
	CRect rect = GetBoundRect();
 | 
			
		||||
	CColModel *colmodel = CModelInfo::GetModelInfo(m_modelIndex)->GetColModel();
 | 
			
		||||
	CColModel *colmodel = CModelInfo::GetColModel(m_modelIndex);
 | 
			
		||||
	float z = GetPosition().z;
 | 
			
		||||
	float minz = z + colmodel->boundingBox.min.z;
 | 
			
		||||
	float maxz = z + colmodel->boundingBox.max.z;
 | 
			
		||||
| 
						 | 
				
			
			@ -572,7 +580,7 @@ CEntity::Remove(void)
 | 
			
		|||
float
 | 
			
		||||
CEntity::GetDistanceFromCentreOfMassToBaseOfModel(void)
 | 
			
		||||
{
 | 
			
		||||
	return -CModelInfo::GetModelInfo(m_modelIndex)->GetColModel()->boundingBox.min.z;
 | 
			
		||||
	return -CModelInfo::GetColModel(m_modelIndex)->boundingBox.min.z;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -141,11 +141,11 @@ public:
 | 
			
		|||
		return (RpClump*)m_rwObject;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void GetBoundCentre(CVector &out);
 | 
			
		||||
	void GetBoundCentre(CVUVECTOR &out);
 | 
			
		||||
	CVector GetBoundCentre(void);
 | 
			
		||||
	float GetBoundRadius(void);
 | 
			
		||||
	float GetDistanceFromCentreOfMassToBaseOfModel(void);
 | 
			
		||||
	bool GetIsTouching(CVector const ¢er, float r);
 | 
			
		||||
	bool GetIsTouching(CVUVECTOR const ¢er, float r);
 | 
			
		||||
	bool GetIsOnScreen(void);
 | 
			
		||||
	bool GetIsOnScreenComplex(void);
 | 
			
		||||
	bool IsVisible(void);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -216,7 +216,7 @@ CPhysical::RemoveAndAdd(void)
 | 
			
		|||
CRect
 | 
			
		||||
CPhysical::GetBoundRect(void)
 | 
			
		||||
{
 | 
			
		||||
	CVector center;
 | 
			
		||||
	CVUVECTOR center;
 | 
			
		||||
	float radius;
 | 
			
		||||
	GetBoundCentre(center);
 | 
			
		||||
	radius = GetBoundRadius();
 | 
			
		||||
| 
						 | 
				
			
			@ -1086,7 +1086,7 @@ CPhysical::ProcessShiftSectorList(CPtrList *lists)
 | 
			
		|||
	CPhysical *A, *B;
 | 
			
		||||
	CObject *Bobj;
 | 
			
		||||
	bool canshift;
 | 
			
		||||
	CVector center;
 | 
			
		||||
	CVUVECTOR center;
 | 
			
		||||
	float radius;
 | 
			
		||||
 | 
			
		||||
	int numCollisions;
 | 
			
		||||
| 
						 | 
				
			
			@ -1244,7 +1244,7 @@ CPhysical::ProcessCollisionSectorList_SimpleCar(CPtrList *lists)
 | 
			
		|||
{
 | 
			
		||||
	static CColPoint aColPoints[MAX_COLLISION_POINTS];
 | 
			
		||||
	float radius;
 | 
			
		||||
	CVector center;
 | 
			
		||||
	CVUVECTOR center;
 | 
			
		||||
	int listtype;
 | 
			
		||||
	CPhysical *A, *B;
 | 
			
		||||
	int numCollisions;
 | 
			
		||||
| 
						 | 
				
			
			@ -1406,7 +1406,7 @@ CPhysical::ProcessCollisionSectorList(CPtrList *lists)
 | 
			
		|||
{
 | 
			
		||||
	static CColPoint aColPoints[MAX_COLLISION_POINTS];
 | 
			
		||||
	float radius;
 | 
			
		||||
	CVector center;
 | 
			
		||||
	CVUVECTOR center;
 | 
			
		||||
	CPtrList *list;
 | 
			
		||||
	CPhysical *A, *B;
 | 
			
		||||
	CObject *Aobj, *Bobj;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,6 +22,8 @@ public:
 | 
			
		|||
			x = 1.0f;
 | 
			
		||||
	}
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
	// TODO: operator-
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void TransformPoint(CVuVector &out, const CMatrix &mat, const CVuVector &in);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -43,6 +43,9 @@ public:
 | 
			
		|||
	static CBaseModelInfo *GetModelInfo(int id){
 | 
			
		||||
		return ms_modelInfoPtrs[id];
 | 
			
		||||
	}
 | 
			
		||||
	static CColModel *GetColModel(int id){
 | 
			
		||||
		return ms_modelInfoPtrs[id]->GetColModel();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	static bool IsBoatModel(int32 id);
 | 
			
		||||
	static bool IsBikeModel(int32 id);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1011,27 +1011,30 @@ CPopulation::TestSafeForRealObject(CDummyObject *dummy)
 | 
			
		|||
{
 | 
			
		||||
	CPtrNode *ptrNode;
 | 
			
		||||
	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;
 | 
			
		||||
	int minY = CWorld::GetSectorIndexY(dummy->GetPosition().y - colRadius);
 | 
			
		||||
	int minY = CWorld::GetSectorIndexY(dummy->GetPosition().y - radius);
 | 
			
		||||
	if (minY < 0) minY = 0;
 | 
			
		||||
	int maxX = CWorld::GetSectorIndexX(dummy->GetPosition().x + colRadius);
 | 
			
		||||
	int maxX = CWorld::GetSectorIndexX(dummy->GetPosition().x + radius);
 | 
			
		||||
#ifdef FIX_BUGS
 | 
			
		||||
	if (maxX >= NUMSECTORS_X) maxX = NUMSECTORS_X - 1;
 | 
			
		||||
#else
 | 
			
		||||
	if (maxX >= NUMSECTORS_X) maxX = NUMSECTORS_X;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	int maxY = CWorld::GetSectorIndexY(dummy->GetPosition().y + colRadius);
 | 
			
		||||
	int maxY = CWorld::GetSectorIndexY(dummy->GetPosition().y + radius);
 | 
			
		||||
#ifdef FIX_BUGS
 | 
			
		||||
	if (maxY >= NUMSECTORS_Y) maxY = NUMSECTORS_Y - 1;
 | 
			
		||||
#else
 | 
			
		||||
	if (maxY >= NUMSECTORS_Y) maxY = NUMSECTORS_Y;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	float colRadius = dummy->GetBoundRadius();
 | 
			
		||||
	CVUVECTOR colCentre;
 | 
			
		||||
	dummy->GetBoundCentre(colCentre);
 | 
			
		||||
 | 
			
		||||
	static CColPoint aTempColPoints[MAX_COLLISION_POINTS];
 | 
			
		||||
 | 
			
		||||
	for (int curY = minY; curY <= maxY; curY++) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -117,7 +117,6 @@ public:
 | 
			
		|||
	                                  int32 offset, int32 len);
 | 
			
		||||
	static int32 ms_framePluginOffset;
 | 
			
		||||
 | 
			
		||||
	// Not actually used
 | 
			
		||||
	struct ClumpExt
 | 
			
		||||
	{
 | 
			
		||||
		ClumpVisibilityCB visibilityCB;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue