00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
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
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