[Bf-blender-cvs] [3c9e11d] master: Cleanup: Move SpaceTransform helpers from `BKE_shrinkwrap` to `BLI_math_matrix`.

Bastien Montagne noreply at git.blender.org
Fri Aug 1 16:31:17 CEST 2014


Commit: 3c9e11df37581c6faf937bbe974710a7fc95e380
Author: Bastien Montagne
Date:   Fri Aug 1 16:28:31 2014 +0200
Branches: master
https://developer.blender.org/rB3c9e11df37581c6faf937bbe974710a7fc95e380

Cleanup: Move SpaceTransform helpers from `BKE_shrinkwrap` to `BLI_math_matrix`.

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

M	source/blender/blenkernel/BKE_shrinkwrap.h
M	source/blender/blenkernel/intern/constraint.c
M	source/blender/blenkernel/intern/shrinkwrap.c
M	source/blender/blenlib/BLI_math_matrix.h
M	source/blender/blenlib/intern/math_matrix.c
M	source/blender/modifiers/intern/MOD_shrinkwrap.c
M	source/blender/modifiers/intern/MOD_simpledeform.c
M	source/blender/modifiers/intern/MOD_weightvgproximity.c

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

diff --git a/source/blender/blenkernel/BKE_shrinkwrap.h b/source/blender/blenkernel/BKE_shrinkwrap.h
index d539d0b..070cd4a 100644
--- a/source/blender/blenkernel/BKE_shrinkwrap.h
+++ b/source/blender/blenkernel/BKE_shrinkwrap.h
@@ -31,43 +31,6 @@
  *  \ingroup bke
  */
 
-/* SpaceTransform stuff */
-/*
- * TODO: move this somewhere else
- *
- * this structs encapsulates all needed data to convert between 2 coordinate spaces
- * (where conversion can be represented by a matrix multiplication)
- *
- * This is used to reduce the number of arguments to pass to functions that need to perform
- * this kind of operation and make it easier for the coder, as he/she doenst needs to recode
- * the matrix calculation.
- *
- * A SpaceTransform is initialized using:
- *   SPACE_TRANSFORM_SETUP( &data,  ob1, ob2 )
- *
- * After that the following calls can be used:
- *   space_transform_apply (&data, co); //converts a coordinate in ob1 coords space to the corresponding ob2 coords
- *   space_transform_invert(&data, co); //converts a coordinate in ob2 coords space to the corresponding ob1 coords
- *
- *	//Same Concept as space_transform_apply and space_transform_invert, but no is normalized after conversion
- *   space_transform_apply_normal (&data, &no);
- *   space_transform_invert_normal(&data, &no);
- *
- */
-struct Object;
-
-typedef struct SpaceTransform {
-	float local2target[4][4];
-	float target2local[4][4];
-
-} SpaceTransform;
-
-void space_transform_from_matrixs(struct SpaceTransform *data, float local[4][4], float target[4][4]);
-void space_transform_apply(const struct SpaceTransform *data, float co[3]);
-void space_transform_invert(const struct SpaceTransform *data, float co[3]);
-
-#define SPACE_TRANSFORM_SETUP(data, local, target) space_transform_from_matrixs(data, (local)->obmat, (target)->obmat)
-
 /* Shrinkwrap stuff */
 #include "BKE_bvhutils.h"
 
@@ -91,6 +54,7 @@ struct MDeformVert;
 struct ShrinkwrapModifierData;
 struct MDeformVert;
 struct BVHTree;
