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