[Bf-blender-cvs] [1f151d6] soc-2014-shapekey: Intermediate code for fixing transform manip draw

Grigory Revzin noreply at git.blender.org
Sun Jun 8 01:44:09 CEST 2014


Commit: 1f151d631973c2a014a5d5b05d1124dedacf6ad7
Author: Grigory Revzin
Date:   Sun Jun 8 01:43:52 2014 +0400
https://developer.blender.org/rB1f151d631973c2a014a5d5b05d1124dedacf6ad7

Intermediate code for fixing transform manip draw

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

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 84bb6a5..581f8a8 100644
--- a/source/blender/editors/transform/transform_manipulator.c
+++ b/source/blender/editors/transform/transform_manipulator.c
@@ -60,6 +60,7 @@
 #include "BKE_DerivedMesh.h"
 #include "BKE_key.h"
 #include "BKE_modifier.h"
+#include "MEM_guardedalloc.h"
 
 #include "BIF_gl.h"
 
@@ -261,10 +262,17 @@ 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) 
+void calc_tw_center_dm(Scene *scene, BMVert *eve, MVert *dm_verts, int edit_vert_index, int *index_map) 
 {
+	int derived_index;
+
+	if (index_map)
+		derived_index = index_map[edit_vert_index];
+	else
+		derived_index = edit_vert_index;
+
 	if (dm_verts) {
-		calc_tw_center(scene, dm_verts[vert_index].co);
+		calc_tw_center(scene, dm_verts[derived_index].co);
 	} 
 	else {
 		calc_tw_center(scene, eve->co);
@@ -302,44 +310,76 @@ int calc_manipulator_stats(const bContext *C)
 		if ((ob->lay & v3d->lay) == 0) return 0;
 
 		if (obedit->type == OB_MESH) {
-			bool vertpos_deformed = false;
+			bool need_index_map = false;
+
+			/* check if there is a key 'modifier' */
+			bool has_deform_modifiers = BKE_key_from_object(ob) 
+												&& BKE_keyblock_from_object(ob) && ob->shapeflag & OB_SHAPE_EDIT_MODE;
+			
 			BMEditMesh *em = BKE_editmesh_from_object(obedit);
 			BMEditSelection ese;
 			float vec[3] = { 0, 0, 0 };
+			int *derived_index_map = NULL;
+
 
-			/* 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 (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 = editbmesh_get_derived_cage(scene, ob, em, 0);
-					break;
+					need_index_map = true;
+				}
+				else {
+					has_deform_modifiers = true;
 				}
 			}
 
-			/* 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, 0);
+			if (has_deform_modifiers || need_index_map) {
+				dm = editbmesh_get_derived_cage(scene, ob, em, CD_ORIGINDEX);
 			}
 
-			if (dm)
-				dmverts = dm->getVertArray(dm);
+			if (need_index_map) {
+				int totdmvert;
+				int orig_index;
+				int *p_indexlayer;
+				int totmapped = 0;
+
+				p_indexlayer = DM_get_vert_data_layer(dm, CD_ORIGINDEX);
+
+				if (p_indexlayer) {
+					totdmvert = dm->getNumVerts(dm);
+					derived_index_map = MEM_mallocN(sizeof(int) * em->bm->totvert, __func__);
+					for (a = 0; a < totdmvert; ++a) {
+						orig_index = *p_indexlayer;
+						if (orig_index != ORIGINDEX_NONE) {
+							totmapped++;
+							BLI_assert(orig_index < em->bm->totvert);
+							derived_index_map[orig_index] = a;
+						}
+						++p_indexlayer;
+					}
+					if (totmapped < em->bm->totvert) {
+						MEM_freeN(derived_index_map);
+						printf("Failed to map back!\n");
+						printf("totmapped=%d totvert=%d\n", totmapped, em->bm->totvert);
+						derived_index_map = NULL;
+					}
+				}
 
-			/* USE LAST SELECTE WITH ACTIVE */
-			if ((v3d->around == V3D_ACTIVE) && BM_select_history_active_get(em->bm, &ese)) {
-				BM_editselection_center(&ese, vec);
-				calc_tw_center(scene, vec);
-				totsel = 1;
+				if (derived_index_map) {
+					/* this situation means we managed to map the derived mesh back to editmesh if we needed it */
+					dmverts = dm->getVertArray(dm);
+				}
 			}
-			else {
-				int a;
+
+			if (has_deform_modifiers && (!(need_index_map && !derived_index_map))) {
+										/* check that we didn't fail to map back */
+				dmverts = dm->getVertArray(dm);
+			}
+
+			{
 				BMesh *bm = em->bm;
 				BMVert *eve;
 
@@ -353,7 +393,7 @@ int calc_manipulator_stats(const bContext *C)
 						if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
 							if (BM_elem_flag_test(eve, BM_ELEM_SELECT)) {
 								totsel++;
-								calc_tw_center_dm(scene, eve, dmverts, a);
+								calc_tw_center_dm(scene, eve, dmverts, a, derived_index_map);
 							}
 						}
 					}
@@ -367,7 +407,7 @@ int calc_manipulator_stats(const bContext *C)
 							BM_ITER_ELEM (eed, &itersub, eve, BM_EDGES_OF_VERT) {
 								if (BM_elem_flag_test(eed, BM_ELEM_SELECT)) {
 									totsel++;
-									calc_tw_center_dm(scene, eve, dmverts, a);
+									calc_tw_center_dm(scene, eve, dmverts, a, derived_index_map);
 									break;
 								}
 							}
@@ -383,7 +423,7 @@ int calc_manipulator_stats(const bContext *C)
 							BM_ITER_ELEM (efa, &itersub, eve, BM_FACES_OF_VERT) {
 								if (BM_elem_flag_test(efa, BM_ELEM_SELECT)) {
 									totsel++;
-									calc_tw_center_dm(scene, eve, dmverts, a);
+									calc_tw_center_dm(scene, eve, dmverts, a, derived_index_map);
 									break;
 								}
 							}
@@ -391,6 +431,10 @@ int calc_manipulator_stats(const bContext *C)
 					}
 				}
 			}
+		
+			if (derived_index_map)
+				MEM_freeN(derived_index_map);
+
 		} /* end editmesh */
 		else if (obedit->type == OB_ARMATURE) {
 			bArmature *arm = obedit->data;




More information about the Bf-blender-cvs mailing list