aboutsummaryrefslogtreecommitdiff
path: root/core/bgdrtm/src/fmath.c
diff options
context:
space:
mode:
Diffstat (limited to 'core/bgdrtm/src/fmath.c')
-rw-r--r--core/bgdrtm/src/fmath.c149
1 files changed, 149 insertions, 0 deletions
diff --git a/core/bgdrtm/src/fmath.c b/core/bgdrtm/src/fmath.c
new file mode 100644
index 0000000..cdf3e1a
--- /dev/null
+++ b/core/bgdrtm/src/fmath.c
@@ -0,0 +1,149 @@
+/*
+ * Copyright © 2006-2016 SplinterGU (Fenix/Bennugd)
+ * Copyright © 2002-2006 Fenix Team (Fenix)
+ * Copyright © 1999-2002 José Luis Cebrián Pagüe (Fenix)
+ *
+ * This file is part of Bennu - Game Development
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty. In no event will the authors be held liable for any damages
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ * claim that you wrote the original software. If you use this software
+ * in a product, an acknowledgment in the product documentation would be
+ * appreciated but is not required.
+ *
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ * misrepresented as being the original software.
+ *
+ * 3. This notice may not be removed or altered from any source
+ * distribution.
+ *
+ */
+
+#include <stdlib.h>
+
+#include "fmath.h"
+
+#include "bgdcore.h"
+
+/* --------------------------------------------------------------------------- */
+/* Fixed-point math routines, based on Allegro */
+
+//#define FIXED_PREC 12
+
+#define FIXED_PREC 10000
+
+//#define FIXED_PREC_MED 5000
+//#define FIXED_PREC_DEC 1000
+
+/* --------------------------------------------------------------------------- */
+
+static fixed * cos_table = NULL ;
+
+/* --------------------------------------------------------------------------- */
+
+fixed ftofix( float x )
+{
+ return ( long )( x * FIXED_PREC );
+}
+
+/* --------------------------------------------------------------------------- */
+
+float fixtof( fixed x )
+{
+ return ( ( float ) x ) / FIXED_PREC ;
+}
+
+/* --------------------------------------------------------------------------- */
+
+fixed itofix( int x )
+{
+ return x * FIXED_PREC ;
+}
+
+/* --------------------------------------------------------------------------- */
+
+int fixtoi( fixed x )
+{
+ return x / FIXED_PREC ;
+}
+
+/* --------------------------------------------------------------------------- */
+
+int fixceil( fixed x )
+{
+ int xd;
+
+ if ( x < 0 )
+ {
+ xd = x % FIXED_PREC ;
+ x -= ( FIXED_PREC + xd ) ;
+ }
+ else if ( x > 0 )
+ {
+ xd = x % FIXED_PREC ;
+ x += ( FIXED_PREC - xd ) ;
+ }
+
+ return x ;
+}
+
+/* --------------------------------------------------------------------------- */
+
+fixed fcos( int x )
+{
+ if ( x < 0 ) x = -x ;
+ if ( x > 360000 ) x %= 360000 ;
+ if ( x > 270000 ) return cos_table[360000 - x] ;
+ if ( x > 180000 ) return -cos_table[x - 180000] ;
+ if ( x > 90000 ) return -cos_table[180000 - x] ;
+ return cos_table[x] ;
+}
+
+/* --------------------------------------------------------------------------- */
+
+fixed fsin( int x )
+{
+ if ( x < 0 ) return -fsin( -x ) ;
+ if ( x > 360000 ) x %= 360000 ;
+ if ( x > 270000 ) return -cos_table[x - 270000] ;
+ if ( x > 180000 ) return -cos_table[270000 - x] ;
+ if ( x > 90000 ) return cos_table[x - 90000] ;
+ return cos_table[90000 - x] ;
+}
+
+/* --------------------------------------------------------------------------- */
+
+fixed fmul( int x, int y )
+{
+ return ftofix( fixtof( x ) * fixtof( y ) ) ;
+}
+
+/* --------------------------------------------------------------------------- */
+
+fixed fdiv( int x, int y )
+{
+ return ftofix( fixtof( x ) / fixtof( y ) ) ;
+}
+
+/* --------------------------------------------------------------------------- */
+
+void init_cos_tables()
+{
+ int i ;
+
+ if ( !cos_table ) cos_table = ( fixed * ) malloc( 90001 * sizeof( fixed ) );
+
+ for ( i = 0 ; i <= 90000 ; i++ )
+ {
+ cos_table[i] = ftofix( cos( i * M_PI / 180000.0 ) ) ;
+ }
+}
+
+/* --------------------------------------------------------------------------- */