Implement Json loading for screens and fix a bug in widget-creation

This commit is contained in:
2021-01-16 16:49:26 +01:00
parent 2c183dc099
commit 938450ce75
13 changed files with 118 additions and 50 deletions

View File

@@ -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": [
{

View File

@@ -29,7 +29,7 @@
{
"unique_name": "ground",
"model": "ground",
"shaderProgram": "defaultProgram",
"shaderProgram": "defaultProgram"
},
{
"unique_name": "light",

21
res/screens.json Normal file
View File

@@ -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"
}
]
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 176 KiB

After

Width:  |  Height:  |  Size: 182 KiB

View File

@@ -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

View File

@@ -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();
}

View File

@@ -209,6 +209,50 @@ std::vector<Light*> JsonParser::getLights(ShaderProgram* shaderProgram)
return temp_lights;
}
std::vector<Screen*> JsonParser::getScreens(ShaderProgram *menuProgram, Framebuffer *framebuffer)
{
std::vector<Screen*> 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<Widget*> JsonParser::getWidgetsFromScreen(const Json::Value &screenJson)
{
std::vector<Widget*> 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)
{

View File

@@ -4,6 +4,7 @@
#include "Entity.h"
#include "ShaderProgram.h"
#include "Light.h"
#include "Screen.h"
#include <jsoncpp/json/json.h>
#include <string>
@@ -17,11 +18,15 @@ public:
std::vector<Model*> getModels();
std::vector<Entity*> getEntities(std::vector<Model*> &models, std::vector<ShaderProgram*> shaderPrograms);
std::vector<Light*> getLights(ShaderProgram* shaderProgram);
std::vector<Light*> getLights(ShaderProgram *shaderProgram);
std::vector<Screen*> getScreens(ShaderProgram *menuProgram, Framebuffer *framebuffer);
Skybox *getSkybox(Model *cubeModel, ShaderProgram *skyboxProgram);
std::vector<ShaderProgram*> getShaderPrograms();
private:
std::vector<Widget*> getWidgetsFromScreen(const Json::Value &screenJson);
private:
Json::Value root;
Json::CharReaderBuilder rbuilder;

View File

@@ -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;
}
}
}

View File

@@ -1,5 +1,7 @@
#pragma once
#include <string>
#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<Screen*> screens;
/*Screen *loadingScreen;
Screen *mainMenuScreen;
Screen *optionMenuScreen;
Screen *pauseMenuScreen;
Screen *pauseMenuScreen;*/
};

View File

@@ -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<Widget*> 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);

View File

@@ -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<Widget*> 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;

View File

@@ -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] = {