Math Lib: use variable length args for mul_serie_m3,m4 (instead of trailing NULL's)
This commit is contained in:
		@@ -574,7 +574,7 @@ void b_bone_spline_setup(bPoseChannel *pchan, int rest, Mat4 result_array[MAX_BB
 | 
			
		||||
 | 
			
		||||
		if (do_scale) {
 | 
			
		||||
			/* correct for scaling when this matrix is used in scaled space */
 | 
			
		||||
			mul_serie_m4(result_array[a].mat, iscalemat, result_array[a].mat, scalemat, NULL, NULL, NULL, NULL, NULL);
 | 
			
		||||
			mul_serie_m4(result_array[a].mat, iscalemat, result_array[a].mat, scalemat);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@@ -622,8 +622,7 @@ static void pchan_b_bone_defmats(bPoseChannel *pchan, bPoseChanDeform *pdef_info
 | 
			
		||||
 | 
			
		||||
		invert_m4_m4(tmat, b_bone_rest[a].mat);
 | 
			
		||||
 | 
			
		||||
		mul_serie_m4(b_bone_mats[a + 1].mat, pchan->chan_mat, bone->arm_mat, b_bone[a].mat, tmat, b_bone_mats[0].mat,
 | 
			
		||||
		             NULL, NULL, NULL);
 | 
			
		||||
		mul_serie_m4(b_bone_mats[a + 1].mat, pchan->chan_mat, bone->arm_mat, b_bone[a].mat, tmat, b_bone_mats[0].mat);
 | 
			
		||||
 | 
			
		||||
		if (use_quaternion)
 | 
			
		||||
			mat4_to_dquat(&b_bone_dual_quats[a], bone->arm_mat, b_bone_mats[a + 1].mat);
 | 
			
		||||
@@ -1042,7 +1041,7 @@ void armature_deform_verts(Object *armOb, Object *target, DerivedMesh *dm, float
 | 
			
		||||
				if (!use_quaternion) /* quaternion already is scale corrected */
 | 
			
		||||
					mul_m3_fl(smat, armature_weight / contrib);
 | 
			
		||||
 | 
			
		||||
				mul_serie_m3(defMats[i], tmpmat, pre, smat, post, NULL, NULL, NULL, NULL);
 | 
			
		||||
				mul_serie_m3(defMats[i], tmpmat, pre, smat, post);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -3909,7 +3909,7 @@ static void followtrack_evaluate(bConstraint *con, bConstraintOb *cob, ListBase
 | 
			
		||||
				BKE_tracking_camera_get_reconstructed_interpolate(tracking, tracking_object, framenr, imat);
 | 
			
		||||
				invert_m4(imat);
 | 
			
		||||
 | 
			
		||||
				mul_serie_m4(cob->matrix, obmat, mat, imat, NULL, NULL, NULL, NULL, NULL);
 | 
			
		||||
				mul_serie_m4(cob->matrix, obmat, mat, imat);
 | 
			
		||||
				translate_m4(cob->matrix, track->bundle_pos[0], track->bundle_pos[1], track->bundle_pos[2]);
 | 
			
		||||
			}
 | 
			
		||||
			else {
 | 
			
		||||
@@ -4187,7 +4187,7 @@ static void objectsolver_evaluate(bConstraint *con, bConstraintOb *cob, ListBase
 | 
			
		||||
 | 
			
		||||
			invert_m4_m4(imat, mat);
 | 
			
		||||
 | 
			
		||||
			mul_serie_m4(cob->matrix, cammat, imat, camimat, parmat, obmat, NULL, NULL, NULL);
 | 
			
		||||
			mul_serie_m4(cob->matrix, cammat, imat, camimat, parmat, obmat);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1212,7 +1212,7 @@ void BKE_mask_point_parent_matrix_get(MaskSplinePoint *point, float ctime, float
 | 
			
		||||
						}
 | 
			
		||||
 | 
			
		||||
						invert_m3_m3(mask_to_clip_matrix, mask_from_clip_matrix);
 | 
			
		||||
						mul_serie_m3(parent_matrix, mask_to_clip_matrix, H, mask_from_clip_matrix, NULL, NULL, NULL, NULL, NULL);
 | 
			
		||||
						mul_serie_m3(parent_matrix, mask_to_clip_matrix, H, mask_from_clip_matrix);
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 
 | 
			
		||||
@@ -145,12 +145,12 @@ void init_tex_mapping(TexMapping *texmap)
 | 
			
		||||
		if (texmap->type == TEXMAP_TYPE_TEXTURE) {
 | 
			
		||||
			/* to transform a texture, the inverse transform needs
 | 
			
		||||
			 * to be applied to the texture coordinate */
 | 
			
		||||
			mul_serie_m4(texmap->mat, tmat, rmat, smat, 0, 0, 0, 0, 0);
 | 
			
		||||
			mul_serie_m4(texmap->mat, tmat, rmat, smat);
 | 
			
		||||
			invert_m4(texmap->mat);
 | 
			
		||||
		}
 | 
			
		||||
		else if (texmap->type == TEXMAP_TYPE_POINT) {
 | 
			
		||||
			/* forward transform */
 | 
			
		||||
			mul_serie_m4(texmap->mat, tmat, rmat, smat, 0, 0, 0, 0, 0);
 | 
			
		||||
			mul_serie_m4(texmap->mat, tmat, rmat, smat);
 | 
			
		||||
		}
 | 
			
		||||
		else if (texmap->type == TEXMAP_TYPE_VECTOR) {
 | 
			
		||||
			/* no translation for vectors */
 | 
			
		||||
 
 | 
			
		||||
@@ -440,5 +440,5 @@ void BKE_tracking_stabilization_data_to_mat4(int width, int height, float aspect
 | 
			
		||||
 | 
			
		||||
	/* compose transformation matrix */
 | 
			
		||||
	mul_serie_m4(mat, translation_mat, center_mat, aspect_mat, rotation_mat, inv_aspect_mat,
 | 
			
		||||
	             scale_mat, inv_center_mat, NULL);
 | 
			
		||||
	             scale_mat, inv_center_mat);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -34,6 +34,8 @@
 | 
			
		||||
extern "C" {
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include "BLI_compiler_attrs.h"
 | 
			
		||||
 | 
			
		||||
/********************************* Init **************************************/
 | 
			
		||||
 | 
			
		||||
void zero_m3(float R[3][3]);
 | 
			
		||||
@@ -67,12 +69,33 @@ 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_serie_m3(float R[3][3],
 | 
			
		||||
                  float M1[3][3], float M2[3][3], float M3[3][3], float M4[3][3],
 | 
			
		||||
                  float M5[3][3], float M6[3][3], float M7[3][3], float M8[3][3]);
 | 
			
		||||
void mul_serie_m4(float R[4][4],
 | 
			
		||||
                  float M1[4][4], float M2[4][4], float M3[4][4], float M4[4][4],
 | 
			
		||||
                  float M5[4][4], float M6[4][4], float M7[4][4], float M8[4][4]);
 | 
			
		||||
/* mul_serie_m3 */
 | 
			
		||||
void _va_mul_serie_m3_3(float R[3][3], float M1[3][3], float M2[3][3]) ATTR_NONNULL();
 | 
			
		||||
void _va_mul_serie_m3_4(float R[3][3], float M1[3][3], float M2[3][3], float M3[3][3]) ATTR_NONNULL();
 | 
			
		||||
void _va_mul_serie_m3_5(float R[3][3], float M1[3][3], float M2[3][3], float M3[3][3], float M4[3][3]) ATTR_NONNULL();
 | 
			
		||||
void _va_mul_serie_m3_6(float R[3][3], float M1[3][3], float M2[3][3], float M3[3][3], float M4[3][3],
 | 
			
		||||
                        float M5[3][3]) ATTR_NONNULL();
 | 
			
		||||
void _va_mul_serie_m3_7(float R[3][3], float M1[3][3], float M2[3][3], float M3[3][3], float M4[3][3],
 | 
			
		||||
                        float M5[3][3], float M6[3][3]) ATTR_NONNULL();
 | 
			
		||||
void _va_mul_serie_m3_8(float R[3][3], float M1[3][3], float M2[3][3], float M3[3][3], float M4[3][3],
 | 
			
		||||
                        float M5[3][3], float M6[3][3], float M7[3][3]) ATTR_NONNULL();
 | 
			
		||||
void _va_mul_serie_m3_9(float R[3][3], float M1[3][3], float M2[3][3], float M3[3][3], float M4[3][3],
 | 
			
		||||
                        float M5[3][3], float M6[3][3], float M7[3][3], float M8[3][3]) ATTR_NONNULL();
 | 
			
		||||
/* mul_serie_m4 */
 | 
			
		||||
void _va_mul_serie_m4_3(float R[4][4], float M1[4][4], float M2[4][4]) ATTR_NONNULL();
 | 
			
		||||
void _va_mul_serie_m4_4(float R[4][4], float M1[4][4], float M2[4][4], float M3[4][4]) ATTR_NONNULL();
 | 
			
		||||
void _va_mul_serie_m4_5(float R[4][4], float M1[4][4], float M2[4][4], float M3[4][4], float M4[4][4]) ATTR_NONNULL();
 | 
			
		||||
void _va_mul_serie_m4_6(float R[4][4], float M1[4][4], float M2[4][4], float M3[4][4], float M4[4][4],
 | 
			
		||||
                        float M5[4][4]) ATTR_NONNULL();
 | 
			
		||||
void _va_mul_serie_m4_7(float R[4][4], float M1[4][4], float M2[4][4], float M3[4][4], float M4[4][4],
 | 
			
		||||
                        float M5[4][4], float M6[4][4]) ATTR_NONNULL();
 | 
			
		||||
void _va_mul_serie_m4_8(float R[4][4], float M1[4][4], float M2[4][4], float M3[4][4], float M4[4][4],
 | 
			
		||||
                        float M5[4][4], float M6[4][4], float M7[4][4]) ATTR_NONNULL();
 | 
			
		||||
void _va_mul_serie_m4_9(float R[4][4], float M1[4][4], float M2[4][4], float M3[4][4], float M4[4][4],
 | 
			
		||||
                        float M5[4][4], float M6[4][4], float M7[4][4], float M8[4][4]) ATTR_NONNULL();
 | 
			
		||||
 | 
			
		||||
#define mul_serie_m3(...) VA_NARGS_CALL_OVERLOAD(_va_mul_serie_m3_, __VA_ARGS__)
 | 
			
		||||
#define mul_serie_m4(...) VA_NARGS_CALL_OVERLOAD(_va_mul_serie_m4_, __VA_ARGS__)
 | 
			
		||||
 | 
			
		||||
void mul_m4_v3(float M[4][4], float r[3]);
 | 
			
		||||
void mul_v3_m4v3(float r[3], float M[4][4], const float v[3]);
 | 
			
		||||
 
 | 
			
		||||
@@ -274,71 +274,148 @@ void mul_m4_m3m4(float m1[4][4], float m3_[3][3], float m2_[4][4])
 | 
			
		||||
	m1[2][2] = m2[2][0] * m3[0][2] + m2[2][1] * m3[1][2] + m2[2][2] * m3[2][2];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void mul_serie_m3(float answ[3][3],
 | 
			
		||||
                  float m1[3][3], float m2[3][3], float m3[3][3],
 | 
			
		||||
                  float m4[3][3], float m5[3][3], float m6[3][3],
 | 
			
		||||
                  float m7[3][3], float m8[3][3])
 | 
			
		||||
 | 
			
		||||
/** \name Macro helpers for: mul_serie_m3
 | 
			
		||||
 * \{ */
 | 
			
		||||
void _va_mul_serie_m3_3(
 | 
			
		||||
        float r[3][3],
 | 
			
		||||
        float m1[3][3], float m2[3][3])
 | 
			
		||||
{
 | 
			
		||||
	float temp[3][3];
 | 
			
		||||
 | 
			
		||||
	if (m1 == NULL || m2 == NULL) return;
 | 
			
		||||
 | 
			
		||||
	mul_m3_m3m3(answ, m2, m1);
 | 
			
		||||
	if (m3) {
 | 
			
		||||
		mul_m3_m3m3(temp, m3, answ);
 | 
			
		||||
		if (m4) {
 | 
			
		||||
			mul_m3_m3m3(answ, m4, temp);
 | 
			
		||||
			if (m5) {
 | 
			
		||||
				mul_m3_m3m3(temp, m5, answ);
 | 
			
		||||
				if (m6) {
 | 
			
		||||
					mul_m3_m3m3(answ, m6, temp);
 | 
			
		||||
					if (m7) {
 | 
			
		||||
						mul_m3_m3m3(temp, m7, answ);
 | 
			
		||||
						if (m8) {
 | 
			
		||||
							mul_m3_m3m3(answ, m8, temp);
 | 
			
		||||
						}
 | 
			
		||||
						else copy_m3_m3(answ, temp);
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				else copy_m3_m3(answ, temp);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		else copy_m3_m3(answ, temp);
 | 
			
		||||
	}
 | 
			
		||||
	mul_m3_m3m3(r, m2, m1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void mul_serie_m4(float answ[4][4], float m1[4][4],
 | 
			
		||||
                  float m2[4][4], float m3[4][4], float m4[4][4],
 | 
			
		||||
                  float m5[4][4], float m6[4][4], float m7[4][4],
 | 
			
		||||
                  float m8[4][4])
 | 
			
		||||
void _va_mul_serie_m3_4(
 | 
			
		||||
        float r[3][3],
 | 
			
		||||
        float m1[3][3], float m2[3][3], float m3[3][3])
 | 
			
		||||
{
 | 
			
		||||
	float temp[4][4];
 | 
			
		||||
 | 
			
		||||
	if (m1 == NULL || m2 == NULL) return;
 | 
			
		||||
 | 
			
		||||
	mul_m4_m4m4(answ, m1, m2);
 | 
			
		||||
	if (m3) {
 | 
			
		||||
		mul_m4_m4m4(temp, answ, m3);
 | 
			
		||||
		if (m4) {
 | 
			
		||||
			mul_m4_m4m4(answ, temp, m4);
 | 
			
		||||
			if (m5) {
 | 
			
		||||
				mul_m4_m4m4(temp, answ, m5);
 | 
			
		||||
				if (m6) {
 | 
			
		||||
					mul_m4_m4m4(answ, temp, m6);
 | 
			
		||||
					if (m7) {
 | 
			
		||||
						mul_m4_m4m4(temp, answ, m7);
 | 
			
		||||
						if (m8) {
 | 
			
		||||
							mul_m4_m4m4(answ, temp, m8);
 | 
			
		||||
						}
 | 
			
		||||
						else copy_m4_m4(answ, temp);
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				else copy_m4_m4(answ, temp);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		else copy_m4_m4(answ, temp);
 | 
			
		||||
	}
 | 
			
		||||
	mul_m3_m3m3(r, m2, m1);
 | 
			
		||||
	mul_m3_m3m3(r, m3, r);
 | 
			
		||||
}
 | 
			
		||||
void _va_mul_serie_m3_5(
 | 
			
		||||
        float r[3][3],
 | 
			
		||||
        float m1[3][3], float m2[3][3], float m3[3][3], float m4[3][3])
 | 
			
		||||
{
 | 
			
		||||
	mul_m3_m3m3(r, m2, m1);
 | 
			
		||||
	mul_m3_m3m3(r, m3, r);
 | 
			
		||||
	mul_m3_m3m3(r, m4, r);
 | 
			
		||||
}
 | 
			
		||||
void _va_mul_serie_m3_6(
 | 
			
		||||
        float r[3][3],
 | 
			
		||||
        float m1[3][3], float m2[3][3], float m3[3][3], float m4[3][3],
 | 
			
		||||
        float m5[3][3])
 | 
			
		||||
{
 | 
			
		||||
	mul_m3_m3m3(r, m2, m1);
 | 
			
		||||
	mul_m3_m3m3(r, m3, r);
 | 
			
		||||
	mul_m3_m3m3(r, m4, r);
 | 
			
		||||
	mul_m3_m3m3(r, m5, r);
 | 
			
		||||
}
 | 
			
		||||
void _va_mul_serie_m3_7(
 | 
			
		||||
        float r[3][3],
 | 
			
		||||
        float m1[3][3], float m2[3][3], float m3[3][3], float m4[3][3],
 | 
			
		||||
        float m5[3][3], float m6[3][3])
 | 
			
		||||
{
 | 
			
		||||
	mul_m3_m3m3(r, m2, m1);
 | 
			
		||||
	mul_m3_m3m3(r, m3, r);
 | 
			
		||||
	mul_m3_m3m3(r, m4, r);
 | 
			
		||||
	mul_m3_m3m3(r, m5, r);
 | 
			
		||||
	mul_m3_m3m3(r, m6, r);
 | 
			
		||||
}
 | 
			
		||||
void _va_mul_serie_m3_8(
 | 
			
		||||
        float r[3][3],
 | 
			
		||||
        float m1[3][3], float m2[3][3], float m3[3][3], float m4[3][3],
 | 
			
		||||
        float m5[3][3], float m6[3][3], float m7[3][3])
 | 
			
		||||
{
 | 
			
		||||
	mul_m3_m3m3(r, m2, m1);
 | 
			
		||||
	mul_m3_m3m3(r, m3, r);
 | 
			
		||||
	mul_m3_m3m3(r, m4, r);
 | 
			
		||||
	mul_m3_m3m3(r, m5, r);
 | 
			
		||||
	mul_m3_m3m3(r, m6, r);
 | 
			
		||||
	mul_m3_m3m3(r, m7, r);
 | 
			
		||||
}
 | 
			
		||||
void _va_mul_serie_m3_9(
 | 
			
		||||
        float r[3][3],
 | 
			
		||||
        float m1[3][3], float m2[3][3], float m3[3][3], float m4[3][3],
 | 
			
		||||
        float m5[3][3], float m6[3][3], float m7[3][3], float m8[3][3])
 | 
			
		||||
{
 | 
			
		||||
	mul_m3_m3m3(r, m2, m1);
 | 
			
		||||
	mul_m3_m3m3(r, m3, r);
 | 
			
		||||
	mul_m3_m3m3(r, m4, r);
 | 
			
		||||
	mul_m3_m3m3(r, m5, r);
 | 
			
		||||
	mul_m3_m3m3(r, m6, r);
 | 
			
		||||
	mul_m3_m3m3(r, m7, r);
 | 
			
		||||
	mul_m3_m3m3(r, m8, r);
 | 
			
		||||
}
 | 
			
		||||
/** \} */
 | 
			
		||||
 | 
			
		||||
/** \name Macro helpers for: mul_serie_m4
 | 
			
		||||
 * \{ */
 | 
			
		||||
void _va_mul_serie_m4_3(
 | 
			
		||||
        float r[4][4],
 | 
			
		||||
        float m1[4][4], float m2[4][4])
 | 
			
		||||
{
 | 
			
		||||
	mul_m4_m4m4(r, m2, m1);
 | 
			
		||||
}
 | 
			
		||||
void _va_mul_serie_m4_4(
 | 
			
		||||
        float r[4][4],
 | 
			
		||||
        float m1[4][4], float m2[4][4], float m3[4][4])
 | 
			
		||||
{
 | 
			
		||||
	mul_m4_m4m4(r, m2, m1);
 | 
			
		||||
	mul_m4_m4m4(r, m3, r);
 | 
			
		||||
}
 | 
			
		||||
void _va_mul_serie_m4_5(
 | 
			
		||||
        float r[4][4],
 | 
			
		||||
        float m1[4][4], float m2[4][4], float m3[4][4], float m4[4][4])
 | 
			
		||||
{
 | 
			
		||||
	mul_m4_m4m4(r, m2, m1);
 | 
			
		||||
	mul_m4_m4m4(r, m3, r);
 | 
			
		||||
	mul_m4_m4m4(r, m4, r);
 | 
			
		||||
}
 | 
			
		||||
void _va_mul_serie_m4_6(
 | 
			
		||||
        float r[4][4],
 | 
			
		||||
        float m1[4][4], float m2[4][4], float m3[4][4], float m4[4][4],
 | 
			
		||||
        float m5[4][4])
 | 
			
		||||
{
 | 
			
		||||
	mul_m4_m4m4(r, m2, m1);
 | 
			
		||||
	mul_m4_m4m4(r, m3, r);
 | 
			
		||||
	mul_m4_m4m4(r, m4, r);
 | 
			
		||||
	mul_m4_m4m4(r, m5, r);
 | 
			
		||||
}
 | 
			
		||||
void _va_mul_serie_m4_7(
 | 
			
		||||
        float r[4][4],
 | 
			
		||||
        float m1[4][4], float m2[4][4], float m3[4][4], float m4[4][4],
 | 
			
		||||
        float m5[4][4], float m6[4][4])
 | 
			
		||||
{
 | 
			
		||||
	mul_m4_m4m4(r, m2, m1);
 | 
			
		||||
	mul_m4_m4m4(r, m3, r);
 | 
			
		||||
	mul_m4_m4m4(r, m4, r);
 | 
			
		||||
	mul_m4_m4m4(r, m5, r);
 | 
			
		||||
	mul_m4_m4m4(r, m6, r);
 | 
			
		||||
}
 | 
			
		||||
void _va_mul_serie_m4_8(
 | 
			
		||||
        float r[4][4],
 | 
			
		||||
        float m1[4][4], float m2[4][4], float m3[4][4], float m4[4][4],
 | 
			
		||||
        float m5[4][4], float m6[4][4], float m7[4][4])
 | 
			
		||||
{
 | 
			
		||||
	mul_m4_m4m4(r, m2, m1);
 | 
			
		||||
	mul_m4_m4m4(r, m3, r);
 | 
			
		||||
	mul_m4_m4m4(r, m4, r);
 | 
			
		||||
	mul_m4_m4m4(r, m5, r);
 | 
			
		||||
	mul_m4_m4m4(r, m6, r);
 | 
			
		||||
	mul_m4_m4m4(r, m7, r);
 | 
			
		||||
}
 | 
			
		||||
void _va_mul_serie_m4_9(
 | 
			
		||||
        float r[4][4],
 | 
			
		||||
        float m1[4][4], float m2[4][4], float m3[4][4], float m4[4][4],
 | 
			
		||||
        float m5[4][4], float m6[4][4], float m7[4][4], float m8[4][4])
 | 
			
		||||
{
 | 
			
		||||
	mul_m4_m4m4(r, m2, m1);
 | 
			
		||||
	mul_m4_m4m4(r, m3, r);
 | 
			
		||||
	mul_m4_m4m4(r, m4, r);
 | 
			
		||||
	mul_m4_m4m4(r, m5, r);
 | 
			
		||||
	mul_m4_m4m4(r, m6, r);
 | 
			
		||||
	mul_m4_m4m4(r, m7, r);
 | 
			
		||||
	mul_m4_m4m4(r, m8, r);
 | 
			
		||||
}
 | 
			
		||||
/** \} */
 | 
			
		||||
 | 
			
		||||
void mul_v2_m3v2(float r[2], float m[3][3], float v[2])
 | 
			
		||||
{
 | 
			
		||||
@@ -2115,7 +2192,7 @@ void pseudoinverse_m4_m4(float Ainv[4][4], float A[4][4], float epsilon)
 | 
			
		||||
 | 
			
		||||
	transpose_m4(V);
 | 
			
		||||
 | 
			
		||||
	mul_serie_m4(Ainv, U, Wm, V, NULL, NULL, NULL, NULL, NULL);
 | 
			
		||||
	mul_serie_m4(Ainv, U, Wm, V);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void pseudoinverse_m3_m3(float Ainv[3][3], float A[3][3], float epsilon)
 | 
			
		||||
 
 | 
			
		||||
@@ -1606,7 +1606,7 @@ void mat4_to_dquat(DualQuat *dq, float basemat[4][4], float mat[4][4])
 | 
			
		||||
		mul_m4_m4m4(S, baseRinv, baseRS);
 | 
			
		||||
 | 
			
		||||
		/* set scaling part */
 | 
			
		||||
		mul_serie_m4(dq->scale, basemat, S, baseinv, NULL, NULL, NULL, NULL, NULL);
 | 
			
		||||
		mul_serie_m4(dq->scale, basemat, S, baseinv);
 | 
			
		||||
		dq->scale_weight = 1.0f;
 | 
			
		||||
	}
 | 
			
		||||
	else {
 | 
			
		||||
 
 | 
			
		||||
@@ -63,7 +63,7 @@ void bmo_transform_exec(BMesh *UNUSED(bm), BMOperator *op)
 | 
			
		||||
 | 
			
		||||
	if (!is_zero_m4(mat_space)) {
 | 
			
		||||
		invert_m4_m4(imat_space, mat_space);
 | 
			
		||||
		mul_serie_m4(mat, imat_space, mat, mat_space, NULL, NULL, NULL, NULL, NULL);
 | 
			
		||||
		mul_serie_m4(mat, imat_space, mat, mat_space);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	BMO_ITER (v, &iter, op->slots_in, "verts", BM_VERT) {
 | 
			
		||||
 
 | 
			
		||||
@@ -804,7 +804,7 @@ void AnimationImporter::apply_matrix_curves(Object *ob, std::vector<FCurve *>& a
 | 
			
		||||
			// evaluate_joint_world_transform_at_frame(temp, NULL, node, fra);
 | 
			
		||||
 | 
			
		||||
			// calc special matrix
 | 
			
		||||
			mul_serie_m4(mat, irest, temp, irest_dae, rest, NULL, NULL, NULL, NULL);
 | 
			
		||||
			mul_serie_m4(mat, irest, temp, irest_dae, rest);
 | 
			
		||||
		}
 | 
			
		||||
		else {
 | 
			
		||||
			copy_m4_m4(mat, matfra);
 | 
			
		||||
@@ -1210,7 +1210,7 @@ void AnimationImporter::add_bone_animation_sampled(Object *ob, std::vector<FCurv
 | 
			
		||||
		// evaluate_joint_world_transform_at_frame(temp, NULL, node, fra);
 | 
			
		||||
 | 
			
		||||
		// calc special matrix
 | 
			
		||||
		mul_serie_m4(mat, irest, temp, irest_dae, rest, NULL, NULL, NULL, NULL);
 | 
			
		||||
		mul_serie_m4(mat, irest, temp, irest_dae, rest);
 | 
			
		||||
 | 
			
		||||
		float rot[4], loc[3], scale[3];
 | 
			
		||||
 | 
			
		||||
@@ -1545,7 +1545,7 @@ Object *AnimationImporter::translate_animation_OLD(COLLADAFW::Node *node,
 | 
			
		||||
			// evaluate_joint_world_transform_at_frame(temp, NULL, node, fra);
 | 
			
		||||
 | 
			
		||||
			// calc special matrix
 | 
			
		||||
			mul_serie_m4(mat, irest, temp, irest_dae, rest, NULL, NULL, NULL, NULL);
 | 
			
		||||
			mul_serie_m4(mat, irest, temp, irest_dae, rest);
 | 
			
		||||
		}
 | 
			
		||||
		else {
 | 
			
		||||
			copy_m4_m4(mat, matfra);
 | 
			
		||||
 
 | 
			
		||||
@@ -77,7 +77,7 @@ void TransformWriter::add_node_transform_ob(COLLADASW::Node& node, Object *ob, B
 | 
			
		||||
		BKE_object_to_mat4(ob, C);
 | 
			
		||||
		copy_v3_v3(ob->size, scale);
 | 
			
		||||
 | 
			
		||||
		mul_serie_m4(tmat, ob->parent->obmat, ob->parentinv, C, NULL, NULL, NULL, NULL, NULL);
 | 
			
		||||
		mul_serie_m4(tmat, ob->parent->obmat, ob->parentinv, C);
 | 
			
		||||
 | 
			
		||||
		// calculate local mat
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -528,8 +528,7 @@ static int add_hook_object(Main *bmain, Scene *scene, Object *obedit, Object *ob
 | 
			
		||||
	
 | 
			
		||||
	invert_m4_m4(ob->imat, ob->obmat);
 | 
			
		||||
	/* apparently this call goes from right to left... */
 | 
			
		||||
	mul_serie_m4(hmd->parentinv, pose_mat, ob->imat, obedit->obmat,
 | 
			
		||||
	             NULL, NULL, NULL, NULL, NULL);
 | 
			
		||||
	mul_serie_m4(hmd->parentinv, pose_mat, ob->imat, obedit->obmat);
 | 
			
		||||
	
 | 
			
		||||
	DAG_relations_tag_update(bmain);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1728,7 +1728,7 @@ void clip_draw_main(const bContext *C, SpaceClip *sc, ARegion *ar)
 | 
			
		||||
			smat[1][1] = 1.0f / height;
 | 
			
		||||
			invert_m4_m4(ismat, smat);
 | 
			
		||||
 | 
			
		||||
			mul_serie_m4(sc->unistabmat, smat, sc->stabmat, ismat, NULL, NULL, NULL, NULL, NULL);
 | 
			
		||||
			mul_serie_m4(sc->unistabmat, smat, sc->stabmat, ismat);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	else if ((sc->flag & SC_MUTE_FOOTAGE) == 0) {
 | 
			
		||||
 
 | 
			
		||||
@@ -2277,7 +2277,7 @@ static void set_axis(Scene *scene,  Object *ob, MovieClip *clip, MovieTrackingOb
 | 
			
		||||
			copy_v3_v3(lmat[3], obmat[3]);
 | 
			
		||||
			invert_m4_m4(ilmat, lmat);
 | 
			
		||||
 | 
			
		||||
			mul_serie_m4(mat, lmat, mat, ilmat, obmat, NULL, NULL, NULL, NULL);
 | 
			
		||||
			mul_serie_m4(mat, lmat, mat, ilmat, obmat);
 | 
			
		||||
		}
 | 
			
		||||
		else {
 | 
			
		||||
			mul_m4_m4m4(mat, obmat, mat);
 | 
			
		||||
 
 | 
			
		||||
@@ -3627,7 +3627,7 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short
 | 
			
		||||
		
 | 
			
		||||
		
 | 
			
		||||
		if (td->flag & TD_USEQUAT) {
 | 
			
		||||
			mul_serie_m3(fmat, td->mtx, mat, td->smtx, NULL, NULL, NULL, NULL, NULL);
 | 
			
		||||
			mul_serie_m3(fmat, td->mtx, mat, td->smtx);
 | 
			
		||||
			mat3_to_quat(quat, fmat);   // Actual transform
 | 
			
		||||
			
 | 
			
		||||
			if (td->ext->quat) {
 | 
			
		||||
@@ -3697,7 +3697,7 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short
 | 
			
		||||
		if ((t->flag & T_V3D_ALIGN) == 0) { /* align mode doesn't rotate objects itself */
 | 
			
		||||
			/* euler or quaternion/axis-angle? */
 | 
			
		||||
			if (td->ext->rotOrder == ROT_MODE_QUAT) {
 | 
			
		||||
				mul_serie_m3(fmat, td->ext->r_mtx, mat, td->ext->r_smtx, NULL, NULL, NULL, NULL, NULL);
 | 
			
		||||
				mul_serie_m3(fmat, td->ext->r_mtx, mat, td->ext->r_smtx);
 | 
			
		||||
				
 | 
			
		||||
				mat3_to_quat(quat, fmat); /* Actual transform */
 | 
			
		||||
				
 | 
			
		||||
@@ -3712,7 +3712,7 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short
 | 
			
		||||
				
 | 
			
		||||
				axis_angle_to_quat(iquat, td->ext->irotAxis, td->ext->irotAngle);
 | 
			
		||||
				
 | 
			
		||||
				mul_serie_m3(fmat, td->ext->r_mtx, mat, td->ext->r_smtx, NULL, NULL, NULL, NULL, NULL);
 | 
			
		||||
				mul_serie_m3(fmat, td->ext->r_mtx, mat, td->ext->r_smtx);
 | 
			
		||||
				mat3_to_quat(quat, fmat); /* Actual transform */
 | 
			
		||||
				mul_qt_qtqt(tquat, quat, iquat);
 | 
			
		||||
				
 | 
			
		||||
@@ -3769,7 +3769,7 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short
 | 
			
		||||
			if ((td->ext->rotOrder == ROT_MODE_QUAT) || (td->flag & TD_USEQUAT)) {
 | 
			
		||||
				/* can be called for texture space translate for example, then opt out */
 | 
			
		||||
				if (td->ext->quat) {
 | 
			
		||||
					mul_serie_m3(fmat, td->mtx, mat, td->smtx, NULL, NULL, NULL, NULL, NULL);
 | 
			
		||||
					mul_serie_m3(fmat, td->mtx, mat, td->smtx);
 | 
			
		||||
					mat3_to_quat(quat, fmat);   // Actual transform
 | 
			
		||||
					
 | 
			
		||||
					mul_qt_qtqt(td->ext->quat, quat, td->ext->iquat);
 | 
			
		||||
@@ -3783,7 +3783,7 @@ static void ElementRotation(TransInfo *t, TransData *td, float mat[3][3], short
 | 
			
		||||
				
 | 
			
		||||
				axis_angle_to_quat(iquat, td->ext->irotAxis, td->ext->irotAngle);
 | 
			
		||||
				
 | 
			
		||||
				mul_serie_m3(fmat, td->mtx, mat, td->smtx, NULL, NULL, NULL, NULL, NULL);
 | 
			
		||||
				mul_serie_m3(fmat, td->mtx, mat, td->smtx);
 | 
			
		||||
				mat3_to_quat(quat, fmat);   // Actual transform
 | 
			
		||||
				mul_qt_qtqt(tquat, quat, iquat);
 | 
			
		||||
				
 | 
			
		||||
 
 | 
			
		||||
@@ -584,12 +584,12 @@ static void add_pose_transdata(TransInfo *t, bPoseChannel *pchan, Object *ob, Tr
 | 
			
		||||
		if (constraints_list_needinv(t, &pchan->constraints)) {
 | 
			
		||||
			copy_m3_m4(tmat, pchan->constinv);
 | 
			
		||||
			invert_m3_m3(cmat, tmat);
 | 
			
		||||
			mul_serie_m3(td->mtx, pmat, omat, cmat, NULL, NULL, NULL, NULL, NULL);
 | 
			
		||||
			mul_serie_m3(td->ext->r_mtx, rpmat, omat, cmat, NULL, NULL, NULL, NULL, NULL);
 | 
			
		||||
			mul_serie_m3(td->mtx, pmat, omat, cmat);
 | 
			
		||||
			mul_serie_m3(td->ext->r_mtx, rpmat, omat, cmat);
 | 
			
		||||
		}
 | 
			
		||||
		else {
 | 
			
		||||
			mul_serie_m3(td->mtx, pmat, omat, NULL, NULL, NULL, NULL, NULL, NULL);
 | 
			
		||||
			mul_serie_m3(td->ext->r_mtx, rpmat, omat, NULL, NULL, NULL, NULL, NULL, NULL);
 | 
			
		||||
			mul_serie_m3(td->mtx, pmat, omat);
 | 
			
		||||
			mul_serie_m3(td->ext->r_mtx, rpmat, omat);
 | 
			
		||||
		}
 | 
			
		||||
		invert_m3_m3(td->ext->r_smtx, td->ext->r_mtx);
 | 
			
		||||
	}
 | 
			
		||||
@@ -2368,8 +2368,7 @@ static void createTransEditVerts(TransInfo *t)
 | 
			
		||||
						quat_to_mat3(qmat, quats[BM_elem_index_get(eve)]);
 | 
			
		||||
 | 
			
		||||
						if (defmats)
 | 
			
		||||
							mul_serie_m3(mat, mtx, qmat, defmats[a],
 | 
			
		||||
							             NULL, NULL, NULL, NULL, NULL);
 | 
			
		||||
							mul_serie_m3(mat, mtx, qmat, defmats[a]);
 | 
			
		||||
						else
 | 
			
		||||
							mul_m3_m3m3(mat, mtx, qmat);
 | 
			
		||||
					}
 | 
			
		||||
 
 | 
			
		||||
@@ -938,7 +938,7 @@ static void uv_map_rotation_matrix(float result[4][4], RegionView3D *rv3d, Objec
 | 
			
		||||
	rotup[0][0] =  1.0f / radius;
 | 
			
		||||
 | 
			
		||||
	/* calculate transforms*/
 | 
			
		||||
	mul_serie_m4(result, rotup, rotside, viewmatrix, rotobj, NULL, NULL, NULL, NULL);
 | 
			
		||||
	mul_serie_m4(result, rotup, rotside, viewmatrix, rotobj);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void uv_map_transform(bContext *C, wmOperator *op, float center[3], float rotmat[4][4])
 | 
			
		||||
 
 | 
			
		||||
@@ -215,7 +215,7 @@ static void where_is_ik_bone(bPoseChannel *pchan, float ik_mat[3][3])   // nr =
 | 
			
		||||
	copy_m4_m3(ikmat, ik_mat);
 | 
			
		||||
 | 
			
		||||
	if (pchan->parent)
 | 
			
		||||
		mul_serie_m4(pchan->pose_mat, pchan->parent->pose_mat, pchan->chan_mat, ikmat, NULL, NULL, NULL, NULL, NULL);
 | 
			
		||||
		mul_serie_m4(pchan->pose_mat, pchan->parent->pose_mat, pchan->chan_mat, ikmat);
 | 
			
		||||
	else
 | 
			
		||||
		mul_m4_m4m4(pchan->pose_mat, pchan->chan_mat, ikmat);
 | 
			
		||||
 | 
			
		||||
@@ -420,7 +420,7 @@ static void execute_posetree(struct Scene *scene, Object *ob, PoseTree *tree)
 | 
			
		||||
			/* end effector in world space */
 | 
			
		||||
			copy_m4_m4(end_pose, pchan->pose_mat);
 | 
			
		||||
			copy_v3_v3(end_pose[3], pchan->pose_tail);
 | 
			
		||||
			mul_serie_m4(world_pose, goalinv, ob->obmat, end_pose, NULL, NULL, NULL, NULL, NULL);
 | 
			
		||||
			mul_serie_m4(world_pose, goalinv, ob->obmat, end_pose);
 | 
			
		||||
 | 
			
		||||
			/* blend position */
 | 
			
		||||
			goalpos[0] = fac * goalpos[0] + mfac * world_pose[3][0];
 | 
			
		||||
 
 | 
			
		||||
@@ -566,7 +566,7 @@ static bool target_callback(const iTaSC::Timestamp& timestamp, const iTaSC::Fram
 | 
			
		||||
			float chanmat[4][4];
 | 
			
		||||
			copy_m4_m4(chanmat, pchan->pose_mat);
 | 
			
		||||
			copy_v3_v3(chanmat[3], pchan->pose_tail);
 | 
			
		||||
			mul_serie_m4(restmat, target->owner->obmat, chanmat, target->eeRest, NULL, NULL, NULL, NULL, NULL);
 | 
			
		||||
			mul_serie_m4(restmat, target->owner->obmat, chanmat, target->eeRest);
 | 
			
		||||
		}
 | 
			
		||||
		else {
 | 
			
		||||
			mul_m4_m4m4(restmat, target->owner->obmat, target->eeRest);
 | 
			
		||||
 
 | 
			
		||||
@@ -371,8 +371,7 @@ static DerivedMesh *arrayModifier_doArray(ArrayModifierData *amd,
 | 
			
		||||
			unit_m4(obinv);
 | 
			
		||||
 | 
			
		||||
		mul_serie_m4(result_mat, offset,
 | 
			
		||||
		             obinv, amd->offset_ob->obmat,
 | 
			
		||||
		             NULL, NULL, NULL, NULL, NULL);
 | 
			
		||||
		             obinv, amd->offset_ob->obmat);
 | 
			
		||||
		copy_m4_m4(offset, result_mat);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -156,8 +156,7 @@ static void deformVerts_do(HookModifierData *hmd, Object *ob, DerivedMesh *dm,
 | 
			
		||||
		copy_m4_m4(dmat, hmd->object->obmat);
 | 
			
		||||
	}
 | 
			
		||||
	invert_m4_m4(ob->imat, ob->obmat);
 | 
			
		||||
	mul_serie_m4(mat, ob->imat, dmat, hmd->parentinv,
 | 
			
		||||
	             NULL, NULL, NULL, NULL, NULL);
 | 
			
		||||
	mul_serie_m4(mat, ob->imat, dmat, hmd->parentinv);
 | 
			
		||||
 | 
			
		||||
	modifier_get_vgroup(ob, dm, hmd->name, &dvert, &defgrp_index);
 | 
			
		||||
	max_dvert = (dvert) ? numVerts : 0;
 | 
			
		||||
 
 | 
			
		||||
@@ -4546,8 +4546,7 @@ static void set_dupli_tex_mat(Render *re, ObjectInstanceRen *obi, DupliObject *d
 | 
			
		||||
 | 
			
		||||
		obi->duplitexmat= BLI_memarena_alloc(re->memArena, sizeof(float)*4*4);
 | 
			
		||||
		invert_m4_m4(imat, dob->mat);
 | 
			
		||||
		mul_serie_m4(obi->duplitexmat, re->viewmat, omat, imat, re->viewinv,
 | 
			
		||||
		             NULL, NULL, NULL, NULL);
 | 
			
		||||
		mul_serie_m4(obi->duplitexmat, re->viewmat, omat, imat, re->viewinv);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	copy_v3_v3(obi->dupliorco, dob->orco);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user