Skip to content
Permalink
Browse files
Realtime shadows for vehicles!
  • Loading branch information
CookiePLMonster committed Jul 24, 2014
1 parent 45c9fc9 commit 65f3a9b8dfc9c54013edfa4253535857ca360ebf
Showing with 351 additions and 86 deletions.
  1. +7 −3 VCS PC/Frontend.h
  2. +52 −0 VCS PC/Ped.cpp
  3. +1 −0 VCS PC/Ped.h
  4. +1 −0 VCS PC/Pools.cpp
  5. +5 −0 VCS PC/Pools.h
  6. +69 −57 VCS PC/RealTimeShadowMgr.cpp
  7. +16 −6 VCS PC/RealTimeShadowMgr.h
  8. +38 −10 VCS PC/Shadows.cpp
  9. +1 −0 VCS PC/Shadows.h
  10. +1 −1 VCS PC/StdAfx.h
  11. +14 −1 VCS PC/Tasks.cpp
  12. +78 −2 VCS PC/Tasks.h
  13. +16 −3 VCS PC/VCSPC.cpp
  14. +21 −0 VCS PC/Vehicle.cpp
  15. +31 −3 VCS PC/Vehicle.h
@@ -29,9 +29,13 @@
#define MENU_ACTIVE_G 0xEC #define MENU_ACTIVE_G 0xEC
#define MENU_ACTIVE_B 0x93 #define MENU_ACTIVE_B 0x93


#define MENU_LOCKED_R 0x06 #define MENU_LOCKED_R (MENU_INACTIVE_R*2/10)
#define MENU_LOCKED_G 0x33 #define MENU_LOCKED_G (MENU_INACTIVE_G*2/10)
#define MENU_LOCKED_B 0x33 #define MENU_LOCKED_B (MENU_INACTIVE_B*2/10)

#define MENU_ACTIVE_LOCKED_R (MENU_ACTIVE_R*2/10)
#define MENU_ACTIVE_LOCKED_G (MENU_ACTIVE_G*2/10)
#define MENU_ACTIVE_LOCKED_B (MENU_ACTIVE_B*2/10)


#define DEBUG_ORANGE_R 0xE7 #define DEBUG_ORANGE_R 0xE7
#define DEBUG_ORANGE_G 0x8D #define DEBUG_ORANGE_G 0x8D
@@ -4,6 +4,7 @@
#include "ModelInfo.h" #include "ModelInfo.h"
#include "Pools.h" #include "Pools.h"
#include "PcSave.h" #include "PcSave.h"
#include "RealTimeShadowMgr.h"


// Wrappers // Wrappers
WRAPPER void CPed::GiveWeapon(int WeaponType, int WeaponAmmo, bool bFlag) { WRAPARG(WeaponType); WRAPARG(WeaponAmmo); WRAPARG(bFlag); EAXJMP(0x5E6080); } WRAPPER void CPed::GiveWeapon(int WeaponType, int WeaponAmmo, bool bFlag) { WRAPARG(WeaponType); WRAPARG(WeaponAmmo); WRAPARG(bFlag); EAXJMP(0x5E6080); }
@@ -42,6 +43,57 @@ bool CPed::Load()
return true; return true;
} }


