nuclear@3: #include nuclear@3: #include "opengl.h" nuclear@3: nuclear@3: static void bind_common(GLenum type, unsigned int tex, int tex_unit); nuclear@3: nuclear@3: unsigned int load_texture(const char *fname) nuclear@3: { nuclear@3: unsigned int tex; nuclear@3: struct img_pixmap img; nuclear@3: int intfmt, fmt, type; nuclear@3: nuclear@3: img_init(&img); nuclear@3: if(img_load(&img, fname) == -1) { nuclear@3: fprintf(stderr, "failed to load texture: %s\n", fname); nuclear@3: return 0; nuclear@3: } nuclear@3: intfmt = img_glintfmt(&img); nuclear@3: fmt = img_glfmt(&img); nuclear@3: type = img_gltype(&img); nuclear@3: nuclear@3: glGenTextures(1, &tex); nuclear@3: glBindTexture(GL_TEXTURE_2D, tex); nuclear@3: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); nuclear@3: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); nuclear@3: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); nuclear@3: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); nuclear@3: glTexImage2D(GL_TEXTURE_2D, 0, intfmt, img.width, img.height, 0, fmt, type, img.pixels); nuclear@3: img_destroy(&img); nuclear@3: return tex; nuclear@3: } nuclear@3: nuclear@3: unsigned int load_texture_cube(const char *fname) nuclear@3: { nuclear@3: /* TODO implement */ nuclear@3: return 0; nuclear@3: } nuclear@3: nuclear@3: void free_texture(unsigned int tex) nuclear@3: { nuclear@3: if(tex && glIsTexture(tex)) { nuclear@3: glDeleteTextures(1, &tex); nuclear@3: } nuclear@3: } nuclear@3: nuclear@3: void bind_texture(unsigned int tex, int tex_unit) nuclear@3: { nuclear@3: bind_common(GL_TEXTURE_2D, tex, tex_unit); nuclear@3: } nuclear@3: nuclear@3: void bind_texture_cube(unsigned int tex, int tex_unit) nuclear@3: { nuclear@3: bind_common(GL_TEXTURE_CUBE_MAP, tex, tex_unit); nuclear@3: } nuclear@3: nuclear@3: static void bind_common(GLenum type, unsigned int tex, int tex_unit) nuclear@3: { nuclear@3: glActiveTextureARB(GL_TEXTURE0 + (GLenum)tex_unit); nuclear@3: if(tex) { nuclear@3: glBindTexture(type, tex); nuclear@3: glEnable(type); nuclear@3: } else { nuclear@3: glDisable(type); nuclear@3: } nuclear@3: glActiveTextureARB(GL_TEXTURE0); nuclear@3: }