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
parent
ef079a2c55
commit
d55f8a78f5
|
@ -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)
|
|
@ -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
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
//
|
||||
// Created by aurailus on 22/12/18.
|
||||
//
|
||||
|
||||
#include "GuiEntity.h"
|
|
@ -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
|
|
@ -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() {
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
}
|
Loading…
Reference in New Issue