X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fnetradiant.git;a=blobdiff_plain;f=libs%2Fsplines%2Fmath_vector.h;fp=libs%2Fsplines%2Fmath_vector.h;h=dde072578cc470a2b805c13052205c3de0398f15;hp=faea5eb9abf80b2513454fb77b59313b3cef9c03;hb=e4287c28bb2dafedc81c66e63951d947cfbeb225;hpb=203343b01a7ad87cb3d136689c9936ff5bc23c01 diff --git a/libs/splines/math_vector.h b/libs/splines/math_vector.h index faea5eb9..dde07257 100644 --- a/libs/splines/math_vector.h +++ b/libs/splines/math_vector.h @@ -1,23 +1,23 @@ /* -Copyright (C) 1999-2006 Id Software, Inc. and contributors. -For a list of contributors, see the accompanying CONTRIBUTORS file. + Copyright (C) 1999-2006 Id Software, Inc. and contributors. + For a list of contributors, see the accompanying CONTRIBUTORS file. -This file is part of GtkRadiant. + This file is part of GtkRadiant. -GtkRadiant is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. + GtkRadiant is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. -GtkRadiant is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. + GtkRadiant is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. -You should have received a copy of the GNU General Public License -along with GtkRadiant; if not, write to the Free Software -Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ + You should have received a copy of the GNU General Public License + along with GtkRadiant; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ #ifndef __MATH_VECTOR_H__ #define __MATH_VECTOR_H__ @@ -36,36 +36,36 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA //#define VectorCopy(a,b) ((b).x=(a).x,(b).y=(a).y,(b).z=(a).z]) //#define VectorScale(v, s, o) ((o)[0]=(v)[0]*(s),(o)[1]=(v)[1]*(s),(o)[2]=(v)[2]*(s)) -#define __VectorMA(v, s, b, o) ((o)[0]=(v)[0]+(b)[0]*(s),(o)[1]=(v)[1]+(b)[1]*(s),(o)[2]=(v)[2]+(b)[2]*(s)) +#define __VectorMA( v, s, b, o ) ( ( o )[0] = ( v )[0] + ( b )[0] * ( s ),( o )[1] = ( v )[1] + ( b )[1] * ( s ),( o )[2] = ( v )[2] + ( b )[2] * ( s ) ) //#define CrossProduct(a,b,c) ((c)[0]=(a)[1]*(b)[2]-(a)[2]*(b)[1],(c)[1]=(a)[2]*(b)[0]-(a)[0]*(b)[2],(c)[2]=(a)[0]*(b)[1]-(a)[1]*(b)[0]) -#define DotProduct4(x,y) ((x)[0]*(y)[0]+(x)[1]*(y)[1]+(x)[2]*(y)[2]+(x)[3]*(y)[3]) -#define VectorSubtract4(a,b,c) ((c)[0]=(a)[0]-(b)[0],(c)[1]=(a)[1]-(b)[1],(c)[2]=(a)[2]-(b)[2],(c)[3]=(a)[3]-(b)[3]) -#define VectorAdd4(a,b,c) ((c)[0]=(a)[0]+(b)[0],(c)[1]=(a)[1]+(b)[1],(c)[2]=(a)[2]+(b)[2],(c)[3]=(a)[3]+(b)[3]) -#define VectorCopy4(a,b) ((b)[0]=(a)[0],(b)[1]=(a)[1],(b)[2]=(a)[2],(b)[3]=(a)[3]) -#define VectorScale4(v, s, o) ((o)[0]=(v)[0]*(s),(o)[1]=(v)[1]*(s),(o)[2]=(v)[2]*(s),(o)[3]=(v)[3]*(s)) -#define VectorMA4(v, s, b, o) ((o)[0]=(v)[0]+(b)[0]*(s),(o)[1]=(v)[1]+(b)[1]*(s),(o)[2]=(v)[2]+(b)[2]*(s),(o)[3]=(v)[3]+(b)[3]*(s)) +#define DotProduct4( x,y ) ( ( x )[0] * ( y )[0] + ( x )[1] * ( y )[1] + ( x )[2] * ( y )[2] + ( x )[3] * ( y )[3] ) +#define VectorSubtract4( a,b,c ) ( ( c )[0] = ( a )[0] - ( b )[0],( c )[1] = ( a )[1] - ( b )[1],( c )[2] = ( a )[2] - ( b )[2],( c )[3] = ( a )[3] - ( b )[3] ) +#define VectorAdd4( a,b,c ) ( ( c )[0] = ( a )[0] + ( b )[0],( c )[1] = ( a )[1] + ( b )[1],( c )[2] = ( a )[2] + ( b )[2],( c )[3] = ( a )[3] + ( b )[3] ) +#define VectorCopy4( a,b ) ( ( b )[0] = ( a )[0],( b )[1] = ( a )[1],( b )[2] = ( a )[2],( b )[3] = ( a )[3] ) +#define VectorScale4( v, s, o ) ( ( o )[0] = ( v )[0] * ( s ),( o )[1] = ( v )[1] * ( s ),( o )[2] = ( v )[2] * ( s ),( o )[3] = ( v )[3] * ( s ) ) +#define VectorMA4( v, s, b, o ) ( ( o )[0] = ( v )[0] + ( b )[0] * ( s ),( o )[1] = ( v )[1] + ( b )[1] * ( s ),( o )[2] = ( v )[2] + ( b )[2] * ( s ),( o )[3] = ( v )[3] + ( b )[3] * ( s ) ) //#define VectorClear(a) ((a)[0]=(a)[1]=(a)[2]=0) -#define VectorNegate(a,b) ((b)[0]=-(a)[0],(b)[1]=-(a)[1],(b)[2]=-(a)[2]) +#define VectorNegate( a,b ) ( ( b )[0] = -( a )[0],( b )[1] = -( a )[1],( b )[2] = -( a )[2] ) //#define VectorSet(v, x, y, z) ((v)[0]=(x), (v)[1]=(y), (v)[2]=(z)) -#define Vector4Copy(a,b) ((b)[0]=(a)[0],(b)[1]=(a)[1],(b)[2]=(a)[2],(b)[3]=(a)[3]) +#define Vector4Copy( a,b ) ( ( b )[0] = ( a )[0],( b )[1] = ( a )[1],( b )[2] = ( a )[2],( b )[3] = ( a )[3] ) -#define SnapVector(v) {v[0]=(int)v[0];v[1]=(int)v[1];v[2]=(int)v[2];} +#define SnapVector( v ) {v[0] = (int)v[0]; v[1] = (int)v[1]; v[2] = (int)v[2]; } //#include "util_heap.h" #ifndef EQUAL_EPSILON -#define EQUAL_EPSILON 0.001 +#define EQUAL_EPSILON 0.001 #endif float Q_fabs( float f ); #ifndef ID_INLINE #ifdef _WIN32 -#define ID_INLINE __inline +#define ID_INLINE __inline #else #define ID_INLINE inline #endif @@ -80,104 +80,105 @@ float Q_fabs( float f ); class angles_t; #ifdef __ppc__ -// Vanilla PPC code, but since PPC has a reciprocal square root estimate instruction, -// runs *much* faster than calling sqrt(). We'll use two Newton-Raphson -// refinement steps to get bunch more precision in the 1/sqrt() value for very little cost. -// We'll then multiply 1/sqrt times the original value to get the sqrt. -// This is about 12.4 times faster than sqrt() and according to my testing (not exhaustive) -// it returns fairly accurate results (error below 1.0e-5 up to 100000.0 in 0.1 increments). - -static inline float idSqrt(float x) { - const float half = 0.5; - const float one = 1.0; - float B, y0, y1; - - // This'll NaN if it hits frsqrte. Handle both +0.0 and -0.0 - if (fabs(x) == 0.0) - return x; - B = x; - +// Vanilla PPC code, but since PPC has a reciprocal square root estimate instruction, +// runs *much* faster than calling sqrt(). We'll use two Newton-Raphson +// refinement steps to get bunch more precision in the 1/sqrt() value for very little cost. +// We'll then multiply 1/sqrt times the original value to get the sqrt. +// This is about 12.4 times faster than sqrt() and according to my testing (not exhaustive) +// it returns fairly accurate results (error below 1.0e-5 up to 100000.0 in 0.1 increments). + +static inline float idSqrt( float x ) { + const float half = 0.5; + const float one = 1.0; + float B, y0, y1; + + // This'll NaN if it hits frsqrte. Handle both +0.0 and -0.0 + if ( fabs( x ) == 0.0 ) { + return x; + } + B = x; + #ifdef __GNUC__ - asm("frsqrte %0,%1" : "=f" (y0) : "f" (B)); + asm ( "frsqrte %0,%1" : "=f" ( y0 ) : "f" ( B ) ); #else - y0 = __frsqrte(B); + y0 = __frsqrte( B ); #endif - /* First refinement step */ - - y1 = y0 + half*y0*(one - B*y0*y0); - - /* Second refinement step -- copy the output of the last step to the input of this step */ - - y0 = y1; - y1 = y0 + half*y0*(one - B*y0*y0); - - /* Get sqrt(x) from x * 1/sqrt(x) */ - return x * y1; + /* First refinement step */ + + y1 = y0 + half * y0 * ( one - B * y0 * y0 ); + + /* Second refinement step -- copy the output of the last step to the input of this step */ + + y0 = y1; + y1 = y0 + half * y0 * ( one - B * y0 * y0 ); + + /* Get sqrt(x) from x * 1/sqrt(x) */ + return x * y1; } #else -static inline double idSqrt(double x) { - return sqrt(x); +static inline double idSqrt( double x ) { + return sqrt( x ); } #endif //class idVec3 : public idHeap { class idVec3 { -public: -#ifndef FAT_VEC3 - float x,y,z; +public: +#ifndef FAT_VEC3 +float x,y,z; #else - float x,y,z,dist; +float x,y,z,dist; #endif -#ifndef FAT_VEC3 - idVec3() {}; +#ifndef FAT_VEC3 +idVec3() {}; #else - idVec3() {dist = 0.0f;}; +idVec3() {dist = 0.0f; }; #endif - idVec3( const float x, const float y, const float z ); +idVec3( const float x, const float y, const float z ); - operator float *(); +operator float *(); - float operator[]( const int index ) const; - float &operator[]( const int index ); +float operator[]( const int index ) const; +float &operator[]( const int index ); - void set( const float x, const float y, const float z ); +void set( const float x, const float y, const float z ); - idVec3 operator-() const; +idVec3 operator-() const; - idVec3 &operator=( const idVec3 &a ); +idVec3 &operator=( const idVec3 &a ); - float operator*( const idVec3 &a ) const; - idVec3 operator*( const float a ) const; - friend idVec3 operator*( float a, idVec3 b ); +float operator*( const idVec3 &a ) const; +idVec3 operator*( const float a ) const; +friend idVec3 operator*( float a, idVec3 b ); - idVec3 operator+( const idVec3 &a ) const; - idVec3 operator-( const idVec3 &a ) const; - - idVec3 &operator+=( const idVec3 &a ); - idVec3 &operator-=( const idVec3 &a ); - idVec3 &operator*=( const float a ); +idVec3 operator+( const idVec3 &a ) const; +idVec3 operator-( const idVec3 &a ) const; - int operator==( const idVec3 &a ) const; - int operator!=( const idVec3 &a ) const; +idVec3 &operator+=( const idVec3 &a ); +idVec3 &operator-=( const idVec3 &a ); +idVec3 &operator*=( const float a ); - idVec3 Cross( const idVec3 &a ) const; - idVec3 &Cross( const idVec3 &a, const idVec3 &b ); +int operator==( const idVec3 &a ) const; +int operator!=( const idVec3 &a ) const; - float Length( void ) const; - float Normalize( void ); +idVec3 Cross( const idVec3 &a ) const; +idVec3 &Cross( const idVec3 &a, const idVec3 &b ); - void Zero( void ); - void Snap( void ); - void SnapTowards( const idVec3 &to ); +float Length( void ) const; +float Normalize( void ); - float toYaw( void ); - float toPitch( void ); - angles_t toAngles( void ); - friend idVec3 LerpVector( const idVec3 &w1, const idVec3 &w2, const float t ); +void Zero( void ); +void Snap( void ); +void SnapTowards( const idVec3 &to ); - char *string( void ); +float toYaw( void ); +float toPitch( void ); +angles_t toAngles( void ); +friend idVec3 LerpVector( const idVec3 &w1, const idVec3 &w2, const float t ); + +char *string( void ); }; extern idVec3 vec_zero; @@ -186,7 +187,7 @@ ID_INLINE idVec3::idVec3( const float x, const float y, const float z ) { this->x = x; this->y = y; this->z = z; -#ifdef FAT_VEC3 +#ifdef FAT_VEC3 this->dist = 0.0f; #endif } @@ -206,12 +207,12 @@ ID_INLINE idVec3::operator float *( void ) { ID_INLINE idVec3 idVec3::operator-() const { return idVec3( -x, -y, -z ); } - -ID_INLINE idVec3 &idVec3::operator=( const idVec3 &a ) { + +ID_INLINE idVec3 &idVec3::operator=( const idVec3 &a ) { x = a.x; y = a.y; z = a.z; - + return *this; } @@ -269,7 +270,7 @@ ID_INLINE int idVec3::operator==( const idVec3 &a ) const { if ( Q_fabs( x - a.x ) > EQUAL_EPSILON ) { return false; } - + if ( Q_fabs( y - a.y ) > EQUAL_EPSILON ) { return false; } @@ -285,7 +286,7 @@ ID_INLINE int idVec3::operator!=( const idVec3 &a ) const { if ( Q_fabs( x - a.x ) > EQUAL_EPSILON ) { return true; } - + if ( Q_fabs( y - a.y ) > EQUAL_EPSILON ) { return true; } @@ -311,7 +312,7 @@ ID_INLINE idVec3 &idVec3::Cross( const idVec3 &a, const idVec3 &b ) { ID_INLINE float idVec3::Length( void ) const { float length; - + length = x * x + y * y + z * z; return ( float )idSqrt( length ); } @@ -327,7 +328,7 @@ ID_INLINE float idVec3::Normalize( void ) { y *= ilength; z *= ilength; } - + return length; } @@ -344,31 +345,34 @@ ID_INLINE void idVec3::Snap( void ) { } /* -====================== -SnapTowards - -Round a vector to integers for more efficient network -transmission, but make sure that it rounds towards a given point -rather than blindly truncating. This prevents it from truncating -into a wall. -====================== -*/ + ====================== + SnapTowards + + Round a vector to integers for more efficient network + transmission, but make sure that it rounds towards a given point + rather than blindly truncating. This prevents it from truncating + into a wall. + ====================== + */ ID_INLINE void idVec3::SnapTowards( const idVec3 &to ) { if ( to.x <= x ) { x = float( int( x ) ); - } else { + } + else { x = float( int( x ) + 1 ); } if ( to.y <= y ) { y = float( int( y ) ); - } else { + } + else { y = float( int( y ) + 1 ); } if ( to.z <= z ) { z = float( int( z ) ); - } else { + } + else { z = float( int( z ) + 1 ); } } @@ -377,23 +381,23 @@ ID_INLINE void idVec3::SnapTowards( const idVec3 &to ) { class Bounds { public: - idVec3 b[2]; - - Bounds(); - Bounds( const idVec3 &mins, const idVec3 &maxs ); - - void Clear(); - void Zero(); - float Radius(); // radius from origin, not from center - idVec3 Center(); - void AddPoint( const idVec3 &v ); - void AddBounds( const Bounds &bb ); - bool IsCleared(); - bool ContainsPoint( const idVec3 &p ); - bool IntersectsBounds( const Bounds &b2 ); // touching is NOT intersecting +idVec3 b[2]; + +Bounds(); +Bounds( const idVec3 &mins, const idVec3 &maxs ); + +void Clear(); +void Zero(); +float Radius(); // radius from origin, not from center +idVec3 Center(); +void AddPoint( const idVec3 &v ); +void AddBounds( const Bounds &bb ); +bool IsCleared(); +bool ContainsPoint( const idVec3 &p ); +bool IntersectsBounds( const Bounds &b2 ); // touching is NOT intersecting }; -extern Bounds boundsZero; +extern Bounds boundsZero; ID_INLINE Bounds::Bounds(){ } @@ -404,7 +408,7 @@ ID_INLINE bool Bounds::IsCleared() { ID_INLINE bool Bounds::ContainsPoint( const idVec3 &p ) { if ( p[0] < b[0][0] || p[1] < b[0][1] || p[2] < b[0][2] - || p[0] > b[1][0] || p[1] > b[1][1] || p[2] > b[1][2] ) { + || p[0] > b[1][0] || p[1] > b[1][1] || p[2] > b[1][2] ) { return false; } return true; @@ -412,7 +416,7 @@ ID_INLINE bool Bounds::ContainsPoint( const idVec3 &p ) { ID_INLINE bool Bounds::IntersectsBounds( const Bounds &b2 ) { if ( b2.b[1][0] < b[0][0] || b2.b[1][1] < b[0][1] || b2.b[1][2] < b[0][2] - || b2.b[0][0] > b[1][0] || b2.b[0][1] > b[1][1] || b2.b[0][2] > b[1][2] ) { + || b2.b[0][0] > b[1][0] || b2.b[0][1] > b[1][1] || b2.b[0][2] > b[1][2] ) { return false; } return true; @@ -434,60 +438,60 @@ ID_INLINE void Bounds::Clear() { ID_INLINE void Bounds::Zero() { b[0][0] = b[0][1] = b[0][2] = - b[1][0] = b[1][1] = b[1][2] = 0; + b[1][0] = b[1][1] = b[1][2] = 0; } ID_INLINE void Bounds::AddPoint( const idVec3 &v ) { - if ( v[0] < b[0][0]) { + if ( v[0] < b[0][0] ) { b[0][0] = v[0]; } - if ( v[0] > b[1][0]) { + if ( v[0] > b[1][0] ) { b[1][0] = v[0]; } if ( v[1] < b[0][1] ) { b[0][1] = v[1]; } - if ( v[1] > b[1][1]) { + if ( v[1] > b[1][1] ) { b[1][1] = v[1]; } if ( v[2] < b[0][2] ) { b[0][2] = v[2]; } - if ( v[2] > b[1][2]) { + if ( v[2] > b[1][2] ) { b[1][2] = v[2]; } } ID_INLINE void Bounds::AddBounds( const Bounds &bb ) { - if ( bb.b[0][0] < b[0][0]) { + if ( bb.b[0][0] < b[0][0] ) { b[0][0] = bb.b[0][0]; } - if ( bb.b[0][1] < b[0][1]) { + if ( bb.b[0][1] < b[0][1] ) { b[0][1] = bb.b[0][1]; } - if ( bb.b[0][2] < b[0][2]) { + if ( bb.b[0][2] < b[0][2] ) { b[0][2] = bb.b[0][2]; } - if ( bb.b[1][0] > b[1][0]) { + if ( bb.b[1][0] > b[1][0] ) { b[1][0] = bb.b[1][0]; } - if ( bb.b[1][1] > b[1][1]) { + if ( bb.b[1][1] > b[1][1] ) { b[1][1] = bb.b[1][1]; } - if ( bb.b[1][2] > b[1][2]) { + if ( bb.b[1][2] > b[1][2] ) { b[1][2] = bb.b[1][2]; } } -ID_INLINE float Bounds::Radius( ) { - int i; - float total; - float a, aa; +ID_INLINE float Bounds::Radius() { + int i; + float total; + float a, aa; total = 0; - for (i=0 ; i<3 ; i++) { + for ( i = 0 ; i < 3 ; i++ ) { a = (float)fabs( b[0][i] ); aa = (float)fabs( b[1][i] ); if ( aa > a ) { @@ -504,12 +508,12 @@ ID_INLINE float Bounds::Radius( ) { class idVec2 { public: - float x; - float y; +float x; +float y; - operator float *(); - float operator[]( int index ) const; - float &operator[]( int index ); +operator float *(); +float operator[]( int index ) const; +float &operator[]( int index ); }; ID_INLINE float idVec2::operator[]( int index ) const { @@ -526,15 +530,15 @@ ID_INLINE idVec2::operator float *( void ) { class idVec4 : public idVec3 { public: -#ifndef FAT_VEC3 - float dist; +#ifndef FAT_VEC3 +float dist; #endif - idVec4(); - ~idVec4() {}; - - idVec4( float x, float y, float z, float dist ); - float operator[]( int index ) const; - float &operator[]( int index ); +idVec4(); +~idVec4() {}; + +idVec4( float x, float y, float z, float dist ); +float operator[]( int index ) const; +float &operator[]( int index ); }; ID_INLINE idVec4::idVec4() {} @@ -556,10 +560,10 @@ ID_INLINE float& idVec4::operator[]( int index ) { class idVec5_t : public idVec3 { public: - float s; - float t; - float operator[]( int index ) const; - float &operator[]( int index ); +float s; +float t; +float operator[]( int index ) const; +float &operator[]( int index ); };