[Bf-blender-cvs] [25bb898] soc-2014-viewport_fx: New Matrix and Vector Operations for Viewport FX

Jason Wilkins noreply at git.blender.org
Wed Jun 25 23:42:44 CEST 2014


Commit: 25bb89896cd6c8336ed841f84340a57e3ee1a1b8
Author: Jason Wilkins
Date:   Wed Jun 25 16:10:39 2014 -0500
https://developer.blender.org/rB25bb89896cd6c8336ed841f84340a57e3ee1a1b8

New Matrix and Vector Operations for Viewport FX

New functions required for emulation an OpenGL style matrix stack on the GPU
New functions that replace functionality provided by GLU
Some fixes to make various matrix and vector functions const correct
More efficient '_q' matrix functions that assume no pointer aliasing
A set of macros for initializing vector arrays (VEC2D, VEC3D, VEC4D)
2 and 4 dimensional versions of VECCOPY macro
Typo fix, ortho_v2_v2 formal parameter implied a 3 element array, instead of the proper 2

===================================================================

M	source/blender/blenlib/BLI_math_matrix.h
M	source/blender/blenlib/BLI_math_vector.h
M	source/blender/blenlib/BLI_utildefines.h
M	source/blender/blenlib/intern/math_matrix.c
M	source/blender/blenlib/intern/math_vector.c
M	source/blender/blenlib/intern/math_vector_inline.c

===================================================================

diff --git a/source/blender/blenlib/BLI_math_matrix.h b/source/blender/blenlib/BLI_math_matrix.h
index d149ad7..a980e98 100644
--- a/source/blender/blenlib/BLI_math_matrix.h
+++ b/source/blender/blenlib/BLI_math_matrix.h
@@ -30,6 +30,8 @@
  *  \ingroup bli
  */
 
+#include "BLI_utildefines.h" // for restrict
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -55,10 +57,10 @@ void zero_m4(float R[4][4]);
 void unit_m3(float R[3][3]);
 void unit_m4(float R[4][4]);
 
-void copy_m3_m3(float R[3][3], float A[3][3]);
-void copy_m4_m4(float R[4][4], float A[4][4]);
-void copy_m3_m4(float R[3][3], float A[4][4]);
-void copy_m4_m3(float R[4][4], float A[3][3]);
+void copy_m3_m3(float R[3][3], const float A[3][3]);
+void copy_m4_m4(float R[4][4], const float A[4][4]);
+void copy_m3_m4(float R[3][3], const float A[4][4]);
+void copy_m4_m3(float R[4][4], const float A[3][3]);
 
 /* double->float */
 void copy_m3_m3d(float R[3][3], double A[3][3]);
@@ -74,11 +76,14 @@ void add_m4_m4m4(float R[4][4], float A[4][4], float B[4][4]);
 void sub_m3_m3m3(float R[3][3], float A[3][3], float B[3][3]);
 void sub_m4_m4m4(float R[4][4], float A[4][4], float B[4][4]);
 
