eqemu

view src/material.cc @ 7:e9ab4861536d

added glow
author John Tsiombikas <nuclear@member.fsf.org>
date Fri, 18 Jul 2014 04:24:53 +0300
parents 977bc1cb055b
children 2656099aff12
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 glMatrixMode(GL_TEXTURE);
76 for(int i=num_tex; i<4; i++) {
77 glActiveTexture(GL_TEXTURE0 + i);
78 glDisable(GL_TEXTURE_2D);
79 glLoadIdentity();
80 }
82 glActiveTexture(GL_TEXTURE0);
83 glMatrixMode(GL_MODELVIEW);
84 }
86 unsigned int load_texture(const char *fname)
87 {
88 int xsz, ysz;
89 void *pixels;
90 unsigned int tex;
92 const char *path = find_path(fname);
94 if(!(pixels = img_load_pixels(path, &xsz, &ysz, IMG_FMT_RGBA32))) {
95 fprintf(stderr, "failed to load texture: %s\n", fname);
96 return 0;
97 }
99 glGenTextures(1, &tex);
100 glBindTexture(GL_TEXTURE_2D, tex);
101 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
102 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
103 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
104 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
105 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, xsz, ysz, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
106 img_free_pixels(pixels);
107 return tex;
108 }
110 static const char *find_path(const char *fname)
111 {
112 const char *ptr = fname + strlen(fname) - 1;
114 do {
115 while(*ptr != '/' && ptr > fname - 1) {
116 ptr--;
117 }
119 FILE *fp = fopen(ptr + 1, "rb");
120 if(fp) {
121 fclose(fp);
122 return ptr + 1;
123 }
124 ptr -= 1;
126 } while(ptr >= fname);
128 return fname;
129 }