Преглед на файлове

Merge branch 'master' of github.com:taylor001/crown

Daniele Bartolini преди 10 години
родител
ревизия
bc95f68477
променени са 2 файла, в които са добавени 21 реда и са изтрити 16 реда
  1. 7 4
      src/core/json/json_parser.cpp
  2. 14 12
      src/core/math/quaternion.h

+ 7 - 4
src/core/json/json_parser.cpp

@@ -189,10 +189,13 @@ Quaternion JSONElement::to_quaternion(const Quaternion& def) const
 	Array<const char*> array(alloc);
 	njson::parse_array(_at, array);
 
-	return quaternion(njson::parse_float(array[0]),
-		njson::parse_float(array[1]),
-		njson::parse_float(array[2]),
-		njson::parse_float(array[3]));
+	const Vector3 axis = vector3(njson::parse_float(array[0])
+		, njson::parse_float(array[1])
+		, njson::parse_float(array[2])
+		);
+	const float angle = njson::parse_float(array[3]);
+
+	return quaternion(axis, angle);
 }
 
 Matrix4x4 JSONElement::to_matrix4x4(const Matrix4x4& def) const

+ 14 - 12
src/core/math/quaternion.h

@@ -5,7 +5,6 @@
 
 #pragma once
 
-#include "types.h"
 #include "math_types.h"
 #include "math_utils.h"
 #include "matrix3x3.h"
@@ -39,14 +38,14 @@ Quaternion quaternion(const Matrix3x3& m);
 
 inline Quaternion& operator*=(Quaternion& a, const Quaternion& b)
 {
-	const float t_w = a.w*b.w - a.x*b.x - a.y*b.y - a.z*b.z;
-	const float t_x = a.w*b.x + a.x*b.w + a.y*b.z - a.z*b.y;
-	const float t_y = a.w*b.y + a.y*b.w + a.z*b.x - a.x*b.z;
-	const float t_z = a.w*b.z + a.z*b.w + a.x*b.y - a.y*b.x;
-	a.x = t_x;
-	a.y = t_y;
-	a.z = t_z;
-	a.w = t_w;
+	const float tx = a.w*b.x + a.x*b.w + a.y*b.z - a.z*b.y;
+	const float ty = a.w*b.y + a.y*b.w + a.z*b.x - a.x*b.z;
+	const float tz = a.w*b.z + a.z*b.w + a.x*b.y - a.y*b.x;
+	const float tw = a.w*b.w - a.x*b.x - a.y*b.y - a.z*b.z;
+	a.x = tx;
+	a.y = ty;
+	a.z = tz;
+	a.w = tw;
 	return a;
 }
 
@@ -88,13 +87,14 @@ inline float dot(const Quaternion& a, const Quaternion& b)
 /// Returns the length of @a q.
 inline float length(const Quaternion& q)
 {
-	return sqrtf(q.w * q.w + q.x * q.x + q.y * q.y + q.z * q.z);
+	return sqrtf(dot(q, q));
 }
 
 /// Normalizes the quaternion @a q and returns the result.
 inline Quaternion& normalize(Quaternion& q)
 {
-	const float inv_len = 1.0f / length(q);
+	const float len = length(q);
+	const float inv_len = 1.0f / len;
 	q.x *= inv_len;
 	q.y *= inv_len;
 	q.z *= inv_len;
@@ -116,7 +116,9 @@ inline Quaternion conjugate(const Quaternion& q)
 /// Returns the inverse of quaternion @a q.
 inline Quaternion inverse(const Quaternion& q)
 {
-	return conjugate(q) * (1.0f / length(q));
+	const float len = length(q);
+	const float inv_len = 1.0f / len;
+	return conjugate(q) * inv_len;
 }
 
 /// Returns the quaternion @a q raised to the power of @a exp.