eqemu
diff 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 diff
1.1 --- a/src/material.cc Thu Jul 17 08:51:17 2014 +0300 1.2 +++ b/src/material.cc Fri Jul 18 00:42:15 2014 +0300 1.3 @@ -1,11 +1,21 @@ 1.4 +#include <string.h> 1.5 #include <GL/glew.h> 1.6 +#include <imago2.h> 1.7 #include "material.h" 1.8 1.9 +static const char *find_path(const char *fname); 1.10 + 1.11 Material::Material() 1.12 : diffuse(1, 1, 1), specular(0, 0, 0) 1.13 { 1.14 shininess = 1.0; 1.15 alpha = 1.0; 1.16 + 1.17 + for(int i=0; i<NUM_TEXTURES; i++) { 1.18 + tex[i] = 0; 1.19 + tex_scale[i].x = tex_scale[i].y = 1.0f; 1.20 + } 1.21 + sdr = 0; 1.22 } 1.23 1.24 void Material::setup() const 1.25 @@ -17,4 +27,150 @@ 1.26 glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, spec); 1.27 1.28 glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, shininess > 128 ? 128 : shininess); 1.29 + 1.30 + if(sdr) { 1.31 + glUseProgram(sdr); 1.32 + } 1.33 + 1.34 + if(tex[TEX_DIFFUSE]) { 1.35 + glActiveTexture(GL_TEXTURE0); 1.36 + 1.37 + glMatrixMode(GL_TEXTURE); 1.38 + glLoadIdentity(); 1.39 + glTranslatef(tex_offset[TEX_DIFFUSE].x, tex_offset[TEX_DIFFUSE].y, 0); 1.40 + glScalef(tex_scale[TEX_DIFFUSE].x, tex_scale[TEX_DIFFUSE].y, 1); 1.41 + 1.42 + glBindTexture(GL_TEXTURE_2D, tex[TEX_DIFFUSE]); 1.43 + glEnable(GL_TEXTURE_2D); 1.44 + 1.45 + int loc = glGetUniformLocation(sdr, "tex_diffuse"); 1.46 + if(loc != -1) { 1.47 + glUniform1i(loc, 0); 1.48 + } 1.49 + } 1.50 + if(tex[TEX_ENVMAP]) { 1.51 + glActiveTexture(GL_TEXTURE1); 1.52 + 1.53 + glMatrixMode(GL_TEXTURE); 1.54 + glLoadIdentity(); 1.55 + glTranslatef(tex_offset[TEX_ENVMAP].x, tex_offset[TEX_ENVMAP].y, 0); 1.56 + glScalef(tex_scale[TEX_ENVMAP].x, tex_scale[TEX_ENVMAP].y, 1); 1.57 + 1.58 + glBindTexture(GL_TEXTURE_2D, tex[TEX_ENVMAP]); 1.59 + glEnable(GL_TEXTURE_2D); 1.60 + 1.61 + glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); 1.62 + glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); 1.63 + glEnable(GL_TEXTURE_GEN_S); 1.64 + glEnable(GL_TEXTURE_GEN_T); 1.65 + 1.66 + int loc = glGetUniformLocation(sdr, "tex_envmap"); 1.67 + if(loc != -1) { 1.68 + glUniform1i(loc, 1); 1.69 + } 1.70 + } 1.71 + 1.72 + glActiveTexture(GL_TEXTURE0); 1.73 + glMatrixMode(GL_MODELVIEW); 1.74 } 1.75 + 1.76 +unsigned int load_texture(const char *fname) 1.77 +{ 1.78 + int xsz, ysz; 1.79 + void *pixels; 1.80 + unsigned int tex; 1.81 + 1.82 + const char *path = find_path(fname); 1.83 + 1.84 + if(!(pixels = img_load_pixels(path, &xsz, &ysz, IMG_FMT_RGBA32))) { 1.85 + fprintf(stderr, "failed to load texture: %s\n", fname); 1.86 + return 0; 1.87 + } 1.88 + 1.89 + glGenTextures(1, &tex); 1.90 + glBindTexture(GL_TEXTURE_2D, tex); 1.91 + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 1.92 + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 1.93 + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 1.94 + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 1.95 + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, xsz, ysz, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels); 1.96 + img_free_pixels(pixels); 1.97 + return tex; 1.98 +} 1.99 + 1.100 +static char *read_shader(const char *fname) 1.101 +{ 1.102 + FILE *fp = fopen(fname, "r"); 1.103 + if(!fp) { 1.104 + return 0; 1.105 + } 1.106 + fseek(fp, 0, SEEK_END); 1.107 + long len = ftell(); 1.108 + rewind(fp); 1.109 + 1.110 + char *buf = new char[len + 1]; 1.111 + fread(buf, len, fp); 1.112 + buf[len] = 0; 1.113 + fclose(fp); 1.114 + 1.115 + return buf; 1.116 +} 1.117 + 1.118 +unsigned int load_shader_program(const char *vname, const char *pname) 1.119 +{ 1.120 + unsigned int vsdr = 0, psdr = 0; 1.121 + 1.122 + if(vname) { 1.123 + char *src = read_shader(find_path(vname)); 1.124 + if(!src) { 1.125 + fprintf(stderr, "failed to load vertex shader: %s\n", vname); 1.126 + return 0; 1.127 + } 1.128 + vsdr = glCreateShader(GL_VERTEX_SHADER); 1.129 + glShaderSource(vsdr, 1, &src, 0); 1.130 + delete [] src; 1.131 + 1.132 + int res; 1.133 + glGetShaderiv(vsdr, GL_INFO_LOG_LENGTH, &res); 1.134 + if(res > 0) {URE_2D, 0, GL_RGBA, xsz, ysz, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels); 1.135 + img_free_pixels(pixels); 1.136 + return tex; 1.137 +} 1.138 + 1.139 +static char *read_shader(const char *fname) 1.140 +{ 1.141 + FILE *fp = fopen(find_path(vname), "r"); 1.142 + if(!fp) { 1.143 + fprintf(stderr, "failed to load shader: %s\n", vname); 1.144 + return 0; 1.145 + char *info = new char[res]; 1.146 + glGetShaderInfoLog(vsdr, res, &res, info); 1.147 + printf("shader compiler log: %s\n", info); 1.148 + } 1.149 + glGetShaderiv(vsdr, GL_COMPILE_STATUS, &res); 1.150 + if(!res) { 1.151 + return 0; 1.152 + } 1.153 + } 1.154 +} 1.155 + 1.156 +static const char *find_path(const char *fname) 1.157 +{ 1.158 + const char *ptr = fname + strlen(fname) - 1; 1.159 + 1.160 + do { 1.161 + while(*ptr != '/' && ptr > fname - 1) { 1.162 + ptr--; 1.163 + } 1.164 + 1.165 + FILE *fp = fopen(ptr + 1, "rb"); 1.166 + if(fp) { 1.167 + fclose(fp); 1.168 + return ptr + 1; 1.169 + } 1.170 + ptr -= 1; 1.171 + 1.172 + } while(ptr >= fname); 1.173 + 1.174 + return fname; 1.175 +}