Counter Strike : Global Offensive Source Code
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

346 lines
11 KiB

//--------------------------------------------------------------------------------------------------
/**
@file qhMath.h
@author Dirk Gregorius
@version 0.1
@date 30/11/2011
Copyright(C) 2011 by D. Gregorius. All rights reserved.
*/
//--------------------------------------------------------------------------------------------------
#pragma once
#include "qhTypes.h"
#include "qhArray.h"
#include <math.h>
#include <limits>
class qhVector3;
class qhMatrix3;
class qhQuaternion;
class qhTransform;
class qhPlane;
class qhBounds3;
#ifdef max
#undef max
#endif
#ifdef min
#undef min
#endif
#pragma warning( push )
#pragma warning( disable : 4201 ) // nameless structs/unions
//--------------------------------------------------------------------------------------------------
// qhConstants
//--------------------------------------------------------------------------------------------------
#define QH_PI qhReal( 3.14159265358 )
#define QH_2PI qhReal( 6.28318530717 )
#define QH_SQRT2 qhReal( 1.41421356237 )
#define QH_SQRT3 qhReal( 1.73205080757 )
#define QH_DEG2RAD ( QH_PI / qhReal( 180 ) )
#define QH_RAD2DEG ( qhReal( 180 ) / QH_PI )
//--------------------------------------------------------------------------------------------------
// qhMath
//--------------------------------------------------------------------------------------------------
qhReal qhSin( qhReal Rad );
qhReal qhCos( qhReal Rad );
qhReal qhTan( qhReal Rad );
qhReal qhArcSin( qhReal X );
qhReal qhArcCos( qhReal X );
qhReal qhArcTan( qhReal X );
qhReal qhArcTan2( qhReal Y, qhReal X );
qhReal qhAbs( qhReal X );
qhReal qhSqrt( qhReal X );
template< typename T > T qhMin( T X, T Y );
template< typename T > T qhMax( T X, T Y );
template< typename T > T qhClamp( T X, T Min, T Max );
//--------------------------------------------------------------------------------------------------
// qhVector3
//--------------------------------------------------------------------------------------------------
class qhVector3
{
public:
// Attributes
qhReal X, Y, Z;
// Construction
qhVector3( void );
qhVector3( qhReal X, qhReal Y, qhReal Z );
qhVector3( const qhReal* V );
// Conversion
operator qhReal*( void );
operator const qhReal*( void ) const;
// Assignment
qhVector3& operator*=( const qhVector3& V );
qhVector3& operator+=( const qhVector3& V );
qhVector3& operator-=( const qhVector3& V );
qhVector3& operator*=( qhReal S );
qhVector3& operator/=( qhReal S );
// Unary operators
qhVector3 operator+( void ) const;
qhVector3 operator-( void ) const;
};
// Binary operators
qhVector3 operator*( const qhMatrix3& M, const qhVector3& V );
qhVector3 operator*( const qhQuaternion& Q, const qhVector3& V );
qhVector3 operator*( const qhTransform& T, const qhVector3& V );
qhVector3 operator*( const qhVector3& V1, const qhVector3& V2 );
qhVector3 operator+( const qhVector3& V1, const qhVector3& V2 );
qhVector3 operator-( const qhVector3& V1, const qhVector3& V2 );
qhVector3 operator*( qhReal S, const qhVector3& V );
qhVector3 operator*( const qhVector3& V, qhReal S );
qhVector3 operator/( const qhVector3& V, qhReal S );
bool operator==( const qhVector3& V1, const qhVector3& V2 );
bool operator!=( const qhVector3& V1, const qhVector3& V2 );
// Standard vector operations
void qhStore( qhReal Dst[ 3 ], const qhVector3& V );
qhVector3 qhMul( const qhMatrix3& M, const qhVector3& V );
qhVector3 qhTMul( const qhMatrix3& M, const qhVector3& V );
qhVector3 qhMul( const qhQuaternion& Q, const qhVector3& V );
qhVector3 qhTMul( const qhQuaternion& Q, const qhVector3& V );
qhVector3 qhMul( const qhTransform& T, const qhVector3& V );
qhVector3 qhTMul( const qhTransform& T, const qhVector3& V );
qhVector3 qhMul( const qhVector3& V1, const qhVector3& V2 );
qhVector3 qhAdd( const qhVector3& V1, const qhVector3& V2 );
qhVector3 qhSub( const qhVector3& V1, const qhVector3& V2 );
qhVector3 qhCross( const qhVector3& V1, const qhVector3& V2 );
qhVector3 qhScale( const qhVector3& V, qhReal S );
qhVector3 qhNormalize( const qhVector3& V );
qhVector3 qhNegate( const qhVector3& V );
qhVector3 qhAbs( const qhVector3& V );
qhVector3 qhMin( const qhVector3& V1, const qhVector3& V2 );
qhVector3 qhMax( const qhVector3& V1, const qhVector3& V2 );
qhVector3 qhClamp( const qhVector3& V, const qhVector3& Min, const qhVector3& Max );
qhReal qhDot( const qhVector3& V1, const qhVector3& V2 );
qhReal qhLength( const qhVector3& V );
qhReal qhLengthSq( const qhVector3& V );
qhReal qhDistance( const qhVector3& V1, const qhVector3& V2 );
qhReal qhDistanceSq( const qhVector3& V1, const qhVector3& V2 );
qhReal qhDet( const qhVector3& V1, const qhVector3& V2, const qhVector3& V3 );
int qhMinElement( const qhVector3& V );
int qhMaxElement( const qhVector3& V );
// Constants
QH_GLOBAL_CONSTANT const qhVector3 QH_VEC3_ZERO = qhVector3( 0, 0, 0 );
QH_GLOBAL_CONSTANT const qhVector3 QH_VEC3_AXIS_X = qhVector3( 1, 0, 0 );
QH_GLOBAL_CONSTANT const qhVector3 QH_VEC3_AXIS_Y = qhVector3( 0, 1, 0 );
QH_GLOBAL_CONSTANT const qhVector3 QH_VEC3_AXIS_Z = qhVector3( 0, 0, 1 );
//--------------------------------------------------------------------------------------------------
// qhMatrix3
//--------------------------------------------------------------------------------------------------
class qhMatrix3
{
public:
// Attributes
qhVector3 C1, C2, C3;
// Construction
qhMatrix3( void );
qhMatrix3( qhReal A11, qhReal A22, qhReal A33 );
qhMatrix3( const qhVector3& C1, const qhVector3& C2, const qhVector3& C3 );
// Assignment
qhMatrix3& operator*=( const qhMatrix3& M );
qhMatrix3& operator+=( const qhMatrix3& M );
qhMatrix3& operator-=( const qhMatrix3& M );
qhMatrix3& operator*=( qhReal F );
qhMatrix3& operator/=( qhReal F );
// Unary operators
qhMatrix3 operator+( void ) const;
qhMatrix3 operator-( void ) const;
};
// Binary arithmetic operators
qhMatrix3 operator*( const qhMatrix3& M1, const qhMatrix3& M2 );
qhMatrix3 operator+( const qhMatrix3& M1, const qhMatrix3& M2 );
qhMatrix3 operator-( const qhMatrix3& M1, const qhMatrix3& M2 );
qhMatrix3 operator*( qhReal F, const qhMatrix3& M );
qhMatrix3 operator*( const qhMatrix3& M, qhReal F );
qhMatrix3 operator/( const qhMatrix3& M, qhReal F );
// Comparison operators
bool operator==( const qhMatrix3& M1, const qhMatrix3& M2 );
bool operator!=( const qhMatrix3& M1, const qhMatrix3& M2 );
// Standard matrix operations
qhMatrix3 qhMul( const qhMatrix3& M1, const qhMatrix3& M2 );
qhMatrix3 qhTMul( const qhMatrix3& M1, const qhMatrix3& M2 );
qhMatrix3 qhTranspose( const qhMatrix3& M );
qhMatrix3 qhAdjoint( const qhMatrix3& M );
qhMatrix3 qhInvert( const qhMatrix3& M );
qhMatrix3 qhInvertT( const qhMatrix3& M );
qhMatrix3 qhConvert( const qhQuaternion& Q );
qhMatrix3 qhSkew( const qhVector3& V );
qhReal qhTrace( const qhMatrix3& M );
qhReal qhDet( const qhMatrix3& M );
// Constants
QH_GLOBAL_CONSTANT const qhMatrix3 QH_MAT3_ZERO = qhMatrix3( qhVector3( 0, 0, 0 ), qhVector3( 0, 0, 0 ), qhVector3( 0, 0, 0 ) );
QH_GLOBAL_CONSTANT const qhMatrix3 QH_MAT3_IDENTITY = qhMatrix3( qhVector3( 1, 0, 0 ), qhVector3( 0, 1, 0 ), qhVector3( 0, 0, 1 ) );
//--------------------------------------------------------------------------------------------------
// qhQuaternion
//--------------------------------------------------------------------------------------------------
class qhQuaternion
{
public:
// Attributes
qhReal X, Y, Z, W;
// Construction
qhQuaternion( void );
qhQuaternion( qhReal X, qhReal Y, qhReal Z, qhReal W );
qhQuaternion( const qhVector3& V, qhReal S );
qhQuaternion( const qhReal* Q );
qhVector3 V( void ) const { return qhVector3( X, Y, Z ); }
qhReal S( void ) const { return W; }
};
qhQuaternion operator*( const qhQuaternion& Q1, const qhQuaternion& Q2 );
qhQuaternion qhRotation( const qhVector3& V1, const qhVector3& V2 );
qhQuaternion qhRotationX( qhReal Rad );
qhQuaternion qhRotationY( qhReal Rad );
qhQuaternion qhRotationZ( qhReal Rad );
qhQuaternion qhConjugate( const qhQuaternion& Q );
qhQuaternion qhNormalize( const qhQuaternion& Q );
qhReal qhDot( const qhQuaternion& Q1, const qhQuaternion& Q2 );
qhReal qhLength( const qhQuaternion& Q );
qhReal qhLengthSq( const qhQuaternion& Q );
// Constants
QH_GLOBAL_CONSTANT const qhQuaternion QH_QUAT_ZERO = qhQuaternion( 0, 0, 0, 0 );
QH_GLOBAL_CONSTANT const qhQuaternion QH_QUAT_IDENTITY = qhQuaternion( 0, 0, 0, 1 );
//--------------------------------------------------------------------------------------------------
// qhTranform
//--------------------------------------------------------------------------------------------------
class qhTransform
{
public:
// Attributes
qhMatrix3 Rotation;
qhVector3 Translation;
};
//--------------------------------------------------------------------------------------------------
// qhPlane
//--------------------------------------------------------------------------------------------------
class qhPlane
{
public:
// Attributes
qhVector3 Normal;
qhReal Offset;
// Construction
qhPlane( void );
qhPlane( const qhVector3& Normal, qhReal Offset );
qhPlane( const qhVector3& Normal, const qhVector3& Point );
qhPlane( const qhVector3& Point1, const qhVector3& Point2, const qhVector3& Point3 );
void Negate( void );
void Normalize( void );
void Translate( const qhVector3& Translation );
qhReal Distance( const qhVector3& Point ) const;
};
// Standard plane operations
void qhStore( qhReal Dst[ 4 ], const qhPlane& Plane );
//--------------------------------------------------------------------------------------------------
// qhPlane
//--------------------------------------------------------------------------------------------------
class qhBounds3
{
public:
// Attributes
qhVector3 Min, Max;
// Construction
qhBounds3( void );
qhBounds3( const qhVector3& Min, const qhVector3& Max );
// Assignment
qhBounds3& operator+=( const qhVector3& Point );
qhBounds3& operator+=( const qhBounds3& Bounds );
// Standard bounds operations
qhVector3 GetCenter( void ) const;
qhVector3 GetExtent( void ) const;
qhReal GetVolume( void ) const;
};
// Binary arithmetic operators
qhBounds3 operator+( const qhBounds3& Bounds1, const qhBounds3& Bounds2 );
// Comparison operators
bool operator==( const qhBounds3& Bounds1, const qhBounds3& Bounds2 );
bool operator!=( const qhBounds3& Bounds1, const qhBounds3& Bounds2 );
QH_GLOBAL_CONSTANT const qhBounds3 QH_BOUNDS3_EMPTY = qhBounds3( qhVector3( QH_REAL_MAX, QH_REAL_MAX, QH_REAL_MAX ), qhVector3( -QH_REAL_MAX, -QH_REAL_MAX, -QH_REAL_MAX ) );
QH_GLOBAL_CONSTANT const qhBounds3 QH_BOUNDS3_INFINITE = qhBounds3( qhVector3( -QH_REAL_MAX, -QH_REAL_MAX, -QH_REAL_MAX ), qhVector3( QH_REAL_MAX, QH_REAL_MAX, QH_REAL_MAX ) );
//--------------------------------------------------------------------------------------------------
// qhBox
//--------------------------------------------------------------------------------------------------
class qhBox
{
public:
qhVector3 Center;
qhQuaternion Orientation;
qhVector3 Extent;
void GetVertices( qhVector3 Vertices[ 8 ] ) const;
};
qhBox qhBestFit( const qhArray< qhVector3 >& Vertices, qhReal Threshold = qhReal( 1 ) );
qhBox qhBestFit( int VertexCount, const void* VertexBase, int VertexStride = 3 * sizeof( qhReal ), qhReal Threshold = qhReal( 1 ) );
#include "qhMath.inl"
#pragma warning( pop )