Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
Quaternion.cs
Go to the documentation of this file.
3
4namespace System.Numerics;
5
6[Intrinsic]
7public struct Quaternion : IEquatable<Quaternion>
8{
9 public float X;
10
11 public float Y;
12
13 public float Z;
14
15 public float W;
16
17 public static Quaternion Identity => new Quaternion(0f, 0f, 0f, 1f);
18
19 public readonly bool IsIdentity => this == Identity;
20
21 public Quaternion(float x, float y, float z, float w)
22 {
23 X = x;
24 Y = y;
25 Z = z;
26 W = w;
27 }
28
29 public Quaternion(Vector3 vectorPart, float scalarPart)
30 {
31 X = vectorPart.X;
32 Y = vectorPart.Y;
33 Z = vectorPart.Z;
34 W = scalarPart;
35 }
36
37 public static Quaternion operator +(Quaternion value1, Quaternion value2)
38 {
39 System.Runtime.CompilerServices.Unsafe.SkipInit(out Quaternion result);
40 result.X = value1.X + value2.X;
41 result.Y = value1.Y + value2.Y;
42 result.Z = value1.Z + value2.Z;
43 result.W = value1.W + value2.W;
44 return result;
45 }
46
47 public static Quaternion operator /(Quaternion value1, Quaternion value2)
48 {
49 float x = value1.X;
50 float y = value1.Y;
51 float z = value1.Z;
52 float w = value1.W;
53 float num = value2.X * value2.X + value2.Y * value2.Y + value2.Z * value2.Z + value2.W * value2.W;
54 float num2 = 1f / num;
55 float num3 = (0f - value2.X) * num2;
56 float num4 = (0f - value2.Y) * num2;
57 float num5 = (0f - value2.Z) * num2;
58 float num6 = value2.W * num2;
59 float num7 = y * num5 - z * num4;
60 float num8 = z * num3 - x * num5;
61 float num9 = x * num4 - y * num3;
62 float num10 = x * num3 + y * num4 + z * num5;
63 System.Runtime.CompilerServices.Unsafe.SkipInit(out Quaternion result);
64 result.X = x * num6 + num3 * w + num7;
65 result.Y = y * num6 + num4 * w + num8;
66 result.Z = z * num6 + num5 * w + num9;
67 result.W = w * num6 - num10;
68 return result;
69 }
70
71 public static bool operator ==(Quaternion value1, Quaternion value2)
72 {
73 if (value1.X == value2.X && value1.Y == value2.Y && value1.Z == value2.Z)
74 {
75 return value1.W == value2.W;
76 }
77 return false;
78 }
79
80 public static bool operator !=(Quaternion value1, Quaternion value2)
81 {
82 return !(value1 == value2);
83 }
84
85 public static Quaternion operator *(Quaternion value1, Quaternion value2)
86 {
87 float x = value1.X;
88 float y = value1.Y;
89 float z = value1.Z;
90 float w = value1.W;
91 float x2 = value2.X;
92 float y2 = value2.Y;
93 float z2 = value2.Z;
94 float w2 = value2.W;
95 float num = y * z2 - z * y2;
96 float num2 = z * x2 - x * z2;
97 float num3 = x * y2 - y * x2;
98 float num4 = x * x2 + y * y2 + z * z2;
99 System.Runtime.CompilerServices.Unsafe.SkipInit(out Quaternion result);
100 result.X = x * w2 + x2 * w + num;
101 result.Y = y * w2 + y2 * w + num2;
102 result.Z = z * w2 + z2 * w + num3;
103 result.W = w * w2 - num4;
104 return result;
105 }
106
107 public static Quaternion operator *(Quaternion value1, float value2)
108 {
109 System.Runtime.CompilerServices.Unsafe.SkipInit(out Quaternion result);
110 result.X = value1.X * value2;
111 result.Y = value1.Y * value2;
112 result.Z = value1.Z * value2;
113 result.W = value1.W * value2;
114 return result;
115 }
116
117 public static Quaternion operator -(Quaternion value1, Quaternion value2)
118 {
119 System.Runtime.CompilerServices.Unsafe.SkipInit(out Quaternion result);
120 result.X = value1.X - value2.X;
121 result.Y = value1.Y - value2.Y;
122 result.Z = value1.Z - value2.Z;
123 result.W = value1.W - value2.W;
124 return result;
125 }
126
128 {
129 System.Runtime.CompilerServices.Unsafe.SkipInit(out Quaternion result);
130 result.X = 0f - value.X;
131 result.Y = 0f - value.Y;
132 result.Z = 0f - value.Z;
133 result.W = 0f - value.W;
134 return result;
135 }
136
137 [MethodImpl(MethodImplOptions.AggressiveInlining)]
138 public static Quaternion Add(Quaternion value1, Quaternion value2)
139 {
140 return value1 + value2;
141 }
142
143 public static Quaternion Concatenate(Quaternion value1, Quaternion value2)
144 {
145 float x = value2.X;
146 float y = value2.Y;
147 float z = value2.Z;
148 float w = value2.W;
149 float x2 = value1.X;
150 float y2 = value1.Y;
151 float z2 = value1.Z;
152 float w2 = value1.W;
153 float num = y * z2 - z * y2;
154 float num2 = z * x2 - x * z2;
155 float num3 = x * y2 - y * x2;
156 float num4 = x * x2 + y * y2 + z * z2;
157 System.Runtime.CompilerServices.Unsafe.SkipInit(out Quaternion result);
158 result.X = x * w2 + x2 * w + num;
159 result.Y = y * w2 + y2 * w + num2;
160 result.Z = z * w2 + z2 * w + num3;
161 result.W = w * w2 - num4;
162 return result;
163 }
164
166 {
167 System.Runtime.CompilerServices.Unsafe.SkipInit(out Quaternion result);
168 result.X = 0f - value.X;
169 result.Y = 0f - value.Y;
170 result.Z = 0f - value.Z;
171 result.W = value.W;
172 return result;
173 }
174
175 public static Quaternion CreateFromAxisAngle(Vector3 axis, float angle)
176 {
177 float x = angle * 0.5f;
178 float num = MathF.Sin(x);
179 float w = MathF.Cos(x);
180 System.Runtime.CompilerServices.Unsafe.SkipInit(out Quaternion result);
181 result.X = axis.X * num;
182 result.Y = axis.Y * num;
183 result.Z = axis.Z * num;
184 result.W = w;
185 return result;
186 }
187
189 {
190 float num = matrix.M11 + matrix.M22 + matrix.M33;
191 Quaternion result = default(Quaternion);
192 if (num > 0f)
193 {
194 float num2 = MathF.Sqrt(num + 1f);
195 result.W = num2 * 0.5f;
196 num2 = 0.5f / num2;
197 result.X = (matrix.M23 - matrix.M32) * num2;
198 result.Y = (matrix.M31 - matrix.M13) * num2;
199 result.Z = (matrix.M12 - matrix.M21) * num2;
200 }
201 else if (matrix.M11 >= matrix.M22 && matrix.M11 >= matrix.M33)
202 {
203 float num3 = MathF.Sqrt(1f + matrix.M11 - matrix.M22 - matrix.M33);
204 float num4 = 0.5f / num3;
205 result.X = 0.5f * num3;
206 result.Y = (matrix.M12 + matrix.M21) * num4;
207 result.Z = (matrix.M13 + matrix.M31) * num4;
208 result.W = (matrix.M23 - matrix.M32) * num4;
209 }
210 else if (matrix.M22 > matrix.M33)
211 {
212 float num5 = MathF.Sqrt(1f + matrix.M22 - matrix.M11 - matrix.M33);
213 float num6 = 0.5f / num5;
214 result.X = (matrix.M21 + matrix.M12) * num6;
215 result.Y = 0.5f * num5;
216 result.Z = (matrix.M32 + matrix.M23) * num6;
217 result.W = (matrix.M31 - matrix.M13) * num6;
218 }
219 else
220 {
221 float num7 = MathF.Sqrt(1f + matrix.M33 - matrix.M11 - matrix.M22);
222 float num8 = 0.5f / num7;
223 result.X = (matrix.M31 + matrix.M13) * num8;
224 result.Y = (matrix.M32 + matrix.M23) * num8;
225 result.Z = 0.5f * num7;
226 result.W = (matrix.M12 - matrix.M21) * num8;
227 }
228 return result;
229 }
230
231 public static Quaternion CreateFromYawPitchRoll(float yaw, float pitch, float roll)
232 {
233 float x = roll * 0.5f;
234 float num = MathF.Sin(x);
235 float num2 = MathF.Cos(x);
236 float x2 = pitch * 0.5f;
237 float num3 = MathF.Sin(x2);
238 float num4 = MathF.Cos(x2);
239 float x3 = yaw * 0.5f;
240 float num5 = MathF.Sin(x3);
241 float num6 = MathF.Cos(x3);
242 System.Runtime.CompilerServices.Unsafe.SkipInit(out Quaternion result);
243 result.X = num6 * num3 * num2 + num5 * num4 * num;
244 result.Y = num5 * num4 * num2 - num6 * num3 * num;
245 result.Z = num6 * num4 * num - num5 * num3 * num2;
246 result.W = num6 * num4 * num2 + num5 * num3 * num;
247 return result;
248 }
249
250 [MethodImpl(MethodImplOptions.AggressiveInlining)]
251 public static Quaternion Divide(Quaternion value1, Quaternion value2)
252 {
253 return value1 / value2;
254 }
255
256 public static float Dot(Quaternion quaternion1, Quaternion quaternion2)
257 {
258 return quaternion1.X * quaternion2.X + quaternion1.Y * quaternion2.Y + quaternion1.Z * quaternion2.Z + quaternion1.W * quaternion2.W;
259 }
260
262 {
263 float num = value.X * value.X + value.Y * value.Y + value.Z * value.Z + value.W * value.W;
264 float num2 = 1f / num;
265 System.Runtime.CompilerServices.Unsafe.SkipInit(out Quaternion result);
266 result.X = (0f - value.X) * num2;
267 result.Y = (0f - value.Y) * num2;
268 result.Z = (0f - value.Z) * num2;
269 result.W = value.W * num2;
270 return result;
271 }
272
273 public static Quaternion Lerp(Quaternion quaternion1, Quaternion quaternion2, float amount)
274 {
275 float num = 1f - amount;
276 Quaternion result = default(Quaternion);
277 float num2 = quaternion1.X * quaternion2.X + quaternion1.Y * quaternion2.Y + quaternion1.Z * quaternion2.Z + quaternion1.W * quaternion2.W;
278 if (num2 >= 0f)
279 {
280 result.X = num * quaternion1.X + amount * quaternion2.X;
281 result.Y = num * quaternion1.Y + amount * quaternion2.Y;
282 result.Z = num * quaternion1.Z + amount * quaternion2.Z;
283 result.W = num * quaternion1.W + amount * quaternion2.W;
284 }
285 else
286 {
287 result.X = num * quaternion1.X - amount * quaternion2.X;
288 result.Y = num * quaternion1.Y - amount * quaternion2.Y;
289 result.Z = num * quaternion1.Z - amount * quaternion2.Z;
290 result.W = num * quaternion1.W - amount * quaternion2.W;
291 }
292 float x = result.X * result.X + result.Y * result.Y + result.Z * result.Z + result.W * result.W;
293 float num3 = 1f / MathF.Sqrt(x);
294 result.X *= num3;
295 result.Y *= num3;
296 result.Z *= num3;
297 result.W *= num3;
298 return result;
299 }
300
301 [MethodImpl(MethodImplOptions.AggressiveInlining)]
302 public static Quaternion Multiply(Quaternion value1, Quaternion value2)
303 {
304 return value1 * value2;
305 }
306
307 [MethodImpl(MethodImplOptions.AggressiveInlining)]
308 public static Quaternion Multiply(Quaternion value1, float value2)
309 {
310 return value1 * value2;
311 }
312
313 [MethodImpl(MethodImplOptions.AggressiveInlining)]
315 {
316 return -value;
317 }
318
320 {
321 float x = value.X * value.X + value.Y * value.Y + value.Z * value.Z + value.W * value.W;
322 float num = 1f / MathF.Sqrt(x);
323 System.Runtime.CompilerServices.Unsafe.SkipInit(out Quaternion result);
324 result.X = value.X * num;
325 result.Y = value.Y * num;
326 result.Z = value.Z * num;
327 result.W = value.W * num;
328 return result;
329 }
330
331 public static Quaternion Slerp(Quaternion quaternion1, Quaternion quaternion2, float amount)
332 {
333 float num = quaternion1.X * quaternion2.X + quaternion1.Y * quaternion2.Y + quaternion1.Z * quaternion2.Z + quaternion1.W * quaternion2.W;
334 bool flag = false;
335 if (num < 0f)
336 {
337 flag = true;
338 num = 0f - num;
339 }
340 float num2;
341 float num3;
342 if (num > 0.999999f)
343 {
344 num2 = 1f - amount;
345 num3 = (flag ? (0f - amount) : amount);
346 }
347 else
348 {
349 float num4 = MathF.Acos(num);
350 float num5 = 1f / MathF.Sin(num4);
351 num2 = MathF.Sin((1f - amount) * num4) * num5;
352 num3 = (flag ? ((0f - MathF.Sin(amount * num4)) * num5) : (MathF.Sin(amount * num4) * num5));
353 }
354 System.Runtime.CompilerServices.Unsafe.SkipInit(out Quaternion result);
355 result.X = num2 * quaternion1.X + num3 * quaternion2.X;
356 result.Y = num2 * quaternion1.Y + num3 * quaternion2.Y;
357 result.Z = num2 * quaternion1.Z + num3 * quaternion2.Z;
358 result.W = num2 * quaternion1.W + num3 * quaternion2.W;
359 return result;
360 }
361
362 [MethodImpl(MethodImplOptions.AggressiveInlining)]
363 public static Quaternion Subtract(Quaternion value1, Quaternion value2)
364 {
365 return value1 - value2;
366 }
367
368 public override readonly bool Equals([NotNullWhen(true)] object? obj)
369 {
370 if (obj is Quaternion other)
371 {
372 return Equals(other);
373 }
374 return false;
375 }
376
377 public readonly bool Equals(Quaternion other)
378 {
379 return this == other;
380 }
381
382 public override readonly int GetHashCode()
383 {
384 return X.GetHashCode() + Y.GetHashCode() + Z.GetHashCode() + W.GetHashCode();
385 }
386
387 public readonly float Length()
388 {
389 float x = LengthSquared();
390 return MathF.Sqrt(x);
391 }
392
393 public readonly float LengthSquared()
394 {
395 return X * X + Y * Y + Z * Z + W * W;
396 }
397
398 public override readonly string ToString()
399 {
400 return $"{{X:{X} Y:{Y} Z:{Z} W:{W}}}";
401 }
402}
static float Sqrt(float x)
static float Acos(float x)
static float Cos(float x)
static float Sin(float x)
static Quaternion Identity
Definition Quaternion.cs:17
static Quaternion CreateFromRotationMatrix(Matrix4x4 matrix)
static Quaternion Conjugate(Quaternion value)
static Quaternion operator-(Quaternion value1, Quaternion value2)
static Quaternion Slerp(Quaternion quaternion1, Quaternion quaternion2, float amount)
static Quaternion CreateFromAxisAngle(Vector3 axis, float angle)
static bool operator==(Quaternion value1, Quaternion value2)
Definition Quaternion.cs:71
static Quaternion operator+(Quaternion value1, Quaternion value2)
Definition Quaternion.cs:37
static Quaternion operator*(Quaternion value1, Quaternion value2)
Definition Quaternion.cs:85
static Quaternion Add(Quaternion value1, Quaternion value2)
static Quaternion Concatenate(Quaternion value1, Quaternion value2)
static Quaternion Multiply(Quaternion value1, Quaternion value2)
static Quaternion Inverse(Quaternion value)
override readonly bool Equals([NotNullWhen(true)] object? obj)
static bool operator!=(Quaternion value1, Quaternion value2)
Definition Quaternion.cs:80
static Quaternion operator/(Quaternion value1, Quaternion value2)
Definition Quaternion.cs:47
readonly float LengthSquared()
static Quaternion Lerp(Quaternion quaternion1, Quaternion quaternion2, float amount)
static Quaternion Multiply(Quaternion value1, float value2)
readonly bool Equals(Quaternion other)
readonly float Length()
static float Dot(Quaternion quaternion1, Quaternion quaternion2)
static Quaternion Normalize(Quaternion value)
Quaternion(Vector3 vectorPart, float scalarPart)
Definition Quaternion.cs:29
static Quaternion Subtract(Quaternion value1, Quaternion value2)
static Quaternion Divide(Quaternion value1, Quaternion value2)
Quaternion(float x, float y, float z, float w)
Definition Quaternion.cs:21
static Quaternion CreateFromYawPitchRoll(float yaw, float pitch, float roll)
override readonly int GetHashCode()
static Quaternion Negate(Quaternion value)
override readonly string ToString()