summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/core/Camera.cpp14
-rw-r--r--src/core/Camera.h6
-rw-r--r--src/core/References.cpp2
-rw-r--r--src/core/common.h6
-rw-r--r--src/entities/Entity.cpp32
-rw-r--r--src/entities/Entity.h4
-rw-r--r--src/entities/Physical.cpp8
-rw-r--r--src/math/VuVector.h2
-rw-r--r--src/modelinfo/ModelInfo.h3
-rw-r--r--src/peds/Population.cpp15
-rw-r--r--src/rw/VisibilityPlugins.h1
11 files changed, 55 insertions, 38 deletions
diff --git a/src/core/Camera.cpp b/src/core/Camera.cpp
index fd2d5eed..5c86ca99 100644
--- a/src/core/Camera.cpp
+++ b/src/core/Camera.cpp
@@ -3675,16 +3675,18 @@ CCamera::IsSphereVisible(const CVector &center, float radius, const CMatrix *mat
bool
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);
+#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 };
diff --git a/src/core/Camera.h b/src/core/Camera.h
index d7293e20..5e9d33b3 100644
--- a/src/core/Camera.h
+++ b/src/core/Camera.h
@@ -641,11 +641,7 @@ public:
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);
-#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);
diff --git a/src/core/References.cpp b/src/core/References.cpp
index 6b0c868c..b7782099 100644
--- a/src/core/References.cpp
+++ b/src/core/References.cpp
@@ -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
diff --git a/src/core/common.h b/src/core/common.h
index a8f19158..e5077611 100644
--- a/src/core/common.h
+++ b/src/core/common.h
@@ -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"
diff --git a/src/entities/Entity.cpp b/src/entities/Entity.cpp
index 208e6deb..9d5bf73c 100644
--- a/src/entities/Entity.cpp
+++ b/src/entities/Entity.cpp
@@ -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 &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
@@ -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
diff --git a/src/entities/Entity.h b/src/entities/Entity.h
index 7ee638d7..6174b61d 100644
--- a/src/entities/Entity.h
+++ b/src/entities/Entity.h
@@ -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 &center, float r);
+ bool GetIsTouching(CVUVECTOR const &center, float r);
bool GetIsOnScreen(void);
bool GetIsOnScreenComplex(void);
bool IsVisible(void);
diff --git a/src/entities/Physical.cpp b/src/entities/Physical.cpp
index a7e8beec..182ff46b 100644
--- a/src/entities/Physical.cpp
+++ b/src/entities/Physical.cpp
@@ -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;
diff --git a/src/math/VuVector.h b/src/math/VuVector.h
index 30d62cfc..41584095 100644
--- a/src/math/VuVector.h
+++ b/src/math/VuVector.h
@@ -22,6 +22,8 @@ public:
x = 1.0f;
}
*/
+
+ // TODO: operator-
};
void TransformPoint(CVuVector &out, const CMatrix &mat, const CVuVector &in);
diff --git a/src/modelinfo/ModelInfo.h b/src/modelinfo/ModelInfo.h
index 4fe1ebb0..4d24e78f 100644
--- a/src/modelinfo/ModelInfo.h
+++ b/src/modelinfo/ModelInfo.h
@@ -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);
diff --git a/src/peds/Population.cpp b/src/peds/Population.cpp
index 5bbb7c4b..906ee6e9 100644
--- a/src/peds/Population.cpp
+++ b/src/peds/Population.cpp
@@ -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++) {
diff --git a/src/rw/VisibilityPlugins.h b/src/rw/VisibilityPlugins.h
index f092de5a..5fb87765 100644
--- a/src/rw/VisibilityPlugins.h
+++ b/src/rw/VisibilityPlugins.h
@@ -117,7 +117,6 @@ public:
int32 offset, int32 len);
static int32 ms_framePluginOffset;
- // Not actually used
struct ClumpExt
{
ClumpVisibilityCB visibilityCB;