[Bf-blender-cvs] [96e296c] soc-2014-shapekey: Manip handles are now drawn in right place with deform modifiers

Grigory Revzin noreply at git.blender.org
Fri Jun 6 00:23:27 CEST 2014


Commit: 96e296c6591129393305b52c0a857f0693373afa
Author: Grigory Revzin
Date:   Fri Jun 6 02:15:24 2014 +0400
https://developer.blender.org/rB96e296c6591129393305b52c0a857f0693373afa

Manip handles are now drawn in right place with deform modifiers

Now to constraint axis

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

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 125975e..1dd8026 100644
--- a/source/blender/editors/transform/transform_manipulator.c
+++ b/source/blender/editors/transform/transform_manipulator.c
@@ -42,6 +42,7 @@
 #include "DNA_screen_types.h"
 #include "DNA_scene_types.h"
 #include "DNA_view3d_types.h"
+#include "DNA_modifier_types.h"
 
 #include "BLI_math.h"
 #include "BLI_utildefines.h"
@@ -56,6 +57,9 @@
 #include "BKE_pointcache.h"
 #include "BKE_editmesh.h"
 #include "BKE_lattice.h"
+#include "BKE_DerivedMesh.h"
+#include "BKE_key.h"
+#include "BKE_modifier.h"
 
 #include "BIF_gl.h"
 
@@ -257,6 +261,15 @@ bool gimbal_axis(Object *ob, float gmat[3][3])
 	return 0;
 }
 
+void calc_tw_center_dm(Scene *scene, BMVert *eve, MVert *dm_verts, int vert_index) 
+{
+	if (dm_verts) {
+		calc_tw_center(scene, dm_verts[vert_index].co);
+	} 
+	else {
+		calc_tw_center(scene, eve->co);
+	}
+}
 
 /* centroid, boundbox, of selection */
 /* returns total items selected */
@@ -271,6 +284,8 @@ int calc_manipulator_stats(const bContext *C)
 	RegionView3D *rv3d = ar->regiondata;
 	Base *base;
 	Object *ob = OBACT;
+	DerivedMesh *dm = NULL;
+	MVert *dmverts = NULL;
 	int a, totsel = 0;
 
 	/* transform widget matrix */
@@ -287,9 +302,35 @@ int calc_manipulator_stats(const bContext *C)
 		if ((ob->lay & v3d->lay) == 0) return 0;
 
 		if (obedit->type == OB_MESH) {
+			bool vertpos_deformed = false;
 			BMEditMesh *em = BKE_editmesh_from_object(obedit);
 			BMEditSelection ese;
-			float vec[3] = {0, 0, 0};
+			float vec[3] = { 0, 0, 0 };
+
+			/* check if any  deform modifiers are in there, we want to draw the manip on them */
+			ModifierData *md;
+			ModifierTypeInfo *mti;
+			for (md = ob->modifiers.first; md; md = md->next) {
+				mti = modifierType_getInfo(md->type);
+				if (mti->type == eModifierTypeType_OnlyDeform && md->mode & eModifierMode_OnCage && 
+																	md->mode & eModifierMode_Editmode) 
+				{
+					/* if the modifier is set to be on cage (and enabled in editmode), base the selection off 
+					 * the final deform derivedMesh */
+					dm = mesh_get_derived_deform(scene, ob, CD_MASK_DERIVEDMESH);
+					break;
+				}
+			}
+
+			/* if shape keys are there, use the derivedmesh too */
+			if (!dm && BKE_key_from_object(ob) && BKE_keyblock_from_object(ob) && ob->shapeflag & OB_SHAPE_EDIT_MODE) {
+				/* if no modifiers are on-cage-enabled, then use only shapekeys (so the manip is drawn 
+				 * correctly on the cage, not on the final mesh) */
+				dm = editbmesh_get_derived_cage(scene, ob, em, CD_MASK_DERIVEDMESH);
+			}
+
+			if (dm)
+				dmverts = dm->getVertArray(dm);
 
 			/* USE LAST SELECTE WITH ACTIVE */
 			if ((v3d->around == V3D_ACTIVE) && BM_select_history_active_get(em->bm, &ese)) {
@@ -298,6 +339,7 @@ int calc_manipulator_stats(const bContext *C)
 				totsel = 1;
 			}
 			else {
+				int a;
 				BMesh *bm = em->bm;
 				BMVert *eve;
 
@@ -307,11 +349,11 @@ int calc_manipulator_stats(const bContext *C)
 				 * mode. note we can't use just vertex selection flag because
 				 * it is not flush down on changes */
 				if (ts->selectmode & SCE_SELECT_VERTEX) {
-					BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
+					BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, a) {
 						if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
 							if (BM_elem_flag_test(eve, BM_ELEM_SELECT)) {
 								totsel++;
-								calc_tw_center(scene, eve->co);
+								calc_tw_center_dm(scene, eve, dmverts, a);
 							}
 						}
 					}
@@ -319,13 +361,13 @@ int calc_manipulator_stats(const bContext *C)
 				else if (ts->selectmode & SCE_SELECT_EDGE) {
 					BMIter itersub;
 					BMEdge *eed;
-					BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
+					BM_ITER_MESH_INDEX(eve, &iter, bm, BM_VERTS_OF_MESH, a) {
 						if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
 							/* check the vertex has a selected edge, only add it once */
 							BM_ITER_ELEM (eed, &itersub, eve, BM_EDGES_OF_VERT) {
 								if (BM_elem_flag_test(eed, BM_ELEM_SELECT)) {
 									totsel++;
-									calc_tw_center(scene, eve->co);
+									calc_tw_center_dm(scene, eve, dmverts, a);
 									break;
 								}
 							}
@@ -335,13 +377,13 @@ int calc_manipulator_stats(const bContext *C)
 				else {
 					BMIter itersub;
 					BMFace *efa;
-					BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
+					BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, a) {
 						if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
 							/* check the vertex has a selected face, only add it once */
 							BM_ITER_ELEM (efa, &itersub, eve, BM_FACES_OF_VERT) {
 								if (BM_elem_flag_test(efa, BM_ELEM_SELECT)) {
 									totsel++;
-									calc_tw_center(scene, eve->co);
+									calc_tw_center_dm(scene, eve, dmverts, a);
 									break;
 								}
 							}




More information about the Bf-blender-cvs mailing list