eqemu

view src/material.cc @ 5:9b5bb05ae53a

foo
author John Tsiombikas <nuclear@member.fsf.org>
date Fri, 18 Jul 2014 00:42:15 +0300
parents 3d3656360a82
children 977bc1cb055b
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 col[] = {diffuse.x, diffuse.y, diffuse.z, alpha};
24 glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, col);
26 float spec[] = {specular.x, specular.y, specular.z, 1.0};
27 glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, spec);
29 glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, shininess > 128 ? 128 : shininess);
31 if(sdr) {
32 glUseProgram(sdr);
33 }
35 if(tex[TEX_DIFFUSE]) {
36 glActiveTexture(GL_TEXTURE0);
38 glMatrixMode(GL_TEXTURE);
39 glLoadIdentity();
40 glTranslatef(tex_offset[TEX_DIFFUSE].x, tex_offset[TEX_DIFFUSE].y, 0);
41 glScalef(tex_scale[TEX_DIFFUSE].x, tex_scale[TEX_DIFFUSE].y, 1);
43 glBindTexture(GL_TEXTURE_2D, tex[TEX_DIFFUSE]);
44 glEnable(GL_TEXTURE_2D);
46 int loc = glGetUniformLocation(sdr, "tex_diffuse");
47 if(loc != -1) {
48 glUniform1i(loc, 0);
49 }
50 }
51 if(tex[TEX_ENVMAP]) {
52 glActiveTexture(GL_TEXTURE1);
54 glMatrixMode(GL_TEXTURE);
55 glLoadIdentity();
56 glTranslatef(tex_offset[TEX_ENVMAP].x, tex_offset[TEX_ENVMAP].y, 0);
57 glScalef(tex_scale[TEX_ENVMAP].x, tex_scale[TEX_ENVMAP].y, 1);
59 glBindTexture(GL_TEXTURE_2D, tex[TEX_ENVMAP]);
60 glEnable(GL_TEXTURE_2D);
62 glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
63 glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
64 glEnable(GL_TEXTURE_GEN_S);
65 glEnable(GL_TEXTURE_GEN_T);
67 int loc = glGetUniformLocation(sdr, "tex_envmap");
68 if(loc != -1) {
69 glUniform1i(loc, 1);
70 }
71 }
73 glActiveTexture(GL_TEXTURE0);
74 glMatrixMode(GL_MODELVIEW);
75 }
77 unsigned int load_texture(const char *fname)
78 {
79 int xsz, ysz;
80 void *pixels;
81 unsigned int tex;
83 const char *path = find_path(fname);
85 if(!(pixels = img_load_pixels(path, &xsz, &ysz, IMG_FMT_RGBA32))) {
86 fprintf(stderr, "failed to load texture: %s\n", fname);
87 return 0;
88 }
90 glGenTextures(1, &tex);
91 glBindTexture(GL_TEXTURE_2D, tex);
92 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
93 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
94 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
95 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
96 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, xsz, ysz, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
97 img_free_pixels(pixels);
98 return tex;
99 }
101 static char *read_shader(const char *fname)
102 {
103 FILE *fp = fopen(fname, "r");
104 if(!fp) {
105 return 0;
106 }
107 fseek(fp, 0, SEEK_END);
108 long len = ftell();
109 rewind(fp);
111 char *buf = new char[len + 1];
112 fread(buf, len, fp);
113 buf[len] = 0;
114 fclose(fp);
116 return buf;
117 }
119 unsigned int load_shader_program(const char *vname, const char *pname)
120 {
121 unsigned int vsdr = 0, psdr = 0;
123 if(vname) {
124 char *src = read_shader(find_path(vname));
125 if(!src) {
126 fprintf(stderr, "failed to load vertex shader: %s\n", vname);
127 return 0;
128 }
129 vsdr = glCreateShader(GL_VERTEX_SHADER);
130 glShaderSource(vsdr, 1, &src, 0);
131 delete [] src;
133 int res;
134 glGetShaderiv(vsdr, GL_INFO_LOG_LENGTH, &res);
135 if(res > 0) {URE_2D, 0, GL_RGBA, xsz, ysz, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
136 img_free_pixels(pixels);
137 return tex;
138 }
140 static char *read_shader(const char *fname)
141 {
142 FILE *fp = fopen(find_path(vname), "r");
143 if(!fp) {
144 fprintf(stderr, "failed to load shader: %s\n", vname);
145 return 0;
146 char *info = new char[res];
147 glGetShaderInfoLog(vsdr, res, &res, info);
148 printf("shader compiler log: %s\n", info);
149 }
150 glGetShaderiv(vsdr, GL_COMPILE_STATUS, &res);
151 if(!res) {
152 return 0;
153 }
154 }
155 }
157 static const char *find_path(const char *fname)
158 {
159 const char *ptr = fname + strlen(fname) - 1;
161 do {
162 while(*ptr != '/' && ptr > fname - 1) {
163 ptr--;
164 }
166 FILE *fp = fopen(ptr + 1, "rb");
167 if(fp) {
168 fclose(fp);
169 return ptr + 1;
170 }
171 ptr -= 1;
173 } while(ptr >= fname);
175 return fname;
176 }