warzone2100/lib/framework/fractions.h

148 lines
3.9 KiB
C

// Routines to provide simple maths functions that work on both PSX & PC
// Use the type "FRACT" instead of FLOAT
// - This is defined as a float on PC and a 20.12 fixed point number on PSX
//
// Use:-
// MAKEFRACT(int); to convert from a SDWORD to a FRACT
// MAKEINT(fract); to convert the other way
// FRACTmul(fract,fract); to multiply two fract numbers
// FRACTdiv(fract,fract); to divide two numbers
// SQRT(fract); to get square root of a fract (returns a fract)
// iSQRT(int); to get a square root of an integer (returns an UDWORD)
// FRACTCONST(constA,constB); ; Generates a constant of (constA/constB)
// e.g. to define 0.5 use FRACTCONST(1,2)
// to define 0.114 use FRACTCONT(114,1000)
//
// Also PERCENT(int,int); // returns a int value 0->100 of the percentage of the first param over the second
//
// This file used to be in the deliverance src directory. But Jeremy quite correctly
// pointed out to me that it should be library based not deliverance based, and hence
// has now been moved to the lib\framework directory
//
// If you are reading this file from the deliverance source directory, please delete it now
// To multiply a FRACT by a integer just use the normal operator
// e.g. FractValue2=FractValue*Interger;
//
// save is true of divide
#ifndef _FRACTIONS_
#define _FRACTIONS_
/* Check the header files have been included from frame.h if they
* are used outside of the framework library.
*/
#if !defined(_frame_h) && !defined(FRAME_LIB_INCLUDE)
#error Framework header files MUST be included from Frame.h ONLY.
#endif
#include "types.h"
#define PERCENT(a,b) (((a)*100)/(b))
#define PERNUM(range,a,b) (((a)*range)/(b))
#include <math.h>
typedef float FRACT;
typedef float FRACT_D;
#define ROUND(x) ((x)>=0 ? (SDWORD)((x) + 0.5) : (SDWORD)((x) - 0.5))
#define FAST_FRACTS
#ifdef FAST_FRACTS
#define MAKEFRACT(x) ((FRACT)(x))
#define FRACTmul(x,y) ((x)*(y))
#define FRACTdiv(x,y) ((x)/(y))
#define FRACTmul_1(x,y) ((x)*(y))
#define FRACTdiv_1(x,y) ((x)/(y))
#define fSQRT(x) ((FRACT)sqrt(x))
// Jeremy ... the usual leg breaking rule aplies if you remove this again
#define iSQRT(x) ((FRACT)sqrt(x))
#define FRACTCONST(a,b) (((float)(a)) / ((float)(b)))
#define FRACTabs(a) ((float)fabs(a))
#define MAKEFRACT_D(x) ((FRACT_D)(x))
#define FRACTmul_D(x,y) ((x)*(y))
#define FRACTdiv_D(x,y) ((x)/(y))
#define fSQRT_D(x) ((FRACT)sqrt(x))
//#ifdef _MSC_VER //Using 'normal' version --Qamly
//__inline SDWORD MAKEINT_D (float f)
//{
// SDWORD i;
// __asm fld f;
// __asm fistp i;
// return i;
//}
//#else
#define MAKEINT_D(x) ((SDWORD)(x))
//#endif
//#ifdef _MSC_VER //Using 'normal version' --Qamly
//__inline SDWORD MAKEINT (float f)
//{
// SDWORD i;
// __asm fld f;
// __asm fistp i;
// return i;
//}
//#else
//changed definitions
#define MAKEINT(x) ((SDWORD)(x))
//#define MAKEINT(x) (ftol(x))
//#endif
//#define fastRoot(x,y) (sqrt(x * x + y * y))
#define fastRoot(x,y) ((abs(x) > abs(y)) ? (abs(x) + abs(y)/2) : (abs(y) + abs(x)/2))
//unused definitions
//#define iSQRT_D(x) ((UDWORD)sqrt((double)x))
//#define iSQRT(x) ((UDWORD)sqrt((double)x))
#else
#define MAKEFRACT(x) ((FRACT)(x))
#define FRACTmul(x,y) ((x)*(y))
#define FRACTdiv(x,y) ((x)/(y))
#define FRACTmul_1(x,y) ((x)*(y))
#define FRACTdiv_1(x,y) ((x)/(y))
#define fSQRT(x) ((FRACT)sqrt(x))
#define FRACTCONST(a,b) (((float)(a)) / ((float)(b)))
#define FRACTabs(a) ((float)fabs(a))
#define MAKEFRACT_D(x) ((FRACT_D)(x))
#define FRACTmul_D(x,y) ((x)*(y))
#define FRACTdiv_D(x,y) ((x)/(y))
#define fSQRT_D(x) ((FRACT)sqrt(x))
// Jeremy ... the usual leg breaking rule aplies if you remove this again
#define iSQRT(x) ((FRACT)sqrt(x))
#define MAKEINT(x) ((SDWORD)(x))
#define MAKEINT_D(x) ((SDWORD)(x))
#define fastRoot(x,y) (sqrt(x * x + y * y))
//#define iSQRT_D(x) ((UDWORD)sqrt((double)x))
//#define iSQRT(x) ((UDWORD)sqrt((double)x))
#endif
#endif