Implement Json loading for screens and fix a bug in widget-creation
This commit is contained in:
@@ -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": [
|
||||
{
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
{
|
||||
"unique_name": "ground",
|
||||
"model": "ground",
|
||||
"shaderProgram": "defaultProgram",
|
||||
"shaderProgram": "defaultProgram"
|
||||
},
|
||||
{
|
||||
"unique_name": "light",
|
||||
|
||||
21
res/screens.json
Normal file
21
res/screens.json
Normal 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 |
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
24
src/Menu.cpp
24
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;*/
|
||||
};
|
||||
|
||||
@@ -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);
|
||||
|
||||
17
src/Screen.h
17
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<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;
|
||||
|
||||
@@ -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] = {
|
||||
|
||||
Reference in New Issue
Block a user