summaryrefslogtreecommitdiffstats
path: root/source/Matrix4f.h
diff options
context:
space:
mode:
authormadmaxoft@gmail.com <madmaxoft@gmail.com@0a769ca7-a7f5-676a-18bf-c427514a06d6>2013-03-09 15:35:43 +0100
committermadmaxoft@gmail.com <madmaxoft@gmail.com@0a769ca7-a7f5-676a-18bf-c427514a06d6>2013-03-09 15:35:43 +0100
commit75937077136b9ec2eaba49c74543bdee323f68ff (patch)
treeee8b20b2b3866118dd1187cafa730a9c4e90b82a /source/Matrix4f.h
parentCore: added PortsIPv6 setting to webadmin (contributed by STR_Warrior) (diff)
downloadcuberite-75937077136b9ec2eaba49c74543bdee323f68ff.tar
cuberite-75937077136b9ec2eaba49c74543bdee323f68ff.tar.gz
cuberite-75937077136b9ec2eaba49c74543bdee323f68ff.tar.bz2
cuberite-75937077136b9ec2eaba49c74543bdee323f68ff.tar.lz
cuberite-75937077136b9ec2eaba49c74543bdee323f68ff.tar.xz
cuberite-75937077136b9ec2eaba49c74543bdee323f68ff.tar.zst
cuberite-75937077136b9ec2eaba49c74543bdee323f68ff.zip
Diffstat (limited to 'source/Matrix4f.h')
-rw-r--r--source/Matrix4f.h114
1 files changed, 114 insertions, 0 deletions
diff --git a/source/Matrix4f.h b/source/Matrix4f.h
index ab925da03..249c92f5f 100644
--- a/source/Matrix4f.h
+++ b/source/Matrix4f.h
@@ -109,3 +109,117 @@ public:
}
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];
+} ;
+
+
+
+