/** * Matrix scalar mult */ void operator *= ( fix32 s ) { for ( int i = 0; i < 4; i++ ) { m_matrix[i][0] = FIXMULT( m_matrix[i][0], s ); m_matrix[i][1] = FIXMULT( m_matrix[i][1], s ); m_matrix[i][2] = FIXMULT( m_matrix[i][2], s ); m_matrix[i][3] = FIXMULT( m_matrix[i][0], s ); } }
/** * Matrix scalar multiplication */ Matrix4fi operator * ( fix32 s ) const { Matrix4fi r( false ); for ( int i = 0; i < 4; i++ ) { r.m_matrix[i][0] = FIXMULT( m_matrix[i][0], s ); r.m_matrix[i][1] = FIXMULT( m_matrix[i][1], s ); r.m_matrix[i][2] = FIXMULT( m_matrix[i][2], s ); r.m_matrix[i][3] = FIXMULT( m_matrix[i][0], s ); } return r; }
/** * Transform a vector and projects it to screen space * * @param sx The projected screen x coordinate * @param sy The projected screen y coordinate * @param v Fixed point vector to transform and project */ void project( sint32 &sx, sint32 &sy, const Vector3fi &v ) const { Vector3fi vt = m_transform*v; if(vt.m_z == 0) vt.m_z = 1; sx = m_swdth + (m_dist*vt.m_x)/vt.m_z; sy = m_shght - m_dist*FIXMULT(m_aspect, vt.m_y)/vt.m_z; }
/** * Matrix-vector multiply * */ Vector3fi operator * ( const Vector3fi &v ) const { fix32 x, y, z; x = FIXMULT( m_matrix[0][0], v.m_x ) + FIXMULT( m_matrix[0][1], v.m_y ) + FIXMULT( m_matrix[0][2], v.m_z ) + m_matrix[0][3]; y = FIXMULT( m_matrix[1][0], v.m_x ) + FIXMULT( m_matrix[1][1], v.m_y ) + FIXMULT( m_matrix[1][2], v.m_z ) + m_matrix[1][3]; z = FIXMULT( m_matrix[2][0], v.m_x ) + FIXMULT( m_matrix[2][1], v.m_y ) + FIXMULT( m_matrix[2][2], v.m_z ) + m_matrix[2][3]; return Vector3fi( x, y, z ); }
/** * Per element multiplication * */ fix32 dot ( const Vector3fi &v ) const { return FIXMULT(m_x, v.m_x)+ FIXMULT(m_y, v.m_y)+ FIXMULT(m_z, v.m_z); }
/** * Multiply with scalar * */ Vector3fi operator * ( fix32 s ) const { return Vector3fi( FIXMULT( m_x, s ), FIXMULT( m_y, s ), FIXMULT( m_z, s ) ); }
/** * Per element multiplication * */ Vector3fi operator * ( const Vector3fi &v ) const { return Vector3fi( FIXMULT(m_x, v.m_x), FIXMULT(m_y, v.m_y), FIXMULT(m_z, v.m_z) ); }
/** * Matrix multiply */ Matrix4fi operator * ( const Matrix4fi &m ) const { Matrix4fi r( false ); for ( int i = 0; i < 4; i++ ) { r.m_matrix[i][0] = FIXMULT( m_matrix[i][0], m.m_matrix[0][0] ) + FIXMULT( m_matrix[i][1], m.m_matrix[1][0] ) + FIXMULT( m_matrix[i][2], m.m_matrix[2][0] ) + FIXMULT( m_matrix[i][3], m.m_matrix[3][0] ); r.m_matrix[i][1] = FIXMULT( m_matrix[i][0], m.m_matrix[0][1] ) + FIXMULT( m_matrix[i][1], m.m_matrix[1][1] ) + FIXMULT( m_matrix[i][2], m.m_matrix[2][1] ) + FIXMULT( m_matrix[i][3], m.m_matrix[3][1] ); r.m_matrix[i][2] = FIXMULT( m_matrix[i][0], m.m_matrix[0][2] ) + FIXMULT( m_matrix[i][1], m.m_matrix[1][2] ) + FIXMULT( m_matrix[i][2], m.m_matrix[2][2] ) + FIXMULT( m_matrix[i][3], m.m_matrix[3][2] ); r.m_matrix[i][3] = FIXMULT( m_matrix[i][0], m.m_matrix[0][3] ) + FIXMULT( m_matrix[i][1], m.m_matrix[1][3] ) + FIXMULT( m_matrix[i][2], m.m_matrix[2][3] ) + FIXMULT( m_matrix[i][3], m.m_matrix[3][3] ); } return r; }