Ver código fonte

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

Daniele Bartolini 10 anos atrás
pai
commit
afba341d5c
4 arquivos alterados com 122 adições e 114 exclusões
  1. 31 0
      src/core/integer.h
  2. 0 19
      src/core/math/math_utils.h
  3. 28 27
      src/core/math/matrix3x3.h
  4. 63 68
      src/core/math/matrix4x4.h

+ 31 - 0
src/core/integer.h

@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2012-2015 Daniele Bartolini and individual contributors.
+ * License: https://github.com/taylor001/crown/blob/master/LICENSE
+ */
+
+#pragma once
+
+#include "types.h"
+
+namespace crown
+{
+
+inline uint32_t next_pow_2(uint32_t x)
+{
+	x--;
+
+	x = (x >> 1) | x;
+	x = (x >> 2) | x;
+	x = (x >> 4) | x;
+	x = (x >> 8) | x;
+	x = (x >> 16) | x;
+
+	return ++x;
+}
+
+inline bool is_pow_2(uint32_t x)
+{
+	return !(x & (x - 1)) && x;
+}
+
+} // namespace crown

+ 0 - 19
src/core/math/math_utils.h

@@ -5,7 +5,6 @@
 
 #pragma once
 
-#include "types.h"
 #include <math.h>
 
 namespace crown
@@ -48,24 +47,6 @@ inline float to_deg(float rad)
 	return rad * 180.0f / PI;
 }
 