void CPed::RenderForShadow(RpClump* pClump)
{
RpClumpForAllAtomics(pClump, ShadowCameraRenderCB, nullptr);

if ( m_pWeaponObject )
{
RpHAnimHierarchy* pAnimHierarchy = GetAnimHierarchyFromSkinClump(pClump);
bool bHasParachute = weaponSlots[m_bActiveWeapon].m_eWeaponType == WEAPONTYPE_PARACHUTE;

RwFrame* pFrame = RpClumpGetFrame(reinterpret_cast<RpClump*>(m_pWeaponObject));
*RwFrameGetMatrix(pFrame) = RpHAnimHierarchyGetMatrixArray(pAnimHierarchy)[RpHAnimIDGetIndex(pAnimHierarchy, bHasParachute ? 3 : 24)];

if ( bHasParachute )
{
const RwV3d vecParachuteTranslation = { 0.1f, -0.15f, 0.0f };
const RwV3d vecParachuteRotation = { 0.0f, 1.0f, 0.0f };
RwMatrixTranslate(RwFrameGetMatrix(pFrame), &vecParachuteTranslation, rwCOMBINEPRECONCAT);
RwMatrixRotate(RwFrameGetMatrix(pFrame), &vecParachuteRotation, 90.0f, rwCOMBINEPRECONCAT);
}

RpGeometry* pWeaponGeometry = RpAtomicGetGeometry(GetFirstAtomic(reinterpret_cast<RpClump*>(m_pWeaponObject)));
RwUInt32 weaponGeometryFlags = RpGeometryGetFlags(pWeaponGeometry);
RpGeometrySetFlags(pWeaponGeometry, weaponGeometryFlags & ~(rpGEOMETRYTEXTURED|rpGEOMETRYPRELIT|
rpGEOMETRYLIGHT|rpGEOMETRYMODULATEMATERIALCOLOR|rpGEOMETRYTEXTURED2));

RwFrameUpdateObjects(pFrame);
//AtomicDefaultRenderCallBack(GetFirstAtomic(reinterpret_cast<RpClump*>(pPed->m_pWeaponObject)));
RpClumpRender(reinterpret_cast<RpClump*>(m_pWeaponObject));

// Dual weapons
if ( CWeaponInfo::GetWeaponInfo(weaponSlots[m_bActiveWeapon].m_eWeaponType, GetWeaponSkill())->hexFlags >> 11 & 1 )
{
*RwFrameGetMatrix(pFrame) = RpHAnimHierarchyGetMatrixArray(pAnimHierarchy)[RpHAnimIDGetIndex(pAnimHierarchy, 34)];

const RwV3d vecParachuteRotation = { 1.0f, 0.0f, 0.0f };
const RwV3d vecParachuteTranslation = { 0.04f, -0.05f, 0.0f };
RwMatrixRotate(RwFrameGetMatrix(pFrame), &vecParachuteRotation, 180.0f, rwCOMBINEPRECONCAT);
RwMatrixTranslate(RwFrameGetMatrix(pFrame), &vecParachuteTranslation, rwCOMBINEPRECONCAT);

RwFrameUpdateObjects(pFrame);
RpClumpRender(reinterpret_cast<RpClump*>(m_pWeaponObject));
}
RpGeometrySetFlags(pWeaponGeometry, weaponGeometryFlags);
}

// Render jetpack
auto* pJetPackTask = pPedIntelligence->GetTaskJetPack();
if ( pJetPackTask )
pJetPackTask->RenderJetPack(this);
}



CPed* CPedData::Initialise(CPed* pPed, short model) CPed* CPedData::Initialise(CPed* pPed, short model)
{ {
@@ -304,6 +304,7 @@ class NOVMT CPed : public CPhysical


long double GetCrosshairSize(); long double GetCrosshairSize();
void Remap(); void Remap();
void RenderForShadow(RpClump* pClump);
}; };


class CPedData class CPedData
@@ -6,6 +6,7 @@ CVehiclePool*& CPools::ms_pVehiclePool = *(CVehiclePool**)0xB74494;
CBuildingPool*& CPools::ms_pBuildingPool = *(CBuildingPool**)0xB74498; CBuildingPool*& CPools::ms_pBuildingPool = *(CBuildingPool**)0xB74498;
CDummyPool*& CPools::ms_pDummyPool = *(CDummyPool**)0xB744A0; CDummyPool*& CPools::ms_pDummyPool = *(CDummyPool**)0xB744A0;
CColModelPool*& CPools::ms_pColModelPool = *(CColModelPool**)0xB744A4; CColModelPool*& CPools::ms_pColModelPool = *(CColModelPool**)0xB744A4;
CTaskPool*& CPools::ms_pTaskPool = *(CTaskPool**)0xB744A8;


CEmpireBuildingDataPool* CPools::ms_pEmpireBuildingDataPool; CEmpireBuildingDataPool* CPools::ms_pEmpireBuildingDataPool;
CPedPoolAux* CPools::ms_pPedPoolAux; CPedPoolAux* CPools::ms_pPedPoolAux;
@@ -195,12 +195,14 @@ struct FakeClass : public T
#include "Vehicle.h" #include "Vehicle.h"
#include "Building.h" #include "Building.h"
#include "ModelInfo.h" #include "ModelInfo.h"
#include "Tasks.h"


typedef CPool<CPed, FakeClass<0x7C4,CPed>> CPedPool; typedef CPool<CPed, FakeClass<0x7C4,CPed>> CPedPool;
typedef CPool<CVehicle, FakeClass<0xA18,CVehicle>> CVehiclePool; typedef CPool<CVehicle, FakeClass<0xA18,CVehicle>> CVehiclePool;
typedef CPool<CBuilding> CBuildingPool; typedef CPool<CBuilding> CBuildingPool;
typedef CPool<CDummy> CDummyPool; typedef CPool<CDummy> CDummyPool;
typedef CPool<CColModel> CColModelPool; typedef CPool<CColModel> CColModelPool;
typedef CPool<CTask, FakeClass<128,CTask>> CTaskPool;


typedef CPool<CEmpireBuildingData> CEmpireBuildingDataPool; typedef CPool<CEmpireBuildingData> CEmpireBuildingDataPool;


@@ -214,6 +216,7 @@ class CPools
static CBuildingPool*& ms_pBuildingPool; static CBuildingPool*& ms_pBuildingPool;
static CDummyPool*& ms_pDummyPool; static CDummyPool*& ms_pDummyPool;
static CColModelPool*& ms_pColModelPool; static CColModelPool*& ms_pColModelPool;
static CTaskPool*& ms_pTaskPool;


// VCS PC class extension // VCS PC class extension
static CEmpireBuildingDataPool* ms_pEmpireBuildingDataPool; static CEmpireBuildingDataPool* ms_pEmpireBuildingDataPool;
@@ -230,6 +233,8 @@ class CPools
{ return ms_pDummyPool; } { return ms_pDummyPool; }
static inline CColModelPool* GetColModelPool() static inline CColModelPool* GetColModelPool()
{ return ms_pColModelPool; } { return ms_pColModelPool; }
static inline CTaskPool* GetTaskPool()
{ return ms_pTaskPool; }


static inline CEmpireBuildingDataPool* GetEmpireBuildingDataPool() static inline CEmpireBuildingDataPool* GetEmpireBuildingDataPool()
{ return ms_pEmpireBuildingDataPool; } { return ms_pEmpireBuildingDataPool; }
@@ -21,13 +21,18 @@ WRAPPER void CShadowCamera::InvertRaster() { EAXJMP(0x705660); }
WRAPPER void CRealTimeShadow::Destroy() { EAXJMP(0x705990); } WRAPPER void CRealTimeShadow::Destroy() { EAXJMP(0x705990); }
WRAPPER bool CRealTimeShadow::SetShadowedObject(CPhysical* pObject) { WRAPARG(pObject); EAXJMP(0x706520); } WRAPPER bool CRealTimeShadow::SetShadowedObject(CPhysical* pObject) { WRAPARG(pObject); EAXJMP(0x706520); }


CShadowCamera CRealTimeShadowManager::m_BlurCamera_Player; RpAtomic* ShadowCameraRenderCB(RpAtomic* pAtomic, void* pData)
CShadowCamera CRealTimeShadowManager::m_GradientCamera_Player;

