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 }
|