[Bf-blender-cvs] [26efda7] soc-2014-shapekey: Moved index mapping to DerivedMesh.c for reuse
Grigory Revzin
noreply at git.blender.org
Sun Jun 8 01:44:10 CEST 2014
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;
More information about the Bf-blender-cvs
mailing list