static RpAtomic* ShadowCameraRenderCallback(RpAtomic* pAtomic, void* pData)
{ {
UNREFERENCED_PARAMETER(pData); UNREFERENCED_PARAMETER(pData);
return AtomicDefaultRenderCallBack(pAtomic);
RpGeometry* pGeometry = RpAtomicGetGeometry(pAtomic);
RwUInt32 geometryFlags = RpGeometryGetFlags(pGeometry);
RpGeometrySetFlags(pGeometry, geometryFlags & ~(rpGEOMETRYTEXTURED|rpGEOMETRYPRELIT|
rpGEOMETRYLIGHT|rpGEOMETRYMODULATEMATERIALCOLOR|rpGEOMETRYTEXTURED2));

auto* pOut = AtomicDefaultRenderCallBack(pAtomic);
RpGeometrySetFlags(pGeometry, geometryFlags);
return pOut;
} }


void CShadowCamera::ReInit() void CShadowCamera::ReInit()
@@ -42,61 +47,35 @@ void CShadowCamera::ReInit()
RwTextureSetRaster(m_pTexture, pNewRaster); RwTextureSetRaster(m_pTexture, pNewRaster);
} }


RwCamera* CShadowCamera::Update(RpClump* pClump, CPed* pPed) static RpAtomic* PushGeometryFlags(RpAtomic* pAtomic, void* pData)
{
std::pair<RwUInt32*, RwUInt32>** pGeometryStack = static_cast<std::pair<RwUInt32*, RwUInt32>**>(pData);
RpGeometry* pGeometry = RpAtomicGetGeometry(pAtomic);

*((*pGeometryStack)++) = std::make_pair(&RpGeometryGetFlags(pGeometry), RpGeometryGetFlags(pGeometry));
return pAtomic;
}

