00001 #ifndef __VEC3__
00002 #define __VEC3__
00003
00004 #include "Vec2.h"
00005 #include <QString>
00006 #include <QDomElement>
00007 #include <QDomDocument>
00008
00009 namespace apig {
00010 class Vec4;
00011
00013 class Vec3 {
00014 public:
00015 Vec3(float x, float y, float z);
00016 Vec3(float c = 0);
00017 Vec3(Vec2 v, float z = 0);
00018 Vec3(float x, Vec2 yz);
00019 Vec3(const float *v);
00020 Vec3(Vec4 vec);
00021 Vec3(const QDomElement &element);
00022
00023
00024
00025
00026 inline operator const float* () const { return v; }
00027 inline operator float* () { return v; }
00028
00029 QString toQString() const;
00030 Vec4 toVec4() const;
00031
00032 void initFromDOMElement(const QDomElement &element);
00033 QDomElement domElement(const QString &name, QDomDocument &document) const;
00034
00035
00036
00037 float norm() const;
00038 float norm2() const;
00039 void normalize();
00040 Vec3 normalized() const;
00041
00042 friend Vec3 vec(const Vec3 &a, const Vec3 &b);
00043 friend float dot(const Vec3 &a, const Vec3 &b);
00044 friend Vec3 operator^(const Vec3 &a, const Vec3 &b) { return vec(a,b); }
00045 friend float operator|(const Vec3 &a, const Vec3 &b) { return dot(a,b); }
00046
00047 friend float dist(Vec3 v1, Vec3 v2);
00048 friend Vec3 triangleNormal(const Vec3 &a, const Vec3 &b, const Vec3 &c);
00049
00050 Vec3 ortho() const;
00051
00052
00053
00054
00055 friend Vec3 operator-(const Vec3 &a);
00056
00057
00058 friend Vec3 operator+(const Vec3 &a, const Vec3 &b);
00059 friend Vec3 operator-(const Vec3 &a, const Vec3 &b);
00060 friend Vec3 operator*(const Vec3 &a, const Vec3 &b);
00061 friend Vec3 operator/(const Vec3 &a, const Vec3 &b);
00062
00063
00064 friend Vec3 operator*(float s, const Vec3 &a);
00065 friend Vec3 operator*(const Vec3 &a, float s);
00066 friend Vec3 operator/(float s, const Vec3 &a);
00067 friend Vec3 operator/(const Vec3 &a, float s);
00068
00069
00070 Vec3& operator+=(const Vec3 &a);
00071 Vec3& operator-=(const Vec3 &a);
00072 Vec3& operator*=(const Vec3 &a);
00073 Vec3& operator/=(const Vec3 &a);
00074 Vec3& operator*=(float s);
00075 Vec3& operator/=(float s);
00076
00077
00078
00079 friend bool operator==(const Vec3 &a, const Vec3 &b);
00080 friend bool operator!=(const Vec3 &a, const Vec3 &b);
00081
00082 friend bool operator>=(const Vec3 &a, const Vec3 &b);
00083 friend bool operator<=(const Vec3 &a, const Vec3 &b);
00084 friend bool operator>(const Vec3 &a, const Vec3 &b);
00085 friend bool operator<(const Vec3 &a, const Vec3 &b);
00086 friend bool operator>=(const Vec3 &a, float b);
00087 friend bool operator<=(const Vec3 &a, float b);
00088 friend bool operator>(const Vec3 &a, float b);
00089 friend bool operator<(const Vec3 &a, float b);
00090
00091
00092
00093 friend Vec3 abs(const Vec3 &a);
00094 friend Vec3 sign(const Vec3 &a);
00095 friend Vec3 floor(const Vec3 &a);
00096 friend Vec3 ceil(const Vec3 &a);
00097 friend Vec3 fract(const Vec3 &a);
00098 friend Vec3 min(const Vec3 &a, const Vec3 &b);
00099 friend Vec3 min(const Vec3 &a, float b);
00100 friend Vec3 max(const Vec3 &a, const Vec3 &b);
00101 friend Vec3 max(const Vec3 &a, float b);
00102 friend Vec3 clamp(const Vec3 &a, const Vec3 &min, const Vec3 &max);
00103 friend Vec3 clamp(const Vec3 &a, float min, float max);
00104 friend Vec3 mix(const Vec3 &a, const Vec3 &b, const Vec3 &alpha);
00105 friend Vec3 mix(const Vec3 &a, const Vec3 &b, float alpha);
00106 friend Vec3 step(const Vec3 &e, const Vec3 &a);
00107 friend Vec3 step(float e, const Vec3 &a);
00108 friend float min(const Vec3 &a);
00109 friend float max(const Vec3 &a);
00110
00111
00112
00113 Vec2 xx() const { return Vec2(x,x); }
00114 Vec2 xy() const { return Vec2(x,y); }
00115 Vec2 xz() const { return Vec2(x,z); }
00116 Vec2 yx() const { return Vec2(y,x); }
00117 Vec2 yy() const { return Vec2(y,y); }
00118 Vec2 yz() const { return Vec2(y,z); }
00119 Vec2 zx() const { return Vec2(z,x); }
00120 Vec2 zy() const { return Vec2(z,y); }
00121 Vec2 zz() const { return Vec2(z,z); }
00122
00123 Vec3 yzx() const { return Vec3(y,z,x); }
00124 Vec3 zxy() const { return Vec3(z,x,y); }
00125
00126
00127
00128 static Vec3 random();
00129 static Vec3 random(float min, float max);
00130 static Vec3 random(Vec3 min, Vec3 max);
00131 static Vec3 randomDir();
00132
00133
00134
00135
00136 void glVertex() const;
00137 void glNormal() const;
00138
00139 public:
00140 union {
00141 struct { float x, y, z; };
00142 float v[3];
00143 };
00144 };
00145
00146 }
00147
00148 #endif
00149