diff --git a/Dengine.vcxproj b/Dengine.vcxproj
index 24fa02b..19c88bf 100644
--- a/Dengine.vcxproj
+++ b/Dengine.vcxproj
@@ -122,8 +122,10 @@
+
+
@@ -132,6 +134,7 @@
+
diff --git a/Dengine.vcxproj.filters b/Dengine.vcxproj.filters
index 4129db9..e49228a 100644
--- a/Dengine.vcxproj.filters
+++ b/Dengine.vcxproj.filters
@@ -27,6 +27,12 @@
Source Files
+
+ Source Files
+
+
+ Source Files
+
@@ -48,5 +54,8 @@
Header Files
+
+ Header Files
+
\ No newline at end of file
diff --git a/src/Game.cpp b/src/Game.cpp
new file mode 100644
index 0000000..566da93
--- /dev/null
+++ b/src/Game.cpp
@@ -0,0 +1,13 @@
+#include
+
+namespace Breakout
+{
+Game::Game(i32 width, i32 height) {}
+Game::~Game() {}
+
+void Game::init() {}
+
+void Game::processInput(f32 dt) {}
+void Game::update(f32 dt) {}
+void Game::render() {}
+}
diff --git a/src/Texture.cpp b/src/Texture.cpp
index 6043846..4536c57 100644
--- a/src/Texture.cpp
+++ b/src/Texture.cpp
@@ -16,14 +16,44 @@ Texture::Texture()
glGenTextures(1, &mId);
}
+enum BytesPerPixel
+{
+ Greyscale = 1,
+ GreyscaleAlpha = 2,
+ RGB = 3,
+ RGBA = 4,
+};
+
+INTERNAL GLint getGLFormat(BytesPerPixel bytesPerPixel, b32 srgb)
+{
+ switch (bytesPerPixel)
+ {
+ case Greyscale:
+ return GL_LUMINANCE;
+ case GreyscaleAlpha:
+ return GL_LUMINANCE_ALPHA;
+ case RGB:
+ return (srgb ? GL_SRGB : GL_RGB);
+ case RGBA:
+ return (srgb ? GL_SRGB_ALPHA : GL_RGBA);
+ default:
+ // TODO(doyle): Invalid
+ //std::cout << "getGLFormat() invalid bytesPerPixel: "
+ // << bytesPerPixel << std::endl;
+ return GL_LUMINANCE;
+ }
+}
+
void Texture::generate(GLuint width, GLuint height, u8 *image)
{
+ // TODO(doyle): Let us set the parameters gl params as well
mWidth = width;
mHeight = height;
glBindTexture(GL_TEXTURE_2D, mId);
/* Load image into texture */
+ // TODO(doyle) Figure out the gl format
glTexImage2D(GL_TEXTURE_2D, 0, mInternalFormat, mWidth, mHeight, 0,
mImageFormat, GL_UNSIGNED_BYTE, image);
glGenerateMipmap(GL_TEXTURE_2D);
diff --git a/src/Tutorial.cpp b/src/Tutorial.cpp
new file mode 100644
index 0000000..385456c
--- /dev/null
+++ b/src/Tutorial.cpp
@@ -0,0 +1,377 @@
+#if 0
+#include
+#include
+#include
+#include
+
+#include
+#include
+#include
+
+#include
+#include
+#include
+#include
+
+glm::vec3 cameraPos = glm::vec3(0.0f, 0.0f, 3.0f);
+glm::vec3 cameraFront = glm::vec3(0.0f, 0.0f, -1.0f);
+glm::vec3 cameraUp = glm::vec3(0.0f, 1.0f, 0.0f);
+
+f32 lastX = 400;
+f32 lastY = 300;
+f32 yaw = -90.0f;
+f32 pitch = 0.0f;
+f32 fov = 45.0f;
+b32 firstMouse;
+
+b32 keys[1024];
+
+enum BytesPerPixel
+{
+ Greyscale = 1,
+ GreyscaleAlpha = 2,
+ RGB = 3,
+ RGBA = 4,
+};
+
+INTERNAL GLint getGLFormat(BytesPerPixel bytesPerPixel, b32 srgb)
+{
+ switch (bytesPerPixel)
+ {
+ case Greyscale:
+ return GL_LUMINANCE;
+ case GreyscaleAlpha:
+ return GL_LUMINANCE_ALPHA;
+ case RGB:
+ return (srgb ? GL_SRGB : GL_RGB);
+ case RGBA:
+ return (srgb ? GL_SRGB_ALPHA : GL_RGBA);
+ default:
+ // TODO(doyle): Invalid
+ std::cout << "getGLFormat() invalid bytesPerPixel: "
+ << bytesPerPixel << std::endl;
+ return GL_LUMINANCE;
+ }
+}
+
+void doMovement(f32 deltaTime)
+{
+ f32 cameraSpeed = 5.00f * deltaTime;
+ if (keys[GLFW_KEY_W])
+ cameraPos += (cameraSpeed * cameraFront);
+ if (keys[GLFW_KEY_S])
+ cameraPos -= (cameraSpeed * cameraFront);
+ if (keys[GLFW_KEY_A])
+ cameraPos -=
+ glm::normalize(glm::cross(cameraFront, cameraUp)) * cameraSpeed;
+ if (keys[GLFW_KEY_D])
+ cameraPos +=
+ glm::normalize(glm::cross(cameraFront, cameraUp)) * cameraSpeed;
+}
+
+void key_callback(GLFWwindow *window, int key, int scancode, int action,
+ int mode)
+{
+ if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
+ {
+ glfwSetWindowShouldClose(window, GL_TRUE);
+ }
+
+ if (key >= 0 && key < 1024)
+ {
+ if (action == GLFW_PRESS)
+ keys[key] = TRUE;
+ else if (action == GLFW_RELEASE)
+ keys[key] = FALSE;
+ }
+}
+
+void mouse_callback(GLFWwindow *window, double xPos, double yPos)
+{
+ if (firstMouse)
+ {
+ lastX = (f32)xPos;
+ lastY = (f32)yPos;
+ firstMouse = false;
+ }
+
+ f32 xOffset = (f32)xPos - lastX;
+ f32 yOffset = lastY - (f32)yPos;
+ lastX = (f32)xPos;
+ lastY = (f32)yPos;
+
+ f32 sensitivity = 0.05f;
+ xOffset *= sensitivity;
+ yOffset *= sensitivity;
+
+ yaw += xOffset;
+ pitch += yOffset;
+
+ if (pitch > 89.0f)
+ pitch = 89.0f;
+ else if (pitch < -89.0f)
+ pitch = -89.0f;
+
+ glm::vec3 front;
+ front.x = cos(glm::radians(pitch)) * cos(glm::radians(yaw));
+ front.y = sin(glm::radians(pitch));
+ front.z = cos(glm::radians(pitch)) * sin(glm::radians(yaw));
+ cameraFront = glm::normalize(front);
+}
+
+void scroll_callback(GLFWwindow *window, double xOffset, double yOffset)
+{
+ if (fov >= 1.0f && fov <= 45.0f)
+ fov -= (f32)yOffset;
+ else if (fov <= 1.0f)
+ fov = 1.0f;
+ else // fov >= 45.0f
+ fov = 45.0f;
+}
+
+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();
+ glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
+ glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
+ glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
+ glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
+
+ glm::ivec2 windowSize = glm::ivec2(800, 600);
+
+ GLFWwindow *window = glfwCreateWindow(windowSize.x, windowSize.y,
+ "LearnOpenGL", nullptr, nullptr);
+
+ if (!window)
+ {
+ std::cout << "glfwCreateWindow() failed: Failed to create window" << std::endl;
+ glfwTerminate();
+ return -1;
+ }
+
+ glfwMakeContextCurrent(window);
+
+ /* Make GLEW use more modern technies for OGL on core profile*/
+ glewExperimental = GL_TRUE;
+ if (glewInit() != GLEW_OK)
+ {
+ std::cout << "glewInit() failed: Failed to initialise GLEW"
+ << std::endl;
+ return -1;
+ }
+
+ glm::ivec2 frameBufferSize;
+ glfwGetFramebufferSize(window, &frameBufferSize.x, &frameBufferSize.y);
+ glViewport(0, 0, frameBufferSize.x, frameBufferSize.y);
+
+ glfwSetKeyCallback(window, key_callback);
+ glfwSetCursorPosCallback(window, mouse_callback);
+ glfwSetScrollCallback(window, scroll_callback);
+
+ glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
+ firstMouse = TRUE;
+
+ glEnable(GL_DEPTH_TEST | GL_CULL_FACE);
+ glCullFace(GL_BACK);
+
+ /* Initialise shaders */
+ Dengine::AssetManager assetManager;
+ i32 result = 0;
+
+ result = assetManager.loadShaderFiles("data/shaders/default.vert.glsl",
+ "data/shaders/default.frag.glsl",
+ "default");
+ if (result) return result;
+
+ /* Load a texture */
+ result = assetManager.loadTextureImage("data/textures/container.jpg",
+ "container");
+ if (result) return result;
+
+ result = assetManager.loadTextureImage("data/textures/wall.jpg",
+ "wall");
+ if (result) return result;
+
+ Dengine::Texture *containerTex = assetManager.getTexture("container");
+ Dengine::Texture *wallTex = assetManager.getTexture("wall");
+ Dengine::Shader *shader = assetManager.getShader("default");
+
+ /* Create OGL Vertex objects */
+ GLfloat sceneVertex[] = {
+ // Positions Colors Texture Coords
+ // Floor
+ +0.5f, +0.5f, +0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, // Top Right
+ +0.5f, -0.5f, +0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, // Bottom Right
+ -0.5f, -0.5f, +0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, // Bottom left
+ -0.5f, +0.5f, +0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, // Top left
+
+ // Wall
+ +0.5f, +0.5f, +0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, // Top Right
+ +0.5f, -0.5f, +0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, // Bottom Right
+ -0.5f, -0.5f, +0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, // Bottom left
+ -0.5f, +0.5f, +0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, // Top left
+ };
+
+ GLuint sceneIndices[] = {
+ // Floor
+ 0, 3, 1, // First triangle
+ 1, 2, 3, // Second triangle
+
+ // Wall
+ 4, 7, 5, // First triangle
+ 5, 6, 7, // Second triangle
+ };
+
+ GLuint vbo, vao;
+ glGenVertexArrays(1, &vao);
+ glGenBuffers(1, &vbo);
+ GLuint ebo;
+ glGenBuffers(1, &ebo);
+
+ // 1. Bind vertex array object
+ glBindVertexArray(vao);
+
+ // 2. Bind and set vertex buffer(s) and attribute pointer(s)
+ glBindBuffer(GL_ARRAY_BUFFER, vbo);
+ glBufferData(GL_ARRAY_BUFFER, sizeof(sceneVertex), sceneVertex,
+ GL_STATIC_DRAW);
+
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
+ glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(sceneIndices), sceneIndices,
+ GL_STATIC_DRAW);
+
+ const i32 numPos = 3;
+ const i32 numColors = 3;
+ const i32 numTexCoord = 2;
+
+ const GLint vertexSize =
+ (numPos + numColors + numTexCoord) * sizeof(GLfloat);
+
+ const GLint vertByteOffset = 0;
+ const GLint colorByteOffset = vertByteOffset + (numPos * sizeof(GLfloat));
+ const GLint texCoordByteOffset = colorByteOffset + (numColors * sizeof(GLfloat));
+
+ glVertexAttribPointer(0, numPos, GL_FLOAT, GL_FALSE, vertexSize,
+ (GLvoid *)vertByteOffset);
+ glEnableVertexAttribArray(0);
+ glVertexAttribPointer(1, numColors, GL_FLOAT, GL_FALSE, vertexSize,
+ (GLvoid *)colorByteOffset);
+ glEnableVertexAttribArray(1);
+ glVertexAttribPointer(2, numTexCoord, GL_FLOAT, GL_FALSE, vertexSize,
+ (GLvoid *)texCoordByteOffset);
+ glEnableVertexAttribArray(2);
+
+ // 4. Unbind to prevent mistakes
+ glBindBuffer(GL_ARRAY_BUFFER, 0);
+ glBindVertexArray(0);
+
+ f32 deltaTime = 0.0f; // Time between current frame and last frame
+ f32 lastFrame = 0.0f; // Time of last frame
+
+ /* Main game loop */
+ while (!glfwWindowShouldClose(window))
+ {
+ f32 currentFrame = (f32)glfwGetTime();
+ deltaTime = currentFrame - lastFrame;
+ lastFrame = currentFrame;
+
+ /* Check and call events */
+ glfwPollEvents();
+ doMovement(deltaTime);
+
+ /* Rendering commands here*/
+ glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ /* Bind textures */
+ glActiveTexture(GL_TEXTURE0);
+ shader->use();
+
+ /* Camera/View transformation */
+ glm::mat4 model;
+ model = glm::translate(model, glm::vec3(0.0f, -0.3f, 0.0f));
+ model = glm::rotate(model, glm::radians(-90.0f), glm::vec3(1.0f, 0.0f, 0.0f));
+
+ glm::mat4 view;
+ // NOTE(doyle): Lookat generates the matrix for camera coordinate axis
+ view = glm::lookAt(cameraPos, cameraPos + cameraFront, cameraUp);
+
+ /* Projection */
+ glm::mat4 projection;
+ f32 aspectRatio = static_cast(frameBufferSize.x) /
+ static_cast(frameBufferSize.y);
+ projection = glm::perspective(fov, aspectRatio, 0.1f, 100.0f);
+
+ /* Get shader uniform locations */
+ GLuint modelLoc = glGetUniformLocation(shader->mProgram, "model");
+ GLuint viewLoc = glGetUniformLocation(shader->mProgram, "view");
+ GLuint projectionLoc =
+ glGetUniformLocation(shader->mProgram, "projection");
+
+ /* Pass matrices to the shader */
+ glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model));
+ glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(view));
+ glUniformMatrix4fv(projectionLoc, 1, GL_FALSE, glm::value_ptr(projection));
+
+ glBindVertexArray(vao);
+
+ glBindTexture(GL_TEXTURE_2D, containerTex->mId);
+ glUniform1i(glGetUniformLocation(shader->mProgram, "ourTexture"), 0);
+ glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
+
+ glBindTexture(GL_TEXTURE_2D, wallTex->mId);
+ glUniform1i(glGetUniformLocation(shader->mProgram, "ourTexture"), 0);
+ glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, (GLvoid *)&sceneVertex[4]);
+
+ glBindVertexArray(0);
+
+ /* Swap the buffers */
+ glfwSwapBuffers(window);
+ }
+
+ glDeleteVertexArrays(1, &vao);
+ glDeleteBuffers(1, &vbo);
+#if 0
+ glDeleteBuffers(1, &ebo);
+#endif
+
+ glfwTerminate();
+ return 0;
+}
+#endif
diff --git a/src/dengine.cpp b/src/dengine.cpp
index acf1753..97a0d37 100644
--- a/src/dengine.cpp
+++ b/src/dengine.cpp
@@ -1,8 +1,11 @@
+#if 1
#include
#include
#include
#include
+#include
+
#include
#include
#include
@@ -12,120 +15,32 @@
#include
#include
-glm::vec3 cameraPos = glm::vec3(0.0f, 0.0f, 3.0f);
-glm::vec3 cameraFront = glm::vec3(0.0f, 0.0f, -1.0f);
-glm::vec3 cameraUp = glm::vec3(0.0f, 1.0f, 0.0f);
-
-f32 lastX = 400;
-f32 lastY = 300;
-f32 yaw = -90.0f;
-f32 pitch = 0.0f;
-f32 fov = 45.0f;
-b32 firstMouse;
-
-b32 keys[1024];
-
-enum BytesPerPixel
-{
- Greyscale = 1,
- GreyscaleAlpha = 2,
- RGB = 3,
- RGBA = 4,
-};
-
-INTERNAL GLint getGLFormat(BytesPerPixel bytesPerPixel, b32 srgb)
-{
- switch (bytesPerPixel)
- {
- case Greyscale:
- return GL_LUMINANCE;
- case GreyscaleAlpha:
- return GL_LUMINANCE_ALPHA;
- case RGB:
- return (srgb ? GL_SRGB : GL_RGB);
- case RGBA:
- return (srgb ? GL_SRGB_ALPHA : GL_RGBA);
- default:
- // TODO(doyle): Invalid
- std::cout << "getGLFormat() invalid bytesPerPixel: "
- << bytesPerPixel << std::endl;
- return GL_LUMINANCE;
- }
-}
-
-void doMovement(f32 deltaTime)
-{
- f32 cameraSpeed = 5.00f * deltaTime;
- if (keys[GLFW_KEY_W])
- cameraPos += (cameraSpeed * cameraFront);
- if (keys[GLFW_KEY_S])
- cameraPos -= (cameraSpeed * cameraFront);
- if (keys[GLFW_KEY_A])
- cameraPos -=
- glm::normalize(glm::cross(cameraFront, cameraUp)) * cameraSpeed;
- if (keys[GLFW_KEY_D])
- cameraPos +=
- glm::normalize(glm::cross(cameraFront, cameraUp)) * cameraSpeed;
-}
-
void key_callback(GLFWwindow *window, int key, int scancode, int action,
int mode)
{
+ Breakout::Game *game =
+ static_cast(glfwGetWindowUserPointer(window));
+
if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
{
glfwSetWindowShouldClose(window, GL_TRUE);
}
- if (key >= 0 && key < 1024)
+ if (key >= 0 && key < Breakout::NUM_KEYS)
{
if (action == GLFW_PRESS)
- keys[key] = TRUE;
+ game->keys[key] = TRUE;
else if (action == GLFW_RELEASE)
- keys[key] = FALSE;
+ game->keys[key] = FALSE;
}
}
void mouse_callback(GLFWwindow *window, double xPos, double yPos)
{
- if (firstMouse)
- {
- lastX = (f32)xPos;
- lastY = (f32)yPos;
- firstMouse = false;
- }
-
- f32 xOffset = (f32)xPos - lastX;
- f32 yOffset = lastY - (f32)yPos;
- lastX = (f32)xPos;
- lastY = (f32)yPos;
-
- f32 sensitivity = 0.05f;
- xOffset *= sensitivity;
- yOffset *= sensitivity;
-
- yaw += xOffset;
- pitch += yOffset;
-
- if (pitch > 89.0f)
- pitch = 89.0f;
- else if (pitch < -89.0f)
- pitch = -89.0f;
-
- glm::vec3 front;
- front.x = cos(glm::radians(pitch)) * cos(glm::radians(yaw));
- front.y = sin(glm::radians(pitch));
- front.z = cos(glm::radians(pitch)) * sin(glm::radians(yaw));
- cameraFront = glm::normalize(front);
}
void scroll_callback(GLFWwindow *window, double xOffset, double yOffset)
{
- if (fov >= 1.0f && fov <= 45.0f)
- fov -= (f32)yOffset;
- else if (fov <= 1.0f)
- fov = 1.0f;
- else // fov >= 45.0f
- fov = 45.0f;
}
GLenum glCheckError_(const char *file, int line)
@@ -172,12 +87,15 @@ int main()
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
- GLFWwindow *window =
- glfwCreateWindow(800, 600, "LearnOpenGL", nullptr, nullptr);
+ glm::ivec2 windowSize = glm::ivec2(800, 600);
+
+ GLFWwindow *window = glfwCreateWindow(windowSize.x, windowSize.y,
+ "Breakout", nullptr, nullptr);
if (!window)
{
- std::cout << "glfwCreateWindow() failed: Failed to create window" << std::endl;
+ std::cout << "glfwCreateWindow() failed: Failed to create window"
+ << std::endl;
glfwTerminate();
return -1;
}
@@ -192,21 +110,28 @@ int main()
<< std::endl;
return -1;
}
+ // NOTE(doyle): glewInit() bug that sets the gl error flag after init
+ // regardless of success. Catch it once by calling glGetError
+ glGetError();
- i32 screenWidth, screenHeight;
- glfwGetFramebufferSize(window, &screenWidth, &screenHeight);
- glViewport(0, 0, screenWidth, screenHeight);
+ glm::ivec2 frameBufferSize;
+ glfwGetFramebufferSize(window, &frameBufferSize.x, &frameBufferSize.y);
+ glViewport(0, 0, frameBufferSize.x, frameBufferSize.y);
glfwSetKeyCallback(window, key_callback);
glfwSetCursorPosCallback(window, mouse_callback);
glfwSetScrollCallback(window, scroll_callback);
glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);
- firstMouse = TRUE;
+ glEnable(GL_CULL_FACE | GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glCullFace(GL_BACK);
- glEnable(GL_DEPTH_TEST);
+ Breakout::Game game = Breakout::Game(frameBufferSize.x, frameBufferSize.y);
+ glfwSetWindowUserPointer(window, static_cast(&game));
+ game.init();
- /* Initialise shaders */
+ /* Initialise shaders */
Dengine::AssetManager assetManager;
i32 result = 0;
@@ -220,64 +145,14 @@ int main()
"container");
if (result) return result;
+ result = assetManager.loadTextureImage("data/textures/wall.jpg",
+ "wall");
+ if (result) return result;
+
Dengine::Texture *containerTex = assetManager.getTexture("container");
+ Dengine::Texture *wallTex = assetManager.getTexture("wall");
Dengine::Shader *shader = assetManager.getShader("default");
- /* Create OGL Vertex objects */
- GLfloat vertices[] = {
- // Positions Colors Texture Coords
- +0.5f, +0.5f, +0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, // Top Right
- +0.5f, -0.5f, +0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, // Bottom Right
- -0.5f, -0.5f, +0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, // Bottom left
- -0.5f, +0.5f, +0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, // Top left
- };
-
- GLuint indices[] = {
- 0, 1, 3, // First triangle
- 1, 2, 3, // First triangle
- };
-
- GLuint vbo, vao;
- glGenVertexArrays(1, &vao);
- glGenBuffers(1, &vbo);
- GLuint ebo;
- glGenBuffers(1, &ebo);
-
- // 1. Bind vertex array object
- glBindVertexArray(vao);
-
- // 2. Bind and set vertex buffer(s) and attribute pointer(s)
- glBindBuffer(GL_ARRAY_BUFFER, vbo);
- glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
-
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
- glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
-
- const i32 numPos = 3;
- const i32 numColors = 3;
- const i32 numTexCoord = 2;
-
- const GLint vertexSize =
- (numPos + numColors + numTexCoord) * sizeof(GLfloat);
-
- const GLint vertByteOffset = 0;
- const GLint colorByteOffset = vertByteOffset + (numPos * sizeof(GLfloat));
- const GLint texCoordByteOffset = colorByteOffset + (numColors * sizeof(GLfloat));
-
- glVertexAttribPointer(0, numPos, GL_FLOAT, GL_FALSE, vertexSize,
- (GLvoid *)vertByteOffset);
- glEnableVertexAttribArray(0);
- glVertexAttribPointer(1, numColors, GL_FLOAT, GL_FALSE, vertexSize,
- (GLvoid *)colorByteOffset);
- glEnableVertexAttribArray(1);
- glVertexAttribPointer(2, numTexCoord, GL_FLOAT, GL_FALSE, vertexSize,
- (GLvoid *)texCoordByteOffset);
- glEnableVertexAttribArray(2);
-
- // 4. Unbind to prevent mistakes
- glBindBuffer(GL_ARRAY_BUFFER, 0);
- glBindVertexArray(0);
-
f32 deltaTime = 0.0f; // Time between current frame and last frame
f32 lastFrame = 0.0f; // Time of last frame
@@ -290,56 +165,25 @@ int main()
/* Check and call events */
glfwPollEvents();
- doMovement(deltaTime);
+
+ game.processInput(deltaTime);
+ game.update(deltaTime);
/* Rendering commands here*/
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- /* Bind textures */
- glActiveTexture(GL_TEXTURE0);
- glBindTexture(GL_TEXTURE_2D, containerTex->mId);
- glUniform1i(glGetUniformLocation(shader->mProgram, "ourTexture"), 0);
-
shader->use();
-
- /* Camera/View transformation */
- glm::mat4 model;
- glm::mat4 view;
- // NOTE(doyle): Lookat generates the matrix for camera coordinate axis
- view = glm::lookAt(cameraPos, cameraPos + cameraFront, cameraUp);
-
- /* Projection */
- glm::mat4 projection;
- projection = glm::perspective(fov,
- ((f32)screenWidth / (f32)screenHeight),
- 0.1f, 100.0f);
-
- /* Get shader uniform locations */
- GLuint modelLoc = glGetUniformLocation(shader->mProgram, "model");
- GLuint viewLoc = glGetUniformLocation(shader->mProgram, "view");
- GLuint projectionLoc =
- glGetUniformLocation(shader->mProgram, "projection");
-
- /* Pass matrices to the shader */
- glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model));
- glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(view));
- glUniformMatrix4fv(projectionLoc, 1, GL_FALSE, glm::value_ptr(projection));
-
- glBindVertexArray(vao);
- glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
- glBindVertexArray(0);
+ game.render();
/* Swap the buffers */
glfwSwapBuffers(window);
}
- glDeleteVertexArrays(1, &vao);
- glDeleteBuffers(1, &vbo);
-#if 0
- glDeleteBuffers(1, &ebo);
-#endif
-
glfwTerminate();
return 0;
}
+
+#else
+#include
+#endif
diff --git a/src/include/Breakout/Game.h b/src/include/Breakout/Game.h
new file mode 100644
index 0000000..77b359a
--- /dev/null
+++ b/src/include/Breakout/Game.h
@@ -0,0 +1,37 @@
+#ifndef BREAKOUT_GAME_H
+#define BREAKOUT_GAME_H
+
+#include
+#include
+
+namespace Breakout
+{
+
+GLOBAL_VAR const i32 NUM_KEYS = 1024;
+
+enum GameState
+{
+ GAME_ACTIVE,
+ GAME_MENU,
+ GAME_WIN
+};
+
+class Game
+{
+public:
+ GameState mState;
+ GLboolean keys[NUM_KEYS];
+ i32 width, height;
+
+ Game(i32 width, i32 height);
+ ~Game();
+
+ void init();
+
+ void processInput(f32 dt);
+ void update(f32 dt);
+ void render();
+};
+}
+
+#endif
diff --git a/src/include/Dengine/AssetManager.h b/src/include/Dengine/AssetManager.h
index 429c059..c76b123 100644
--- a/src/include/Dengine/AssetManager.h
+++ b/src/include/Dengine/AssetManager.h
@@ -15,6 +15,7 @@ class AssetManager
{
public:
AssetManager();
+ // TODO(doyle): Unload all resources in memory
~AssetManager();
/* Texture */