Skip to content

File RenderConfigViewer.cpp

File List > layer > RenderConfigViewer.cpp

Go to the documentation of this file

#include "RenderConfigViewer.h"
#include "RenderConfigs.h"
#include "macros.h"

#include "events/EditorEvents.h"

RenderConfigViewer::RenderConfigViewer()
    :RenderConfigViewer("Renderer")
{}

RenderConfigViewer::RenderConfigViewer(const std::string& _name)
{
    uly_name = _name;
    uly_type = RENDER_CONFIG_ULATER;
}

RenderConfigViewer::~RenderConfigViewer()
{}

void RenderConfigViewer::RenderLayer(const Context& ctx, EventPool& evt)
{
    RenderConfigs* active_config = (RenderConfigs*)ctx.render.GetConfig();
    if (active_config == nullptr) {
        ImGui::Text("No active renderer");
        return;
    }

    bool modified = false;
    ModifyFlags flag = ModifyFlags::NoChanges;

    modified = RenderOption((char*)&active_config->r_pipeline,          "Rendering PipeLine",       OPTIONS("Forward", "Deferred", "Custom (future)"));
    modified = RenderOption((char*)&active_config->r_sampling_average,  "Sampling",                 OPTIONS("Average", "Increment Average"));
    modified = RenderOption((char*)&active_config->r_of_algorithm,      "Optical Flow",             OPTIONS("None", "Forward", "Backward"));
    modified = RenderOption((char*)&active_config->r_anti_alias,        "Anti Aliasing",            OPTIONS("None", "MSAA (future)", "FXAA"));
    modified = RenderOption((char*)&active_config->r_ssr_algorithm,     "Screen Space Reflection",  OPTIONS("None", "Ray Marching", "SDF Ray Marching", "SDF Resolved Ray Marching"));
    modified = RenderOption((char*)&active_config->r_shadow_algorithm,  "Shadow",                   OPTIONS("None", "Shadow Mapping", "SDF Soft Shadow", "Variance Soft Shadow", "Moment Soft Shadow"));
    if (modified) flag = ModifyFlags(flag | ModifyFlags::ShadowChanged);
    modified = RenderOption((char*)&active_config->r_ao_algorithm,      "Ambient Occlusion",        OPTIONS("None", "SSAO", "HBAO (future)"));

    if (flag != ModifyFlags::NoChanges) {
        evt.emit<RenderConfigChangedEvent>({ active_config, flag });
    }
}

bool RenderConfigViewer::RenderOption(
    char* option, 
    std::string name, 
    const std::vector<std::string>& option_names)
{
    bool modified = false;

    if (ImGui::BeginCombo(name.c_str(), option_names[*option].c_str())) {
        LOOP(option_names.size())
            if (ImGui::Selectable(option_names[i].c_str())) {
                modified = *option != i;
                *option = i;
            }
        ImGui::EndCombo();
    }

    return modified;
}