00001
00002
00003
00004
00005
00006
00007
00008 #ifndef _SNIPPETSGL_H
00009 #define _SNIPPETSGL_H
00010
00011
00012 #define glBindTexture3D(texnamevar, min_linear, mag_linear, repeat_x, repeat_y, repeat_z, WIDTH, HEIGHT, DEPTH, texture_ptr) \
00013 { \
00014 glGenTextures(1, &texnamevar); \
00015 glBindTexture(GL_TEXTURE_3D, texnamevar); \
00016 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, min_linear ? GL_LINEAR : GL_NEAREST); \
00017 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, mag_linear ? GL_LINEAR : GL_NEAREST); \
00018 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, repeat_x ? GL_REPEAT : GL_CLAMP); \
00019 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, repeat_y ? GL_REPEAT : GL_CLAMP); \
00020 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, repeat_z ? GL_REPEAT : GL_CLAMP); \
00021 glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB8, WIDTH, HEIGHT, DEPTH, 0, GL_RGB, GL_UNSIGNED_BYTE, texture_ptr); \
00022 }
00023
00024
00025 #define glBindTexture2D(texnamevar, min_linear, mag_linear, repeat_x, repeat_y, WIDTH, HEIGHT, texture_ptr) \
00026 { \
00027 glGenTextures(1, &texnamevar); \
00028 glBindTexture(GL_TEXTURE_2D, texnamevar); \
00029 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, min_linear ? GL_LINEAR : GL_NEAREST); \
00030 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mag_linear ? GL_LINEAR : GL_NEAREST); \
00031 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, repeat_x ? GL_REPEAT : GL_CLAMP); \
00032 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, repeat_y ? GL_REPEAT : GL_CLAMP); \
00033 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, WIDTH, HEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE, texture_ptr); \
00034 }
00035
00036
00037 #define glPrint(name, getenum) \
00038 { \
00039 int i; \
00040 glGetIntegerv(getenum, &i); \
00041 printf("%s = %i\n", name, i); \
00042 }
00043
00044
00045
00046
00047
00048 #define glVertex3fv2f(pnt, u, v) \
00049 { \
00050 glTexCoord2f(u,v); \
00051 glVertex3fv(pnt); \
00052 }
00053
00054 #define glVertex3fv2fv(pnt, tex) \
00055 { \
00056 glTexCoord2f(tex[0], tex[1]); \
00057 glVertex3fv(pnt); \
00058 }
00059
00060 #define glVertex3fv3fv(pnt, tex) \
00061 { \
00062 glTexCoord3fv(tex); \
00063 glVertex3fv(pnt); \
00064 }
00065
00066
00067 #define glNormAxis() \
00068 { \
00069 glPushAttrib(GL_CURRENT_BIT | GL_ENABLE_BIT); \
00070 glDisable(GL_TEXTURE_2D); \
00071 glDisable(GL_LIGHTING); \
00072 glBegin(GL_LINES); \
00073 glColor4f(1,0,0,1); \
00074 glVertex3f(0,0,0); \
00075 glVertex3f(1,0,0); \
00076 glColor4f(0,1,0,1); \
00077 glVertex3f(0,0,0); \
00078 glVertex3f(0,1,0); \
00079 glColor4f(0,0,1,1); \
00080 glVertex3f(0,0,0); \
00081 glVertex3f(0,0,1); \
00082 glEnd(); \
00083 glPopAttrib(); \
00084 }
00085
00086
00087 #define glAxis(l) \
00088 { \
00089 glPushAttrib(GL_CURRENT_BIT | GL_ENABLE_BIT); \
00090 glDisable(GL_TEXTURE_2D); \
00091 glDisable(GL_LIGHTING); \
00092 glBegin(GL_LINES); \
00093 glColor4f(1,0,0,1); \
00094 glVertex3f(0,0,0); \
00095 glVertex3f(l,0,0); \
00096 glColor4f(0,1,0,1); \
00097 glVertex3f(0,0,0); \
00098 glVertex3f(0,l,0); \
00099 glColor4f(0,0,1,1); \
00100 glVertex3f(0,0,0); \
00101 glVertex3f(0,0,l); \
00102 glEnd(); \
00103 glPopAttrib(); \
00104 }
00105
00106
00107 #define glLineSquare(border) \
00108 { \
00109 float lo = border; \
00110 float hi = 1 - border; \
00111 glBegin(GL_LINE_STRIP); { \
00112 glVertex3f(lo, lo, 0); \
00113 glVertex3f(hi, lo, 0); \
00114 glVertex3f(hi, hi, 0); \
00115 glVertex3f(lo, hi, 0); \
00116 glVertex3f(lo, lo, 0); \
00117 } glEnd(); \
00118 }
00119
00120 #define glDisk(segments, radius) \
00121 { \
00122 int n = 2 + (segments); \
00123 float step = 2*M_PI / (float) n; \
00124 float a = 0; \
00125 glBegin(GL_TRIANGLE_FAN); \
00126 glNormal3f(0,0,1); \
00127 loopi(n) { \
00128 glTexCoord3f(0.45+0.499*sin(a), 0.5+0.499*cos(a), 0); \
00129 glVertex3f(sin(a)*(radius), cos(a)*(radius), 0); \
00130 a += step; \
00131 } \
00132 glEnd(); \
00133 }
00134
00135
00136 #define glUnitCylinder(segments) \
00137 { \
00138 int n = 2 + (segments); \
00139 float step = 1.0f / (float) n; \
00140 float anglestep = 2.0f * M_PI *step; \
00141 float angle = 0.0f; \
00142 glBegin(GL_TRIANGLE_STRIP); \
00143 for (int i=0; i<=n; i++) { \
00144 glTexCoord3f(0.45+0.499*sin(angle), 0.999f, 0.5+0.499*cos(angle)); \
00145 glVertex3f(sin(angle), +1.0f, cos(angle)); \
00146 glTexCoord3f(0.5+0.0.499*sin(angle), 0.001f, 0.5+0.499*cos(angle)); \
00147 glVertex3f(sin(angle), +0.0f, cos(angle)); \
00148 angle += anglestep; \
00149 }; \
00150 glEnd(); \
00151 }
00152
00153
00154 #define glCenterUnitCylinder(segments) \
00155 { \
00156 float step = 1.0f / (float) segments; \
00157 float anglestep = 2.0f * M_PI *step; \
00158 float angle = 0.0f; \
00159 glBegin(GL_TRIANGLE_STRIP); \
00160 for (int i=0; i<=segments; i++) { \
00161 glTexCoord3f(0.5+0.499*sin(angle), 0.999f, 0.5+0.499*cos(angle)); \
00162 glVertex3f(sin(angle), +1.0f, cos(angle)); \
00163 glTexCoord3f(0.5+0.499*sin(angle), 0.001f, 0.5+0.499*cos(angle)); \
00164 glVertex3f(sin(angle), -1.0f, cos(angle)); \
00165 angle += anglestep; \
00166 }; \
00167 glEnd(); \
00168 }
00169
00170
00171 #define glUnitBlock() \
00172 { \
00173 GLfloat p[][3] = { \
00174 {0,0,0}, {1,0,0}, {1,1,0}, {0,1,0}, \
00175 {0,0,1}, {1,0,1}, {1,1,1}, {0,1,1} \
00176 }; \
00177 const float a = 0.01f; \
00178 const float b = 0.99f; \
00179 GLfloat t[][3] = { \
00180 {a,a,a}, {b,a,a}, {b,b,a}, {a,b,a}, \
00181 {a,a,b}, {b,a,b}, {b,b,b}, {a,b,b} \
00182 }; \
00183 \
00184 glBegin(GL_QUADS); \
00185 \
00186 glNormal3f(0, 0, -1); \
00187 glVertex3fv3fv(p[1], t[1]); glVertex3fv3fv(p[0], t[0]); \
00188 glVertex3fv3fv(p[3], t[3]); glVertex3fv3fv(p[2], t[2]); \
00189 \
00190 glNormal3f(0, 0, +1); \
00191 glVertex3fv3fv(p[4], t[4]); glVertex3fv3fv(p[5], t[5]); \
00192 glVertex3fv3fv(p[6], t[6]); glVertex3fv3fv(p[7], t[7]); \
00193 \
00194 glNormal3f(0, -1, 0); \
00195 glVertex3fv3fv(p[0], t[0]); glVertex3fv3fv(p[1], t[1]); \
00196 glVertex3fv3fv(p[5], t[5]); glVertex3fv3fv(p[4], t[4]); \
00197 \
00198 glNormal3f(0, +1, 0); \
00199 glVertex3fv3fv(p[2], t[2]); glVertex3fv3fv(p[3], t[3]); \
00200 glVertex3fv3fv(p[7], t[7]); glVertex3fv3fv(p[6], t[6]); \
00201 \
00202 glNormal3f(+1, 0, 0); \
00203 glVertex3fv3fv(p[0], t[0]); glVertex3fv3fv(p[4], t[4]); \
00204 glVertex3fv3fv(p[7], t[7]); glVertex3fv3fv(p[3], t[3]); \
00205 \
00206 glNormal3f(-1, 0, 0); \
00207 glVertex3fv3fv(p[5], t[5]); glVertex3fv3fv(p[1], t[1]); \
00208 glVertex3fv3fv(p[2], t[2]); glVertex3fv3fv(p[6], t[6]); \
00209 glEnd(); \
00210 }
00211
00212
00213 #define glBlockFlat(width, height, depth, left,right, front,back, top,bottom) \
00214 { \
00215 float a = 0, b = 0, c = 0; \
00216 float x = width; \
00217 float y = height; \
00218 float z = depth; \
00219 GLfloat p[][3] = { \
00220 {a,b,c}, {x,b,c}, {x,y,c}, {a,y,c}, \
00221 {a,b,z}, {x,b,z}, {x,y,z}, {a,y,z} \
00222 }; \
00223 GLfloat t[][2] = { \
00224 {a,b}, {x,b}, {x,y}, {a,y}, \
00225 {c,b}, {z,b}, {z,y}, {c,y}, \
00226 {a,c}, {x,c}, {x,z}, {a,z}, \
00227 }; \
00228 \
00229 glBindTexture(GL_TEXTURE_2D, front); \
00230 glBegin(GL_QUADS); \
00231 glNormal3f(0, 0, -1); \
00232 glVertex3fv2fv(p[1], t[1]); glVertex3fv2fv(p[0], t[0]); \
00233 glVertex3fv2fv(p[3], t[3]); glVertex3fv2fv(p[2], t[2]); \
00234 glEnd(); \
00235 if (back != front) glBindTexture(GL_TEXTURE_2D, back); \
00236 glBegin(GL_QUADS); \
00237 glNormal3f(0, 0, +1); \
00238 glVertex3fv2fv(p[4], t[1]); glVertex3fv2fv(p[5], t[0]); \
00239 glVertex3fv2fv(p[6], t[3]); glVertex3fv2fv(p[7], t[2]); \
00240 glEnd(); \
00241 if (left != back) glBindTexture(GL_TEXTURE_2D, left); \
00242 glBegin(GL_QUADS); \
00243 glNormal3f(+1, 0, 0); \
00244 glVertex3fv2fv(p[0], t[5]); glVertex3fv2fv(p[4], t[4]); \
00245 glVertex3fv2fv(p[7], t[7]); glVertex3fv2fv(p[3], t[6]); \
00246 glEnd(); \
00247 if (right != left) glBindTexture(GL_TEXTURE_2D, right); \
00248 glBegin(GL_QUADS); \
00249 glNormal3f(-1, 0, 0); \
00250 glVertex3fv2fv(p[5], t[5]); glVertex3fv2fv(p[1], t[4]); \
00251 glVertex3fv2fv(p[2], t[7]); glVertex3fv2fv(p[6], t[6]); \
00252 glEnd(); \
00253 if (top != right) glBindTexture(GL_TEXTURE_2D, top); \
00254 glBegin(GL_QUADS); \
00255 glNormal3f(0, -1, 0); \
00256 glVertex3fv2fv(p[0], t[9]); glVertex3fv2fv(p[1], t[8]); \
00257 glVertex3fv2fv(p[5], t[11]); glVertex3fv2fv(p[4], t[10]); \
00258 glEnd(); \
00259 if (bottom != top) glBindTexture(GL_TEXTURE_2D, bottom); \
00260 glBegin(GL_QUADS); \
00261 glNormal3f(0, +1, 0); \
00262 glVertex3fv2fv(p[2], t[9]); glVertex3fv2fv(p[3], t[8]); \
00263 glVertex3fv2fv(p[7], t[11]); glVertex3fv2fv(p[6], t[10]); \
00264 glEnd(); \
00265 }
00266
00267
00268 #define glCenterUnitBlock() \
00269 { \
00270 GLfloat p[][3] = { \
00271 {-1,-1,-1}, {+1,-1,-1}, {+1,+1,-1}, {-1,+1,-1}, \
00272 {-1,-1,+1}, {+1,-1,+1}, {+1,+1,+1}, {-1,+1,+1} \
00273 }; \
00274 const float a = 0.01f; \
00275 const float b = 0.99f; \
00276 GLfloat t[][3] = { \
00277 {a,a,a}, {b,a,a}, {b,b,a}, {a,b,a}, \
00278 {a,a,b}, {b,a,b}, {b,b,b}, {a,b,b} \
00279 }; \
00280 \
00281 glBegin(GL_QUADS); \
00282 \
00283 glNormal3f(0, 0, -1); \
00284 glVertex3fv3fv(p[1], t[1]); glVertex3fv3fv(p[0], t[0]); \
00285 glVertex3fv3fv(p[3], t[3]); glVertex3fv3fv(p[2], t[2]); \
00286 \
00287 glNormal3f(0, 0, +1); \
00288 glVertex3fv3fv(p[4], t[4]); glVertex3fv3fv(p[5], t[5]); \
00289 glVertex3fv3fv(p[6], t[6]); glVertex3fv3fv(p[7], t[7]); \
00290 \
00291 glNormal3f(0, -1, 0); \
00292 glVertex3fv3fv(p[0], t[0]); glVertex3fv3fv(p[1], t[1]); \
00293 glVertex3fv3fv(p[5], t[5]); glVertex3fv3fv(p[4], t[4]); \
00294 \
00295 glNormal3f(0, +1, 0); \
00296 glVertex3fv3fv(p[2], t[2]); glVertex3fv3fv(p[3], t[3]); \
00297 glVertex3fv3fv(p[7], t[7]); glVertex3fv3fv(p[6], t[6]); \
00298 \
00299 glNormal3f(+1, 0, 0); \
00300 glVertex3fv3fv(p[0], t[0]); glVertex3fv3fv(p[4], t[4]); \
00301 glVertex3fv3fv(p[7], t[7]); glVertex3fv3fv(p[3], t[3]); \
00302 \
00303 glNormal3f(-1, 0, 0); \
00304 glVertex3fv3fv(p[5], t[5]); glVertex3fv3fv(p[1], t[1]); \
00305 glVertex3fv3fv(p[2], t[2]); glVertex3fv3fv(p[6], t[6]); \
00306 glEnd(); \
00307 }
00308
00309
00310
00311
00312
00313
00314 #define glPushPerspectiveProjection(fovdegrees) \
00315 { \
00316 glPushAttrib(GL_DEPTH_BUFFER_BIT); \
00317 glPushAttrib(GL_TRANSFORM_BIT); \
00318 glMatrixMode(GL_PROJECTION); \
00319 glPushMatrix(); \
00320 glLoadIdentity(); \
00321 GLint view[4]; \
00322 glGetIntegerv(GL_VIEWPORT, view); \
00323 gluPerspective(fovdegrees, GLdouble(view[2]) / GLdouble(view[3]), 0.07, 1500.0); \
00324 glDepthFunc(GL_LEQUAL); \
00325 glPopAttrib(); \
00326 }
00327
00328
00329 #define glPushUnitOrthoProjection() \
00330 { \
00331 glPushAttrib(GL_DEPTH_BUFFER_BIT); \
00332 glPushAttrib(GL_TRANSFORM_BIT); \
00333 glMatrixMode(GL_PROJECTION); \
00334 glPushMatrix(); \
00335 glLoadIdentity(); \
00336 glOrtho(0, 1, 0, 1, -500.0, 500.0); \
00337 glDepthFunc(GL_GEQUAL); \
00338 glPopAttrib(); \
00339 }
00340
00341
00342 #define glPushCenterUnitOrthoProjection() \
00343 { \
00344 glPushAttrib(GL_DEPTH_BUFFER_BIT); \
00345 glPushAttrib(GL_TRANSFORM_BIT); \
00346 glMatrixMode(GL_PROJECTION); \
00347 glPushMatrix(); \
00348 glLoadIdentity(); \
00349 glOrtho(-1, 1, -1, 1, -500.0, 500.0); \
00350 glDepthFunc(GL_GEQUAL); \
00351 glPopAttrib(); \
00352 }
00353
00354
00355 #define glPushViewportOrthoProjection() \
00356 { \
00357 glPushAttrib(GL_DEPTH_BUFFER_BIT); \
00358 glPushAttrib(GL_TRANSFORM_BIT); \
00359 glMatrixMode(GL_PROJECTION); \
00360 glPushMatrix(); \
00361 glLoadIdentity(); \
00362 GLint view[4]; \
00363 glGetIntegerv(GL_VIEWPORT, view); \
00364 glOrtho(view[0], view[2], view[1], view[3], -500.0, 500.0); \
00365 glDepthFunc(GL_GEQUAL); \
00366 glPopAttrib(); \
00367 }
00368
00369
00370 #define glPopProjection() \
00371 { \
00372 glPushAttrib(GL_TRANSFORM_BIT); \
00373 glMatrixMode(GL_PROJECTION); \
00374 glPopMatrix(); \
00375 glPopAttrib(); \
00376 glPopAttrib(); \
00377 }
00378
00379
00380
00381
00382 #define glAccumBlur(alpha) \
00383 { \
00384 glAccum(GL_MULT, alpha); \
00385 glAccum(GL_ACCUM, 1.0f-alpha); \
00386 glAccum(GL_RETURN, 1.0f); \
00387 }
00388
00389
00390 #define glAccumBlurInverse(alpha) \
00391 { \
00392 glAccum(GL_MULT, alpha); \
00393 glAccum(GL_ACCUM, 1.0f-alpha); \
00394 glAccum(GL_MULT, -1.0f); glAccum(GL_ADD, 1.0f); \
00395 glAccum(GL_RETURN, 1.0f); \
00396 glAccum(GL_ADD, -1.0f); glAccum(GL_MULT, -1.0f); \
00397 }
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407 #define glGetTransposeInverseRotationMatrix(invm) \
00408 { \
00409 float _m_[16]; \
00410 glGetFloatv(GL_MODELVIEW_MATRIX, _m_); \
00411 float _n_[] = { \
00412 _m_[0], _m_[4], _m_[ 8], 0, \
00413 _m_[1], _m_[5], _m_[ 9], 0, \
00414 _m_[2], _m_[6], _m_[10], 0, \
00415 0, 0, 0, 1 \
00416 }; \
00417 memcpy(invm, _n_, sizeof(float)*16); \
00418 }
00419
00420
00421
00422
00423
00424
00425 #define glGetInverseTranslationMatrix(invm) \
00426 { \
00427 float _m_[16]; \
00428 glGetFloatv(GL_MODELVIEW_MATRIX, _m_); \
00429 float _n_[] = { \
00430 1, 0, 0, 0, \
00431 0, 1, 0, 0, \
00432 0, 0, 1, 0, \
00433 -_m_[12],-_m_[13],-_m_[14], 1 \
00434 }; \
00435 memcpy(invm, _n_, sizeof(float)*16); \
00436 }
00437
00438
00439
00440
00441 #define glRotateq(quat4fv) \
00442 { \
00443 float x = -(quat4fv)[X]; \
00444 float y = -(quat4fv)[Y]; \
00445 float z = -(quat4fv)[Z]; \
00446 float w = (quat4fv)[W]; \
00447 float x2 = x*x; \
00448 float y2 = y*y; \
00449 float z2 = z*z; \
00450 float m[] = { \
00451 1 - 2 * y2 - 2 * z2, 2 * x * y - 2 * w*z, 2 * x * z + 2 * w*y, 0, \
00452 2 * x * y + 2 * w*z, 1 - 2 * x2 - 2 * z2, 2 * y * z - 2 * w*x, 0, \
00453 2 * x * z - 2 * w*y, 2 * y * z + 2 * w*x, 1 - 2 * x2 - 2 * y2, 0, \
00454 0, 0, 0, 1 \
00455 }; \
00456 glMultMatrixf(m); \
00457 }
00458
00459
00460 #endif
00461