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/space_view3d/view3d_buttons.c')
-rw-r--r--source/blender/editors/space_view3d/view3d_buttons.c171
1 files changed, 93 insertions, 78 deletions
diff --git a/source/blender/editors/space_view3d/view3d_buttons.c b/source/blender/editors/space_view3d/view3d_buttons.c
index 1b923c7a0cd..391b344df01 100644
--- a/source/blender/editors/space_view3d/view3d_buttons.c
+++ b/source/blender/editors/space_view3d/view3d_buttons.c
@@ -58,6 +58,7 @@
#include "BKE_main.h"
#include "BKE_mesh.h"
#include "BKE_screen.h"
+#include "BKE_tessmesh.h"
#include "BKE_deform.h"
#include "BKE_object.h"
@@ -153,32 +154,36 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
if(ob->type==OB_MESH) {
Mesh *me= ob->data;
- EditMesh *em = BKE_mesh_get_editmesh(me);
- EditVert *eve, *evedef=NULL;
- EditEdge *eed;
+ BMEditMesh *em = me->edit_btmesh;
+ BMesh *bm = em->bm;
+ BMVert *eve, *evedef=NULL;
+ BMEdge *eed;
+ BMIter iter;
- eve= em->verts.first;
- while(eve) {
- if(eve->f & SELECT) {
+ BM_ITER(eve, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ if(BM_TestHFlag(eve, BM_SELECT)) {
evedef= eve;
tot++;
add_v3_v3(median, eve->co);
}
- eve= eve->next;
}
- eed= em->edges.first;
- while(eed) {
- if((eed->f & SELECT)) {
+
+ BM_ITER(eed, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ if(BM_TestHFlag(eed, BM_SELECT)) {
+ float *f;
+
totedge++;
- median[3]+= eed->crease;
- median[6]+= eed->bweight;
+ f = bm_get_cd_float(&bm->edata, eed->head.data, CD_CREASE);
+ median[3]+= f ? *f : 0.0f;
+
+ f = bm_get_cd_float(&bm->edata, eed->head.data, CD_BWEIGHT);
+ median[6]+= f ? *f : 0.0f;
}
- eed= eed->next;
}
/* check for defgroups */
if(evedef)
- dvert= CustomData_em_get(&em->vdata, evedef->data, CD_MDEFORMVERT);
+ dvert= CustomData_bmesh_get(&em->bm->vdata, evedef->head.data, CD_MDEFORMVERT);
if(tot==1 && dvert && dvert->totweight) {
bDeformGroup *dg;
int i, max=1, init=1;
@@ -202,8 +207,6 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
tfp->defweightp= &dvert->dw[0].weight;
}
}
-
- BKE_mesh_end_editmesh(me, em);
}
else if(ob->type==OB_CURVE || ob->type==OB_SURF) {
Curve *cu= ob->data;
@@ -409,31 +412,34 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
if(ob->type==OB_MESH) {
Mesh *me= ob->data;
- EditMesh *em = BKE_mesh_get_editmesh(me);
+ BMEditMesh *em = me->edit_btmesh;
+ BMVert *eve;
+ BMIter iter;
- /* allow for some rounding error becasue of matrix transform */
if(len_v3(median) > 0.000001f) {
- EditVert *eve;
- for(eve= em->verts.first; eve; eve= eve->next) {
- if(eve->f & SELECT) {
+ BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ if(BM_TestHFlag(eve, BM_SELECT)) {
add_v3_v3(eve->co, median);
}
}
-
- recalc_editnormals(em);
+
+ EDBM_RecalcNormals(em);
}
-
+
if(median[3] != 0.0f) {
- EditEdge *eed;
+ BMEdge *eed;
const float fixed_crease= (ve_median[3] <= 0.0f ? 0.0f : (ve_median[3] >= 1.0f ? 1.0f : FLT_MAX));
-
+
if(fixed_crease != FLT_MAX) {
/* simple case */
- for(eed= em->edges.first; eed; eed= eed->next) {
- if(eed->f & SELECT) {
- eed->crease= fixed_crease;
+ BM_ITER(eed, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
+ if(BM_TestHFlag(eed, BM_SELECT)) {
+ float *crease = CustomData_bmesh_get(&em->bm->edata, eed->head.data, CD_CREASE);
+ if (!crease) break;
+
+ *crease= fixed_crease;
}
}
}
@@ -450,10 +456,14 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
/* scale down */
const float sca= median_new / median_orig;
- for(eed= em->edges.first; eed; eed= eed->next) {
- if(eed->f & SELECT) {
- eed->crease *= sca;
- CLAMP(eed->crease, 0.0f, 1.0f);
+ BM_ITER(eed, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
+ if(BM_TestHFlag(eed, BM_SELECT) && !BM_TestHFlag(eed, BM_HIDDEN)) {
+ float *crease = CustomData_bmesh_get(&em->bm->edata, eed->head.data, CD_CREASE);
+
+ if (!crease) break;
+
+ *crease *= sca;
+ CLAMP(*crease, 0.0f, 1.0f);
}
}
}
@@ -461,17 +471,20 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
/* scale up */
const float sca= (1.0f - median_new) / (1.0f - median_orig);
- for(eed= em->edges.first; eed; eed= eed->next) {
- if(eed->f & SELECT) {
- eed->crease = 1.0f - ((1.0f - eed->crease) * sca);
- CLAMP(eed->crease, 0.0f, 1.0f);
+ BM_ITER(eed, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
+ if(BM_TestHFlag(eed, BM_SELECT) && !BM_TestHFlag(eed, BM_HIDDEN)) {
+ float *crease = CustomData_bmesh_get(&em->bm->edata, eed->head.data, CD_CREASE);
+ if (!crease) break;
+
+ *crease = 1.0f - ((1.0f - *crease) * sca);
+ CLAMP(*crease, 0.0f, 1.0f);
}
}
}
}
}
-
if (median[6] != 0.0f) {
+#if 0 // BMESH_TODO
EditEdge *eed;
const float fixed_bweight= (ve_median[6] <= 0.0f ? 0.0f : (ve_median[6] >= 1.0f ? 1.0f : FLT_MAX));
@@ -516,8 +529,9 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
}
}
}
+#endif // BMESH_TODO
}
- BKE_mesh_end_editmesh(me, em);
+ EDBM_RecalcNormals(em);
}
else if(ob->type==OB_CURVE || ob->type==OB_SURF) {
Curve *cu= ob->data;
@@ -594,37 +608,35 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
#define B_VGRP_PNL_EDIT_SINGLE 8 /* or greater */
#define B_VGRP_PNL_COPY_SINGLE 16384 /* or greater */
-static void act_vert_def(Object *ob, EditVert **eve, MDeformVert **dvert)
+static void act_vert_def(Object *ob, BMVert **eve, MDeformVert **dvert)
{
if(ob && ob->mode & OB_MODE_EDIT && ob->type==OB_MESH && ob->defbase.first) {
Mesh *me= ob->data;
- EditMesh *em = BKE_mesh_get_editmesh(me);
- EditSelection *ese = ((EditSelection*)em->selected.last);
+ BMEditMesh *em = me->edit_btmesh;
+ BMEditSelection *ese= (BMEditSelection*)em->bm->selected.last;
- if(ese && ese->type == EDITVERT) {
- *eve= (EditVert*)ese->data;
- *dvert= CustomData_em_get(&em->vdata, (*eve)->data, CD_MDEFORMVERT);
+ if(ese && ese->htype == BM_VERT) {
+ *eve= (BMVert*)ese->data;
+ *dvert= CustomData_bmesh_get(&em->bm->vdata, (*eve)->head.data, CD_MDEFORMVERT);
return;
}
-
- BKE_mesh_end_editmesh(me, em);
}
*eve= NULL;
*dvert= NULL;
}
-static void editvert_mirror_update(Object *ob, EditVert *eve, int def_nr, int index)
+static void editvert_mirror_update(Object *ob, BMVert *eve, int def_nr, int index)
{
Mesh *me= ob->data;
- EditMesh *em = BKE_mesh_get_editmesh(me);
- EditVert *eve_mirr;
+ BMEditMesh *em = me->edit_btmesh;
+ BMVert *eve_mirr;
- eve_mirr= editmesh_get_x_mirror_vert(ob, em, eve, eve->co, index);
+ eve_mirr= editbmesh_get_x_mirror_vert(ob, em, eve, eve->co, index);
if(eve_mirr && eve_mirr != eve) {
- MDeformVert *dvert_src= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT);
- MDeformVert *dvert_dst= CustomData_em_get(&em->vdata, eve_mirr->data, CD_MDEFORMVERT);
+ MDeformVert *dvert_src= CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_MDEFORMVERT);
+ MDeformVert *dvert_dst= CustomData_bmesh_get(&em->bm->vdata, eve_mirr->head.data, CD_MDEFORMVERT);
if(dvert_dst) {
if(def_nr == -1) {
/* all vgroups, add groups where neded */
@@ -646,7 +658,7 @@ static void editvert_mirror_update(Object *ob, EditVert *eve, int def_nr, int in
static void vgroup_adjust_active(Object *ob, int def_nr)
{
- EditVert *eve_act;
+ BMVert *eve_act;
MDeformVert *dvert_act;
act_vert_def(ob, &eve_act, &dvert_act);
@@ -659,7 +671,7 @@ static void vgroup_adjust_active(Object *ob, int def_nr)
static void vgroup_copy_active_to_sel(Object *ob)
{
- EditVert *eve_act;
+ BMVert *eve_act;
MDeformVert *dvert_act;
act_vert_def(ob, &eve_act, &dvert_act);
@@ -669,14 +681,15 @@ static void vgroup_copy_active_to_sel(Object *ob)
}
else {
Mesh *me= ob->data;
- EditMesh *em = BKE_mesh_get_editmesh(me);
- EditVert *eve;
+ BMEditMesh *em = me->edit_btmesh;
+ BMIter iter;
+ BMVert *eve;
MDeformVert *dvert;
int index= 0;
- for(eve= em->verts.first; eve; eve= eve->next, index++) {
- if(eve->f & SELECT && eve != eve_act) {
- dvert= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT);
+ BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ if(BM_TestHFlag(eve, BM_SELECT) && eve != eve_act) {
+ dvert= CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_MDEFORMVERT);
if(dvert) {
defvert_copy(dvert, dvert_act);
@@ -685,13 +698,15 @@ static void vgroup_copy_active_to_sel(Object *ob)
}
}
+
+ index++;
}
}
}
static void vgroup_copy_active_to_sel_single(Object *ob, const int def_nr)
{
- EditVert *eve_act;
+ BMVert *eve_act;
MDeformVert *dv_act;
act_vert_def(ob, &eve_act, &dv_act);
@@ -701,8 +716,9 @@ static void vgroup_copy_active_to_sel_single(Object *ob, const int def_nr)
}
else {
Mesh *me= ob->data;
- EditMesh *em = BKE_mesh_get_editmesh(me);
- EditVert *eve;
+ BMEditMesh *em = me->edit_btmesh;
+ BMIter iter;
+ BMVert *eve;
MDeformVert *dv;
MDeformWeight *dw;
float weight_act;
@@ -712,26 +728,25 @@ static void vgroup_copy_active_to_sel_single(Object *ob, const int def_nr)
if(dw == NULL)
return;
-
+
weight_act= dw->weight;
- for (eve= em->verts.first; eve; eve= eve->next, index++) {
- if (eve->f & SELECT && eve != eve_act) {
- dv= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT);
- if(dv) {
- dw= defvert_find_index(dv, def_nr);
- if (dw) {
- dw->weight= weight_act;
+ eve = BMIter_New(&iter, em->bm, BM_VERTS_OF_MESH, NULL);
+ for (index=0; eve; eve=BMIter_Step(&iter), index++) {
+ if(BM_TestHFlag(eve, BM_SELECT) && eve != eve_act) {
+ dv= CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_MDEFORMVERT);
+ dw= defvert_find_index(dv, def_nr);
+ if (dw) {
+ dw->weight= weight_act;
- if (me->editflag & ME_EDIT_MIRROR_X) {
- editvert_mirror_update(ob, eve, -1, index);
- }
+ if (me->editflag & ME_EDIT_MIRROR_X) {
+ editvert_mirror_update(ob, eve, -1, index);
}
}
}
}
- if (me->editflag & ME_EDIT_MIRROR_X) {
+ if(me->editflag & ME_EDIT_MIRROR_X) {
editvert_mirror_update(ob, eve_act, -1, -1);
}
}
@@ -739,7 +754,7 @@ static void vgroup_copy_active_to_sel_single(Object *ob, const int def_nr)
static void vgroup_normalize_active(Object *ob)
{
- EditVert *eve_act;
+ BMVert *eve_act;
MDeformVert *dvert_act;
act_vert_def(ob, &eve_act, &dvert_act);
@@ -787,7 +802,7 @@ static int view3d_panel_vgroup_poll(const bContext *C, PanelType *UNUSED(pt))
{
Scene *scene= CTX_data_scene(C);
Object *ob= OBACT;
- EditVert *eve_act;
+ BMVert *eve_act;
MDeformVert *dvert_act;
act_vert_def(ob, &eve_act, &dvert_act);
@@ -802,7 +817,7 @@ static void view3d_panel_vgroup(const bContext *C, Panel *pa)
Scene *scene= CTX_data_scene(C);
Object *ob= OBACT;
- EditVert *eve;
+ BMVert *eve;
MDeformVert *dv;
act_vert_def(ob, &eve, &dv);