/* Transformation matrix code V1.30 11/11/03
   See tmat.h for details
   Copyright 2008 Jeffrey Lee
   This file is part of WOUM.
   WOUM is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.
   WOUM is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
   You should have received a copy of the GNU General Public License
   along with WOUM.  If not, see <http://www.gnu.org/licenses/>.
*/

/* Multiplies partial matrix '_' by 'in' */

/* Column 0 */

out->t[0][0] = 0
#ifdef _00
+ fix_op(TYPE,_mul,_00,in->t[0][0])
#endif
#ifdef _01
+ fix_op(TYPE,_mul,_01,in->t[1][0])
#endif
#ifdef _02
+ fix_op(TYPE,_mul,_02,in->t[2][0])
#endif
#ifdef _03
+ fix_op(TYPE,_mul,_03,in->t[3][0])
#endif
;

out->t[1][0] = 0
#ifdef _10
+ fix_op(TYPE,_mul,_10,in->t[0][0])
#endif
#ifdef _11
+ fix_op(TYPE,_mul,_11,in->t[1][0])
#endif
#ifdef _12
+ fix_op(TYPE,_mul,_12,in->t[2][0])
#endif
#ifdef _13
+ fix_op(TYPE,_mul,_13,in->t[3][0])
#endif
;

out->t[2][0] = 0
#ifdef _20
+ fix_op(TYPE,_mul,_20,in->t[0][0])
#endif
#ifdef _21
+ fix_op(TYPE,_mul,_21,in->t[1][0])
#endif
#ifdef _22
+ fix_op(TYPE,_mul,_22,in->t[2][0])
#endif
#ifdef _23
+ fix_op(TYPE,_mul,_23,in->t[3][0])
#endif
;

out->t[3][0] = 0
#ifdef _30
+ fix_op(TYPE,_mul,_30,in->t[0][0])
#endif
#ifdef _31
+ fix_op(TYPE,_mul,_31,in->t[1][0])
#endif
#ifdef _32
+ fix_op(TYPE,_mul,_32,in->t[2][0])
#endif
#ifdef _33
+ fix_op(TYPE,_mul,_33,in->t[3][0])
#endif
;

/* Column 1 */

out->t[0][1] = 0
#ifdef _00
+ fix_op(TYPE,_mul,_00,in->t[0][1])
#endif
#ifdef _01
+ fix_op(TYPE,_mul,_01,in->t[1][1])
#endif
#ifdef _02
+ fix_op(TYPE,_mul,_02,in->t[2][1])
#endif
#ifdef _03
+ fix_op(TYPE,_mul,_03,in->t[3][1])
#endif
;

out->t[1][1] = 0
#ifdef _10
+ fix_op(TYPE,_mul,_10,in->t[0][1])
#endif
#ifdef _11
+ fix_op(TYPE,_mul,_11,in->t[1][1])
#endif
#ifdef _12
+ fix_op(TYPE,_mul,_12,in->t[2][1])
#endif
#ifdef _13
+ fix_op(TYPE,_mul,_13,in->t[3][1])
#endif
;

out->t[2][1] = 0
#ifdef _20
+ fix_op(TYPE,_mul,_20,in->t[0][1])
#endif
#ifdef _21
+ fix_op(TYPE,_mul,_21,in->t[1][1])
#endif
#ifdef _22
+ fix_op(TYPE,_mul,_22,in->t[2][1])
#endif
#ifdef _23
+ fix_op(TYPE,_mul,_23,in->t[3][1])
#endif
;

out->t[3][1] = 0
#ifdef _30
+ fix_op(TYPE,_mul,_30,in->t[0][1])
#endif
#ifdef _31
+ fix_op(TYPE,_mul,_31,in->t[1][1])
#endif
#ifdef _32
+ fix_op(TYPE,_mul,_32,in->t[2][1])
#endif
#ifdef _33
+ fix_op(TYPE,_mul,_33,in->t[3][1])
#endif
;

