swizzle.hpp

00001 
00002 // OpenGL Mathematics Copyright (c) 2005 - 2011 G-Truc Creation (www.g-truc.net)
00004 // Created : 2010-02-20
00005 // Updated : 2010-02-20
00006 // Licence : This source is under MIT License
00007 // File    : glm/gtc/swizzle.hpp
00009 // Dependency:
00010 // - GLM core
00012 
00013 #ifndef glm_gtc_swizzle
00014 #define glm_gtc_swizzle
00015 
00016 // Dependency:
00017 #include "../glm.hpp"
00018 #include "../gtc/type_precision.hpp"
00019 
00020 #if(defined(GLM_MESSAGES) && !defined(glm_ext))
00021 #       pragma message("GLM: GLM_GTC_swizzle extension included")
00022 #endif
00023 
00024 namespace glm
00025 {
00026         namespace test{
00027                 void main_gtc_swizzle();
00028         }//namespace test
00029 
00030         namespace gtc{
00032         namespace swizzle
00033         {
00034                 using namespace gtc::half_float;
00035 
00036                 template <typename T, template <typename> class vecType>
00037                 T const & swizzle(      
00038                         vecType<T> const & v,
00039                         comp x);
00040 
00041                 template <typename T, template <typename> class vecType>
00042                 detail::tvec2<T> const & swizzle(
00043                         vecType<T> const & v,
00044                         comp x, comp y);
00045 
00046                 template <typename T, template <typename> class vecType>
00047                 detail::tvec3<T> const & swizzle(
00048                         vecType<T> const & v,
00049                         comp x, comp y, comp z);
00050 
00051                 template <typename T, template <typename> class vecType>
00052                 detail::tvec4<T> const & swizzle(
00053                         vecType<T> const & v,
00054                         comp x, comp y, comp z, comp w);
00055 
00056                 template <typename T, template <typename> class vecType>
00057                 T & swizzle(
00058                         vecType<T> & v,
00059                         comp x);
00060 
00061                 template <typename T, template <typename> class vecType>
00062                 detail::tref2<T> swizzle(
00063                         vecType<T> & v,
00064                         comp x, comp y);
00065 
00066                 template <typename T, template <typename> class vecType>
00067                 detail::tref3<T> swizzle(
00068                         vecType<T> & v,
00069                         comp x, comp y, comp z);
00070 
00071                 template <typename T, template <typename> class vecType>
00072                 detail::tref4<T> swizzle(
00073                         vecType<T> & v,
00074                         comp x, comp y, comp z, comp w);
00075 
00076 #               define static_swizzle1(TYPE, SIZE)                                                      \
00077                         template <comp x>                                                                               \
00078                         inline TYPE swizzle(detail::tvec##SIZE<TYPE> const & v) \
00079                         {return v[x];}                                                                                  \
00080                                                                                                                                         \
00081                         template <comp x>                                                                               \
00082                         inline TYPE& swizzle(detail::tvec##SIZE<TYPE> & v)              \
00083                         {return v[x];}
00084 
00085                 static_swizzle1(detail::float16, 2)
00086                 static_swizzle1(detail::float16, 3)
00087                 static_swizzle1(detail::float16, 4)
00088                 static_swizzle1(detail::float32, 2)
00089                 static_swizzle1(detail::float32, 3)
00090                 static_swizzle1(detail::float32, 4)
00091                 static_swizzle1(detail::float64, 2)
00092                 static_swizzle1(detail::float64, 3)
00093                 static_swizzle1(detail::float64, 4)
00094 
00095                 static_swizzle1(detail::int8,  2)
00096                 static_swizzle1(detail::int8,  3)
00097                 static_swizzle1(detail::int8,  4)
00098                 static_swizzle1(detail::int16, 2)
00099                 static_swizzle1(detail::int16, 3)
00100                 static_swizzle1(detail::int16, 4)
00101                 static_swizzle1(detail::int32, 2)
00102                 static_swizzle1(detail::int32, 3)
00103                 static_swizzle1(detail::int32, 4)
00104                 static_swizzle1(detail::int64, 2)
00105                 static_swizzle1(detail::int64, 3)
00106                 static_swizzle1(detail::int64, 4)
00107 
00108                 static_swizzle1(detail::uint8,  2)
00109                 static_swizzle1(detail::uint8,  3)
00110                 static_swizzle1(detail::uint8,  4)
00111                 static_swizzle1(detail::uint16, 2)
00112                 static_swizzle1(detail::uint16, 3)
00113                 static_swizzle1(detail::uint16, 4)
00114                 static_swizzle1(detail::uint32, 2)
00115                 static_swizzle1(detail::uint32, 3)
00116                 static_swizzle1(detail::uint32, 4)
00117                 static_swizzle1(detail::uint64, 2)
00118                 static_swizzle1(detail::uint64, 3)
00119                 static_swizzle1(detail::uint64, 4)
00120 
00121 #               define static_swizzle2_const(TYPE) \
00122                         template <comp x, comp y> \
00123                         inline TYPE swizzle(TYPE const & v) \
00124                         {return TYPE(v[x], v[y]);}
00125 
00126 #               define static_swizzle3_const(TYPE) \
00127                         template <comp x, comp y, comp z> \
00128                         inline TYPE swizzle(TYPE const & v) \
00129                         {return TYPE(v[x], v[y], v[z]);}
00130 
00131 #               define static_swizzle4_const(TYPE) \
00132                         template <comp x, comp y, comp z, comp w> \
00133                         inline TYPE swizzle(TYPE const & v) \
00134                         {return TYPE(v[x], v[y], v[z], v[w]);}
00135 /*
00136 #               define static_swizzle2_const(TYPE, SIZE)                                                                        \
00137                         template <comp x, comp y>                                                                                               \
00138                         inline detail::tvec2<TYPE> swizzle(detail::tvec##SIZE<TYPE> const & v)  \
00139                         {return detail::tvec2<TYPE>(v[x], v[y]);}
00140 
00141 #               define static_swizzle3_const(TYPE, SIZE)                                                                        \
00142                         template <comp x, comp y, comp z>                                                                               \
00143                         inline detail::tvec3<TYPE> swizzle(detail::tvec##SIZE<TYPE> const & v)  \
00144                         {return detail::tvec3<TYPE>(v[x], v[y], v[z]);}
00145 
00146 #               define static_swizzle4_const(TYPE, SIZE)                                                                        \
00147                         template <comp x, comp y, comp z, comp w>                                                               \
00148                         inline detail::tvec4<TYPE> swizzle(detail::tvec##SIZE<TYPE> const & v)  \
00149                         {return detail::tvec4<TYPE>(v[x], v[y], v[z], v[w]);}
00150 */
00151                 static_swizzle2_const(glm::f16vec2)
00152                 static_swizzle2_const(glm::f16vec3)
00153                 static_swizzle2_const(glm::f16vec4)
00154                 static_swizzle2_const(glm::f32vec2)
00155                 static_swizzle2_const(glm::f32vec3)
00156                 static_swizzle2_const(glm::f32vec4)
00157                 static_swizzle2_const(glm::f64vec2)
00158                 static_swizzle2_const(glm::f64vec3)
00159                 static_swizzle2_const(glm::f64vec4)
00160 
00161                 static_swizzle2_const(glm::i8vec2)
00162                 static_swizzle2_const(glm::i8vec3)
00163                 static_swizzle2_const(glm::i8vec4)
00164                 static_swizzle2_const(glm::i16vec2)
00165                 static_swizzle2_const(glm::i16vec3)
00166                 static_swizzle2_const(glm::i16vec4)
00167                 static_swizzle2_const(glm::i32vec2)
00168                 static_swizzle2_const(glm::i32vec3)
00169                 static_swizzle2_const(glm::i32vec4)
00170                 static_swizzle2_const(glm::i64vec2)
00171                 static_swizzle2_const(glm::i64vec3)
00172                 static_swizzle2_const(glm::i64vec4)
00173 
00174                 static_swizzle2_const(glm::u8vec2)
00175                 static_swizzle2_const(glm::u8vec3)
00176                 static_swizzle2_const(glm::u8vec4)
00177                 static_swizzle2_const(glm::u16vec2)
00178                 static_swizzle2_const(glm::u16vec3)
00179                 static_swizzle2_const(glm::u16vec4)
00180                 static_swizzle2_const(glm::u32vec2)
00181                 static_swizzle2_const(glm::u32vec3)
00182                 static_swizzle2_const(glm::u32vec4)
00183                 static_swizzle2_const(glm::u64vec2)
00184                 static_swizzle2_const(glm::u64vec3)
00185                 static_swizzle2_const(glm::u64vec4)
00186 
00187                 static_swizzle3_const(glm::f16vec2)
00188                 static_swizzle3_const(glm::f16vec3)
00189                 static_swizzle3_const(glm::f16vec4)
00190                 static_swizzle3_const(glm::f32vec2)
00191                 static_swizzle3_const(glm::f32vec3)
00192                 static_swizzle3_const(glm::f32vec4)
00193                 static_swizzle3_const(glm::f64vec2)
00194                 static_swizzle3_const(glm::f64vec3)
00195                 static_swizzle3_const(glm::f64vec4)
00196 
00197                 static_swizzle3_const(glm::i8vec2)
00198                 static_swizzle3_const(glm::i8vec3)
00199                 static_swizzle3_const(glm::i8vec4)
00200                 static_swizzle3_const(glm::i16vec2)
00201                 static_swizzle3_const(glm::i16vec3)
00202                 static_swizzle3_const(glm::i16vec4)
00203                 static_swizzle3_const(glm::i32vec2)
00204                 static_swizzle3_const(glm::i32vec3)
00205                 static_swizzle3_const(glm::i32vec4)
00206                 static_swizzle3_const(glm::i64vec2)
00207                 static_swizzle3_const(glm::i64vec3)
00208                 static_swizzle3_const(glm::i64vec4)
00209 
00210                 static_swizzle3_const(glm::u8vec2)
00211                 static_swizzle3_const(glm::u8vec3)
00212                 static_swizzle3_const(glm::u8vec4)
00213                 static_swizzle3_const(glm::u16vec2)
00214                 static_swizzle3_const(glm::u16vec3)
00215                 static_swizzle3_const(glm::u16vec4)
00216                 static_swizzle3_const(glm::u32vec2)
00217                 static_swizzle3_const(glm::u32vec3)
00218                 static_swizzle3_const(glm::u32vec4)
00219                 static_swizzle3_const(glm::u64vec2)
00220                 static_swizzle3_const(glm::u64vec3)
00221                 static_swizzle3_const(glm::u64vec4)
00222 
00223                 static_swizzle4_const(glm::f16vec2)
00224                 static_swizzle4_const(glm::f16vec3)
00225                 static_swizzle4_const(glm::f16vec4)
00226                 static_swizzle4_const(glm::f32vec2)
00227                 static_swizzle4_const(glm::f32vec3)
00228                 static_swizzle4_const(glm::f32vec4)
00229                 static_swizzle4_const(glm::f64vec2)
00230                 static_swizzle4_const(glm::f64vec3)
00231                 static_swizzle4_const(glm::f64vec4)
00232 
00233                 static_swizzle4_const(glm::i8vec2)
00234                 static_swizzle4_const(glm::i8vec3)
00235                 static_swizzle4_const(glm::i8vec4)
00236                 static_swizzle4_const(glm::i16vec2)
00237                 static_swizzle4_const(glm::i16vec3)
00238                 static_swizzle4_const(glm::i16vec4)
00239                 static_swizzle4_const(glm::i32vec2)
00240                 static_swizzle4_const(glm::i32vec3)
00241                 static_swizzle4_const(glm::i32vec4)
00242                 static_swizzle4_const(glm::i64vec2)
00243                 static_swizzle4_const(glm::i64vec3)
00244                 static_swizzle4_const(glm::i64vec4)
00245 
00246                 static_swizzle4_const(glm::u8vec2)
00247                 static_swizzle4_const(glm::u8vec3)
00248                 static_swizzle4_const(glm::u8vec4)
00249                 static_swizzle4_const(glm::u16vec2)
00250                 static_swizzle4_const(glm::u16vec3)
00251                 static_swizzle4_const(glm::u16vec4)
00252                 static_swizzle4_const(glm::u32vec2)
00253                 static_swizzle4_const(glm::u32vec3)
00254                 static_swizzle4_const(glm::u32vec4)
00255                 static_swizzle4_const(glm::u64vec2)
00256                 static_swizzle4_const(glm::u64vec3)
00257                 static_swizzle4_const(glm::u64vec4)
00258 
00259 #               define static_swizzle2_ref(TYPE) \
00260                         template <glm::comp x, glm::comp y> \
00261                         inline glm::detail::tref2<typename TYPE::value_type> swizzle(TYPE & v) \
00262                         {return glm::detail::tref2<typename TYPE::value_type>(v[x], v[y]);}     
00263 
00264 #               define static_swizzle3_ref(TYPE) \
00265                         template <glm::comp x, glm::comp y, glm::comp z> \
00266                         inline glm::detail::tref3<typename TYPE::value_type> swizzle(TYPE & v) \
00267                         {return glm::detail::tref3<typename TYPE::value_type>(v[x], v[y], v[z]);}       
00268 
00269 #               define static_swizzle4_ref(TYPE) \
00270                         template <glm::comp x, glm::comp y, glm::comp z, glm::comp w> \
00271                         inline glm::detail::tref4<typename TYPE::value_type> swizzle(TYPE & v) \
00272                         {return glm::detail::tref4<typename TYPE::value_type>(v[x], v[y], v[z], v[w]);} 
00273 
00274                 static_swizzle2_ref(glm::f16vec2)
00275                 static_swizzle2_ref(glm::f16vec3)
00276                 static_swizzle2_ref(glm::f16vec4)
00277                 static_swizzle2_ref(glm::f32vec2)
00278                 static_swizzle2_ref(glm::f32vec3)
00279                 static_swizzle2_ref(glm::f32vec4)
00280                 static_swizzle2_ref(glm::f64vec2)
00281                 static_swizzle2_ref(glm::f64vec3)
00282                 static_swizzle2_ref(glm::f64vec4)
00283 
00284                 static_swizzle2_ref(glm::i8vec2)
00285                 static_swizzle2_ref(glm::i8vec3)
00286                 static_swizzle2_ref(glm::i8vec4)
00287                 static_swizzle2_ref(glm::i16vec2)
00288                 static_swizzle2_ref(glm::i16vec3)
00289                 static_swizzle2_ref(glm::i16vec4)
00290                 static_swizzle2_ref(glm::i32vec2)
00291                 static_swizzle2_ref(glm::i32vec3)
00292                 static_swizzle2_ref(glm::i32vec4)
00293                 static_swizzle2_ref(glm::i64vec2)
00294                 static_swizzle2_ref(glm::i64vec3)
00295                 static_swizzle2_ref(glm::i64vec4)
00296 
00297                 static_swizzle2_ref(glm::u8vec2)
00298                 static_swizzle2_ref(glm::u8vec3)
00299                 static_swizzle2_ref(glm::u8vec4)
00300                 static_swizzle2_ref(glm::u16vec2)
00301                 static_swizzle2_ref(glm::u16vec3)
00302                 static_swizzle2_ref(glm::u16vec4)
00303                 static_swizzle2_ref(glm::u32vec2)
00304                 static_swizzle2_ref(glm::u32vec3)
00305                 static_swizzle2_ref(glm::u32vec4)
00306                 static_swizzle2_ref(glm::u64vec2)
00307                 static_swizzle2_ref(glm::u64vec3)
00308                 static_swizzle2_ref(glm::u64vec4)
00309 
00310                 static_swizzle3_ref(glm::f16vec3)
00311                 static_swizzle3_ref(glm::f16vec4)
00312                 static_swizzle3_ref(glm::f32vec3)
00313                 static_swizzle3_ref(glm::f32vec4)
00314                 static_swizzle3_ref(glm::f64vec3)
00315                 static_swizzle3_ref(glm::f64vec4)
00316 
00317                 static_swizzle3_ref(glm::i8vec3)
00318                 static_swizzle3_ref(glm::i8vec4)
00319                 static_swizzle3_ref(glm::i16vec3)
00320                 static_swizzle3_ref(glm::i16vec4)
00321                 static_swizzle3_ref(glm::i32vec3)
00322                 static_swizzle3_ref(glm::i32vec4)
00323                 static_swizzle3_ref(glm::i64vec3)
00324                 static_swizzle3_ref(glm::i64vec4)
00325 
00326                 static_swizzle3_ref(glm::u8vec3)
00327                 static_swizzle3_ref(glm::u8vec4)
00328                 static_swizzle3_ref(glm::u16vec3)
00329                 static_swizzle3_ref(glm::u16vec4)
00330                 static_swizzle3_ref(glm::u32vec3)
00331                 static_swizzle3_ref(glm::u32vec4)
00332                 static_swizzle3_ref(glm::u64vec3)
00333                 static_swizzle3_ref(glm::u64vec4)
00334 
00335                 static_swizzle4_ref(glm::f16vec4)
00336                 static_swizzle4_ref(glm::f32vec4)
00337                 static_swizzle4_ref(glm::f64vec4)
00338 
00339                 static_swizzle4_ref(glm::i8vec4)
00340                 static_swizzle4_ref(glm::i16vec4)
00341                 static_swizzle4_ref(glm::i32vec4)
00342                 static_swizzle4_ref(glm::i64vec4)
00343 
00344                 static_swizzle4_ref(glm::u8vec4)
00345                 static_swizzle4_ref(glm::u16vec4)
00346                 static_swizzle4_ref(glm::u32vec4)
00347                 static_swizzle4_ref(glm::u64vec4)
00348 
00349         }//namespace swizzle
00350         }//namespace gtc
00351 }//namespace glm
00352 
00353 #include "swizzle.inl"
00354 
00355 namespace glm{using namespace gtc::swizzle;}
00356 
00357 #endif//glm_gtc_swizzle