implemented most of streamed collisions and big buildings

This commit is contained in:
aap
2020-05-05 13:02:42 +02:00
parent 84c9484e55
commit b44df26d3e
41 changed files with 1346 additions and 95 deletions

View File

@ -6,7 +6,7 @@
#include "BaseModelInfo.h"
CBaseModelInfo::CBaseModelInfo(ModeInfoType type)
CBaseModelInfo::CBaseModelInfo(ModelInfoType type)
{
m_colModel = nil;
m_twodEffects = nil;
@ -15,7 +15,7 @@ CBaseModelInfo::CBaseModelInfo(ModeInfoType type)
m_txdSlot = -1;
m_type = type;
m_num2dEffects = 0;
m_freeCol = false;
m_bOwnsColModel = false;
}
void
@ -31,7 +31,7 @@ CBaseModelInfo::Shutdown(void)
void
CBaseModelInfo::DeleteCollisionModel(void)
{
if(m_colModel && m_freeCol){
if(m_colModel && m_bOwnsColModel){
if(m_colModel)
delete m_colModel;
m_colModel = nil;

View File

@ -4,7 +4,7 @@
#define MAX_MODEL_NAME (24)
enum ModeInfoType : uint8
enum ModelInfoType : uint8
{
MITYPE_NA = 0,
MITYPE_SIMPLE = 1,
@ -15,7 +15,7 @@ enum ModeInfoType : uint8
MITYPE_PED = 6,
MITYPE_XTRACOMPS = 7,
};
static_assert(sizeof(ModeInfoType) == 1, "ModeInfoType: error");
static_assert(sizeof(ModelInfoType) == 1, "ModeInfoType: error");
class C2dEffect;
@ -30,11 +30,11 @@ protected:
public:
uint16 m_refCount;
int16 m_txdSlot;
ModeInfoType m_type;
ModelInfoType m_type;
uint8 m_num2dEffects;
bool m_freeCol;
bool m_bOwnsColModel;
CBaseModelInfo(ModeInfoType type);
CBaseModelInfo(ModelInfoType type);
virtual ~CBaseModelInfo() {}
virtual void Shutdown(void);
virtual void DeleteRwObject(void) = 0;
@ -48,8 +48,8 @@ public:
}
char *GetName(void) { return m_name; }
void SetName(const char *name) { strncpy(m_name, name, 24); }
void SetColModel(CColModel *col, bool free = false){
m_colModel = col; m_freeCol = free; }
void SetColModel(CColModel *col, bool owns = false){
m_colModel = col; m_bOwnsColModel = owns; }
CColModel *GetColModel(void) { return m_colModel; }
void DeleteCollisionModel(void);
void ClearTexDictionary(void) { m_txdSlot = -1; }

View File

@ -32,7 +32,7 @@ public:
RpClump *m_clump;
CClumpModelInfo(void) : CBaseModelInfo(MITYPE_CLUMP) {}
CClumpModelInfo(ModeInfoType id) : CBaseModelInfo(id) {}
CClumpModelInfo(ModelInfoType id) : CBaseModelInfo(id) {}
~CClumpModelInfo() {}
void DeleteRwObject(void);
RwObject *CreateInstance(void);

View File

@ -200,6 +200,20 @@ CModelInfo::GetModelInfo(const char *name, int *id)
return nil;
}
#ifdef MIAMI
CBaseModelInfo*
CModelInfo::GetModelInfo(const char *name, int minIndex, int maxIndex)
{
CBaseModelInfo *modelinfo;
for(int i = minIndex; i <= maxIndex; i++){
modelinfo = CModelInfo::ms_modelInfoPtrs[i];
if(modelinfo && !CGeneral::faststricmp(modelinfo->GetName(), name))
return modelinfo;
}
return nil;
}
#endif
bool
CModelInfo::IsBoatModel(int32 id)
{
@ -214,6 +228,7 @@ CModelInfo::IsBikeModel(int32 id)
((CVehicleModelInfo*)GetModelInfo(id))->m_vehicleType == VEHICLE_TYPE_BIKE;
}
#ifndef MIAMI
void
CModelInfo::RemoveColModelsFromOtherLevels(eLevelName level)
{
@ -230,6 +245,7 @@ CModelInfo::RemoveColModelsFromOtherLevels(eLevelName level)
}
}
}
#endif
void
CModelInfo::ConstructMloClumps()

View File

@ -42,6 +42,9 @@ public:
static CBaseModelInfo *GetModelInfo(int id){
return ms_modelInfoPtrs[id];
}
#ifdef MIAMI
static CBaseModelInfo *GetModelInfo(const char *name, int minIndex, int maxIndex);
#endif
static bool IsBoatModel(int32 id);
static bool IsBikeModel(int32 id);

View File

@ -94,6 +94,12 @@ CSimpleModelInfo::IncreaseAlpha(void)
m_alpha += 0x10;
}
float
CSimpleModelInfo::GetLodDistance(int i)
{
return m_lodDistances[i] * TheCamera.LODDistMultiplier;
}
float
CSimpleModelInfo::GetNearDistance(void)
{
@ -119,11 +125,19 @@ CSimpleModelInfo::GetAtomicFromDistance(float dist)
if(m_isDamaged)
i = m_firstDamaged;
for(; i < m_numAtomics; i++)
if(dist < m_lodDistances[i] *TheCamera.LODDistMultiplier)
if(dist < m_lodDistances[i] * TheCamera.LODDistMultiplier)
return m_atomics[i];
return nil;
}
RpAtomic*
CSimpleModelInfo::GetFirstAtomicFromDistance(float dist)
{
if(dist < m_lodDistances[0] * TheCamera.LODDistMultiplier)
return m_atomics[0];
return nil;
}
void
CSimpleModelInfo::FindRelatedModel(void)
{

View File

@ -25,7 +25,7 @@ public:
uint16 m_noZwrite : 1;
CSimpleModelInfo(void) : CBaseModelInfo(MITYPE_SIMPLE) {}
CSimpleModelInfo(ModeInfoType id) : CBaseModelInfo(id) {}
CSimpleModelInfo(ModelInfoType id) : CBaseModelInfo(id) {}
~CSimpleModelInfo() {}
void DeleteRwObject(void);
RwObject *CreateInstance(void);
@ -36,10 +36,13 @@ public:
void IncreaseAlpha(void);
void SetAtomic(int n, RpAtomic *atomic);
void SetLodDistances(float *dist);
float GetLodDistance(int i) { return m_lodDistances[i]; }
float GetLodDistance(int i);
float GetNearDistance(void);
float GetLargestLodDistance(void);
RpAtomic *GetAtomicFromDistance(float dist);
#ifdef MIAMI
RpAtomic *GetFirstAtomicFromDistance(float dist); // inline
#endif
void FindRelatedModel(void);
void SetupBigBuilding(void);