/* Column 2 */

out->t[0][2] = 0
#ifdef _00
+ fix_op(TYPE,_mul,_00,in->t[0][2])
#endif
#ifdef _01
+ fix_op(TYPE,_mul,_01,in->t[1][2])
#endif
#ifdef _02
+ fix_op(TYPE,_mul,_02,in->t[2][2])
#endif
#ifdef _03
+ fix_op(TYPE,_mul,_03,in->t[3][2])
#endif
;

out->t[1][2] = 0
#ifdef _10
+ fix_op(TYPE,_mul,_10,in->t[0][2])
#endif
#ifdef _11
+ fix_op(TYPE,_mul,_11,in->t[1][2])
#endif
#ifdef _12
+ fix_op(TYPE,_mul,_12,in->t[2][2])
#endif
#ifdef _13
+ fix_op(TYPE,_mul,_13,in->t[3][2])
#endif
;

out->t[2][2] = 0
#ifdef _20
+ fix_op(TYPE,_mul,_20,in->t[0][2])
#endif
#ifdef _21
+ fix_op(TYPE,_mul,_21,in->t[1][2])
#endif
#ifdef _22
+ fix_op(TYPE,_mul,_22,in->t[2][2])
#endif
#ifdef _23
+ fix_op(TYPE,_mul,_23,in->t[3][2])
#endif
;

out->t[3][2] = 0
#ifdef _30
+ fix_op(TYPE,_mul,_30,in->t[0][2])
#endif
#ifdef _31
+ fix_op(TYPE,_mul,_31,in->t[1][2])
#endif
#ifdef _32
+ fix_op(TYPE,_mul,_32,in->t[2][2])
#endif
#ifdef _33
+ fix_op(TYPE,_mul,_33,in->t[3][2])
#endif
;

/* Column 3 */

out->t[0][3] = 0
#ifdef _00
+ fix_op(TYPE,_mul,_00,in->t[0][3])
#endif
#ifdef _01
+ fix_op(TYPE,_mul,_01,in->t[1][3])
#endif
#ifdef _02
+ fix_op(TYPE,_mul,_02,in->t[2][3])
#endif
#ifdef _03
+ fix_op(TYPE,_mul,_03,in->t[3][3])
#endif
;

out->t[1][3] = 0
#ifdef _10
+ fix_op(TYPE,_mul,_10,in->t[0][3])
#endif
#ifdef _11
+ fix_op(TYPE,_mul,_11,in->t[1][3])
#endif
#ifdef _12
+ fix_op(TYPE,_mul,_12,in->t[2][3])
#endif
#ifdef _13
+ fix_op(TYPE,_mul,_13,in->t[3][3])
#endif
;

out->t[2][3] = 0
#ifdef _20
+ fix_op(TYPE,_mul,_20,in->t[0][3])
#endif
#ifdef _21
+ fix_op(TYPE,_mul,_21,in->t[1][3])
#endif
#ifdef _22
+ fix_op(TYPE,_mul,_22,in->t[2][3])
#endif
#ifdef _23
+ fix_op(TYPE,_mul,_23,in->t[3][3])
#endif
;

out->t[3][3] = 0
#ifdef _30
+ fix_op(TYPE,_mul,_30,in->t[0][3])
#endif
#ifdef _31
+ fix_op(TYPE,_mul,_31,in->t[1][3])
#endif
#ifdef _32
+ fix_op(TYPE,_mul,_32,in->t[2][3])
#endif
#ifdef _33
+ fix_op(TYPE,_mul,_33,in->t[3][3])
#endif
;

/* Cleanup */

#undef _00
#undef _10
#undef _20
#undef _30
#undef _01
#undef _11
#undef _21
#undef _31
#undef _02
#undef _12
#undef _22
#undef _32
#undef _03
#undef _13
#undef _23
#undef _33
