ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/libgender/util.h
Revision: 1.36
Committed: Sun Oct 10 02:40:19 2004 UTC (22 years ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.35: +5 -7 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.22 #include <SDL/SDL.h>
5     #include <SDL/SDL_image.h>
6 root 1.7 #include <cmath>
7 root 1.27 #include <cfloat>
8 root 1.1 #include <vector>
9 root 1.22 #include <string>
10 root 1.1
11 root 1.18 #include <Cg/cg.h>
12     #include <Cg/cgGL.h>
13    
14 root 1.34 #include <GL/gl.h>
15     #include <GL/glext.h>
16     #include "gldebug.h"
17 root 1.30
18 root 1.1 using namespace std;
19 root 1.18
20     extern CGcontext cgc;
21     extern CGprogram vsh;
22     extern CGprogram fsh;
23 root 1.19 extern CGparameter mv, mvp, lightpos;
24 root 1.21 extern CGprofile vsh_profile, fsh_profile;
25 root 1.1
26 root 1.36 typedef long long soffs; // 32 bit
27     typedef unsigned long long uoffs;
28 root 1.4 #define OFFS_BITS 31
29 root 1.36 #define SOFFS_MIN (soffs)-(1LL << (OFFS_BITS - 2))
30     #define SOFFS_MAX (soffs)+(1LL << (OFFS_BITS - 2))
31     #define MAXEXTENT (1ULL << (OFFS_BITS - 1))
32 root 1.1
33 root 1.32 struct sector {
34     soffs x, y, z;
35    
36     sector (soffs x, soffs y, soffs z) : x(x), y(y), z(z) { };
37     sector (soffs xyz = 0) : x(xyz), y(xyz), z(xyz) { };
38    
39     void offset (int subindex, uoffs extent)
40     {
41     if (subindex & 1) x += extent;
42     if (subindex & 2) y += extent;
43     if (subindex & 4) z += extent;
44     }
45     };
46    
47     inline sector operator +(const sector &a, const sector &b)
48     {
49     return sector (a.x + b.x, a.y + b.y, a.z + b.z);
50     }
51    
52     inline sector operator -(const sector &a, const sector &b)
53     {
54     return sector (a.x - b.x, a.y - b.y, a.z - b.z);
55     }
56    
57     inline sector operator /(const sector &a, soffs b)
58     {
59     return sector (a.x / b, a.y / b, a.z / b);
60     }
61    
62     inline bool operator <=(const sector &a, const sector &b)
63     {
64     return a.x <= b.x && a.y <= b.y && a.z <= b.z;
65     }
66    
67     inline soffs max (const sector &a)
68     {
69     return max (a.x, max (a.y, a.z));
70     }
71    
72     inline sector translate (const sector &p, const sector &src, const sector &dst)
73     {
74     return p + (dst - src);
75     }
76    
77     inline sector abs (const sector &s)
78     {
79     return sector (abs (s.x), abs (s.y), abs (s.z));
80     }
81 root 1.1
82     struct vec3 {
83     GLfloat x, y, z;
84     vec3 () { };
85 root 1.32 vec3 (GLfloat s) : x(s), y(s), z(s) { };
86 root 1.1 vec3 (GLfloat x, GLfloat y, GLfloat z) : x(x), y(y), z(z) { };
87 root 1.32 vec3 (const sector &s) : x(s.x), y(s.y), z(s.z) { };
88 root 1.1
89     const vec3 operator -() const
90     { return vec3 (-x, -y, -z); }
91     };
92    
93     const vec3 normalize (const vec3 &v);
94     const vec3 cross (const vec3 &a, const vec3 &b);
95 root 1.6
96     inline const vec3 operator *(const vec3 &a, GLfloat s)
97     {
98     return vec3 (a.x * s, a.y * s, a.z * s);
99     }
100    
101 root 1.27 inline const vec3 operator +(const vec3 &a, const vec3 &b)
102     {
103     return vec3 (a.x + b.x, a.y + b.y, a.z + b.z);
104     }
105    
106     inline const vec3 operator -(const vec3 &a, const vec3 &b)
107     {
108     return vec3 (a.x - b.x, a.y - b.y, a.z - b.z);
109     }
110    
111 root 1.6 inline GLfloat dot (const vec3 &a, const vec3 &b)
112     {
113     return a.x * b.x + a.y * b.y + a.z * b.z;
114     }
115    
116     inline const GLfloat abs (const vec3 &v)
117     {
118     return sqrtf (dot (v, v));
119     }
120 root 1.1
121 root 1.16 struct matrix {
122 root 1.5 GLfloat data[4][4];
123    
124 root 1.12 const GLfloat operator ()(int i, int j) const { return data[j][i]; };
125     GLfloat &operator ()(int i, int j) { return data[j][i]; };
126 root 1.5
127 root 1.33 operator GLfloat *() { return &data[0][0]; }
128    
129 root 1.5 void diagonal (GLfloat v);
130 root 1.32 void clear () { diagonal (0.F); };
131     void identity () { diagonal (1.F); };
132 root 1.5
133     void print (); // ugly
134    
135 root 1.16 static const matrix translation (const vec3 &v);
136     static const matrix rotation (GLfloat degrees, const vec3 &axis);
137 root 1.5
138 root 1.16 matrix () { };
139     matrix (GLfloat diag) { diagonal (diag); };
140 root 1.5 };
141    
142 root 1.16 const matrix operator *(const matrix &a, const matrix &b);
143     const vec3 operator *(const matrix &a, const vec3 &v);
144 root 1.10
145     typedef vec3 point;
146    
147     // a generic plane
148 root 1.12 struct plane {
149 root 1.10 vec3 n;
150     GLfloat d;
151    
152     GLfloat distance (const point &p) const
153     {
154     return dot (n, p) + d;
155     }
156    
157     plane () { };
158     plane (GLfloat a, GLfloat b, GLfloat c, GLfloat d);
159     };
160    
161     void renormalize (sector &s, point &p);
162    
163     struct colour {
164     GLfloat r, g, b, a;
165     colour (GLfloat r = 1., GLfloat g = 1., GLfloat b = 1., GLfloat a = 1.) : r(r), g(g), b(b), a(a) { };
166     };
167 root 1.5
168 root 1.1 struct texc {
169     GLfloat s, t;
170     texc () { };
171     texc (GLfloat s, GLfloat t) : s(s), t(t) { };
172     };
173    
174     struct box {
175 root 1.27 point a, b;
176 root 1.8
177     box() { };
178 root 1.1
179     void reset ()
180     {
181 root 1.27 a = point ( FLT_MAX, FLT_MAX, FLT_MAX);
182     b = point (-FLT_MAX, -FLT_MAX, -FLT_MAX);
183 root 1.1 }
184    
185     void add (const box &o);
186     void add (const point &p);
187     };
188 root 1.5
189 root 1.1 struct light {
190     point p;
191     colour c;
192     GLfloat intensity;
193     GLfloat radius;
194 root 1.2 };
195    
196     struct material {
197     colour diffuse, specular, emission;
198     GLfloat shininess;
199 root 1.26
200     material ()
201     {
202     diffuse = colour (1, 0, 1, 1);
203     specular = colour (1, 0, 1, 1);
204     emission = colour (1, 0, 1, 1);
205     shininess = 1;
206     }
207 root 1.1 };
208    
209 root 1.27 struct entity;
210     struct geometry;
211 root 1.20 struct view;
212 root 1.32 struct octant;
213 root 1.7
214     extern struct timer {
215     static double now;
216     static double diff;
217    
218     static void frame ();
219     timer ();
220     } timer;
221 root 1.11
222 root 1.13 /*
223 root 1.11 #define MAX_EVENT_TYPES 10
224     enum event_type { TIMER_EV };
225     struct event {
226     event_type type;
227     };
228    
229     typedef callback1<void, event&> event_cb;
230    
231     class skedjuhlar {
232    
233     public:
234     // only 10 types for now
235     private:
236     vector <list<event_cb> > event_lists;
237    
238     public:
239     skedjuhlar () {
240     event_lists.resize (MAX_EVENT_TYPES, list<event_cb>());
241     }
242    
243     void register_event_cb (const event_type &t, const event_cb &e) {
244     event_lists[t].push_back (e);
245     };
246     void send_event (event &e) {
247     list<event_cb> &l = event_lists[e.type];
248     for (list<event_cb>::iterator it = l.begin (); it != l.end (); it++) {
249     (*it)(e);
250     }
251     };
252     void check_events () {
253     while (!events.empty ()) {
254     event &e = events.pop_front ();
255     list<event_cb> &l = event_lists[e->name];
256     for (list<event_cb>::iterator it = l.begin (); it !+ l.end (); it++) {
257     (*it)(e);
258     }
259     delete e; // ugly slow? hai hai..... 183G
260     }
261     }
262     };
263    
264     extern skedjuhlar main_scheduler;
265 root 1.13 */
266 root 1.22
267 root 1.31 namespace gl {
268     void draw_box (const view &ctx, const sector &a, const sector &b);
269 root 1.34
270 root 1.35 extern int nesting;
271 root 1.34 void errchk (const char *name, const char *args, const char *file, int line);
272 root 1.31 }
273    
274 root 1.22 GLuint SDL_GL_LoadTexture (SDL_Surface * surface, GLfloat * texcoord);
275 root 1.27
276 root 1.22 inline int power_of_two (int input)
277     {
278     int value = 1;
279    
280     while (value < input)
281     {
282     value <<= 1;
283     }
284     return value;
285     }
286    
287     struct TextureExecption {
288 root 1.27 TextureExecption (string s) : msg(s) { }
289     string msg;
290 root 1.22 };
291 root 1.27
292 root 1.22 struct Texture {
293 root 1.27 SDL_Surface *image;
294     GLuint texture;
295     GLfloat texcoord[4];
296    
297     public:
298    
299     Texture(const char *f)
300     {
301     image = IMG_Load (f);
302    
303     if (!image)
304     throw (TextureExecption ("Couldn't load " + (string) f + ": " + (string) IMG_GetError ()));
305 root 1.22
306 root 1.27 texture = SDL_GL_LoadTexture (image, (GLfloat*)&texcoord);
307     if (texture == 0)
308     throw (TextureExecption ("Couldn't make GL Texture, failed to create new RGB SWSurface"));
309     }
310 root 1.22 };
311 root 1.1
312     #endif
313