ShLibPosition.hpp

00001 // Sh: A GPU metaprogramming language.
00002 //
00003 // Copyright 2003-2006 Serious Hack Inc.
00004 // 
00005 // This library is free software; you can redistribute it and/or
00006 // modify it under the terms of the GNU Lesser General Public
00007 // License as published by the Free Software Foundation; either
00008 // version 2.1 of the License, or (at your option) any later version.
00009 //
00010 // This library is distributed in the hope that it will be useful,
00011 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00012 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013 // Lesser General Public License for more details.
00014 //
00015 // You should have received a copy of the GNU Lesser General Public
00016 // License along with this library; if not, write to the Free Software
00017 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 
00018 // MA  02110-1301, USA
00020 #ifndef SHLIBPOSITION_HPP
00021 #define SHLIBPOSITION_HPP
00022 
00023 #include "ShAttrib.hpp"
00024 #include "ShLib.hpp"
00025 
00026 namespace SH {
00027 
00028 SH_SHLIB_USUAL_OPERATIONS_RETTYPE(SH_POSITION, SH_POINT);
00029 SH_SHLIB_BINARY_RETTYPE_OPERATION(SH_POSITION, operator-, SH_VECTOR, N);
00030 SH_SHLIB_SPECIAL_RETTYPE_CONST_SCALAR_OP(SH_POSITION, operator-, SH_VECTOR, 1);
00031 
00032 SH_SHLIB_LEFT_MATRIX_RETTYPE_OPERATION(SH_POSITION, operator|, SH_POINT, M);
00033 
00034 // TODO: Special cases for homogeneous matrix multiplication etc.
00035 
00036 template<ShBindingType B1, ShBindingType B2, typename T, bool S1>
00037 ShAttrib<3, SH_TEMP, T, SH_POINT, false> 
00038 operator|(const ShMatrix<4, 4, B1, T>& m, const ShAttrib<3, B2, T, SH_POSITION, S1>& v)
00039 {
00040   ShAttrib<4, SH_TEMP, T, SH_POINT, false> t;
00041   t(0,1,2) = v;
00042   t(3) = ShAttrib<1, SH_CONST, T>(1.0f);
00043   ShAttrib<4, SH_TEMP, T, SH_POINT, false> r = m | t;
00044   return r(0,1,2)/r(3);
00045 }
00046 
00047 template<ShBindingType B1, ShBindingType B2, typename T, bool S1>
00048 ShAttrib<2, SH_TEMP, T, SH_POINT, false>
00049 operator|(const ShMatrix<3, 3, B1, T>& m, const ShAttrib<2, B2, T, SH_POSITION, S1>& v)
00050 {
00051   ShAttrib<3, SH_TEMP, T, SH_POINT, false> t;
00052   t(0,1) = v;
00053   t(2) = ShAttrib<1, SH_CONST, T>(1.0f);
00054   ShAttrib<3, SH_TEMP, T, SH_POINT, false> r = m | t;
00055   return r(0,1)/r(2);
00056 }
00057 
00058 template<ShBindingType B1, ShBindingType B2, typename T, bool S1>
00059 ShAttrib<1, SH_TEMP, T, SH_POSITION, false>
00060 operator|(const ShMatrix<2, 2, B1, T>& m, const ShAttrib<1, B2, T, SH_POSITION, S1>& v)
00061 {
00062   ShAttrib<2, SH_TEMP, T, SH_POINT, false> t;
00063   t(0) = v;
00064   t(1) = ShAttrib<1, SH_CONST, T>(1.0f);
00065   ShAttrib<2, SH_TEMP, T, SH_POINT, false> r = m | t;
00066   return r(0)/r(1);
00067 }
00068 
00069 }
00070 
00071 
00072 #endif

Generated on Thu Feb 16 14:51:34 2006 for Sh by  doxygen 1.4.6