00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
#ifndef _ZFXMATH_INCLUDE_VECTOR3D_H_
00015
#define _ZFXMATH_INCLUDE_VECTOR3D_H_
00016
00017
namespace ZFXMath
00018 {
00019
00020
template<
typename T>
00021
struct TVector4D;
00022
00034
template<
typename T>
00035 struct TVector3D
00036 {
00037
union
00038
{
00039 T val[3];
00040
struct
00041
{
00042 T x, y, z;
00043 };
00044
struct
00045
{
00046 T r, g, b;
00047 };
00048 };
00049
00050
TVector3D() {};
00051
00052
TVector3D(
const T& _x,
const T& _y,
const T& _z ) { x=_x; y=_y; z=_z; }
00053
00054
TVector3D(
const T* pV ) { x = pV[0]; y = pV[1]; z = pV[2]; }
00055
TVector3D(
const T& val ) { x = y = z = val; }
00056
TVector3D(
const TVector3D& v ) { x = v.
x; y = v.
y; z = v.
z; }
00057
TVector3D(
const TVector2D<T>& v,
const T& _z ) { x = v.
x; y = v.
y; z = _z; }
00058
TVector3D(
const TVector4D<T>& v ) { x = v.x; y = v.y; z = v.z; }
00059
00060
00066 operator T* () {
return val; }
00067 operator const T* ()
const {
return val; }
00068
00074 T
operator () (
const int i )
const
00075
{
00076
return val[ Check( i ) ];
00077 }
00078
00084 T&
operator () (
const int i )
00085 {
00086
return val[ Check( i ) ];
00087 }
00088
00094 TVector3D&
operator = (
const T& val ) { x = y = z = val;
return *
this; }
00095
TVector3D& operator += (
const TVector3D& v ) { x += v.
x; y += v.
y; z += v.
z;
return *
this; }
00096 TVector3D& operator -= (
const TVector3D& v ) { x -= v.x; y -= v.y; z -= v.z;
return *
this; }
00097 TVector3D&
operator *= (
const TVector3D& v ) { x *= v.x; y *= v.y; z *= v.z;
return *
this; }
00098 TVector3D& operator /= (
const TVector3D& v ) { x /= v.x; y /= v.y; z /= v.z;
return *
this; }
00099
00105 TVector3D&
operator *= (
const T& v ) { x *= v; y *= v; z *= v;
return *
this; }
00106
TVector3D& operator /= (
const T& v ) { x /= v; y /= v; z /= v;
return *
this; }
00107
00113 TVector3D operator + ()
const {
return *
this; }
00114
TVector3D operator - ()
const {
return TVector3D(-x,-y,-z); }
00115
00121 TVector3D operator + (
const TVector3D& v )
const {
return TVector3D( x + v.
x, y + v.
y, z + v.
z ); }
00122
TVector3D operator - (
const TVector3D& v )
const {
return TVector3D( x - v.
x, y - v.
y, z - v.
z ); }
00123 TVector3D operator * (
const TVector3D& v )
const {
return TVector3D( x * v.x, y * v.y, z * v.z ); }
00124 TVector3D operator / (
const TVector3D& v )
const {
return TVector3D( x / v.x, y / v.y, z / v.z ); }
00125 TVector3D operator * (
const T& v )
const {
return TVector3D( x * v, y * v, z * v ); }
00126 TVector3D operator / (
const T& v )
const {
return TVector3D( x / v, y / v, z / v ); }
00127
friend TVector3D<T> operator * (
const T& val,
const TVector3D<T>& vec ) {
return TVector3D( vec.x * val, vec.y * val, vec.z * val ); }
00128
00134 unsigned long ColorToDWORD( T alpha = 1.0 )
00135 {
00136 ARGB color( r, g, b, alpha );
00137
00138
return color;
00139 };
00140
00146 unsigned long ToDWORD( T w = 0.0 )
00147 {
00148 ARGB packedVector( x * 0.5 + 0.5,
00149 y * 0.5 + 0.5,
00150 z * 0.5 + 0.5,
00151 w * 0.5 + 0.5 );
00152
00153
return packedVector;
00154 };
00155
00161 T
LengthSqr()
00162 {
00163
return DotProduct( *
this );
00164 };
00165
00171 T
Length()
00172 {
00173
return Sqrt(
LengthSqr() );
00174 };
00175
00187 TVector3D&
Normalize()
00188 {
00189
return (*this) /=
Length();
00190 };
00191
00197 T
DotProduct(
const TVector3D& v )
const {
return v.
x * x + v.
y * y + v.
z * z; }
00198
00204 T
Luminance()
const {
return DotProduct(
TVector3D( T(0.39), T(0.5), T(0.11) ) ); }
00205
00206
00216 TVector3D Reflect(
const TVector3D& n )
const
00217
{
00218
return TVector3D( (*
this) - 2 *
DotProduct( n ) * n );
00219 }
00220
00232 TVector3D Refract(
const TVector3D& n,
const T& ri )
const
00233
{
00234 T cos =
DotProduct( n ) * ri;
00235
00236
return Interpolate( (*
this), n, cos ).Normalize();
00237 }
00238
00239
private:
00240
inline int Check(
const int index )
const
00241
{
00242
00243 assert( index >= 0 && index < 3 );
00244
00245
return (index);
00246 }
00247 };
00248 }
00249
00250
#endif //_ZFXMATH_INCLUDE_VECTOR3D_H_
00251
00252
00253
00254