nuclear@14: #include nuclear@14: #include nuclear@14: #include nuclear@14: #include nuclear@14: #include "opengl.h" nuclear@14: #include "tex.h" nuclear@14: nuclear@14: unsigned int load_texture(const char *fname) nuclear@14: { nuclear@14: unsigned int tex; nuclear@14: FILE *fp; nuclear@14: void *pixels; nuclear@14: int xsz, ysz, sz; nuclear@14: char buf[512]; nuclear@14: nuclear@14: if(!(fp = fopen(fname, "r"))) { nuclear@14: fprintf(stderr, "failed to open texture: %s: %s\n", fname, strerror(errno)); nuclear@14: return 0; nuclear@14: } nuclear@14: nuclear@14: if(!fgets(buf, sizeof buf, fp) || buf[0] != 'P' || buf[1] != '6') { nuclear@14: fprintf(stderr, "invalid format (1): %s\n", fname); nuclear@14: fclose(fp); nuclear@14: return 0; nuclear@14: } nuclear@14: if(!fgets(buf, sizeof buf, fp) || sscanf(buf, "%d %d", &xsz, &ysz) != 2) { nuclear@14: fprintf(stderr, "invalid format (2): %s\n", fname); nuclear@14: fclose(fp); nuclear@14: return 0; nuclear@14: } nuclear@14: fgets(buf, sizeof buf, fp); nuclear@14: nuclear@14: sz = xsz * ysz * 3; nuclear@14: if(!(pixels = malloc(sz))) { nuclear@14: fprintf(stderr, "failed to allocate %d bytes\n", sz); nuclear@14: fclose(fp); nuclear@14: return 0; nuclear@14: } nuclear@14: if(fread(pixels, 1, xsz * ysz * 3, fp) < sz) { nuclear@14: fprintf(stderr, "partial read: %s\n", fname); nuclear@14: free(pixels); nuclear@14: fclose(fp); nuclear@14: return 0; nuclear@14: } nuclear@14: fclose(fp); nuclear@14: nuclear@14: glGenTextures(1, &tex); nuclear@14: glBindTexture(GL_TEXTURE_2D, tex); nuclear@14: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); nuclear@14: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); nuclear@14: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); nuclear@14: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); nuclear@14: glTexImage2D(GL_TEXTURE_2D, 0, 4, xsz, ysz, 0, GL_RGB, GL_UNSIGNED_BYTE, pixels); nuclear@14: free(pixels); nuclear@14: nuclear@14: return tex; nuclear@14: }