[Bf-blender-cvs] [7593ac2affb] blender2.8: Transform: add manipulator aligned bounds

Campbell Barton noreply at git.blender.org
Tue Sep 26 15:05:05 CEST 2017


Commit: 7593ac2affb2a37ff7500e8121c5a8ddee4c6b7f
Author: Campbell Barton
Date:   Tue Sep 26 23:16:20 2017 +1000
Branches: blender2.8
https://developer.blender.org/rB7593ac2affb2a37ff7500e8121c5a8ddee4c6b7f

Transform: add manipulator aligned bounds

ifdef'd out for now

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

M	source/blender/editors/transform/transform_manipulator.c

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

diff --git a/source/blender/editors/transform/transform_manipulator.c b/source/blender/editors/transform/transform_manipulator.c
index 72c3bbfcf79..af64c52dc06 100644
--- a/source/blender/editors/transform/transform_manipulator.c
+++ b/source/blender/editors/transform/transform_manipulator.c
@@ -86,6 +86,8 @@
 #include "GPU_immediate.h"
 #include "GPU_matrix.h"
 
+// #define USE_AXIS_BOUNDS
+
 /* return codes for select, and drawing flags */
 
 #define MAN_TRANS_X		(1 << 0)
@@ -158,6 +160,12 @@ typedef struct ManipulatorGroup {
 struct TransformBounds {
 	float center[3];		/* Center for transform widget. */
 	float min[3], max[3];	/* Boundbox of selection for transform widget. */
+
+#ifdef USE_AXIS_BOUNDS
+	/* Normalized axis */
+	float axis[3][3];
+	float axis_min[3], axis_max[3];
+#endif
 };
 
 /* **************** Utilities **************** */
@@ -422,6 +430,14 @@ static void calc_tw_center(struct TransformBounds *tbounds, const float co[3])
 {
 	minmax_v3v3_v3(tbounds->min, tbounds->max, co);
 	add_v3_v3(tbounds->center, co);
+
+#ifdef USE_AXIS_BOUNDS
+	for (int i = 0; i < 3; i++) {
+		const float d = dot_v3v3(tbounds->axis[i], co);
+		tbounds->axis_min[i] = min_ff(d, tbounds->axis_min[i]);
+		tbounds->axis_max[i] = max_ff(d, tbounds->axis_max[i]);
+	}
+#endif
 }
 
 static void protectflag_to_drawflags(short protectflag, short *drawflags)
@@ -586,10 +602,88 @@ static int calc_manipulator_stats(const bContext *C, struct TransformBounds *tbo
 
 	rv3d->twdrawflag = 0xFFFF;
 
+
+	/* global, local or normal orientation?
+	 * if we could check 'totsel' now, this should be skipped with no selection. */
+	if (ob && !is_gp_edit) {
+
+		switch (v3d->twmode) {
+
+			case V3D_MANIP_GLOBAL:
+			{
+				break; /* nothing to do */
+			}
+			case V3D_MANIP_GIMBAL:
+			{
+				float mat[3][3];
+				if (gimbal_axis(ob, mat)) {
+					copy_m4_m3(rv3d->twmat, mat);
+					break;
+				}
+				/* if not gimbal, fall through to normal */
+				ATTR_FALLTHROUGH;
+			}
+			case V3D_MANIP_NORMAL:
+			{
+				if (obedit || ob->mode & OB_MODE_POSE) {
+					float mat[3][3];
+					ED_getTransformOrientationMatrix(C, mat, v3d->around);
+					copy_m4_m3(rv3d->twmat, mat);
+					break;
+				}
+				/* no break we define 'normal' as 'local' in Object mode */
+				ATTR_FALLTHROUGH;
+			}
+			case V3D_MANIP_LOCAL:
+			{
+				if (ob->mode & OB_MODE_POSE) {
+					/* each bone moves on its own local axis, but  to avoid confusion,
+					 * use the active pones axis for display [#33575], this works as expected on a single bone
+					 * and users who select many bones will understand whats going on and what local means
+					 * when they start transforming */
+					float mat[3][3];
+					ED_getTransformOrientationMatrix(C, mat, v3d->around);
+					copy_m4_m3(rv3d->twmat, mat);
+					break;
+				}
+				copy_m4_m4(rv3d->twmat, ob->obmat);
+				normalize_m4(rv3d->twmat);
+				break;
+			}
+			case V3D_MANIP_VIEW:
+			{
+				float mat[3][3];
+				copy_m3_m4(mat, rv3d->viewinv);
+				normalize_m3(mat);
+				copy_m4_m3(rv3d->twmat, mat);
+				break;
+			}
+			case V3D_MANIP_CUSTOM:
+			{
+				TransformOrientation *custom_orientation = BKE_workspace_transform_orientation_find(
+				        CTX_wm_workspace(C), v3d->custom_orientation_index);
+				float mat[3][3];
+
+				if (applyTransformOrientation(custom_orientation, mat, NULL)) {
+					copy_m4_m3(rv3d->twmat, mat);
+				}
+				break;
+			}
+		}
+	}
+
 	/* transform widget centroid/center */
 	INIT_MINMAX(tbounds->min, tbounds->max);
 	zero_v3(tbounds->center);
-	
+
+#ifdef USE_AXIS_BOUNDS
+	copy_m3_m4(tbounds->axis, rv3d->twmat);
+	for (int i = 0; i < 3; i++) {
+		tbounds->axis_min[i] = +FLT_MAX;
+		tbounds->axis_max[i] = -FLT_MAX;
+	}
+#endif
+
 	if (is_gp_edit) {
 		float diff_mat[4][4];
 		float fpt[3];
@@ -906,73 +1000,8 @@ static int calc_manipulator_stats(const bContext *C, struct TransformBounds *tbo
 		}
 	}
 
-	/* global, local or normal orientation? */
-	if (ob && totsel && !is_gp_edit) {
-
-		switch (v3d->twmode) {
-		
-			case V3D_MANIP_GLOBAL:
-			{
-				break; /* nothing to do */
-			}
-			case V3D_MANIP_GIMBAL:
-			{
-				float mat[3][3];
-				if (gimbal_axis(ob, mat)) {
-					copy_m4_m3(rv3d->twmat, mat);
-					break;
-				}
-				/* if not gimbal, fall through to normal */
-				ATTR_FALLTHROUGH;
-			}
-			case V3D_MANIP_NORMAL:
-			{
-				if (obedit || ob->mode & OB_MODE_POSE) {
-					float mat[3][3];
-					ED_getTransformOrientationMatrix(C, mat, v3d->around);
-					copy_m4_m3(rv3d->twmat, mat);
-					break;
-				}
-				/* no break we define 'normal' as 'local' in Object mode */
-				ATTR_FALLTHROUGH;
-			}
-			case V3D_MANIP_LOCAL:
-			{
-				if (ob->mode & OB_MODE_POSE) {
-					/* each bone moves on its own local axis, but  to avoid confusion,
-					 * use the active pones axis for display [#33575], this works as expected on a single bone
-					 * and users who select many bones will understand whats going on and what local means
-					 * when they start transforming */
-					float mat[3][3];
-					ED_getTransformOrientationMatrix(C, mat, v3d->around);
-					copy_m4_m3(rv3d->twmat, mat);
-					break;
-				}
-				copy_m4_m4(rv3d->twmat, ob->obmat);
-				normalize_m4(rv3d->twmat);
-				break;
-			}
-			case V3D_MANIP_VIEW:
-			{
-				float mat[3][3];
-				copy_m3_m4(mat, rv3d->viewinv);
-				normalize_m3(mat);
-				copy_m4_m3(rv3d->twmat, mat);
-				break;
-			}
-			case V3D_MANIP_CUSTOM:
-			{
-				TransformOrientation *custom_orientation = BKE_workspace_transform_orientation_find(
-				                                               CTX_wm_workspace(C), v3d->custom_orientation_index);
-				float mat[3][3];
-
-				if (applyTransformOrientation(custom_orientation, mat, NULL)) {
-					copy_m4_m3(rv3d->twmat, mat);
-				}
-				break;
-			}
-		}
-
+	if (totsel == 0) {
+		unit_m4(rv3d->twmat);
 	}
 
 	return totsel;



More information about the Bf-blender-cvs mailing list