Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/editors/transform/transform_manipulator.c')
-rw-r--r--source/blender/editors/transform/transform_manipulator.c88
1 files changed, 40 insertions, 48 deletions
diff --git a/source/blender/editors/transform/transform_manipulator.c b/source/blender/editors/transform/transform_manipulator.c
index 5578ea754df..f95856b2373 100644
--- a/source/blender/editors/transform/transform_manipulator.c
+++ b/source/blender/editors/transform/transform_manipulator.c
@@ -60,6 +60,7 @@
#include "BKE_mesh.h"
#include "BKE_particle.h"
#include "BKE_pointcache.h"
+#include "BKE_tessmesh.h"
#include "BLI_math.h"
#include "BLI_editVert.h"
@@ -298,72 +299,63 @@ int calc_manipulator_stats(const bContext *C)
if((ob->lay & v3d->lay)==0) return 0;
if(obedit->type==OB_MESH) {
- EditMesh *em = BKE_mesh_get_editmesh(obedit->data);
- EditVert *eve;
- EditSelection ese;
+ BMEditMesh *em = ((Mesh*)obedit->data)->edit_btmesh;
+ BMEditSelection ese;
float vec[3]= {0,0,0};
/* USE LAST SELECTE WITH ACTIVE */
- if (v3d->around==V3D_ACTIVE && EM_get_actSelection(em, &ese)) {
- EM_editselection_center(vec, &ese);
+ if (v3d->around==V3D_ACTIVE && EDBM_get_actSelection(em, &ese)) {
+ EDBM_editselection_center(em, vec, &ese);
calc_tw_center(scene, vec);
totsel= 1;
- } else {
+ }
+ else {
+ BMesh *bm = em->bm;
+ BMVert *eve;
+
+ BMIter iter;
+
/* do vertices/edges/faces for center depending on selection
mode. note we can't use just vertex selection flag because
it is not flush down on changes */
if(ts->selectmode & SCE_SELECT_VERTEX) {
- for(eve= em->verts.first; eve; eve= eve->next) {
- if(eve->f & SELECT) {
- totsel++;
- calc_tw_center(scene, eve->co);
+ BM_ITER(eve, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ if(!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
+ if(BM_elem_flag_test(eve, BM_ELEM_SELECT)) {
+ totsel++;
+ calc_tw_center(scene, eve->co);
+ }
}
}
}
else if(ts->selectmode & SCE_SELECT_EDGE) {
- EditEdge *eed;
-
- for(eve= em->verts.first; eve; eve= eve->next) eve->f1= 0;
- for(eed= em->edges.first; eed; eed= eed->next) {
- if(eed->h==0 && (eed->f & SELECT)) {
- if(!eed->v1->f1) {
- eed->v1->f1= 1;
- totsel++;
- calc_tw_center(scene, eed->v1->co);
- }
- if(!eed->v2->f1) {
- eed->v2->f1= 1;
- totsel++;
- calc_tw_center(scene, eed->v2->co);
+ BMIter itersub;
+ BMEdge *eed;
+ BM_ITER(eve, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ if(!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
+ /* check the vertex has a selected edge, only add it once */
+ BM_ITER(eed, &itersub, bm, BM_EDGES_OF_VERT, eve) {
+ if(BM_elem_flag_test(eed, BM_ELEM_SELECT)) {
+ totsel++;
+ calc_tw_center(scene, eve->co);
+ break;
+ }
}
}
}
}
else {
- EditFace *efa;
-
- for(eve= em->verts.first; eve; eve= eve->next) eve->f1= 0;
- for(efa= em->faces.first; efa; efa= efa->next) {
- if(efa->h==0 && (efa->f & SELECT)) {
- if(!efa->v1->f1) {
- efa->v1->f1= 1;
- totsel++;
- calc_tw_center(scene, efa->v1->co);
- }
- if(!efa->v2->f1) {
- efa->v2->f1= 1;
- totsel++;
- calc_tw_center(scene, efa->v2->co);
- }
- if(!efa->v3->f1) {
- efa->v3->f1= 1;
- totsel++;
- calc_tw_center(scene, efa->v3->co);
- }
- if(efa->v4 && !efa->v4->f1) {
- efa->v4->f1= 1;
- totsel++;
- calc_tw_center(scene, efa->v4->co);
+ BMIter itersub;
+ BMFace *efa;
+ BM_ITER(eve, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ if(!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
+ /* check the vertex has a selected face, only add it once */
+ BM_ITER(efa, &itersub, bm, BM_FACES_OF_VERT, eve) {
+ if(BM_elem_flag_test(efa, BM_ELEM_SELECT)) {
+ totsel++;
+ calc_tw_center(scene, eve->co);
+ break;
+ }
}
}
}