Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members | Related Pages

ShMatrixImpl.hpp

00001 // Sh: A GPU metaprogramming language. 00002 // 00003 // Copyright (c) 2003 University of Waterloo Computer Graphics Laboratory 00004 // Project administrator: Michael D. McCool 00005 // Authors: Zheng Qin, Stefanus Du Toit, Kevin Moule, Tiberiu S. Popa, 00006 // Michael D. McCool 00007 // 00008 // This software is provided 'as-is', without any express or implied 00009 // warranty. In no event will the authors be held liable for any damages 00010 // arising from the use of this software. 00011 // 00012 // Permission is granted to anyone to use this software for any purpose, 00013 // including commercial applications, and to alter it and redistribute it 00014 // freely, subject to the following restrictions: 00015 // 00016 // 1. The origin of this software must not be misrepresented; you must 00017 // not claim that you wrote the original software. If you use this 00018 // software in a product, an acknowledgment in the product documentation 00019 // would be appreciated but is not required. 00020 // 00021 // 2. Altered source versions must be plainly marked as such, and must 00022 // not be misrepresented as being the original software. 00023 // 00024 // 3. This notice may not be removed or altered from any source 00025 // distribution. 00027 #ifndef SHMATRIXIMPL_HPP 00028 #define SHMATRIXIMPL_HPP 00029 00030 #include <iostream> 00031 #include <algorithm> 00032 #include <string> 00033 #include <sstream> 00034 #include "ShMatrix.hpp" 00035 #include "ShUtility.hpp" 00036 00037 namespace SH { 00038 00039 //Constructors, destructors 00040 template<int Rows, int Cols, ShBindingType Binding, typename T> 00041 ShMatrix<Rows, Cols, Binding, T>::ShMatrix() 00042 { 00043 for (int i = 0; i < std::min(Rows, Cols); i++) 00044 m_data[i][i] = 1.0; 00045 } 00046 00047 template<int Rows, int Cols, ShBindingType Binding, typename T> 00048 ShMatrix<Rows, Cols, Binding, T>::ShMatrix(const ShMatrix<Rows, Cols, Binding, T>& other) 00049 { 00050 for (int i = 0; i < Rows; i++) 00051 m_data[i] = other[i]; 00052 } 00053 00054 template<int Rows, int Cols, ShBindingType Binding, typename T> 00055 template<ShBindingType Binding2> 00056 ShMatrix<Rows, Cols, Binding, T>::ShMatrix(const ShMatrix<Rows, Cols, Binding2, T>& other) 00057 { 00058 for (int i = 0; i < Rows; i++) 00059 m_data[i] = other[i]; 00060 } 00061 00062 template<int Rows, int Cols, ShBindingType Binding, typename T> 00063 ShMatrix<Rows, Cols, Binding, T>::~ShMatrix() 00064 { 00065 } 00066 00067 //Operators 00068 template<int Rows, int Cols, ShBindingType Binding, typename T> 00069 ShMatrix<Rows, Cols, Binding, T>& 00070 ShMatrix<Rows, Cols, Binding, T>::operator=(const ShMatrix<Rows, Cols, Binding, T>& other) 00071 { 00072 for (int i = 0; i < Rows; i++) 00073 m_data[i] = other[i]; 00074 return *this; 00075 } 00076 00077 template<int Rows, int Cols, ShBindingType Binding, typename T> 00078 template<ShBindingType Binding2> 00079 ShMatrix<Rows, Cols, Binding, T>& 00080 ShMatrix<Rows, Cols, Binding, T>::operator=(const ShMatrix<Rows, Cols, Binding2, T>& other) 00081 { 00082 for (int i = 0; i < Rows; i++) 00083 m_data[i] = other[i]; 00084 return *this; 00085 } 00086 00087 template<int Rows, int Cols, ShBindingType Binding, typename T> 00088 ShAttrib<Cols, Binding, T>& ShMatrix<Rows, Cols, Binding, T>::operator[](int i) 00089 { 00090 return m_data[i]; 00091 } 00092 00093 template<int Rows, int Cols, ShBindingType Binding, typename T> 00094 const ShAttrib<Cols, Binding, T>& ShMatrix<Rows, Cols, Binding, T>::operator[](int i) const 00095 { 00096 return m_data[i]; 00097 } 00098 00099 template<int Rows, int Cols, ShBindingType Binding, typename T> 00100 template<ShBindingType Binding2> 00101 ShMatrix<Rows, Cols, Binding, T>& 00102 ShMatrix<Rows, Cols, Binding, T>::operator+=(const ShMatrix<Rows, Cols, Binding2, T>& other) 00103 { 00104 for (int i = 0; i < Rows; i++) 00105 m_data[i] += other[i]; 00106 return *this; 00107 } 00108 00109 template<int Rows, int Cols, ShBindingType Binding, typename T> 00110 template<ShBindingType Binding2> 00111 ShMatrix<Rows, Cols, Binding, T>& 00112 ShMatrix<Rows, Cols, Binding, T>::operator-=(const ShMatrix<Rows, Cols, Binding2, T>& other) 00113 { 00114 for (int i = 0; i < Rows; i++) 00115 m_data[i] -= other[i]; 00116 return *this; 00117 } 00118 00119 template<int Rows, int Cols, ShBindingType Binding, typename T> 00120 template<ShBindingType Binding2> 00121 ShMatrix<Rows, Cols, Binding, T>& 00122 ShMatrix<Rows, Cols, Binding, T>::operator/=(const ShMatrix<Rows, Cols, Binding2, T>& other) 00123 { 00124 for (int i = 0; i < Rows; i++) 00125 m_data[i] /= other[i]; 00126 return *this; 00127 } 00128 00129 template<int Rows, int Cols, ShBindingType Binding, typename T> 00130 ShMatrix<Rows, Cols, Binding, T>& 00131 ShMatrix<Rows, Cols, Binding, T>::operator*=(const ShGeneric<1, T>& other) 00132 { 00133 for (int i = 0; i < Rows; i++) 00134 m_data[i] *= other; 00135 return *this; 00136 } 00137 00138 template<int Rows, int Cols, ShBindingType Binding, typename T> 00139 ShMatrix<Rows, Cols, Binding, T>& 00140 ShMatrix<Rows, Cols, Binding, T>::operator/=(const ShGeneric<1, T>& other) 00141 { 00142 for (int i = 0; i < Rows; i++) 00143 m_data[i] /= other; 00144 return *this; 00145 } 00146 00147 template<int Rows, int Cols, ShBindingType Binding, typename T> 00148 ShMatrixRows<Rows, Cols, T> 00149 ShMatrix<Rows, Cols, Binding, T>::operator()() const 00150 { 00151 return ShMatrixRows<Rows, Cols, T>(*this); 00152 } 00153 00154 template<int Rows, int Cols, ShBindingType Binding, typename T> 00155 ShMatrixRows<1, Cols, T> 00156 ShMatrix<Rows, Cols, Binding, T>::operator()(int i0) const 00157 { 00158 return ShMatrixRows<1, Cols, T>(*this, i0); 00159 } 00160 00161 template<int Rows, int Cols, ShBindingType Binding, typename T> 00162 ShMatrixRows<2, Cols, T> 00163 ShMatrix<Rows, Cols, Binding, T>::operator()(int i0, int i1) const 00164 { 00165 return ShMatrixRows<2, Cols, T>(*this, i0, i1); 00166 } 00167 00168 template<int Rows, int Cols, ShBindingType Binding, typename T> 00169 ShMatrixRows<3, Cols, T> 00170 ShMatrix<Rows, Cols, Binding, T>::operator()(int i0, int i1, int i2) const 00171 { 00172 return ShMatrixRows<3, Cols, T>(*this, i0, i1, i2); 00173 } 00174 00175 template<int Rows, int Cols, ShBindingType Binding, typename T> 00176 ShMatrixRows<4, Cols, T> 00177 ShMatrix<Rows, Cols, Binding, T>::operator()(int i0, int i1, int i2, int i3) const 00178 { 00179 return ShMatrixRows<4, Cols, T>(*this, i0, i1, i2, i3); 00180 } 00181 00182 template<int Rows, int Cols, ShBindingType Binding, typename T> 00183 std::ostream& operator<<(std::ostream& out, 00184 const ShMatrix<Rows, Cols, Binding, T>& m) 00185 { 00186 for (int k = 0; k < Rows; k++) { 00187 out << m[k]; 00188 out << std::endl; 00189 } 00190 00191 return out; 00192 } 00193 00194 00195 template<int Rows, int Cols, ShBindingType Binding, typename T> 00196 ShMatrix<Rows - 1, Cols -1, SH_TEMP, T> 00197 ShMatrix<Rows, Cols, Binding, T>::subMatrix(int rowToRemove, 00198 int columnToRemove) const 00199 { 00200 ShMatrix<Rows - 1, Cols - 1, SH_TEMP, T> myMatrix; 00201 00202 int indices[Cols - 1]; 00203 for (int i = 0; i < columnToRemove; i++) 00204 indices[i] = i; 00205 for (int i = columnToRemove + 1; i < Cols; i++) 00206 indices[i - 1] = i; 00207 00208 for (int i = 0; i < rowToRemove; i++) { 00209 myMatrix[i].clone(m_data[i].template swiz<Cols - 1>(indices)); 00210 } 00211 00212 for (int i = rowToRemove + 1; i < Rows; i++) { 00213 myMatrix[i - 1].clone(m_data[i].template swiz<Cols - 1>(indices)); 00214 } 00215 00216 return myMatrix; 00217 } 00218 00219 template<int Rows,int Cols,ShBindingType Binding, typename T> 00220 void ShMatrix<Rows, Cols, Binding, T>::setTranslation(const ShGeneric<Rows-1, T>& trans){ 00221 00222 for(int i = 0;i<(Rows-1);i++) 00223 m_data[i][(Cols-1)] = trans[i]; 00224 } 00225 00226 00227 template<int Rows,int Cols,ShBindingType Binding, typename T> 00228 void ShMatrix<Rows, Cols, Binding, T>::setScaling(const ShGeneric<Rows-1, T>& scale){ 00229 for(int i = 0;i<(Rows-1);i++) 00230 m_data[i][i] = scale[i]; 00231 } 00232 00234 // ShMatrixRows stuff // 00236 00237 00238 template<int Rows, int Cols, typename T> 00239 template<int OR, ShBindingType Binding> 00240 ShMatrixRows<Rows, Cols, T>::ShMatrixRows(const ShMatrix<OR, Cols, Binding, T>& source, 00241 int i0) 00242 { 00243 SH_STATIC_CHECK(Rows == 1, Constructing_Non_1_Row_Matrix_From_1_Row); 00244 00245 m_data[0].clone(source[i0]); 00246 } 00247 00248 template<int Rows, int Cols, typename T> 00249 template<int OR, ShBindingType Binding> 00250 ShMatrixRows<Rows, Cols, T>::ShMatrixRows(const ShMatrix<OR, Cols, Binding, T>& source, 00251 int i0, int i1) 00252 { 00253 SH_STATIC_CHECK(Rows == 2, Constructing_Non_2_Row_Matrix_From_2_Rows); 00254 00255 m_data[0].clone(source[i0]); 00256 m_data[1].clone(source[i1]); 00257 } 00258 00259 template<int Rows, int Cols, typename T> 00260 template<int OR, ShBindingType Binding> 00261 ShMatrixRows<Rows, Cols, T>::ShMatrixRows(const ShMatrix<OR, Cols, Binding, T>& source, 00262 int i0, int i1, int i2) 00263 { 00264 SH_STATIC_CHECK(Rows == 3, Constructing_Non_3_Row_Matrix_From_3_Rows); 00265 00266 m_data[0].clone(source[i0]); 00267 m_data[1].clone(source[i1]); 00268 m_data[2].clone(source[i2]); 00269 } 00270 00271 template<int Rows, int Cols, typename T> 00272 template<int OR, ShBindingType Binding> 00273 ShMatrixRows<Rows, Cols, T>::ShMatrixRows(const ShMatrix<OR, Cols, Binding, T>& source, 00274 int i0, int i1, int i2, int i3) 00275 { 00276 SH_STATIC_CHECK(Rows == 4, Constructing_Non_4_Row_Matrix_From_4_Rows); 00277 00278 m_data[0].clone(source[i0]); 00279 m_data[1].clone(source[i1]); 00280 m_data[2].clone(source[i2]); 00281 m_data[3].clone(source[i3]); 00282 } 00283 00284 template<int Rows, int Cols, typename T> 00285 ShMatrixRows<Rows, Cols, T>::ShMatrixRows(const ShMatrixRows<Rows, Cols, T>& other) 00286 { 00287 // TODO: clone? 00288 for (int i = 0; i < Rows; i++) 00289 m_data[i] = other.m_data[i]; 00290 } 00291 00292 template<int Rows, int Cols, typename T> 00293 ShMatrixRows<Rows, Cols, T>& 00294 ShMatrixRows<Rows, Cols, T>::operator=(const ShMatrixRows<Rows, Cols, T>& other) 00295 { 00296 // TODO: clone? 00297 for (int i = 0; i < Rows; i++) 00298 m_data[i] = other.m_data[i]; 00299 } 00300 00301 template<int Rows, int Cols, typename T> 00302 ShMatrix<Rows, Cols, SH_TEMP, T> 00303 ShMatrixRows<Rows, Cols, T>::operator()() const 00304 { 00305 ShMatrix<Rows, Cols, SH_TEMP, T> r; 00306 for (int i = 0; i < Rows; i++) r[i].clone(m_data[i]); 00307 return r; 00308 } 00309 00310 template<int Rows, int Cols, typename T> 00311 ShMatrix<Rows, 1, SH_TEMP, T> 00312 ShMatrixRows<Rows, Cols, T>::operator()(int i0) const 00313 { 00314 ShMatrix<Rows, 1, SH_TEMP, T> r; 00315 for (int i = 0; i < Rows; i++) r[i].clone(m_data[i](i0)); 00316 return r; 00317 } 00318 00319 template<int Rows, int Cols, typename T> 00320 ShMatrix<Rows, 2, SH_TEMP, T> 00321 ShMatrixRows<Rows, Cols, T>::operator()(int i0, int i1) const 00322 { 00323 ShMatrix<Rows, 2, SH_TEMP, T> r; 00324 for (int i = 0; i < Rows; i++) r[i].clone(m_data[i](i0, i1)); 00325 return r; 00326 } 00327 00328 template<int Rows, int Cols, typename T> 00329 ShMatrix<Rows, 3, SH_TEMP, T> 00330 ShMatrixRows<Rows, Cols, T>::operator()(int i0, int i1, int i2) const 00331 { 00332 ShMatrix<Rows, 3, SH_TEMP, T> r; 00333 for (int i = 0; i < Rows; i++) r[i].clone(m_data[i](i0, i1, i2)); 00334 return r; 00335 } 00336 00337 template<int Rows, int Cols, typename T> 00338 ShMatrix<Rows, 4, SH_TEMP, T> 00339 ShMatrixRows<Rows, Cols, T>::operator()(int i0, int i1, int i2, int i3) const 00340 { 00341 ShMatrix<Rows, 4, SH_TEMP, T> r; 00342 for (int i = 0; i < Rows; i++) r[i].clone(m_data[i](i0, i1, i2, i3)); 00343 return r; 00344 } 00345 00346 template<int Rows, int Cols, ShBindingType Binding, typename T> 00347 void ShMatrix<Rows, Cols, Binding, T>::name(const std::string& name) 00348 { 00349 for (int i = 0; i < Rows; i++) { 00350 std::ostringstream os; 00351 os << name << "_row" << i; 00352 m_data[i].name(os.str()); 00353 m_data[i].meta("matrixname", name); 00354 } 00355 } 00356 00357 template<int Rows, int Cols, ShBindingType Binding, typename T> 00358 std::string ShMatrix<Rows, Cols, Binding, T>::name() const 00359 { 00360 return m_data[0].meta("matrixname"); 00361 } 00362 00363 template<int Rows, int Cols, ShBindingType Binding, typename T> 00364 void ShMatrix<Rows, Cols, Binding, T>::range(T low, T high) 00365 { 00366 for (int i = 0; i < Rows; i++) m_data[i].range(low, high); 00367 } 00368 00369 template<int Rows, int Cols, ShBindingType Binding, typename T> 00370 void ShMatrix<Rows, Cols, Binding, T>::internal(bool setting) 00371 { 00372 for (int i = 0; i < Rows; i++) m_data[i].internal(setting); 00373 } 00374 00375 00376 } 00377 00378 #endif

Generated on Fri Nov 5 16:51:20 2004 for Sh by doxygen 1.3.7