RwCamera* CShadowCamera::Update(RpClump* pClump, CPhysical* pEntity)
{ {
RwRGBA ClearColour = { 255, 255, 255, 0 }; RwRGBA ClearColour = { 255, 255, 255, 0 };
RwCameraClear(m_pCamera, &ClearColour, rwCAMERACLEARIMAGE|rwCAMERACLEARZ); RwCameraClear(m_pCamera, &ClearColour, rwCAMERACLEARIMAGE|rwCAMERACLEARZ);


if ( RwCameraBeginUpdate(m_pCamera ) ) if ( RwCameraBeginUpdate(m_pCamera ) )
{ {
RpGeometry* pGeometry = RpAtomicGetGeometry(GetFirstAtomic(pClump)); //std::pair<RwUInt32*, RwUInt32> GeometryFlagsPair[32];
auto geometryFlags = RpGeometryGetFlags(pGeometry);


RpGeometrySetFlags(pGeometry, geometryFlags & ~(rpGEOMETRYTEXTURED|rpGEOMETRYPRELIT| //RpGeometry* pGeometry = RpAtomicGetGeometry(GetFirstAtomic(pClump));
rpGEOMETRYLIGHT|rpGEOMETRYMODULATEMATERIALCOLOR|rpGEOMETRYTEXTURED2)); //RwUInt32 geometryFlags = RpGeometryGetFlags(pGeometry);
RpClumpForAllAtomics(pClump, ShadowCameraRenderCallback, nullptr);
RpGeometrySetFlags(pGeometry, geometryFlags);


if ( pPed ) //RpGeometrySetFlags(pGeometry, geometryFlags & ~(rpGEOMETRYTEXTURED|rpGEOMETRYPRELIT|
// rpGEOMETRYLIGHT|rpGEOMETRYMODULATEMATERIALCOLOR|rpGEOMETRYTEXTURED2));
if ( pEntity )
{ {
if ( pPed->m_pWeaponObject ) if ( pEntity->nType == 3 )
{ static_cast<CPed*>(pEntity)->RenderForShadow(pClump);
RpHAnimHierarchy* pAnimHierarchy = GetAnimHierarchyFromSkinClump(pClump); else if ( pEntity->nType == 2 )
bool bHasParachute = pPed->weaponSlots[pPed->m_bActiveWeapon].m_eWeaponType == WEAPONTYPE_PARACHUTE; static_cast<CVehicle*>(pEntity)->RenderForShadow(pClump);

RwFrame* pFrame = RpClumpGetFrame(reinterpret_cast<RpClump*>(pPed->m_pWeaponObject));
*RwFrameGetMatrix(pFrame) = RpHAnimHierarchyGetMatrixArray(pAnimHierarchy)[RpHAnimIDGetIndex(pAnimHierarchy, bHasParachute ? 3 : 24)];

if ( bHasParachute )
{
const RwV3d vecParachuteTranslation = { 0.1f, -0.15f, 0.0f };
const RwV3d vecParachuteRotation = { 0.0f, 1.0f, 0.0f };
RwMatrixTranslate(RwFrameGetMatrix(pFrame), &vecParachuteTranslation, rwCOMBINEPRECONCAT);
RwMatrixRotate(RwFrameGetMatrix(pFrame), &vecParachuteRotation, 90.0f, rwCOMBINEPRECONCAT);
}

RwFrameUpdateObjects(pFrame);
AtomicDefaultRenderCallBack(GetFirstAtomic(reinterpret_cast<RpClump*>(pPed->m_pWeaponObject)));

// Dual weapons
if ( CWeaponInfo::GetWeaponInfo(pPed->weaponSlots[pPed->m_bActiveWeapon].m_eWeaponType, pPed->GetWeaponSkill())->hexFlags >> 11 & 1 )
{
*RwFrameGetMatrix(pFrame) = RpHAnimHierarchyGetMatrixArray(pAnimHierarchy)[RpHAnimIDGetIndex(pAnimHierarchy, 34)];

const RwV3d vecParachuteRotation = { 1.0f, 0.0f, 0.0f };
const RwV3d vecParachuteTranslation = { 0.04f, -0.05f, 0.0f };
RwMatrixRotate(RwFrameGetMatrix(pFrame), &vecParachuteRotation, 180.0f, rwCOMBINEPRECONCAT);
RwMatrixTranslate(RwFrameGetMatrix(pFrame), &vecParachuteTranslation, rwCOMBINEPRECONCAT);

RwFrameUpdateObjects(pFrame);
AtomicDefaultRenderCallBack(GetFirstAtomic(reinterpret_cast<RpClump*>(pPed->m_pWeaponObject)));
}
}

// Render jetpack
auto* pJetPackTask = pPed->GetPedIntelligencePtr()->GetTaskJetPack();
if ( pJetPackTask )
pJetPackTask->RenderJetPack(pPed);
} }


InvertRaster(); InvertRaster();
@@ -116,18 +95,18 @@ RwTexture* CRealTimeShadow::Update()
if ( m_nRwObjectType == rpATOMIC ) if ( m_nRwObjectType == rpATOMIC )
m_Camera.Update(reinterpret_cast<RpAtomic*>(m_pEntity->m_pRwObject)); m_Camera.Update(reinterpret_cast<RpAtomic*>(m_pEntity->m_pRwObject));
else if ( m_nRwObjectType == rpCLUMP ) else if ( m_nRwObjectType == rpCLUMP )
m_Camera.Update(reinterpret_cast<RpClump*>(m_pEntity->m_pRwObject), m_pEntity->nType == 3 ? static_cast<CPed*>(m_pEntity) : nullptr); m_Camera.Update(reinterpret_cast<RpClump*>(m_pEntity->m_pRwObject), m_pEntity);


RwRaster* pRaster = RwCameraGetRaster(m_Camera.m_pCamera); RwRaster* pRaster = RwCameraGetRaster(m_Camera.m_pCamera);


if ( m_bDrawResample ) if ( m_bDrawResample )
pRaster = m_ResampledCamera.RasterResample(pRaster); pRaster = m_ResampledCamera.RasterResample(pRaster);


if ( m_dwBlurPasses ) if ( m_dwBlurPasses )
pRaster = m_bUsePlayerHelperCams ? CRealTimeShadowManager::m_BlurCamera_Player.RasterBlur(pRaster, m_dwBlurPasses) : g_realTimeShadowMan.m_BlurCamera.RasterBlur(pRaster, m_dwBlurPasses); pRaster = m_bUsePlayerHelperCams ? g_realTimeShadowMan.m_BlurCamera_Player.RasterBlur(pRaster, m_dwBlurPasses) : g_realTimeShadowMan.m_BlurCamera.RasterBlur(pRaster, m_dwBlurPasses);


if ( m_bDrawGradient ) if ( m_bDrawGradient )
pRaster = m_bUsePlayerHelperCams ? CRealTimeShadowManager::m_GradientCamera_Player.RasterGradient(pRaster) : g_realTimeShadowMan.m_GradientCamera.RasterGradient(pRaster); pRaster = m_bUsePlayerHelperCams ? g_realTimeShadowMan.m_GradientCamera_Player.RasterGradient(pRaster) : g_realTimeShadowMan.m_GradientCamera.RasterGradient(pRaster);


return m_bDrawResample ? m_ResampledCamera.m_pTexture : m_Camera.m_pTexture; return m_bDrawResample ? m_ResampledCamera.m_pTexture : m_Camera.m_pTexture;
} }
@@ -317,9 +296,10 @@ void CRealTimeShadowManager::GetRealTimeShadow(CPhysical* pEntity)


if ( pPlayerPed->pedFlags.bInVehicle ) if ( pPlayerPed->pedFlags.bInVehicle )
{ {
CVehicle* pVehicle = pPlayerPed->pVehicle; /*CVehicle* pVehicle = pPlayerPed->pVehicle;
if ( pVehicle ) if ( pVehicle )
bRender = pVehicle->GetLinearVelocity().MagnitudeSqr() <= 0.3f * 0.3f; bRender = pVehicle->GetLinearVelocity().MagnitudeSqr() <= 0.3f * 0.3f;*/
bIsPlayer = pPlayerPed->pVehicle == pEntity;
} }
} }


