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