summaryrefslogtreecommitdiff
path: root/src/utils
diff options
context:
space:
mode:
authorRogier Polak <rogier.l.a.polak@gmail.com>2007-03-03 03:32:46 +0000
committerRogier Polak <rogier.l.a.polak@gmail.com>2007-03-03 03:32:46 +0000
commitcdf81ef8e5b25fd8751a92c6ff394c01daedbb88 (patch)
treefb0d4da6fbd31efe6370de1f0c58d8f9db7ac277 /src/utils
parentaf1ce69940a9c0b46907402e7d69e6ac9ea96912 (diff)
downloadmanaserv-cdf81ef8e5b25fd8751a92c6ff394c01daedbb88.tar.gz
manaserv-cdf81ef8e5b25fd8751a92c6ff394c01daedbb88.tar.bz2
manaserv-cdf81ef8e5b25fd8751a92c6ff394c01daedbb88.tar.xz
manaserv-cdf81ef8e5b25fd8751a92c6ff394c01daedbb88.zip
Implemented an alternate collision-detection function, added namespace utils::math.
Diffstat (limited to 'src/utils')
-rw-r--r--src/utils/fastsqrt.h23
-rw-r--r--src/utils/mathutils.cpp106
-rw-r--r--src/utils/mathutils.h46
3 files changed, 152 insertions, 23 deletions
diff --git a/src/utils/fastsqrt.h b/src/utils/fastsqrt.h
deleted file mode 100644
index 8ba6f8ce..00000000
--- a/src/utils/fastsqrt.h
+++ /dev/null
@@ -1,23 +0,0 @@
-/* A very fast function to calculate the approximate inverse square root of a
- * floating point value and a helper function that uses it for getting the
- * normal squareroot. For an explanation of the inverse squareroot function
- * read:
- * http://www.math.purdue.edu/~clomont/Math/Papers/2003/InvSqrt.pdf
- *
- * Unfortunately the original creator of this function seems to be unknown.
- */
-
-float fastInvSqrt(float x)
-{
- float xhalf = 0.5f*x;
- int i = *(int*)&x;
- i = 0x5f375a86- (i>>1);
- x = *(float*)&i;
- x = x*(1.5f-xhalf*x*x);
- return x;
-}
-
-float fastSqrt(float x)
-{
- return 1.0f/fastInvSqrt(x);
-}
diff --git a/src/utils/mathutils.cpp b/src/utils/mathutils.cpp
new file mode 100644
index 00000000..0a46ff2c
--- /dev/null
+++ b/src/utils/mathutils.cpp
@@ -0,0 +1,106 @@
+/*
+ * The Mana World Server
+ * Copyright 2004 The Mana World Development Team
+ *
+ * This file is part of The Mana World.
+ *
+ * The Mana World 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 any later version.
+ *
+ * The Mana World 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 The Mana World; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * $Id: $
+ */
+
+#include "mathutils.h"
+
+#include <cmath>
+
+#define MATH_UTILS_MAX_ANGLE 360
+
+float sinList[MATH_UTILS_MAX_ANGLE];
+float cosList[MATH_UTILS_MAX_ANGLE];
+float tanList[MATH_UTILS_MAX_ANGLE];
+
+/**
+ * fastInvSqrt:
+ *
+ * A very fast function to calculate the approximate inverse square root of a
+ * floating point value. For an explanation of the inverse squareroot function
+ * read:
+ * http://www.math.purdue.edu/~clomont/Math/Papers/2003/InvSqrt.pdf
+ *
+ * Unfortunately the original creator of this function seems to be unknown.
+ *
+ * TODO: - Make this function run on 64-bit architectures
+ * - Find out and fix why this function fails when compiled with the -O2
+ * optimization flag on
+ * gcc version 4.0.2 20050808 (prerelease) (Ubuntu 4.0.1-4ubuntu9).
+ */
+float utils::math::fastInvSqrt(float x)
+{
+ float xhalf = 0.5f*x;
+ int i = *(int*)&x;
+ i = 0x5f375a86- (i>>1);
+ x = *(float*)&i;
+ x = x*(1.5f-xhalf*x*x);
+ return x;
+}
+
+/**
+ * fastSqrt:
+ *
+ * A helper function that uses the fastInvSqrt for getting the
+ * normal squareroot.
+ */
+float utils::math::fastSqrt(float x)
+{
+ return 1.0f/utils::math::fastInvSqrt(x);
+}
+
+void utils::math::init()
+{
+ // Constant for calculating an angle in radians out of an angle in degrees
+ const float radianAngleRatio = acos(0.0f) / 90.0f; // pi/2 / 90[deg]
+
+ for(int i = 0; i < MATH_UTILS_MAX_ANGLE; i++)
+ {
+ sinList[i] = sin(radianAngleRatio * (float)i);
+ cosList[i] = cos(radianAngleRatio * (float)i);
+
+ if (i == 90)
+ {
+ tanList[i] = 1.0E40f; //approximately infinity
+ continue;
+ }
+ if (i == 270)
+ {
+ tanList[i] = -1.0E40f; //approximately infinity
+ continue;
+ }
+ tanList[i] = tan(radianAngleRatio * (float)i);
+ }
+}
+
+float utils::math::cachedSin(int angle)
+{
+ return sinList[angle];
+}
+
+float utils::math::cachedCos(int angle)
+{
+ return cosList[angle];
+}
+
+float utils::math::cachedTan(int angle)
+{
+ return tanList[angle];
+}
diff --git a/src/utils/mathutils.h b/src/utils/mathutils.h
new file mode 100644
index 00000000..3d90b022
--- /dev/null
+++ b/src/utils/mathutils.h
@@ -0,0 +1,46 @@
+/*
+ * The Mana World Server
+ * Copyright 2004 The Mana World Development Team
+ *
+ * This file is part of The Mana World.
+ *
+ * The Mana World 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 any later version.
+ *
+ * The Mana World 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 The Mana World; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * $Id: $
+ */
+
+#ifndef _TMWSERV_MATHUTILS_H_
+#define _TMWSERV_MATHUTILS_H_
+
+namespace utils
+{
+ namespace math
+ {
+ float fastInvSqrt(float x);
+
+ float fastSqrt(float x);
+
+ float cachedSin(int angle);
+
+ float cachedCos(int angle);
+
+ float cachedTan(int angle);
+
+ void init();
+
+ } // namespace math
+
+} // namespace utils
+
+#endif