doxygen: prevent GPL license block from being parsed as doxygen comment.
[blender.git] / source / blender / blenlib / intern / math_base_inline.c
1 /*
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19  *
20  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
21  * All rights reserved.
22  *
23  * The Original Code is: some of this file.
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  * */
27
28 #include <float.h>
29 #include <stdio.h>
30 #include <stdlib.h>
31 #include <string.h>
32
33 #include "BLI_math.h"
34
35 #ifndef BLI_MATH_BASE_INLINE_H
36 #define BLI_MATH_BASE_INLINE_H
37
38 /* A few small defines. Keep'em local! */
39 #define SMALL_NUMBER    1.e-8
40
41 MINLINE float sqrt3f(float f)
42 {
43         if(f==0.0) return 0;
44         if(f<0) return (float)(-exp(log(-f)/3));
45         else return (float)(exp(log(f)/3));
46 }
47
48 MINLINE double sqrt3d(double d)
49 {
50         if(d==0.0) return 0;
51         if(d<0) return -exp(log(-d)/3);
52         else return exp(log(d)/3);
53 }
54
55 MINLINE float saacos(float fac)
56 {
57         if(fac<= -1.0f) return (float)M_PI;
58         else if(fac>=1.0f) return 0.0;
59         else return (float)acos(fac);
60 }
61
62 MINLINE float saasin(float fac)
63 {
64         if(fac<= -1.0f) return (float)-M_PI/2.0f;
65         else if(fac>=1.0f) return (float)M_PI/2.0f;
66         else return (float)asin(fac);
67 }
68
69 MINLINE float sasqrt(float fac)
70 {
71         if(fac<=0.0) return 0.0;
72         return (float)sqrt(fac);
73 }
74
75 MINLINE float saacosf(float fac)
76 {
77         if(fac<= -1.0f) return (float)M_PI;
78         else if(fac>=1.0f) return 0.0f;
79         else return (float)acosf(fac);
80 }
81
82 MINLINE float saasinf(float fac)
83 {
84         if(fac<= -1.0f) return (float)-M_PI/2.0f;
85         else if(fac>=1.0f) return (float)M_PI/2.0f;
86         else return (float)asinf(fac);
87 }
88
89 MINLINE float sasqrtf(float fac)
90 {
91         if(fac<=0.0) return 0.0;
92         return (float)sqrtf(fac);
93 }
94
95 MINLINE float interpf(float target, float origin, float fac)
96 {
97         return (fac*target) + (1.0f-fac)*origin;
98 }
99
100 /* useful to calculate an even width shell, by taking the angle between 2 planes.
101  * The return value is a scale on the offset.
102  * no angle between planes is 1.0, as the angle between the 2 planes approches 180d
103  * the distance gets very high, 180d would be inf, but this case isn't valid */
104 MINLINE float shell_angle_to_dist(const float angle)
105 {
106         return (angle < SMALL_NUMBER) ? 1.0f : fabsf(1.0f / cosf(angle));
107 }
108
109 /* used for zoom values*/
110 MINLINE float power_of_2(float val)
111 {
112         return (float)pow(2.0, ceil(log((double)val) / log(2.0)));
113 }
114
115 MINLINE float minf(float a, float b)
116 {
117         return (a < b)? a: b;
118 }
119
120 MINLINE float maxf(float a, float b)
121 {
122         return (a > b)? a: b;
123 }
124
125 MINLINE float signf(float f)
126 {
127         return (f < 0.f)? -1.f: 1.f;
128 }
129
130 #endif /* BLI_MATH_BASE_INLINE_H */
131