00001 #ifndef TINYVEC_H
00002 #define TINYVEC_H
00003
00004 #include <Base/TVector.h>
00005
00006 #ifndef PTM_PACK // 単体で使用する場合は,namespace に入れない
00007 namespace Spr{;
00008 #endif
00009 #ifdef _WIN32
00010 #pragma pack(push, 4)
00011 #endif
00012
00013
00014
00015 template <class EXP, class T> class TVecDesc: public PTM::TVectorDesc<1, EXP, EXP, T>{};
00016
00017 template<class T>
00018 class TVec2:public PTM::TVectorBase<DIMENC(2), TVecDesc<TVec2<T>, T> >{
00019 public:
00020 typedef TVecDesc<TVec2<T>, T> desc;
00021 typedef PTM::TVectorBase<DIMENC(2), desc> base_type;
00022
00023 DEF_TVECTOR_BASIC_MEMBER(TVec2);
00024
00025 union{
00026 T data[2];
00027 struct{
00028 T x,y;
00029 };
00030 };
00031
00032 T& item_impl(size_t i){ return data[i]; }
00033
00034 const T& item_impl(size_t i) const { return data[i]; }
00035
00036 size_t stride_impl() const { return 1; }
00037
00038
00039
00040 template <class TX, class TY>
00041 TVec2(TX xi, TY yi){ X() = element_type(xi); Y() = element_type(yi); }
00042
00043
00044
00045
00046
00047 static TVec2<T> Zero(){TVec2<T> v; v.clear(); return v;}
00048
00049
00050
00051
00052
00053 const element_type& X() const { return item(0); }
00054
00055 const element_type& Y() const { return item(1); }
00056
00057 element_type& X() { return item(0); }
00058
00059 element_type& Y() { return item(1); }
00060
00061 const element_type& U() const { return item(0); }
00062
00063 const element_type& V() const { return item(1); }
00064
00065 element_type& U() { return item(0); }
00066
00067 element_type& V() { return item(1); }
00068
00069 protected:
00070 void set_default(){clear();}
00071 };
00072
00073
00074
00075
00076 template<class T>
00077 class TVec3:public PTM::TVectorBase<DIMENC(3), TVecDesc<TVec3<T>, T> >{
00078 public:
00079 typedef TVecDesc<TVec3<T>, T> desc;
00080 typedef PTM::TVectorBase<DIMENC(3), desc> base_type;
00081
00082
00083 DEF_TVECTOR_BASIC_MEMBER(TVec3);
00084 union{
00085 T data[3];
00086 struct{
00087 T x,y,z;
00088 };
00089 };
00090
00091 T& item_impl(size_t i){ return data[i]; }
00092
00093 const T& item_impl(size_t i) const { return data[i]; }
00094
00095 size_t stride_impl() const { return 1; }
00096
00097
00098
00099
00100 static TVec3<T> Zero(){TVec3<T> v; v.clear(); return v;}
00101
00102
00103
00104
00105
00106 const element_type& X() const { return item(0); }
00107
00108 const element_type& Y() const { return item(1); }
00109
00110 const element_type& Z() const { return item(2); }
00111
00112 element_type& X(){ return item(0); }
00113
00114 element_type& Y(){ return item(1); }
00115
00116 element_type& Z(){ return item(2); }
00117
00118 const element_type& R() const { return item(0); }
00119 const element_type& G() const { return item(1); }
00120 const element_type& B() const { return item(2); }
00121 element_type& R(){ return item(0); }
00122 element_type& G(){ return item(1); }
00123 element_type& B(){ return item(2); }
00124
00125
00126
00127
00128
00129 template <class TX, class TY, class TZ> TVec3 (TX xi, TY yi, TZ zi){ X() = element_type(xi); Y() = element_type(yi); Z() = element_type(zi); }
00130
00131
00132
00133
00134 template <class D>
00135 element_type dot(const PTM::VectorImp<D>& b) const {
00136 assert(b.size() == size());
00137 return item(0)*b[0] + item(1)*b[1] + item(2)*b[2];
00138 }
00139 protected:
00140 void set_default(){clear();}
00141 };
00142
00143
00144
00145
00146 template<class T>
00147 class TVec4:public PTM::TVectorBase<DIMENC(4), TVecDesc<TVec4<T>, T> >{
00148 public:
00149 typedef TVecDesc<TVec4<T>, T> desc;
00150 typedef PTM::TVectorBase<DIMENC(4), desc> base_type;
00151
00152
00153 DEF_TVECTOR_BASIC_MEMBER(TVec4);
00154 union{
00155 T data[4];
00156 struct{
00157 T x,y,z,w;
00158 };
00159 };
00160
00161 T& item_impl(size_t i){ return data[i]; }
00162
00163 const T& item_impl(size_t i) const { return data[i]; }
00164
00165 size_t stride_impl() const { return 1; }
00166
00167
00168
00169
00170 static TVec4<T> Zero(){TVec4<T> v; v.clear(); return v;}
00171
00172
00173
00174
00175
00176 const element_type& X() const { return x; }
00177
00178 const element_type& Y() const { return y; }
00179
00180 const element_type& Z() const { return z; }
00181
00182 const element_type& W() const { return w; }
00183
00184 element_type& X(){ return x; }
00185
00186 element_type& Y(){ return y; }
00187
00188 element_type& Z(){ return z; }
00189
00190 element_type& W(){ return w; }
00191
00192 const element_type& R() const { return x; }
00193 const element_type& G() const { return y; }
00194 const element_type& B() const { return z; }
00195 const element_type& A() const { return w; }
00196 element_type& R(){ return x; }
00197 element_type& G(){ return y; }
00198 element_type& B(){ return z; }
00199 element_type& A(){ return w; }
00200
00201
00202
00203
00204
00205 template <class TX, class TY, class TZ, class TW>
00206 TVec4 (TX xi, TY yi, TZ zi, TW wi){ X() = element_type(xi); Y() = element_type(yi); Z() = element_type(zi); W() = element_type(wi);}
00207
00208 protected:
00209 void set_default(){clear();}
00210 };
00211
00212
00213 typedef TVec2<float> Vec2f;
00214
00215 typedef TVec2<double> Vec2d;
00216
00217 typedef TVec3<float> Vec3f;
00218
00219 typedef TVec3<double> Vec3d;
00220
00221 typedef TVec4<float> Vec4f;
00222
00223 typedef TVec4<double> Vec4d;
00224
00225 #ifdef _WIN32
00226 #pragma pack(pop)
00227 #endif
00228
00229 #ifndef PTM_PACK // 単体で使用する場合は,namespace に入れない
00230 }
00231 #endif
00232
00233 #endif