eqemu

view src/material.cc @ 6:977bc1cb055b

almost done
author John Tsiombikas <nuclear@member.fsf.org>
date Fri, 18 Jul 2014 02:35:06 +0300
parents 9b5bb05ae53a
children e9ab4861536d
line source
1 #include <string.h>
2 #include <GL/glew.h>
3 #include <imago2.h>
4 #include "material.h"
6 static const char *find_path(const char *fname);
8 Material::Material()
9 : diffuse(1, 1, 1), specular(0, 0, 0)
10 {
11 shininess = 1.0;
12 alpha = 1.0;
14 for(int i=0; i<NUM_TEXTURES; i++) {
15 tex[i] = 0;
16 tex_scale[i].x = tex_scale[i].y = 1.0f;
17 }
18 sdr = 0;
19 }
21 void Material::setup() const
22 {
23 float amb[] = {ambient.x, ambient.y, ambient.z, 1.0};
24 glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, amb);
26 float col[] = {diffuse.x, diffuse.y, diffuse.z, alpha};
27 glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, col);
29 float spec[] = {specular.x, specular.y, specular.z, 1.0};
30 glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, spec);
32 glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, shininess > 128 ? 128 : shininess);
34 float emit[] = {emissive.x, emissive.y, emissive.z, 1.0};
35 glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, emit);
37 int num_tex = 0;
38 if(tex[TEX_DIFFUSE]) {
39 glActiveTexture(GL_TEXTURE0 + num_tex++);
41 glMatrixMode(GL_TEXTURE);
42 glLoadIdentity();
43 glTranslatef(tex_offset[TEX_DIFFUSE].x, tex_offset[TEX_DIFFUSE].y, 0);
44 glScalef(tex_scale[TEX_DIFFUSE].x, tex_scale[TEX_DIFFUSE].y, 1);
46 glBindTexture(GL_TEXTURE_2D, tex[TEX_DIFFUSE]);
47 glEnable(GL_TEXTURE_2D);
49 glDisable(GL_TEXTURE_GEN_S);
50 glDisable(GL_TEXTURE_GEN_T);
52 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
53 }
55 if(tex[TEX_ENVMAP]) {
56 glActiveTexture(GL_TEXTURE0 + num_tex++);
58 glMatrixMode(GL_TEXTURE);
59 glLoadIdentity();
60 glTranslatef(tex_offset[TEX_ENVMAP].x, tex_offset[TEX_ENVMAP].y, 0);
61 glScalef(tex_scale[TEX_ENVMAP].x, tex_scale[TEX_ENVMAP].y, 1);
63 glBindTexture(GL_TEXTURE_2D, tex[TEX_ENVMAP]);
64 glEnable(GL_TEXTURE_2D);
66 glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
67 glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
68 glEnable(GL_TEXTURE_GEN_S);
69 glEnable(GL_TEXTURE_GEN_T);
71 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_ADD);
72 }
75 for(int i=num_tex; i<4; i++) {
76 glActiveTexture(GL_TEXTURE0 + i);
77 glDisable(GL_TEXTURE_2D);
78 }
80 glActiveTexture(GL_TEXTURE0);
81 glMatrixMode(GL_MODELVIEW);
82 }
84 unsigned int load_texture(const char *fname)
85 {
86 int xsz, ysz;
87 void *pixels;
88 unsigned int tex;
90 const char *path = find_path(fname);
92 if(!(pixels = img_load_pixels(path, &xsz, &ysz, IMG_FMT_RGBA32))) {
93 fprintf(stderr, "failed to load texture: %s\n", fname);
94 return 0;
95 }
97 glGenTextures(1, &tex);
98 glBindTexture(GL_TEXTURE_2D, tex);
99 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
100 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
101 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
102 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
103 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, xsz, ysz, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
104 img_free_pixels(pixels);
105 return tex;
106 }
108 static const char *find_path(const char *fname)
109 {
110 const char *ptr = fname + strlen(fname) - 1;
112 do {
113 while(*ptr != '/' && ptr > fname - 1) {
114 ptr--;
115 }
117 FILE *fp = fopen(ptr + 1, "rb");
118 if(fp) {
119 fclose(fp);
120 return ptr + 1;
121 }
122 ptr -= 1;
124 } while(ptr >= fname);
126 return fname;
127 }