Skip to content
Permalink
Browse files
Improved shadows
  • Loading branch information
CookiePLMonster committed Jul 25, 2014
1 parent ada2054 commit db03e91fb56f2344745e3a772c7b50ab4dc3f3a9
Showing with 141 additions and 17 deletions.
  1. +130 −12 VCS PC/RealTimeShadowMgr.cpp
  2. +3 −3 VCS PC/RealTimeShadowMgr.h
  3. +6 −2 VCS PC/Shadows.cpp
  4. +2 −0 VCS PC/Shadows.h
@@ -1,6 +1,7 @@
#include "StdAfx.h" #include "StdAfx.h"
#include "RealTimeShadowMgr.h" #include "RealTimeShadowMgr.h"


#include "Camera.h"
#include "Shadows.h" #include "Shadows.h"
#include "Ped.h" #include "Ped.h"
#include "World.h" #include "World.h"
@@ -24,14 +25,17 @@ RpAtomic* ShadowCameraRenderCB(RpAtomic* pAtomic, void* pData)
{ {
UNREFERENCED_PARAMETER(pData); UNREFERENCED_PARAMETER(pData);


RpGeometry* pGeometry = RpAtomicGetGeometry(pAtomic); if ( RpAtomicGetFlags(pAtomic) & rpATOMICRENDER )
RwUInt32 geometryFlags = RpGeometryGetFlags(pGeometry); {
RpGeometrySetFlags(pGeometry, geometryFlags & ~(rpGEOMETRYTEXTURED|rpGEOMETRYPRELIT| RpGeometry* pGeometry = RpAtomicGetGeometry(pAtomic);
rpGEOMETRYLIGHT|rpGEOMETRYMODULATEMATERIALCOLOR|rpGEOMETRYTEXTURED2)); RwUInt32 geometryFlags = RpGeometryGetFlags(pGeometry);
RpGeometrySetFlags(pGeometry, geometryFlags & ~(rpGEOMETRYTEXTURED|rpGEOMETRYPRELIT|
rpGEOMETRYLIGHT|rpGEOMETRYMODULATEMATERIALCOLOR|rpGEOMETRYTEXTURED2));


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


void CShadowCamera::ReInit() void CShadowCamera::ReInit()
@@ -110,6 +114,14 @@ RwTexture* CRealTimeShadow::Update()
{ {
if ( m_pEntity->m_pRwObject ) if ( m_pEntity->m_pRwObject )
{ {
// Close enough to the object?
CVector* pObjPos = m_pEntity->GetCoords();
CVector* pCamPos = TheCamera.GetCoords();

// TODO: Different distances for different entities
if ( (*pObjPos-*pCamPos).MagnitudeSqr() > MAX_DISTANCE_PED_SHADOWS * MAX_DISTANCE_PED_SHADOWS )
return nullptr;

if ( m_nRwObjectType == rpATOMIC ) if ( m_nRwObjectType == rpATOMIC )
RwV3dTransformPoints(&m_BaseSphere.center, &m_BoundingSphere.center, 1, RwFrameGetMatrix(RpAtomicGetFrame(reinterpret_cast<RpAtomic*>(m_pEntity->m_pRwObject)))); RwV3dTransformPoints(&m_BaseSphere.center, &m_BoundingSphere.center, 1, RwFrameGetMatrix(RpAtomicGetFrame(reinterpret_cast<RpAtomic*>(m_pEntity->m_pRwObject))));
else if ( m_nRwObjectType == rpCLUMP ) else if ( m_nRwObjectType == rpCLUMP )
@@ -288,6 +300,9 @@ void CRealTimeShadowManager::Exit()


void CRealTimeShadowManager::DoShadowThisFrame(CPhysical* pEntity) void CRealTimeShadowManager::DoShadowThisFrame(CPhysical* pEntity)
{ {
if ( m_bNeedsReinit )
return;

bool bRenderAtLowDetails; bool bRenderAtLowDetails;
eShadowQuality nShadowQuality = CShadows::GetShadowQuality(); eShadowQuality nShadowQuality = CShadows::GetShadowQuality();


@@ -316,7 +331,7 @@ void CRealTimeShadowManager::GetRealTimeShadow(CPhysical* pEntity)
else else
bIsPlayer = false; bIsPlayer = false;


if ( pEntity->nType != 3 || !bIsPlayer ) /*if ( pEntity->nType != 3 || !bIsPlayer )
{ {
CPed* pPlayerPed = CWorld::Players[CWorld::PlayerInFocus].GetPed(); CPed* pPlayerPed = CWorld::Players[CWorld::PlayerInFocus].GetPed();
@@ -325,9 +340,9 @@ void CRealTimeShadowManager::GetRealTimeShadow(CPhysical* pEntity)
/*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; // bIsPlayer = pPlayerPed->pVehicle == pEntity;
} // }
} // }


if ( m_bInitialised && bRender ) if ( m_bInitialised && bRender )
{ {
@@ -373,7 +388,7 @@ void CRealTimeShadowManager::GetRealTimeShadow(CPhysical* pEntity)


void CRealTimeShadowManager::ReInit() void CRealTimeShadowManager::ReInit()
{ {
if ( CShadows::GetShadowQuality() > SHADOW_QUALITY_LOWEST ) if ( !m_bNewSettings )
{ {
for ( int i = 0; i < NUM_MAX_REALTIME_SHADOWS; i++ ) for ( int i = 0; i < NUM_MAX_REALTIME_SHADOWS; i++ )
m_pShadows[i]->ReInit(); m_pShadows[i]->ReInit();
@@ -389,6 +404,109 @@ void CRealTimeShadowManager::ReInit()
m_GradientCamera_Player.MakeGradientRaster(); m_GradientCamera_Player.MakeGradientRaster();
} }
} }
else
{
const tShadowQualitySettings* pSets_Player;
const tShadowQualitySettings* pSets;

switch ( CShadows::GetShadowQuality() )
{
case SHADOW_QUALITY_LOW:
pSets_Player = &gShadowSettings[0];
pSets = nullptr;
break;
case SHADOW_QUALITY_MEDIUM:
pSets_Player = &gShadowSettings[1];
pSets = &gShadowSettings[0];
break;
case SHADOW_QUALITY_HIGH:
pSets_Player = &gShadowSettings[2];
pSets = &gShadowSettings[1];
break;
case SHADOW_QUALITY_HIGHEST:
pSets_Player = &gShadowSettings[3];
pSets = &gShadowSettings[3];
break;
default:
pSets_Player = nullptr;
pSets = nullptr;
break;
}

for ( int i = 0; i < NUM_MAX_REALTIME_SHADOWS; i++ )
{
CPhysical* pOldOwner = m_pShadows[i]->GetOwner();
m_pShadows[i]->Destroy();

if ( !i )
{
if ( pSets_Player )
{
m_pShadows[0]->Create(pSets_Player->nQuality, pSets_Player->nQualityAfterResample,
pSets_Player->nQuality != pSets_Player->nQualityAfterResample,
pSets_Player->nBlurPasses, pSets_Player->bUseGradient,
pSets_Player->bDedicatedCamsForPlayer);

if ( pOldOwner )
m_pShadows[i]->SetShadowedObject(pOldOwner);
}
else
{
if ( pOldOwner )
pOldOwner->SetRealTimeShadow(nullptr);
}
}
else
{
if ( pSets )
{
m_pShadows[i]->Create(pSets->nQuality, pSets->nQualityAfterResample,
pSets->nQuality != pSets->nQualityAfterResample,
pSets->nBlurPasses, pSets->bUseGradient,
false);

if ( pOldOwner )
m_pShadows[i]->SetShadowedObject(pOldOwner);
}
else
{
if ( pOldOwner )
pOldOwner->SetRealTimeShadow(nullptr);
}
}

if ( !pSets )
pSets = pSets_Player;
}

m_BlurCamera.Destroy();
m_GradientCamera.Destroy();

if ( m_bPlayerHelperCamsInUse )
{
m_BlurCamera_Player.Destroy();
m_GradientCamera_Player.Destroy();
}

if ( pSets )
{
m_BlurCamera.Create(pSets->nQualityAfterResample);
m_GradientCamera.Create(pSets->nQualityAfterResample);
m_GradientCamera.MakeGradientRaster();

if ( pSets_Player->bDedicatedCamsForPlayer )
{
m_BlurCamera_Player.Create(pSets_Player->nQualityAfterResample);
m_GradientCamera_Player.Create(pSets_Player->nQualityAfterResample);
m_GradientCamera_Player.MakeGradientRaster();
m_bPlayerHelperCamsInUse = true;
}
else
m_bPlayerHelperCamsInUse = false;
}

m_bNewSettings = false;
}
} }


void CRealTimeShadowManager::ReturnRealTimeShadow(CRealTimeShadow* pShadow) void CRealTimeShadowManager::ReturnRealTimeShadow(CRealTimeShadow* pShadow)
@@ -97,6 +97,7 @@ class CRealTimeShadowManager
public: public:
bool m_bInitialised; bool m_bInitialised;
bool m_bNeedsReinit; bool m_bNeedsReinit;
bool m_bNewSettings;
bool m_bPlayerHelperCamsInUse; // VCS PC class extension bool m_bPlayerHelperCamsInUse; // VCS PC class extension
CRealTimeShadow* m_pShadows[NUM_MAX_REALTIME_SHADOWS]; CRealTimeShadow* m_pShadows[NUM_MAX_REALTIME_SHADOWS];
CShadowCamera m_BlurCamera; CShadowCamera m_BlurCamera;
@@ -108,14 +109,13 @@ class CRealTimeShadowManager


public: public:
CRealTimeShadowManager() CRealTimeShadowManager()
: m_bInitialised(false), m_bNeedsReinit(false), m_bPlayerHelperCamsInUse(false) : m_bInitialised(false), m_bNeedsReinit(false), m_bPlayerHelperCamsInUse(false), m_bNewSettings(false)
{ {
memset(m_pShadows, 0, sizeof(m_pShadows)); 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]); { m_bNeedsReinit = true; m_bNewSettings = true; }
Exit(); Init(); }


void ReturnRealTimeShadow(CRealTimeShadow* pShadow); void ReturnRealTimeShadow(CRealTimeShadow* pShadow);
void Init(); void Init();
@@ -26,8 +26,10 @@ bool CShadows::StoreRealTimeShadowForVehicle(CVehicle* pVehicle)
if ( m_bShadowQuality > SHADOW_QUALITY_LOW ) if ( m_bShadowQuality > SHADOW_QUALITY_LOW )
{ {
g_realTimeShadowMan.DoShadowThisFrame(pVehicle); g_realTimeShadowMan.DoShadowThisFrame(pVehicle);
return true;
return pVehicle->GetSubClass() == VEHICLE_HELI || pVehicle->GetSubClass() == VEHICLE_PLANE;
} }

return false; return false;
} }


@@ -41,7 +43,9 @@ void CShadows::StoreRealTimeShadowForObject(CObject* pObject)
bool CShadows::ThisPropCanHaveShadow(CPhysical* pPhysical) bool CShadows::ThisPropCanHaveShadow(CPhysical* pPhysical)
{ {
return pPhysical->m_nModelIndex == MI_PARKBENCH || pPhysical->m_nModelIndex == MI_CANOPY_TEST || pPhysical->m_nModelIndex == MI_CHAIR_TEST return pPhysical->m_nModelIndex == MI_PARKBENCH || pPhysical->m_nModelIndex == MI_CANOPY_TEST || pPhysical->m_nModelIndex == MI_CHAIR_TEST
|| pPhysical->m_nModelIndex == MI_PAPERMACHINE || pPhysical->m_nModelIndex == MI_HYDRANT; || pPhysical->m_nModelIndex == MI_PAPERMACHINE || pPhysical->m_nModelIndex == MI_HYDRANT
// Flying components
|| ( pPhysical->m_nModelIndex >= 374 && pPhysical->m_nModelIndex <= 379 );
} }


static const float f215 = 2.15f; static const float f215 = 2.15f;
@@ -32,4 +32,6 @@ class CShadows
static void Inject(); static void Inject();
}; };


extern float& MAX_DISTANCE_PED_SHADOWS;

#endif #endif

0 comments on commit db03e91

Please sign in to comment.