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