-inline uint32_t next_pow_2(uint32_t x)
-{
-	x--;
-
-	x = (x >> 1) | x;
-	x = (x >> 2) | x;
-	x = (x >> 4) | x;
-	x = (x >> 8) | x;
-	x = (x >> 16) | x;
-
-	return ++x;
-}
-
-inline bool is_pow_2(uint32_t x)
-{
-	return !(x & (x - 1)) && x;
-}
-
 /// Returns the linear interpolated value between @a p0 and @a p1 at time @a t
 inline float lerp(const float p0, const float p1, float t)
 {

+ 28 - 27
src/core/math/matrix3x3.h

@@ -173,38 +173,39 @@ inline Matrix3x3 get_transposed(Matrix3x3 m)
 /// Returns the determinant of the matrix @a m.
 inline float determinant(const Matrix3x3& m)
 {
-	return	m.x.x * (m.y.y * m.z.z - m.z.y * m.y.z) -
-			m.y.x * (m.x.y * m.z.z - m.z.y * m.x.z) +
-			m.z.x * (m.x.y * m.y.z - m.y.y * m.x.z);
+	return	+ m.x.x * (m.y.y * m.z.z - m.z.y * m.y.z)
+			- m.y.x * (m.x.y * m.z.z - m.z.y * m.x.z)
+			+ m.z.x * (m.x.y * m.y.z - m.y.y * m.x.z)
+			;
 }
 
 /// Inverts the matrix @a m and returns the result.
 inline Matrix3x3& invert(Matrix3x3& m)
 {
-	Matrix3x3 mat;
-
-	mat.x.x = (m.y.y * m.z.z - m.z.y * m.y.z);
-	mat.x.y = (m.x.y * m.z.z - m.z.y * m.x.z);
-	mat.x.z = (m.x.y * m.y.z - m.y.y * m.x.z);
-
-	const float inv_det = 1.0f / (m.x.x * mat.x.x - m.y.x * mat.x.y + m.z.x * mat.x.z);
-
-	mat.y.x = (m.y.x * m.z.z - m.z.x * m.y.z);
-	mat.y.y = (m.x.x * m.z.z - m.z.x * m.x.z);
-	mat.y.z = (m.x.x * m.y.z - m.y.x * m.x.z);
-	mat.z.x = (m.y.x * m.z.y - m.z.x * m.y.y);
-	mat.z.y = (m.x.x * m.z.y - m.z.x * m.x.y);
-	mat.z.z = (m.x.x * m.y.y - m.y.x * m.x.y);
-
-	m.x.x = + mat.x.x * inv_det;
-	m.x.y = - mat.x.y * inv_det;
-	m.x.z = + mat.x.z * inv_det;
-	m.y.x = - mat.y.x * inv_det;
-	m.y.y = + mat.y.y * inv_det;
-	m.y.z = - mat.y.z * inv_det;
-	m.z.x = + mat.z.x * inv_det;
-	m.z.y = - mat.z.y * inv_det;
-	m.z.z = + mat.z.z * inv_det;
+	const float xx = m.x.x;
+	const float xy = m.x.y;
+	const float xz = m.x.z;
+	const float yx = m.y.x;
+	const float yy = m.y.y;
+	const float yz = m.y.z;
+	const float zx = m.z.x;
+	const float zy = m.z.y;
+	const float zz = m.z.z;
+
+	const float det = determinant(m);
+	const float inv_det = 1.0f / det;
+
+	m.x.x = + (yy*zz - zy*yz) * inv_det;
+	m.x.y = - (xy*zz - zy*xz) * inv_det;
+	m.x.z = + (xy*yz - yy*xz) * inv_det;
+
+	m.y.x = - (yx*zz - zx*yz) * inv_det;
+	m.y.y = + (xx*zz - zx*xz) * inv_det;
+	m.y.z = - (xx*yz - yx*xz) * inv_det;
+
+	m.z.x = + (yx*zy - zx*yy) * inv_det;
+	m.z.y = - (xx*zy - zx*xy) * inv_det;
+	m.z.z = + (xx*yy - yx*xy) * inv_det;
 
 	return m;
 }

+ 63 - 68
src/core/math/matrix4x4.h

@@ -396,79 +396,74 @@ inline void set_look(Matrix4x4& m, const Vector3& pos, const Vector3& target, co
 /// Returns the determinant of the matrix @a m.
 inline float determinant(const Matrix4x4& m)
 {
-	const float m02m07_m06m03 = m.x.z * m.y.w - m.y.z * m.x.w;
-	const float m02m11_m10m03 = m.x.z * m.z.w - m.z.z * m.x.w;
-	const float m02m15_m14m03 = m.x.z * m.t.w - m.t.z * m.x.w;
-	const float m06m11_m10m07 = m.y.z * m.z.w - m.z.z * m.y.w;
-	const float m06m15_m14m07 = m.y.z * m.t.w - m.t.z * m.y.w;
-	const float m10m15_m14m11 = m.z.z * m.t.w - m.t.z * m.z.w;
-
-	return 	+ m.x.x * (m.y.y * m10m15_m14m11 - m.z.y * m06m15_m14m07 + m.t.y * m06m11_m10m07)
-			- m.y.x * (m.x.y * m10m15_m14m11 - m.z.y * m02m15_m14m03 + m.t.y * m02m11_m10m03)
-			+ m.z.x * (m.x.y * m06m15_m14m07 - m.y.y * m02m15_m14m03 + m.t.y * m02m07_m06m03)
-			- m.t.x * (m.x.y * m06m11_m10m07 - m.y.y * m02m11_m10m03 + m.z.y * m02m07_m06m03);
+	const float xx = m.x.x;
+	const float xy = m.x.y;
+	const float xz = m.x.z;
+	const float xw = m.x.w;
+	const float yx = m.y.x;
+	const float yy = m.y.y;
+	const float yz = m.y.z;
+	const float yw = m.y.w;
+	const float zx = m.z.x;
+	const float zy = m.z.y;
+	const float zz = m.z.z;
+	const float zw = m.z.w;
+	const float tx = m.t.x;
+	const float ty = m.t.y;
+	const float tz = m.t.z;
+	const float tw = m.t.w;
+
+	float det = 0.0f;
+	det += + xx * (yy * (zz*tw - tz*zw) - zy * (yz*tw - tz*yw) + ty * (yz*zw - zz*yw));
+	det += - yx * (xy * (zz*tw - tz*zw) - zy * (xz*tw - tz*xw) + ty * (xz*zw - zz*xw));
+	det += + zx * (xy * (yz*tw - tz*yw) - yy * (xz*tw - tz*xw) + ty * (xz*yw - yz*xw));
+	det += - tx * (xy * (yz*zw - zz*yw) - yy * (xz*zw - zz*xw) + zy * (xz*yw - yz*xw));
+
+	return det;
 }
 
 /// Inverts the matrix @a m and returns the result.
 inline Matrix4x4& invert(Matrix4x4& m)
 {
-	Matrix4x4 mat;
-
-	const float m01m06_m05m02 = m.x.y * m.y.z - m.y.y * m.x.z;
-	const float m01m07_m05m03 = m.x.y * m.y.w - m.y.y * m.x.w;
-	const float m01m10_m09m02 = m.x.y * m.z.z - m.z.y * m.x.z;
-	const float m01m11_m09m03 = m.x.y * m.z.w - m.z.y * m.x.w;
-	const float m01m14_m13m02 = m.x.y * m.t.z - m.t.y * m.x.z;
-	const float m01m15_m13m03 = m.x.y * m.t.w - m.t.y * m.x.w;
-	const float m02m07_m06m03 = m.x.z * m.y.w - m.y.z * m.x.w;
-	const float m02m11_m10m03 = m.x.z * m.z.w - m.z.z * m.x.w;
-	const float m02m15_m14m03 = m.x.z * m.t.w - m.t.z * m.x.w;
-	const float m05m10_m09m06 = m.y.y * m.z.z - m.z.y * m.y.z;
-	const float m05m11_m09m07 = m.y.y * m.z.w - m.z.y * m.y.w;
-	const float m05m14_m13m06 = m.y.y * m.t.z - m.t.y * m.y.z;
-	const float m05m15_m13m07 = m.y.y * m.t.w - m.t.y * m.y.w;
-	const float m06m11_m10m07 = m.y.z * m.z.w - m.z.z * m.y.w;
-	const float m06m15_m14m07 = m.y.z * m.t.w - m.t.z * m.y.w;
-	const float m09m14_m13m10 = m.z.y * m.t.z - m.t.y * m.z.z;
-	const float m09m15_m13m11 = m.z.y * m.t.w - m.t.y * m.z.w;
-	const float m10m15_m14m11 = m.z.z * m.t.w - m.t.z * m.z.w;
-
-	mat.x.x = (+ m.y.y * m10m15_m14m11 - m.z.y * m06m15_m14m07 + m.t.y * m06m11_m10m07);
-	mat.x.y = (+ m.x.y * m10m15_m14m11 - m.z.y * m02m15_m14m03 + m.t.y * m02m11_m10m03);
-	mat.x.z = (+ m.x.y * m06m15_m14m07 - m.y.y * m02m15_m14m03 + m.t.y * m02m07_m06m03);
-	mat.x.w = (+ m.x.y * m06m11_m10m07 - m.y.y * m02m11_m10m03 + m.z.y * m02m07_m06m03);
-
-	const float inv_det = 1.0f / (m.x.x * mat.x.x - m.y.x * mat.x.y + m.z.x * mat.x.z - m.t.x * mat.x.w);
-
-	mat.y.x = (+ m.y.x * m10m15_m14m11 - m.z.x * m06m15_m14m07 + m.t.x * m06m11_m10m07);
-	mat.y.y = (+ m.x.x * m10m15_m14m11 - m.z.x * m02m15_m14m03 + m.t.x * m02m11_m10m03);
-	mat.y.z = (+ m.x.x * m06m15_m14m07 - m.y.x * m02m15_m14m03 + m.t.x * m02m07_m06m03);
-	mat.y.w = (+ m.x.x * m06m11_m10m07 - m.y.x * m02m11_m10m03 + m.z.x * m02m07_m06m03);
-	mat.z.x = (+ m.y.x * m09m15_m13m11 - m.z.x * m05m15_m13m07 + m.t.x * m05m11_m09m07);
-	mat.z.y = (+ m.x.x * m09m15_m13m11 - m.z.x * m01m15_m13m03 + m.t.x * m01m11_m09m03);
-	mat.z.z = (+ m.x.x * m05m15_m13m07 - m.y.x * m01m15_m13m03 + m.t.x * m01m07_m05m03);
-	mat.z.w = (+ m.x.x * m05m11_m09m07 - m.y.x * m01m11_m09m03 + m.z.x * m01m07_m05m03);
-	mat.t.x = (+ m.y.x * m09m14_m13m10 - m.z.x * m05m14_m13m06 + m.t.x * m05m10_m09m06);
-	mat.t.y = (+ m.x.x * m09m14_m13m10 - m.z.x * m01m14_m13m02 + m.t.x * m01m10_m09m02);
-	mat.t.z = (+ m.x.x * m05m14_m13m06 - m.y.x * m01m14_m13m02 + m.t.x * m01m06_m05m02);
-	mat.t.w = (+ m.x.x * m05m10_m09m06 - m.y.x * m01m10_m09m02 + m.z.x * m01m06_m05m02);
-
-	m.x.x = + mat.x.x * inv_det;
-	m.x.y = - mat.x.y * inv_det;
-	m.x.z = + mat.x.z * inv_det;
-	m.x.w = - mat.x.w * inv_det;
-	m.y.x = - mat.y.x * inv_det;
-	m.y.y = + mat.y.y * inv_det;
-	m.y.z = - mat.y.z * inv_det;
-	m.y.w = + mat.y.w * inv_det;
-	m.z.x = + mat.z.x * inv_det;
-	m.z.y = - mat.z.y * inv_det;
-	m.z.z = + mat.z.z * inv_det;
-	m.z.w = - mat.z.w * inv_det;
-	m.t.x = - mat.t.x * inv_det;
-	m.t.y = + mat.t.y * inv_det;
-	m.t.z = - mat.t.z * inv_det;
-	m.t.w = + mat.t.w * inv_det;
+	const float xx = m.x.x;
+	const float xy = m.x.y;
+	const float xz = m.x.z;
+	const float xw = m.x.w;
+	const float yx = m.y.x;
+	const float yy = m.y.y;
+	const float yz = m.y.z;
+	const float yw = m.y.w;
+	const float zx = m.z.x;
+	const float zy = m.z.y;
+	const float zz = m.z.z;
+	const float zw = m.z.w;
+	const float tx = m.t.x;
+	const float ty = m.t.y;
+	const float tz = m.t.z;
+	const float tw = m.t.w;
+
+	const float det = determinant(m);
+	const float inv_det = 1.0f / det;
+
+	m.x.x = + (yy * (zz*tw - tz*zw) - zy * (yz*tw - tz*yw) + ty * (yz*zw - zz*yw)) * inv_det;
+	m.x.y = - (xy * (zz*tw - tz*zw) - zy * (xz*tw - tz*xw) + ty * (xz*zw - zz*xw)) * inv_det;
+	m.x.z = + (xy * (yz*tw - tz*yw) - yy * (xz*tw - tz*xw) + ty * (xz*yw - yz*xw)) * inv_det;
+	m.x.w = - (xy * (yz*zw - zz*yw) - yy * (xz*zw - zz*xw) + zy * (xz*yw - yz*xw)) * inv_det;
+
+	m.y.x = - (yx * (zz*tw - tz*zw) - zx * (yz*tw - tz*yw) + tx * (yz*zw - zz*yw)) * inv_det;
+	m.y.y = + (xx * (zz*tw - tz*zw) - zx * (xz*tw - tz*xw) + tx * (xz*zw - zz*xw)) * inv_det;
+	m.y.z = - (xx * (yz*tw - tz*yw) - yx * (xz*tw - tz*xw) + tx * (xz*yw - yz*xw)) * inv_det;
+	m.y.w = + (xx * (yz*zw - zz*yw) - yx * (xz*zw - zz*xw) + zx * (xz*yw - yz*xw)) * inv_det;
+
+	m.z.x = + (yx * (zy*tw - ty*zw) - zx * (yy*tw - ty*yw) + tx * (yy*zw - zy*yw)) * inv_det;
+	m.z.y = - (xx * (zy*tw - ty*zw) - zx * (xy*tw - ty*xw) + tx * (xy*zw - zy*xw)) * inv_det;
+	m.z.z = + (xx * (yy*tw - ty*yw) - yx * (xy*tw - ty*xw) + tx * (xy*yw - yy*xw)) * inv_det;
+	m.z.w = - (xx * (yy*zw - zy*yw) - yx * (xy*zw - zy*xw) + zx * (xy*yw - yy*xw)) * inv_det;
+
+	m.t.x = - (yx * (zy*tz - ty*zz) - zx * (yy*tz - ty*yz) + tx * (yy*zz - zy*yz)) * inv_det;
+	m.t.y = + (xx * (zy*tz - ty*zz) - zx * (xy*tz - ty*xz) + tx * (xy*zz - zy*xz)) * inv_det;
+	m.t.z = - (xx * (yy*tz - ty*yz) - yx * (xy*tz - ty*xz) + tx * (xy*yz - yy*xz)) * inv_det;
+	m.t.w = + (xx * (yy*zz - zy*yz) - yx * (xy*zz - zy*xz) + zx * (xy*yz - yy*xz)) * inv_det;
 
 	return m;
 }