Unified Matrix4 code
This commit is contained in:
parent
d64db443c2
commit
9810d57a39
@ -63,7 +63,6 @@ $cfile "../BlockEntities/MobHeadEntity.h"
|
||||
$cfile "../BlockEntities/FlowerPotEntity.h"
|
||||
$cfile "../WebAdmin.h"
|
||||
$cfile "../Root.h"
|
||||
$cfile "../Matrix4f.h"
|
||||
$cfile "../Cuboid.h"
|
||||
$cfile "../BoundingBox.h"
|
||||
$cfile "../Tracer.h"
|
||||
|
@ -62,7 +62,6 @@ if (NOT MSVC)
|
||||
Inventory.h
|
||||
Item.h
|
||||
ItemGrid.h
|
||||
Matrix4f.h
|
||||
Mobs/Monster.h
|
||||
OSSupport/File.h
|
||||
Root.h
|
||||
|
@ -4,7 +4,7 @@
|
||||
#include "../World.h"
|
||||
#include "../Server.h"
|
||||
#include "../Root.h"
|
||||
#include "../Matrix4f.h"
|
||||
#include "../Matrix4.h"
|
||||
#include "../ClientHandle.h"
|
||||
#include "../Chunk.h"
|
||||
#include "../Simulator/FluidSimulator.h"
|
||||
|
228
src/Matrix4.h
Normal file
228
src/Matrix4.h
Normal file
@ -0,0 +1,228 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
|
||||
|
||||
|
||||
#include <math.h>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
template <typename T>
|
||||
// tolua_begin
|
||||
class Matrix4
|
||||
{
|
||||
|
||||
TOLUA_TEMPLATE_BIND((T, float, double))
|
||||
|
||||
// tolua_end
|
||||
|
||||
public:
|
||||
|
||||
T cell[16];
|
||||
|
||||
enum
|
||||
{
|
||||
TX=3, TY=7, TZ=11,
|
||||
D0=0, D1=5, D2=10, D3=15,
|
||||
SX=D0, SY=D1, SZ=D2,
|
||||
W=D3
|
||||
};
|
||||
|
||||
// tolua_begin
|
||||
|
||||
inline Matrix4(void)
|
||||
{
|
||||
Identity();
|
||||
}
|
||||
|
||||
inline Matrix4(const Matrix4 & a_Rhs)
|
||||
{
|
||||
*this = a_Rhs;
|
||||
}
|
||||
|
||||
inline Matrix4 & operator = (const Matrix4 & a_Rhs)
|
||||
{
|
||||
for (unsigned int i = 0; i < 16; ++i)
|
||||
{
|
||||
cell[i] = a_Rhs.cell[i];
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
inline T & operator [] (int a_N)
|
||||
{
|
||||
ASSERT(a_N < 16);
|
||||
return cell[a_N];
|
||||
}
|
||||
|
||||
inline void Identity()
|
||||
{
|
||||
cell[1] = cell[2] = cell[TX] = cell[4] = cell[6] = cell[TY] =
|
||||
cell[8] = cell[9] = cell[TZ] = cell[12] = cell[13] = cell[14] = 0;
|
||||
cell[D0] = cell[D1] = cell[D2] = cell[W] = 1;
|
||||
}
|
||||
|
||||
inline void Init(const Vector3<T> & a_Pos, T a_RX, T a_RY, T a_RZ)
|
||||
{
|
||||
Matrix4<T> t;
|
||||
t.RotateX(a_RZ);
|
||||
RotateY(a_RY);
|
||||
Concatenate(t);
|
||||
t.RotateZ(a_RX);
|
||||
Concatenate(t);
|
||||
Translate(a_Pos);
|
||||
}
|
||||
|
||||
inline void RotateX(T a_RX)
|
||||
{
|
||||
T sx = (T) sin(a_RX * M_PI / 180);
|
||||
T cx = (T) cos(a_RX * M_PI / 180);
|
||||
|
||||
Identity();
|
||||
|
||||
cell[5] = cx, cell[6] = sx, cell[9] = -sx, cell[10] = cx;
|
||||
}
|
||||
|
||||
inline void RotateY(T a_RY)
|
||||
{
|
||||
T sy = (T) sin(a_RY * M_PI / 180);
|
||||
T cy = (T) cos(a_RY * M_PI / 180);
|
||||
|
||||
Identity();
|
||||
|
||||
cell[0] = cy, cell[2] = -sy, cell[8] = sy, cell[10] = cy;
|
||||
}
|
||||
|
||||
inline void RotateZ(T a_RZ)
|
||||
{
|
||||
T sz = (T) sin(a_RZ * M_PI / 180);
|
||||
T cz = (T) cos(a_RZ * M_PI / 180);
|
||||
|
||||
Identity();
|
||||
|
||||
cell[0] = cz; cell[1] = sz;
|
||||
cell[4] = -sz; cell[5] = cz;
|
||||
}
|
||||
|
||||
inline void Translate(const Vector3<T> & a_Pos)
|
||||
{
|
||||
cell[TX] += a_Pos.x;
|
||||
cell[TY] += a_Pos.y;
|
||||
cell[TZ] += a_Pos.z;
|
||||
}
|
||||
|
||||
inline void SetTranslation(const Vector3<T> & a_Pos)
|
||||
{
|
||||
cell[TX] = a_Pos.x;
|
||||
cell[TY] = a_Pos.y;
|
||||
cell[TZ] = a_Pos.z;
|
||||
}
|
||||
|
||||
inline void Concatenate(const Matrix4 & m2)
|
||||
{
|
||||
Matrix4 res;
|
||||
|
||||
for (unsigned int c = 0; c < 4; ++c)
|
||||
{
|
||||
for (unsigned int r = 0; r < 4; ++r)
|
||||
{
|
||||
res.cell[r * 4 + c] = (
|
||||
cell[r * 4] * m2.cell[c] +
|
||||
cell[r * 4 + 1] * m2.cell[c + 4] +
|
||||
cell[r * 4 + 2] * m2.cell[c + 8] +
|
||||
cell[r * 4 + 3] * m2.cell[c + 12]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
*this = res;
|
||||
}
|
||||
|
||||
inline Vector3<T> Transform(const Vector3<T> & v) const
|
||||
{
|
||||
T x = cell[0] * v.x + cell[1] * v.y + cell[2] * v.z + cell[3];
|
||||
T y = cell[4] * v.x + cell[5] * v.y + cell[6] * v.z + cell[7];
|
||||
T z = cell[8] * v.x + cell[9] * v.y + cell[10] * v.z + cell[11];
|
||||
|
||||
return Vector3<T>(x, y, z);
|
||||
}
|
||||
|
||||
inline void Invert(void)
|
||||
{
|
||||
Matrix4 t;
|
||||
|
||||
T tx = -cell[3];
|
||||
T ty = -cell[7];
|
||||
T tz = -cell[11];
|
||||
|
||||
for (unsigned int h = 0; h < 3; ++h)
|
||||
{
|
||||
for (unsigned int v = 0; v < 3; ++v)
|
||||
{
|
||||
t.cell[h + v * 4] = cell[v + h * 4];
|
||||
}
|
||||
}
|
||||
|
||||
for (unsigned int i = 0; i < 11; ++i)
|
||||
{
|
||||
cell[i] = t.cell[i];
|
||||
}
|
||||
|
||||
cell[3] = tx * cell[0] + ty * cell[1] + tz * cell[2];
|
||||
cell[7] = tx * cell[4] + ty * cell[5] + tz * cell[6];
|
||||
cell[11] = tx * cell[8] + ty * cell[9] + tz * cell[10];
|
||||
}
|
||||
|
||||
inline Vector3<T> GetXColumn(void) const
|
||||
{
|
||||
return Vector3<T>(cell[0], cell[1], cell[2]);
|
||||
}
|
||||
|
||||
inline Vector3<T> GetYColumn(void) const
|
||||
{
|
||||
return Vector3<T>(cell[4], cell[5], cell[6]);
|
||||
}
|
||||
|
||||
inline Vector3<T> GetZColumn(void) const
|
||||
{
|
||||
return Vector3<T>(cell[8], cell[9], cell[10]);
|
||||
}
|
||||
|
||||
inline void SetXColumn(const Vector3<T> & a_X)
|
||||
{
|
||||
cell[0] = a_X.x;
|
||||
cell[1] = a_X.y;
|
||||
cell[2] = a_X.z;
|
||||
}
|
||||
|
||||
inline void SetYColumn(const Vector3<T> & a_Y)
|
||||
{
|
||||
cell[4] = a_Y.x;
|
||||
cell[5] = a_Y.y;
|
||||
cell[6] = a_Y.z;
|
||||
}
|
||||
|
||||
inline void SetZColumn(const Vector3<T> & a_Z)
|
||||
{
|
||||
cell[8] = a_Z.x;
|
||||
cell[9] = a_Z.y;
|
||||
cell[10] = a_Z.z;
|
||||
}
|
||||
};
|
||||
// tolua_end
|
||||
|
||||
|
||||
|
||||
|
||||
// tolua_begin
|
||||
typedef Matrix4<double> Matrix4d;
|
||||
typedef Matrix4<float> Matrix4f;
|
||||
// tolua_end
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,4 +0,0 @@
|
||||
|
||||
#include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules
|
||||
|
||||
// _X: empty file??
|
225
src/Matrix4f.h
225
src/Matrix4f.h
@ -1,225 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#define _USE_MATH_DEFINES
|
||||
#include <math.h>
|
||||
#include "Vector3.h"
|
||||
|
||||
class Matrix4f
|
||||
{
|
||||
public:
|
||||
enum
|
||||
{
|
||||
TX=3,
|
||||
TY=7,
|
||||
TZ=11,
|
||||
D0=0, D1=5, D2=10, D3=15,
|
||||
SX=D0, SY=D1, SZ=D2,
|
||||
W=D3
|
||||
};
|
||||
Matrix4f() { Identity(); }
|
||||
float& operator [] ( int a_N ) { return cell[a_N]; }
|
||||
void Identity()
|
||||
{
|
||||
cell[1] = cell[2] = cell[TX] = cell[4] = cell[6] = cell[TY] =
|
||||
cell[8] = cell[9] = cell[TZ] = cell[12] = cell[13] = cell[14] = 0;
|
||||
cell[D0] = cell[D1] = cell[D2] = cell[W] = 1;
|
||||
}
|
||||
void Init( Vector3f a_Pos, float a_RX, float a_RY, float a_RZ )
|
||||
{
|
||||
Matrix4f t;
|
||||
t.RotateX( a_RZ );
|
||||
RotateY( a_RY );
|
||||
Concatenate( t );
|
||||
t.RotateZ( a_RX );
|
||||
Concatenate( t );
|
||||
Translate( a_Pos );
|
||||
}
|
||||
void RotateX( float a_RX )
|
||||
{
|
||||
float sx = (float)sin( a_RX * M_PI / 180 );
|
||||
float cx = (float)cos( a_RX * M_PI / 180 );
|
||||
Identity();
|
||||
cell[5] = cx, cell[6] = sx, cell[9] = -sx, cell[10] = cx;
|
||||
}
|
||||
void RotateY( float a_RY )
|
||||
{
|
||||
float sy = (float)sin( a_RY * M_PI / 180 );
|
||||
float cy = (float)cos( a_RY * M_PI / 180 );
|
||||
Identity ();
|
||||
cell[0] = cy, cell[2] = -sy, cell[8] = sy, cell[10] = cy;
|
||||
}
|
||||
void RotateZ( float a_RZ )
|
||||
{
|
||||
float sz = (float)sin( a_RZ * M_PI / 180 );
|
||||
float cz = (float)cos( a_RZ * M_PI / 180 );
|
||||
Identity ();
|
||||
cell[0] = cz, cell[1] = sz, cell[4] = -sz, cell[5] = cz;
|
||||
}
|
||||
void Translate( Vector3f a_Pos ) { cell[TX] += a_Pos.x; cell[TY] += a_Pos.y; cell[TZ] += a_Pos.z; }
|
||||
void SetTranslation( Vector3f a_Pos ) { cell[TX] = a_Pos.x; cell[TY] = a_Pos.y; cell[TZ] = a_Pos.z; }
|
||||
void Concatenate( const Matrix4f& m2 )
|
||||
{
|
||||
Matrix4f res;
|
||||
int c;
|
||||
for ( c = 0; c < 4; c++ ) for ( int r = 0; r < 4; r++ )
|
||||
res.cell[r * 4 + c] = cell[r * 4] * m2.cell[c] +
|
||||
cell[r * 4 + 1] * m2.cell[c + 4] +
|
||||
cell[r * 4 + 2] * m2.cell[c + 8] +
|
||||
cell[r * 4 + 3] * m2.cell[c + 12];
|
||||
for ( c = 0; c < 16; c++ ) cell[c] = res.cell[c];
|
||||
}
|
||||
Vector3f Transform( const Vector3f& v ) const
|
||||
{
|
||||
float x = cell[0] * v.x + cell[1] * v.y + cell[2] * v.z + cell[3];
|
||||
float y = cell[4] * v.x + cell[5] * v.y + cell[6] * v.z + cell[7];
|
||||
float z = cell[8] * v.x + cell[9] * v.y + cell[10] * v.z + cell[11];
|
||||
return Vector3f( x, y, z );
|
||||
}
|
||||
void Invert()
|
||||
{
|
||||
Matrix4f t;
|
||||
int h, i;
|
||||
float tx = -cell[3], ty = -cell[7], tz = -cell[11];
|
||||
for ( h = 0; h < 3; h++ ) for ( int v = 0; v < 3; v++ ) t.cell[h + v * 4] = cell[v + h * 4];
|
||||
for ( i = 0; i < 11; i++ ) cell[i] = t.cell[i];
|
||||
cell[3] = tx * cell[0] + ty * cell[1] + tz * cell[2];
|
||||
cell[7] = tx * cell[4] + ty * cell[5] + tz * cell[6];
|
||||
cell[11] = tx * cell[8] + ty * cell[9] + tz * cell[10];
|
||||
}
|
||||
Vector3f GetXColumn() { return Vector3f( cell[0], cell[1], cell[2] ); }
|
||||
Vector3f GetYColumn() { return Vector3f( cell[4], cell[5], cell[6] ); }
|
||||
Vector3f GetZColumn() { return Vector3f( cell[8], cell[9], cell[10] ); }
|
||||
void SetXColumn( const Vector3f & a_X )
|
||||
{
|
||||
cell[0] = a_X.x;
|
||||
cell[1] = a_X.y;
|
||||
cell[2] = a_X.z;
|
||||
}
|
||||
void SetYColumn( const Vector3f & a_Y )
|
||||
{
|
||||
cell[4] = a_Y.x;
|
||||
cell[5] = a_Y.y;
|
||||
cell[6] = a_Y.z;
|
||||
}
|
||||
void SetZColumn( const Vector3f & a_Z )
|
||||
{
|
||||
cell[8] = a_Z.x;
|
||||
cell[9] = a_Z.y;
|
||||
cell[10] = a_Z.z;
|
||||
}
|
||||
float cell[16];
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
class Matrix4d
|
||||
{
|
||||
public:
|
||||
enum
|
||||
{
|
||||
TX=3,
|
||||
TY=7,
|
||||
TZ=11,
|
||||
D0=0, D1=5, D2=10, D3=15,
|
||||
SX=D0, SY=D1, SZ=D2,
|
||||
W=D3
|
||||
};
|
||||
Matrix4d() { Identity(); }
|
||||
double& operator [] ( int a_N ) { return cell[a_N]; }
|
||||
void Identity()
|
||||
{
|
||||
cell[1] = cell[2] = cell[TX] = cell[4] = cell[6] = cell[TY] =
|
||||
cell[8] = cell[9] = cell[TZ] = cell[12] = cell[13] = cell[14] = 0;
|
||||
cell[D0] = cell[D1] = cell[D2] = cell[W] = 1;
|
||||
}
|
||||
void Init( Vector3f a_Pos, double a_RX, double a_RY, double a_RZ )
|
||||
{
|
||||
Matrix4d t;
|
||||
t.RotateX( a_RZ );
|
||||
RotateY( a_RY );
|
||||
Concatenate( t );
|
||||
t.RotateZ( a_RX );
|
||||
Concatenate( t );
|
||||
Translate( a_Pos );
|
||||
}
|
||||
void RotateX( double a_RX )
|
||||
{
|
||||
double sx = (double)sin( a_RX * M_PI / 180 );
|
||||
double cx = (double)cos( a_RX * M_PI / 180 );
|
||||
Identity();
|
||||
cell[5] = cx, cell[6] = sx, cell[9] = -sx, cell[10] = cx;
|
||||
}
|
||||
void RotateY( double a_RY )
|
||||
{
|
||||
double sy = (double)sin( a_RY * M_PI / 180 );
|
||||
double cy = (double)cos( a_RY * M_PI / 180 );
|
||||
Identity ();
|
||||
cell[0] = cy, cell[2] = -sy, cell[8] = sy, cell[10] = cy;
|
||||
}
|
||||
void RotateZ( double a_RZ )
|
||||
{
|
||||
double sz = (double)sin( a_RZ * M_PI / 180 );
|
||||
double cz = (double)cos( a_RZ * M_PI / 180 );
|
||||
Identity ();
|
||||
cell[0] = cz, cell[1] = sz, cell[4] = -sz, cell[5] = cz;
|
||||
}
|
||||
void Translate( Vector3d a_Pos ) { cell[TX] += a_Pos.x; cell[TY] += a_Pos.y; cell[TZ] += a_Pos.z; }
|
||||
void SetTranslation( Vector3d a_Pos ) { cell[TX] = a_Pos.x; cell[TY] = a_Pos.y; cell[TZ] = a_Pos.z; }
|
||||
void Concatenate( const Matrix4d & m2 )
|
||||
{
|
||||
Matrix4d res;
|
||||
int c;
|
||||
for ( c = 0; c < 4; c++ ) for ( int r = 0; r < 4; r++ )
|
||||
res.cell[r * 4 + c] = cell[r * 4] * m2.cell[c] +
|
||||
cell[r * 4 + 1] * m2.cell[c + 4] +
|
||||
cell[r * 4 + 2] * m2.cell[c + 8] +
|
||||
cell[r * 4 + 3] * m2.cell[c + 12];
|
||||
for ( c = 0; c < 16; c++ ) cell[c] = res.cell[c];
|
||||
}
|
||||
Vector3d Transform( const Vector3d & v ) const
|
||||
{
|
||||
double x = cell[0] * v.x + cell[1] * v.y + cell[2] * v.z + cell[3];
|
||||
double y = cell[4] * v.x + cell[5] * v.y + cell[6] * v.z + cell[7];
|
||||
double z = cell[8] * v.x + cell[9] * v.y + cell[10] * v.z + cell[11];
|
||||
return Vector3d( x, y, z );
|
||||
}
|
||||
void Invert()
|
||||
{
|
||||
Matrix4d t;
|
||||
int h, i;
|
||||
double tx = -cell[3], ty = -cell[7], tz = -cell[11];
|
||||
for ( h = 0; h < 3; h++ ) for ( int v = 0; v < 3; v++ ) t.cell[h + v * 4] = cell[v + h * 4];
|
||||
for ( i = 0; i < 11; i++ ) cell[i] = t.cell[i];
|
||||
cell[3] = tx * cell[0] + ty * cell[1] + tz * cell[2];
|
||||
cell[7] = tx * cell[4] + ty * cell[5] + tz * cell[6];
|
||||
cell[11] = tx * cell[8] + ty * cell[9] + tz * cell[10];
|
||||
}
|
||||
Vector3d GetXColumn() { return Vector3d( cell[0], cell[1], cell[2] ); }
|
||||
Vector3d GetYColumn() { return Vector3d( cell[4], cell[5], cell[6] ); }
|
||||
Vector3d GetZColumn() { return Vector3d( cell[8], cell[9], cell[10] ); }
|
||||
void SetXColumn( const Vector3d & a_X )
|
||||
{
|
||||
cell[0] = a_X.x;
|
||||
cell[1] = a_X.y;
|
||||
cell[2] = a_X.z;
|
||||
}
|
||||
void SetYColumn( const Vector3d & a_Y )
|
||||
{
|
||||
cell[4] = a_Y.x;
|
||||
cell[5] = a_Y.y;
|
||||
cell[6] = a_Y.z;
|
||||
}
|
||||
void SetZColumn( const Vector3d & a_Z )
|
||||
{
|
||||
cell[8] = a_Z.x;
|
||||
cell[9] = a_Z.y;
|
||||
cell[10] = a_Z.z;
|
||||
}
|
||||
double cell[16];
|
||||
} ;
|
||||
|
||||
|
||||
|
||||
|
@ -22,7 +22,7 @@ public:
|
||||
T x, y, z;
|
||||
|
||||
|
||||
inline Vector3() : x(0), y(0), z(0) {}
|
||||
inline Vector3(void) : x(0), y(0), z(0) {}
|
||||
inline Vector3(T a_x, T a_y, T a_z) : x(a_x), y(a_y), z(a_z) {}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user