//this code has been snipped out of the DX SDK to remove the NV code's //dependency on what is otherwise a 200+MB download that won't run on Linux. // //I've also put it all in a namespace since it defines way more symbols than //I care to have kicking around my intellisense popup - PD #ifdef _MSC_VER //GCC doesn't like these #pragma once #endif #ifndef __DXVec_h_ #define __DXVec_h_ namespace dx { //From the top of d3dx9.h //Copyright (C) Microsoft Corporation. All Rights Reserved. typedef struct _D3DVECTOR { float x; float y; float z; } D3DVECTOR; typedef float FLOAT; typedef int BOOL; #ifndef D3DXINLINE #ifdef _MSC_VER #if (_MSC_VER >= 1200) #define D3DXINLINE __forceinline #else #define D3DXINLINE __inline #endif #else #ifdef __cplusplus #define D3DXINLINE inline #else #define D3DXINLINE #endif #endif #endif #ifndef CONST #define CONST const #endif #ifndef IN #define IN #endif #ifndef OUT #define OUT #endif #ifndef OPTIONAL #define OPTIONAL #endif typedef struct D3DXVECTOR3 : public D3DVECTOR { public: D3DXVECTOR3() {}; D3DXVECTOR3( CONST FLOAT * ); D3DXVECTOR3( CONST D3DVECTOR& ); D3DXVECTOR3( FLOAT x, FLOAT y, FLOAT z ); // casting operator FLOAT* (); operator CONST FLOAT* () const; // assignment operators D3DXVECTOR3& operator += ( CONST D3DXVECTOR3& ); D3DXVECTOR3& operator -= ( CONST D3DXVECTOR3& ); D3DXVECTOR3& operator *= ( FLOAT ); D3DXVECTOR3& operator /= ( FLOAT ); // unary operators D3DXVECTOR3 operator + () const; D3DXVECTOR3 operator - () const; // binary operators D3DXVECTOR3 operator + ( CONST D3DXVECTOR3& ) const; D3DXVECTOR3 operator - ( CONST D3DXVECTOR3& ) const; D3DXVECTOR3 operator * ( FLOAT ) const; D3DXVECTOR3 operator / ( FLOAT ) const; friend D3DXVECTOR3 operator * ( FLOAT, CONST struct D3DXVECTOR3& ); BOOL operator == ( CONST D3DXVECTOR3& ) const; BOOL operator != ( CONST D3DXVECTOR3& ) const; } D3DXVECTOR3, *LPD3DXVECTOR3; FLOAT D3DXVec3Length ( CONST D3DXVECTOR3 *pV ); FLOAT D3DXVec3LengthSq ( CONST D3DXVECTOR3 *pV ); FLOAT D3DXVec3Dot ( CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2 ); D3DXVECTOR3* D3DXVec3Cross ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2 ); D3DXVECTOR3* D3DXVec3Add ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2 ); D3DXVECTOR3* D3DXVec3Subtract ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2 ); // Minimize each component. x = min(x1, x2), y = min(y1, y2), ... D3DXVECTOR3* D3DXVec3Minimize ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2 ); // Maximize each component. x = max(x1, x2), y = max(y1, y2), ... D3DXVECTOR3* D3DXVec3Maximize ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2 ); D3DXVECTOR3* D3DXVec3Scale ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV, FLOAT s); // Linear interpolation. V1 + s(V2-V1) D3DXVECTOR3* D3DXVec3Lerp ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2, FLOAT s ); D3DXINLINE FLOAT D3DXVec3Length ( CONST D3DXVECTOR3 *pV ) { #ifdef D3DX_DEBUG if(!pV) return 0.0f; #endif #ifdef __cplusplus return sqrtf(pV->x * pV->x + pV->y * pV->y + pV->z * pV->z); #else return (FLOAT) sqrt(pV->x * pV->x + pV->y * pV->y + pV->z * pV->z); #endif } D3DXINLINE FLOAT D3DXVec3LengthSq ( CONST D3DXVECTOR3 *pV ) { #ifdef D3DX_DEBUG if(!pV) return 0.0f; #endif return pV->x * pV->x + pV->y * pV->y + pV->z * pV->z; } D3DXINLINE FLOAT D3DXVec3Dot ( CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2 ) { #ifdef D3DX_DEBUG if(!pV1 || !pV2) return 0.0f; #endif return pV1->x * pV2->x + pV1->y * pV2->y + pV1->z * pV2->z; } D3DXINLINE D3DXVECTOR3* D3DXVec3Cross ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2 ) { D3DXVECTOR3 v; #ifdef D3DX_DEBUG if(!pOut || !pV1 || !pV2) return NULL; #endif v.x = pV1->y * pV2->z - pV1->z * pV2->y; v.y = pV1->z * pV2->x - pV1->x * pV2->z; v.z = pV1->x * pV2->y - pV1->y * pV2->x; *pOut = v; return pOut; } D3DXINLINE D3DXVECTOR3* D3DXVec3Add ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2 ) { #ifdef D3DX_DEBUG if(!pOut || !pV1 || !pV2) return NULL; #endif pOut->x = pV1->x + pV2->x; pOut->y = pV1->y + pV2->y; pOut->z = pV1->z + pV2->z; return pOut; } D3DXINLINE D3DXVECTOR3* D3DXVec3Subtract ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2 ) { #ifdef D3DX_DEBUG if(!pOut || !pV1 || !pV2) return NULL; #endif pOut->x = pV1->x - pV2->x; pOut->y = pV1->y - pV2->y; pOut->z = pV1->z - pV2->z; return pOut; } D3DXINLINE D3DXVECTOR3* D3DXVec3Minimize ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2 ) { #ifdef D3DX_DEBUG if(!pOut || !pV1 || !pV2) return NULL; #endif pOut->x = pV1->x < pV2->x ? pV1->x : pV2->x; pOut->y = pV1->y < pV2->y ? pV1->y : pV2->y; pOut->z = pV1->z < pV2->z ? pV1->z : pV2->z; return pOut; } D3DXINLINE D3DXVECTOR3* D3DXVec3Maximize ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2 ) { #ifdef D3DX_DEBUG if(!pOut || !pV1 || !pV2) return NULL; #endif pOut->x = pV1->x > pV2->x ? pV1->x : pV2->x; pOut->y = pV1->y > pV2->y ? pV1->y : pV2->y; pOut->z = pV1->z > pV2->z ? pV1->z : pV2->z; return pOut; } D3DXINLINE D3DXVECTOR3* D3DXVec3Scale ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV, FLOAT s) { #ifdef D3DX_DEBUG if(!pOut || !pV) return NULL; #endif pOut->x = pV->x * s; pOut->y = pV->y * s; pOut->z = pV->z * s; return pOut; } D3DXINLINE D3DXVECTOR3* D3DXVec3Lerp ( D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2, FLOAT s ) { #ifdef D3DX_DEBUG if(!pOut || !pV1 || !pV2) return NULL; #endif pOut->x = pV1->x + s * (pV2->x - pV1->x); pOut->y = pV1->y + s * (pV2->y - pV1->y); pOut->z = pV1->z + s * (pV2->z - pV1->z); return pOut; } D3DXINLINE D3DXVECTOR3::D3DXVECTOR3( CONST FLOAT *pf ) { #ifdef D3DX_DEBUG if(!pf) return; #endif x = pf[0]; y = pf[1]; z = pf[2]; } D3DXINLINE D3DXVECTOR3::D3DXVECTOR3( CONST D3DVECTOR& v ) { x = v.x; y = v.y; z = v.z; } D3DXINLINE D3DXVECTOR3::D3DXVECTOR3( FLOAT fx, FLOAT fy, FLOAT fz ) { x = fx; y = fy; z = fz; } // casting D3DXINLINE D3DXVECTOR3::operator FLOAT* () { return (FLOAT *) &x; } D3DXINLINE D3DXVECTOR3::operator CONST FLOAT* () const { return (CONST FLOAT *) &x; } // assignment operators D3DXINLINE D3DXVECTOR3& D3DXVECTOR3::operator += ( CONST D3DXVECTOR3& v ) { x += v.x; y += v.y; z += v.z; return *this; } D3DXINLINE D3DXVECTOR3& D3DXVECTOR3::operator -= ( CONST D3DXVECTOR3& v ) { x -= v.x; y -= v.y; z -= v.z; return *this; } D3DXINLINE D3DXVECTOR3& D3DXVECTOR3::operator *= ( FLOAT f ) { x *= f; y *= f; z *= f; return *this; } D3DXINLINE D3DXVECTOR3& D3DXVECTOR3::operator /= ( FLOAT f ) { FLOAT fInv = 1.0f / f; x *= fInv; y *= fInv; z *= fInv; return *this; } // unary operators D3DXINLINE D3DXVECTOR3 D3DXVECTOR3::operator + () const { return *this; } D3DXINLINE D3DXVECTOR3 D3DXVECTOR3::operator - () const { return D3DXVECTOR3(-x, -y, -z); } // binary operators D3DXINLINE D3DXVECTOR3 D3DXVECTOR3::operator + ( CONST D3DXVECTOR3& v ) const { return D3DXVECTOR3(x + v.x, y + v.y, z + v.z); } D3DXINLINE D3DXVECTOR3 D3DXVECTOR3::operator - ( CONST D3DXVECTOR3& v ) const { return D3DXVECTOR3(x - v.x, y - v.y, z - v.z); } D3DXINLINE D3DXVECTOR3 D3DXVECTOR3::operator * ( FLOAT f ) const { return D3DXVECTOR3(x * f, y * f, z * f); } D3DXINLINE D3DXVECTOR3 D3DXVECTOR3::operator / ( FLOAT f ) const { FLOAT fInv = 1.0f / f; return D3DXVECTOR3(x * fInv, y * fInv, z * fInv); } D3DXINLINE D3DXVECTOR3 operator * ( FLOAT f, CONST struct D3DXVECTOR3& v ) { return D3DXVECTOR3(f * v.x, f * v.y, f * v.z); } D3DXINLINE BOOL D3DXVECTOR3::operator == ( CONST D3DXVECTOR3& v ) const { return x == v.x && y == v.y && z == v.z; } D3DXINLINE BOOL D3DXVECTOR3::operator != ( CONST D3DXVECTOR3& v ) const { return x != v.x || y != v.y || z != v.z; } }; #endif