fixed shader manager, added it
[demo] / src / state_manager.cc
1 #include <stdio.h>
2 #include <map>
3 #include <string>
4
5 #include <gmath/gmath.h>
6
7 #include "state_manager.h"
8
9 StateManager state_manager;
10
11 State *StateManager::get_state(const char *name)
12 {
13         std::map<std::string, int>::iterator it;
14         it = statemap.find(name);
15         return it == statemap.end() ? 0 : &states[it->second];
16 }
17
18 int StateManager::add_state_element(const char *name, int num_floats)
19 {
20         State *st = get_state(name);
21         if(st) {
22                 if(st->num != num_floats) {
23                         fprintf(stderr, "Uniform %s, type mismatch!\n", name);
24                         return -1;
25                 }
26
27                 return st - &states[0];
28         }
29
30         State state;
31         state.num = num_floats;
32
33         state.name = new char[strlen(name) + 1];
34         strcpy(state.name, name);
35
36         int sz = sizeof *state.data * num_floats;
37         state.data = new float[sz];
38         memset(state.data, 0, sz);
39
40         int idx = (int)states.size();
41         states.push_back(state);
42
43         statemap[name] = idx;
44
45         printf("State manager: added state %s with %d float data.\n", name, num_floats);
46         return idx;
47 }
48
49 void StateManager::set_state(const char *name, float value)
50 {
51         set_state(name, Vec4(value, 0, 0, 1));
52 }
53
54 void StateManager::set_state(const char *name, const Vec3 &vec)
55 {
56         set_state(name, Vec4(vec.x, vec.y, vec.z, 1));
57 }
58
59 void StateManager::set_state(const char *name, const Vec4 &vec)
60 {
61         State *state = get_state(name);
62         if(!state)
63                 return;
64
65         switch(state->num) {
66         case 4:
67                 state->data[3] = vec.w;
68         case 3:
69                 state->data[2] = vec.z;
70         case 2:
71                 state->data[1] = vec.y;
72         case 1:
73                 state->data[0] = vec.x;
74         default:
75                 break;
76         }
77 }
78
79 void StateManager::set_state(const char *name, const Mat4 &mat)
80 {
81         State *state = get_state(name);
82
83         if(!state)
84                 return;
85
86         if(state->num != 16) {
87                 fprintf(stderr, "State manager: state %s can only be a 4x4 matrix.\n", name);
88                 return;
89         }
90
91         for(int j=0; j<4; j++) {
92                 for(int i=0; i<4; i++) {
93                         state->data[4 * i + j] = mat.m[i][j];
94                 }
95         }
96 }
97
98 const State *StateManager::get_state(const char *name) const
99 {
100         return ((StateManager *)this)->get_state(name);
101 }
102
103 const State *StateManager::get_state(int idx) const
104 {
105         return &states[idx];
106 }