-void mul_m3_m3m3(float R[3][3], float A[3][3], float B[3][3]);
-void mul_m4_m3m4(float R[4][4], float A[3][3], float B[4][4]);
-void mul_m4_m4m3(float R[4][4], float A[4][4], float B[3][3]);
-void mul_m4_m4m4(float R[4][4], float A[4][4], float B[4][4]);
-void mul_m3_m3m4(float R[3][3], float A[4][4], float B[3][3]);
+void mul_m3_m3m3(float R[3][3], const float A[3][3], const float B[3][3]);
+void mul_m4_m3m4(float R[4][4], const float A[3][3], const float B[4][4]);
+void mul_m4_m4m3(float R[4][4], const float A[4][4], const float B[3][3]);
+void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4]);
+void mul_m3_m3m4(float R[3][3], const float A[4][4], const float B[3][3]);
+
+void mult_m4_m4m4_q(float m1[4][4], const float m3[4][4], const float m2[4][4]);
+void mult_m4_m3m4_q(float m1[4][4], const float m3[4][4], const float m2[3][3]);
 
 void mul_serie_m3(float R[3][3],
                   float M1[3][3], float M2[3][3], float M3[3][3], float M4[3][3],
@@ -92,9 +97,11 @@ void mul_v3_m4v3(float r[3], float M[4][4], const float v[3]);
 void mul_v2_m4v3(float r[2], float M[4][4], const float v[3]);
 void mul_v2_m2v2(float r[2], float M[2][2], const float v[2]);
 void mul_m2v2(float M[2][2], float v[2]);
+void mul_v4_m4v3(float r[4], const float M[4][4], const float v[3]);
+void mul_v3_m4v3_q(float r[3], float M[4][4], const float v[3]);
 void mul_mat3_m4_v3(float M[4][4], float r[3]);
-void mul_m4_v4(float M[4][4], float r[4]);
-void mul_v4_m4v4(float r[4], float M[4][4], const float v[4]);
+void mul_m4_v4(const float M[4][4], float r[4]);
+void mul_v4_m4v4(float r[4], const float M[4][4], const float v[4]);
 void mul_project_m4_v3(float M[4][4], float vec[3]);
 void mul_v2_project_m4_v3(float r[2], float M[4][4], const float vec[3]);
 
@@ -120,7 +127,7 @@ bool invert_m3_m3_ex(float m1[3][3], float m2[3][3], const float epsilon);
 bool invert_m3(float R[3][3]);
 bool invert_m3_m3(float R[3][3], float A[3][3]);
 bool invert_m4(float R[4][4]);
-bool invert_m4_m4(float R[4][4], float A[4][4]);
+bool invert_m4_m4(float R[4][4], const float A[4][4]);
 
 /* double ariphmetics */
 void mul_m4_v4d(float M[4][4], double r[4]);
@@ -177,6 +184,8 @@ void invert_m4_m4_safe(float Ainv[4][4], float A[4][4]);
 void scale_m3_fl(float R[3][3], float scale);
 void scale_m4_fl(float R[4][4], float scale);
 
+void scale_m4(float m[][4], float x, float y, float z);
+
 float mat3_to_scale(float M[3][3]);
 float mat4_to_scale(float M[4][4]);
 
@@ -188,6 +197,7 @@ void mat4_to_size(float r[3], float M[4][4]);
 
 void translate_m4(float mat[4][4], float tx, float ty, float tz);
 void rotate_m4(float mat[4][4], const char axis, const float angle);
+void rotate_m4_right(float mat[4][4], const char axis);
 void rotate_m2(float mat[2][2], const float angle);
 void transform_pivot_set_m4(float mat[4][4], const float pivot[3]);
 
@@ -214,6 +224,13 @@ bool is_negative_m4(float mat[4][4]);
 bool is_zero_m3(float mat[3][3]);
 bool is_zero_m4(float mat[4][4]);
 
+/******************************** Projections ********************************/
+
+void mat4_ortho_set(float m[4][4], float left, float right, float bottom, float top, float nearVal, float farVal);
+void mat4_frustum_set(float m[4][4], float left, float right, float bottom, float top, float nearVal, float farVal);
+
+void mat4_look_from_origin(float m[4][4], float lookdir[3], float camup[3]);
+
 /*********************************** Other ***********************************/
 
 void print_m3(const char *str, float M[3][3]);
diff --git a/source/blender/blenlib/BLI_math_vector.h b/source/blender/blenlib/BLI_math_vector.h
index aa103c9..f816ad5 100644
--- a/source/blender/blenlib/BLI_math_vector.h
+++ b/source/blender/blenlib/BLI_math_vector.h
@@ -263,7 +263,7 @@ void project_v3_plane(float v[3], const float n[3], const float p[3]);
 void reflect_v3_v3v3(float r[3], const float v[3], const float n[3]);
 void ortho_basis_v3v3_v3(float r_n1[3], float r_n2[3], const float n[3]);
 void ortho_v3_v3(float p[3], const float v[3]);
-void ortho_v2_v2(float p[2], const float v[2]);
+void ortho_v2_v2(float p[3], const float v[3]);
 void bisect_v3_v3v3v3(float r[3], const float a[3], const float b[3], const float c[3]);
 void rotate_v3_v3v3fl(float v[3], const float p[3], const float axis[3], const float angle);
 void rotate_normalized_v3_v3v3fl(float v[3], const float p[3], const float axis[3], const float angle);
diff --git a/source/blender/blenlib/BLI_utildefines.h b/source/blender/blenlib/BLI_utildefines.h
index af192d1..f164b55 100644
--- a/source/blender/blenlib/BLI_utildefines.h
+++ b/source/blender/blenlib/BLI_utildefines.h
@@ -234,14 +234,36 @@
 		(v1)[2] = FTOCHAR((v2[2]));                                           \
 		(v1)[3] = FTOCHAR((v2[3]));                                           \
 } (void)0
