istereo

annotate src/tex.c @ 14:b39d8607f4bb

added textures
author John Tsiombikas <nuclear@mutantstargoat.com>
date Wed, 07 Sep 2011 09:03:51 +0300
parents
children 32503603eb7d
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@14 7
nuclear@14 8 unsigned int load_texture(const char *fname)
nuclear@14 9 {
nuclear@14 10 unsigned int tex;
nuclear@14 11 FILE *fp;
nuclear@14 12 void *pixels;
nuclear@14 13 int xsz, ysz, sz;
nuclear@14 14 char buf[512];
nuclear@14 15
nuclear@14 16 if(!(fp = fopen(fname, "r"))) {
nuclear@14 17 fprintf(stderr, "failed to open texture: %s: %s\n", fname, strerror(errno));
nuclear@14 18 return 0;
nuclear@14 19 }
nuclear@14 20
nuclear@14 21 if(!fgets(buf, sizeof buf, fp) || buf[0] != 'P' || buf[1] != '6') {
nuclear@14 22 fprintf(stderr, "invalid format (1): %s\n", fname);
nuclear@14 23 fclose(fp);
nuclear@14 24 return 0;
nuclear@14 25 }
nuclear@14 26 if(!fgets(buf, sizeof buf, fp) || sscanf(buf, "%d %d", &xsz, &ysz) != 2) {
nuclear@14 27 fprintf(stderr, "invalid format (2): %s\n", fname);
nuclear@14 28 fclose(fp);
nuclear@14 29 return 0;
nuclear@14 30 }
nuclear@14 31 fgets(buf, sizeof buf, fp);
nuclear@14 32
nuclear@14 33 sz = xsz * ysz * 3;
nuclear@14 34 if(!(pixels = malloc(sz))) {
nuclear@14 35 fprintf(stderr, "failed to allocate %d bytes\n", sz);
nuclear@14 36 fclose(fp);
nuclear@14 37 return 0;
nuclear@14 38 }
nuclear@14 39 if(fread(pixels, 1, xsz * ysz * 3, fp) < sz) {
nuclear@14 40 fprintf(stderr, "partial read: %s\n", fname);
nuclear@14 41 free(pixels);
nuclear@14 42 fclose(fp);
nuclear@14 43 return 0;
nuclear@14 44 }
nuclear@14 45 fclose(fp);
nuclear@14 46
nuclear@14 47 glGenTextures(1, &tex);
nuclear@14 48 glBindTexture(GL_TEXTURE_2D, tex);
nuclear@14 49 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
nuclear@14 50 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
nuclear@14 51 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
nuclear@14 52 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
nuclear@14 53 glTexImage2D(GL_TEXTURE_2D, 0, 4, xsz, ysz, 0, GL_RGB, GL_UNSIGNED_BYTE, pixels);
nuclear@14 54 free(pixels);
nuclear@14 55
nuclear@14 56 return tex;
nuclear@14 57 }