diff --git a/res/lights.json b/res/lights.json index 337abf9..846b679 100644 --- a/res/lights.json +++ b/res/lights.json @@ -2,7 +2,7 @@ "directionalLight": { "intensity": 0.5, "direction": [-0.2, -1.0, -0.3], - "color": [1.0, 1.0, 1.0], + "color": [1.0, 1.0, 1.0] }, "pointLights": [ { diff --git a/res/models.json b/res/models.json index 3cb6dd3..f0d8915 100644 --- a/res/models.json +++ b/res/models.json @@ -29,7 +29,7 @@ { "unique_name": "ground", "model": "ground", - "shaderProgram": "defaultProgram", + "shaderProgram": "defaultProgram" }, { "unique_name": "light", diff --git a/res/screens.json b/res/screens.json new file mode 100644 index 0000000..b2d7aac --- /dev/null +++ b/res/screens.json @@ -0,0 +1,21 @@ +{ + "loadingScreen": [ + { + "position": [0.0, 0.0], + "dimensions": [1.0, 1.0], + "texture": "res/textures/loading.png" + } + ], + "mainMenuScreen": [ + { + "position": [0.5, 0.5], + "dimensions": [0.25, 0.25], + "texture": "res/textures/container.png" + }, + { + "position": [0.75, 0.0], + "dimensions": [0.25, 0.25], + "texture": "res/textures/tex2.png" + } + ] +} diff --git a/res/textures/tex1.png b/res/textures/tex1.png index 1549425..caa8802 100644 Binary files a/res/textures/tex1.png and b/res/textures/tex1.png differ diff --git a/src/Controller.cpp b/src/Controller.cpp index 03056e2..47c3a53 100644 --- a/src/Controller.cpp +++ b/src/Controller.cpp @@ -39,7 +39,7 @@ Controller::Controller() // Show loading screen... glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - menu->showLoadingScreen(); + menu->showScreenByName("loadingScreen"); glfwSwapBuffers(gameWindow->getGLFWwindow()); world = new World(shaderPrograms); @@ -135,8 +135,6 @@ void Controller::run() camera->lookForward(); camera->updateVPM(); - glViewport(0, 0, gameWindow->getWindowWidth(), gameWindow->getWindowHeight()); - world->getSkybox()->draw(camera->getView(), camera->getProj()); world->draw(camera->getViewProj(), camera->getPosition()); @@ -146,7 +144,6 @@ void Controller::run() #ifdef _DEBUG renderImGui(world, world->getPointLights()[0], &lightColor, &rotateEntity, &rotateLightSource, getShaderProgramByName("postProcessingProgram"), &intensity, &drawShadows); #endif - glfwSwapBuffers(gameWindow->getGLFWwindow()); // Update window size diff --git a/src/Framebuffer.cpp b/src/Framebuffer.cpp index 959fe65..0017ce2 100644 --- a/src/Framebuffer.cpp +++ b/src/Framebuffer.cpp @@ -86,6 +86,7 @@ void Framebuffer::generateTextures(uint32_t width, uint32_t height) if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) std::cout << "[Error] Framebuffer is not complete!" << std::endl; + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); unbind(); } diff --git a/src/JsonParser.cpp b/src/JsonParser.cpp index 82bc2c0..9a8e3e9 100644 --- a/src/JsonParser.cpp +++ b/src/JsonParser.cpp @@ -209,6 +209,50 @@ std::vector JsonParser::getLights(ShaderProgram* shaderProgram) return temp_lights; } +std::vector JsonParser::getScreens(ShaderProgram *menuProgram, Framebuffer *framebuffer) +{ + std::vector temp_screens; + + const Json::Value loadingScreenJson = root["loadingScreen"]; + const Json::Value mainMenuScreenJson = root["mainMenuScreen"]; + + std::string name; + Screen *screen; + + name = "loadingScreen"; + screen = new Screen(name, getWidgetsFromScreen(loadingScreenJson), framebuffer, menuProgram); + temp_screens.push_back(screen); + + name = "mainMenuScreen"; + screen = new Screen(name, getWidgetsFromScreen(mainMenuScreenJson), framebuffer, menuProgram); + temp_screens.push_back(screen); + + return temp_screens; +} + +std::vector JsonParser::getWidgetsFromScreen(const Json::Value &screenJson) +{ + std::vector temp_widgets; + + // Iterate over widgets + unsigned int index = 0; + for (; index < screenJson.size(); index++) { + const Json::Value currentWidgetJson = screenJson[index]; + const Json::Value currentWidgetTextureJson =currentWidgetJson["texture"]; + const Json::Value currentWidgetPosition =currentWidgetJson["position"]; + const Json::Value currentWidgetDimensions =currentWidgetJson["dimensions"]; + Texture *currentWidgetTexture = new Texture(currentWidgetTextureJson.asString().c_str(), textureType::texture_diffuse); + Widget *currentWidget = new Widget( + currentWidgetTexture, + currentWidgetPosition[0].asFloat(), + currentWidgetPosition[1].asFloat(), + currentWidgetDimensions[0].asFloat(), + currentWidgetDimensions[1].asFloat() + ); + temp_widgets.push_back(currentWidget); + } + return temp_widgets; +} Skybox *JsonParser::getSkybox(Model *cubeModel, ShaderProgram *skyboxProgram) { diff --git a/src/JsonParser.h b/src/JsonParser.h index 17ba75a..db15ed6 100644 --- a/src/JsonParser.h +++ b/src/JsonParser.h @@ -4,6 +4,7 @@ #include "Entity.h" #include "ShaderProgram.h" #include "Light.h" +#include "Screen.h" #include #include @@ -17,11 +18,15 @@ public: std::vector getModels(); std::vector getEntities(std::vector &models, std::vector shaderPrograms); - std::vector getLights(ShaderProgram* shaderProgram); + std::vector getLights(ShaderProgram *shaderProgram); + std::vector getScreens(ShaderProgram *menuProgram, Framebuffer *framebuffer); Skybox *getSkybox(Model *cubeModel, ShaderProgram *skyboxProgram); std::vector getShaderPrograms(); +private: + std::vector getWidgetsFromScreen(const Json::Value &screenJson); + private: Json::Value root; Json::CharReaderBuilder rbuilder; diff --git a/src/Menu.cpp b/src/Menu.cpp index 140d747..6329b64 100644 --- a/src/Menu.cpp +++ b/src/Menu.cpp @@ -1,23 +1,27 @@ #include "Menu.h" +#include "JsonParser.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); + JsonParser screenParser("res/screens.json"); + screens = screenParser.getScreens(shaderProgram, framebuffer); } Menu::~Menu() { - delete mainMenuScreen; - delete pauseMenuScreen; - delete loadingScreen; - delete optionMenuScreen; + // Iterate over screens delete all items + for (auto it = screens.begin(); it != screens.end(); it++) { + delete (*it); + } } -void Menu::showLoadingScreen() +void Menu::showScreenByName(const char *unique_name) { - loadingScreen->draw(); + for (auto it = screens.begin(); it != screens.end(); it++) { + if((*it)->getUniqueName() == unique_name) { + (*it)->draw(); + break; + } + } } diff --git a/src/Menu.h b/src/Menu.h index 446b592..4edef1b 100644 --- a/src/Menu.h +++ b/src/Menu.h @@ -1,5 +1,7 @@ #pragma once +#include + #include "Screen.h" #include "Framebuffer.h" #include "JsonParser.h" @@ -10,14 +12,15 @@ public: Menu(Framebuffer *p_framebuffer, ShaderProgram *p_shaderProgram); ~Menu(); - void showLoadingScreen(); + void showScreenByName(const char *unique_name); private: Framebuffer *framebuffer; ShaderProgram *shaderProgram; - Screen *loadingScreen; + std::vector screens; + /*Screen *loadingScreen; Screen *mainMenuScreen; Screen *optionMenuScreen; - Screen *pauseMenuScreen; + Screen *pauseMenuScreen;*/ }; diff --git a/src/Screen.cpp b/src/Screen.cpp index 27b1e60..e676e28 100644 --- a/src/Screen.cpp +++ b/src/Screen.cpp @@ -1,20 +1,14 @@ #include "Screen.h" -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; - } +uint32_t Screen::id_counter = 0; - default: - break; - } +Screen::Screen(std::string &name, std::vector widgets, Framebuffer *framebuffer, ShaderProgram *shaderProgram) : + unique_name(name), + framebuffer(framebuffer), + shaderProgram(shaderProgram), + widgets(widgets) +{ + id = id_counter++; } Screen::~Screen() @@ -28,6 +22,11 @@ Screen::~Screen() } } +std::string Screen::getUniqueName() +{ + return unique_name; +} + void Screen::addWidget(Widget *widget) { widgets.push_back(widget); @@ -37,7 +36,6 @@ void Screen::draw() { framebuffer->setExposureCorrection(false); framebuffer->bind(); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); for(auto it = widgets.begin(); it != widgets.end(); it++) { (*it)->draw(shaderProgram); diff --git a/src/Screen.h b/src/Screen.h index e618fdd..7a41d5d 100644 --- a/src/Screen.h +++ b/src/Screen.h @@ -4,26 +4,21 @@ #include "Framebuffer.h" #include "Widget.h" -enum screenType -{ - loadingScreen, - mainMenu, - optionMenu, - pauseMenu, - SCREEN_TYPE_NUM_ITEMS -}; - class Screen { public: - Screen(screenType p_type, Framebuffer *framebuffer, ShaderProgram *shaderProgram); + Screen(std::string &name, std::vector widgets, Framebuffer *framebuffer, ShaderProgram *shaderProgram); ~Screen(); void addWidget(Widget *widget); void draw(); + + std::string getUniqueName(); private: - screenType type; + uint32_t id; + static uint32_t id_counter; + std::string unique_name; Framebuffer *framebuffer; ShaderProgram *shaderProgram; diff --git a/src/Widget.cpp b/src/Widget.cpp index 43ca054..199b2c5 100644 --- a/src/Widget.cpp +++ b/src/Widget.cpp @@ -9,10 +9,10 @@ Widget::Widget(Texture *texture, float p_x, float p_y, float p_w, float p_h) : const double ofst = 0.005; double widgetVerticesData[12] = { - x + w + ofst, -1.0f + 2*y - ofst, 0.0f, // Bottom right - -1.0f + 2*x - ofst, y + h + ofst, 0.0f, // Top left - -1.0f + 2*x-ofst, -1.0f + 2*y - ofst, 0.0f, // Bottom left - x + w + ofst, y + h + ofst, 0.0f // Top right + 2 * (x + w) - 1.0f + ofst, 2 * (y) - 1.0f - ofst, 0.0f, // Bottom right + 2 * (x) - 1.0f - ofst, 2 * (y + h) - 1.0f + ofst, 0.0f, // Top left + 2 * (x) - 1.0f - ofst, 2 * (y) - 1.0f - ofst, 0.0f, // Bottom left + 2 * (x + w) - 1.0f + ofst, 2 * (y + h) - 1.0f + ofst, 0.0f // Top right }; unsigned int widgetIndicesData[6] = {