mirror of
				https://github.com/halpz/re3.git
				synced 2025-11-04 04:14:49 +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
 | 
					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