ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/libgender/util.h
Revision: 1.28
Committed: Fri Oct 8 09:45:25 2004 UTC (19 years, 8 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.27: +20 -4 lines
Log Message:
*** empty log message ***

File Contents

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