00001
00002
00003
00015 #include <math.h>
00016 #include <allegro.h>
00017 #include "alleggl.h"
00018 #include "allglint.h"
00019
00020
00021 #ifndef M_PI
00022 #define M_PI 3.14159265358979323846
00023 #endif
00024
00025
00026 #define ALGL_NOCONV(x) x
00027
00028 #define TRANSLATE_AL_TO_GL(al_type, gl_type, convertor) \
00029 void allegro_gl_##al_type##_to_##gl_type (al_type *m, gl_type gl[16]) \
00030 { \
00031 int col, row; \
00032 for (col = 0; col < 3; col++) \
00033 for (row = 0; row < 3; row++) \
00034 gl[col*4+row] = convertor (m->v[col][row]); \
00035 for (row = 0; row < 3; row++) \
00036 gl[12+row] = convertor (m->t[row]); \
00037 for (col = 0; col < 3; col++) \
00038 gl[4*col + 3] = 0; \
00039 gl[15] = 1; \
00040 }
00041
00042
00043
00066 TRANSLATE_AL_TO_GL(MATRIX, GLfloat, fixtof)
00067
00068
00069
00070
00082 TRANSLATE_AL_TO_GL(MATRIX, GLdouble, fixtof)
00083
00084
00085
00098 TRANSLATE_AL_TO_GL(MATRIX_f, GLfloat, ALGL_NOCONV)
00099
00100
00101
00114 TRANSLATE_AL_TO_GL(MATRIX_f, GLdouble, ALGL_NOCONV)
00115
00116
00117
00118 #define TRANSLATE_GL_TO_AL(gl_type, al_type, convertor) \
00119 void allegro_gl_##gl_type##_to_##al_type (gl_type gl[16], al_type *m) \
00120 { \
00121 int col, row; \
00122 for (col = 0; col < 3; col++) \
00123 for (row = 0; row < 3; row++) \
00124 m->v[col][row] = convertor (gl[col*4+row]); \
00125 for (row = 0; row < 3; row++) \
00126 m->t[row] = convertor (gl[12+row]); \
00127 }
00128
00129
00130
00143 TRANSLATE_GL_TO_AL(GLfloat, MATRIX, ftofix)
00144
00145
00146
00147
00159 TRANSLATE_GL_TO_AL(GLdouble, MATRIX, ftofix)
00160
00161
00162
00175 TRANSLATE_GL_TO_AL(GLfloat, MATRIX_f, ALGL_NOCONV)
00176
00177
00178
00192 TRANSLATE_GL_TO_AL(GLdouble, MATRIX_f, ALGL_NOCONV)
00193
00194
00195 #undef ALGL_NOCONV
00196
00197
00198 #ifndef RAD_2_DEG
00199 #define RAD_2_DEG(a) ((a) * 180 / M_PI)
00200 #endif
00201
00202
00203
00204
00222 void allegro_gl_apply_quat(QUAT *q) {
00223
00224 float theta;
00225 ASSERT(q);
00226 ASSERT(__allegro_gl_valid_context);
00227
00228 theta = RAD_2_DEG(2 * acos(q->w));
00229 if (q->w < 1.0f && q->w > -1.0f)
00230 glRotatef(theta, q->x, q->y, q->z);
00231
00232 return;
00233 }
00234
00235
00236
00237
00258 void allegro_gl_quat_to_glrotatef(QUAT *q, float *angle, float *x, float *y, float *z) {
00259
00260 ASSERT(q);
00261 ASSERT(angle);
00262 ASSERT(x);
00263 ASSERT(y);
00264 ASSERT(z);
00265
00266 *angle = RAD_2_DEG(2 * acos(q->w));
00267 *x = q->x;
00268 *y = q->y;
00269 *z = q->z;
00270
00271 return;
00272 }
00273
00274
00275
00276
00290 void allegro_gl_quat_to_glrotated(QUAT *q, double *angle, double *x, double *y, double *z) {
00291
00292 ASSERT(q);
00293 ASSERT(angle);
00294 ASSERT(x);
00295 ASSERT(y);
00296 ASSERT(z);
00297
00298 *angle = RAD_2_DEG(2 * acos(q->w));
00299 *x = q->x;
00300 *y = q->y;
00301 *z = q->z;
00302
00303 return;
00304 }
00305