Switch to sprite renderer
This commit is contained in:
parent
60fcecab0e
commit
68c53dad0a
@ -123,8 +123,8 @@
|
||||
<ClCompile Include="src\AssetManager.cpp" />
|
||||
<ClCompile Include="src\dengine.cpp" />
|
||||
<ClCompile Include="src\Game.cpp" />
|
||||
<ClCompile Include="src\Renderer.cpp" />
|
||||
<ClCompile Include="src\Shader.cpp" />
|
||||
<ClCompile Include="src\Sprite.cpp" />
|
||||
<ClCompile Include="src\Texture.cpp" />
|
||||
<ClCompile Include="src\Tutorial.cpp" />
|
||||
</ItemGroup>
|
||||
@ -139,8 +139,8 @@
|
||||
<ClInclude Include="src\include\Dengine\Common.h" />
|
||||
<ClInclude Include="src\include\Breakout\Game.h" />
|
||||
<ClInclude Include="src\include\Dengine\OpenGL.h" />
|
||||
<ClInclude Include="src\include\Dengine\Renderer.h" />
|
||||
<ClInclude Include="src\include\Dengine\Shader.h" />
|
||||
<ClInclude Include="src\include\Dengine\Sprite.h" />
|
||||
<ClInclude Include="src\include\Dengine\Texture.h" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
|
@ -33,7 +33,7 @@
|
||||
<ClCompile Include="src\Tutorial.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="src\Sprite.cpp">
|
||||
<ClCompile Include="src\Renderer.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
@ -62,7 +62,7 @@
|
||||
<ClInclude Include="src\include\Breakout\Game.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="src\include\Dengine\Sprite.h">
|
||||
<ClInclude Include="src\include\Dengine\Renderer.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
|
@ -3,8 +3,11 @@ layout (location = 0) in vec4 data; // (vec2)pos, (vec2)texCoord
|
||||
|
||||
out vec2 texCoord;
|
||||
|
||||
uniform mat4 model;
|
||||
uniform mat4 projection;
|
||||
|
||||
void main()
|
||||
{
|
||||
gl_Position = vec4(data.xy, 0.0f, 1.0f);
|
||||
gl_Position = projection * model * vec4(data.xy, 0.0f, 1.0f);
|
||||
texCoord = data.zw;
|
||||
}
|
||||
|
@ -8,15 +8,15 @@
|
||||
namespace Dengine
|
||||
{
|
||||
|
||||
AssetManager::AssetManager() {}
|
||||
AssetManager::~AssetManager() {}
|
||||
std::map<std::string, Texture> AssetManager::textures;
|
||||
std::map<std::string, Shader> AssetManager::shaders;
|
||||
|
||||
const Texture *AssetManager::getTexture(const std::string name)
|
||||
Texture *AssetManager::getTexture(const std::string name)
|
||||
{
|
||||
// NOTE(doyle): Since we're using a map, the count of an object can
|
||||
// only be 1 or 0
|
||||
if (mTextures.count(name) == 1)
|
||||
return &mTextures[name];
|
||||
if (textures.count(name) == 1)
|
||||
return &textures[name];
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
@ -41,14 +41,14 @@ const i32 AssetManager::loadTextureImage(const std::string path,
|
||||
tex.generate(imgWidth, imgHeight, image);
|
||||
stbi_image_free(image);
|
||||
|
||||
mTextures[name] = tex;
|
||||
textures[name] = tex;
|
||||
return 0;
|
||||
}
|
||||
|
||||
const Shader *AssetManager::getShader(const std::string name)
|
||||
Shader *AssetManager::getShader(const std::string name)
|
||||
{
|
||||
if (mShaders.count(name) == 1)
|
||||
return &mShaders[name];
|
||||
if (shaders.count(name) == 1)
|
||||
return &shaders[name];
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
@ -112,7 +112,7 @@ const i32 AssetManager::loadShaderFiles(const std::string vertexPath,
|
||||
if (result)
|
||||
return result;
|
||||
|
||||
mShaders[name] = shader;
|
||||
shaders[name] = shader;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
93
src/Game.cpp
93
src/Game.cpp
@ -1,63 +1,74 @@
|
||||
#include <Breakout\Game.h>
|
||||
#include <glm/glm.hpp>
|
||||
#include <glm/gtc/matrix_transform.hpp>
|
||||
#include <glm/gtc/type_ptr.hpp>
|
||||
|
||||
namespace Breakout
|
||||
{
|
||||
Game::Game(i32 width, i32 height) {}
|
||||
Game::~Game() {}
|
||||
Game::Game(i32 width, i32 height)
|
||||
{
|
||||
this->width = width;
|
||||
this->height = height;
|
||||
glCheckError();
|
||||
}
|
||||
|
||||
void Game::init(Dengine::AssetManager *assetManager)
|
||||
Game::~Game()
|
||||
{
|
||||
delete this->renderer;
|
||||
}
|
||||
|
||||
void Game::init()
|
||||
{
|
||||
/* Initialise assets */
|
||||
i32 result = 0;
|
||||
result = assetManager->loadShaderFiles("data/shaders/sprite.vert.glsl",
|
||||
"data/shaders/sprite.frag.glsl",
|
||||
"sprite");
|
||||
if (result)
|
||||
{
|
||||
// TODO(doyle): Do something
|
||||
}
|
||||
Dengine::AssetManager::loadShaderFiles("data/shaders/sprite.vert.glsl",
|
||||
"data/shaders/sprite.frag.glsl",
|
||||
"sprite");
|
||||
|
||||
result = assetManager->loadTextureImage("data/textures/container.jpg",
|
||||
"container");
|
||||
if (result)
|
||||
{
|
||||
|
||||
}
|
||||
Dengine::AssetManager::loadTextureImage("data/textures/container.jpg",
|
||||
"container");
|
||||
Dengine::AssetManager::loadTextureImage("data/textures/wall.jpg", "wall");
|
||||
Dengine::AssetManager::loadTextureImage("data/textures/awesomeface.png",
|
||||
"awesomeface");
|
||||
Dengine::AssetManager::loadTextureImage("data/textures/plain_terrain.jpg",
|
||||
"plain_terrain");
|
||||
glCheckError();
|
||||
|
||||
result = assetManager->loadTextureImage("data/textures/wall.jpg",
|
||||
"wall");
|
||||
if (result)
|
||||
{
|
||||
|
||||
}
|
||||
glm::mat4 projection= glm::ortho(0.0f, 1280.0f,
|
||||
720.0f, 0.0f, -1.0f, 1.0f);
|
||||
glCheckError();
|
||||
|
||||
result = assetManager->loadTextureImage("data/textures/awesomeface.png",
|
||||
"awesomeface");
|
||||
if (result)
|
||||
{
|
||||
|
||||
}
|
||||
this->shader = Dengine::AssetManager::getShader("sprite");
|
||||
this->shader->use();
|
||||
glCheckError();
|
||||
//shader->uniformSetMat4fv("projection", projection);
|
||||
glCheckError();
|
||||
|
||||
result = assetManager->loadTextureImage("data/textures/plain_terrain.png",
|
||||
"plain_terrain");
|
||||
|
||||
this->shader = assetManager->getShader("sprite");
|
||||
|
||||
/* Init player */
|
||||
const Dengine::Texture *tex = assetManager->getTexture("plain_terrain");
|
||||
this->player = Dengine::Sprite();
|
||||
this->player.loadSprite(tex, glm::vec2(0, 0));
|
||||
GLuint projectionLoc = glGetUniformLocation(this->shader->id, "projection");
|
||||
glCheckError();
|
||||
glUniformMatrix4fv(projectionLoc, 1, GL_FALSE, glm::value_ptr(projection));
|
||||
glCheckError();
|
||||
|
||||
/* Init game state */
|
||||
this->state = GAME_ACTIVE;
|
||||
|
||||
glCheckError();
|
||||
this->renderer = new Dengine::Renderer(this->shader);
|
||||
glCheckError();
|
||||
}
|
||||
|
||||
void Game::processInput(const f32 dt) {}
|
||||
void Game::update(const f32 dt) {}
|
||||
void Game::render()
|
||||
{
|
||||
shader->use();
|
||||
this->player.render(shader);
|
||||
const Dengine::Texture *tex =
|
||||
Dengine::AssetManager::getTexture("plain_terrain");
|
||||
glm::vec2 pos = glm::vec2(200, 200);
|
||||
glm::vec2 size = glm::vec2(640, 360);
|
||||
GLfloat rotation = 0;
|
||||
glm::vec3 color = glm::vec3(1.0f);
|
||||
this->renderer->drawSprite(tex, pos, size, rotation, color);
|
||||
|
||||
this->renderer->drawSprite(Dengine::AssetManager::getTexture("awesomeface"),
|
||||
glm::vec2(200, 200), glm::vec2(300, 400), 45.0f,
|
||||
glm::vec3(0.0f, 1.0f, 0.0f));
|
||||
}
|
||||
}
|
||||
|
87
src/Renderer.cpp
Normal file
87
src/Renderer.cpp
Normal file
@ -0,0 +1,87 @@
|
||||
#include <Dengine/Renderer.h>
|
||||
#include <Dengine/OpenGL.h>
|
||||
|
||||
#include <glm/gtc/matrix_transform.hpp>
|
||||
|
||||
namespace Dengine
|
||||
{
|
||||
Renderer::Renderer(Shader *shader)
|
||||
{
|
||||
this->shader = shader;
|
||||
this->initRenderData();
|
||||
}
|
||||
|
||||
Renderer::~Renderer()
|
||||
{
|
||||
glDeleteVertexArrays(1, &this->quadVAO);
|
||||
}
|
||||
void Renderer::drawSprite(const Texture *texture, glm::vec2 position,
|
||||
glm::vec2 size, GLfloat rotate, glm::vec3 color)
|
||||
{
|
||||
this->shader->use();
|
||||
glm::mat4 model;
|
||||
// First translate (transformations are: scale happens first, then rotation
|
||||
// and then finall translation happens; reversed order)
|
||||
model = glm::translate(model, glm::vec3(position, 0.0f));
|
||||
|
||||
// Move origin of rotation to center of quad
|
||||
model = glm::translate(model, glm::vec3(0.5f * size.x, 0.5f * size.y, 0.0f));
|
||||
|
||||
// Then rotate
|
||||
model = glm::rotate(model, rotate, glm::vec3(0.0f, 0.0f, 1.0f));
|
||||
|
||||
// Move origin back
|
||||
model = glm::translate(model, glm::vec3(-0.5f * size.x, -0.5f * size.y, 0.0f));
|
||||
|
||||
model = glm::scale(model, glm::vec3(size, 1.0f)); // Last scale
|
||||
|
||||
this->shader->uniformSetMat4fv("model", model);
|
||||
|
||||
// TODO(doyle): Unimplemented
|
||||
// this->shader->uniformSetVec3f("spriteColor", color);
|
||||
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
texture->bind();
|
||||
this->shader->uniformSet1i("tex", 0);
|
||||
|
||||
glBindVertexArray(this->quadVAO);
|
||||
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
||||
glBindVertexArray(0);
|
||||
}
|
||||
|
||||
void Renderer::initRenderData()
|
||||
{
|
||||
glm::vec4 vertices[] = {
|
||||
// x y s t
|
||||
{+1.0f, +1.0f, 1.0f, 1.0f}, // Top right
|
||||
{+1.0f, -1.0f, 1.0f, 0.0f}, // Bottom right
|
||||
{-1.0f, +1.0f, 0.0f, 1.0f}, // Top left
|
||||
{-1.0f, -1.0f, 0.0f, 0.0f}, // Bottom left
|
||||
};
|
||||
|
||||
GLuint VBO;
|
||||
|
||||
/* Create buffers */
|
||||
glGenVertexArrays(1, &this->quadVAO);
|
||||
glGenBuffers(1, &VBO);
|
||||
|
||||
/* Bind buffers */
|
||||
glBindBuffer(GL_ARRAY_BUFFER, VBO);
|
||||
glBindVertexArray(this->quadVAO);
|
||||
|
||||
/* Configure VBO */
|
||||
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
|
||||
|
||||
/* Configure VAO */
|
||||
const GLuint numVertexElements = 4;
|
||||
const GLuint vertexSize = sizeof(glm::vec4);
|
||||
|
||||
glEnableVertexAttribArray(0);
|
||||
glVertexAttribPointer(0, numVertexElements, GL_FLOAT, GL_FALSE, vertexSize,
|
||||
(GLvoid *)0);
|
||||
|
||||
/* Unbind */
|
||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||
glBindVertexArray(0);
|
||||
}
|
||||
}
|
@ -1,33 +1,36 @@
|
||||
#include <Dengine\Shader.h>
|
||||
|
||||
#include <glm/gtc/type_ptr.hpp>
|
||||
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
|
||||
namespace Dengine
|
||||
{
|
||||
Shader::Shader()
|
||||
: program(0)
|
||||
: id(0)
|
||||
{
|
||||
}
|
||||
|
||||
Shader::~Shader() {}
|
||||
|
||||
i32 Shader::loadProgram(GLuint vertexShader, GLuint fragmentShader)
|
||||
const i32 Shader::loadProgram(const GLuint vertexShader,
|
||||
const GLuint fragmentShader)
|
||||
{
|
||||
this->program = glCreateProgram();
|
||||
glAttachShader(this->program, vertexShader);
|
||||
glAttachShader(this->program, fragmentShader);
|
||||
glLinkProgram(this->program);
|
||||
this->id = glCreateProgram();
|
||||
glAttachShader(this->id, vertexShader);
|
||||
glAttachShader(this->id, fragmentShader);
|
||||
glLinkProgram(this->id);
|
||||
|
||||
glDeleteShader(fragmentShader);
|
||||
glDeleteShader(vertexShader);
|
||||
|
||||
GLint success;
|
||||
GLchar infoLog[512];
|
||||
glGetProgramiv(this->program, GL_LINK_STATUS, &success);
|
||||
glGetProgramiv(this->id, GL_LINK_STATUS, &success);
|
||||
if (!success)
|
||||
{
|
||||
glGetProgramInfoLog(this->program, 512, NULL, infoLog);
|
||||
glGetProgramInfoLog(this->id, 512, NULL, infoLog);
|
||||
std::cout << "glLinkProgram failed: " << infoLog << std::endl;
|
||||
return -1;
|
||||
}
|
||||
@ -36,5 +39,19 @@ i32 Shader::loadProgram(GLuint vertexShader, GLuint fragmentShader)
|
||||
|
||||
}
|
||||
|
||||
void Shader::use() const { glUseProgram(this->program); }
|
||||
void Shader::uniformSet1i(const GLchar *name, const GLuint data)
|
||||
{
|
||||
GLint uniformLoc = glGetUniformLocation(this->id, name);
|
||||
glUniform1i(uniformLoc, data);
|
||||
}
|
||||
|
||||
void Shader::uniformSetMat4fv(const GLchar *name, const glm::mat4 data)
|
||||
{
|
||||
GLint uniformLoc = glGetUniformLocation(this->id, name);
|
||||
glCheckError();
|
||||
glUniformMatrix4fv(uniformLoc, 1, GL_FALSE, glm::value_ptr(data));
|
||||
glCheckError();
|
||||
}
|
||||
|
||||
void Shader::use() const { glUseProgram(this->id); }
|
||||
}
|
||||
|
@ -1,76 +0,0 @@
|
||||
#include <Dengine\Sprite.h>
|
||||
#include <Dengine\OpenGL.h>
|
||||
|
||||
namespace Dengine
|
||||
{
|
||||
|
||||
Sprite::Sprite()
|
||||
: pos(0, 0),
|
||||
tex(nullptr)
|
||||
{
|
||||
}
|
||||
|
||||
Sprite::~Sprite() {}
|
||||
|
||||
const b32 Sprite::loadSprite(const Texture *tex, const glm::vec2 pos)
|
||||
{
|
||||
if (!tex) return -1;
|
||||
|
||||
this->tex = tex;
|
||||
this->pos = pos;
|
||||
|
||||
// NOTE(doyle): We encode in a vec4 (vec2)pos, (vec2)texCoords
|
||||
glm::vec4 spriteVertex[] = {
|
||||
// x y s t
|
||||
{+0.5f, +0.5f, 1.0f, 1.0f}, // Top right
|
||||
{+0.5f, -0.5f, 1.0f, 0.0f}, // Bottom right
|
||||
{-0.5f, +0.5f, 0.0f, 1.0f}, // Top left
|
||||
{-0.5f, -0.5f, 0.0f, 0.0f}, // Bottom left
|
||||
};
|
||||
|
||||
/* Create buffers */
|
||||
glGenBuffers(1, &this->vbo);
|
||||
glGenVertexArrays(1, &this->vao);
|
||||
|
||||
/* Bind buffers */
|
||||
glBindVertexArray(this->vao);
|
||||
glBindBuffer(GL_ARRAY_BUFFER, this->vbo);
|
||||
|
||||
/* Configure VBO */
|
||||
glBufferData(GL_ARRAY_BUFFER, sizeof(spriteVertex), spriteVertex,
|
||||
GL_STATIC_DRAW);
|
||||
|
||||
/* Configure VAO */
|
||||
i32 numElementsInVertex = 4;
|
||||
i32 vertexSize = sizeof(glm::vec4);
|
||||
|
||||
glEnableVertexAttribArray(0);
|
||||
glVertexAttribPointer(0, numElementsInVertex, GL_FLOAT, GL_FALSE,
|
||||
vertexSize, (GLvoid *)(0));
|
||||
|
||||
/* Unbind */
|
||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||
glBindVertexArray(0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void Sprite::render(const Shader *shader) const
|
||||
{
|
||||
// NOTE(doyle): Associate the VAO with this sprites VBO
|
||||
glBindVertexArray(this->vao);
|
||||
|
||||
/* Set texture */
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
this->tex->bind();
|
||||
glUniform1i(glGetUniformLocation(shader->program, "tex"), 0);
|
||||
|
||||
/* Render */
|
||||
i32 numVerticesToDraw = 4;
|
||||
glDrawArrays(GL_TRIANGLE_STRIP, 0, numVerticesToDraw);
|
||||
|
||||
// Unbind
|
||||
glBindVertexArray(0);
|
||||
}
|
||||
|
||||
}
|
@ -3,7 +3,7 @@
|
||||
#include <Dengine/Common.h>
|
||||
#include <Dengine/Shader.h>
|
||||
#include <Dengine/AssetManager.h>
|
||||
#include <Dengine/Sprite.h>
|
||||
#include <Dengine/Renderer.h>
|
||||
|
||||
#include <Breakout/Game.h>
|
||||
|
||||
@ -44,42 +44,6 @@ void scroll_callback(GLFWwindow *window, double xOffset, double yOffset)
|
||||
{
|
||||
}
|
||||
|
||||
GLenum glCheckError_(const char *file, int line)
|
||||
{
|
||||
GLenum errorCode;
|
||||
while ((errorCode = glGetError()) != GL_NO_ERROR)
|
||||
{
|
||||
std::string error;
|
||||
switch (errorCode)
|
||||
{
|
||||
case GL_INVALID_ENUM:
|
||||
error = "INVALID_ENUM";
|
||||
break;
|
||||
case GL_INVALID_VALUE:
|
||||
error = "INVALID_VALUE";
|
||||
break;
|
||||
case GL_INVALID_OPERATION:
|
||||
error = "INVALID_OPERATION";
|
||||
break;
|
||||
case GL_STACK_OVERFLOW:
|
||||
error = "STACK_OVERFLOW";
|
||||
break;
|
||||
case GL_STACK_UNDERFLOW:
|
||||
error = "STACK_UNDERFLOW";
|
||||
break;
|
||||
case GL_OUT_OF_MEMORY:
|
||||
error = "OUT_OF_MEMORY";
|
||||
break;
|
||||
case GL_INVALID_FRAMEBUFFER_OPERATION:
|
||||
error = "INVALID_FRAMEBUFFER_OPERATION";
|
||||
break;
|
||||
}
|
||||
std::cout << error << " | " << file << " (" << line << ")" << std::endl;
|
||||
}
|
||||
return errorCode;
|
||||
}
|
||||
#define glCheckError() glCheckError_(__FILE__, __LINE__)
|
||||
|
||||
int main()
|
||||
{
|
||||
glfwInit();
|
||||
@ -88,7 +52,7 @@ int main()
|
||||
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
|
||||
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
|
||||
|
||||
glm::ivec2 windowSize = glm::ivec2(800, 600);
|
||||
glm::ivec2 windowSize = glm::ivec2(1280, 720);
|
||||
|
||||
GLFWwindow *window = glfwCreateWindow(windowSize.x, windowSize.y,
|
||||
"Breakout", nullptr, nullptr);
|
||||
@ -115,6 +79,8 @@ int main()
|
||||
// regardless of success. Catch it once by calling glGetError
|
||||
glGetError();
|
||||
|
||||
glCheckError();
|
||||
|
||||
glm::ivec2 frameBufferSize;
|
||||
glfwGetFramebufferSize(window, &frameBufferSize.x, &frameBufferSize.y);
|
||||
glViewport(0, 0, frameBufferSize.x, frameBufferSize.y);
|
||||
@ -124,16 +90,23 @@ int main()
|
||||
glfwSetScrollCallback(window, scroll_callback);
|
||||
|
||||
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
|
||||
glEnable(GL_CULL_FACE | GL_BLEND);
|
||||
glEnable(GL_BLEND);
|
||||
glCheckError();
|
||||
glEnable(GL_CULL_FACE);
|
||||
glCheckError();
|
||||
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
glCheckError();
|
||||
glCullFace(GL_BACK);
|
||||
glCheckError();
|
||||
|
||||
Dengine::AssetManager assetManager;
|
||||
Breakout::Game game = Breakout::Game(frameBufferSize.x, frameBufferSize.y);
|
||||
game.init(&assetManager);
|
||||
glCheckError();
|
||||
game.init();
|
||||
glCheckError();
|
||||
|
||||
glfwSetWindowUserPointer(window, static_cast<void *>(&game));
|
||||
glCheckError();
|
||||
|
||||
f32 deltaTime = 0.0f; // Time between current frame and last frame
|
||||
f32 lastFrame = 0.0f; // Time of last frame
|
||||
@ -156,6 +129,7 @@ int main()
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
|
||||
game.render();
|
||||
glCheckError();
|
||||
|
||||
/* Swap the buffers */
|
||||
glfwSwapBuffers(window);
|
||||
|
@ -3,13 +3,12 @@
|
||||
|
||||
#include <Dengine/OpenGL.h>
|
||||
#include <Dengine/Common.h>
|
||||
#include <Dengine/Sprite.h>
|
||||
#include <Dengine/Renderer.h>
|
||||
#include <Dengine/Shader.h>
|
||||
#include <Dengine/AssetManager.h>
|
||||
|
||||
namespace Breakout
|
||||
{
|
||||
|
||||
GLOBAL_VAR const i32 NUM_KEYS = 1024;
|
||||
|
||||
enum GameState
|
||||
@ -29,14 +28,14 @@ public:
|
||||
Game(i32 width, i32 height);
|
||||
~Game();
|
||||
|
||||
void init(Dengine::AssetManager *const assetManager);
|
||||
void init();
|
||||
|
||||
void processInput(const f32 dt);
|
||||
void update(const f32 dt);
|
||||
void render();
|
||||
private:
|
||||
const Dengine::Shader *shader;
|
||||
Dengine::Sprite player;
|
||||
Dengine::Shader *shader;
|
||||
Dengine::Renderer *renderer;
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -14,23 +14,18 @@ namespace Dengine
|
||||
class AssetManager
|
||||
{
|
||||
public:
|
||||
AssetManager();
|
||||
// TODO(doyle): Unload all resources in memory
|
||||
~AssetManager();
|
||||
static std::map<std::string, Texture> textures;
|
||||
static std::map<std::string, Shader> shaders;
|
||||
|
||||
/* Texture */
|
||||
const Texture *getTexture(const std::string name);
|
||||
const i32 loadTextureImage(const std::string path, const std::string name);
|
||||
static Texture *getTexture(const std::string name);
|
||||
static const i32 loadTextureImage(const std::string path, const std::string name);
|
||||
|
||||
/* Shaders */
|
||||
const Shader *getShader(const std::string name);
|
||||
const i32 loadShaderFiles(const std::string vertexPath,
|
||||
static Shader *getShader(const std::string name);
|
||||
static const i32 loadShaderFiles(const std::string vertexPath,
|
||||
const std::string fragmentPath,
|
||||
const std::string name);
|
||||
|
||||
private:
|
||||
std::map<std::string, Texture> mTextures;
|
||||
std::map<std::string, Shader> mShaders;
|
||||
};
|
||||
}
|
||||
#endif
|
||||
|
@ -5,4 +5,43 @@
|
||||
#include <GL/glew.h>
|
||||
#include <GLFW/glfw3.h>
|
||||
|
||||
#endif
|
||||
#include <string>
|
||||
#include <iostream>
|
||||
|
||||
inline GLenum glCheckError_(const char *file, int line)
|
||||
{
|
||||
GLenum errorCode;
|
||||
while ((errorCode = glGetError()) != GL_NO_ERROR)
|
||||
{
|
||||
std::string error;
|
||||
switch (errorCode)
|
||||
{
|
||||
case GL_INVALID_ENUM:
|
||||
error = "INVALID_ENUM";
|
||||
break;
|
||||
case GL_INVALID_VALUE:
|
||||
error = "INVALID_VALUE";
|
||||
break;
|
||||
case GL_INVALID_OPERATION:
|
||||
error = "INVALID_OPERATION";
|
||||
break;
|
||||
case GL_STACK_OVERFLOW:
|
||||
error = "STACK_OVERFLOW";
|
||||
break;
|
||||
case GL_STACK_UNDERFLOW:
|
||||
error = "STACK_UNDERFLOW";
|
||||
break;
|
||||
case GL_OUT_OF_MEMORY:
|
||||
error = "OUT_OF_MEMORY";
|
||||
break;
|
||||
case GL_INVALID_FRAMEBUFFER_OPERATION:
|
||||
error = "INVALID_FRAMEBUFFER_OPERATION";
|
||||
break;
|
||||
}
|
||||
std::cout << error << " | " << file << " (" << line << ")" << std::endl;
|
||||
}
|
||||
return errorCode;
|
||||
}
|
||||
#define glCheckError() glCheckError_(__FILE__, __LINE__)
|
||||
|
||||
#endif
|
||||
|
29
src/include/Dengine/Renderer.h
Normal file
29
src/include/Dengine/Renderer.h
Normal file
@ -0,0 +1,29 @@
|
||||
#ifndef DENGINE_RENDERER_H
|
||||
#define DENGINE_RENDERER_H
|
||||
|
||||
#include <Dengine/Common.h>
|
||||
#include <Dengine/Texture.h>
|
||||
#include <Dengine/Shader.h>
|
||||
#include <GLM/glm.hpp>
|
||||
|
||||
namespace Dengine
|
||||
{
|
||||
class Renderer
|
||||
{
|
||||
public:
|
||||
Renderer(Shader *shader);
|
||||
~Renderer();
|
||||
|
||||
void drawSprite(const Texture *texture, glm::vec2 position,
|
||||
glm::vec2 size = glm::vec2(10, 10), GLfloat rotate = 0.0f,
|
||||
glm::vec3 color = glm::vec3(1.0f));
|
||||
|
||||
private:
|
||||
Shader *shader;
|
||||
GLuint quadVAO;
|
||||
|
||||
void initRenderData();
|
||||
};
|
||||
}
|
||||
|
||||
#endif
|
@ -3,6 +3,9 @@
|
||||
|
||||
#include <Dengine/Common.h>
|
||||
#include <Dengine/OpenGL.h>
|
||||
|
||||
#include <glm/glm.hpp>
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace Dengine
|
||||
@ -10,12 +13,16 @@ namespace Dengine
|
||||
class Shader
|
||||
{
|
||||
public:
|
||||
GLuint program;
|
||||
GLuint id;
|
||||
|
||||
Shader();
|
||||
~Shader();
|
||||
|
||||
i32 loadProgram(GLuint vertexShader, GLuint fragmentShader);
|
||||
const i32 loadProgram(const GLuint vertexShader,
|
||||
const GLuint fragmentShader);
|
||||
|
||||
void uniformSet1i(const GLchar *name, const GLuint data);
|
||||
void uniformSetMat4fv(const GLchar *name, const glm::mat4 data);
|
||||
|
||||
void use() const;
|
||||
};
|
||||
|
@ -1,27 +0,0 @@
|
||||
#ifndef DENGINE_SPRITE_H
|
||||
#define DENGINE_SPRITE_H
|
||||
|
||||
#include <Dengine\Common.h>
|
||||
#include <Dengine\Texture.h>
|
||||
#include <Dengine\Shader.h>
|
||||
#include <GLM\glm.hpp>
|
||||
|
||||
namespace Dengine {
|
||||
class Sprite
|
||||
{
|
||||
public:
|
||||
Sprite();
|
||||
~Sprite();
|
||||
|
||||
const b32 loadSprite(const Texture *tex, const glm::vec2 pos);
|
||||
|
||||
void render(const Shader *shader) const;
|
||||
private:
|
||||
glm::vec2 pos;
|
||||
const Texture *tex;
|
||||
GLuint vbo;
|
||||
GLuint vao;
|
||||
};
|
||||
}
|
||||
|
||||
#endif
|
@ -1,8 +1,8 @@
|
||||
#ifndef DENGINE_TEXTURE_H
|
||||
#define DENGINE_TEXTURE_H
|
||||
|
||||
#include <Dengine\OpenGL.h>
|
||||
#include <Dengine\Common.h>
|
||||
#include <Dengine/OpenGL.h>
|
||||
#include <Dengine/Common.h>
|
||||
|
||||
namespace Dengine
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user