template <class T> struct Vec3
{
typedef T ElemType;
static uint ElemGLID;
enum { ElemCount = 3 };
Vec3<T>() { x = y = z = 0; }
Vec3<T>(T x, T y, T z) : x(x), y(y), z(z) { }
Vec3<T>(const Vec3<T>& u) : x(u.x), y(u.y), z(u.z) { }
explicit Vec3<T>(const T val) : x(val), y(val), z(val) { }
explicit Vec3<T>(const T* xyz) : x(xyz[0]), y(xyz[1]), z(xyz[2]) { }
explicit Vec3<T>(const Vec2<T>& u) : x(u.x), y(u.y), z((T)1) { }
explicit Vec3<T>(const Vec4<T>&);
inline void Set(T _x, T _y, T _z) { x = _x; y = _y; z = _z; }
inline Vec3<T>& operator=(T val) { Set(val,val,val); return *this; }
inline Vec3<T>& operator=(const Vec3<T>& v) { Set(v.x,v.y,v.z); return *this; }
inline Vec3<T>& operator=(const Vec4<T>& v);
Bool operator==(const Vec3<T> & u) const
{
return (u.x == x && u.y == y && u.z == z) ? true : false;
}
typedef T* pointer;
operator pointer() { return &x; }
operator const pointer() const { return (const pointer)&x; }
union {
struct {
T x,y,z;
};
struct {
T s,t,u;
};
struct {
T r,g,b;
};
T elem[3]; // array access
};
};