From 3387ece49a24b0cc5823a2b176cd8fcb0a7054f7 Mon Sep 17 00:00:00 2001 From: Derek Christ Date: Sun, 10 Jan 2021 15:37:16 +0100 Subject: [PATCH] Introduce Menu class --- src/CMakeLists.txt | 1 + src/Controller.cpp | 68 ++++++++++++++++++++++++++-------------------- src/Controller.h | 15 ++++++++++ src/Menu.cpp | 23 ++++++++++++++++ src/Menu.h | 22 +++++++++++++++ src/Screen.cpp | 27 ++++++++++++++---- src/Screen.h | 14 +++++++++- 7 files changed, 134 insertions(+), 36 deletions(-) create mode 100644 src/Menu.cpp create mode 100644 src/Menu.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 09cf9db..8609753 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -15,6 +15,7 @@ add_executable(Fall-Fever Framebuffer.cpp Widget.cpp Screen.cpp + Menu.cpp ) target_link_libraries( diff --git a/src/Controller.cpp b/src/Controller.cpp index 1f79972..cbfc07d 100644 --- a/src/Controller.cpp +++ b/src/Controller.cpp @@ -47,6 +47,17 @@ Controller::Controller() camera = new Camera(90.0f, gameWindow->getWindowAspectRatio()); + shaderProgram = new ShaderProgram("res/shaders/basic.vert", "res/shaders/basic.frag"); + lightProgram = new ShaderProgram("res/shaders/light.vert", "res/shaders/light.frag"); + skyboxProgram = new ShaderProgram("res/shaders/skybox.vert", "res/shaders/skybox.frag"); + postProcessingProgram = new ShaderProgram("res/shaders/postprocessing.vert", "res/shaders/postprocessing.frag"); + menuProgram = new ShaderProgram("res/shaders/menu.vert", "res/shaders/menu.frag"); + directionalShadowDepthProgram = new ShaderProgram("res/shaders/directionalShadowDepth.vert", "res/shaders/directionalShadowDepth.frag"); + pointShadowDepthProgram = new ShaderProgram("res/shaders/pointShadowDepth.vert", "res/shaders/pointShadowDepth.geom", "res/shaders/pointShadowDepth.frag"); + + pp_framebuffer = new Framebuffer(INIT_WINDOW_WIDTH, INIT_WINDOW_HEIGHT, postProcessingProgram); + menu = new Menu(pp_framebuffer, menuProgram); + #ifdef _DEBUG glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GL_TRUE); glfwSetErrorCallback(error_callback); @@ -75,7 +86,17 @@ Controller::~Controller() delete gameWindow; delete gameEventHandler; delete camera; + + delete shaderProgram; + delete lightProgram; + delete skyboxProgram; + delete postProcessingProgram; + delete menuProgram; + delete directionalShadowDepthProgram; + delete pointShadowDepthProgram; + delete pp_framebuffer; + delete menu; glfwTerminate(); } @@ -83,24 +104,11 @@ void Controller::run() { glClearColor(0.0015f, 0.0015f, 0.0015f, 1.0f); - ShaderProgram shaderProgram("res/shaders/basic.vert", "res/shaders/basic.frag"); - ShaderProgram lightProgram("res/shaders/light.vert", "res/shaders/light.frag"); - ShaderProgram skyboxProgram("res/shaders/skybox.vert", "res/shaders/skybox.frag"); - ShaderProgram postProcessingProgram("res/shaders/postprocessing.vert", "res/shaders/postprocessing.frag"); - ShaderProgram menuProgram("res/shaders/menu.vert", "res/shaders/menu.frag"); - ShaderProgram directionalShadowDepthProgram("res/shaders/directionalShadowDepth.vert", "res/shaders/directionalShadowDepth.frag"); - ShaderProgram pointShadowDepthProgram("res/shaders/pointShadowDepth.vert", "res/shaders/pointShadowDepth.geom", "res/shaders/pointShadowDepth.frag"); - - updateExposure(&postProcessingProgram); - pp_framebuffer = new Framebuffer(INIT_WINDOW_WIDTH, INIT_WINDOW_HEIGHT, &postProcessingProgram); + updateExposure(postProcessingProgram); // Show loading screen... glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - Texture loadingScreenTex("res/textures/loading.png", textureType::texture_diffuse); - Widget loadingScreenWidget(&loadingScreenTex, 0.f, 0.f, 1.f, 1.f); - Screen loadingScreen(pp_framebuffer, &menuProgram); - loadingScreen.addWidget(&loadingScreenWidget); - loadingScreen.draw(); + menu->showLoadingScreen(); glfwSwapBuffers(gameWindow->getGLFWwindow()); Model model_backpack("res/models/backpack.ffo"); @@ -108,18 +116,18 @@ void Controller::run() //Model model_dragon("res/models/dragon.ffo"); Model model_ground("res/models/wood_floor.ffo"); - Entity backpack(&model_backpack, &shaderProgram); - Entity ground(&model_ground, &shaderProgram); - Entity lightSource(&model_cube, &lightProgram); + Entity backpack(&model_backpack, shaderProgram); + Entity ground(&model_ground, shaderProgram); + Entity lightSource(&model_cube, lightProgram); lightSource.setScale(0.1f); lightSource.setRotation(glm::vec3(0.f)); lightSource.setPosition(glm::vec3(-2.f, 1.5f, 2.f)); lightSource.setIsLightSource(true); - Skybox skybox(&model_cube, &skyboxProgram, "res/textures/skybox/"); + Skybox skybox(&model_cube, skyboxProgram, "res/textures/skybox/"); - World world(&shaderProgram); + World world(shaderProgram); world.addEntity(backpack); world.addEntity(lightSource); world.addEntity(ground); @@ -143,24 +151,24 @@ void Controller::run() world.getEntities()->operator[](0).rotate(glm::vec3(0.0f, 1.0f, 0.0f), 0.2f * deltaTime); } static glm::vec3 lightColor = glm::vec3(1.f); - static float intensity = 10.f; + static float intensity = 20.f; world.updatePointLight(0, true, world.getEntities()->operator[](1).getPosition(), lightColor * intensity); world.updateDirectionalLight(true, glm::vec3(-0.2f, -1.0f, -0.3f), lightColor * 0.25f); - lightProgram.bind(); - lightProgram.setUniform("v_lightColor", lightColor * 100.0f); - lightProgram.unbind(); + lightProgram->bind(); + lightProgram->setUniform("v_lightColor", lightColor * 100.0f); + lightProgram->unbind(); // --- Render and buffer swap --- // Calc shadows static bool drawShadows = false; static bool firstRun = true; - shaderProgram.bind(); - shaderProgram.setUniform("b_drawShadows", (int)drawShadows); - shaderProgram.unbind(); + shaderProgram->bind(); + shaderProgram->setUniform("b_drawShadows", (int)drawShadows); + shaderProgram->unbind(); if (drawShadows || firstRun) { firstRun = false; - world.calculateShadows(&directionalShadowDepthProgram, &pointShadowDepthProgram); + world.calculateShadows(directionalShadowDepthProgram, pointShadowDepthProgram); } glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); @@ -180,14 +188,14 @@ void Controller::run() pp_framebuffer->render(); #ifdef _DEBUG - renderImGui(world.getEntities(), &world.getPointLights()[0], &lightColor, &rotateEntity, &rotateLightSource, &postProcessingProgram, &intensity, &drawShadows); + renderImGui(world.getEntities(), &world.getPointLights()[0], &lightColor, &rotateEntity, &rotateLightSource, postProcessingProgram, &intensity, &drawShadows); #endif glfwSwapBuffers(gameWindow->getGLFWwindow()); // Update window size if (gameWindow->checkWindowWasResized()) { - updateWindowSize(&postProcessingProgram); + updateWindowSize(postProcessingProgram); } // --- Check events, handle input --- diff --git a/src/Controller.h b/src/Controller.h index c99673b..bf48b74 100644 --- a/src/Controller.h +++ b/src/Controller.h @@ -10,6 +10,7 @@ #include "defines.h" #include "Light.h" #include "Framebuffer.h" +#include "Menu.h" class Controller @@ -34,8 +35,22 @@ private: EventHandler *gameEventHandler; Camera *camera; + /*struct shaderProgram { + + }*/ + + ShaderProgram *shaderProgram; + ShaderProgram *lightProgram; + ShaderProgram *skyboxProgram; + ShaderProgram *postProcessingProgram; + ShaderProgram *menuProgram; + ShaderProgram *directionalShadowDepthProgram; + ShaderProgram *pointShadowDepthProgram; + Framebuffer *pp_framebuffer; + Menu *menu; + const uint16_t MAX_FPS = 60; double deltaTime; diff --git a/src/Menu.cpp b/src/Menu.cpp new file mode 100644 index 0000000..140d747 --- /dev/null +++ b/src/Menu.cpp @@ -0,0 +1,23 @@ +#include "Menu.h" + +Menu::Menu(Framebuffer *p_framebuffer, ShaderProgram *p_shaderProgram) : + framebuffer(p_framebuffer), shaderProgram(p_shaderProgram) +{ + mainMenuScreen = new Screen(screenType::mainMenu, framebuffer, shaderProgram); + pauseMenuScreen = new Screen(screenType::pauseMenu, framebuffer, shaderProgram); + loadingScreen = new Screen(screenType::loadingScreen, framebuffer, shaderProgram); + optionMenuScreen = new Screen(screenType::optionMenu, framebuffer, shaderProgram); +} + +Menu::~Menu() +{ + delete mainMenuScreen; + delete pauseMenuScreen; + delete loadingScreen; + delete optionMenuScreen; +} + +void Menu::showLoadingScreen() +{ + loadingScreen->draw(); +} diff --git a/src/Menu.h b/src/Menu.h new file mode 100644 index 0000000..75ca947 --- /dev/null +++ b/src/Menu.h @@ -0,0 +1,22 @@ +#pragma once + +#include "Screen.h" +#include "Framebuffer.h" + +class Menu +{ +public: + Menu(Framebuffer *p_framebuffer, ShaderProgram *p_shaderProgram); + ~Menu(); + + void showLoadingScreen(); + +private: + Framebuffer *framebuffer; + ShaderProgram *shaderProgram; + + Screen *loadingScreen; + Screen *mainMenuScreen; + Screen *optionMenuScreen; + Screen *pauseMenuScreen; +}; diff --git a/src/Screen.cpp b/src/Screen.cpp index 796656f..27b1e60 100644 --- a/src/Screen.cpp +++ b/src/Screen.cpp @@ -1,17 +1,34 @@ #include "Screen.h" -Screen::Screen(Framebuffer *framebuffer, ShaderProgram *shaderProgram) : - framebuffer(framebuffer), shaderProgram(shaderProgram) +Screen::Screen(screenType p_type, Framebuffer *framebuffer, ShaderProgram *shaderProgram) : + type(p_type), framebuffer(framebuffer), shaderProgram(shaderProgram) { - + switch(type) { + case loadingScreen: { + Texture *temp_loadingScreenTex = new Texture("res/textures/loading.png", textureType::texture_diffuse); + textures.push_back(temp_loadingScreenTex); + Widget *temp_loadingScreenWidget = new Widget(temp_loadingScreenTex, 0.f, 0.f, 1.f, 1.f); + widgets.push_back(temp_loadingScreenWidget); + break; + } + + default: + break; + } } Screen::~Screen() { - + // Iterate over Widgets and Textures to delete all of them + for(auto it = widgets.begin(); it != widgets.end(); it++) { + delete *it; + } + for(auto it = textures.begin(); it != textures.end(); it++) { + delete *it; + } } -void Screen::addWidget(Widget* widget) +void Screen::addWidget(Widget *widget) { widgets.push_back(widget); } diff --git a/src/Screen.h b/src/Screen.h index e4e9c83..e618fdd 100644 --- a/src/Screen.h +++ b/src/Screen.h @@ -4,18 +4,30 @@ #include "Framebuffer.h" #include "Widget.h" +enum screenType +{ + loadingScreen, + mainMenu, + optionMenu, + pauseMenu, + SCREEN_TYPE_NUM_ITEMS +}; + class Screen { public: - Screen(Framebuffer *framebuffer, ShaderProgram *shaderProgram); + Screen(screenType p_type, Framebuffer *framebuffer, ShaderProgram *shaderProgram); ~Screen(); void addWidget(Widget *widget); void draw(); private: + screenType type; + Framebuffer *framebuffer; ShaderProgram *shaderProgram; + std::vector textures; std::vector widgets; };