/// @ref core /// @file glm/detail/type_gentype.inl namespace glm{ namespace detail{ ///////////////////////////////// // Static functions template typename base::size_type base::col_size() { return cT; } template typename base::size_type base::row_size() { return rT; } template typename base::size_type base::value_size() { return rT * cT; } template bool base::is_scalar() { return rT == 1 && cT == 1; } template bool base::is_vector() { return rT == 1; } template bool base::is_matrix() { return rT != 1; } ///////////////////////////////// // Constructor template base::base() { memset(&this->value, 0, cT * rT * sizeof(vT)); } template base::base ( typename base::class_type const & m ) { for ( typename genType::size_type i = typename base::size_type(0); i < base::col_size(); ++i ) { this->value[i] = m[i]; } } template base::base ( typename base::T const & x ) { if(rT == 1) // vector { for ( typename base::size_type i = typename base::size_type(0); i < base::col_size(); ++i ) { this->value[i][rT] = x; } } else // matrix { memset(&this->value, 0, cT * rT * sizeof(vT)); typename base::size_type stop = cT < rT ? cT : rT; for ( typename base::size_type i = typename base::size_type(0); i < stop; ++i ) { this->value[i][i] = x; } } } template base::base ( typename base::value_type const * const x ) { memcpy(&this->value, &x.value, cT * rT * sizeof(vT)); } template base::base ( typename base::col_type const * const x ) { for ( typename base::size_type i = typename base::size_type(0); i < base::col_size(); ++i ) { this->value[i] = x[i]; } } template template base::base ( base const & m ) { for ( typename base::size_type i = typename base::size_type(0); i < base::col_size(); ++i ) { this->value[i] = base(m[i]); } } ////////////////////////////////////// // Accesses template typename base::col_type& base::operator[] ( typename base::size_type i ) { return this->value[i]; } template typename base::col_type const & base::operator[] ( typename base::size_type i ) const { return this->value[i]; } ////////////////////////////////////// // Unary updatable operators template typename base::class_type& base::operator= ( typename base::class_type const & x ) { memcpy(&this->value, &x.value, cT * rT * sizeof(vT)); return *this; } template typename base::class_type& base::operator+= ( typename base::T const & x ) { typename base::size_type stop_col = x.col_size(); typename base::size_type stop_row = x.row_size(); for(typename base::size_type j = 0; j < stop_col; ++j) for(typename base::size_type i = 0; i < stop_row; ++i) this->value[j][i] += x; return *this; } template typename base::class_type& base::operator+= ( typename base::class_type const & x ) { typename base::size_type stop_col = x.col_size(); typename base::size_type stop_row = x.row_size(); for(typename base::size_type j = 0; j < stop_col; ++j) for(typename base::size_type i = 0; i < stop_row; ++i) this->value[j][i] += x[j][i]; return *this; } template typename base::class_type& base::operator-= ( typename base::T const & x ) { typename base::size_type stop_col = x.col_size(); typename base::size_type stop_row = x.row_size(); for(typename base::size_type j = 0; j < stop_col; ++j) for(typename base::size_type i = 0; i < stop_row; ++i) this->value[j][i] -= x; return *this; } template typename base::class_type& base::operator-= ( typename base::class_type const & x ) { typename base::size_type stop_col = x.col_size(); typename base::size_type stop_row = x.row_size(); for(typename base::size_type j = 0; j < stop_col; ++j) for(typename base::size_type i = 0; i < stop_row; ++i) this->value[j][i] -= x[j][i]; return *this; } template typename base::class_type& base::operator*= ( typename base::T const & x ) { typename base::size_type stop_col = x.col_size(); typename base::size_type stop_row = x.row_size(); for(typename base::size_type j = 0; j < stop_col; ++j) for(typename base::size_type i = 0; i < stop_row; ++i) this->value[j][i] *= x; return *this; } template typename base::class_type& base::operator*= ( typename base::class_type const & x ) { typename base::size_type stop_col = x.col_size(); typename base::size_type stop_row = x.row_size(); for(typename base::size_type j = 0; j < stop_col; ++j) for(typename base::size_type i = 0; i < stop_row; ++i) this->value[j][i] *= x[j][i]; return *this; } template typename base::class_type& base::operator/= ( typename base::T const & x ) { typename base::size_type stop_col = x.col_size(); typename base::size_type stop_row = x.row_size(); for(typename base::size_type j = 0; j < stop_col; ++j) for(typename base::size_type i = 0; i < stop_row; ++i) this->value[j][i] /= x; return *this; } template typename base::class_type& base::operator/= ( typename base::class_type const & x ) { typename base::size_type stop_col = x.col_size(); typename base::size_type stop_row = x.row_size(); for(typename base::size_type j = 0; j < stop_col; ++j) for(typename base::size_type i = 0; i < stop_row; ++i) this->value[j][i] /= x[j][i]; return *this; } template typename base::class_type& base::operator++ () { typename base::size_type stop_col = col_size(); typename base::size_type stop_row = row_size(); for(typename base::size_type j = 0; j < stop_col; ++j) for(typename base::size_type i = 0; i < stop_row; ++i) ++this->value[j][i]; return *this; } template typename base::class_type& base::operator-- () { typename base::size_type stop_col = col_size(); typename base::size_type stop_row = row_size(); for(typename base::size_type j = 0; j < stop_col; ++j) for(typename base::size_type i = 0; i < stop_row; ++i) --this->value[j][i]; return *this; } } //namespace detail } //namespace glm