1
0
mirror of https://github.com/blawar/GLideN64.git synced 2024-07-07 03:13:49 +00:00
GLideN64/3DMath.h
2015-05-13 10:11:16 +06:00

169 lines
4.3 KiB
C

#ifndef _3DMATH_H
#define _3DMATH_H
#include <memory.h>
void MultMatrix( float m0[4][4], float m1[4][4], float dest[4][4]);
void MultMatrix2(float m0[4][4], float m1[4][4] );
void TransformVectorNormalize(float vec[3], float mtx[4][4]);
inline void CopyMatrix( float m0[4][4], float m1[4][4] )
{
#ifdef WIN32
__asm {
mov esi, [m1]
mov edi, [m0]
mov eax, dword ptr [esi+00h]
mov dword ptr [edi+00h], eax
mov eax, dword ptr [esi+04h]
mov dword ptr [edi+04h], eax
mov eax, dword ptr [esi+08h]
mov dword ptr [edi+08h], eax
mov eax, dword ptr [esi+0Ch]
mov dword ptr [edi+0Ch], eax
mov eax, dword ptr [esi+10h]
mov dword ptr [edi+10h], eax
mov eax, dword ptr [esi+14h]
mov dword ptr [edi+14h], eax
mov eax, dword ptr [esi+18h]
mov dword ptr [edi+18h], eax
mov eax, dword ptr [esi+1Ch]
mov dword ptr [edi+1Ch], eax
mov eax, dword ptr [esi+20h]
mov dword ptr [edi+20h], eax
mov eax, dword ptr [esi+24h]
mov dword ptr [edi+24h], eax
mov eax, dword ptr [esi+28h]
mov dword ptr [edi+28h], eax
mov eax, dword ptr [esi+2Ch]
mov dword ptr [edi+2Ch], eax
mov eax, dword ptr [esi+30h]
mov dword ptr [edi+30h], eax
mov eax, dword ptr [esi+34h]
mov dword ptr [edi+34h], eax
mov eax, dword ptr [esi+38h]
mov dword ptr [edi+38h], eax
mov eax, dword ptr [esi+3Ch]
mov dword ptr [edi+3Ch], eax
}
#else
memcpy( m0, m1, 16 * sizeof( float ) );
#endif // WIN32
}
inline void Transpose3x3Matrix( float mtx[4][4] )
{
#ifdef WIN32
__asm
{
mov esi, [mtx]
mov eax, dword ptr [esi+04h]
mov ebx, dword ptr [esi+10h]
mov dword ptr [esi+04h], ebx
mov dword ptr [esi+10h], eax
mov eax, dword ptr [esi+08h]
mov ebx, dword ptr [esi+20h]
mov dword ptr [esi+08h], ebx
mov dword ptr [esi+20h], eax
mov eax, dword ptr [esi+18h]
mov ebx, dword ptr [esi+24h]
mov dword ptr [esi+18h], ebx
mov dword ptr [esi+24h], eax
}
#else // WIN32
float tmp;
tmp = mtx[0][1];
mtx[0][1] = mtx[1][0];
mtx[1][0] = tmp;
tmp = mtx[0][2];
mtx[0][2] = mtx[2][0];
mtx[2][0] = tmp;
tmp = mtx[1][2];
mtx[1][2] = mtx[2][1];
mtx[2][1] = tmp;
#endif // WIN32
}
inline void Normalize(float v[3])
{
#ifdef WIN32
__asm {
mov esi, dword ptr [v]
// ST(6) ST(5) ST(4) ST(3) ST(2) ST(1) ST
fld dword ptr [esi+08h] // v2
fld dword ptr [esi+04h] // v2 v1
fld dword ptr [esi] // v2 v1 v0
fld1 // v2 v1 v0 1.0
fld ST(3) // v2 v1 v0 1.0 v2
fmul ST, ST // v2 v1 v0 1.0 v2*v2
fld ST(3) // v2 v1 v0 1.0 v2*v2 v1
fmul ST, ST // v2 v1 v0 1.0 v2*v2 v1*v1
fld ST(3) // v2 v1 v0 1.0 v2*v2 v1*v1 v0
fmul ST, ST // v2 v1 v0 1.0 v2*v2 v1*v1 v0*v0
fadd // v2 v1 v0 1.0 v2*v2 v1*v1+v0*v0
fadd // v2 v1 v0 1.0 v2*v2+v1*v1+v0*v0
ftst // Compare ST to 0
fstsw ax // Store FPU status word in ax
sahf // Transfer ax to flags register
jz End // Skip if length is zero
fsqrt // v2 v1 v0 1.0 len
fdiv // v2 v1 v0 1.0/len
fmul ST(3), ST // v2*(1.0/len) v1 v0 1.0/len
fmul ST(2), ST // v2*(1.0/len) v1*(1.0/len) v0 1.0/len
fmul // v2*(1.0/len) v1*(1.0/len) v0*(1.0/len)
fstp dword ptr [esi] // v2*(1.0/len) v1*(1.0/len)
fstp dword ptr [esi+04h] // v2*(1.0/len)
fstp dword ptr [esi+08h] //
End:
finit
}
#else // WIN32
float len;
len = (float)(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]);
if (len != 0.0) {
len = (float)sqrt( len );
v[0] /= (float)len;
v[1] /= (float)len;
v[2] /= (float)len;
}
#endif // WIN32
}
inline float DotProduct(float v0[3], float v1[3])
{
float dot;
#ifdef WIN32
__asm {
mov esi, dword ptr [v0]
mov edi, dword ptr [v1]
lea ebx, [dot]
fld dword ptr [esi]
fmul dword ptr [edi]
fld dword ptr [esi+04h]
fmul dword ptr [edi+04h]
fld dword ptr [esi+08h]
fmul dword ptr [edi+08h]
fadd
fadd
fstp dword ptr [ebx]
}
#else // WIN32
dot = v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2];
#endif // WIN32
return dot;
}
#endif