Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/pch/src/util/Math.h @ 3146

Last change on this file since 3146 was 3146, checked in by rgrieder, 15 years ago

Found another few unnecessary includes in util (and added two others that followed due to this change).

  • Property svn:eol-style set to native
File size: 10.0 KB
Line 
1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      Fabian 'x3n' Landau
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29/**
30    @file
31    @brief Declaration and implementation of several math-functions, typedefs of some Ogre::Math classes to the orxonox namespace.
32*/
33
34#ifndef _Util_Math_H__
35#define _Util_Math_H__
36
37#include "UtilPrereqs.h"
38
39#include <string>
40#include <cmath>
41
42#include <OgreMath.h>
43#include <OgreVector2.h>
44#include <OgreVector3.h>
45#include <OgreVector4.h>
46#include <OgreQuaternion.h>
47#include <OgreColourValue.h>
48
49// Certain headers might define min and max macros
50#if defined(max) || defined(min) || defined(sgn) || defined(clamp) || defined(square) || defined(mod)
51#  error An inline math function was overridden by a macro
52#endif
53
54namespace orxonox
55{
56    // Also define our own transform space enum
57    namespace TransformSpace
58    {
59        /**
60        @brief
61            Enumeration denoting the spaces which a transform can be relative to.
62        */
63        enum Enum
64        {
65            //! Transform is relative to the local space
66            Local,
67            //! Transform is relative to the space of the parent node
68            Parent,
69            //! Transform is relative to world space
70            World
71        };
72    }
73
74    _UtilExport std::ostream& operator<<(std::ostream& out, const orxonox::Radian& radian);
75    _UtilExport std::istream& operator>>(std::istream& in, orxonox::Radian& radian);
76    _UtilExport std::ostream& operator<<(std::ostream& out, const orxonox::Degree& degree);
77    _UtilExport std::istream& operator>>(std::istream& in, orxonox::Degree& degree);
78
79    _UtilExport float getAngle(const orxonox::Vector3& myposition, const orxonox::Vector3& mydirection, const orxonox::Vector3& otherposition);
80    _UtilExport orxonox::Vector2 get2DViewdirection(const orxonox::Vector3& myposition, const orxonox::Vector3& mydirection, const orxonox::Vector3& myorthonormal, const orxonox::Vector3& otherposition);
81    _UtilExport orxonox::Vector2 get2DViewcoordinates(const orxonox::Vector3& myposition, const orxonox::Vector3& mydirection, const orxonox::Vector3& myorthonormal, const orxonox::Vector3& otherposition);
82    _UtilExport orxonox::Vector3 getPredictedPosition(const orxonox::Vector3& myposition, float projectilespeed, const orxonox::Vector3& targetposition, const orxonox::Vector3& targetvelocity);
83
84    /**
85        @brief Returns the sign of the given value.
86        @param x The value
87        @return 1 if the value is positive or zero, -1 if the value is negative
88    */
89    template <typename T>
90    inline T sgn(T x)
91    {
92        return (x >= 0) ? 1 : -1;
93    }
94
95    /**
96        @brief Returns the smaller of two values.
97    */
98    template <typename T>
99    inline T min(T a, T b)
100    {
101        return (a <= b) ? a : b;
102    }
103
104    /**
105        @brief Returns the greater of two values.
106    */
107    template <typename T>
108    inline T max(T a, T b)
109    {
110        return (a >= b) ? a : b;
111    }
112
113    /**
114        @brief Keeps a value between a lower and an upper limit.
115        @param x The value
116        @param min The lower limit
117        @param max The upper limit
118    */
119    template <typename T>
120    inline T clamp(T x, T min, T max)
121    {
122        if (x < min)
123            return min;
124
125        if (x > max)
126            return max;
127
128        return x;
129    }
130
131    /**
132        @brief Returns the square value (x^2).
133    */
134    template <typename T>
135    inline T square(T x)
136    {
137        return x*x;
138    }
139
140    /**
141        @brief Returns the cube value (x^3).
142    */
143    template <typename T>
144    inline T cube(T x)
145    {
146        return x*x*x;
147    }
148
149    /**
150        @brief Rounds the value.
151    */
152    template <typename T>
153    inline int round(T x)
154    {
155        return (int)(x + 0.5);
156    }
157
158    /**
159        @brief The modulo operation, enhanced to work properly with negative values.
160        @param x The value
161        @param max The operand
162    */
163    template <typename T>
164    inline int mod(T x, int max)
165    {
166        if (x >= 0)
167            return (x % max);
168        else
169            return ((x % max) + max);
170    }
171
172    template <typename T>
173    inline T zeroise()
174    {
175        // Default, raise a compiler error without including large boost header cascade.
176        T temp();
177        *********temp; // If you reach this code, you abused zeroise()!
178        return temp;
179    }
180
181    template <> inline char                 zeroise<char>()                 { return 0; }
182    template <> inline unsigned char        zeroise<unsigned char>()        { return 0; }
183    template <> inline short                zeroise<short>()                { return 0; }
184    template <> inline unsigned short       zeroise<unsigned short>()       { return 0; }
185    template <> inline int                  zeroise<int>()                  { return 0; }
186    template <> inline unsigned int         zeroise<unsigned int>()         { return 0; }
187    template <> inline long                 zeroise<long>()                 { return 0; }
188    template <> inline unsigned long        zeroise<unsigned long>()        { return 0; }
189    template <> inline long long            zeroise<long long>()            { return 0; }
190    template <> inline unsigned long long   zeroise<unsigned long long>()   { return 0; }
191    template <> inline float                zeroise<float>()                { return 0; }
192    template <> inline double               zeroise<double>()               { return 0; }
193    template <> inline long double          zeroise<long double>()          { return 0; }
194    template <> inline bool                 zeroise<bool>()                 { return 0; }
195    template <> inline void*                zeroise<void*>()                { return 0; }
196    template <> inline std::string          zeroise<std::string>()          { return ""; }
197    template <> inline orxonox::Radian      zeroise<orxonox::Radian>()      { return orxonox::Radian(0.0f); }
198    template <> inline orxonox::Degree      zeroise<orxonox::Degree>()      { return orxonox::Degree(0.0f); }
199    template <> inline orxonox::Vector2     zeroise<orxonox::Vector2>()     { return orxonox::Vector2    (0, 0)      ; }
200    template <> inline orxonox::Vector3     zeroise<orxonox::Vector3>()     { return orxonox::Vector3    (0, 0, 0)   ; }
201    template <> inline orxonox::Vector4     zeroise<orxonox::Vector4>()     { return orxonox::Vector4    (0, 0, 0, 0); }
202    template <> inline orxonox::ColourValue zeroise<orxonox::ColourValue>() { return orxonox::ColourValue(0, 0, 0, 0); }
203    template <> inline orxonox::Quaternion  zeroise<orxonox::Quaternion>()  { return orxonox::Quaternion (0, 0, 0, 0); }
204
205    //! Provides zero value symbols that can be returned as reference
206    template <typename T>
207    struct NilValue
208    {
209        inline operator const T&() const
210        {
211            return value;
212        }
213        static T value;
214    };
215    template <typename T>
216    T NilValue<T>::value = zeroise<T>();
217
218    /**
219        @brief Interpolates between two values for a time between 0 and 1.
220        @param time The time is a value between 0 and 1 - the function returns start if time is 0 and end if time is 1 and interpolates if time is between 0 and 1.
221        @param start The value at time = 0
222        @param end The value at time = 1
223        @return The interpolation at a given time
224    */
225    template <typename T>
226    inline T interpolate(float time, const T& start, const T& end)
227    {
228        return time * (end - start) + start;
229    }
230
231    /**
232        @brief Interpolates smoothly between two values for a time between 0 and 1. The function starts slowly, increases faster and stops slowly again.
233        @param time The time is a value between 0 and 1 - the function returns start if time is 0 and end if time is 1 and interpolates if time is between 0 and 1.
234        @param start The value at time = 0
235        @param end The value at time = 1
236        @return The smoothed interpolation at a given time
237    */
238    template <typename T>
239    inline T interpolateSmooth(float time, const T& start, const T& end)
240    {
241        return (-2 * (end - start) * cube(time)) + (3 * (end - start) * square(time)) + start;
242    }
243
244    /**
245        @brief Returns a random number between 0 and almost 1: 0 <= rnd < 1.
246    */
247    inline float rnd()
248    {
249        return rand() / (RAND_MAX + 1.0);
250    }
251
252    /**
253        @brief Returns a random number between 0 and almost max: 0 <= rnd < max.
254        @param max The maximum
255    */
256    inline float rnd(float max)
257    {
258        return rnd() * max;
259    }
260
261    /**
262        @brief Returns a random number between min and almost max: min <= rnd < max.
263        @param min The minimum
264        @param max The maximum
265    */
266    inline float rnd(float min, float max)
267    {
268        return rnd(max - min) + min;
269    }
270
271    /**
272        @brief Returns randomly 1 or -1 with equal probability.
273    */
274    inline float rndsgn()
275    {
276        return ((rand() & 0x2) - 1); // rand() & 0x2 is either 2 or 0
277    }
278
279    _UtilExport unsigned long getUniqueNumber();
280
281    class IntVector2
282    {
283    public:
284        IntVector2() : x(0), y(0) { }
285        IntVector2(int _x, int _y) : x(_x), y(_y) { }
286        int x;
287        int y;
288    };
289
290    class IntVector3
291    {
292    public:
293        IntVector3() : x(0), y(0), z(0) { }
294        IntVector3(int _x, int _y, int _z) : x(_x), y(_y), z(_z) { }
295        int x;
296        int y;
297        int z;
298    };
299}
300
301#endif /* _Util_Math_H__ */
Note: See TracBrowser for help on using the repository browser.