- #include "transfrm.h" 
- #include "CORE/MATH/angles.h" 
- #include "CORE/MATH/matrix34.h" 
- #include "CORE/MATH/quat.h" 
- #include "CORE/MATH/vector.h" 
- #include "harness/trace.h" 
-   
- #include <string.h> 
-   
- #define M34 BR_TRANSFORM_MATRIX34 
- #define MLP BR_TRANSFORM_MATRIX34_LP 
- #define QUT BR_TRANSFORM_QUAT 
- #define EUL BR_TRANSFORM_EULER 
- #define LUP BR_TRANSFORM_LOOK_UP 
- #define TRA BR_TRANSFORM_TRANSLATION 
- #define IDT BR_TRANSFORM_IDENTITY 
-   
- br_uint_8 _CombineTransforms[7][7] = { 
-   
-     /* M34 */ { 
-         M34, 
-         M34, 
-         M34, 
-         M34, 
-         M34, 
-         M34, 
-         M34, 
-     }, 
-     /* MLP */ { 
-         M34, 
-         MLP, 
-         MLP, 
-         MLP, 
-         MLP, 
-         MLP, 
-         MLP, 
-     }, 
-     /* QUT */ { 
-         M34, 
-         MLP, 
-         MLP, 
-         MLP, 
-         MLP, 
-         QUT, 
-         QUT, 
-     }, 
-     /* EUL */ { 
-         M34, 
-         MLP, 
-         MLP, 
-         MLP, 
-         MLP, 
-         EUL, 
-         EUL, 
-     }, 
-     /* LUP */ { 
-         M34, 
-         MLP, 
-         MLP, 
-         MLP, 
-         MLP, 
-         LUP, 
-         LUP, 
-     }, 
-     /* TRA */ { 
-         M34, 
-         MLP, 
-         QUT, 
-         EUL, 
-         LUP, 
-         TRA, 
-         TRA, 
-     }, 
-     /* IDT */ { 
-         M34, 
-         MLP, 
-         QUT, 
-         EUL, 
-         LUP, 
-         TRA, 
-         IDT, 
-     }, 
- }; 
-   
- // IDA: void __cdecl BrTransformToMatrix34(br_matrix34 *mat, br_transform *xform) 
- void BrTransformToMatrix34(br_matrix34* mat, br_transform* xform) { 
-     LOG_TRACE("(%p, %p)", mat, xform); 
-   
-     switch (xform->type) { 
-     case BR_TRANSFORM_MATRIX34: 
-     case BR_TRANSFORM_MATRIX34_LP: 
-         *mat = xform->t.mat; 
-         break; 
-   
-     case BR_TRANSFORM_QUAT: 
-   
-         BrQuatToMatrix34(mat, &xform->t.quat.q); 
-   
-         mat->m[V_W][V_X] = xform->t.quat.t.v[V_X]; 
-         mat->m[V_W][V_Y] = xform->t.quat.t.v[V_Y]; 
-         mat->m[V_W][V_Z] = xform->t.quat.t.v[V_Z]; 
-         break; 
-   
-     case BR_TRANSFORM_EULER: 
-   
-         BrEulerToMatrix34(mat, &xform->t.euler.e); 
-   
-         mat->m[V_W][V_X] = xform->t.euler.t.v[V_X]; 
-         mat->m[V_W][V_Y] = xform->t.euler.t.v[V_Y]; 
-         mat->m[V_W][V_Z] = xform->t.euler.t.v[V_Z]; 
-   
-         break; 
-   
-     case BR_TRANSFORM_TRANSLATION: 
-         BrMatrix34Translate(mat, 
-             xform->t.look_up.t.v[V_X], 
-             xform->t.look_up.t.v[V_Y], 
-             xform->t.look_up.t.v[V_Z]); 
-   
-         break; 
-   
-     case BR_TRANSFORM_LOOK_UP: { 
-         /* 
-                          * 1) Normalise Lookat vector to get Z component of matrix 
-                          * 2) Cross with up vector and normalise to get X component 
-                          * 3) Cross X & Z to get Y 
-                          */ 
-         br_vector3 vx, vy, vz; 
-   
-         BrVector3Normalise(&vz, &xform->t.look_up.look); 
-         BrVector3Negate(&vz, &vz); 
-         BrVector3Cross(&vx, &xform->t.look_up.up, &vz); 
-         BrVector3Normalise(&vx, &vx); 
-         BrVector3Cross(&vy, &vz, &vx); 
-   
-         mat->m[V_X][V_X] = vx.v[V_X]; 
-         mat->m[V_X][V_Y] = vx.v[V_Y]; 
-         mat->m[V_X][V_Z] = vx.v[V_Z]; 
-         mat->m[V_Y][V_X] = vy.v[V_X]; 
-         mat->m[V_Y][V_Y] = vy.v[V_Y]; 
-         mat->m[V_Y][V_Z] = vy.v[V_Z]; 
-         mat->m[V_Z][V_X] = vz.v[V_X]; 
-         mat->m[V_Z][V_Y] = vz.v[V_Y]; 
-         mat->m[V_Z][V_Z] = vz.v[V_Z]; 
-   
-         mat->m[V_W][V_X] = xform->t.look_up.t.v[V_X]; 
-         mat->m[V_W][V_Y] = xform->t.look_up.t.v[V_Y]; 
-         mat->m[V_W][V_Z] = xform->t.look_up.t.v[V_Z]; 
-     } break; 
-   
-     case BR_TRANSFORM_IDENTITY: 
-         BrMatrix34Identity(mat); 
-         break; 
-     } 
- } 
-   
- // IDA: void __cdecl BrMatrix34PreTransform(br_matrix34 *mat, br_transform *xform) 
- void BrMatrix34PreTransform(br_matrix34* mat, br_transform* xform) { 
-     br_matrix34 tmp; 
-     LOG_TRACE("(%p, %p)", mat, xform); 
-   
-     if (xform->type == BR_TRANSFORM_IDENTITY) { 
-         return; 
-     } 
-   
-     BrTransformToMatrix34(&tmp, xform); 
-     BrMatrix34Pre(mat, &tmp); 
- } 
-   
- // IDA: void __cdecl BrMatrix34PostTransform(br_matrix34 *mat, br_transform *xform) 
- void BrMatrix34PostTransform(br_matrix34* mat, br_transform* xform) { 
-     br_matrix34 tmp; 
-     LOG_TRACE("(%p, %p)", mat, xform); 
-   
-     if (xform->type == BR_TRANSFORM_IDENTITY) { 
-         return; 
-     } 
-   
-     BrTransformToMatrix34(&tmp, xform); 
-     BrMatrix34Post(mat, &tmp); 
- } 
-   
- // IDA: void __cdecl BrMatrix4PreTransform(br_matrix4 *mat, br_transform *xform) 
- void BrMatrix4PreTransform(br_matrix4* mat, br_transform* xform) { 
-     //br_matrix34 tmp; // Pierre-Marie Baty -- unused variable 
-     LOG_TRACE("(%p, %p)", mat, xform); 
-     NOT_IMPLEMENTED(); 
- } 
-   
- // IDA: void __cdecl BrMatrix34ToTransform(br_transform *xform, br_matrix34 *mat) 
- void BrMatrix34ToTransform(br_transform* xform, br_matrix34* mat) { 
-     LOG_TRACE("(%p, %p)", xform, mat); 
-   
-     switch (xform->type) { 
-     case BR_TRANSFORM_MATRIX34: 
-         memcpy(&- xform ->- t. mat,-  mat , sizeof(- br_matrix34 ));
 
-         break; 
-     case BR_TRANSFORM_MATRIX34_LP: 
-         memcpy(&- xform ->- t. mat,-  mat , sizeof(- br_matrix34 ));
 
-         BrMatrix34LPNormalise(&xform->t.mat, &xform->t.mat); 
-         break; 
-     case BR_TRANSFORM_QUAT: 
-         BrMatrix34ToQuat(&xform->t.quat.q, mat); 
-         BrVector3Copy(&xform->t.quat.t, (br_vector3*)mat->m[3]); 
-         break; 
-     case BR_TRANSFORM_EULER: 
-         BrMatrix34ToEuler(&xform->t.euler.e, mat); 
-         BrVector3Copy(&xform->t.quat.t, (br_vector3*)mat->m[3]); 
-         break; 
-     case BR_TRANSFORM_LOOK_UP: 
-         NOT_IMPLEMENTED(); 
-         break; 
-     case BR_TRANSFORM_TRANSLATION: 
-         BrVector3Copy(&xform->t.quat.t, (br_vector3*)mat->m[3]); 
-         break; 
-     default: 
-         TELL_ME_IF_WE_PASS_THIS_WAY(); 
-     } 
- } 
-   
- // IDA: void __cdecl BrTransformToTransform(br_transform *dest, br_transform *src) 
- void BrTransformToTransform(br_transform* dest, br_transform* src) { 
-     br_matrix34 temp; 
-     LOG_TRACE("(%p, %p)", dest, src); 
-   
-     if (src->type == dest->type) { 
-         memcpy(- dest ,-  src , sizeof(- br_transform ));
 
-         return; 
-     } 
-     switch (dest->type) { 
-     case BR_TRANSFORM_MATRIX34: 
-         BrTransformToMatrix34(&dest->t.mat, src); 
-         break; 
-     case BR_TRANSFORM_MATRIX34_LP: 
-         BrTransformToMatrix34(&dest->t.mat, src); 
-         BrMatrix34LPNormalise(&dest->t.mat, &dest->t.mat); 
-         break; 
-     default: 
-         BrTransformToMatrix34(&temp, src); 
-         BrMatrix34ToTransform(dest, &temp); 
-     } 
- } 
-