final changes before dropping
[ld37_one_room] / src / material.cc
1 #include <algorithm>
2 #include <string.h>
3 #include "opengl.h"
4 #include "material.h"
5 #include "sdr.h"
6 #include "app.h"
7 #include "ubersdr.h"
8
9 Material::Material()
10         : diffuse(1.0f, 1.0f, 1.0f)
11 {
12         shininess = 0.0f;
13         alpha = 1.0f;
14         memset(stdtex, 0, sizeof stdtex);
15 }
16
17 void Material::setup() const
18 {
19         float kd[] = {diffuse.x, diffuse.y, diffuse.z, alpha};
20         float ks[] = {specular.x, specular.y, specular.z, 1.0f};
21
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);
25
26         for(int i=0; i<NUM_MTL_TEXTURES; i++) {
27                 bind_texture(stdtex[i], i);
28         }
29
30         if(stdtex[MTL_TEX_DIFFUSE]) {
31                 uber_enable_texmap();
32         } else {
33                 uber_disable_texmap();
34         }
35         if(stdtex[MTL_TEX_ENVMAP] && stdtex[MTL_TEX_ENVMAP]->get_type() == TEX_CUBE) {
36                 uber_enable_cubemap();
37         } else {
38                 uber_disable_cubemap();
39         }
40         if(stdtex[MTL_TEX_ENVMAP] && stdtex[MTL_TEX_ENVMAP]->get_type() == TEX_2D) {
41                 uber_enable_sphmap();
42         } else {
43                 uber_disable_sphmap();
44         }
45         /* TODO shadows */
46
47         unsigned int sdrprog = uber_program();
48         bind_program(sdrprog);
49 }
50
51 void Material::add_texture(Texture *tex, int type)
52 {
53         if(std::find(textures.begin(), textures.end(), tex) == textures.end()) {
54                 textures.push_back(tex);
55         }
56
57         if(type != MTL_TEX_UNKNOWN) {
58                 stdtex[type] = tex;
59         }
60 }
61
62 void Material::remove_texture(Texture *tex)
63 {
64         std::vector<Texture*>::iterator it = std::find(textures.begin(), textures.end(), tex);
65         if(it != textures.end()) {
66                 textures.erase(it);
67         }
68
69         for(int i=0; i<NUM_MTL_TEXTURES; i++) {
70                 if(stdtex[i] == tex) {
71                         stdtex[i] = 0;
72                 }
73         }
74 }
75
76 int mtl_parse_type(const char *str)
77 {
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;
88         }
89         return MTL_TEX_UNKNOWN;
90 }
91
92 const char *mtl_type_string(int type)
93 {
94         switch(type) {
95         case MTL_TEX_DIFFUSE:
96                 return "diffuse";
97         case MTL_TEX_SPECULAR:
98                 return "specular";
99         case MTL_TEX_NORMALMAP:
100                 return "normalmap";
101         case MTL_TEX_LIGHTMAP:
102                 return "lightmap";
103         case MTL_TEX_ENVMAP:
104                 return "envmap";
105         default:
106                 break;
107         }
108         return "unknown";
109 }