diff --git a/src/gfx.c b/src/gfx.c index ca888e9..9cbfba1 100644 --- a/src/gfx.c +++ b/src/gfx.c @@ -1,8 +1,22 @@ #include "gfx.h" +#include "stb_image.h" const char* vertShaderPath = "res/shader/shader.vert"; const char* fragShaderPath = "res/shader/shader.frag"; +float vertices[] = { + // position color uvs + 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, // top right + 1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, // bottom right + -1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, // bottom left + -1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f // top left +}; + +unsigned int indices[] = { + 0, 1, 3, + 1, 2, 3 +}; + SDL_Window* sdlWindow; SDL_GLContext* sdlContext; @@ -99,3 +113,65 @@ GLuint compileShader(const char* path, GLenum type) return shader; } + +void setVertexAttributes() +{ + int stride = 8*sizeof(float); + + // position + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, stride, (void*)0); + glEnableVertexAttribArray(0); + // color + glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, stride, (void*)(3*sizeof(float))); + glEnableVertexAttribArray(1); + // uv + glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, stride, (void*)(6*sizeof(float))); + glEnableVertexAttribArray(2); +} + +void createTextureFromFile() +{ + // create an opengl texture and bind it to the GL_TEXTURE_2D target + unsigned int texture; + glGenTextures(1, &texture); + glBindTexture(GL_TEXTURE_2D, texture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_REPEAT); + + // load image data from file + const char* imagePath = "res/tex.png"; + int width, height, nrChannels; + stbi_set_flip_vertically_on_load(1); + unsigned char* data = stbi_load(imagePath, &width, &height, &nrChannels, 0); + if (!data) + { + fputs("failed to load texture data: ", stderr); + fputs(imagePath, stderr); + fputs("\n", stderr); + exit(1); + } + + // read image data into bound opengl texture + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); + glGenerateMipmap(GL_TEXTURE_2D); + + stbi_image_free(data); +} + +void initBuffers() +{ + unsigned int VAO, VBO, EBO; + glGenVertexArrays(1, &VAO); // vertex array object + glGenBuffers(1, &VBO); // vertex buffer object + glGenBuffers(1, &EBO); // element buffer object + + glBindVertexArray(VAO); + + 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); +} diff --git a/src/gfx.h b/src/gfx.h index 3c16dbf..e1d66f6 100644 --- a/src/gfx.h +++ b/src/gfx.h @@ -13,3 +13,7 @@ SDL_Window* gfxInit(); unsigned int compileShaderProgram(); +void createTextureFromFile(); +void setVertexAttributes(); +void initBuffers(); + diff --git a/src/main.c b/src/main.c index f29bbe9..e9a6e73 100644 --- a/src/main.c +++ b/src/main.c @@ -1,20 +1,6 @@ #include "main.h" #include "gfx.h" -#include "stb_image.h" - -float vertices[] = { - // position color uvs - 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, // top right - 1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, // bottom right - -1.0f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, // bottom left - -1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f // top left -}; - -unsigned int indices[] = { - 0, 1, 3, - 1, 2, 3 -}; // forward declarations @@ -28,68 +14,13 @@ int main() { SDL_Window* window = gfxInit(); - // generate opengl texture - unsigned int texture; - glGenTextures(1, &texture); - glBindTexture(GL_TEXTURE_2D, texture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + createTextureFromFile(); - // load image data from file - const char* imageFile = "res/tex.png"; - int width, height, nrChannels; - stbi_set_flip_vertically_on_load(1); - unsigned char* data = stbi_load(imageFile, &width, &height, &nrChannels, 0); - if (!data) - { - fputs("failed to load texture data: ", stderr); - fputs(imageFile, stderr); - fputs("\n", stderr); - exit(1); - } - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); - glGenerateMipmap(GL_TEXTURE_2D); + initBuffers(); - // free loaded image data - stbi_image_free(data); + setVertexAttributes(); unsigned int shaderProgram = compileShaderProgram(); - - // vertex array object - unsigned int VAO; - glGenVertexArrays(1, &VAO); - // vertex buffer object - unsigned int VBO; - glGenBuffers(1, &VBO); - // element buffer object - unsigned int EBO; - glGenBuffers(1, &EBO); - - glBindVertexArray(VAO); - - // copy our vertices into a buffer opengl can use - glBindBuffer(GL_ARRAY_BUFFER, VBO); // bind it to the GL_ARRAY_BUFFER target - glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); // copy user-defined data into currently bound buffer - - // copy indices into a buffer for opengl - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); - - // set vertex attributes - - int stride = 8*sizeof(float); - // position attribute - glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, stride, (void*)0); // TODO: wtf - glEnableVertexAttribArray(0); - // color attribute - glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, stride, (void*)(3 * sizeof(float))); - glEnableVertexAttribArray(1); - // uv attribute - glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, stride, (void*)(6 * sizeof(float))); - glEnableVertexAttribArray(2); - glUseProgram(shaderProgram); // render loop @@ -99,12 +30,6 @@ int main() glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); - // update uniforms - //float time = (float)SDL_GetTicks() / 1000.0f; - //float greenValue = (sin(time)/2.0f)+0.5f; - //int vertexColorLocation = glGetUniformLocation(shaderProgram, "ourColor"); - //glUniform4f(vertexColorLocation, 0.0f, greenValue, 0.0f, 1.0f); - // draw glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); SDL_GL_SwapWindow(window);