Abstracted the Shader class to allow for different types of shaders.

Added a GUIEntity class (Currently empty) and modified GameInstance
to begin to allow rendering GUIEntities to the screen.
master
aurailus 2018-12-22 00:38:57 -08:00
parent ef079a2c55
commit d55f8a78f5
9 changed files with 88 additions and 38 deletions

View File

@ -66,6 +66,6 @@ add_executable(zeus
zeus/lua_api/LuaParser.h
zeus/lua_api/LRegisterBlock.cpp
zeus/lua_api/LRegisterBlock.h
zeus/engine/iVec3.h)
zeus/engine/iVec3.h zeus/engine/GuiEntity.cpp zeus/engine/GuiEntity.h)
target_link_libraries(zeus ${OPENGL_gl_LIBRARY} glfw libGLEW.so pthread lua dl)

View File

@ -34,14 +34,11 @@ int main(int argc, char* argv[]) {
//Get & Handle Input
glfwPollEvents();
renderer->update();
//Update game instance
game->update(deltaTime);
renderer->begin();
game->draw();
renderer->end();
if (t.elapsedNs() / (double)1000000 >= 20) {
t.printElapsedMs(); //Print frame time

View File

@ -0,0 +1,5 @@
//
// Created by aurailus on 22/12/18.
//
#include "GuiEntity.h"

19
zeus/engine/GuiEntity.h Normal file
View File

@ -0,0 +1,19 @@
//
// Created by aurailus on 22/12/18.
//
#ifndef ZEUS_GUIIENTITY_H
#define ZEUS_GUIIENTITY_H
#include <ext.hpp>
class GuiEntity {
public:
glm::mat4 getModelMatrix() {
return glm::mat4();
}
};
#endif //ZEUS_GUIIENTITY_H

View File

@ -10,10 +10,21 @@ Renderer::Renderer(GLint winWidth, GLint winHeight) {
window->initialize();
camera = new Camera(glm::vec3(0.0f, 16.0f, 0.0f), glm::vec3(0, 1, 0), -90.0f, -45.0f, 10.0f, 0.1f);
shader = new Shader();
shader->createFromFile("../zeus/shader/world.vs", "../zeus/shader/world.fs");
worldShader = new Shader();
worldShader->createFromFile("../zeus/shader/world.vs", "../zeus/shader/world.fs");
uProj = worldShader->getUniformLocation("projection");
uModel = worldShader->getUniformLocation("model");
uView = worldShader->getUniformLocation("view");
guiShader = new Shader();
guiShader->createFromFile("../zeus/shader/gui.vs", "../zeus/shader/gui.fs");
uOrtho = guiShader->getUniformLocation("matrix");
uGuiModel = guiShader->getUniformLocation("model");
projectionMatrix = glm::perspective(45.0f, window->getBufferWidth() / window->getBufferHeight(), 0.1f, 1000.0f);
orthographicMatrix = glm::ortho(0, (int)window->getBufferWidth(), (int)window->getBufferHeight(), 0);
glEnable(GL_CULL_FACE);
glEnable(GL_BLEND);
@ -28,25 +39,40 @@ void Renderer::begin() {
//Clear Window
glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}
shader->useShader();
void Renderer::enableWorldShader() {
worldShader->useShader();
glUniformMatrix4fv(shader->getProjectionLocation(), 1, GL_FALSE, glm::value_ptr(projectionMatrix));
glUniformMatrix4fv(shader->getViewLocation(), 1, GL_FALSE, glm::value_ptr(camera->calculateViewMatrix()));
glUniformMatrix4fv(uProj, 1, GL_FALSE, glm::value_ptr(projectionMatrix));
glUniformMatrix4fv(uView, 1, GL_FALSE, glm::value_ptr(camera->calculateViewMatrix()));
}
void Renderer::enableGuiShader() {
guiShader->useShader();
glUniformMatrix4fv(uOrtho, 1, GL_FALSE, glm::value_ptr(orthographicMatrix));
}
void Renderer::draw(Entity* entity) {
glUniformMatrix4fv(shader->getModelLocation(), 1, GL_FALSE, glm::value_ptr(entity->getModelMatrix()));
glUniformMatrix4fv(uModel, 1, GL_FALSE, glm::value_ptr(entity->getModelMatrix()));
entity->draw();
}
void Renderer::drawGui(GuiEntity* entity) {
glUniformMatrix4fv(uGuiModel, 1, GL_FALSE, glm::value_ptr(entity->getModelMatrix()));
}
void Renderer::end() {
Shader::clearShader();
window->swapBuffers();
}
Renderer::~Renderer() {
worldShader->cleanup();
delete worldShader;
guiShader->cleanup();
delete guiShader;
}
Window *Renderer::getWindow() {

View File

@ -9,6 +9,7 @@
#include "../Window.h"
#include "../Camera.h"
#include "../Entity.h"
#include "../GuiEntity.h"
#include <ext.hpp>
class Renderer {
@ -18,7 +19,13 @@ public:
void update();
void begin();
void enableWorldShader();
void draw(Entity* entity);
void enableGuiShader();
void drawGui(GuiEntity* entity);
void end();
Window* getWindow();
@ -30,9 +37,13 @@ private:
Camera* camera;
glm::mat4 projectionMatrix;
glm::mat4 orthographicMatrix;
//World Shader
Shader* shader;
Shader* worldShader;
GLint uModel, uProj, uView, uOrtho, uGuiModel;
Shader* guiShader;
};

View File

@ -7,9 +7,6 @@
Shader::Shader() {
shaderID = 0;
uModel = 0;
uProj = 0;
uView = 0;
}
void Shader::createFromString(const char *vertexSource, const char *fragmentSource) {
@ -74,35 +71,20 @@ void Shader::compileShader(const char *vertexSource, const char *fragmentSource)
printf("Error validating program: '%s'\n", eLog);
return;
}
uModel = glGetUniformLocation(shaderID, "model");
uProj = glGetUniformLocation(shaderID, "projection");
uView = glGetUniformLocation(shaderID, "view");
}
void Shader::useShader() {
glUseProgram(shaderID);
}
GLint Shader::getModelLocation() {
return uModel;
}
GLint Shader::getProjectionLocation() {
return uProj;
}
GLint Shader::getViewLocation() {
return uView;
GLint Shader::getUniformLocation(const char* name) {
return glGetUniformLocation(shaderID, name);
}
void Shader::cleanup() {
if (shaderID != 0) {
glDeleteProgram(shaderID);
}
uModel = 0;
uProj = 0;
}
void Shader::addShader(GLuint program, const char *shaderCode, GLenum shaderType) {

View File

@ -20,11 +20,10 @@ public:
std::string readFile(const char* fileLocation);
GLint getProjectionLocation();
GLint getModelLocation();
GLint getViewLocation();
GLint getUniformLocation(const char* name);
void useShader();
static void clearShader() {
glUseProgram(0);
}
@ -35,7 +34,6 @@ public:
private:
GLuint shaderID;
GLint uProj, uModel, uView;
void compileShader(const char* vertexSource, const char* fragmentSource);
void addShader(GLuint program, const char* shaderCode, GLenum shaderType);

View File

@ -28,9 +28,9 @@ void GameInstance::initialize(Renderer* renderer) {
// world->genNewChunk(glm::vec3(0,0,0));
int SIZE = 16;
int SIZE = 32;
for (int i = -SIZE; i < SIZE; i++) {
for (int j = -4; j < 4; j++) {
for (int j = 0; j < 3; j++) {
for (int k = -SIZE; k < SIZE; k++) {
world->genNewChunk(glm::vec3(i, j, k));
}
@ -39,6 +39,8 @@ void GameInstance::initialize(Renderer* renderer) {
}
void GameInstance::update(GLfloat deltaTime) {
renderer->update();
auto camera = renderer->getCamera();
auto window = renderer->getWindow();
@ -66,7 +68,17 @@ void GameInstance::update(GLfloat deltaTime) {
void GameInstance::draw() {
textureAtlas->getTexture()->use();
renderer->begin();
renderer->enableWorldShader();
for (auto &chunk : *world->getMeshChunks()) {
renderer->draw(chunk.second);
}
renderer->enableGuiShader();
//TODO: gui rendering here
renderer->end();
}