[Bf-blender-cvs] [1f151d6] soc-2014-shapekey: Intermediate code for fixing transform manip draw
Grigory Revzin
noreply at git.blender.org
Sun Jun 8 01:44:09 CEST 2014
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;
More information about the Bf-blender-cvs
mailing list