diff options
Diffstat (limited to 'source/blender/editors/object')
-rw-r--r-- | source/blender/editors/object/CMakeLists.txt | 1 | ||||
-rw-r--r-- | source/blender/editors/object/SConscript | 2 | ||||
-rw-r--r-- | source/blender/editors/object/object_add.c | 30 | ||||
-rw-r--r-- | source/blender/editors/object/object_bake.c | 46 | ||||
-rw-r--r-- | source/blender/editors/object/object_edit.c | 17 | ||||
-rw-r--r-- | source/blender/editors/object/object_hook.c | 55 | ||||
-rw-r--r-- | source/blender/editors/object/object_intern.h | 1 | ||||
-rw-r--r-- | source/blender/editors/object/object_lattice.c | 4 | ||||
-rw-r--r-- | source/blender/editors/object/object_modifier.c | 107 | ||||
-rw-r--r-- | source/blender/editors/object/object_ops.c | 3 | ||||
-rw-r--r-- | source/blender/editors/object/object_relations.c | 24 | ||||
-rw-r--r-- | source/blender/editors/object/object_shapekey.c | 6 | ||||
-rw-r--r-- | source/blender/editors/object/object_transform.c | 57 | ||||
-rw-r--r-- | source/blender/editors/object/object_vgroup.c | 181 |
14 files changed, 339 insertions, 195 deletions
diff --git a/source/blender/editors/object/CMakeLists.txt b/source/blender/editors/object/CMakeLists.txt index c78c9fddbe8..081b0f1feaf 100644 --- a/source/blender/editors/object/CMakeLists.txt +++ b/source/blender/editors/object/CMakeLists.txt @@ -24,6 +24,7 @@ set(INC ../../blenkernel ../../blenlib ../../blenloader + ../../bmesh ../../gpu ../../ikplugin ../../imbuf diff --git a/source/blender/editors/object/SConscript b/source/blender/editors/object/SConscript index d4739236ba1..883d0ca20ae 100644 --- a/source/blender/editors/object/SConscript +++ b/source/blender/editors/object/SConscript @@ -5,7 +5,7 @@ sources = env.Glob('*.c') incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf' incs += ' ../../windowmanager #/intern/guardedalloc ../../blenloader' -incs += ' ../../makesrna ../../python ../../ikplugin' +incs += ' ../../makesrna ../../python ../../ikplugin ../../bmesh' incs += ' ../../render/extern/include ../../gpu' # for object_bake.c incs += ' #extern/recastnavigation' diff --git a/source/blender/editors/object/object_add.c b/source/blender/editors/object/object_add.c index 0292977f816..152fcae4d57 100644 --- a/source/blender/editors/object/object_add.c +++ b/source/blender/editors/object/object_add.c @@ -235,7 +235,8 @@ int ED_object_add_generic_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(ev return op->type->exec(C, op); } -int ED_object_add_generic_get_opts(bContext *C, wmOperator *op, float *loc, float *rot, int *enter_editmode, unsigned int *layer) +int ED_object_add_generic_get_opts(bContext *C, wmOperator *op, float *loc, + float *rot, int *enter_editmode, unsigned int *layer, int *is_view_aligned) { View3D *v3d = CTX_wm_view3d(C); int a, layer_values[20]; @@ -283,7 +284,9 @@ int ED_object_add_generic_get_opts(bContext *C, wmOperator *op, float *loc, floa else RNA_float_get_array(op->ptr, "rotation", rot); - + if (is_view_aligned) + *is_view_aligned = view_align; + RNA_float_get_array(op->ptr, "location", loc); if(*layer == 0) { @@ -296,7 +299,8 @@ int ED_object_add_generic_get_opts(bContext *C, wmOperator *op, float *loc, floa /* for object add primitive operators */ /* do not call undo push in this function (users of this function have to) */ -Object *ED_object_add_type(bContext *C, int type, float *loc, float *rot, int enter_editmode, unsigned int layer) +Object *ED_object_add_type(bContext *C, int type, float *loc, float *rot, + int enter_editmode, unsigned int layer) { Main *bmain= CTX_data_main(C); Scene *scene= CTX_data_scene(C); @@ -333,7 +337,7 @@ static int object_add_exec(bContext *C, wmOperator *op) unsigned int layer; float loc[3], rot[3]; - if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer)) + if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer, NULL)) return OPERATOR_CANCELLED; ED_object_add_type(C, RNA_enum_get(op->ptr, "type"), loc, rot, enter_editmode, layer); @@ -390,7 +394,7 @@ static Object *effector_add_type(bContext *C, wmOperator *op, int type) object_add_generic_invoke_options(C, op); - if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer)) + if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer, NULL)) return NULL; if(type==PFIELD_GUIDE) { @@ -470,7 +474,7 @@ static int object_camera_add_exec(bContext *C, wmOperator *op) object_add_generic_invoke_options(C, op); - if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer)) + if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer, NULL)) return OPERATOR_CANCELLED; ob= ED_object_add_type(C, OB_CAMERA, loc, rot, FALSE, layer); @@ -524,7 +528,7 @@ static int object_metaball_add_exec(bContext *C, wmOperator *op) object_add_generic_invoke_options(C, op); // XXX these props don't get set right when only exec() is called - if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer)) + if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer, NULL)) return OPERATOR_CANCELLED; if(obedit==NULL || obedit->type!=OB_MBALL) { @@ -593,7 +597,7 @@ static int object_add_text_exec(bContext *C, wmOperator *op) float loc[3], rot[3]; object_add_generic_invoke_options(C, op); // XXX these props don't get set right when only exec() is called - if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer)) + if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer, NULL)) return OPERATOR_CANCELLED; if(obedit && obedit->type==OB_FONT) @@ -634,7 +638,7 @@ static int object_armature_add_exec(bContext *C, wmOperator *op) float loc[3], rot[3]; object_add_generic_invoke_options(C, op); // XXX these props don't get set right when only exec() is called - if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer)) + if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer, NULL)) return OPERATOR_CANCELLED; if ((obedit==NULL) || (obedit->type != OB_ARMATURE)) { @@ -700,7 +704,7 @@ static int object_lamp_add_exec(bContext *C, wmOperator *op) float loc[3], rot[3]; object_add_generic_invoke_options(C, op); - if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer)) + if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer, NULL)) return OPERATOR_CANCELLED; ob= ED_object_add_type(C, OB_LAMP, loc, rot, FALSE, layer); @@ -749,7 +753,7 @@ static int group_instance_add_exec(bContext *C, wmOperator *op) float loc[3], rot[3]; object_add_generic_invoke_options(C, op); - if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer)) + if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer, NULL)) return OPERATOR_CANCELLED; if(group) { @@ -781,7 +785,7 @@ static int object_speaker_add_exec(bContext *C, wmOperator *op) Scene *scene = CTX_data_scene(C); object_add_generic_invoke_options(C, op); - if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer)) + if(!ED_object_add_generic_get_opts(C, op, loc, rot, &enter_editmode, &layer, NULL)) return OPERATOR_CANCELLED; ob= ED_object_add_type(C, OB_SPEAKER, loc, rot, FALSE, layer); @@ -1236,7 +1240,7 @@ static int convert_exec(bContext *C, wmOperator *op) dm= mesh_get_derived_final(scene, newob, CD_MASK_MESH); /* dm= mesh_create_derived_no_deform(ob1, NULL); this was called original (instead of get_derived). man o man why! (ton) */ - DM_to_mesh(dm, newob->data); + DM_to_mesh(dm, newob->data, newob); dm->release(dm); object_free_modifiers(newob); /* after derivedmesh calls! */ diff --git a/source/blender/editors/object/object_bake.c b/source/blender/editors/object/object_bake.c index 446c359b9f2..1260979ead8 100644 --- a/source/blender/editors/object/object_bake.c +++ b/source/blender/editors/object/object_bake.c @@ -360,6 +360,16 @@ static int multiresbake_test_break(MultiresBakeRender *bkr) static void do_multires_bake(MultiresBakeRender *bkr, Image* ima, MPassKnownData passKnownData, MInitBakeData initBakeData, MApplyBakeData applyBakeData, MFreeBakeData freeBakeData) { +#if 1 // BMESH_TODO + (void)bkr; + (void)ima; + (void)passKnownData; + (void)initBakeData; + (void)applyBakeData; + (void)freeBakeData; + + printf("BMESH_TODO" AT "\n"); +#else DerivedMesh *dm= bkr->lores_dm; ImBuf *ibuf= BKE_image_get_ibuf(ima, NULL); const int lvl= bkr->lvl; @@ -442,6 +452,7 @@ static void do_multires_bake(MultiresBakeRender *bkr, Image* ima, MPassKnownData if(freeBakeData) freeBakeData(data.bake_data); } +#endif // BMESH_TODO } static void interp_bilinear_quad_data(float data[4][3], float u, float v, float res[3]) @@ -504,6 +515,16 @@ static void interp_bilinear_grid(DMGridData *grid, int grid_size, float crn_x, f static void get_ccgdm_data(DerivedMesh *lodm, DerivedMesh *hidm, const int lvl, const int face_index, const float u, const float v, float co[3], float n[3]) { +#if 1 // BMESH_TODO + (void)lodm; + (void)hidm; + (void)lvl; + (void)face_index; + (void)u; + (void)v; + (void)co; + (void)n; +#else MFace mface; DMGridData **grid_data; float crn_x, crn_y; @@ -546,6 +567,7 @@ static void get_ccgdm_data(DerivedMesh *lodm, DerivedMesh *hidm, const int lvl, if(co != NULL) interp_bilinear_grid(grid_data[g_index + S], grid_size, crn_x, crn_y, 1, co); +#endif } /* mode = 0: interpolate normals, @@ -675,6 +697,16 @@ static void apply_heights_callback(DerivedMesh *lores_dm, DerivedMesh *hires_dm, const int face_index, const int lvl, const float st[2], float UNUSED(tangmat[3][3]), const int x, const int y) { +#if 1 // BMESH_TODO + (void)lores_dm; + (void)hires_dm; + (void)bake_data; + (void)face_index; + (void)lvl; + (void)st; + (void)x; + (void)y; +#else MTFace *mtface= CustomData_get_layer(&lores_dm->faceData, CD_MTFACE); MFace mface; Image *ima= mtface[face_index].tpage; @@ -734,6 +766,7 @@ static void apply_heights_callback(DerivedMesh *lores_dm, DerivedMesh *hires_dm, char *rrgb= (char*)ibuf->rect + pixel*4; rrgb[3]= 255; } +#endif // BMESH_TODO } /* MultiresBake callback for normals' baking @@ -745,6 +778,16 @@ static void apply_tangmat_callback(DerivedMesh *lores_dm, DerivedMesh *hires_dm, const int face_index, const int lvl, const float st[2], float tangmat[3][3], const int x, const int y) { +#if 1 // BMESH_TODO + (void)lores_dm; + (void)hires_dm; + (void)face_index; + (void)lvl; + (void)st; + (void)tangmat; + (void)y; + (void)x; +#else MTFace *mtface= CustomData_get_layer(&lores_dm->faceData, CD_MTFACE); MFace mface; Image *ima= mtface[face_index].tpage; @@ -790,6 +833,7 @@ static void apply_tangmat_callback(DerivedMesh *lores_dm, DerivedMesh *hires_dm, rrgb[2]= FTOCHAR(vec[2]); rrgb[3]= 255; } +#endif } static void count_images(MultiresBakeRender *bkr) @@ -976,7 +1020,7 @@ static DerivedMesh *multiresbake_create_loresdm(Scene *scene, Object *ob, int *l if(*lvl==0) { DerivedMesh *tmp_dm= CDDM_from_mesh(me, ob); - dm= CDDM_copy(tmp_dm); + dm= CDDM_copy(tmp_dm, 0); tmp_dm->release(tmp_dm); } else { MultiresModifierData tmp_mmd= *mmd; diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c index 8ca481655d0..2c068bab86d 100644 --- a/source/blender/editors/object/object_edit.c +++ b/source/blender/editors/object/object_edit.c @@ -81,6 +81,7 @@ #include "BKE_sca.h" #include "BKE_softbody.h" #include "BKE_modifier.h" +#include "BKE_tessmesh.h" #include "ED_armature.h" #include "ED_curve.h" @@ -321,22 +322,24 @@ void ED_object_exit_editmode(bContext *C, int flag) // if(retopo_mesh_paint_check()) // retopo_end_okee(); - if(me->edit_mesh->totvert>MESH_MAX_VERTS) { + if(me->edit_btmesh->bm->totvert>MESH_MAX_VERTS) { error("Too many vertices"); return; } - load_editMesh(scene, obedit); + + EDBM_LoadEditBMesh(scene, obedit); if(freedata) { - free_editMesh(me->edit_mesh); - MEM_freeN(me->edit_mesh); - me->edit_mesh= NULL; + EDBM_FreeEditBMesh(me->edit_btmesh); + MEM_freeN(me->edit_btmesh); + me->edit_btmesh= NULL; } - +#if 0 //BMESH_TODO if(obedit->restore_mode & OB_MODE_WEIGHT_PAINT) { mesh_octree_table(NULL, NULL, NULL, 'e'); mesh_mirrtopo_table(NULL, 'e'); } +#endif } else if (obedit->type==OB_ARMATURE) { ED_armature_from_edit(obedit); @@ -445,7 +448,7 @@ void ED_object_enter_editmode(bContext *C, int flag) ok= 1; scene->obedit= ob; // context sees this - make_editMesh(scene, ob); + EDBM_MakeEditBMesh(CTX_data_tool_settings(C), scene, ob); WM_event_add_notifier(C, NC_SCENE|ND_MODE|NS_EDITMODE_MESH, scene); } diff --git a/source/blender/editors/object/object_hook.c b/source/blender/editors/object/object_hook.c index ce01bef34f6..1be95ad1654 100644 --- a/source/blender/editors/object/object_hook.c +++ b/source/blender/editors/object/object_hook.c @@ -57,6 +57,7 @@ #include "BKE_report.h" #include "BKE_scene.h" #include "BKE_deform.h" +#include "BKE_tessmesh.h" #include "RNA_define.h" #include "RNA_access.h" @@ -73,13 +74,14 @@ #include "object_intern.h" -static int return_editmesh_indexar(EditMesh *em, int *tot, int **indexar, float *cent) +static int return_editmesh_indexar(BMEditMesh *em, int *tot, int **indexar, float *cent) { - EditVert *eve; + BMVert *eve; + BMIter iter; int *index, nr, totvert=0; - for(eve= em->verts.first; eve; eve= eve->next) { - if(eve->f & SELECT) totvert++; + BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) { + if(BM_TestHFlag(eve, BM_SELECT)) totvert++; } if(totvert==0) return 0; @@ -88,8 +90,8 @@ static int return_editmesh_indexar(EditMesh *em, int *tot, int **indexar, float nr= 0; zero_v3(cent); - 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)) { *index= nr; index++; add_v3_v3(cent, eve->co); } @@ -101,7 +103,7 @@ static int return_editmesh_indexar(EditMesh *em, int *tot, int **indexar, float return totvert; } -static int return_editmesh_vgroup(Object *obedit, EditMesh *em, char *name, float *cent) +static int return_editmesh_vgroup(Object *obedit, BMEditMesh *em, char *name, float *cent) { zero_v3(cent); @@ -110,11 +112,12 @@ static int return_editmesh_vgroup(Object *obedit, EditMesh *em, char *name, floa int totvert=0; MDeformVert *dvert; - EditVert *eve; + BMVert *eve; + BMIter iter; /* find the vertices */ - for(eve= em->verts.first; eve; eve= eve->next) { - dvert= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT); + BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) { + dvert= CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_MDEFORMVERT); if(dvert) { if(defvert_find_weight(dvert, defgrp_index) > 0.0f) { @@ -134,25 +137,27 @@ static int return_editmesh_vgroup(Object *obedit, EditMesh *em, char *name, floa return 0; } -static void select_editmesh_hook(Object *ob, HookModifierData *hmd) +static void select_editbmesh_hook(Object *ob, HookModifierData *hmd) { Mesh *me= ob->data; - EditMesh *em= BKE_mesh_get_editmesh(me); - EditVert *eve; + BMEditMesh *em= me->edit_btmesh; + BMVert *eve; + BMIter iter; int index=0, nr=0; if (hmd->indexar == NULL) return; - for(eve= em->verts.first; eve; eve= eve->next, nr++) { + BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) { if(nr==hmd->indexar[index]) { - eve->f |= SELECT; + BM_Select(em->bm, eve, 1); if(index < hmd->totindex-1) index++; } + + nr++; } - EM_select_flush(em); - BKE_mesh_end_editmesh(me, em); + EDBM_selectmode_flush(em); } static int return_editlattice_indexar(Lattice *editlatt, int *tot, int **indexar, float *cent) @@ -302,20 +307,19 @@ static int object_hook_index_array(Scene *scene, Object *obedit, int *tot, int * case OB_MESH: { Mesh *me= obedit->data; - EditMesh *em; - load_editMesh(scene, obedit); - make_editMesh(scene, obedit); + BMEditMesh *em; - em = BKE_mesh_get_editmesh(me); + EDBM_LoadEditBMesh(scene, obedit); + EDBM_MakeEditBMesh(scene->toolsettings, scene, obedit); + + em = me->edit_btmesh; /* check selected vertices first */ if( return_editmesh_indexar(em, tot, indexar, cent_r)) { - BKE_mesh_end_editmesh(me, em); return 1; } else { int ret = return_editmesh_vgroup(obedit, em, name, cent_r); - BKE_mesh_end_editmesh(me, em); return ret; } } @@ -384,7 +388,7 @@ static void object_hook_select(Object *ob, HookModifierData *hmd) if (hmd->indexar == NULL) return; - if(ob->type==OB_MESH) select_editmesh_hook(ob, hmd); + if(ob->type==OB_MESH) select_editbmesh_hook(ob, hmd); else if(ob->type==OB_LATTICE) select_editlattice_hook(ob, hmd); else if(ob->type==OB_CURVE) select_editcurve_hook(ob, hmd); else if(ob->type==OB_SURF) select_editcurve_hook(ob, hmd); @@ -742,6 +746,7 @@ void OBJECT_OT_hook_recenter(wmOperatorType *ot) static int object_hook_assign_exec(bContext *C, wmOperator *op) { + Scene *scene= CTX_data_scene(C); PointerRNA ptr= CTX_data_pointer_get_type(C, "modifier", &RNA_HookModifier); int num= RNA_enum_get(op->ptr, "modifier"); Object *ob=NULL; @@ -765,7 +770,7 @@ static int object_hook_assign_exec(bContext *C, wmOperator *op) /* assign functionality */ - if(!object_hook_index_array(CTX_data_scene(C), ob, &tot, &indexar, name, cent)) { + if(!object_hook_index_array(scene, ob, &tot, &indexar, name, cent)) { BKE_report(op->reports, RPT_WARNING, "Requires selected vertices or active vertex group"); return OPERATOR_CANCELLED; } diff --git a/source/blender/editors/object/object_intern.h b/source/blender/editors/object/object_intern.h index 7bb98f4aeb1..a4d16984c56 100644 --- a/source/blender/editors/object/object_intern.h +++ b/source/blender/editors/object/object_intern.h @@ -161,6 +161,7 @@ void OBJECT_OT_multires_external_save(struct wmOperatorType *ot); void OBJECT_OT_multires_external_pack(struct wmOperatorType *ot); void OBJECT_OT_meshdeform_bind(struct wmOperatorType *ot); void OBJECT_OT_explode_refresh(struct wmOperatorType *ot); +void OBJECT_OT_test_multires(struct wmOperatorType *ot); /* object_constraint.c */ void OBJECT_OT_constraint_add(struct wmOperatorType *ot); diff --git a/source/blender/editors/object/object_lattice.c b/source/blender/editors/object/object_lattice.c index 14ce223db5e..af1d76fd3d0 100644 --- a/source/blender/editors/object/object_lattice.c +++ b/source/blender/editors/object/object_lattice.c @@ -367,7 +367,7 @@ typedef struct UndoLattice { int pntsu, pntsv, pntsw; } UndoLattice; -static void undoLatt_to_editLatt(void *data, void *edata) +static void undoLatt_to_editLatt(void *data, void *edata, void *UNUSED(obdata)) { UndoLattice *ult= (UndoLattice*)data; EditLatt *editlatt= (EditLatt *)edata; @@ -376,7 +376,7 @@ static void undoLatt_to_editLatt(void *data, void *edata) memcpy(editlatt->latt->def, ult->def, a*sizeof(BPoint)); } -static void *editLatt_to_undoLatt(void *edata) +static void *editLatt_to_undoLatt(void *edata, void *UNUSED(obdata)) { UndoLattice *ult= MEM_callocN(sizeof(UndoLattice), "UndoLattice"); EditLatt *editlatt= (EditLatt *)edata; diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c index ebbc4137628..aefbf33e948 100644 --- a/source/blender/editors/object/object_modifier.c +++ b/source/blender/editors/object/object_modifier.c @@ -67,6 +67,7 @@ #include "BKE_object.h" #include "BKE_particle.h" #include "BKE_softbody.h" +#include "BKE_tessmesh.h" #include "RNA_access.h" #include "RNA_define.h" @@ -216,15 +217,15 @@ int ED_object_modifier_remove(ReportList *reports, Main *bmain, Scene *scene, Ob } if(ok) { - if(me->edit_mesh) { - EditMesh *em= me->edit_mesh; + if(me->edit_btmesh) { + BMEditMesh *em= me->edit_btmesh; /* CustomData_external_remove is used here only to mark layer as non-external for further free-ing, so zero element count looks safer than em->totface */ - CustomData_external_remove(&em->fdata, &me->id, CD_MDISPS, 0); - EM_free_data_layer(em, &em->fdata, CD_MDISPS); + CustomData_external_remove(&em->bm->ldata, &me->id, CD_MDISPS, 0); + BM_free_data_layer(em->bm, &em->bm->ldata, CD_MDISPS); } else { - CustomData_external_remove(&me->fdata, &me->id, CD_MDISPS, me->totface); - CustomData_free_layer_active(&me->fdata, CD_MDISPS, me->totface); + CustomData_external_remove(&me->ldata, &me->id, CD_MDISPS, me->totloop); + CustomData_free_layer_active(&me->ldata, CD_MDISPS, me->totloop); } } } @@ -408,6 +409,17 @@ static int modifier_apply_shape(ReportList *reports, Scene *scene, Object *ob, M return 0; } + /* + It should be ridiculously easy to extract the original verts that we want + and form the shape data. We can probably use the CD KEYINDEX layer (or + whatever I ended up calling it, too tired to check now), though this would + by necassity have to make some potentially ugly assumptions about the order + of the mesh data :-/ you can probably assume in 99% of cases that the first + element of a given index is the original, and any subsequent duplicates are + copies/interpolates, but that's an assumption that would need to be tested + and then predominantly stated in comments in a half dozen headers. + */ + if (ob->type==OB_MESH) { DerivedMesh *dm; Mesh *me= ob->data; @@ -420,7 +432,7 @@ static int modifier_apply_shape(ReportList *reports, Scene *scene, Object *ob, M } mesh_pmv_off(me); - dm = mesh_create_derived_for_modifier(scene, ob, md); + dm = mesh_create_derived_for_modifier(scene, ob, md, 0); if (!dm) { BKE_report(reports, RPT_ERROR, "Modifier is disabled or returned error, skipping apply"); return 0; @@ -480,19 +492,19 @@ static int modifier_apply_obdata(ReportList *reports, Scene *scene, Object *ob, return 0; } } else { - dm = mesh_create_derived_for_modifier(scene, ob, md); + dm = mesh_create_derived_for_modifier(scene, ob, md, 1); if (!dm) { BKE_report(reports, RPT_ERROR, "Modifier returned error, skipping apply"); return 0; } - DM_to_mesh(dm, me); + DM_to_mesh(dm, me, ob); dm->release(dm); if(md->type == eModifierType_Multires) { - CustomData_external_remove(&me->fdata, &me->id, CD_MDISPS, me->totface); - CustomData_free_layer_active(&me->fdata, CD_MDISPS, me->totface); + CustomData_external_remove(&me->ldata, &me->id, CD_MDISPS, me->totloop); + CustomData_free_layer_active(&me->ldata, CD_MDISPS, me->totloop); } } } @@ -1119,6 +1131,66 @@ void OBJECT_OT_multires_reshape(wmOperatorType *ot) edit_modifier_properties(ot); } +static int multires_test_exec(bContext *C, wmOperator *op) +{ + Object *ob= ED_object_active_context(C); + Mesh *me = ob->data; + MPoly *mp; + MDisps *mdisps; + int i, x = RNA_int_get(op->ptr, "x"), y = RNA_int_get(op->ptr, "y"); + + if (ob->type != OB_MESH || !me) + return OPERATOR_CANCELLED; + + mdisps = CustomData_get_layer(&me->ldata, CD_MDISPS); + if (!mdisps) + return OPERATOR_CANCELLED; + + mp = me->mpoly; + for (i=0; i<me->totpoly; i++, mp++) { + MLoop *ml; + int j; + + ml = me->mloop + mp->loopstart; + for (j=0; j<mp->totloop; j++, ml++) { + MLoop *ml2 = me->mloop + mp->loopstart + (j+mp->totloop-1)%mp->totloop; + MLoop *ml3 = me->mloop + mp->loopstart + (j+1)%mp->totloop; + + if ((me->mvert[ml->v].flag&SELECT) && (me->mvert[ml2->v].flag&SELECT) && (me->mvert[ml3->v].flag&SELECT)) { + MDisps *md = mdisps + mp->loopstart + j; + int res = sqrt(md->totdisp); + + if (x >= res) x = res-1; + if (y >= res) y = res-1; + + md->disps[y*res + x][2] += 1.0; + } + } + } + + DAG_id_tag_update(&ob->id, OB_RECALC_DATA); + WM_event_add_notifier(C, NC_OBJECT|ND_MODIFIER, ob); + + return OPERATOR_FINISHED; +} + +void OBJECT_OT_test_multires(wmOperatorType *ot) +{ + ot->name= "Multires Object Mode Test"; + ot->description= ""; + ot->idname= "OBJECT_OT_test_multires"; + + ot->poll= multires_poll; + ot->exec= multires_test_exec; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + RNA_def_int(ot->srna, "x", 0, 0, 100, "x", "x", 0, 100); + RNA_def_int(ot->srna, "y", 0, 0, 100, "y", "y", 0, 100); +} + + + /****************** multires save external operator *********************/ static int multires_external_save_exec(bContext *C, wmOperator *op) @@ -1131,7 +1203,7 @@ static int multires_external_save_exec(bContext *C, wmOperator *op) if(!me) return OPERATOR_CANCELLED; - if(CustomData_external_test(&me->fdata, CD_MDISPS)) + if(CustomData_external_test(&me->ldata, CD_MDISPS)) return OPERATOR_CANCELLED; RNA_string_get(op->ptr, "filepath", path); @@ -1139,8 +1211,8 @@ static int multires_external_save_exec(bContext *C, wmOperator *op) if(relative) BLI_path_rel(path, G.main->name); - CustomData_external_add(&me->fdata, &me->id, CD_MDISPS, me->totface, path); - CustomData_external_write(&me->fdata, &me->id, CD_MASK_MESH, me->totface, 0); + CustomData_external_add(&me->ldata, &me->id, CD_MDISPS, me->totloop, path); + CustomData_external_write(&me->ldata, &me->id, CD_MASK_MESH, me->totloop, 0); return OPERATOR_FINISHED; } @@ -1160,7 +1232,7 @@ static int multires_external_save_invoke(bContext *C, wmOperator *op, wmEvent *U if (!mmd) return OPERATOR_CANCELLED; - if(CustomData_external_test(&me->fdata, CD_MDISPS)) + if(CustomData_external_test(&me->ldata, CD_MDISPS)) return OPERATOR_CANCELLED; if(!RNA_property_is_set(op->ptr, "relative_path")) @@ -1204,11 +1276,11 @@ static int multires_external_pack_exec(bContext *C, wmOperator *UNUSED(op)) Object *ob = ED_object_active_context(C); Mesh *me= ob->data; - if(!CustomData_external_test(&me->fdata, CD_MDISPS)) + if(!CustomData_external_test(&me->ldata, CD_MDISPS)) return OPERATOR_CANCELLED; // XXX don't remove.. - CustomData_external_remove(&me->fdata, &me->id, CD_MDISPS, me->totface); + CustomData_external_remove(&me->ldata, &me->id, CD_MDISPS, me->totloop); return OPERATOR_FINISHED; } @@ -1408,4 +1480,3 @@ void OBJECT_OT_explode_refresh(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; edit_modifier_properties(ot); } - diff --git a/source/blender/editors/object/object_ops.c b/source/blender/editors/object/object_ops.c index 5a2437b1911..e083528e2ca 100644 --- a/source/blender/editors/object/object_ops.c +++ b/source/blender/editors/object/object_ops.c @@ -214,8 +214,9 @@ void ED_operatortypes_object(void) WM_operatortype_append(OBJECT_OT_bake_image); WM_operatortype_append(OBJECT_OT_drop_named_material); -} + WM_operatortype_append(OBJECT_OT_test_multires); +} void ED_operatormacros_object(void) { diff --git a/source/blender/editors/object/object_relations.c b/source/blender/editors/object/object_relations.c index ec5aa19d3c0..77a1ee1047e 100644 --- a/source/blender/editors/object/object_relations.c +++ b/source/blender/editors/object/object_relations.c @@ -78,6 +78,7 @@ #include "BKE_scene.h" #include "BKE_speaker.h" #include "BKE_texture.h" +#include "BKE_tessmesh.h" #include "WM_api.h" #include "WM_types.h" @@ -93,9 +94,9 @@ #include "ED_curve.h" #include "ED_keyframing.h" #include "ED_object.h" +#include "ED_mesh.h" #include "ED_screen.h" #include "ED_view3d.h" -#include "ED_mesh.h" #include "object_intern.h" @@ -111,7 +112,8 @@ static int vertex_parent_set_exec(bContext *C, wmOperator *op) Main *bmain= CTX_data_main(C); Scene *scene= CTX_data_scene(C); Object *obedit= CTX_data_edit_object(C); - EditVert *eve; + BMVert *eve; + BMIter iter; Curve *cu; Nurb *nu; BezTriple *bezt; @@ -123,16 +125,15 @@ static int vertex_parent_set_exec(bContext *C, wmOperator *op) if(obedit->type==OB_MESH) { Mesh *me= obedit->data; - EditMesh *em; + BMEditMesh *em; - load_editMesh(scene, obedit); - make_editMesh(scene, obedit); + EDBM_LoadEditBMesh(scene, obedit); + EDBM_MakeEditBMesh(scene->toolsettings, scene, obedit); - em = BKE_mesh_get_editmesh(me); + em= me->edit_btmesh; - eve= em->verts.first; - while(eve) { - if(eve->f & 1) { + BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) { + if (BM_TestHFlag(eve, BM_SELECT)) { if(v1==0) v1= nr; else if(v2==0) v2= nr; else if(v3==0) v3= nr; @@ -140,10 +141,7 @@ static int vertex_parent_set_exec(bContext *C, wmOperator *op) else break; } nr++; - eve= eve->next; } - - BKE_mesh_end_editmesh(me, em); } else if(ELEM(obedit->type, OB_SURF, OB_CURVE)) { ListBase *editnurb= object_editcurve_get(obedit); @@ -1142,6 +1140,8 @@ static int move_to_layer_exec(bContext *C, wmOperator *op) WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, scene); WM_event_add_notifier(C, NC_SCENE|ND_LAYER_CONTENT, scene); + WM_event_add_notifier(C, NC_SCENE|ND_LAYER_CONTENT, scene); + DAG_scene_sort(bmain, scene); return OPERATOR_FINISHED; diff --git a/source/blender/editors/object/object_shapekey.c b/source/blender/editors/object/object_shapekey.c index 962aac06474..91037a54b51 100644 --- a/source/blender/editors/object/object_shapekey.c +++ b/source/blender/editors/object/object_shapekey.c @@ -189,10 +189,10 @@ static int object_shape_key_mirror(bContext *C, Object *ob) Mesh *me= ob->data; MVert *mv; - mesh_octree_table(ob, NULL, NULL, 's'); + //BMESH_TODO mesh_octree_table(ob, NULL, NULL, 's'); for(i1=0, mv=me->mvert; i1<me->totvert; i1++, mv++) { - i2= mesh_get_x_mirror_vert(ob, i1); + i2= -1; //BMESH_TODO mesh_get_x_mirror_vert(ob, i1); if(i2==i1) { fp1= ((float *)kb->data) + i1*3; fp1[0] = -fp1[0]; @@ -215,7 +215,7 @@ static int object_shape_key_mirror(bContext *C, Object *ob) } } - mesh_octree_table(ob, NULL, NULL, 'e'); + //BMESH_TODO mesh_octree_table(ob, NULL, NULL, 'e'); } else if (ob->type == OB_LATTICE) { Lattice *lt= ob->data; diff --git a/source/blender/editors/object/object_transform.c b/source/blender/editors/object/object_transform.c index 4c29490b0f0..235eb5db597 100644 --- a/source/blender/editors/object/object_transform.c +++ b/source/blender/editors/object/object_transform.c @@ -53,6 +53,7 @@ #include "BKE_mesh.h" #include "BKE_object.h" #include "BKE_report.h" +#include "BKE_tessmesh.h" #include "BKE_multires.h" #include "BKE_armature.h" @@ -493,7 +494,7 @@ static int apply_objects_internal(bContext *C, ReportList *reports, int apply_lo } /* update normals */ - mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL); + mesh_calc_normals(me->mvert, me->totvert, me->mloop, me->mpoly, me->totloop, me->totpoly, NULL, NULL, 0, NULL, NULL); } else if (ob->type==OB_ARMATURE) { ED_armature_apply_transform(ob, mat); @@ -670,37 +671,37 @@ static int object_origin_set_exec(bContext *C, wmOperator *op) if(obedit->type==OB_MESH) { Mesh *me= obedit->data; - EditMesh *em = BKE_mesh_get_editmesh(me); - EditVert *eve; - - if(around==V3D_CENTROID) { - int total= 0; - for(eve= em->verts.first; eve; eve= eve->next) { - total++; - add_v3_v3(cent, eve->co); - } - if(total) { - mul_v3_fl(cent, 1.0f/(float)total); + BMEditMesh *em = me->edit_btmesh; + BMVert *eve; + BMIter iter; + int total = 0; + + if(centermode == ORIGIN_TO_CURSOR) { + copy_v3_v3(cent, cursor); + invert_m4_m4(obedit->imat, obedit->obmat); + mul_m4_v3(obedit->imat, cent); + } else { + BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) { + if(around==V3D_CENTROID) { + total++; + add_v3_v3(cent, eve->co); + mul_v3_fl(cent, 1.0f/(float)total); + } + else { + DO_MINMAX(eve->co, min, max); + mid_v3_v3v3(cent, min, max); + } } } - else { - for(eve= em->verts.first; eve; eve= eve->next) { - DO_MINMAX(eve->co, min, max); - } - mid_v3_v3v3(cent, min, max); + + BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) { + sub_v3_v3(eve->co, cent); } - if(!is_zero_v3(cent)) { - for(eve= em->verts.first; eve; eve= eve->next) { - sub_v3_v3(eve->co, cent); - } - - recalc_editnormals(em); - tot_change++; - DAG_id_tag_update(&obedit->id, OB_RECALC_DATA); - } - BKE_mesh_end_editmesh(me, em); - } + EDBM_RecalcNormals(em); + tot_change++; + DAG_id_tag_update(&obedit->id, OB_RECALC_DATA); + } } /* reset flags */ diff --git a/source/blender/editors/object/object_vgroup.c b/source/blender/editors/object/object_vgroup.c index 49205318fd4..4bee89ef3ba 100644 --- a/source/blender/editors/object/object_vgroup.c +++ b/source/blender/editors/object/object_vgroup.c @@ -43,6 +43,7 @@ #include "DNA_curve_types.h" #include "DNA_lattice_types.h" #include "DNA_meshdata_types.h" +#include "DNA_mesh_types.h" #include "DNA_modifier_types.h" #include "DNA_object_types.h" #include "DNA_object_force.h" @@ -51,7 +52,7 @@ #include "BLI_math.h" #include "BLI_blenlib.h" -#include "BLI_editVert.h" +#include "BLI_cellalloc.h" #include "BLI_utildefines.h" #include "BKE_context.h" @@ -60,6 +61,7 @@ #include "BKE_depsgraph.h" #include "BKE_global.h" #include "BKE_mesh.h" +#include "BKE_tessmesh.h" #include "BKE_report.h" #include "BKE_DerivedMesh.h" @@ -91,7 +93,7 @@ static Lattice *vgroup_edit_lattice(Object *ob) int ED_vgroup_object_is_edit_mode(Object *ob) { if(ob->type == OB_MESH) - return (((Mesh*)ob->data)->edit_mesh != NULL); + return (((Mesh*)ob->data)->edit_btmesh != NULL); else if(ob->type == OB_LATTICE) return (((Lattice*)ob->data)->editlatt != NULL); @@ -171,23 +173,25 @@ static int ED_vgroup_give_parray(ID *id, MDeformVert ***dvert_arr, int *dvert_to { Mesh *me = (Mesh *)id; - if(me->edit_mesh) { - EditMesh *em = me->edit_mesh; - EditVert *eve; + if(me->edit_btmesh) { + BMEditMesh *em = me->edit_btmesh; + BMIter iter; + BMVert *eve; int i; - if (!CustomData_has_layer(&em->vdata, CD_MDEFORMVERT)) { + if (!CustomData_has_layer(&em->bm->vdata, CD_MDEFORMVERT)) { return 0; } - i= BLI_countlist(&em->verts); + i = em->bm->totvert; *dvert_arr= MEM_mallocN(sizeof(void*)*i, "vgroup parray from me"); *dvert_tot = i; i = 0; - for (eve=em->verts.first; eve; eve=eve->next, i++) { - (*dvert_arr)[i] = CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT); + BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) { + (*dvert_arr)[i] = CustomData_em_get(&em->bm->vdata, eve->head.data, CD_MDEFORMVERT); + i++; } return 1; @@ -314,12 +318,12 @@ int ED_vgroup_copy_array(Object *ob, Object *ob_from) for(i=0; i<dvert_tot; i++, dvf++, dv++) { if((*dv)->dw) - MEM_freeN((*dv)->dw); + BLI_cellalloc_free((*dv)->dw); *(*dv)= *(*dvf); if((*dv)->dw) - (*dv)->dw= MEM_dupallocN((*dv)->dw); + (*dv)->dw= BLI_cellalloc_dupalloc((*dv)->dw); } MEM_freeN(dvert_array); @@ -373,13 +377,13 @@ static void ED_vgroup_nr_vert_remove(Object *ob, int def_nr, int vertnum) * deform weight, and reshuffle the others */ if(dvert->totweight) { - newdw = MEM_mallocN(sizeof(MDeformWeight)*(dvert->totweight), + newdw = BLI_cellalloc_malloc(sizeof(MDeformWeight)*(dvert->totweight), "deformWeight"); if(dvert->dw){ memcpy(newdw, dvert->dw, sizeof(MDeformWeight)*i); memcpy(newdw+i, dvert->dw+i+1, sizeof(MDeformWeight)*(dvert->totweight-i)); - MEM_freeN(dvert->dw); + BLI_cellalloc_free(dvert->dw); } dvert->dw=newdw; } @@ -387,7 +391,7 @@ static void ED_vgroup_nr_vert_remove(Object *ob, int def_nr, int vertnum) * left then just remove the deform weight */ else { - MEM_freeN(dvert->dw); + BLI_cellalloc_free(dvert->dw); dvert->dw = NULL; break; } @@ -469,11 +473,11 @@ static void ED_vgroup_nr_vert_add(Object *ob, int def_nr, int vertnum, float wei /* if we are doing an additive assignment, then * we need to create the deform weight */ - newdw = MEM_callocN(sizeof(MDeformWeight)*(dv->totweight+1), + newdw = BLI_cellalloc_calloc(sizeof(MDeformWeight)*(dv->totweight+1), "deformWeight"); if(dv->dw){ memcpy(newdw, dv->dw, sizeof(MDeformWeight)*dv->totweight); - MEM_freeN(dv->dw); + BLI_cellalloc_free(dv->dw); } dv->dw=newdw; @@ -528,7 +532,7 @@ void ED_vgroup_vert_remove(Object *ob, bDeformGroup *dg, int vertnum) static float get_vert_def_nr(Object *ob, int def_nr, int vertnum) { MDeformVert *dvert= NULL; - EditVert *eve; + BMVert *eve; Mesh *me; int i; @@ -536,12 +540,12 @@ static float get_vert_def_nr(Object *ob, int def_nr, int vertnum) if(ob->type==OB_MESH) { me= ob->data; - if(me->edit_mesh) { - eve= BLI_findlink(&me->edit_mesh->verts, vertnum); + if(me->edit_btmesh) { + eve= BMIter_AtIndex(me->edit_btmesh->bm, BM_VERTS_OF_MESH, NULL, vertnum); if(!eve) { return 0.0f; } - dvert= CustomData_em_get(&me->edit_mesh->vdata, eve->data, CD_MDEFORMVERT); + dvert= CustomData_bmesh_get(&me->edit_btmesh->bm->vdata, eve->head.data, CD_MDEFORMVERT); vertnum= 0; } else { @@ -596,34 +600,32 @@ void ED_vgroup_select_by_name(Object *ob, const char *name) /* only in editmode */ static void vgroup_select_verts(Object *ob, int select) { - EditVert *eve; + BMVert *eve; MDeformVert *dvert; int i; if(ob->type == OB_MESH) { Mesh *me= ob->data; - EditMesh *em = BKE_mesh_get_editmesh(me); + BMEditMesh *em = me->edit_btmesh; + BMIter iter; - for(eve=em->verts.first; eve; eve=eve->next){ - dvert= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT); + BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) { + dvert= CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_MDEFORMVERT); if(dvert && dvert->totweight){ for(i=0; i<dvert->totweight; i++){ if(dvert->dw[i].def_nr == (ob->actdef-1)){ - if(!eve->h) { - if(select) eve->f |= SELECT; - else eve->f &= ~SELECT; + if (!BM_TestHFlag(eve, BM_HIDDEN)) { + BM_Select(em->bm, eve, select); + break; } - break; } } } } /* this has to be called, because this function operates on vertices only */ - if(select) EM_select_flush(em); // vertices to edges/faces - else EM_deselect_flush(em); - - BKE_mesh_end_editmesh(me, em); + if(select) EDBM_selectmode_flush(em); // vertices to edges/faces + else EDBM_deselect_flush(em); } else if(ob->type == OB_LATTICE) { Lattice *lt= vgroup_edit_lattice(ob); @@ -1361,12 +1363,12 @@ static void vgroup_invert(Object *ob, int auto_assign, int auto_remove) static void vgroup_blend(Object *ob) { + BMEditMesh *em= ((Mesh *)ob->data)->edit_btmesh; bDeformGroup *dg; MDeformWeight *dw; MDeformVert *dvert_array=NULL, *dvert; int i, def_nr, dvert_tot=0; - EditMesh *em= BKE_mesh_get_editmesh(((Mesh *)ob->data)); // ED_vgroup_give_array(ob->data, &dvert_array, &dvert_tot); if(em==NULL) @@ -1375,46 +1377,47 @@ static void vgroup_blend(Object *ob) dg = BLI_findlink(&ob->defbase, (ob->actdef-1)); if(dg) { - int sel1, sel2; - int i1, i2; - - EditEdge *eed; - EditVert *eve; + BMEdge *eed; + BMVert *eve; + BMIter iter; float *vg_weights; float *vg_users; + int sel1, sel2; + int i1, i2; def_nr= ob->actdef-1; i= 0; - for(eve= em->verts.first; eve; eve= eve->next) - eve->tmp.l= i++; - + BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) { + BM_SetIndex(eve, i); + i++; + } dvert_tot= i; vg_weights= MEM_callocN(sizeof(float)*dvert_tot, "vgroup_blend_f"); vg_users= MEM_callocN(sizeof(int)*dvert_tot, "vgroup_blend_i"); - for(eed= em->edges.first; eed; eed= eed->next) { - sel1= eed->v1->f & SELECT; - sel2= eed->v2->f & SELECT; + BM_ITER(eed, &iter, em->bm, BM_EDGES_OF_MESH, NULL) { + sel1= BM_TestHFlag(eed->v1, BM_SELECT); + sel2= BM_TestHFlag(eed->v2, BM_SELECT); if(sel1 != sel2) { /* i1 is always the selected one */ if(sel1==TRUE && sel2==FALSE) { - i1= eed->v1->tmp.l; - i2= eed->v2->tmp.l; + i1= BM_GetIndex(eed->v1); + i2= BM_GetIndex(eed->v2); eve= eed->v2; } else { - i2= eed->v1->tmp.l; - i1= eed->v2->tmp.l; + i2= BM_GetIndex(eed->v1); + i1= BM_GetIndex(eed->v2); eve= eed->v1; } vg_users[i1]++; /* TODO, we may want object mode blending */ - if(em) dvert= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT); + if(em) dvert= CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_MDEFORMVERT); else dvert= dvert_array+i2; dw= defvert_find_index(dvert, def_nr); @@ -1426,10 +1429,10 @@ static void vgroup_blend(Object *ob) } i= 0; - for(eve= em->verts.first; eve; eve= eve->next) { - if(eve->f & SELECT && vg_users[i] > 0) { + BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) { + if(BM_TestHFlag(eve, BM_SELECT) && vg_users[i] > 0) { /* TODO, we may want object mode blending */ - if(em) dvert= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT); + if(em) dvert= CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_MDEFORMVERT); else dvert= dvert_array+i; dw= defvert_verify_index(dvert, def_nr); @@ -1557,7 +1560,10 @@ void ED_vgroup_mirror(Object *ob, const short mirror_weights, const short flip_v { #define VGROUP_MIRR_OP dvert_mirror_op(dvert, dvert_mirr, sel, sel_mirr, flip_map, mirror_weights, flip_vgroups) +#if 0 EditVert *eve, *eve_mirr; +#endif + MDeformVert *dvert, *dvert_mirr; short sel, sel_mirr; int *flip_map; @@ -1569,6 +1575,11 @@ void ED_vgroup_mirror(Object *ob, const short mirror_weights, const short flip_v /* only the active group */ if(ob->type == OB_MESH) { +#if 1 //BMESH_TODO + (void)dvert; + (void)dvert_mirr; + (void)flip_map; +#else Mesh *me= ob->data; EditMesh *em = BKE_mesh_get_editmesh(me); @@ -1599,6 +1610,7 @@ void ED_vgroup_mirror(Object *ob, const short mirror_weights, const short flip_v } BKE_mesh_end_editmesh(me, em); +#endif // BMESH_TODO } else if (ob->type == OB_LATTICE) { Lattice *lt= ob->data; @@ -1747,7 +1759,7 @@ static void vgroup_delete_object_mode(Object *ob, bDeformGroup *dg) /* removes from active defgroup, if allverts==0 only selected vertices */ static void vgroup_active_remove_verts(Object *ob, const int allverts, bDeformGroup *dg) { - EditVert *eve; + BMVert *eve; MDeformVert *dvert; MDeformWeight *newdw; bDeformGroup *eg; @@ -1755,29 +1767,30 @@ static void vgroup_active_remove_verts(Object *ob, const int allverts, bDeformGr if(ob->type == OB_MESH) { Mesh *me= ob->data; - EditMesh *em = BKE_mesh_get_editmesh(me); + BMEditMesh *em = me->edit_btmesh; + BMIter iter; - for(eve=em->verts.first; eve; eve=eve->next){ - dvert= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT); + BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) { + dvert= CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_MDEFORMVERT); - if(dvert && dvert->dw && ((eve->f & SELECT) || allverts)){ + if(dvert && dvert->dw && (BM_TestHFlag(eve, BM_SELECT) || allverts)){ for(i=0; i<dvert->totweight; i++){ /* Find group */ eg = BLI_findlink(&ob->defbase, dvert->dw[i].def_nr); if(eg == dg){ dvert->totweight--; - if(dvert->totweight){ - newdw = MEM_mallocN(sizeof(MDeformWeight)*(dvert->totweight), "deformWeight"); + if (dvert->totweight){ + newdw = BLI_cellalloc_malloc (sizeof(MDeformWeight)*(dvert->totweight), "deformWeight"); if(dvert->dw){ memcpy(newdw, dvert->dw, sizeof(MDeformWeight)*i); memcpy(newdw+i, dvert->dw+i+1, sizeof(MDeformWeight)*(dvert->totweight-i)); - MEM_freeN(dvert->dw); + BLI_cellalloc_free(dvert->dw); } dvert->dw=newdw; } else{ - MEM_freeN(dvert->dw); + BLI_cellalloc_free (dvert->dw); dvert->dw=NULL; break; } @@ -1785,7 +1798,6 @@ static void vgroup_active_remove_verts(Object *ob, const int allverts, bDeformGr } } } - BKE_mesh_end_editmesh(me, em); } else if(ob->type == OB_LATTICE) { Lattice *lt= vgroup_edit_lattice(ob); @@ -1815,19 +1827,19 @@ static void vgroup_delete_edit_mode(Object *ob, bDeformGroup *dg) /* Make sure that any verts with higher indices are adjusted accordingly */ if(ob->type==OB_MESH) { Mesh *me= ob->data; - EditMesh *em = BKE_mesh_get_editmesh(me); - EditVert *eve; + BMEditMesh *em = me->edit_btmesh; + BMIter iter; + BMVert *eve; MDeformVert *dvert; - for(eve=em->verts.first; eve; eve=eve->next){ - dvert= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT); + BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) { + dvert= CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_MDEFORMVERT); if(dvert) for(i=0; i<dvert->totweight; i++) if(dvert->dw[i].def_nr > dg_index) dvert->dw[i].def_nr--; } - BKE_mesh_end_editmesh(me, em); } else if(ob->type==OB_LATTICE) { Lattice *lt= vgroup_edit_lattice(ob); @@ -1867,7 +1879,7 @@ static void vgroup_delete_edit_mode(Object *ob, bDeformGroup *dg) else if(ob->type==OB_LATTICE) { Lattice *lt= vgroup_edit_lattice(ob); if(lt->dvert) { - MEM_freeN(lt->dvert); + BLI_cellalloc_free(lt->dvert); lt->dvert= NULL; } } @@ -1877,7 +1889,7 @@ static void vgroup_delete_edit_mode(Object *ob, bDeformGroup *dg) static int vgroup_object_in_edit_mode(Object *ob) { if(ob->type == OB_MESH) - return (((Mesh*)ob->data)->edit_mesh != NULL); + return (((Mesh*)ob->data)->edit_btmesh != NULL); else if(ob->type == OB_LATTICE) return (((Lattice*)ob->data)->editlatt != NULL); @@ -1907,7 +1919,7 @@ static void vgroup_delete_all(Object *ob) else if(ob->type==OB_LATTICE) { Lattice *lt= vgroup_edit_lattice(ob); if(lt->dvert) { - MEM_freeN(lt->dvert); + BLI_cellalloc_free(lt->dvert); lt->dvert= NULL; } } @@ -1922,7 +1934,7 @@ static void vgroup_delete_all(Object *ob) /* only in editmode */ static void vgroup_assign_verts(Object *ob, float weight) { - EditVert *eve; + BMVert *eve; bDeformGroup *dg, *eg; MDeformWeight *newdw; MDeformVert *dvert; @@ -1934,16 +1946,17 @@ static void vgroup_assign_verts(Object *ob, float weight) if(ob->type == OB_MESH) { Mesh *me= ob->data; - EditMesh *em = BKE_mesh_get_editmesh(me); + BMEditMesh *em = me->edit_btmesh; + BMIter iter; - if(!CustomData_has_layer(&em->vdata, CD_MDEFORMVERT)) - EM_add_data_layer(em, &em->vdata, CD_MDEFORMVERT, NULL); + if(!CustomData_has_layer(&em->bm->vdata, CD_MDEFORMVERT)) + BM_add_data_layer(em->bm, &em->bm->vdata, CD_MDEFORMVERT); /* Go through the list of editverts and assign them */ - for(eve=em->verts.first; eve; eve=eve->next){ - dvert= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT); + BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) { + dvert= CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_MDEFORMVERT); - if(dvert && (eve->f & SELECT)){ + if(dvert && BM_TestHFlag(eve, BM_SELECT)) { /* See if this vert already has a reference to this group */ /* If so: Change its weight */ done=0; @@ -1958,10 +1971,10 @@ static void vgroup_assign_verts(Object *ob, float weight) } /* If not: Add the group and set its weight */ if(!done){ - newdw = MEM_callocN(sizeof(MDeformWeight)*(dvert->totweight+1), "deformWeight"); + newdw = BLI_cellalloc_calloc(sizeof(MDeformWeight)*(dvert->totweight+1), "deformWeight"); if(dvert->dw){ memcpy(newdw, dvert->dw, sizeof(MDeformWeight)*dvert->totweight); - MEM_freeN(dvert->dw); + BLI_cellalloc_free(dvert->dw); } dvert->dw=newdw; @@ -1973,7 +1986,6 @@ static void vgroup_assign_verts(Object *ob, float weight) } } } - BKE_mesh_end_editmesh(me, em); } else if(ob->type == OB_LATTICE) { Lattice *lt= vgroup_edit_lattice(ob); @@ -2709,11 +2721,12 @@ static int vgroup_do_remap(Object *ob, char *name_array, wmOperator *op) if(ob->mode == OB_MODE_EDIT) { if(ob->type==OB_MESH) { - EditMesh *em = BKE_mesh_get_editmesh(ob->data); - EditVert *eve; + BMEditMesh *em = ((Mesh*)ob->data)->edit_btmesh; + BMIter iter; + BMVert *eve; - for(eve=em->verts.first; eve; eve=eve->next){ - dvert= CustomData_em_get(&em->vdata, eve->data, CD_MDEFORMVERT); + BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) { + dvert= CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_MDEFORMVERT); if(dvert && dvert->totweight){ defvert_remap(dvert, sort_map); } |