#ifndef _MATRIX4_H #define _MATRIX4_H #include #include // https://github.com/jpd002/Play--Framework/tree/master/include/math struct matrix4 { // 4x4 float grid[16]; matrix4() { memset( &grid[0], 0, sizeof( grid ) ); } float operator()( int row, int col ) const { return grid[(row * 4) + col]; } float& operator()( int row, int col ) { return grid[(row * 4) + col]; } static matrix4 rotateX( float angle ) { matrix4 ret = matrix4(); ret(0, 0) = 1.000000000f; ret(1, 1) = cos(angle); ret(1, 2) = -sin(angle); ret(2, 1) = sin(angle); ret(2, 2) = cos(angle); ret(3, 3) = 1.000000000f; return ret; } static matrix4 rotateY( float angle ) { matrix4 ret = matrix4(); ret(0, 0) = cos(angle); ret(0, 2) = sin(angle); ret(1, 1) = 1.000000000f; ret(2, 0) = -sin(angle); ret(2, 2) = cos(angle); ret(3, 3) = 1.000000000f; return ret; } static matrix4 rotateZ( float angle ) { matrix4 ret = matrix4(); ret(0, 0) = cos(angle); ret(0, 1) = -sin(angle); ret(1, 0) = sin(angle); ret(1, 1) = cos(angle); ret(2, 2) = 1.000000000f; ret(3, 3) = 1.000000000f; return ret; } static matrix4 scale( float x, float y, float z ) { matrix4 ret = matrix4(); ret(0, 0) = x; ret(1, 1) = y; ret(2, 2) = z; ret(3, 3) = 1; return ret; } static matrix4 translate( float x, float y, float z ) { matrix4 ret = matrix4(); ret(0, 0) = 1; ret(1, 1) = 1; ret(2, 2) = 1; ret(3, 3) = 1; ret(3, 0) = x; ret(3, 1) = y; ret(3, 2) = z; return ret; } matrix4 operator *( const matrix4& rhs ) const { matrix4 ret; for( unsigned int i = 0; i < 4; i++ ) { ret( i, 0 ) = (*this)(i, 0) * rhs( 0, 0 ) + (*this)(i, 1) * rhs( 1, 0 ) + (*this)(i, 2) * rhs( 2, 0 ) + (*this)(i, 3) * rhs( 3, 0 ); ret( i, 1 ) = (*this)(i, 0) * rhs( 0, 1 ) + (*this)(i, 1) * rhs( 1, 1 ) + (*this)(i, 2) * rhs( 2, 1 ) + (*this)(i, 3) * rhs( 3, 1 ); ret( i, 2 ) = (*this)(i, 0) * rhs( 0, 2 ) + (*this)(i, 1) * rhs( 1, 2 ) + (*this)(i, 2) * rhs( 2, 2 ) + (*this)(i, 3) * rhs( 3, 2 ); ret( i, 3 ) = (*this)(i, 0) * rhs( 0, 3 ) + (*this)(i, 1) * rhs( 1, 3 ) + (*this)(i, 2) * rhs( 2, 3 ) + (*this)(i, 3) * rhs( 3, 3 ); } return ret; } }; #endif