+struct SpaceTransform;
 
 
 typedef struct ShrinkwrapCalcData {
@@ -106,7 +70,7 @@ typedef struct ShrinkwrapCalcData {
 	int vgroup;                     //Vertex group num
 
 	struct DerivedMesh *target;     //mesh we are shrinking to
-	SpaceTransform local2target;    //transform to move between local and target space
+	struct SpaceTransform local2target;    //transform to move between local and target space
 
 	float keepDist;                 //Distance to keep above target surface (units are in local space)
 
@@ -127,7 +91,7 @@ void shrinkwrapModifier_deform(struct ShrinkwrapModifierData *smd, struct Object
  */
 bool BKE_shrinkwrap_project_normal(
         char options, const float vert[3], const float dir[3],
-        const SpaceTransform *transf, BVHTree *tree, BVHTreeRayHit *hit,
+        const struct SpaceTransform *transf, BVHTree *tree, BVHTreeRayHit *hit,
         BVHTree_RayCastCallback callback, void *userdata);
 
 /*
diff --git a/source/blender/blenkernel/intern/constraint.c b/source/blender/blenkernel/intern/constraint.c
index 2f8690a..d80529e 100644
--- a/source/blender/blenkernel/intern/constraint.c
+++ b/source/blender/blenkernel/intern/constraint.c
@@ -3375,7 +3375,7 @@ static void shrinkwrap_get_tarmat(bConstraint *con, bConstraintOb *cob, bConstra
 		unit_m4(ct->matrix);
 		
 		if (target != NULL) {
-			space_transform_from_matrixs(&transform, cob->matrix, ct->tar->obmat);
+			BLI_space_transform_from_matrices(&transform, cob->matrix, ct->tar->obmat);
 			
 			switch (scon->shrinkType) {
 				case MOD_SHRINKWRAP_NEAREST_SURFACE:
@@ -3397,7 +3397,7 @@ static void shrinkwrap_get_tarmat(bConstraint *con, bConstraintOb *cob, bConstra
 						break;
 					}
 					
-					space_transform_apply(&transform, co);
+					BLI_space_transform_apply(&transform, co);
 					
 					BLI_bvhtree_find_nearest(treeData.tree, co, &nearest, treeData.nearest_callback, &treeData);
 					
@@ -3405,7 +3405,7 @@ static void shrinkwrap_get_tarmat(bConstraint *con, bConstraintOb *cob, bConstra
 					if (dist != 0.0f) {
 						interp_v3_v3v3(co, co, nearest.co, (dist - scon->dist) / dist);   /* linear interpolation */
 					}
-					space_transform_invert(&transform, co);
+					BLI_space_transform_invert(&transform, co);
 					break;
 				}
 				case MOD_SHRINKWRAP_PROJECT:
diff --git a/source/blender/blenkernel/intern/shrinkwrap.c b/source/blender/blenkernel/intern/shrinkwrap.c
index 60dc3da..d2a4d15 100644
--- a/source/blender/blenkernel/intern/shrinkwrap.c
+++ b/source/blender/blenkernel/intern/shrinkwrap.c
@@ -66,37 +66,6 @@
 /* Util macros */
 #define OUT_OF_MEMORY() ((void)printf("Shrinkwrap: Out of memory\n"))
 
-/* Space transform */
-void space_transform_from_matrixs(SpaceTransform *data, float local[4][4], float target[4][4])
-{
-	float itarget[4][4];
-	invert_m4_m4(itarget, target);
-	mul_m4_m4m4(data->local2target, itarget, local);
-	invert_m4_m4(data->target2local, data->local2target);
-}
-
-void space_transform_apply(const SpaceTransform *data, float co[3])
-{
-	mul_v3_m4v3(co, ((SpaceTransform *)data)->local2target, co);
-}
-
-void space_transform_invert(const SpaceTransform *data, float co[3])
-{
-	mul_v3_m4v3(co, ((SpaceTransform *)data)->target2local, co);
-}
-
-static void space_transform_apply_normal(const SpaceTransform *data, float no[3])
-{
-	mul_mat3_m4_v3(((SpaceTransform *)data)->local2target, no);
-	normalize_v3(no); /* TODO: could we just determine de scale value from the matrix? */
-}
-
-static void space_transform_invert_normal(const SpaceTransform *data, float no[3])
-{
-	mul_mat3_m4_v3(((SpaceTransform *)data)->target2local, no);
-	normalize_v3(no); /* TODO: could we just determine de scale value from the matrix? */
-}
-
 /*
  * Shrinkwrap to the nearest vertex
  *
@@ -139,7 +108,7 @@ static void shrinkwrap_calc_nearest_vertex(ShrinkwrapCalcData *calc)
 		else {
 			copy_v3_v3(tmp_co, co);
 		}
-		space_transform_apply(&calc->local2target, tmp_co);
+		BLI_space_transform_apply(&calc->local2target, tmp_co);
 
 		/* Use local proximity heuristics (to reduce the nearest search)
 		 *
@@ -165,7 +134,7 @@ static void shrinkwrap_calc_nearest_vertex(ShrinkwrapCalcData *calc)
 
 			/* Convert the coordinates back to mesh coordinates */
 			copy_v3_v3(tmp_co, nearest.co);
-			space_transform_invert(&calc->local2target, tmp_co);
+			BLI_space_transform_invert(&calc->local2target, tmp_co);
 
 			interp_v3_v3v3(co, co, tmp_co, weight);  /* linear interpolation */
 		}
