istereo

annotate src/tex.c @ 25:206348366635

trying to figure out why the textures are looking crappy on ipod
author John Tsiombikas <nuclear@mutantstargoat.com>
date Thu, 08 Sep 2011 04:23:56 +0300
parents 4c20f10a7183
children 862a3329a8f0
rev   line source
nuclear@14 1 #include <stdio.h>
nuclear@14 2 #include <stdlib.h>
nuclear@14 3 #include <string.h>
nuclear@14 4 #include <errno.h>
nuclear@14 5 #include "opengl.h"
nuclear@14 6 #include "tex.h"
nuclear@15 7 #include "config.h"
nuclear@14 8
nuclear@14 9 unsigned int load_texture(const char *fname)
nuclear@14 10 {
nuclear@14 11 unsigned int tex;
nuclear@14 12 FILE *fp;
nuclear@25 13 unsigned char *pixels;
nuclear@25 14 int xsz, ysz, sz, i;
nuclear@14 15 char buf[512];
nuclear@14 16
nuclear@14 17 if(!(fp = fopen(fname, "r"))) {
nuclear@14 18 fprintf(stderr, "failed to open texture: %s: %s\n", fname, strerror(errno));
nuclear@14 19 return 0;
nuclear@14 20 }
nuclear@14 21
nuclear@14 22 if(!fgets(buf, sizeof buf, fp) || buf[0] != 'P' || buf[1] != '6') {
nuclear@14 23 fprintf(stderr, "invalid format (1): %s\n", fname);
nuclear@14 24 fclose(fp);
nuclear@14 25 return 0;
nuclear@14 26 }
nuclear@14 27 if(!fgets(buf, sizeof buf, fp) || sscanf(buf, "%d %d", &xsz, &ysz) != 2) {
nuclear@14 28 fprintf(stderr, "invalid format (2): %s\n", fname);
nuclear@14 29 fclose(fp);
nuclear@14 30 return 0;
nuclear@14 31 }
nuclear@14 32 fgets(buf, sizeof buf, fp);
nuclear@14 33
nuclear@25 34 sz = xsz * ysz * 4;
nuclear@14 35 if(!(pixels = malloc(sz))) {
nuclear@14 36 fprintf(stderr, "failed to allocate %d bytes\n", sz);
nuclear@14 37 fclose(fp);
nuclear@14 38 return 0;
nuclear@14 39 }
nuclear@25 40 for(i=0; i<sz; i++) {
nuclear@25 41 int c;
nuclear@25 42
nuclear@25 43 if(i % 4 == 3) {
nuclear@25 44 pixels[i] = 255;
nuclear@25 45 continue;
nuclear@25 46 }
nuclear@25 47
nuclear@25 48 if((c = fgetc(fp)) == -1) {
nuclear@25 49 fprintf(stderr, "partial read: %s\n", fname);
nuclear@25 50 free(pixels);
nuclear@25 51 fclose(fp);
nuclear@25 52 return 0;
nuclear@25 53 }
nuclear@25 54 pixels[i] = c;
nuclear@14 55 }
nuclear@14 56 fclose(fp);
nuclear@14 57
nuclear@14 58 glGenTextures(1, &tex);
nuclear@14 59 glBindTexture(GL_TEXTURE_2D, tex);
nuclear@14 60 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
nuclear@14 61 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
nuclear@14 62 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
nuclear@14 63 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
nuclear@25 64 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, xsz, ysz, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
nuclear@14 65 free(pixels);
nuclear@14 66
nuclear@14 67 return tex;
nuclear@14 68 }
nuclear@15 69
nuclear@15 70 void bind_texture(unsigned int tex, int unit)
nuclear@15 71 {
nuclear@15 72 glActiveTexture(GL_TEXTURE0 + unit);
nuclear@15 73
nuclear@15 74 #ifndef IPHONE
nuclear@15 75 if(tex) {
nuclear@15 76 glEnable(GL_TEXTURE_2D);
nuclear@15 77 } else {
nuclear@15 78 glDisable(GL_TEXTURE_2D);
nuclear@15 79 }
nuclear@15 80 #endif
nuclear@15 81
nuclear@15 82 glBindTexture(GL_TEXTURE_2D, tex);
nuclear@15 83 }