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