@@ -204,11 +173,11 @@ bool BKE_shrinkwrap_project_normal(
 	/* Apply space transform (TODO readjust dist) */
 	if (transf) {
 		copy_v3_v3(tmp_co, vert);
-		space_transform_apply(transf, tmp_co);
+		BLI_space_transform_apply(transf, tmp_co);
 		co = tmp_co;
 
 		copy_v3_v3(tmp_no, dir);
-		space_transform_apply_normal(transf, tmp_no);
+		BLI_space_transform_apply_normal(transf, tmp_no);
 		no = tmp_no;
 
 #ifdef USE_DIST_CORRECT
@@ -227,7 +196,7 @@ bool BKE_shrinkwrap_project_normal(
 	if (hit_tmp.index != -1) {
 		/* invert the normal first so face culling works on rotated objects */
 		if (transf) {
-			space_transform_invert_normal(transf, hit_tmp.no);
+			BLI_space_transform_invert_normal(transf, hit_tmp.no);
 		}
 
 		if (options & (MOD_SHRINKWRAP_CULL_TARGET_FRONTFACE | MOD_SHRINKWRAP_CULL_TARGET_BACKFACE)) {
@@ -242,7 +211,7 @@ bool BKE_shrinkwrap_project_normal(
 
 		if (transf) {
 			/* Inverting space transform (TODO make coeherent with the initial dist readjust) */
-			space_transform_invert(transf, hit_tmp.co);
+			BLI_space_transform_invert(transf, hit_tmp.co);
 #ifdef USE_DIST_CORRECT
 			hit_tmp.dist = len_v3v3(vert, hit_tmp.co);
 #endif
@@ -307,7 +276,7 @@ static void shrinkwrap_calc_normal_projection(ShrinkwrapCalcData *calc, bool for
 		auxMesh = object_get_derived_final(calc->smd->auxTarget, for_render);
 		if (!auxMesh)
 			return;
-		SPACE_TRANSFORM_SETUP(&local2aux, calc->ob, calc->smd->auxTarget);
+		BLI_SPACE_TRANSFORM_SETUP(&local2aux, calc->ob, calc->smd->auxTarget);
 	}
 
 	/* After sucessufuly build the trees, start projection vertexs */
@@ -441,7 +410,7 @@ static void shrinkwrap_calc_nearest_surface_point(ShrinkwrapCalcData *calc)
 		else {
 			copy_v3_v3(tmp_co, co);
 		}
-		space_transform_apply(&calc->local2target, tmp_co);
+		BLI_space_transform_apply(&calc->local2target, tmp_co);
 
 		/* Use local proximity heuristics (to reduce the nearest search)
 		 *
@@ -475,7 +444,7 @@ static void shrinkwrap_calc_nearest_surface_point(ShrinkwrapCalcData *calc)
 			}
 
 			/* Convert the coordinates back to mesh coordinates */
-			space_transform_invert(&calc->local2target, tmp_co);
+			BLI_space_transform_invert(&calc->local2target, tmp_co);
 			interp_v3_v3v3(co, co, tmp_co, weight);  /* linear interpolation */
 		}
 	}
@@ -518,7 +487,7 @@ void shrinkwrapModifier_deform(ShrinkwrapModifierData *smd, Object *ob, DerivedM
 		/* TODO there might be several "bugs" on non-uniform scales matrixs
 		 * because it will no longer be nearest surface, not sphere projection
 		 * because space has been deformed */
-		SPACE_TRANSFORM_SETUP(&calc.local2target, ob, smd->target);
+		BLI_SPACE_TRANSFORM_SETUP(&calc.local2target, ob, smd->target);
 
 		/* TODO: smd->keepDist is in global units.. must change to local */
 		calc.keepDist = smd->keepDist;
diff --git a/source/blender/blenlib/BLI_math_matrix.h b/source/blender/blenlib/BLI_math_matrix.h
index 68d8e3b..7bcaab1 100644
--- a/source/blender/blenlib/BLI_math_matrix.h
+++ b/source/blender/blenlib/BLI_math_matrix.h
@@ -224,6 +224,22 @@ bool is_negative_m4(float mat[4][4]);
 bool is_zero_m3(float mat[3][3]);
 bool is_zero_m4(float mat[4][4]);
 
+/* SpaceTransform helper */
+typedef struct SpaceTransform {
+	float local2target[4][4];
+	float target2local[4][4];
+
+} SpaceTransform;
+
+void BLI_space_transform_from_matrices(struct SpaceTransform *data, float local[4][4], float target[4][4]);
+void BLI_space_transform_apply(const struct SpaceTransform *data, float co[3]);
+void BLI_space_transform_invert(const struct SpaceTransform *data, float co[3]);
+void BLI_space_transform_apply_normal(const struct SpaceTransform *data, float no[3]);
+void BLI_space_transform_invert_normal(const struct SpaceTransform *data, float no[3]);
+
+#define BLI_SPACE_TRANSFORM_SETUP(dat

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list