00001 #ifndef __INSTANTIO_VEC4_H
00002 #define __INSTANTIO_VEC4_H
00003
00004 #ifdef _MSC_VER
00005 # pragma once
00006 #endif
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "InstantIODef.h"
00027 #include "TypeName.h"
00028 #ifdef _MSC_VER
00029 # pragma warning (push)
00030 # pragma warning (disable: 4351)
00031 #endif
00032
00033
00034 namespace InstantIO
00035 {
00036
00037
00056 template <class T> class Vec4
00057 {
00058 public:
00059
00064 inline Vec4(): vec_()
00065 { vec_[0] = vec_[1] = vec_[2] = vec_[3] = 0.f; }
00066
00075 inline Vec4(T x, T y, T z, T w): vec_()
00076 { vec_[0] = x; vec_[1] = y; vec_[2] = z; vec_[3] = w; }
00077
00088 inline Vec4(const T *vec): vec_()
00089 { vec_[0] = vec[0]; vec_[1] = vec[1]; vec_[2] = vec[2]; vec_[3] = vec[3]; }
00090
00096 inline Vec4(const Vec4 &vec): vec_()
00097 { vec_[0] = vec.vec_[0]; vec_[1] = vec.vec_[1]; vec_[2] = vec.vec_[2]; vec_[3] = vec.vec_[3]; }
00098
00105 inline const Vec4 &operator=(const Vec4 &vec)
00106 {
00107 vec_[0] = vec.vec_[0]; vec_[1] = vec.vec_[1]; vec_[2] = vec.vec_[2]; vec_[3] = vec.vec_[3];
00108 return vec;
00109 }
00110
00121 inline const T *operator =(const T *vec)
00122 {
00123 vec_[0] = vec[0]; vec_[1] = vec[1]; vec_[2] = vec[2]; vec_[3] = vec[3];
00124 return vec;
00125 }
00126
00131 inline void setX(T x) { vec_[0] = x; }
00132
00137 inline T getX() const { return vec_[0]; }
00138
00143 inline void setY(T y) { vec_[1] = y; }
00144
00149 inline T getY() const { return vec_[1]; }
00150
00155 inline void setZ(T z) { vec_[2] = z; }
00156
00161 inline T getZ() const { return vec_[2]; }
00162
00167 inline void setW(T w) { vec_[3] = w; }
00168
00173 inline T getW() const { return vec_[3]; }
00174
00182 inline void set(T x, T y, T z, T w)
00183 { vec_[0] = x; vec_[1] = y; vec_[2] = z; vec_[3] = w; }
00184
00194 inline void set(const T *vec)
00195 { vec_[0] = vec[0]; vec_[1] = vec[1]; vec_[2] = vec[2]; vec_[3] = vec[3]; }
00196
00201 void set(const Vec4 &vec)
00202 {
00203 vec_[0] = vec.vec_[0];
00204 vec_[1] = vec.vec_[1];
00205 vec_[2] = vec.vec_[2];
00206 vec_[3] = vec.vec_[3];
00207 }
00208
00216 inline void get(T &x, T &y, T &z, T &w) const
00217 { x = vec_[0]; y = vec_[1]; z = vec_[2]; w = vec_[3]; }
00218
00229 inline void get(T *vec) const
00230 { vec[0] = vec_[0]; vec[1] = vec_[1]; vec[2] = vec_[2]; vec[3] = vec_[3]; }
00231
00237 inline void get(Vec4 &vec) const
00238 { vec.vec_[0] = vec_[0]; vec.vec_[1] = vec_[1]; vec.vec_[2] = vec_[2]; vec.vec_[3] = vec_[3]; }
00239
00248 inline const T *get() const { return vec_; }
00249
00258 inline T *get() { return vec_; }
00259
00265 inline T operator[](int i) const { return vec_[i]; }
00266
00272 inline T &operator[](int i) { return vec_[i]; }
00273
00278 inline operator T *() { return &vec_[0]; }
00279
00284 inline operator const T *() const { return &vec_[0]; }
00285
00293 friend inline bool operator==(const Vec4 &a, const Vec4 &b)
00294 {
00295 return (a.vec_[0] == b.vec_[0]) && (a.vec_[1] == b.vec_[1]) && (a.vec_[2] == b.vec_[2]) && (a.vec_[3] == b.vec_[3]);
00296 }
00297
00305 friend inline bool operator!=(const Vec4 &a, const Vec4 &b)
00306 {
00307 return (a.vec_[0] != b.vec_[0]) || (a.vec_[1] != b.vec_[1]) || (a.vec_[2] != b.vec_[2]) || (a.vec_[3] != b.vec_[3]);
00308 }
00309
00310 private:
00311
00313 T vec_[4];
00314 };
00315
00316
00317 typedef Vec4<double> Vec4d;
00318
00319
00320 typedef Vec4<float> Vec4f;
00321
00322
00329 template <>
00330 class INSTANTIO_DLLMAPPING TypeName<Vec4d>
00331 {
00332 public:
00333
00338 static const char *getName();
00339
00340 private:
00341
00343 TypeName();
00344
00346 TypeName(const TypeName &);
00347
00349 const TypeName &operator=(const TypeName &);
00350 };
00351
00352
00359 template <>
00360 class INSTANTIO_DLLMAPPING TypeName<Vec4f>
00361 {
00362 public:
00363
00368 static const char *getName();
00369
00370 private:
00371
00373 TypeName();
00374
00376 TypeName(const TypeName &);
00377
00379 const TypeName &operator=(const TypeName &);
00380 };
00381
00382
00383 }
00384
00385
00386 #ifdef _MSC_VER
00387 # pragma warning (pop)
00388 #endif
00389
00390 #endif // __INSTANTIO_VEC4_H