GLM Version 0.9.0

type_vec3.hpp

00001 
00002 // OpenGL Mathematics Copyright (c) 2005 - 2011 G-Truc Creation (www.g-truc.net)
00004 // Created : 2008-08-22
00005 // Updated : 2010-02-03
00006 // Licence : This source is under MIT License
00007 // File    : glm/core/type_tvec3.hpp
00009 
00010 #ifndef glm_core_type_gentype3
00011 #define glm_core_type_gentype3
00012 
00013 #include "type_vec.hpp"
00014 #include "type_float.hpp"
00015 #include "type_int.hpp"
00016 #include "type_size.hpp"
00017 #include "_swizzle.hpp"
00018 
00019 namespace glm
00020 {
00021         namespace test
00022         {
00023                 void main_vec3();
00024         }//namespace test
00025 
00026         namespace detail
00027         {
00028                 template <typename T> struct tref2;
00029                 template <typename T> struct tref3;
00030                 template <typename T> struct tref4;
00031                 template <typename T> struct tvec2;
00032                 template <typename T> struct tvec4;
00033 
00034                 template <typename T>
00035                 struct tvec3
00036                 {       
00037                         enum ctor{null};
00038                         typedef T value_type;
00039                         typedef std::size_t size_type;
00040                         static size_type value_size();
00041 
00042                         typedef tvec3<T> type;
00043                         typedef tvec3<bool> bool_type;
00044 
00046                         // Data
00047 
00048 #       if defined(GLM_USE_ONLY_XYZW)
00049                         value_type x, y, z;
00050 #       else//GLM_USE_ONLY_XYZW
00051 #               ifdef GLM_USE_ANONYMOUS_UNION
00052                         union 
00053                         {
00054                                 struct{value_type x, y, z;};
00055                                 struct{value_type r, g, b;};
00056                                 struct{value_type s, t, p;};
00057                         };
00058 #               else//GLM_USE_ANONYMOUS_UNION
00059                         union {value_type x, r, s;};
00060                         union {value_type y, g, t;};
00061                         union {value_type z, b, p;};
00062 #               endif//GLM_USE_ANONYMOUS_UNION
00063 #       endif//GLM_USE_ONLY_XYZW
00064 
00066                         // Accesses
00067 
00068                         value_type & operator[](size_type i);
00069                         value_type const & operator[](size_type i) const;
00070 
00072                         // Implicit basic constructors
00073 
00074                         tvec3();
00075                         tvec3(tvec3<T> const & v);
00076 
00078                         // Explicit basic constructors
00079 
00080                         explicit tvec3(
00081                                 ctor);
00082                         explicit tvec3(
00083                                 value_type const & s);
00084                         explicit tvec3(
00085                                 value_type const & s1, 
00086                                 value_type const & s2, 
00087                                 value_type const & s3);
00088 
00090                         // Swizzle constructors
00091 
00092                         tvec3(tref3<T> const & r);
00093 
00095                         // Convertion scalar constructors
00096 
00098                         template <typename U> 
00099                         explicit tvec3(
00100                                 U const & x);
00102                         template <typename U, typename V, typename W> 
00103                         explicit tvec3(
00104                                 U const & x, 
00105                                 V const & y, 
00106                                 W const & z);                   
00107 
00109                         // Convertion vector constructors
00110 
00112                         template <typename A, typename B> 
00113                         explicit tvec3(tvec2<A> const & v, B const & s);
00115                         template <typename A, typename B> 
00116                         explicit tvec3(A const & s, tvec2<B> const & v);
00118                         template <typename U> 
00119                         explicit tvec3(tvec3<U> const & v);
00121                         template <typename U> 
00122                         explicit tvec3(tvec4<U> const & v);
00123 
00125                         // Unary arithmetic operators
00126 
00127                         tvec3<T> & operator= (tvec3<T> const & v);
00128                         template <typename U> 
00129                         tvec3<T> & operator= (tvec3<U> const & v);
00130 
00131                         template <typename U> 
00132                         tvec3<T> & operator+=(U const & s);
00133                         template <typename U> 
00134                         tvec3<T> & operator+=(tvec3<U> const & v);
00135                         template <typename U> 
00136                         tvec3<T> & operator-=(U const & s);
00137                         template <typename U> 
00138                         tvec3<T> & operator-=(tvec3<U> const & v);
00139                         template <typename U> 
00140                         tvec3<T> & operator*=(U const & s);
00141                         template <typename U> 
00142                         tvec3<T> & operator*=(tvec3<U> const & v);
00143                         template <typename U> 
00144                         tvec3<T> & operator/=(U const & s);
00145                         template <typename U> 
00146                         tvec3<T> & operator/=(tvec3<U> const & v);
00147                         tvec3<T> & operator++();
00148                         tvec3<T> & operator--();
00149 
00151                         // Unary bit operators
00152 
00153                         template <typename U>
00154                         tvec3<T> & operator%= (U const & s);
00155                         template <typename U>
00156                         tvec3<T> & operator%= (tvec3<U> const & v);
00157                         template <typename U>
00158                         tvec3<T> & operator&= (U const & s);
00159                         template <typename U>
00160                         tvec3<T> & operator&= (tvec3<U> const & v);
00161                         template <typename U>
00162                         tvec3<T> & operator|= (U const & s);
00163                         template <typename U>
00164                         tvec3<T> & operator|= (tvec3<U> const & v);
00165                         template <typename U>
00166                         tvec3<T> & operator^= (U const & s);
00167                         template <typename U>
00168                         tvec3<T> & operator^= (tvec3<U> const & v);
00169                         template <typename U>
00170                         tvec3<T> & operator<<=(U const & s);
00171                         template <typename U>
00172                         tvec3<T> & operator<<=(tvec3<U> const & v);
00173                         template <typename U>
00174                         tvec3<T> & operator>>=(U const & s);
00175                         template <typename U>
00176                         tvec3<T> & operator>>=(tvec3<U> const & v);
00177 
00179                         // Swizzle operators
00180 
00181                         value_type swizzle(comp X) const;
00182                         tvec2<T> swizzle(comp X, comp Y) const;
00183                         tvec3<T> swizzle(comp X, comp Y, comp Z) const;
00184                         tvec4<T> swizzle(comp X, comp Y, comp Z, comp W) const;
00185                         tref3<T> swizzle(comp X, comp Y, comp Z);
00186                 };
00187 
00188                 template <typename T>
00189                 struct tref3
00190                 {
00191                         tref3(T & x, T & y, T & z);
00192                         tref3(tref3<T> const & r);
00193                         tref3(tvec3<T> const & v);
00194 
00195                         tref3<T> & operator= (tref3<T> const & r);
00196                         tref3<T> & operator= (tvec3<T> const & v);
00197 
00198                         T & x;
00199                         T & y;
00200                         T & z;
00201                 };
00202         } //namespace detail
00203 
00204         namespace core{
00205         namespace type{
00206 
00207         namespace precision
00208         {
00212                 typedef detail::tvec3<highp_float>              highp_vec3;
00216                 typedef detail::tvec3<mediump_float>    mediump_vec3;
00220                 typedef detail::tvec3<lowp_float>               lowp_vec3;
00221 
00225                 typedef detail::tvec3<highp_int>                highp_ivec3;
00229                 typedef detail::tvec3<mediump_int>              mediump_ivec3;
00233                 typedef detail::tvec3<lowp_int>                 lowp_ivec3;
00234 
00238                 typedef detail::tvec3<highp_uint>               highp_uvec3;
00242                 typedef detail::tvec3<mediump_uint>             mediump_uvec3;
00246                 typedef detail::tvec3<lowp_uint>                lowp_uvec3;
00247         }
00248         //namespace precision
00249 
00250         }//namespace type
00251         }//namespace core
00252 }//namespace glm
00253 
00254 #include "type_vec3.inl"
00255 
00256 #endif//glm_core_type_gentype3