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;

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to