summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/core/Camera.cpp9
-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.cpp45
-rw-r--r--src/entities/Entity.h6
-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/render/Occlusion.cpp4
-rw-r--r--src/render/Shadows.cpp2
-rw-r--r--src/rw/VisibilityPlugins.h1
13 files changed, 57 insertions, 52 deletions
diff --git a/src/core/Camera.cpp b/src/core/Camera.cpp
index 50ac2b5b..baf31f04 100644
--- a/src/core/Camera.cpp
+++ b/src/core/Camera.cpp
@@ -4101,16 +4101,11 @@ CCamera::IsSphereVisible(const CVector &center, float radius, const CMatrix *mat
bool
CCamera::IsSphereVisible(const CVector &center, float radius)
{
- CMatrix mat = m_cameraMatrix;
- return IsSphereVisible(center, radius, &mat);
+ return IsSphereVisible(center, radius, &m_cameraMatrix);
}
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 538ff067..39ecb760 100644
--- a/src/core/Camera.h
+++ b/src/core/Camera.h
@@ -633,11 +633,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 dc83d96d..09913817 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;
}
// Clean up the reference from *pent -> 'this'
diff --git a/src/core/common.h b/src/core/common.h
index d39531cc..38ba7ea8 100644
--- a/src/core/common.h
+++ b/src/core/common.h
@@ -214,6 +214,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 4653c173..1545ce95 100644
--- a/src/entities/Entity.cpp
+++ b/src/entities/Entity.cpp
@@ -1,5 +1,6 @@
#include "common.h"
+#include "VuVector.h"
#include "General.h"
#include "RwHelper.h"
#include "ModelIndices.h"
@@ -70,7 +71,7 @@ CEntity::CEntity(void)
bDistanceFade = false;
m_flagE1 = false;
- m_flagE2 = false;
+ bDontCastShadowsOn = false;
bOffscreen = false;
bIsStaticWaitingForCollision = false;
bDontStream = false;
@@ -200,7 +201,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);
@@ -219,21 +220,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
@@ -372,7 +379,7 @@ CEntity::PreRender(void)
CVector pos = GetPosition();
CShadows::StoreShadowToBeRendered(SHADOWTYPE_DARK,
gpShadowPedTex, &pos,
- 0.4f, 0.0f, 0.0f, -0.4f,
+ 0.4f, 0.0f, 0.0f, 0.4f,
CTimeCycle::GetShadowStrength(),
CTimeCycle::GetShadowStrength(),
CTimeCycle::GetShadowStrength(),
@@ -418,9 +425,11 @@ 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
@@ -438,8 +447,7 @@ CEntity::IsVisibleComplex(void)
bool
CEntity::GetIsOnScreen(void)
{
- return TheCamera.IsSphereVisible(GetBoundCentre(), GetBoundRadius(),
- &TheCamera.GetCameraMatrix());
+ return TheCamera.IsSphereVisible(GetBoundCentre(), GetBoundRadius());
}
bool
@@ -455,7 +463,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;
@@ -610,7 +618,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
@@ -731,11 +739,6 @@ CEntity::PreRenderForGlassWindow(void)
bIsVisible = false;
}
-/*
-0x487A10 - SetAtomicAlphaCB
-0x4879E0 - SetClumpAlphaCB
-*/
-
RpMaterial*
SetAtomicAlphaCB(RpMaterial *material, void *data)
{
@@ -834,7 +837,7 @@ CEntity::SaveEntityFlags(uint8*& buf)
if (bDistanceFade) tmp |= BIT(7);
if (m_flagE1) tmp |= BIT(8);
- if (m_flagE2) tmp |= BIT(9);
+ if (bDontCastShadowsOn) tmp |= BIT(9);
if (bOffscreen) tmp |= BIT(10);
if (bIsStaticWaitingForCollision) tmp |= BIT(11);
if (bDontStream) tmp |= BIT(12);
@@ -890,7 +893,7 @@ CEntity::LoadEntityFlags(uint8*& buf)
bDistanceFade = !!(tmp & BIT(7));
m_flagE1 = !!(tmp & BIT(8));
- m_flagE2 = !!(tmp & BIT(9));
+ bDontCastShadowsOn = !!(tmp & BIT(9));
bOffscreen = !!(tmp & BIT(10));
bIsStaticWaitingForCollision = !!(tmp & BIT(11));
bDontStream = !!(tmp & BIT(12));
diff --git a/src/entities/Entity.h b/src/entities/Entity.h
index 2749e3f7..957ee3bf 100644
--- a/src/entities/Entity.h
+++ b/src/entities/Entity.h
@@ -84,7 +84,7 @@ public:
// flagsE
uint32 m_flagE1 : 1;
- uint32 m_flagE2 : 1;
+ uint32 bDontCastShadowsOn : 1; // Dont cast shadows on this object
uint32 bOffscreen : 1; // offscreen flag. This can only be trusted when it is set to true
uint32 bIsStaticWaitingForCollision : 1; // this is used by script created entities - they are static until the collision is loaded below them
uint32 bDontStream : 1; // tell the streaming not to stream me
@@ -148,11 +148,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 03fbad03..86ef0669 100644
--- a/src/entities/Physical.cpp
+++ b/src/entities/Physical.cpp
@@ -226,7 +226,7 @@ CPhysical::RemoveAndAdd(void)
CRect
CPhysical::GetBoundRect(void)
{
- CVector center;
+ CVUVECTOR center;
float radius;
GetBoundCentre(center);
radius = GetBoundRadius();
@@ -1259,7 +1259,7 @@ CPhysical::ProcessShiftSectorList(CPtrList *lists)
CPhysical *A, *B;
CObject *Bobj;
bool canshift;
- CVector center;
+ CVUVECTOR center;
float radius;
int numCollisions;
@@ -1418,7 +1418,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;
@@ -1585,7 +1585,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 30f4c015..f92a73ad 100644
--- a/src/modelinfo/ModelInfo.h
+++ b/src/modelinfo/ModelInfo.h
@@ -38,6 +38,9 @@ public:
return ms_modelInfoPtrs[id];
}
static CBaseModelInfo *GetModelInfo(const char *name, int minIndex, int maxIndex);
+ 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 3d4746d2..6a41b0c1 100644
--- a/src/peds/Population.cpp
+++ b/src/peds/Population.cpp
@@ -979,27 +979,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/render/Occlusion.cpp b/src/render/Occlusion.cpp
index 3ea5678c..ec7101a6 100644
--- a/src/render/Occlusion.cpp
+++ b/src/render/Occlusion.cpp
@@ -513,8 +513,8 @@ bool CEntity::IsEntityOccluded(void) {
}
if (COcclusion::aActiveOccluders[i].IsPointWithinOcclusionArea(coors.x, coors.y, 0.0f)) {
- CVector min = m_matrix * CModelInfo::GetModelInfo(GetModelIndex())->GetColModel()->boundingBox.min;
- CVector max = m_matrix * CModelInfo::GetModelInfo(GetModelIndex())->GetColModel()->boundingBox.max;
+ CVector min = m_matrix * CModelInfo::GetColModel(m_modelIndex)->boundingBox.min;
+ CVector max = m_matrix * CModelInfo::GetColModel(m_modelIndex)->boundingBox.max;
if (CalcScreenCoors(min, &coors) && !COcclusion::aActiveOccluders[i].IsPointWithinOcclusionArea(coors.x, coors.y, 0.0f)) continue;
if (CalcScreenCoors(CVector(max.x, max.y, min.z), &coors) && !COcclusion::aActiveOccluders[i].IsPointWithinOcclusionArea(coors.x, coors.y, 0.0f)) continue;
diff --git a/src/render/Shadows.cpp b/src/render/Shadows.cpp
index ae079821..dd87bff6 100644
--- a/src/render/Shadows.cpp
+++ b/src/render/Shadows.cpp
@@ -1406,7 +1406,7 @@ CShadows::CastShadowSectorList(CPtrList &PtrList, float fStartX, float fStartY,
{
pEntity->m_scanCode = CWorld::GetCurrentScanCode();
- if ( pEntity->bUsesCollision && !pEntity->m_flagE2 )
+ if ( pEntity->bUsesCollision && !pEntity->bDontCastShadowsOn)
{
if ( IsAreaVisible(pEntity->m_area) )
{
diff --git a/src/rw/VisibilityPlugins.h b/src/rw/VisibilityPlugins.h
index 9cdbc0c7..d375044b 100644
--- a/src/rw/VisibilityPlugins.h
+++ b/src/rw/VisibilityPlugins.h
@@ -127,7 +127,6 @@ public:
int32 offset, int32 len);
static int32 ms_framePluginOffset;
- // Not actually used
struct ClumpExt
{
ClumpVisibilityCB visibilityCB;