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

314 lines
8.9 KiB
C++

#ifndef __LENS_ARTEFACTS_H__
#define __LENS_ARTEFACTS_H__
#include "atl/hashstring.h"
#include "atl/array.h"
#include "atl/functor.h"
#include "bank/bank.h"
#include "bank/combo.h"
#include "data/callback.h"
#include "fwtl/LinkList.h"
#include "grcore/effect_typedefs.h"
#include "grcore/stateblock.h"
#include "grmodel/shader.h"
#include "parser/macros.h"
#include "vector/color32.h"
#include "vector/vector4.h"
namespace rage
{
class grcRenderTarget;
}
//////////////////////////////////////////////////////////////////////////
//
enum eLensArtefactBlurType
{
LENSARTEFACT_BLUR_2X = 0,
LENSARTEFACT_BLUR_4X,
LENSARTEFACT_BLUR_8X,
LENSARTEFACT_BLUR_16X,
LENSARTEFACT_BLUR_0X,
LENSARTEFACT_BLUR_NONE
};
//////////////////////////////////////////////////////////////////////////
//
enum eLensArtefactStreakDir
{
LENSARTEFACT_STREAK_HORIZONTAL = 0,
LENSARTEFACT_STREAK_VERTICAL,
LENSARTEFACT_STREAK_DIAGONAL_1,
LENSARTEFACT_STREAK_DIAGONAL_2,
LENSARTEFACT_STREAK_NONE
};
//////////////////////////////////////////////////////////////////////////
//
enum eLensArtefactMaskType
{
LENSARTEFACT_MASK_HORIZONTAL,
LENSARTEFACT_MASK_VERTICAL,
LENSARTEFACT_MASK_NONE,
};
//////////////////////////////////////////////////////////////////////////
//
enum LensArtefactBufferSize
{
LENSARTEFACT_HALF = 0,
LENSARTEFACT_QUARTER,
LENSARTEFACT_EIGHTH,
LENSARTEFACT_SIXTEENTH,
LENSARTEFACT_BUFFER_COUNT
};
enum LensArtefactShaderPass
{
LENSARTEFACT_LENS_PASS = 0,
LENSARTEFACT_UPSAMPLE_PASS,
LENSARTEFACT_DIRECTIONAL_BLUR_LOW_PASS,
LENSARTEFACT_DIRECTIONAL_BLUR_MED_PASS,
LENSARTEFACT_DIRECTIONAL_BLUR_HIGH_PASS,
LENSARTEFACT_LENS_COMBINED_PASS,
LENSARTEFACT_SHADER_PASS_COUNT
};
//////////////////////////////////////////////////////////////////////////
//
class LensArtefact
{
public:
LensArtefact() { Reset(); }
void Reset()
{
m_sortIndex = 0;
m_scale.Zero();
m_offset.Zero();
m_blurType = LENSARTEFACT_BLUR_2X;
m_opacity = 0.0f;
m_enabled = false;
m_streakDirection = LENSARTEFACT_STREAK_NONE;
m_fadeMaskType = LENSARTEFACT_MASK_NONE;
m_fadeMaskMinMax.x = 0.0f;
m_fadeMaskMinMax.y = 1.0f;
}
bool IsEnabled() const { return m_enabled; }
void GetOffset(Vector2& offset) const { offset = m_offset; }
void GetScale(Vector2& scale) const { scale = m_scale; }
float GetOpacity() const { return m_opacity; }
int GetSortIndex() const { return m_sortIndex; }
eLensArtefactBlurType GetBlurType() const { return m_blurType; }
eLensArtefactStreakDir GetStreakDirection() const { return m_streakDirection; }
eLensArtefactMaskType GetFadeMaskType() const { return m_fadeMaskType; }
void GetFadeMaskMinMax(Vector2& fadeMaskMinMax) const { fadeMaskMinMax = m_fadeMaskMinMax; }
void GetScaleAndOffset(Vector4& scaleOffset) const { scaleOffset.x = m_scale.x; scaleOffset.y = m_scale.y; scaleOffset.z = m_offset.x; scaleOffset.w = m_offset.y; }
Color32 GetColorShift() const { return m_colorShift; }
bool IsValid() { return true; };
atHashString GetName() const { return m_name; }
bool operator > (const LensArtefact& b) const { return m_sortIndex > b.m_sortIndex; }
bool operator >=(const LensArtefact& b) const { return m_sortIndex >= b.m_sortIndex; }
private:
atHashString m_name;
Vector2 m_scale;
Vector2 m_offset;
Color32 m_colorShift;
eLensArtefactBlurType m_blurType;
eLensArtefactStreakDir m_streakDirection;
eLensArtefactMaskType m_fadeMaskType;
Vector2 m_fadeMaskMinMax;
float m_opacity;
int m_sortIndex;
bool m_enabled;
PAR_SIMPLE_PARSABLE;
};
//////////////////////////////////////////////////////////////////////////
//
class LensArtefacts
{
public:
LensArtefacts();
~LensArtefacts();
void Init();
void Shutdown();
// Render target memory is managed in PostProcessFX
void SetRenderTargets( grcRenderTarget* pDstBuffer, grcRenderTarget* pSrcBufferUnfiltered, grcRenderTarget** pSrcBuffers,
grcRenderTarget** pScratchBuffers0, grcRenderTarget** pScratchBuffers1);
// Callback to PostFX::Blit wrapper
typedef Functor3<grcRenderTarget*, const grcTexture*, u32> RenderFunctor;
void SetRenderCallback( RenderFunctor cb) { m_pBlitCallback = cb; }
// Expects the same order and number of passes as the LensArtefactShaderPass enumeration
void SetShaderData(grmShader* pShader, u32* pPasses);
const grcRenderTarget* GetRenderTarget() const { return m_pFinalBuffer; }
LensArtefact* Get(atHashString name);
const LensArtefact* Get(atHashString name) const;
void SetActive(bool bActive) { m_bIsActive = bActive; }
bool IsActive() const;
void Add(LensArtefact& stack);
void Remove(atHashString name);
void Copy(LensArtefact* pLayerDst, const LensArtefact* pLayerSrc);
int GetLayerCount() const { return m_sortedLayers.GetNumUsed(); }
float GetGlobalIntensity() const { return m_globalIntensity; }
void SetGlobalIntensity(float intensity) { m_globalIntensity = intensity; }
void SetExposureMinMaxFadeMultipliers(float expMin, float expMax, float fadeMin, float fadeMax);
float GetExposureMinForFade() const { return m_minExposureForFade; }
float GetExposureMaxForFade() const { return m_maxExposureForFade; }
float GetExposureFadeMinMult() const { return m_exposureFadeMinMult; }
float GetExposureFadeMaxMult() const { return m_exposureFadeMaxMult; }
void GetExposureBasedOpacityMultipliers(Vector4& LensArtefactsParams0, Vector4& LensArtefactsParams1) const;
void Render();
bool LoadMetaData();
#if __BANK && !__FINAL
bool SaveMetaData();
#endif
void Update();
static void ClassInit();
static void ClassShutdown();
static LensArtefacts& GetInstance() { return *sm_pInstance; }
#if __BANK
void AddWidgets(rage::bkBank& bank);
#endif
private:
void RenderLayer(const LensArtefact* pLayer);
void RenderLayersCombined(const LensArtefact* pLayer0, const LensArtefact* pLayer1);
void ProcessDirectionalBlur(const LensArtefact* pLayer, grcRenderTarget* pSrcBuffer);
void RunDirectionalBlurPass(const LensArtefact* pLayer, grcRenderTarget* pSrcBuffer, Vector4& dir);
void RunDirectionalBlurPassesInterleaved(const LensArtefact* pLayer, grcRenderTarget* pSrcBuffer, Vector4& dir0, Vector4& dir1);
void GetLayerRenderData(const LensArtefact* pLayer, Vector4& scaleoffset, Vector4& misc, Vector4& color) const;
void GetRenderTargets(grcRenderTarget*& pDstBuffer, grcRenderTarget*& pSrcBuffer, eLensArtefactBlurType blurType, eLensArtefactStreakDir layerType) const;
void UpdateSortedList();
LensArtefactBufferSize GetBufferSize(const grcRenderTarget* pBuffer) const;
#if __BANK
class EditTool
{
public:
EditTool() : m_pLayerNamesCombo(NULL) {}
void Init();
void Shutdown();
void Update();
void AddWidgets(rage::bkBank& bank );
void OnSaveCurrentLayer();
void OnDeleteCurrentLayer();
void OnSaveData();
void OnLoadData();
void OnLayerNameSelected();
void UpdateLayerNamesList(const fwLinkList<LensArtefact*>& layers);
private:
atArray<const char*> m_layerNames;
int m_layerNamesComboIdx;
bkCombo* m_pLayerNamesCombo;
LensArtefact m_editableLayer;
static atHashString ms_newLayerName;
};
#endif // __BANK
float m_minExposureForFade;
float m_maxExposureForFade;
float m_exposureFadeMinMult;
float m_exposureFadeMaxMult;
float m_exposureFadeContribution;
float m_globalIntensity;
atArray<LensArtefact> m_layers;
fwLinkList<LensArtefact*> m_sortedLayers;
typedef fwLink<LensArtefact*> SortedLayerkNode;
#if __BANK
EditTool m_editor;
#endif
//////////////////////////////////////////////////////////////////////////
// Rendering related data
grcRenderTarget* m_pSrcBufferUnfiltered;
grcRenderTarget* m_pSrcBuffers[LENSARTEFACT_BUFFER_COUNT];
grcRenderTarget* m_pScratchBuffers[2][LENSARTEFACT_BUFFER_COUNT];
grcRenderTarget* m_pFinalBuffer;
grmShader* m_pShader;
grcEffectTechnique m_shaderTechnique;
u32 m_shaderPasses[LENSARTEFACT_SHADER_PASS_COUNT];
grcEffectVar m_shaderVarBlurDirectionID;
grcEffectVar m_shaderVarDirBlurColWeightsID;
grcEffectVar m_shaderVarColorShiftID;
grcEffectVar m_shaderVarLensArtefactParams0ID;
grcEffectVar m_shaderVarLensArtefactParams1ID;
grcEffectVar m_shaderVarLensArtefactParams2ID;
grcEffectVar m_shaderVarLensArtefactParams3ID;
grcEffectVar m_shaderVarLensArtefactParams4ID;
grcEffectVar m_shaderVarLensArtefactParams5ID;
grcEffectVar m_shaderVarUpsampleParamsID;
grcEffectVar m_shaderVarTexelSizeID;
grcEffectVar m_shaderVarSamplerID;
grcEffectVar m_shaderVarSamplerAltID;
grcSamplerStateHandle m_samplerStateBorder;
RenderFunctor m_pBlitCallback;
//////////////////////////////////////////////////////////////////////////
u32 m_blurWidth[3];
float m_blurFalloffExponent;
bool m_bIsActive;
bool m_bUseInterleavedBlur;
bool m_bCombineLayerRendering;
#if __BANK
bool m_bUseSolidBorderSampler;
bool m_bOverrideTimecycle;
#endif
static LensArtefacts* sm_pInstance;
PAR_SIMPLE_PARSABLE;
};
#define LENSARTEFACTSMGR LensArtefacts::GetInstance()
#endif // __LENS_ARTEFACTS_H__