2019-05-15 16:52:37 +02:00
|
|
|
#include "common.h"
|
2020-04-17 15:31:11 +02:00
|
|
|
|
2019-06-17 10:30:02 +02:00
|
|
|
#include "main.h"
|
2020-04-23 22:25:18 +02:00
|
|
|
#include "RwHelper.h"
|
2019-06-30 12:53:39 +02:00
|
|
|
#include "Lights.h"
|
2019-06-12 21:17:02 +02:00
|
|
|
#include "PointLights.h"
|
|
|
|
#include "RpAnimBlend.h"
|
|
|
|
#include "AnimBlendClumpData.h"
|
2020-04-23 22:25:18 +02:00
|
|
|
#include "Bones.h"
|
2019-06-12 21:17:02 +02:00
|
|
|
#include "Renderer.h"
|
|
|
|
#include "ModelIndices.h"
|
|
|
|
#include "Shadows.h"
|
2019-06-30 12:53:39 +02:00
|
|
|
#include "Timecycle.h"
|
2020-07-29 11:17:53 +02:00
|
|
|
#include "CutsceneShadow.h"
|
2019-05-15 16:52:37 +02:00
|
|
|
#include "CutsceneObject.h"
|
2020-07-29 11:17:53 +02:00
|
|
|
#include "ModelIndices.h"
|
|
|
|
#include "RpAnimBlend.h"
|
|
|
|
|
2019-06-12 20:07:37 +02:00
|
|
|
|
|
|
|
CCutsceneObject::CCutsceneObject(void)
|
|
|
|
{
|
2020-04-30 15:45:45 +02:00
|
|
|
SetStatus(STATUS_SIMPLE);
|
2019-06-12 20:07:37 +02:00
|
|
|
bUsesCollision = false;
|
2019-06-27 14:17:42 +02:00
|
|
|
bStreamingDontDelete = true;
|
2019-06-12 20:07:37 +02:00
|
|
|
ObjectCreatedBy = CUTSCENE_OBJECT;
|
|
|
|
m_fMass = 1.0f;
|
|
|
|
m_fTurnMass = 1.0f;
|
2020-07-29 11:17:53 +02:00
|
|
|
|
2020-07-31 20:21:58 +02:00
|
|
|
m_pAttachTo = nil;
|
|
|
|
m_pAttachmentObject = nil;
|
|
|
|
m_pShadow = nil;
|
2020-07-29 11:17:53 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
CCutsceneObject::~CCutsceneObject(void)
|
|
|
|
{
|
|
|
|
if ( m_pShadow )
|
|
|
|
{
|
|
|
|
delete m_pShadow;
|
2020-07-31 20:21:58 +02:00
|
|
|
m_pShadow = nil;
|
2020-07-29 11:17:53 +02:00
|
|
|
}
|
2019-06-12 20:07:37 +02:00
|
|
|
}
|
2019-06-12 21:17:02 +02:00
|
|
|
|
|
|
|
void
|
|
|
|
CCutsceneObject::SetModelIndex(uint32 id)
|
|
|
|
{
|
|
|
|
CEntity::SetModelIndex(id);
|
|
|
|
assert(RwObjectGetType(m_rwObject) == rpCLUMP);
|
|
|
|
RpAnimBlendClumpInit((RpClump*)m_rwObject);
|
|
|
|
(*RPANIMBLENDCLUMPDATA(m_rwObject))->velocity = &m_vecMoveSpeed;
|
|
|
|
(*RPANIMBLENDCLUMPDATA(m_rwObject))->frames[0].flag |= AnimBlendFrameData::VELOCITY_EXTRACTION_3D;
|
|
|
|
}
|
|
|
|
|
2020-07-29 11:17:53 +02:00
|
|
|
void
|
|
|
|
CCutsceneObject::CreateShadow(void)
|
|
|
|
{
|
|
|
|
if ( IsPedModel(GetModelIndex()) )
|
|
|
|
{
|
|
|
|
m_pShadow = new CCutsceneShadow();
|
|
|
|
if (!m_pShadow->IsInitialized())
|
|
|
|
m_pShadow->Create(m_rwObject, 6, true, 4, true);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-06-12 21:17:02 +02:00
|
|
|
void
|
|
|
|
CCutsceneObject::ProcessControl(void)
|
|
|
|
{
|
|
|
|
CPhysical::ProcessControl();
|
|
|
|
|
2020-07-29 11:17:53 +02:00
|
|
|
if ( m_pAttachTo )
|
|
|
|
{
|
|
|
|
if ( m_pAttachmentObject )
|
|
|
|
GetMatrix() = CMatrix((RwMatrix*)m_pAttachTo);
|
|
|
|
else
|
|
|
|
GetMatrix() = CMatrix(RwFrameGetLTM((RwFrame*)m_pAttachTo));
|
|
|
|
}
|
2019-06-12 21:17:02 +02:00
|
|
|
else
|
2020-07-29 11:17:53 +02:00
|
|
|
{
|
|
|
|
if(CTimer::GetTimeStep() < 1/100.0f)
|
|
|
|
m_vecMoveSpeed *= 100.0f;
|
|
|
|
else
|
|
|
|
m_vecMoveSpeed *= 1.0f/CTimer::GetTimeStep();
|
|
|
|
|
|
|
|
ApplyMoveSpeed();
|
|
|
|
}
|
2020-04-23 22:25:18 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
static RpMaterial*
|
|
|
|
MaterialSetAlpha(RpMaterial *material, void *data)
|
|
|
|
{
|
|
|
|
((RwRGBA*)RpMaterialGetColor(material))->alpha = (uint8)(uintptr)data;
|
|
|
|
return material;
|
2019-06-12 21:17:02 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CCutsceneObject::PreRender(void)
|
|
|
|
{
|
2020-07-29 11:17:53 +02:00
|
|
|
if ( m_pAttachTo )
|
|
|
|
{
|
|
|
|
if ( m_pAttachmentObject )
|
|
|
|
{
|
|
|
|
m_pAttachmentObject->UpdateRpHAnim();
|
|
|
|
GetMatrix() = CMatrix((RwMatrix*)m_pAttachTo);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
GetMatrix() = CMatrix(RwFrameGetLTM((RwFrame*)m_pAttachTo));
|
|
|
|
|
|
|
|
if ( RwObjectGetType(m_rwObject) == rpCLUMP && IsClumpSkinned(GetClump()) )
|
|
|
|
{
|
|
|
|
RpAtomic *atomic = GetFirstAtomic(GetClump());
|
|
|
|
atomic->boundingSphere.center = (*RPANIMBLENDCLUMPDATA(GetClump()))->frames[0].hanimFrame->t;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ( RwObjectGetType(m_rwObject) == rpCLUMP )
|
|
|
|
UpdateRpHAnim();
|
|
|
|
|
|
|
|
if(IsPedModel(GetModelIndex()))
|
|
|
|
{
|
2020-07-31 20:21:58 +02:00
|
|
|
if ( m_pShadow == nil )
|
2020-07-29 11:17:53 +02:00
|
|
|
{
|
|
|
|
CShadows::StoreShadowForPedObject(this,
|
|
|
|
CTimeCycle::m_fShadowDisplacementX[CTimeCycle::m_CurrentStoredValue],
|
|
|
|
CTimeCycle::m_fShadowDisplacementY[CTimeCycle::m_CurrentStoredValue],
|
|
|
|
CTimeCycle::m_fShadowFrontX[CTimeCycle::m_CurrentStoredValue],
|
|
|
|
CTimeCycle::m_fShadowFrontY[CTimeCycle::m_CurrentStoredValue],
|
|
|
|
CTimeCycle::m_fShadowSideX[CTimeCycle::m_CurrentStoredValue],
|
|
|
|
CTimeCycle::m_fShadowSideY[CTimeCycle::m_CurrentStoredValue]);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if ( m_pShadow->IsInitialized() )
|
|
|
|
m_pShadow->UpdateForCutscene();
|
|
|
|
|
|
|
|
CShadows::StoreShadowForCutscenePedObject(this,
|
|
|
|
CTimeCycle::m_fShadowDisplacementX[CTimeCycle::m_CurrentStoredValue],
|
|
|
|
CTimeCycle::m_fShadowDisplacementY[CTimeCycle::m_CurrentStoredValue],
|
|
|
|
CTimeCycle::m_fShadowFrontX[CTimeCycle::m_CurrentStoredValue],
|
|
|
|
CTimeCycle::m_fShadowFrontY[CTimeCycle::m_CurrentStoredValue],
|
|
|
|
CTimeCycle::m_fShadowSideX[CTimeCycle::m_CurrentStoredValue],
|
|
|
|
CTimeCycle::m_fShadowSideY[CTimeCycle::m_CurrentStoredValue]);
|
|
|
|
}
|
|
|
|
|
2020-04-23 22:25:18 +02:00
|
|
|
// For some reason xbox/android limbs are transparent here...
|
|
|
|
RpGeometry *geometry = RpAtomicGetGeometry(GetFirstAtomic(GetClump()));
|
|
|
|
RpGeometrySetFlags(geometry, RpGeometryGetFlags(geometry) | rpGEOMETRYMODULATEMATERIALCOLOR);
|
|
|
|
RpGeometryForAllMaterials(geometry, MaterialSetAlpha, (void*)255);
|
|
|
|
}
|
2019-06-12 21:17:02 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CCutsceneObject::Render(void)
|
|
|
|
{
|
2020-07-29 11:17:53 +02:00
|
|
|
RwRenderStateSet(rwRENDERSTATECULLMODE, (void *)rwCULLMODECULLNONE);
|
2019-06-12 21:17:02 +02:00
|
|
|
CObject::Render();
|
2020-07-29 11:17:53 +02:00
|
|
|
RwRenderStateSet(rwRENDERSTATECULLMODE, (void *)rwCULLMODECULLBACK);
|
2019-06-12 21:17:02 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
CCutsceneObject::SetupLighting(void)
|
|
|
|
{
|
|
|
|
ActivateDirectional();
|
|
|
|
SetAmbientColoursForPedsCarsAndObjects();
|
|
|
|
|
|
|
|
if(bRenderScorched){
|
|
|
|
WorldReplaceNormalLightsWithScorched(Scene.world, 0.1f);
|
|
|
|
}else{
|
|
|
|
CVector coors = GetPosition();
|
|
|
|
float lighting = CPointLights::GenerateLightsAffectingObject(&coors);
|
2020-07-29 11:17:53 +02:00
|
|
|
if(lighting != 1.0f){
|
2019-06-12 21:17:02 +02:00
|
|
|
SetAmbientAndDirectionalColours(lighting);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
CCutsceneObject::RemoveLighting(bool reset)
|
|
|
|
{
|
|
|
|
CRenderer::RemoveVehiclePedLights(this, reset);
|
|
|
|
}
|