diff options
Diffstat (limited to 'source/blender/editors/object/object_edit.c')
-rw-r--r-- | source/blender/editors/object/object_edit.c | 257 |
1 files changed, 144 insertions, 113 deletions
diff --git a/source/blender/editors/object/object_edit.c b/source/blender/editors/object/object_edit.c index 6a570344400..4ef8cd43865 100644 --- a/source/blender/editors/object/object_edit.c +++ b/source/blender/editors/object/object_edit.c @@ -112,6 +112,7 @@ #include "BKE_modifier.h" #include "ED_anim_api.h" +#include "ED_mesh.h" #include "ED_screen.h" #include "ED_types.h" #include "ED_util.h" @@ -194,7 +195,7 @@ void ED_base_object_activate(bContext *C, Base *base) DAG_object_flush_update(scene, tbase->object, OB_RECALC_DATA); } } - WM_event_add_notifier(C, NC_SCENE|ND_OB_ACTIVE, base->object); + WM_event_add_notifier(C, NC_SCENE|ND_OB_ACTIVE, scene); } else WM_event_add_notifier(C, NC_SCENE|ND_OB_ACTIVE, NULL); @@ -366,9 +367,8 @@ void delete_obj(Scene *scene, View3D *v3d, int ok) BIF_undo_push("Delete object(s)"); } -static int return_editmesh_indexar(int *tot, int **indexar, float *cent) +static int return_editmesh_indexar(EditMesh *em, int *tot, int **indexar, float *cent) { - EditMesh *em = G.editMesh; EditVert *eve; int *index, nr, totvert=0; @@ -395,9 +395,8 @@ static int return_editmesh_indexar(int *tot, int **indexar, float *cent) return totvert; } -static int return_editmesh_vgroup(char *name, float *cent) +static int return_editmesh_vgroup(EditMesh *em, char *name, float *cent) { - EditMesh *em = G.editMesh; MDeformVert *dvert; EditVert *eve; int i, totvert=0; @@ -430,9 +429,10 @@ static int return_editmesh_vgroup(char *name, float *cent) return 0; } -static void select_editmesh_hook(HookModifierData *hmd) +static void select_editmesh_hook(Object *ob, HookModifierData *hmd) { - EditMesh *em = G.editMesh; + Mesh *me= ob->data; + EditMesh *em= me->edit_mesh; EditVert *eve; int index=0, nr=0; @@ -612,9 +612,12 @@ int hook_getIndexArray(int *tot, int **indexar, char *name, float *cent_r) switch(G.obedit->type) { case OB_MESH: + { + Mesh *me= G.obedit->data; /* check selected vertices first */ - if( return_editmesh_indexar(tot, indexar, cent_r)) return 1; - else return return_editmesh_vgroup(name, cent_r); + if( return_editmesh_indexar(me->edit_mesh, tot, indexar, cent_r)) return 1; + else return return_editmesh_vgroup(me->edit_mesh, name, cent_r); + } case OB_CURVE: case OB_SURF: return return_editcurve_indexar(tot, indexar, cent_r); @@ -672,12 +675,13 @@ static void select_editcurve_hook(HookModifierData *hmd) } } -void hook_select(HookModifierData *hmd) +void obedit_hook_select(Object *ob, HookModifierData *hmd) { - if(G.obedit->type==OB_MESH) select_editmesh_hook(hmd); - else if(G.obedit->type==OB_LATTICE) select_editlattice_hook(hmd); - else if(G.obedit->type==OB_CURVE) select_editcurve_hook(hmd); - else if(G.obedit->type==OB_SURF) select_editcurve_hook(hmd); + + if(ob->type==OB_MESH) select_editmesh_hook(ob, hmd); + else if(ob->type==OB_LATTICE) select_editlattice_hook(hmd); + else if(ob->type==OB_CURVE) select_editcurve_hook(hmd); + else if(ob->type==OB_SURF) select_editcurve_hook(hmd); } @@ -819,7 +823,7 @@ void add_hook(Scene *scene, View3D *v3d, int mode) modifier_free(md); } else if(mode==5) { /* select */ - hook_select(hmd); + obedit_hook_select(G.obedit, hmd); } else if(mode==6) { /* clear offset */ where_is_object(ob); /* ob is hook->parent */ @@ -1435,9 +1439,9 @@ void set_slowparent(Scene *scene, View3D *v3d) // XXX #define BEZSELECTED_HIDDENHANDLES(bezt) ((G.f & G_HIDDENHANDLES) ? (bezt)->f2 & SELECT : BEZSELECTED(bezt)) +/* only in edit mode */ void make_vertex_parent(Scene *scene, View3D *v3d) { - EditMesh *em = G.editMesh; EditVert *eve; Base *base; Nurb *nu; @@ -1449,7 +1453,9 @@ void make_vertex_parent(Scene *scene, View3D *v3d) /* we need 1 to 3 selected vertices */ if(G.obedit->type==OB_MESH) { - eve= em->verts.first; + Mesh *me= G.obedit->data; + + eve= me->edit_mesh->verts.first; while(eve) { if(eve->f & 1) { if(v1==0) v1= nr; @@ -1984,48 +1990,119 @@ void OBJECT_OT_make_track(wmOperatorType *ot) } -/* ******************* ***************** */ +/* ******************* toggle editmode operator ***************** */ -void enter_editmode(Scene *scene, View3D *v3d, int wc) +static void exit_editmode(bContext *C, wmOperator *op, int flag) /* freedata==0 at render, 1= freedata, 2= do undo buffer too */ { - Base *base; + Scene *scene= CTX_data_scene(C); Object *ob; - Mesh *me; - bArmature *arm; +// Object *obedit= CTX_data_edit_object(C); + int freedata = flag; // XXX & EM_FREEDATA; + + if(G.obedit==NULL) return; + +// if(flag & EM_WAITCURSOR) waitcursor(1); + if(G.obedit->type==OB_MESH) { + Mesh *me= G.obedit->data; + +// if(EM_texFaceCheck()) +// allqueue(REDRAWIMAGE, 0); + +// if(retopo_mesh_paint_check()) +// retopo_end_okee(); + + if(G.totvert>MESH_MAX_VERTS) { + error("Too many vertices"); + return; + } + load_editMesh(scene, G.obedit); + + if(freedata) free_editMesh(me->edit_mesh); + + if(G.f & G_WEIGHTPAINT) + mesh_octree_table(G.obedit, NULL, NULL, 'e'); + } + else if (G.obedit->type==OB_ARMATURE){ +// load_editArmature(); +// if (freedata) free_editArmature(); + } + else if(ELEM(G.obedit->type, OB_CURVE, OB_SURF)) { +// extern ListBase editNurb; +// load_editNurb(); +// if(freedata) freeNurblist(&editNurb); + } + else if(G.obedit->type==OB_FONT && freedata) { +// load_editText(); + } + else if(G.obedit->type==OB_LATTICE) { +// load_editLatt(); +// if(freedata) free_editLatt(); + } + else if(G.obedit->type==OB_MBALL) { +// extern ListBase editelems; +// load_editMball(); +// if(freedata) BLI_freelistN(&editelems); + } + + ob= G.obedit; + + /* for example; displist make is different in editmode */ + if(freedata) G.obedit= NULL; + scene->obedit= G.obedit; // XXX + + if(ob->type==OB_MESH && get_mesh(ob)->mr) + multires_edge_level_update(ob, get_mesh(ob)); + + /* also flush ob recalc, doesn't take much overhead, but used for particles */ + DAG_object_flush_update(scene, ob, OB_RECALC_OB|OB_RECALC_DATA); + + if(G.obedit==NULL) // XXX && (flag & EM_FREEUNDO)) + ED_undo_push(C, "Editmode"); + + // if(flag & EM_WAITCURSOR) waitcursor(0); + + WM_event_add_notifier(C, NC_SCENE|ND_OB_EDIT, scene); + +} + + +static void enter_editmode(bContext *C, wmOperator *op) +{ + Scene *scene= CTX_data_scene(C); + Base *base= CTX_data_active_base(C); + Object *ob= base->object; + View3D *v3d= (View3D *)CTX_wm_space_data(C); int ok= 0; if(scene->id.lib) return; - base= BASACT; - if(base==0) return; + if(base==NULL) return; if((v3d==NULL || (base->lay & v3d->lay))==0) return; - strcpy(G.editModeTitleExtra, ""); - - ob= base->object; - if(ob->data==0) return; + if(ob->data==NULL) return; if (object_data_is_libdata(ob)) { error_libdata(); return; } - if(wc) waitcursor(1); + //if(wc) waitcursor(1); if(ob->type==OB_MESH) { - me= get_mesh(ob); - if( me==0 ) return; + Mesh *me= ob->data; + if(me->pv) mesh_pmv_off(ob, me); ok= 1; - G.obedit= ob; -// XXX make_editMesh(); - allqueue(REDRAWBUTSLOGIC, 0); - /*if(G.f & G_FACESELECT) allqueue(REDRAWIMAGE, 0);*/ -// XXX if (EM_texFaceCheck()) -// allqueue(REDRAWIMAGE, 0); + G.obedit= ob; // XXX + scene->obedit= ob; // context sees this + + make_editMesh(scene, ob); + + // XXX if (EM_texFaceCheck()) + // allqueue(REDRAWIMAGE, 0); } if (ob->type==OB_ARMATURE){ - arm= base->object->data; + bArmature *arm= base->object->data; if (!arm) return; /* * The function object_data_is_libdata make a problem here, the @@ -2078,86 +2155,39 @@ void enter_editmode(Scene *scene, View3D *v3d, int wc) } else G.obedit= NULL; - if(wc) waitcursor(0); +// if(wc) waitcursor(0); + WM_event_add_notifier(C, NC_SCENE|ND_OB_EDIT, scene); } -void exit_editmode(Scene *scene, int flag) /* freedata==0 at render, 1= freedata, 2= do undo buffer too */ +static int toggle_editmode_exec(bContext *C, wmOperator *op) { -#if 0 - Object *ob; - int freedata = flag; // XXX & EM_FREEDATA; - if(G.obedit==NULL) return; - - if(flag & EM_WAITCURSOR) waitcursor(1); - if(G.obedit->type==OB_MESH) { - - - if(EM_texFaceCheck()) - allqueue(REDRAWIMAGE, 0); - - if(retopo_mesh_paint_check()) - retopo_end_okee(); - - if(G.totvert>MESH_MAX_VERTS) { - error("Too many vertices"); - return; - } - load_editMesh(); - - if(freedata) free_editMesh(G.editMesh); - - if(G.f & G_WEIGHTPAINT) - mesh_octree_table(G.obedit, NULL, 'e'); - } - else if (G.obedit->type==OB_ARMATURE){ - load_editArmature(); - if (freedata) free_editArmature(); - } - else if(ELEM(G.obedit->type, OB_CURVE, OB_SURF)) { - extern ListBase editNurb; - load_editNurb(); - if(freedata) freeNurblist(&editNurb); - } - else if(G.obedit->type==OB_FONT && freedata) { - load_editText(); - } - else if(G.obedit->type==OB_LATTICE) { - load_editLatt(); - if(freedata) free_editLatt(); - } - else if(G.obedit->type==OB_MBALL) { - extern ListBase editelems; - load_editMball(); - if(freedata) BLI_freelistN(&editelems); - } - - ob= G.obedit; + if(!CTX_data_edit_object(C)) + enter_editmode(C, op); + else + exit_editmode(C, op, 1); - /* for example; displist make is different in editmode */ - if(freedata) G.obedit= NULL; + return OPERATOR_FINISHED; +} - if(ob->type==OB_MESH && get_mesh(ob)->mr) - multires_edge_level_update(ob, get_mesh(ob)); +void OBJECT_OT_toggle_editmode(wmOperatorType *ot) +{ - /* also flush ob recalc, doesn't take much overhead, but used for particles */ - DAG_object_flush_update(scene, ob, OB_RECALC_OB|OB_RECALC_DATA); - - allqueue(REDRAWVIEW3D, 1); - allqueue(REDRAWBUTSALL, 0); - allqueue(REDRAWACTION, 0); - allqueue(REDRAWNLA, 0); - allqueue(REDRAWIPO, 0); - allqueue(REDRAWOOPS, 0); - - if(G.obedit==NULL && (flag & EM_FREEUNDO)) - BIF_undo_push("Editmode"); + /* identifiers */ + ot->name= "Toggle Editmode"; + ot->idname= "OBJECT_OT_toggle_editmode"; - if(flag & EM_WAITCURSOR) waitcursor(0); -#endif + /* api callbacks */ + ot->exec= toggle_editmode_exec; + + ot->poll= ED_operator_areaactive; // XXX solve + ot->flag= OPTYPE_REGISTER; } +/* *************************** */ + + void check_editmode(int type) { @@ -2170,7 +2200,6 @@ void check_editmode(int type) void docenter(Scene *scene, View3D *v3d, int centermode) { - EditMesh *em = G.editMesh; Base *base; Object *ob; Mesh *me, *tme; @@ -2195,7 +2224,9 @@ void docenter(Scene *scene, View3D *v3d, int centermode) INIT_MINMAX(min, max); if(G.obedit->type==OB_MESH) { - for(eve= em->verts.first; eve; eve= eve->next) { + Mesh *me= G.obedit->data; + + for(eve= me->edit_mesh->verts.first; eve; eve= eve->next) { if(v3d->around==V3D_CENTROID) { total++; VECADD(cent, cent, eve->co); @@ -2214,7 +2245,7 @@ void docenter(Scene *scene, View3D *v3d, int centermode) cent[2]= (min[2]+max[2])/2.0f; } - for(eve= em->verts.first; eve; eve= eve->next) { + for(eve= me->edit_mesh->verts.first; eve; eve= eve->next) { VecSubf(eve->co, eve->co, cent); } @@ -3313,7 +3344,7 @@ void convertmenu(Scene *scene, View3D *v3d) /* texspace and normals */ if(!basen) BASACT= base; - enter_editmode(scene, v3d, EM_WAITCURSOR); +// XXX enter_editmode(scene, v3d, EM_WAITCURSOR); // XXX exit_editmode(EM_FREEDATA|EM_WAITCURSOR); /* freedata, but no undo */ BASACT= basact; @@ -4311,7 +4342,7 @@ static void apply_objects_internal(Scene *scene, View3D *v3d, int apply_scale, i /* texspace and normals */ BASACT= base; - enter_editmode(scene, v3d, EM_WAITCURSOR); +// XXX enter_editmode(scene, v3d, EM_WAITCURSOR); BIF_undo_push("Applied object"); /* editmode undo itself */ // XXX exit_editmode(EM_FREEDATA|EM_WAITCURSOR); /* freedata, but no undo */ BASACT= basact; @@ -4387,7 +4418,7 @@ static void apply_objects_internal(Scene *scene, View3D *v3d, int apply_scale, i /* texspace and normals */ BASACT= base; - enter_editmode(scene, v3d, EM_WAITCURSOR); +// XXX enter_editmode(scene, v3d, EM_WAITCURSOR); BIF_undo_push("Applied object"); /* editmode undo itself */ // XXX exit_editmode(EM_FREEDATA|EM_WAITCURSOR); /* freedata, but no undo */ BASACT= basact; |