mtxutil.c
1.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/**************************************************************************
* *
* Copyright (C) 1994, Silicon Graphics, Inc. *
* *
* These coded instructions, statements, and computer programs contain *
* unpublished proprietary information of Silicon Graphics, Inc., and *
* are protected by Federal copyright law. They may not be disclosed *
* to third parties or copied or duplicated in any form, in whole or *
* in part, without the prior written consent of Silicon Graphics, Inc. *
* *
**************************************************************************/
#include "guint.h"
void guMtxF2L(float mf[4][4], Mtx *m)
{
int i, j;
int e1,e2;
int *ai,*af;
ai=(int *) &m->m[0][0];
af=(int *) &m->m[2][0];
for (i=0; i<4; i++)
for (j=0; j<2; j++) {
e1=FTOFIX32(mf[i][j*2]);
e2=FTOFIX32(mf[i][j*2+1]);
*(ai++) = ( e1 & 0xffff0000 ) | ((e2 >> 16)&0xffff);
*(af++) = ((e1 << 16) & 0xffff0000) | (e2 & 0xffff);
}
}
void guMtxL2F(float mf[4][4], Mtx *m)
{
int i, j;
unsigned int e1,e2;
unsigned int *ai,*af;
int q1,q2;
ai=(unsigned int *) &m->m[0][0];
af=(unsigned int *) &m->m[2][0];
for (i=0; i<4; i++)
for (j=0; j<2; j++) {
e1 = (*ai & 0xffff0000) | ((*af >> 16) & 0xffff);
e2 = ((*(ai++) << 16) & 0xffff0000) | (*(af++) & 0xffff);
q1 = *((int *)&e1);
q2 = *((int *)&e2);
mf[i][j*2] = FIX32TOF(q1);
mf[i][j*2+1] = FIX32TOF(q2);
}
}
void guMtxIdentF(float mf[4][4])
{
int i, j;
for (i=0; i<4; i++)
for (j=0; j<4; j++)
if (i == j) mf[i][j] = 1.0;
else mf[i][j] = 0.0;
}
void guMtxIdent(Mtx *m)
{
float mf[4][4];
guMtxIdentF(mf);
guMtxF2L(mf, m);
}