nuclear@0: #include nuclear@0: #include "texture.h" nuclear@0: nuclear@0: static int next_pow2(int x); nuclear@0: nuclear@0: int image_texture(struct texture *tex, struct image *img) nuclear@0: { nuclear@0: glGenTextures(1, &tex->id); nuclear@0: glBindTexture(GL_TEXTURE_2D, tex->id); nuclear@0: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); nuclear@0: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); nuclear@0: nuclear@0: tex->width = img->width; nuclear@0: tex->height = img->height; nuclear@0: tex->tex_width = next_pow2(tex->width); nuclear@0: tex->tex_height = next_pow2(tex->height); nuclear@0: nuclear@0: glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tex->tex_width, tex->tex_height, 0, nuclear@0: GL_RGBA, GL_UNSIGNED_BYTE, 0); nuclear@0: glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, tex->width, tex->height, nuclear@0: GL_RGBA, GL_UNSIGNED_BYTE, img->pixels); nuclear@0: return 0; nuclear@0: } nuclear@0: nuclear@1: void destroy_texture(struct texture *tex) nuclear@1: { nuclear@1: glDeleteTextures(1, &tex->id); nuclear@1: tex->id = 0; nuclear@1: } nuclear@1: nuclear@0: static int next_pow2(int x) nuclear@0: { nuclear@0: --x; nuclear@0: x |= x >> 1; nuclear@0: x |= x >> 2; nuclear@0: x |= x >> 4; nuclear@0: x |= x >> 8; nuclear@0: return x + 1; nuclear@0: }