Skip to content

File Application.cpp

File List > app > Application.cpp

Go to the documentation of this file

#include "Application.h"
#include "SceneManager.h"

#include "shaders/ComputeShader.h"

#include "controllers/CameraController.h"
#include "controllers/ViewportController.h"
#include "controllers/ShaderController.h"

#include "events/EditorEvents.h"
#include "events/MaterialEvents.h"

#include "layer/Viewport.h"

#include "xdz_math.h"
#include "structs.h"

Application::Application()
    : window(SCREEN_W + 100, SCREEN_H, "TEST_WINDOW")
    , Ctx(EventPool)
{
    std::iostream::sync_with_stdio(false);
    std::cout << std::boolalpha;

    // Editor Layer
    renderer = std::make_unique<Renderer>(EventPool, window);
    MeshLib::MeshLibInit();

    // Controllers
    Controllers.RegisterController<CameraController>(EventPool);
    Controllers.RegisterController<ViewportController>(EventPool);
    Controllers.RegisterController<ShaderController>(EventPool);

    // UI Layer
    UI = std::make_unique<ImguiManager>(EventPool, window);

    UI->SetConfigFlag(ImGuiConfigFlags_DockingEnable);
    //UI->SetConfigFlag(ImGuiConfigFlags_ViewportsEnable);

#if 0
    renderer->UseScene(SceneManager::SceneConfig3());
    renderer->r_using_shadow_map = false;
    renderer->r_using_ssr = false;
#else
    Ctx.scene.UseScene(SceneManager::Shadow().get());

    renderer->GetConfig()->r_ao_radius = 0.8f;
    Light::area_blur_range = 0.03f;

    Scene* scene = dynamic_cast<Scene*>(Ctx.scene.active_scene);
    EventPool.emit<FrameBufferResetEvent>({ &renderer->r_buffer_list[0], renderer->GetFrameBufferPtr() });
    EventPool.emit<RenderConfigChangedEvent>({ renderer->GetConfig(), ModifyFlags::ShadowChanged});
    for (const auto& [id, mesh] : scene->mesh_list)
    {
        if(mesh->using_material)
            EventPool.emit<MaterialStructChangedEvent>({ dynamic_cast<ObjectID*>(mesh.get()), mesh->o_material.get() });
    }
    EventPool.Process();

    // TODO: event system
    renderer->r_shadow_system.ParseLightData(scene->light_list, renderer->GetConfig()->RequiresMomentShadow());
    renderer->r_shadow_system.ParsePolygonLightData(scene->poly_light_list);
    Ctx.render.UseConfig(renderer->GetConfig());
    //renderer->r_render_icons = false;

#endif
}

Application::~Application()
{
    TextureLib::ResetTexLib();
    ComputeShader::ResetComputeLib();
    // UI and renderer are destroyed automatically (reverse declaration order)
    // before window destructor runs glfwDestroyWindow + glfwTerminate
}

