10 : diffuse(1.0f, 1.0f, 1.0f)
14 memset(stdtex, 0, sizeof stdtex);
17 void Material::setup() const
19 float kd[] = {diffuse.x, diffuse.y, diffuse.z, alpha};
20 float ks[] = {specular.x, specular.y, specular.z, 1.0f};
22 glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, kd);
23 glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, ks);
24 glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, shininess);
26 for(int i=0; i<NUM_MTL_TEXTURES; i++) {
27 bind_texture(stdtex[i], i);
30 if(stdtex[MTL_TEX_DIFFUSE]) {
33 uber_disable_texmap();
35 if(stdtex[MTL_TEX_ENVMAP] && stdtex[MTL_TEX_ENVMAP]->get_type() == TEX_CUBE) {
36 uber_enable_cubemap();
38 uber_disable_cubemap();
40 if(stdtex[MTL_TEX_ENVMAP] && stdtex[MTL_TEX_ENVMAP]->get_type() == TEX_2D) {
43 uber_disable_sphmap();
47 unsigned int sdrprog = uber_program();
48 bind_program(sdrprog);
51 void Material::add_texture(Texture *tex, int type)
53 if(std::find(textures.begin(), textures.end(), tex) == textures.end()) {
54 textures.push_back(tex);
57 if(type != MTL_TEX_UNKNOWN) {
62 void Material::remove_texture(Texture *tex)
64 std::vector<Texture*>::iterator it = std::find(textures.begin(), textures.end(), tex);
65 if(it != textures.end()) {
69 for(int i=0; i<NUM_MTL_TEXTURES; i++) {
70 if(stdtex[i] == tex) {
76 int mtl_parse_type(const char *str)
78 if(strcmp(str, "diffuse") == 0) {
79 return MTL_TEX_DIFFUSE;
80 } else if(strcmp(str, "specular") == 0) {
81 return MTL_TEX_SPECULAR;
82 } else if(strcmp(str, "normalmap") == 0) {
83 return MTL_TEX_NORMALMAP;
84 } else if(strcmp(str, "lightmap") == 0) {
85 return MTL_TEX_LIGHTMAP;
86 } else if(strcmp(str, "envmap") == 0) {
87 return MTL_TEX_ENVMAP;
89 return MTL_TEX_UNKNOWN;
92 const char *mtl_type_string(int type)
97 case MTL_TEX_SPECULAR:
99 case MTL_TEX_NORMALMAP:
101 case MTL_TEX_LIGHTMAP: