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;

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

Reply via email to