-#define VECCOPY(v1, v2) {                                                     \
+#define VEC2D(v1, x, y) {                                                     \
+		*((v1) + 0) = x;                                                      \
+		*((v1) + 1) = y;                                                      \
+} (void)0
+#define VEC3D(v1, x, y, z) {                                                  \
+		*((v1) + 0) = x;                                                      \
+		*((v1) + 1) = y;                                                      \
+		*((v1) + 2) = z;                                                      \
+} (void)0
+#define VEC4D(v1, x, y, z, w) {                                               \
+		*((v1) + 0) = x;                                                      \
+		*((v1) + 1) = y;                                                      \
+		*((v1) + 2) = z;                                                      \
+		*((v1) + 3) = w;                                                      \
+} (void)0
+#define VECCOPY2D(v1, v2) {                                                   \
 		*(v1) =   *(v2);                                                      \
 		*(v1 + 1) = *(v2 + 1);                                                \
-		*(v1 + 2) = *(v2 + 2);                                                \
 } (void)0
-#define VECCOPY2D(v1, v2) {                                                   \
+#define VECCOPY3D(v1, v2) {                                                   \
 		*(v1) =   *(v2);                                                      \
 		*(v1 + 1) = *(v2 + 1);                                                \
+		*(v1 + 2) = *(v2 + 2);                                                \
+} (void)0
+#define VECCOPY(v1, v2) VECCOPY3D(v1, v2)
+#define VECCOPY4D(v1, v2) {                                                   \
+		*(v1 + 0) = *(v2 + 0);                                                \
+		*(v1 + 1) = *(v2 + 1);                                                \
+		*(v1 + 2) = *(v2 + 2);                                                \
+		*(v1 + 3) = *(v2 + 3);                                                \
 } (void)0
 #define VECADD(v1, v2, v3) {                                                  \
 		*(v1) =   *(v2)   + *(v3);                                            \
diff --git a/source/blender/blenlib/intern/math_matrix.c b/source/blender/blenlib/intern/math_matrix.c
index 7fc30e3..b8576a4 100644
--- a/source/blender/blenlib/intern/math_matrix.c
+++ b/source/blender/blenlib/intern/math_matrix.c
@@ -62,18 +62,18 @@ void unit_m4(float m[4][4])
 	m[3][0] = m[3][1] = m[3][2] = 0.0;
 }
 
-void copy_m3_m3(float m1[3][3], float m2[3][3])
+void copy_m3_m3(float m1[3][3], const float m2[3][3])
 {
 	/* destination comes first: */
 	memcpy(&m1[0], &m2[0], 9 * sizeof(float));
 }
 
-void copy_m4_m4(float m1[4][4], float m2[4][4])
+void copy_m4_m4(float m1[4][4], const float m2[4][4])
 {
 	memcpy(m1, m2, 4 * 4 * sizeof(float));
 }
 
-void copy_m3_m4(float m1[3][3], float m2[4][4])
+void copy_m3_m4(float m1[3][3], const float m2[4][4])
 {
 	m1[0][0] = m2[0][0];
 	m1[0][1] = m2[0][1];
@@ -88,7 +88,7 @@ void copy_m3_m4(float m1[3][3], float m2[4][4])
 	m1[2][2] = m2[2][2];
 }
 
-void copy_m4_m3(float m1[4][4], float m2[3][3]) /* no clear */
+void copy_m4_m3(float m1[4][4], const float m2[3][3]) /* no clear */
 {
 	m1[0][0] = m2[0][0];
 	m1[0][1] = m2[0][1];
@@ -160,7 +160,7 @@ void swap_m4m4(float m1[4][4], float m2[4][4])
 
 /******************************** Arithmetic *********************************/
 
-void mul_m4_m4m4(float m1[4][4], float m3_[4][4], float m2_[4][4])
+void mul_m4_m4m4(float m1[4][4], const float m3_[4][4], const float m2_[4][4])
 {
 	float m2[4][4], m3[4][4];
 
@@ -169,29 +169,10 @@ void mul_m4_m4m4(float m1[4][4], float m3_[4][4], float m2_[4][4])
 	copy_m4_m4(m3, m3_);
 
 	/* matrix product: m1[j][k] = m2[j][i].m3[i][k] */
-	m1[0][0] = m2[0][0] * m3[0][0] + m2[0][1] * m3[1][0] + m2[0][2] * m3[2][0] + m2[0][3] * m3[3][0];
-	m1[0][1] = m2[0][0] * m3[0][1] + m2[0][1] * m3[1][1] + m2[0][2] * m3[2][1] + m2[0][3] * m3[3][1];
-	m1[0][2] = m2[0][0] * m3[0][2] + m2[0][1] * m3[1][2] + m2[0][2] * m3[2][2] + m2[0][3] * m3[3][2];
-	m1[0][3] = m2[0][0] *

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list