Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/core/math/math_defs.h
9903 views
1
/**************************************************************************/
2
/* math_defs.h */
3
/**************************************************************************/
4
/* This file is part of: */
5
/* GODOT ENGINE */
6
/* https://godotengine.org */
7
/**************************************************************************/
8
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
9
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
10
/* */
11
/* Permission is hereby granted, free of charge, to any person obtaining */
12
/* a copy of this software and associated documentation files (the */
13
/* "Software"), to deal in the Software without restriction, including */
14
/* without limitation the rights to use, copy, modify, merge, publish, */
15
/* distribute, sublicense, and/or sell copies of the Software, and to */
16
/* permit persons to whom the Software is furnished to do so, subject to */
17
/* the following conditions: */
18
/* */
19
/* The above copyright notice and this permission notice shall be */
20
/* included in all copies or substantial portions of the Software. */
21
/* */
22
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
23
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
24
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
25
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
26
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
27
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
28
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
29
/**************************************************************************/
30
31
#pragma once
32
33
#include "core/typedefs.h"
34
35
#include <limits>
36
37
namespace Math {
38
inline constexpr double SQRT2 = 1.4142135623730950488016887242;
39
inline constexpr double SQRT3 = 1.7320508075688772935274463415059;
40
inline constexpr double SQRT12 = 0.7071067811865475244008443621048490;
41
inline constexpr double SQRT13 = 0.57735026918962576450914878050196;
42
inline constexpr double LN2 = 0.6931471805599453094172321215;
43
inline constexpr double TAU = 6.2831853071795864769252867666;
44
inline constexpr double PI = 3.1415926535897932384626433833;
45
inline constexpr double E = 2.7182818284590452353602874714;
46
inline constexpr double INF = std::numeric_limits<double>::infinity();
47
inline constexpr double NaN = std::numeric_limits<double>::quiet_NaN();
48
} // namespace Math
49
50
#define CMP_EPSILON 0.00001
51
#define CMP_EPSILON2 (CMP_EPSILON * CMP_EPSILON)
52
53
#define CMP_NORMALIZE_TOLERANCE 0.000001
54
#define CMP_POINT_IN_PLANE_EPSILON 0.00001
55
56
#ifdef DEBUG_ENABLED
57
#define MATH_CHECKS
58
#endif
59
60
//this epsilon is for values related to a unit size (scalar or vector len)
61
#ifdef PRECISE_MATH_CHECKS
62
#define UNIT_EPSILON 0.00001
63
#else
64
//tolerate some more floating point error normally
65
#define UNIT_EPSILON 0.001
66
#endif
67
68
#define USEC_TO_SEC(m_usec) ((m_usec) / 1000000.0)
69
70
enum ClockDirection {
71
CLOCKWISE,
72
COUNTERCLOCKWISE
73
};
74
75
enum Orientation {
76
HORIZONTAL,
77
VERTICAL
78
};
79
80
enum HorizontalAlignment {
81
HORIZONTAL_ALIGNMENT_LEFT,
82
HORIZONTAL_ALIGNMENT_CENTER,
83
HORIZONTAL_ALIGNMENT_RIGHT,
84
HORIZONTAL_ALIGNMENT_FILL,
85
};
86
87
enum VerticalAlignment {
88
VERTICAL_ALIGNMENT_TOP,
89
VERTICAL_ALIGNMENT_CENTER,
90
VERTICAL_ALIGNMENT_BOTTOM,
91
VERTICAL_ALIGNMENT_FILL,
92
};
93
94
enum InlineAlignment {
95
// Image alignment points.
96
INLINE_ALIGNMENT_TOP_TO = 0b0000,
97
INLINE_ALIGNMENT_CENTER_TO = 0b0001,
98
INLINE_ALIGNMENT_BASELINE_TO = 0b0011,
99
INLINE_ALIGNMENT_BOTTOM_TO = 0b0010,
100
INLINE_ALIGNMENT_IMAGE_MASK = 0b0011,
101
102
// Text alignment points.
103
INLINE_ALIGNMENT_TO_TOP = 0b0000,
104
INLINE_ALIGNMENT_TO_CENTER = 0b0100,
105
INLINE_ALIGNMENT_TO_BASELINE = 0b1000,
106
INLINE_ALIGNMENT_TO_BOTTOM = 0b1100,
107
INLINE_ALIGNMENT_TEXT_MASK = 0b1100,
108
109
// Presets.
110
INLINE_ALIGNMENT_TOP = INLINE_ALIGNMENT_TOP_TO | INLINE_ALIGNMENT_TO_TOP,
111
INLINE_ALIGNMENT_CENTER = INLINE_ALIGNMENT_CENTER_TO | INLINE_ALIGNMENT_TO_CENTER,
112
INLINE_ALIGNMENT_BOTTOM = INLINE_ALIGNMENT_BOTTOM_TO | INLINE_ALIGNMENT_TO_BOTTOM
113
};
114
115
enum Side {
116
SIDE_LEFT,
117
SIDE_TOP,
118
SIDE_RIGHT,
119
SIDE_BOTTOM
120
};
121
122
enum Corner {
123
CORNER_TOP_LEFT,
124
CORNER_TOP_RIGHT,
125
CORNER_BOTTOM_RIGHT,
126
CORNER_BOTTOM_LEFT
127
};
128
129
enum class EulerOrder {
130
XYZ,
131
XZY,
132
YXZ,
133
YZX,
134
ZXY,
135
ZYX
136
};
137
138
/**
139
* The "Real" type is an abstract type used for real numbers, such as 1.5,
140
* in contrast to integer numbers. Precision can be controlled with the
141
* presence or absence of the REAL_T_IS_DOUBLE define.
142
*/
143
#ifdef REAL_T_IS_DOUBLE
144
typedef double real_t;
145
#else
146
typedef float real_t;
147
#endif
148
149