@@ -339,14 +319,28 @@ void CRealTimeShadowManager::GetRealTimeShadow(CPhysical* pEntity)
break; break;
} }
} }

// Debug
#ifdef DEVBUILD
if ( !pOutShadow )
{
static bool bLimitHit = false;

if ( !bLimitHit )
{
assert(!"Too many real time shadows at once, consider increasing limits.");
bLimitHit = true;
}
}
#endif
} }


if ( pOutShadow ) if ( pOutShadow )
{ {
pOutShadow->SetShadowedObject(pEntity); pOutShadow->SetShadowedObject(pEntity);
pOutShadow->ResetIntensity();
pEntity->SetRealTimeShadow(pOutShadow); pEntity->SetRealTimeShadow(pOutShadow);
pOutShadow->SetRenderedThisFrame(); pOutShadow->SetRenderedThisFrame();
pOutShadow->ResetIntensity();
} }
} }
} }
@@ -387,4 +381,22 @@ static StaticPatcher Patcher([](){
Memory::InjectHook(0x706BA0, &CRealTimeShadowManager::DoShadowThisFrame, PATCH_JUMP); Memory::InjectHook(0x706BA0, &CRealTimeShadowManager::DoShadowThisFrame, PATCH_JUMP);
Memory::InjectHook(0x706AC2, &CRealTimeShadowManager::ReInit); Memory::InjectHook(0x706AC2, &CRealTimeShadowManager::ReInit);
Memory::InjectHook(0x706B29, &CRealTimeShadow::Update); Memory::InjectHook(0x706B29, &CRealTimeShadow::Update);

// Increased shadows limit
Memory::Patch<const void*>(0x45D412, &g_realTimeShadowMan);
Memory::Patch<const void*>(0x53BE63, &g_realTimeShadowMan);
Memory::Patch<const void*>(0x53C63F, &g_realTimeShadowMan);
Memory::Patch<const void*>(0x53C9E5, &g_realTimeShadowMan);
Memory::Patch<const void*>(0x53EA09, &g_realTimeShadowMan);
Memory::Patch<const void*>(0x542487, &g_realTimeShadowMan);
Memory::Patch<const void*>(0x5B1F38, &g_realTimeShadowMan);
Memory::Patch<const void*>(0x5BA478, &g_realTimeShadowMan);
Memory::Patch<const void*>(0x5E68A4, &g_realTimeShadowMan);
//Memory::Patch<const void*>(0x854980, &g_realTimeShadowMan);
//Memory::Patch<const void*>(0x856AD0, &g_realTimeShadowMan);

Memory::Patch<const void*>(0x5BA137, &g_realTimeShadowMan.m_bNeedsReinit);

Memory::Patch<DWORD>(0x706AD4, NUM_MAX_REALTIME_SHADOWS);
Memory::Patch<DWORD>(0x706B80, NUM_MAX_REALTIME_SHADOWS);
}); });
@@ -1,7 +1,7 @@
#ifndef __REALTIMESHADOWMGR #ifndef __REALTIMESHADOWMGR
#define __REALTIMESHADOWMGR #define __REALTIMESHADOWMGR


