Files
GTASource/game/renderer/RenderPhases/RenderPhaseCascadeShadows.h
expvintl 419f2e4752 init
2025-02-23 17:40:52 +08:00

276 lines
9.1 KiB
C++

// =================================================
// renderer/renderphases/renderphasecascadeshadows.h
// (c) 2011 RockstarNorth
// =================================================
#ifndef _RENDERER_RENDERPHASES_RENDERPHASECASCADESHADOWS_H_
#define _RENDERER_RENDERPHASES_RENDERPHASECASCADESHADOWS_H_
#include "renderer/renderphases/renderphase.h"
#include "../../shader_source/Lighting/Shadows/cascadeshadows_common.fxh" // for CASCADE_SHADOWS_DO_SOFT_FILTERING
#include "rmptfx/ptxconfig.h"
namespace rage { class grmShader; }
namespace rage { class grcRenderTarget; }
namespace rage { class fwScanCascadeShadowInfo; }
class CViewport;
class CEntity;
enum eCSMShadowType
{
CSM_TYPE_CASCADES, // 4 cascades
CSM_TYPE_QUADRANT,
CSM_TYPE_HIGHRES_SINGLE,
CSM_TYPE_COUNT
};
enum eCSMQualityMode
{
CSM_QM_IN_GAME = 0,
CSM_QM_CUTSCENE_DEFAULT = 1,
CSM_QM_MOONLIGHT = 2,
CSM_QM_COUNT
};
enum eCSMRasterizerState
{
CSM_RS_DEFAULT = 0,
CSM_RS_TWO_SIDED = 1,
CSM_RS_CULL_FRONT = 2,
CSM_RS_COUNT
};
enum ShadowMapMiniType
{
SM_MINI_UNDERWATER = 0,
SM_MINI_FOGRAY,
SM_MINI_LAST
};
#define ALLOW_SHADOW_DISTANCE_SETTING (RSG_PC)
#define ALLOW_LONG_SHADOWS_SETTING (RSG_PC)
#define SHADOW_MATRIX_REFLECT (0 && __DEV) // experimental
#define SHADOW_ENABLE_ASYNC_CLEAR (1 && RSG_DURANGO)
#if SHADOW_MATRIX_REFLECT
#define SHADOW_MATRIX_REFLECT_ONLY(...) __VA_ARGS__
#else
#define SHADOW_MATRIX_REFLECT_ONLY(...)
#endif
#define SHADOW_ENABLE_ALPHASHADOW ( RSG_PC || RSG_DURANGO || RSG_ORBIS )
class CRenderPhaseCascadeShadowsInterface
{
public:
static void Init_(unsigned initMode);
static void InitShaders();
#if RSG_PC
static void ResetShaders();
static void DeviceLost();
static void DeviceReset();
#endif // RSG_PC
static void ResetRenderThreadInfo();
static int CascadeShadowResX();
static int CascadeShadowResY();
static void CreateShadowMapMini();
static grcRenderTarget* GetShadowMap(); // used for RMPTFX_USE_PARTICLE_SHADOWS
static grcRenderTarget* GetShadowMapVS(); // used for shaded particles
#if RMPTFX_USE_PARTICLE_SHADOWS || SHADOW_ENABLE_ALPHASHADOW
static bool UseAlphaShadows(); // Disable alpha shadows (particles + cables)
static grcRenderTarget* GetAlphaShadowMap();
#if __ASSERT
static void SetParticleShadowSetFlagThreadID(int renderThreadID);
static int GetParticleShadowSetFlagThreadID();
static void SetParticleShadowAccessFlagThreadID(int renderThreadID);
static int GetParticleShadowAccessFlagThreadID();
static void ResetParticleShadowFlagThreadIDs();
#endif
#endif // RMPTFX_USE_PARTICLE_SHADOWS
#if __D3D11 || RSG_ORBIS
static grcRenderTarget* GetShadowMapReadOnly();
#endif // __D3D11
#if __PS3
static grcRenderTarget* GetShadowMapPatched();
#endif // __PS3
static grcRenderTarget* GetShadowMapMini(ShadowMapMiniType mapType = SM_MINI_UNDERWATER);
static const grcTexture* GetSmoothStepTexture();
static grcTexture* GetDitherTexture();
static void CopyShadowsToMiniMap(grcTexture* noiseMap, float height);
static void CopyShadowsToShadowMapVS();
static int GetShadowTechniqueId();
static int GetShadowTechniqueTextureId();
#if !__PS3
static grmShader* GetShadowShader();
#endif // !__PS3
#if __BANK
static void InitWidgets();
#if CASCADE_SHADOWS_DO_SOFT_FILTERING
static void InitWidgets_SoftShadows(bkBank &bk);
#endif // CASCADE_SHADOWS_DO_SOFT_FILTERING
static bool IsEntitySelectRequired();
#endif // __BANK
static void Terminate() {}
static void Update();
static void DisableFromVisibilityScanning();
static void ShadowReveal();
static void LateShadowReveal();
static void Synchronise();
#if SHADOW_ENABLE_ASYNC_CLEAR
static void ClearShadowMapsAsync();
static void WaitOnClearShadowMapsAsync();
#endif // SHADOW_ENABLE_ASYNC_CLEAR
#if GS_INSTANCED_SHADOWS
static void SetInstShadowActive(bool bActive);
static bool IsInstShadowEnabled();
#endif // GS_INSTANCED_SHADOWS
static bool IsShadowActive();
static bool ArePortalShadowsActive();
static void SetDeferredLightingShaderVars();
static void SetSharedShaderVars();
static void SetCloudShadowParams();
#if SHADOW_MATRIX_REFLECT
static void SetSharedShaderVarsShadowMatrixOnly(Vec4V_In reflectionPlane = Vec4V(V_ZERO));
#endif // SHADOW_MATRIX_REFLECT
static void SetSharedShadowMap(const grcTexture* tex); // can be used with forward shaders to override the shadow map texture
static void RestoreSharedShadowMap();
static fwScanCascadeShadowInfo& GetScanCascadeShadowInfo();
static void GetCascadeViewports(atArray<grcViewport>& cascadeViewports_InOut);
static const grcViewport& GetViewport(); //main cascade shadow viewport (range encompasses all cascades, used for visibility and occlusion)
static const grcViewport& GetCascadeViewport(int cascadeIndex);
static bool IsUsingStandardCascades(); // if this returns false, we're doing something funky with cascades (e.g. quadrant track, cutscene etc.)
static float GetCutoutAlphaRef();
static bool GetCutoutAlphaToCoverage();
static bool GetRenderFadingEnabled();
static bool GetRenderHairEnabled();
static float GetMinimumRecieverShadowHeight();
static void SetRasterizerState(eCSMRasterizerState state);
static void RestoreRasterizerState();
static void BeginFindingNearZShadows();
static float EndFindingNearZShadows();
#if __BANK
static void DebugDraw_update();
static void DebugDraw_render();
static bool IsDebugDrawEnabled();
#endif // __BANK
static void UpdateVisualDataSettings();
static void UpdateTimecycleSettings();
static void Script_InitSession();
static void Script_SetShadowType(eCSMShadowType type);
static void Script_SetCascadeBounds(int cascadeIndex, bool bEnabled, float x, float y, float z, float radiusScale, bool lerpToDisabled = false, float lerpTime = 0.0f);
static void Script_GetCascadeBounds(int cascadeIndex, bool &bEnabled, float &x, float &y, float &z, float &radiusScale, bool &lerpToDisabled, float &lerpTime);
static void Script_SetCascadeBoundsHFOV(float degrees);
static void Script_SetCascadeBoundsVFOV(float degrees);
static void Script_SetCascadeBoundsScale(float scale);
static void Script_SetEntityTrackerScale(float scale);
static void Script_SetWorldHeightUpdate(bool bEnable);
static void Script_SetWorldHeightMinMax(float h0, float h1);
static void Script_SetRecvrHeightUpdate(bool bEnable);
static void Script_SetRecvrHeightMinMax(float h0, float h1);
static void Script_SetDitherRadiusScale(float scale);
static void Script_SetDepthBias(bool bEnable, float depthBias);
static void Script_SetSlopeBias(bool bEnable, float slopeBias);
static void Script_SetShadowSampleType(const char* typeStr);
static void Script_SetShadowQualityMode(eCSMQualityMode qm);
static void Script_SetAircraftMode(bool on);
static void Script_SetDynamicDepthMode(bool on);
static void Script_EnableDynamicDepthModeInCutscenes(bool on);
static void Script_SetFlyCameraMode(bool on); // for scripted fly camera
static void Script_SetSplitZExpWeight(float v); // for scripted fly camera
static void Script_SetBoundPosition(float v);
static void Cutscene_SetShadowSampleType( u32 hashVal);
static bool IsSampleFilterSyncable();
static void SetDynamicDepthValue( float v);
static void SetEntityTrackerActive(bool bActive);
static void SetSoftShadowProperties();
static void SetParticleShadowsEnabled(bool bEnabled);
static void SetScreenSizeCheckEnabled(bool bEnabled);
static void SetSyncFilterEnabled(bool bEnabled);
static u32 GetClipPlaneCount();
static Vec4V_Out GetClipPlane(u32 index);
static const Vec4V *GetClipPlaneArray(); //Useful for setting shader vars.
//Quality Settings
static void SetGrassEnabled(bool enabled);
#if GTA_REPLAY
static bool IsUsingAircraftShadows();
#endif
#if ALLOW_SHADOW_DISTANCE_SETTING
static void SetDistanceMultiplierSetting(float distanceMultiplier, float splitZStart, float splitZEnd, float aircraftExpWeight);
#endif // ALLOW_SHADOW_DISTANCE_SETTING
#if ALLOW_LONG_SHADOWS_SETTING
static void SetShadowDirectionClamp(bool bEnabled);
#endif // ALLOW_LONG_SHADOW_SETTING
};
class CRenderPhaseCascadeShadows : public CRenderPhaseScanned
{
public:
CRenderPhaseCascadeShadows(CViewport* pGameViewport);
virtual ~CRenderPhaseCascadeShadows() {}
virtual void UpdateViewport();
virtual void BuildRenderList();
virtual void BuildDrawList();
void BuildDrawListAlphaShadows();
virtual u32 GetCullFlags() const;
void ShadowDrawListPrologue(u32 drawListType);
void ShadowDrawListEpilogue(u32 drawListType);
static void ComputeFograyFadeRange(float &fadeStart, float &fadeEnd);
static void SetCurrentExecutingCascade(int cascade) { FastAssert(sysThreadType::IsRenderThread()); s_CurrentExecutingCascade = cascade; }
static void SetCurrentBuildingCascade(int cascade) { FastAssert(sysThreadType::IsUpdateThread()); s_CurrentBuildingCascade = cascade; }
static int GetCurrentExecutingCascade() { FastAssert(sysThreadType::IsRenderThread()); return s_CurrentExecutingCascade; }
static int GetCurrentBuildingCascade() { FastAssert(sysThreadType::IsUpdateThread()); return s_CurrentBuildingCascade; }
static void UpdateRasterUpdateId();
#if RSG_PC
static bool IsNeedResolve();
#endif
private:
static __THREAD int s_CurrentExecutingCascade;
static int s_CurrentBuildingCascade;
};
#endif // _RENDERER_RENDERPHASES_RENDERPHASECASCADESHADOWS_H_