00001 #ifndef __INSTANTIO_VEC3_H
00002 #define __INSTANTIO_VEC3_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 Vec3
00057 {
00058 public:
00059
00064 inline Vec3(): vec_()
00065 { vec_[0] = vec_[1] = vec_[2] = 0.f; }
00066
00074 inline Vec3(T x, T y, T z): vec_()
00075 { vec_[0] = x; vec_[1] = y; vec_[2] = z; }
00076
00086 inline Vec3(const T *vec): vec_()
00087 { vec_[0] = vec[0]; vec_[1] = vec[1]; vec_[2] = vec[2]; }
00088
00094 inline Vec3(const Vec3 &vec): vec_()
00095 { vec_[0] = vec.vec_[0]; vec_[1] = vec.vec_[1]; vec_[2] = vec.vec_[2]; }
00096
00103 inline const Vec3 &operator=(const Vec3 &vec)
00104 {
00105 vec_[0] = vec.vec_[0]; vec_[1] = vec.vec_[1]; vec_[2] = vec.vec_[2];
00106 return vec;
00107 }
00108
00118 inline const T *operator =(const T *vec)
00119 {
00120 vec_[0] = vec[0]; vec_[1] = vec[1]; vec_[2] = vec[2];
00121 return vec;
00122 }
00123
00128 inline void setX(T x) { vec_[0] = x; }
00129
00134 inline T getX() const { return vec_[0]; }
00135
00140 inline void setY(T y) { vec_[1] = y; }
00141
00146 inline T getY() const { return vec_[1]; }
00147
00152 inline void setZ(T z) { vec_[2] = z; }
00153
00158 inline T getZ() const { return vec_[2]; }
00159
00166 inline void set(T x, T y, T z)
00167 { vec_[0] = x; vec_[1] = y; vec_[2] = z; }
00168
00177 inline void set(const T *vec)
00178 { vec_[0] = vec[0]; vec_[1] = vec[1]; vec_[2] = vec[2]; }
00179
00184 void set(const Vec3 &vec)
00185 {
00186 vec_[0] = vec.vec_[0];
00187 vec_[1] = vec.vec_[1];
00188 vec_[2] = vec.vec_[2];
00189 }
00190
00197 inline void get(T &x, T &y, T &z) const
00198 { x = vec_[0]; y = vec_[1]; z = vec_[2]; }
00199
00209 inline void get(T *vec) const
00210 { vec[0] = vec_[0]; vec[1] = vec_[1]; vec[2] = vec_[2]; }
00211
00217 inline void get(Vec3 &vec) const
00218 { vec.vec_[0] = vec_[0]; vec.vec_[1] = vec_[1]; vec.vec_[2] = vec_[2]; }
00219
00227 inline const T *get() const { return vec_; }
00228
00236 inline T *get() { return vec_; }
00237
00243 inline T operator[](int i) const { return vec_[i]; }
00244
00250 inline T &operator[](int i) { return vec_[i]; }
00251
00256 inline operator T *() { return &vec_[0]; }
00257
00262 inline operator const T *() const { return &vec_[0]; }
00263
00271 friend inline bool operator==(const Vec3 &a, const Vec3 &b)
00272 {
00273 return (a.vec_[0] == b.vec_[0]) && (a.vec_[1] == b.vec_[1]) && (a.vec_[2] == b.vec_[2]);
00274 }
00275
00283 friend inline bool operator!=(const Vec3 &a, const Vec3 &b)
00284 {
00285 return (a.vec_[0] != b.vec_[0]) || (a.vec_[1] != b.vec_[1]) || (a.vec_[2] != b.vec_[2]);
00286 }
00287
00288 private:
00289
00291 T vec_[3];
00292 };
00293
00294
00295 typedef Vec3<double> Vec3d;
00296
00297
00298 typedef Vec3<float> Vec3f;
00299
00300
00307 template <>
00308 class INSTANTIO_DLLMAPPING TypeName<Vec3d>
00309 {
00310 public:
00311
00316 static const char *getName();
00317
00318 private:
00319
00321 TypeName();
00322
00324 TypeName(const TypeName &);
00325
00327 const TypeName &operator=(const TypeName &);
00328 };
00329
00330
00337 template <>
00338 class INSTANTIO_DLLMAPPING TypeName<Vec3f>
00339 {
00340 public:
00341
00346 static const char *getName();
00347
00348 private:
00349
00351 TypeName();
00352
00354 TypeName(const TypeName &);
00355
00357 const TypeName &operator=(const TypeName &);
00358 };
00359
00360
00361 }
00362
00363
00364 #ifdef _MSC_VER
00365 # pragma warning (pop)
00366 #endif
00367
00368 #endif // __INSTANTIO_VEC3_H