Introduce Menu class
This commit is contained in:
@@ -15,6 +15,7 @@ add_executable(Fall-Fever
|
||||
Framebuffer.cpp
|
||||
Widget.cpp
|
||||
Screen.cpp
|
||||
Menu.cpp
|
||||
)
|
||||
|
||||
target_link_libraries(
|
||||
|
||||
@@ -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 ---
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
23
src/Menu.cpp
Normal file
23
src/Menu.cpp
Normal file
@@ -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();
|
||||
}
|
||||
22
src/Menu.h
Normal file
22
src/Menu.h
Normal file
@@ -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;
|
||||
};
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
14
src/Screen.h
14
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<Texture*> textures;
|
||||
std::vector<Widget*> widgets;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user