[Bf-blender-cvs] [26efda7] soc-2014-shapekey: Moved index mapping to DerivedMesh.c for reuse

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


Commit: 26efda7327b28989174ea70a69c3b0f427db0596
Author: Grigory Revzin
Date:   Sun Jun 8 03:38:03 2014 +0400
https://developer.blender.org/rB26efda7327b28989174ea70a69c3b0f427db0596

Moved index mapping to DerivedMesh.c for reuse

Can move to fixing constraints drawing in the morning now, reusing this part of code

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

M	source/blender/blenkernel/BKE_DerivedMesh.h
M	source/blender/blenkernel/intern/DerivedMesh.c
M	source/blender/editors/transform/transform_manipulator.c

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

diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h
index 1ab5ec5..1d0979d 100644
--- a/source/blender/blenkernel/BKE_DerivedMesh.h
+++ b/source/blender/blenkernel/BKE_DerivedMesh.h
@@ -745,6 +745,15 @@ void DM_set_object_boundbox(struct Object *ob, DerivedMesh *dm);
 
 void DM_init_origspace(DerivedMesh *dm);
 
+/* Returns true if the object's derived cage vertex indeces can be assumed to be in sync to
+* the editdata (base) vertex indeces */
+bool DM_vertindex_sync_derived_cage(struct Object *ob);
+
+/* Maps editmesh vertex indeces to derivedmesh cage vertex indces and returns the map.
+* If returns NULL, it means that mapping failed for some reason.
+* It is the caller's responsibility to free the returned array! */
+int *DM_map_editmesh_to_derived_cage(struct Object *ob, struct BMEditMesh *em, struct DerivedMesh *cage_dm);
+
 /* debug only */
 #ifndef NDEBUG
 char *DM_debug_info(DerivedMesh *dm);
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index 5339c3f..e416149 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -3434,3 +3434,54 @@ MFace *DM_get_tessface_array(DerivedMesh *dm, bool *allocated)
 
 	return mface;
 }
+
+
+bool DM_vertindex_sync_derived_cage(Object *ob)
+{
+	ModifierData *md;
+	ModifierTypeInfo *mti;
+
+	BLI_assert(ob->type == OB_MESH);
+	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)
+		{
+			return false;
+		}
+	}
+	return true;
+}
+
+int *DM_map_editmesh_to_derived_cage(Object *ob, BMEditMesh *em, DerivedMesh *cage_dm)
+{
+	int *derived_index_map = NULL;
+	
+	int totdmvert = cage_dm->getNumVerts(cage_dm);
+	int orig_index;
+	int *p_indexlayer;
+	int totmapped = 0;
+
+	p_indexlayer = DM_get_vert_data_layer(cage_dm, CD_ORIGINDEX);
+
+	if (p_indexlayer) {
+		int a;
+		
+		derived_index_map = MEM_mallocN(em->bm->totvert * sizeof(int), "derived index map");
+		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);
+			derived_index_map = NULL;
+		}
+	}
+	
+	return derived_index_map;
+}
\ No newline at end of file
diff --git a/source/blender/editors/transform/transform_manipulator.c b/source/blender/editors/transform/transform_manipulator.c
index 581f8a8..f1286fd 100644
--- a/source/blender/editors/transform/transform_manipulator.c
+++ b/source/blender/editors/transform/transform_manipulator.c
@@ -271,12 +271,7 @@ void calc_tw_center_dm(Scene *scene, BMVert *eve, MVert *dm_verts, int edit_vert
 	else
 		derived_index = edit_vert_index;
 
-	if (dm_verts) {
-		calc_tw_center(scene, dm_verts[derived_index].co);
-	} 
-	else {
-		calc_tw_center(scene, eve->co);
-	}
+	calc_tw_center(scene, dm_verts[derived_index].co);
 }
 
 /* centroid, boundbox, of selection */
@@ -310,79 +305,44 @@ int calc_manipulator_stats(const bContext *C)
 		if ((ob->lay & v3d->lay) == 0) return 0;
 
 		if (obedit->type == OB_MESH) {
-			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;
+			BMEditMesh *em = BKE_editmesh_from_object(obedit);
+			DerivedMesh *dm = editbmesh_get_derived_cage(scene, ob, em, CD_ORIGINDEX);
+			dmverts = dm->getVertArray(dm);
 
+			float vec[3] = { 0, 0, 0 };
 
-			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) 
-				{
-					need_index_map = true;
-				}
-				else {
-					has_deform_modifiers = true;
-				}
-			}
+			int *derived_index_map = NULL;
 
-			if (has_deform_modifiers || need_index_map) {
-				dm = editbmesh_get_derived_cage(scene, ob, em, CD_ORIGINDEX);
+			if (!DM_vertindex_sync_derived_cage(ob)) {
+				derived_index_map = DM_map_editmesh_to_derived_cage(ob, em, 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;
+			if ((v3d->around == V3D_ACTIVE) && BM_select_history_active_get(em->bm, &ese)) {
+				if (ese.htype == BM_VERT) {
+					BMVert *v = (BMVert *) ese.ele;
+					int index = BM_elem_index_get(v);
+					calc_tw_center_dm(scene, v, dmverts, BM_elem_index_get(v), derived_index_map);
+				} 
+				else if (ese.htype == BM_EDGE) {
+					BMEdge *e = (BMEdge *) ese.ele;
+					
+					calc_tw_center_dm(scene, e->v1, dmverts, BM_elem_index_get(e->v1), derived_index_map);
+					calc_tw_center_dm(scene, e->v2, dmverts, BM_elem_index_get(e->v2), derived_index_map);
+				} 
+				else if (ese.htype = BM_FACE) {
+					BMFace *f = (BMFace *) ese.ele;
+					BMVert *v;
+					BMIter iter;
+					BM_ITER_ELEM(v, &iter, f, BM_VERTS_OF_FACE) {
+						calc_tw_center_dm(scene, v, dmverts, BM_elem_index_get(v), derived_index_map);
 					}
 				}
-
-				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);
-				}
-			}
-
-			if (has_deform_modifiers && (!(need_index_map && !derived_index_map))) {
-										/* check that we didn't fail to map back */
-				dmverts = dm->getVertArray(dm);
-			}
-
-			{
+				totsel = 1;
+			} 
+			else {
 				BMesh *bm = em->bm;
 				BMVert *eve;
-
 				BMIter iter;
 
 				/* do vertices/edges/faces for center depending on selection
@@ -434,7 +394,6 @@ 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