Program Listing for File post_processor.h

Return to documentation for file (rootex/core/renderer/post_processor.h)

#pragma once

#include "common.h"

#include "PostProcess.h"
#include "ASSAO.h"
#include "shader.h"

class CameraComponent;

struct PostProcessingDetails
{
    bool isPostProcessing = false;
    bool isGodRays = false;
    bool isASSAO = false;
    bool isBloom = false;
    bool isSepia = false;
    bool isMonochrome = false;
    bool isGaussianBlur = false;
    bool isToneMap = false;
    bool isFXAA = false;
    int godRaysNumSamples = 100;
    float godRaysDensity = 1.0f;
    float godRaysWeight = 0.01f;
    float godRaysDecay = 1.0f;
    float godRaysExposure = 1.0f;
    float assaoRadius = 1.2f;
    float assaoDetailShadowStrength = 0.5f;
    int assaoBlurPassCount = 2;
    float assaoFadeOutFrom = 50.0f;
    float assaoFadeOutTo = 300.0f;
    float assaoHorizonAngleThreshold = 0.06f;
    int assaoQualityLevel = 2;
    float assaoShadowClamp = 0.98f;
    float assaoShadowMultiplier = 1.0f;
    float assaoShadowPower = 1.5f;
    float assaoSharpness = 0.98f;
    float assaoAdaptiveQualityLimit = 0.45f;
    float bloomThreshold = 0.8f;
    float bloomSize = 1.0f;
    float bloomBrightness = 1.0f;
    float bloomValue = 1.0f;
    float bloomBase = 1.0f;
    float bloomSaturation = 1.0f;
    float bloomBaseSaturation = 1.0f;
    float gaussianBlurMultiplier = 1.0f;
    float toneMapExposure = 0.0f;
    int toneMapOperator = 0;
    int toneMapTransferFunction = 0;
    float toneMapWhiteNits = 200.0f;
    Map<String, bool> customPostProcessing;
};

class PostProcess
{
public:
    virtual ~PostProcess() = default;

    virtual void draw(CameraComponent* camera, ID3D11ShaderResourceView*& nextSource) = 0;
};

class CustomPostProcess : public PostProcess
{
    Vector<Ptr<PostProcess>> m_PostProcesses;

    EventBinder<CustomPostProcess> m_Binder;

    BufferFormat s_BufferFormat;

    Ptr<Shader> shader;

    Microsoft::WRL::ComPtr<ID3D11RenderTargetView> m_CacheRTV;
    Microsoft::WRL::ComPtr<ID3D11ShaderResourceView> m_CacheSRV;

    Variant loadRTVAndSRV(const Event* event);

public:
    String m_PostProcessPath;

    CustomPostProcess(const String& path);

    void draw(CameraComponent* camera, ID3D11ShaderResourceView*& nextSource) override;
};

class PostProcessor
{
    Vector<Ptr<PostProcess>> m_PostProcesses;

    Ptr<DirectX::BasicPostProcess> m_BasicPostProcess;

public:
    PostProcessor();
    PostProcessor(PostProcessor&) = delete;
    ~PostProcessor() = default;

    void draw(CameraComponent* camera);

    friend class PostProcessSystem;
};