int Application::Run()
{
    DEBUG("-------------------------------");

    static float scale = 0.3f;
    static float power = 0.5f;
    static float rotateX = 0.0f;
    static float rotateY = 0.0f;
    static float rotateZ = 0.0f;
    static float Radius_W;
    double mouse_x = 0.0f, mouse_y = 0.0f;
    glm::vec3 LightColor = glm::vec3(1.0f, 0.5f, 0.5f);
    glm::vec3 LightPos = glm::vec3(0.7f, 0.7f, 1.0f);
    glm::vec3 LightRot = glm::vec3(0.5f, 0.5f, 0.5f);
    AverageTime<10> AvTime;
    int tex_type = 0;
    static float testf;
    static float Metalness = 0.0f;
    static float Roughness = 0.0f;
    static float Specular = 1.0f;


    UI->SetButtonFunc("__Parameters__", "Debug", [&] {
        Scene* scene = dynamic_cast<Scene*>(Ctx.scene.active_scene);
        tex_type++;
        if (tex_type >= MAX_FB)tex_type = 0;
        scene->GetActiveEnvironment()->SwapFrameBuffer((FBType)(tex_type));
        scene->GetPPS(0)->SetShaderValue("U_color", Texture::BUFFER_TEXTURE + tex_type);
        //renderer->r_using_fxaa = !renderer->r_using_fxaa;
        renderer->ScreenShot();
        });
    UI->SetButtonFunc("test layer", "testB", [&] {
        glm::vec3 newpoint2 = xdzm::rand3n(8.65f);
        //points->PushDebugPoint(newpoint2);
        //line->PushDebugLine(newpoint2);
        UI->GetParaValue("test layer", "Roughness")->Get<float>() = xdzm::rand11();
        //go1.o_shader->ShaderLibDebug();
        //environment->envir_shader->ShaderLibDebug();
        //environment->envir_IBL_diff.GenIrradiaceConvFrom(environment->envir_IBL_spec);
        });

    UI->FindImguiLayerAs<Viewport>("Viewport")->display_grid = false;
    Scene* scene = dynamic_cast<Scene*>(Ctx.scene.active_scene);
    UI->FindImguiMenuItem("Render", "Rendering PipeLine")->BindOption(&renderer->GetConfig()->r_pipeline);
    UI->FindImguiMenuItem("Render", "Optical Flow")->BindOption(&renderer->GetConfig()->r_of_algorithm);
    UI->FindImguiMenuItem("Render", "Anti Aliasing")->BindOption(&renderer->GetConfig()->r_anti_alias);
    UI->FindImguiMenuItem("Render", "Screen Space Reflection")->BindOption(&renderer->GetConfig()->r_ssr_algorithm);
    UI->FindImguiMenuItem("Render", "Shadow")->BindOption(&renderer->GetConfig()->r_shadow_algorithm, [&](bool) -> bool { 
        EventPool.emit<RenderConfigChangedEvent>({ renderer->GetConfig(), ModifyFlags::ShadowChanged});
        return true; 
        });
    UI->FindImguiMenuItem("Render", "Ambient Occlusion")->BindOption(&renderer->GetConfig()->r_ao_algorithm);
    UI->FindImguiMenuItem("Render", "Sampling")->BindOption(&renderer->GetConfig()->r_sampling_average);
    UI->FindImguiMenuItem("View",   "Icons")->BindSwitch(&renderer->r_render_icons);

    UI->ParaUpdate = [&] {
        UI->FindImguiItem("__Parameters__", "MOUSE_POS : [%.1f : %.1f]")->SetArgsList(2, Input::GetMousePosX(), Input::GetMousePosY());
        UI->FindImguiItem("__Parameters__", "Frame Rate %.3f ms/frame (%.1f FPS)")->SetArgsList(2, 1000.0f / AvTime.result, AvTime.result);

        scale = UI->GetParaValue("__Parameters__", "SCALE")->Get<float>();
        power = UI->GetParaValue("__Parameters__", "POWER")->Get<float>();
        rotateX = UI->GetParaValue("__Parameters__", "X")->Get<float>();
        rotateY = UI->GetParaValue("__Parameters__", "Y")->Get<float>();
        rotateZ = UI->GetParaValue("__Parameters__", "Z")->Get<float>();
        Radius_W = UI->GetParaValue("__Parameters__", "W")->Get<float>();
        LightColor = UI->GetParaValue("__Parameters__", "Light Color")->Get<glm::vec3>();
        LightPos = UI->GetParaValue("__Parameters__", "Light Position")->Get<glm::vec3>();
        LightRot = UI->GetParaValue("__Parameters__", "Light Rotation")->Get<glm::vec3>();
        testf = UI->GetParaValue("test layer", "testf")->Get<float>();
        Metalness = UI->GetParaValue("test layer", "Metalness")->Get<float>();
        Roughness = UI->GetParaValue("test layer", "Roughness")->Get<float>();
        Specular = UI->GetParaValue("test layer", "Specular")->Get<float>();
        //renderer->GetActiveEnvironment()->envir_gamma = UI->GetParaValue("__Parameters__", "GAMMA")->Get<float>();GLDEBUG
        renderer->GetConfig()->r_gamma = UI->GetParaValue("__Parameters__", "GAMMA")->Get<float>();

        //temp.GenERectMapFrom(renderer->r_scene->light_list.begin()->second->light_shadow_map);
        //DEBUG(renderer->r_scene->light_list.begin()->second->light_shadow_map.GetTexID())
        //UI->FindImguiItem("CompShader", "Viewport")->ResetBufferID(temp.GetTexID());
        //UI->_debug();
    };

    /* Loop until the user closes the window */
    while (!window.ShouldClose())
    {
        /* Update here */
        UI->NewFrame();

        AvTime.Update(UI->GetIO()->Framerate);
        InputManager.UpdateState(window.Get());
        EventPool.EmitGlobalEvent();

        UI->RenderUI(Ctx, EventPool);

        EventPool.Process();

        Scene* scene = dynamic_cast<Scene*>(Ctx.scene.active_scene);
        /* Render here */       
        renderer->Render(Ctx);

        renderer->Reset();
        scene->ResetStatus();

        //DEBUG(renderer->r_frame_count);
#if 0
        DEBUG(renderer->GetActiveCamera()->o_position);
        DEBUG(renderer->GetActiveCamera()->cam_pers);
#endif

        /* Swap front and back buffers */
        window.SwapBuffers();
    }
    DEBUG(std::to_string(1000 / AvTime.result) + "ms");
    std::cout << std::endl << "[ Finished ]" << std::endl;
    std::cout << UID::GetTotalAllocated() << " object(s)" << std::endl;

    return 0;
}