diff options
Diffstat (limited to 'mons_3d/src/texture.c')
-rw-r--r-- | mons_3d/src/texture.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/mons_3d/src/texture.c b/mons_3d/src/texture.c new file mode 100644 index 0000000..7b2a478 --- /dev/null +++ b/mons_3d/src/texture.c @@ -0,0 +1,55 @@ +#include "texture.h" +#include "qoi.h" + +#include <glad/gl.h> + +mons_texture mons_texture_load(FILE *stream) { + mons_image image = mons_load_qoi(stream); + return mons_texture_from_image(image); +} + +mons_texture mons_texture_from_image(mons_image image) { + glTextureParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTextureParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + glTextureParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, + GL_NEAREST_MIPMAP_LINEAR); + glTextureParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + unsigned int texture; + glGenTextures(1, &texture); + glBindTexture(GL_TEXTURE_2D, texture); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image.width, image.height, 0, + GL_RGBA, GL_UNSIGNED_BYTE, image.data); + glGenerateMipmap(GL_TEXTURE_2D); + mons_texture result = { + .id = texture, + .width = image.width, + .height = image.height, + }; + mons_image_free(&image); + return result; +} + +char *texure_uniforms[16] = { + "base_texture", + "normal_texture", + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, +}; + +void mons_texture_bind(mons_program shader, unsigned int unit, mons_texture texture) { + glActiveTexture(GL_TEXTURE0 + unit); + glUniform1i(glGetUniformLocation(shader, texure_uniforms[unit]), unit); + glBindTexture(GL_TEXTURE_2D, texture.id); +} |