Commit: 516038c983e7eb6236252c65e5db8b287fbdc2ec Author: Grigory Revzin Date: Thu Jun 12 01:53:53 2014 +0400 https://developer.blender.org/rB516038c983e7eb6236252c65e5db8b287fbdc2ec
Transform constraint and propcircle drawing positions update Manipulator and constraints and prop circle are now drawn where they should be drawn: on derived cage-based positions. http://screenshot.su/img/ef/e6/26/efe626a9a496e794c174e76ec9522736.jpg Moved the mapping function over to crazyspace, seems a better place for them. Abstracted active element center calculation to crazyspace, too. Use scene->customdata_mask on mesh to prevent recalculating the DerivedMesh every time. Screenshot here: =================================================================== M source/blender/blenkernel/BKE_DerivedMesh.h M source/blender/blenkernel/BKE_crazyspace.h M source/blender/blenkernel/intern/DerivedMesh.c M source/blender/blenkernel/intern/crazyspace.c M source/blender/editors/transform/transform_conversions.c M source/blender/editors/transform/transform_generics.c M source/blender/editors/transform/transform_manipulator.c M source/blender/makesdna/DNA_scene_types.h =================================================================== diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h index 1d0979d..1ab5ec5 100644 --- a/source/blender/blenkernel/BKE_DerivedMesh.h +++ b/source/blender/blenkernel/BKE_DerivedMesh.h @@ -745,15 +745,6 @@ 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/BKE_crazyspace.h b/source/blender/blenkernel/BKE_crazyspace.h index 98bcdc5..67ec31f 100644 --- a/source/blender/blenkernel/BKE_crazyspace.h +++ b/source/blender/blenkernel/BKE_crazyspace.h @@ -48,6 +48,20 @@ void BKE_crazyspace_set_quats_mesh(struct Mesh *me, float (*origcos)[3], float ( int BKE_sculpt_get_first_deform_matrices(struct Scene *scene, struct Object *ob, float (**deformmats)[3][3], float (**deformcos)[3]); void BKE_crazyspace_build_sculpt(struct Scene *scene, struct Object *ob, float (**deformmats)[3][3], float (**deformcos)[3]); +/* Returns true if the object's derived cage vertex indeces can be assumed to be in sync to +* the editdata (base) vertex indeces */ +bool BKE_crazyspace_cageindexes_in_sync(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 (modifier failing to set CD_ORIGINDEX, etc). +* It is the caller's responsibility to free the returned array! */ +int *BKE_crazyspace_map_em_to_cage(struct Object *ob, struct BMEditMesh *em, struct DerivedMesh *cage_dm); + +/* Calculates editmesh active element selection center in global space on derived cage + * (used in calculating visual manipulator and transform constraint centers) */ +void BKE_crazyspace_cage_active_sel_center(struct BMEditSelection *active_sel, struct DerivedMesh *cage, + int *derived_index_map, float *cent); + #ifdef __cplusplus } #endif diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index e416149..5339c3f 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -3434,54 +3434,3 @@ 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/blenkernel/intern/crazyspace.c b/source/blender/blenkernel/intern/crazyspace.c index 3fde1cd..80fd27e 100644 --- a/source/blender/blenkernel/intern/crazyspace.c +++ b/source/blender/blenkernel/intern/crazyspace.c @@ -446,3 +446,104 @@ void BKE_crazyspace_build_sculpt(Scene *scene, Object *ob, float (**deformmats)[ unit_m3((*deformmats)[a]); } } + +void BKE_crazyspace_cage_active_sel_center(BMEditSelection *ese, DerivedMesh *cage, int *derived_index_map, float *cent) +{ + MVert *dm_verts = cage->getVertArray(cage); + int cage_index; + + if (ese->htype == BM_VERT) { + BMVert *v = (BMVert *)ese->ele; + if (derived_index_map) { + cage_index = derived_index_map[BM_elem_index_get(v)]; + copy_v3_v3(cent, dm_verts[cage_index].co); + } + else { + copy_v3_v3(cent, dm_verts[BM_elem_index_get(v)].co); + } + } + else if (ese->htype == BM_EDGE) { + BMEdge *e = (BMEdge *)ese->ele; + zero_v3(cent); + if (derived_index_map) { + int cage_ind_v1 = derived_index_map[BM_elem_index_get(e->v1)]; + int cage_ind_v2 = derived_index_map[BM_elem_index_get(e->v2)]; + add_v3_v3(cent, dm_verts[cage_ind_v1].co); + add_v3_v3(cent, dm_verts[cage_ind_v2].co); + } + else { + add_v3_v3(cent, dm_verts[BM_elem_index_get(e->v1)].co); + add_v3_v3(cent, dm_verts[BM_elem_index_get(e->v2)].co); + } + mul_v3_fl(cent, 0.5f); + } + else if (ese->htype = BM_FACE) { + BMFace *f = (BMFace *)ese->ele; + BMVert *v; + BMIter iter; + zero_v3(cent); + int total = 0, index; + BM_ITER_ELEM(v, &iter, f, BM_VERTS_OF_FACE) { + ++total; + index = BM_elem_index_get(v); + if (derived_index_map) { + add_v3_v3(cent, dm_verts[derived_index_map[index]].co); + } + else { + add_v3_v3(cent, dm_verts[index].co); + } + } + mul_v3_fl(cent, 1.0f / total); + } +} + +bool BKE_crazyspace_cageindexes_in_sync(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 + && md->mode & eModifierMode_Realtime) + { + return false; + } + } + return true; +} + +int *BKE_crazyspace_map_em_to_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; +} diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c index 96e7547..fc7a69c 100644 --- a/source/blender/editors/transform/transform_conversions.c +++ b/source/blender/editors/transform/transform_conversions.c @@ -2108,7 +2108,7 @@ static void VertsToTransData(TransInfo *t, TransData *td, TransDataExtension *tx td->ext = NULL; td->val = NULL; - td->extra = NULL; + td->extra = eve; if (t->mode == TFM_BWEIGHT) { td->val = bweight; td->ival = *bweight; diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c index 6eb8821..554e203 100644 --- a/source/blender/editors/transform/transform_generics.c +++ b/source/blender/editors/transform/transform_generics.c @@ -69,6 +69,7 @@ #include "BKE_action.h" #include "BKE_armature.h" #include "BKE_curve.h" +#include "BKE_crazyspace.h" #include "BKE_depsgraph.h" #include "BKE_fcurve.h" #include "BKE_lattice.h" @@ -78,6 +79,7 @@ #include "BKE_editmesh.h" #include "BKE_tracking.h" #include "BKE_mask.h" +#include "BKE_DerivedMesh.h" #include "ED_anim_api.h" #include "ED_armature.h" @@ -1605,16 +1607,59 @@ void calculateCenterMedian(TransInfo *t, float r_center[3]) float partial[3] = {0.0f, 0.0f, 0.0f}; int total = 0; int i; - - for (i = 0; i < t->total; i++) { - if (t->data[i].flag & TD_SELECTED) { - if (!(t->data[i].flag & TD_NOCENTER)) { - add_v3_v3(partial, t->data[i].center); - total++; + Object *ob = t->obedit; + + if (ob && ob->type == OB_MESH) { + Mesh *me = ob->data; + DerivedMesh *cage = editbmesh_get_derived_cage(t->scene, ob, me->edit_btmesh, t->scene->customdata_mask); + int *vertexmap = NULL; + MVert *dmv; + BMVert *emv; + + if (!BKE_crazyspace_cageindexes_in_sync(ob)) { + vertexmap = BKE_crazyspace_map_em_to_cage(ob, me->edit_btmesh, cage); + } + + dmv = cage->getVertArray(cage); + + if (vertexmap) { + int dm_index; + for (i = 0; i < t->total; i++) { + if (t->data[i].flag & TD_SELECTED) { + if (!(t->data[i].flag & TD_NOCENTER)) { + emv = t->data[i].extra; + dm_index = vertexmap[BM_elem_index_get(emv)]; + add_v3_v3(partial, dmv[dm_index].co); + total++; + } + } + } + MEM_freeN(vertexmap); + } + else { + for (i = 0; i < t->total; i++) { + if (t->data[i].flag & TD_SELECTED) { + if (!(t->data[i].flag & TD_NOCENTER)) { + emv = t->data[i].extra; + add_v3_v3(partial, dmv[BM_elem_index_get(emv)].co); + total++; + } + } + } + } + } + else { + for (i = 0; i < t->total; i++) { + if (t->data[i].flag & TD_SELECTED) { + if (!(t->data[i].flag & TD_NOCENTER)) { + add_v3_v3(partial, t->data[i].center); + total++; + } } } } - if (i) + + if (total) mul_v3_fl(partial, 1.0f / total); copy_v3_v3(r_center, partial); } @@ -1650,13 +1695,23 @@ bool calculateCenterActive(TransInfo *t, bool select_only, float r_center[3]) switch (t->obedit->type) { case OB_MESH: { + int @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs