2019-05-15 10:52:37 -04:00
|
|
|
#include "common.h"
|
2020-04-17 09:31:11 -04:00
|
|
|
|
2019-10-29 19:12:58 -04:00
|
|
|
#include "General.h"
|
2019-05-15 10:52:37 -04:00
|
|
|
#include "Camera.h"
|
2021-01-24 17:24:41 -05:00
|
|
|
#include "Renderer.h"
|
2019-05-15 10:52:37 -04:00
|
|
|
#include "ModelInfo.h"
|
2020-08-18 04:58:15 -04:00
|
|
|
#include "custompipes.h"
|
2019-05-15 10:52:37 -04:00
|
|
|
|
|
|
|
void
|
|
|
|
CSimpleModelInfo::DeleteRwObject(void)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
RwFrame *f;
|
|
|
|
for(i = 0; i < m_numAtomics; i++)
|
|
|
|
if(m_atomics[i]){
|
|
|
|
f = RpAtomicGetFrame(m_atomics[i]);
|
|
|
|
RpAtomicDestroy(m_atomics[i]);
|
|
|
|
RwFrameDestroy(f);
|
|
|
|
m_atomics[i] = nil;
|
|
|
|
RemoveTexDictionaryRef();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
RwObject*
|
|
|
|
CSimpleModelInfo::CreateInstance(void)
|
|
|
|
{
|
|
|
|
RpAtomic *atomic;
|
|
|
|
if(m_atomics[0] == nil)
|
|
|
|
return nil;
|
|
|
|
atomic = RpAtomicClone(m_atomics[0]);
|
|
|
|
RpAtomicSetFrame(atomic, RwFrameCreate());
|
|
|
|
return (RwObject*)atomic;
|
|
|
|
}
|
|
|
|
|
|
|
|
RwObject*
|
|
|
|
CSimpleModelInfo::CreateInstance(RwMatrix *matrix)
|
|
|
|
{
|
|
|
|
RpAtomic *atomic;
|
|
|
|
RwFrame *frame;
|
|
|
|
|
|
|
|
if(m_atomics[0] == nil)
|
|
|
|
return nil;
|
|
|
|
atomic = RpAtomicClone(m_atomics[0]);
|
|
|
|
frame = RwFrameCreate();
|
|
|
|
*RwFrameGetMatrix(frame) = *matrix;
|
|
|
|
RpAtomicSetFrame(atomic, frame);
|
|
|
|
return (RwObject*)atomic;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CSimpleModelInfo::Init(void)
|
|
|
|
{
|
|
|
|
m_atomics[0] = nil;
|
|
|
|
m_atomics[1] = nil;
|
|
|
|
m_atomics[2] = nil;
|
|
|
|
m_numAtomics = 0;
|
2019-06-17 04:30:02 -04:00
|
|
|
m_firstDamaged = 0;
|
2019-05-15 10:52:37 -04:00
|
|
|
m_normalCull = 0;
|
|
|
|
m_isDamaged = 0;
|
|
|
|
m_isBigBuilding = 0;
|
|
|
|
m_noFade = 0;
|
|
|
|
m_drawLast = 0;
|
|
|
|
m_additive = 0;
|
|
|
|
m_isSubway = 0;
|
|
|
|
m_ignoreLight = 0;
|
|
|
|
m_noZwrite = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CSimpleModelInfo::SetAtomic(int n, RpAtomic *atomic)
|
|
|
|
{
|
|
|
|
AddTexDictionaryRef();
|
|
|
|
m_atomics[n] = atomic;
|
|
|
|
if(m_ignoreLight){
|
|
|
|
RpGeometry *geo = RpAtomicGetGeometry(atomic);
|
|
|
|
RpGeometrySetFlags(geo, RpGeometryGetFlags(geo) & ~rpGEOMETRYLIGHT);
|
|
|
|
}
|
2020-08-18 04:58:15 -04:00
|
|
|
|
|
|
|
#ifdef EXTENDED_PIPELINES
|
|
|
|
CustomPipes::AttachWorldPipe(atomic);
|
|
|
|
#endif
|
2019-05-15 10:52:37 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CSimpleModelInfo::SetLodDistances(float *dist)
|
|
|
|
{
|
|
|
|
m_lodDistances[0] = dist[0];
|
|
|
|
m_lodDistances[1] = dist[1];
|
|
|
|
m_lodDistances[2] = dist[2];
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CSimpleModelInfo::IncreaseAlpha(void)
|
|
|
|
{
|
|
|
|
if(m_alpha >= 0xEF)
|
|
|
|
m_alpha = 0xFF;
|
|
|
|
else
|
|
|
|
m_alpha += 0x10;
|
|
|
|
}
|
|
|
|
|
2020-05-05 07:02:42 -04:00
|
|
|
float
|
|
|
|
CSimpleModelInfo::GetLodDistance(int i)
|
|
|
|
{
|
|
|
|
return m_lodDistances[i] * TheCamera.LODDistMultiplier;
|
|
|
|
}
|
|
|
|
|
2019-05-15 10:52:37 -04:00
|
|
|
float
|
|
|
|
CSimpleModelInfo::GetNearDistance(void)
|
|
|
|
{
|
|
|
|
return m_lodDistances[2] * TheCamera.LODDistMultiplier;
|
|
|
|
}
|
|
|
|
|
|
|
|
float
|
|
|
|
CSimpleModelInfo::GetLargestLodDistance(void)
|
|
|
|
{
|
|
|
|
float d;
|
2019-06-17 04:30:02 -04:00
|
|
|
if(m_firstDamaged == 0 || m_isDamaged)
|
2019-05-15 10:52:37 -04:00
|
|
|
d = m_lodDistances[m_numAtomics-1];
|
2019-06-17 04:30:02 -04:00
|
|
|
else
|
|
|
|
d = m_lodDistances[m_firstDamaged-1];
|
2019-05-15 10:52:37 -04:00
|
|
|
return d * TheCamera.LODDistMultiplier;
|
|
|
|
}
|
|
|
|
|
|
|
|
RpAtomic*
|
|
|
|
CSimpleModelInfo::GetAtomicFromDistance(float dist)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
i = 0;
|
|
|
|
if(m_isDamaged)
|
2019-06-17 04:30:02 -04:00
|
|
|
i = m_firstDamaged;
|
2019-05-15 10:52:37 -04:00
|
|
|
for(; i < m_numAtomics; i++)
|
2020-05-05 07:02:42 -04:00
|
|
|
if(dist < m_lodDistances[i] * TheCamera.LODDistMultiplier)
|
2019-05-15 10:52:37 -04:00
|
|
|
return m_atomics[i];
|
|
|
|
return nil;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CSimpleModelInfo::FindRelatedModel(void)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
CBaseModelInfo *mi;
|
|
|
|
for(i = 0; i < MODELINFOSIZE; i++){
|
|
|
|
mi = CModelInfo::GetModelInfo(i);
|
|
|
|
if(mi && mi != this &&
|
2021-01-08 14:50:59 -05:00
|
|
|
!CGeneral::faststrcmp(GetModelName()+3, mi->GetModelName()+3)){
|
2019-05-15 10:52:37 -04:00
|
|
|
assert(mi->IsSimple());
|
|
|
|
this->SetRelatedModel((CSimpleModelInfo*)mi);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CSimpleModelInfo::SetupBigBuilding(void)
|
|
|
|
{
|
|
|
|
CSimpleModelInfo *related;
|
2020-05-10 11:09:57 -04:00
|
|
|
if(m_lodDistances[0] > LOD_DISTANCE && GetRelatedModel() == nil){
|
2019-05-15 10:52:37 -04:00
|
|
|
m_isBigBuilding = 1;
|
|
|
|
FindRelatedModel();
|
|
|
|
related = GetRelatedModel();
|
|
|
|
if(related)
|
|
|
|
m_lodDistances[2] = related->GetLargestLodDistance()/TheCamera.LODDistMultiplier;
|
|
|
|
else
|
2020-05-31 11:45:26 -04:00
|
|
|
#ifdef FIX_BUGS
|
2020-05-31 16:35:29 -04:00
|
|
|
if(toupper(m_name[0]) == 'L' && toupper(m_name[1]) == 'O' && toupper(m_name[2]) == 'D')
|
2019-05-15 10:52:37 -04:00
|
|
|
m_lodDistances[2] = 100.0f;
|
2020-05-31 11:45:26 -04:00
|
|
|
else
|
|
|
|
m_lodDistances[2] = 0.0f;
|
|
|
|
#else
|
|
|
|
m_lodDistances[2] = 100.0f;
|
|
|
|
#endif
|
2019-05-15 10:52:37 -04:00
|
|
|
}
|
|
|
|
}
|