Rapier C — 3D / f64 0.36.0+c.0
Loading...
Searching...
No Matches
rapier_math.h
Go to the documentation of this file.
1
9#ifndef RAPIER_MATH_H
10#define RAPIER_MATH_H
11#include "rapier.h"
12#include <math.h>
13
14#if defined(RAPIER_DIM2)
16#define R2_PI ((R2Real)3.14159265358979323846)
17#else
19#define R3_PI ((R3Real)3.14159265358979323846)
20#endif
21
22/* Value constructors and arithmetic for Rapier's public C math types. */
23#if defined(RAPIER_DIM2)
25static inline RAPIER_TYPE(Vector) RAPIER_FN(Vector)(RAPIER_TYPE(Real) x, RAPIER_TYPE(Real) y) {
26 RAPIER_TYPE(Vector) result = {x, y};
27 return result;
28}
29
31static inline RAPIER_TYPE(Rotation) RAPIER_FN(Rotation)(RAPIER_TYPE(Real) angle) {
32 RAPIER_TYPE(Rotation) result = {angle};
33 return result;
34}
35#else
37static inline RAPIER_TYPE(Vector) RAPIER_FN(Vector)(RAPIER_TYPE(Real) x, RAPIER_TYPE(Real) y, RAPIER_TYPE(Real) z) {
38 RAPIER_TYPE(Vector) result = {x, y, z};
39 return result;
40}
41
43static inline RAPIER_TYPE(Rotation) RAPIER_FN(RotationFromAxisAngle)(RAPIER_TYPE(Vector) axis,
44 RAPIER_TYPE(Real) angle) {
45 RAPIER_TYPE(Real) length =
46 (RAPIER_TYPE(Real))sqrt(axis.x * axis.x + axis.y * axis.y + axis.z * axis.z);
47 if (length == 0) {
48 RAPIER_TYPE(Rotation) result = {0, 0, 0, 1};
49 return result;
50 }
51 RAPIER_TYPE(Real) scale = RAPIER_FN(Sin)(angle / 2) / length;
52 RAPIER_TYPE(Rotation) result = {axis.x * scale, axis.y * scale, axis.z * scale,
53 RAPIER_FN(Cos)(angle / 2)};
54 return result;
55}
56#endif
57
59static inline RAPIER_TYPE(Vector) RAPIER_FN(VectorAdd)(RAPIER_TYPE(Vector) a, RAPIER_TYPE(Vector) b) {
60#if defined(RAPIER_DIM2)
61 return RAPIER_FN(Vector)(a.x + b.x, a.y + b.y);
62#else
63 return RAPIER_FN(Vector)(a.x + b.x, a.y + b.y, a.z + b.z);
64#endif
65}
66
68static inline RAPIER_TYPE(Vector) RAPIER_FN(VectorSub)(RAPIER_TYPE(Vector) a, RAPIER_TYPE(Vector) b) {
69#if defined(RAPIER_DIM2)
70 return RAPIER_FN(Vector)(a.x - b.x, a.y - b.y);
71#else
72 return RAPIER_FN(Vector)(a.x - b.x, a.y - b.y, a.z - b.z);
73#endif
74}
75
77static inline RAPIER_TYPE(Vector) RAPIER_FN(VectorScale)(RAPIER_TYPE(Vector) vector, RAPIER_TYPE(Real) scale) {
78#if defined(RAPIER_DIM2)
79 return RAPIER_FN(Vector)(vector.x * scale, vector.y * scale);
80#else
81 return RAPIER_FN(Vector)(vector.x * scale, vector.y * scale, vector.z * scale);
82#endif
83}
84
86static inline RAPIER_TYPE(Real) RAPIER_FN(VectorDot)(RAPIER_TYPE(Vector) a, RAPIER_TYPE(Vector) b) {
87#if defined(RAPIER_DIM2)
88 return a.x * b.x + a.y * b.y;
89#else
90 return a.x * b.x + a.y * b.y + a.z * b.z;
91#endif
92}
93
94static inline RAPIER_TYPE(Real) RAPIER_FN(VectorLength)(RAPIER_TYPE(Vector) vector) {
95 return (RAPIER_TYPE(Real))sqrt(RAPIER_FN(VectorDot)(vector, vector));
96}
97
98static inline RAPIER_TYPE(Vector) RAPIER_FN(VectorNormalize)(RAPIER_TYPE(Vector) vector) {
99 RAPIER_TYPE(Real) length = RAPIER_FN(VectorLength)(vector);
100 return length > 0 ? RAPIER_FN(VectorScale)(vector, 1 / length) : vector;
101}
102#if defined(RAPIER_DIM3)
104static inline RAPIER_TYPE(Vector) RAPIER_FN(VectorCross)(RAPIER_TYPE(Vector) a, RAPIER_TYPE(Vector) b) {
105 return RAPIER_FN(Vector)(a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z,
106 a.x * b.y - a.y * b.x);
107}
108#endif
109
111static inline RAPIER_TYPE(Rotation) RAPIER_FN(RotationMul)(RAPIER_TYPE(Rotation) a, RAPIER_TYPE(Rotation) b) {
112#if defined(RAPIER_DIM2)
113 RAPIER_TYPE(Rotation) result = {a.angle + b.angle};
114 return result;
115#else
116 RAPIER_TYPE(Rotation) result = {a.w * b.x + a.x * b.w + a.y * b.z - a.z * b.y,
117 a.w * b.y - a.x * b.z + a.y * b.w + a.z * b.x,
118 a.w * b.z + a.x * b.y - a.y * b.x + a.z * b.w,
119 a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z};
120 return result;
121#endif
122}
123
124/* Rotate a vector without changing its length. The rotation must be normalized.
125 */
127static inline RAPIER_TYPE(Vector) RAPIER_FN(RotationTransformVector)(RAPIER_TYPE(Rotation) rotation,
128 RAPIER_TYPE(Vector) vector) {
129#if defined(RAPIER_DIM2)
130 const RAPIER_TYPE(Real) c = RAPIER_FN(Cos)(rotation.angle),
131 s = RAPIER_FN(Sin)(rotation.angle);
132 return RAPIER_FN(Vector)(c * vector.x - s * vector.y,
133 s * vector.x + c * vector.y);
134#else
135 const RAPIER_TYPE(Vector) t = {2 * (rotation.y * vector.z - rotation.z * vector.y),
136 2 * (rotation.z * vector.x - rotation.x * vector.z),
137 2 * (rotation.x * vector.y - rotation.y * vector.x)};
138 return RAPIER_FN(Vector)(
139 vector.x + rotation.w * t.x + rotation.y * t.z - rotation.z * t.y,
140 vector.y + rotation.w * t.y + rotation.z * t.x - rotation.x * t.z,
141 vector.z + rotation.w * t.z + rotation.x * t.y - rotation.y * t.x);
142#endif
143}
144
146static inline RAPIER_TYPE(Pose) RAPIER_FN(Pose)(RAPIER_TYPE(Vector) translation,
147 RAPIER_TYPE(Rotation) rotation) {
148 RAPIER_TYPE(Pose) result = {translation, rotation};
149 return result;
150}
151
153static inline RAPIER_TYPE(Pose) RAPIER_FN(TranslationPose)(RAPIER_TYPE(Vector) translation) {
154#if defined(RAPIER_DIM2)
155 RAPIER_TYPE(Rotation) rotation = {0};
156#else
157 RAPIER_TYPE(Rotation) rotation = {0, 0, 0, 1};
158#endif
159 return RAPIER_FN(Pose)(translation, rotation);
160}
161
163static inline RAPIER_TYPE(MassProperties) RAPIER_FN(MassProperties)(RAPIER_TYPE(Vector) local_com,
164 RAPIER_TYPE(Real) mass,
165 RAPIER_TYPE(AngVector) principal_inertia) {
166#if defined(RAPIER_DIM2)
167 RAPIER_TYPE(MassProperties) result = {local_com, mass, principal_inertia};
168#else
169 RAPIER_TYPE(Rotation) frame = {0, 0, 0, 1};
170 RAPIER_TYPE(MassProperties) result = {local_com, mass, principal_inertia, frame};
171#endif
172 return result;
173}
174
175static inline RAPIER_TYPE(Rotation) RAPIER_FN(RotationInverse)(RAPIER_TYPE(Rotation) rotation) {
176#if defined(RAPIER_DIM2)
177 return RAPIER_FN(Rotation)(-rotation.angle);
178#else
179 RAPIER_TYPE(Rotation) result = {-rotation.x, -rotation.y, -rotation.z, rotation.w};
180 return result;
181#endif
182}
183
184static inline RAPIER_TYPE(Vector) RAPIER_FN(PoseTransformPoint)(RAPIER_TYPE(Pose) pose,
185 RAPIER_TYPE(Vector) point) {
186 return RAPIER_FN(VectorAdd)(
187 pose.translation, RAPIER_FN(RotationTransformVector)(pose.rotation, point));
188}
189
190static inline RAPIER_TYPE(Pose) RAPIER_FN(PoseInverse)(RAPIER_TYPE(Pose) pose) {
191 RAPIER_TYPE(Rotation) rotation = RAPIER_FN(RotationInverse)(pose.rotation);
192 return RAPIER_FN(Pose)(RAPIER_FN(RotationTransformVector)(
193 rotation, RAPIER_FN(VectorScale)(pose.translation, -1)),
194 rotation);
195}
196#endif
197
Rapier C ABI.
#define RAPIER_FN(name)
Select an r2/r3 public function name.
Definition rapier.h:34
#define RAPIER_TYPE(name)
Select an R2/R3 public type name.
Definition rapier.h:30