ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/libgender/util.h
Revision: 1.13
Committed: Tue Oct 5 01:18:57 2004 UTC (19 years, 8 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.12: +2 -5 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 #ifndef UTIL_H
2     #define UTIL_H
3    
4 root 1.7 #include <cmath>
5 root 1.1 #include <vector>
6    
7     using namespace std;
8    
9 root 1.7 #include <GL/gl.h>
10    
11 root 1.3 typedef int soffs; // 32 bit
12     typedef unsigned int uoffs;
13 root 1.4 #define OFFS_BITS 31
14 root 1.9 #define SOFFS_MIN (soffs)-(1 << (OFFS_BITS - 2))
15     #define SOFFS_MAX (soffs)+(1 << (OFFS_BITS - 2))
16     #define MAXEXTENT (1UL << (OFFS_BITS - 1))
17 root 1.1
18     #define GLFLOAT_MAX 1e30
19     #define GLFLOAT_MIN -1e30
20    
21     struct vec3 {
22     GLfloat x, y, z;
23     vec3 () { };
24     vec3 (GLfloat x, GLfloat y, GLfloat z) : x(x), y(y), z(z) { };
25    
26     const vec3 operator -() const
27     { return vec3 (-x, -y, -z); }
28     };
29    
30     const vec3 normalize (const vec3 &v);
31     const vec3 cross (const vec3 &a, const vec3 &b);
32 root 1.6
33     inline const vec3 operator *(const vec3 &a, GLfloat s)
34     {
35     return vec3 (a.x * s, a.y * s, a.z * s);
36     }
37    
38     inline GLfloat dot (const vec3 &a, const vec3 &b)
39     {
40     return a.x * b.x + a.y * b.y + a.z * b.z;
41     }
42    
43     inline const GLfloat abs (const vec3 &v)
44     {
45     return sqrtf (dot (v, v));
46     }
47 root 1.1
48 root 1.5 struct gl_matrix {
49     GLfloat data[4][4];
50    
51 root 1.12 const GLfloat operator ()(int i, int j) const { return data[j][i]; };
52     GLfloat &operator ()(int i, int j) { return data[j][i]; };
53 root 1.5
54     void diagonal (GLfloat v);
55     void clear () { diagonal (0.); };
56     void identity () { diagonal (1.); };
57    
58     void print (); // ugly
59    
60 root 1.12 static const gl_matrix translation (const vec3 &v);
61     static const gl_matrix rotation (GLfloat degrees, const vec3 &axis);
62 root 1.5
63     gl_matrix () { };
64     gl_matrix (GLfloat diag) { diagonal (diag); };
65     };
66    
67     const gl_matrix operator *(const gl_matrix &a, const gl_matrix &b);
68 root 1.6 const vec3 operator *(const gl_matrix &a, const vec3 &v);
69 root 1.10
70     typedef vec3 point;
71    
72     // a generic plane
73 root 1.12 struct plane {
74 root 1.10 vec3 n;
75     GLfloat d;
76    
77     GLfloat distance (const point &p) const
78     {
79     return dot (n, p) + d;
80     }
81    
82     plane () { };
83     plane (GLfloat a, GLfloat b, GLfloat c, GLfloat d);
84     };
85    
86     struct sector {
87     soffs x, y, z;
88    
89     sector (soffs x = 0, soffs y = 0, soffs z = 0) : x(x), y(y), z(z) { };
90    
91     void offset (int subindex, uoffs extent)
92     {
93     if (subindex & 1) x += extent;
94     if (subindex & 2) y += extent;
95     if (subindex & 4) z += extent;
96     }
97     };
98    
99     inline const sector translate (const sector &p, const sector &src, const sector &dst)
100     {
101     sector r;
102    
103     r.x = p.x + (dst.x - src.x);
104     r.y = p.y + (dst.y - src.y);
105     r.z = p.z + (dst.z - src.z);
106    
107     return r;
108     }
109    
110     void renormalize (sector &s, point &p);
111    
112     struct colour {
113     GLfloat r, g, b, a;
114     colour (GLfloat r = 1., GLfloat g = 1., GLfloat b = 1., GLfloat a = 1.) : r(r), g(g), b(b), a(a) { };
115     };
116 root 1.5
117 root 1.1 struct texc {
118     GLfloat s, t;
119     texc () { };
120     texc (GLfloat s, GLfloat t) : s(s), t(t) { };
121     };
122    
123     struct box {
124 root 1.8 sector a, b;
125    
126     box() { };
127 root 1.1
128     void reset ()
129     {
130 root 1.9 a = sector (SOFFS_MAX, SOFFS_MAX, SOFFS_MAX);
131     b = sector (SOFFS_MIN, SOFFS_MIN, SOFFS_MIN);
132 root 1.1 }
133    
134     void add (const box &o);
135 root 1.8 void add (const sector &p);
136 root 1.1 void add (const point &p);
137     };
138 root 1.5
139     inline const box translate (const box &b, const sector &src, const sector &dst)
140     {
141     box r;
142    
143     r.a = translate (b.a, src, dst);
144     r.b = translate (b.b, src, dst);
145    
146     return r;
147     }
148 root 1.1
149     struct light {
150     point p;
151     colour c;
152     GLfloat intensity;
153     GLfloat radius;
154 root 1.2 };
155    
156     struct material {
157     colour diffuse, specular, emission;
158     GLfloat shininess;
159 root 1.1 };
160    
161 root 1.4 struct entity_base;
162     struct draw_context;
163 root 1.7
164     extern struct timer {
165     static double now;
166     static double diff;
167    
168     static void frame ();
169     timer ();
170     } timer;
171 root 1.11
172 root 1.13 /*
173 root 1.11 #define MAX_EVENT_TYPES 10
174     enum event_type { TIMER_EV };
175     struct event {
176     event_type type;
177     };
178    
179     typedef callback1<void, event&> event_cb;
180    
181     class skedjuhlar {
182    
183     public:
184     // only 10 types for now
185     private:
186     vector <list<event_cb> > event_lists;
187    
188     public:
189     skedjuhlar () {
190     event_lists.resize (MAX_EVENT_TYPES, list<event_cb>());
191     }
192    
193     void register_event_cb (const event_type &t, const event_cb &e) {
194     event_lists[t].push_back (e);
195     };
196     void send_event (event &e) {
197     list<event_cb> &l = event_lists[e.type];
198     for (list<event_cb>::iterator it = l.begin (); it != l.end (); it++) {
199     (*it)(e);
200     }
201     };
202     void check_events () {
203     while (!events.empty ()) {
204     event &e = events.pop_front ();
205     list<event_cb> &l = event_lists[e->name];
206     for (list<event_cb>::iterator it = l.begin (); it !+ l.end (); it++) {
207     (*it)(e);
208     }
209     delete e; // ugly slow? hai hai..... 183G
210     }
211     }
212     };
213    
214     extern skedjuhlar main_scheduler;
215 root 1.13 */
216 root 1.1
217     #endif
218