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