/////////////////////////////////////////////////////////////////////////////////// /// OpenGL Mathematics (glm.g-truc.net) /// /// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) /// Permission is hereby granted, free of charge, to any person obtaining a copy /// of this software and associated documentation files (the "Software"), to deal /// in the Software without restriction, including without limitation the rights /// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell /// copies of the Software, and to permit persons to whom the Software is /// furnished to do so, subject to the following conditions: /// /// The above copyright notice and this permission notice shall be included in /// all copies or substantial portions of the Software. /// /// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR /// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, /// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE /// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER /// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, /// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN /// THE SOFTWARE. /// /// @ref core /// @file glm/core/type_gentype.inl /// @date 2008-10-05 / 2011-06-15 /// @author Christophe Riccio /////////////////////////////////////////////////////////////////////////////////// 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::value_type 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::value_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; 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::value_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; 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::value_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; 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::value_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; 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