225 lines
4.1 KiB
C
225 lines
4.1 KiB
C
/*
|
|
|
|
Copyright (C) 2004 Michael Liebscher
|
|
Copyright (C) 1997-2001 Id Software, Inc.
|
|
|
|
This program 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.
|
|
|
|
This program 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 this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
*/
|
|
|
|
/*
|
|
* math.c: Math routines.
|
|
*
|
|
* Author: Michael Liebscher <johnnycanuck@users.sourceforge.net>
|
|
* Date: 2004
|
|
*
|
|
* Acknowledgement:
|
|
* This code was derived from Quake II, and was originally
|
|
* written by Id Software, Inc.
|
|
*
|
|
*/
|
|
|
|
#include "../wolfiphone.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////
|
|
//
|
|
// Square Root
|
|
//
|
|
////////////////////////////
|
|
|
|
/*
|
|
-----------------------------------------------------------------------------
|
|
Function: _sqrtf -Calculates the square root.
|
|
|
|
Parameters: x -[in] Nonnegative floating-point value
|
|
|
|
Returns: The square-root of x.
|
|
|
|
Notes:
|
|
-----------------------------------------------------------------------------
|
|
*/
|
|
PUBLIC float _sqrtf( float x )
|
|
{
|
|
return (float)sqrt( x );
|
|
}
|
|
|
|
|
|
/*
|
|
-----------------------------------------------------------------------------
|
|
Function: _3DNow_Sqrt -Calculates the square root.
|
|
|
|
Parameters: x -[in] Nonnegative floating-point value
|
|
|
|
Returns: The square-root of x.
|
|
|
|
Notes: 15-Bit Precision
|
|
-----------------------------------------------------------------------------
|
|
*/
|
|
#if __i386__
|
|
|
|
PUBLIC float _3DNow_Sqrt( float x )
|
|
{
|
|
float root = 0.f;
|
|
|
|
#if( _MSC_VER || __WATCOMC__ )
|
|
|
|
__asm
|
|
{
|
|
femms
|
|
movd mm0, x
|
|
pfrsqrt mm1, mm0
|
|
punpckldq mm0, mm0
|
|
pfmul mm0, mm1
|
|
movd root, mm0
|
|
femms
|
|
}
|
|
|
|
#endif
|
|
|
|
return root;
|
|
}
|
|
|
|
/*
|
|
-----------------------------------------------------------------------------
|
|
Function: _SSE_Sqrt -Calculates the square root.
|
|
|
|
Parameters: x -[in] Nonnegative floating-point value
|
|
|
|
Returns: The square-root of x.
|
|
|
|
Notes:
|
|
-----------------------------------------------------------------------------
|
|
*/
|
|
float _SSE_Sqrt( float x )
|
|
{
|
|
float root = 0.f;
|
|
|
|
#if( _MSC_VER || __WATCOMC__ )
|
|
|
|
__asm
|
|
{
|
|
sqrtss xmm0, x
|
|
movss root, xmm0
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|
return root;
|
|
}
|
|
|
|
#endif /* __i386__ */
|
|
|
|
////////////////////////////
|
|
//
|
|
// End Square Root
|
|
//
|
|
////////////////////////////
|
|
|
|
|
|
float (*pfSqrt)( float x ) = _sqrtf;
|
|
|
|
|
|
|
|
|
|
/*
|
|
-----------------------------------------------------------------------------
|
|
Function:
|
|
|
|
Parameters:
|
|
|
|
Returns:
|
|
|
|
Notes:
|
|
-----------------------------------------------------------------------------
|
|
*/
|
|
PUBLIC int my_log2( int val )
|
|
{
|
|
int answer = 0;
|
|
while( ( val >>= 1 ) != 0 )
|
|
{
|
|
answer++;
|
|
}
|
|
return answer;
|
|
}
|
|
|
|
/*
|
|
-----------------------------------------------------------------------------
|
|
Function: CalcFov -Calculate the field of view.
|
|
|
|
Parameters:fov_x -[in] Must be within 1 and 179 degrees.
|
|
width -[in] Width of viewing area.
|
|
height -[in] Height of viewing area.
|
|
|
|
Returns: The field of view in degrees.
|
|
|
|
Notes:
|
|
|
|
-----------------------------------------------------------------------------
|
|
*/
|
|
PUBLIC float CalcFov( float fov_x, float width, float height )
|
|
{
|
|
if( fov_x < 1 || fov_x > 179 )
|
|
{
|
|
Com_Error( ERR_DROP, "Bad fov: %f", fov_x );
|
|
}
|
|
|
|
return (float)RAD2DEG( atan( height / ( width / tan( fov_x / 360 * M_PI ) ) ) ) * 2;
|
|
}
|
|
|
|
/*
|
|
-----------------------------------------------------------------------------
|
|
Function: MathLib_Init -Initialize optimized math routines.
|
|
|
|
Parameters: Nothing.
|
|
|
|
Returns: Nothing.
|
|
|
|
Notes:
|
|
|
|
-----------------------------------------------------------------------------
|
|
*/
|
|
PUBLIC void MathLib_Init( void )
|
|
{
|
|
Com_Printf( "Initializing Math Module\n" );
|
|
|
|
#if 0//__i386__
|
|
|
|
if( main_cpu_s.b3DNow )
|
|
{
|
|
// pfSqrt = _3DNow_Sqrt;
|
|
|
|
Com_Printf( "...using 3DNow!\n" );
|
|
}
|
|
|
|
if( main_cpu_s.bSSE )
|
|
{
|
|
// pfSqrt = _SSE_Sqrt;
|
|
|
|
Com_Printf( "...using SSE\n" );
|
|
}
|
|
|
|
#endif
|
|
}
|
|
|
|
|
|
|
|
|