#define NUM_MAX_REALTIME_SHADOWS 16 #define NUM_MAX_REALTIME_SHADOWS 32


struct tShadowQualitySettings struct tShadowQualitySettings
{ {
@@ -32,7 +32,7 @@ class CShadowCamera
RwRaster* RasterGradient(RwRaster* pRaster); RwRaster* RasterGradient(RwRaster* pRaster);
void InvertRaster(); void InvertRaster();


RwCamera* Update(RpClump* pClump, class CPed* pPed); RwCamera* Update(RpClump* pClump, CPhysical* pEntity);
void ReInit(); void ReInit();
}; };


@@ -60,6 +60,8 @@ class CRealTimeShadow
{ m_bRenderedThisFrame = true; } { m_bRenderedThisFrame = true; }
inline void ResetIntensity() inline void ResetIntensity()
{ m_nIntensity = 0; } { m_nIntensity = 0; }
inline void ForceFullIntensity()
{ m_nIntensity = 100; }
inline void ClearOwner() inline void ClearOwner()
{ m_pEntity = nullptr; } { m_pEntity = nullptr; }
//void* operator new(size_t size) //void* operator new(size_t size)
@@ -101,10 +103,16 @@ class CRealTimeShadowManager
CShadowCamera m_GradientCamera; CShadowCamera m_GradientCamera;


// VCS PC class extension // VCS PC class extension
static CShadowCamera m_BlurCamera_Player; CShadowCamera m_BlurCamera_Player;
static CShadowCamera m_GradientCamera_Player; CShadowCamera m_GradientCamera_Player;


public: public:
CRealTimeShadowManager()
: m_bInitialised(false), m_bNeedsReinit(false), m_bPlayerHelperCamsInUse(false)
{
memset(m_pShadows, 0, sizeof(m_pShadows));
}

void ResetForChangedSettings() void ResetForChangedSettings()
{ for ( int i = 0; i < NUM_MAX_REALTIME_SHADOWS; i++ ) ReturnRealTimeShadow(m_pShadows[i]); { for ( int i = 0; i < NUM_MAX_REALTIME_SHADOWS; i++ ) ReturnRealTimeShadow(m_pShadows[i]);
Exit(); Init(); } Exit(); Init(); }
@@ -117,9 +125,11 @@ class CRealTimeShadowManager
void ReInit(); void ReInit();
}; };


extern CRealTimeShadowManager& g_realTimeShadowMan; RpAtomic* ShadowCameraRenderCB(RpAtomic* pAtomic, void* pData);

extern CRealTimeShadowManager g_realTimeShadowMan;


static_assert(sizeof(CRealTimeShadow) == 0x4C, "Wrong size: CRealTimeShadow"); static_assert(sizeof(CRealTimeShadow) == 0x4C, "Wrong size: CRealTimeShadow");
static_assert(sizeof(CRealTimeShadowManager) == 0x54, "Wrong size: CRealTimeShadowManager"); //static_assert(sizeof(CRealTimeShadowManager) == 0x54, "Wrong size: CRealTimeShadowManager");


#endif #endif

0 comments on commit 65f3a9b

Please sign in to comment.