diff options
19 files changed, 261 insertions, 197 deletions
diff --git a/source/blender/blenkernel/BKE_global.h b/source/blender/blenkernel/BKE_global.h index 0d5208ed90d..ac161caeb2e 100644 --- a/source/blender/blenkernel/BKE_global.h +++ b/source/blender/blenkernel/BKE_global.h @@ -117,37 +117,24 @@ typedef struct Global { #define G_RENDER_SHADOW (1 << 3) #define G_BACKBUFSEL (1 << 4) #define G_PICKSEL (1 << 5) -#define G_DRAWNORMALS (1 << 6) -#define G_DRAWFACES (1 << 7) + #define G_FACESELECT (1 << 8) -#define G_DRAW_EXT (1 << 9) + #define G_VERTEXPAINT (1 << 10) -#define G_ALLEDGES (1 << 11) + #define G_DEBUG (1 << 12) #define G_DOSCRIPTLINKS (1 << 13) -#define G_DRAW_VNORMALS (1 << 14) + #define G_WEIGHTPAINT (1 << 15) #define G_TEXTUREPAINT (1 << 16) /* #define G_NOFROZEN (1 << 17) also removed */ #define G_GREASEPENCIL (1 << 17) -#define G_DRAWEDGES (1 << 18) -#define G_DRAWCREASES (1 << 19) -#define G_DRAWSEAMS (1 << 20) -#define G_HIDDENEDGES (1 << 21) -/* Measurement info Drawing */ -#define G_DRAW_EDGELEN (1 << 22) -#define G_DRAW_FACEAREA (1 << 23) -#define G_DRAW_EDGEANG (1 << 24) - -/* #define G_RECORDKEYS (1 << 25) also removed */ - -#define G_DRAWSHARP (1 << 28) /* draw edges with the sharp flag */ + #define G_SCULPTMODE (1 << 29) #define G_PARTICLEEDIT (1 << 30) /* #define G_AUTOMATKEYS (1 << 30) also removed */ #define G_HIDDENHANDLES (1 << 31) /* used for curves only */ -#define G_DRAWBWEIGHTS (1 << 31) /* macro for testing face select mode * Texture paint could be removed since selected faces are not used diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index b8d485065b1..dd63d798089 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -185,7 +185,8 @@ Mesh *add_mesh(char *name) me->texflag= AUTOSPACE; me->flag= ME_TWOSIDED; me->bb= unit_boundbox(); - + me->drawflag= ME_DRAWEDGES|ME_DRAWFACES|ME_DRAWCREASES; + return me; } diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index bd266b08e87..f53b6dad173 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -8682,6 +8682,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main) bScreen *screen; Scene *scene; Material *ma; + Mesh *me; Scene *sce; Tex *tx; @@ -8718,6 +8719,11 @@ static void do_versions(FileData *fd, Library *lib, Main *main) if(tx->nodetree && strlen(tx->nodetree->id.name)==0) strcpy(tx->nodetree->id.name, "NTTexture Nodetree"); } + + /* copy standard draw flag to meshes(used to be global, is not available here) */ + for(me= main->mesh.first; me; me= me->id.next) { + me->drawflag= ME_DRAWEDGES|ME_DRAWFACES|ME_DRAWCREASES; + } } /* TODO: should be moved into one of the version blocks once this branch moves to trunk and we can diff --git a/source/blender/editors/mesh/editface.c b/source/blender/editors/mesh/editface.c index 4ca302ab06c..b62877bd76e 100644 --- a/source/blender/editors/mesh/editface.c +++ b/source/blender/editors/mesh/editface.c @@ -826,6 +826,8 @@ int minmax_tface(Scene *scene, float *min, float *max) return ok; } +/* ******************** edge loop shortest path ********************* */ + #define ME_SEAM_DONE 2 /* reuse this flag */ static float edgetag_cut_cost(EditMesh *em, int e1, int e2, int vert) @@ -871,7 +873,11 @@ static void edgetag_add_adjacent(EditMesh *em, Heap *heap, int mednum, int vertn void edgetag_context_set(Scene *scene, EditEdge *eed, int val) { + switch (scene->toolsettings->edge_mode) { + case EDGE_MODE_SELECT: + EM_select_edge(eed, val); + break; case EDGE_MODE_TAG_SEAM: if (val) {eed->seam = 255;} else {eed->seam = 0;} @@ -894,6 +900,8 @@ void edgetag_context_set(Scene *scene, EditEdge *eed, int val) int edgetag_context_check(Scene *scene, EditEdge *eed) { switch (scene->toolsettings->edge_mode) { + case EDGE_MODE_SELECT: + return (eed->f & SELECT) ? 1 : 0; case EDGE_MODE_TAG_SEAM: return eed->seam ? 1 : 0; case EDGE_MODE_TAG_SHARP: @@ -1029,6 +1037,8 @@ int edgetag_shortest_path(Scene *scene, EditMesh *em, EditEdge *source, EditEdge return 1; } +/* *************************************** */ + static void seam_edgehash_insert_face(EdgeHash *ehash, MFace *mf) { BLI_edgehash_insert(ehash, mf->v1, mf->v2, NULL); @@ -1094,7 +1104,7 @@ void seam_mark_clear_tface(Scene *scene, short mode) // XXX if (G.rt == 8) // unwrap_lscm(1); - G.f |= G_DRAWSEAMS; + me->drawflag |= ME_DRAWSEAMS; BIF_undo_push("Mark Seam"); // XXX notifier! object_tface_flags_changed(OBACT, 1); diff --git a/source/blender/editors/mesh/editmesh.c b/source/blender/editors/mesh/editmesh.c index 58041120a42..77371fdbd20 100644 --- a/source/blender/editors/mesh/editmesh.c +++ b/source/blender/editors/mesh/editmesh.c @@ -643,7 +643,7 @@ static int edgeDrawFlagInfo_cmp(const void *av, const void *bv) } #endif -static void edge_drawflags(EditMesh *em) +static void edge_drawflags(Mesh *me, EditMesh *em) { EditVert *eve; EditEdge *eed, *e1, *e2, *e3, *e4; @@ -692,7 +692,7 @@ static void edge_drawflags(EditMesh *em) efa= efa->next; } - if(G.f & G_ALLEDGES) { + if(me->drawflag & ME_ALLEDGES) { efa= em->faces.first; while(efa) { if(efa->e1->f2>=2) efa->e1->f2= 1; @@ -1042,7 +1042,7 @@ void load_editMesh(Scene *scene, Object *ob) /* eed->f1 : flag for dynaface (cylindertest, old engine) */ /* eve->f1 : flag for dynaface (sphere test, old engine) */ /* eve->f2 : being used in vertexnormals */ - edge_drawflags(em); + edge_drawflags(me, em); EM_stats_update(em); @@ -1146,9 +1146,9 @@ void load_editMesh(Scene *scene, Object *ob) eve->tmp.l = a++; /* counter */ mvert->flag= 0; - if(eve->f1==1) mvert->flag |= ME_SPHERETEST; mvert->flag |= (eve->f & SELECT); if (eve->h) mvert->flag |= ME_HIDE; + mvert->bweight= (char)(255.0*eve->bweight); eve= eve->next; diff --git a/source/blender/editors/mesh/editmesh_lib.c b/source/blender/editors/mesh/editmesh_lib.c index a3b33e71cf4..40e2179ddbe 100644 --- a/source/blender/editors/mesh/editmesh_lib.c +++ b/source/blender/editors/mesh/editmesh_lib.c @@ -187,7 +187,7 @@ static int EM_check_selection(EditMesh *em, void *data) for(ese = em->selected.first; ese; ese = ese->next){ if(ese->data == data) return 1; - } + } return 0; } diff --git a/source/blender/editors/mesh/editmesh_mods.c b/source/blender/editors/mesh/editmesh_mods.c index fda9766b2fc..bcf40c16538 100644 --- a/source/blender/editors/mesh/editmesh_mods.c +++ b/source/blender/editors/mesh/editmesh_mods.c @@ -1924,15 +1924,6 @@ void loop_multiselect(EditMesh *em, int looptype) /* ***************** loop select (non modal) ************** */ -static EnumPropertyItem prop_select_types[] = { - {0, "LOOP_EXCLUSIVE", "Loop Exclusive", ""}, - {1, "LOOP_EXTEND", "Loop Extend", ""}, - {2, "RING_EXCLUSIVE", "Ring Exclusive", ""}, - {3, "RING_EXTEND", "Ring Extend", ""}, - {0, NULL, NULL, NULL} -}; - - static void mouse_mesh_loop(bContext *C, short mval[2], short extend, short ring) { ViewContext vc; @@ -1948,97 +1939,138 @@ static void mouse_mesh_loop(bContext *C, short mval[2], short extend, short ring eed= findnearestedge(&vc, &dist); if(eed) { - /* XXX: should toolsettings do this? */ - if (vc.scene->toolsettings->edge_mode == EDGE_MODE_SELECT) { - if(extend==0) EM_clear_flag_all(em, SELECT); - - if((eed->f & SELECT)==0) select=1; - else if(extend) select=0; + if(extend==0) EM_clear_flag_all(em, SELECT); + + if((eed->f & SELECT)==0) select=1; + else if(extend) select=0; - if(em->selectmode & SCE_SELECT_FACE) { - faceloop_select(em, eed, select); - } - else if(em->selectmode & SCE_SELECT_EDGE) { - if(ring) - edgering_select(em, eed, select); - else - edgeloop_select(em, eed, select); - } - else if(em->selectmode & SCE_SELECT_VERTEX) { - if(ring) - edgering_select(em, eed, select); - else - edgeloop_select(em, eed, select); - } + if(em->selectmode & SCE_SELECT_FACE) { + faceloop_select(em, eed, select); + } + else if(em->selectmode & SCE_SELECT_EDGE) { + if(ring) + edgering_select(em, eed, select); + else + edgeloop_select(em, eed, select); + } + else if(em->selectmode & SCE_SELECT_VERTEX) { + if(ring) + edgering_select(em, eed, select); + else + edgeloop_select(em, eed, select); + } - EM_selectmode_flush(em); + EM_selectmode_flush(em); // if (EM_texFaceCheck()) + + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, vc.obedit); + } +} + +static int mesh_loop_select_invoke(bContext *C, wmOperator *op, wmEvent *event) +{ + ARegion *ar= CTX_wm_region(C); + short mval[2]; + + mval[0]= event->x - ar->winrct.xmin; + mval[1]= event->y - ar->winrct.ymin; + + view3d_operator_needs_opengl(C); + + mouse_mesh_loop(C, mval, RNA_boolean_get(op->ptr, "extend"), + RNA_boolean_get(op->ptr, "ring")); + + /* cannot do tweaks for as long this keymap is after transform map */ + return OPERATOR_FINISHED; +} + +void MESH_OT_loop_select(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Loop Select"; + ot->idname= "MESH_OT_loop_select"; + + /* api callbacks */ + ot->invoke= mesh_loop_select_invoke; + ot->poll= ED_operator_editmesh; + + /* properties */ + RNA_def_boolean(ot->srna, "extend", 0, "Extend Select", ""); + RNA_def_boolean(ot->srna, "ring", 0, "Select Ring", ""); +} + +/* ******************* mesh shortest path select, uses prev-selected edge ****************** */ + +/* since you want to create paths with multiple selects, it doesn't have extend option */ +static void mouse_mesh_shortest_path(bContext *C, short mval[2]) +{ + ViewContext vc; + EditMesh *em; + EditEdge *eed; + int dist= 50; + + em_setup_viewcontext(C, &vc); + vc.mval[0]= mval[0]; + vc.mval[1]= mval[1]; + em= vc.em; + + eed= findnearestedge(&vc, &dist); + if(eed) { + Mesh *me= vc.obedit->data; + int path = 0; + + if (em->selected.last) { + EditSelection *ese = em->selected.last; - } - else { - int act = (edgetag_context_check(vc.scene, eed)==0); - int path = 0; - - if (ring && em->selected.last) { - EditSelection *ese = em->selected.last; - - if(ese && ese->type == EDITEDGE) { - EditEdge *eed_act; - eed_act = (EditEdge*)ese->data; - if (eed_act != eed) { - /* If extend, we need to use the last active edge, (if it exists) */ - if (edgetag_shortest_path(vc.scene, em, eed_act, eed)) { - EM_remove_selection(em, eed_act, EDITEDGE); - EM_select_edge(eed_act, 0); - path = 1; - } + if(ese && ese->type == EDITEDGE) { + EditEdge *eed_act; + eed_act = (EditEdge*)ese->data; + if (eed_act != eed) { + if (edgetag_shortest_path(vc.scene, em, eed_act, eed)) { + EM_remove_selection(em, eed_act, EDITEDGE); + path = 1; } } } - if (path==0) { - edgetag_context_set(vc.scene, eed, act); /* switch the edge option */ - } - - if (act) { - if ((eed->f & SELECT)==0) { - EM_select_edge(eed, 1); - EM_selectmode_flush(em); - } - /* even if this is selected it may not be in the selection list */ - EM_store_selection(em, eed, EDITEDGE); - } else { - if (eed->f & SELECT) { - EM_select_edge(eed, 0); - /* logic is differnt from above here since if this was selected we dont know if its in the selection list or not */ - EM_remove_selection(em, eed, EDITEDGE); - - EM_selectmode_flush(em); - } - } + } + if (path==0) { + int act = (edgetag_context_check(vc.scene, eed)==0); + edgetag_context_set(vc.scene, eed, act); /* switch the edge option */ + } + + EM_selectmode_flush(em); + + /* even if this is selected it may not be in the selection list */ + if(edgetag_context_check(vc.scene, eed)==0) + EM_remove_selection(em, eed, EDITEDGE); + else + EM_store_selection(em, eed, EDITEDGE); + + /* force drawmode for mesh */ + switch (vc.scene->toolsettings->edge_mode) { - switch (vc.scene->toolsettings->edge_mode) { case EDGE_MODE_TAG_SEAM: - G.f |= G_DRAWSEAMS; + me->drawflag |= ME_DRAWSEAMS; break; case EDGE_MODE_TAG_SHARP: - G.f |= G_DRAWSHARP; + me->drawflag |= ME_DRAWSHARP; break; case EDGE_MODE_TAG_CREASE: - G.f |= G_DRAWCREASES; + me->drawflag |= ME_DRAWCREASES; break; case EDGE_MODE_TAG_BEVEL: - G.f |= G_DRAWBWEIGHTS; + me->drawflag |= ME_DRAWBWEIGHTS; break; - } - - DAG_object_flush_update(vc.scene, vc.obedit, OB_RECALC_DATA); } + DAG_object_flush_update(vc.scene, vc.obedit, OB_RECALC_DATA); + WM_event_add_notifier(C, NC_OBJECT|ND_GEOM_SELECT, vc.obedit); } } -static int mesh_loop_select_invoke(bContext *C, wmOperator *op, wmEvent *event) + +static int mesh_shortest_path_select_invoke(bContext *C, wmOperator *op, wmEvent *event) { ARegion *ar= CTX_wm_region(C); short mval[2]; @@ -2047,29 +2079,27 @@ static int mesh_loop_select_invoke(bContext *C, wmOperator *op, wmEvent *event) mval[1]= event->y - ar->winrct.ymin; view3d_operator_needs_opengl(C); + + mouse_mesh_shortest_path(C, mval); - mouse_mesh_loop(C, mval, RNA_boolean_get(op->ptr, "extend"), - RNA_boolean_get(op->ptr, "ring")); - - /* cannot do tweaks for as long this keymap is after transform map */ return OPERATOR_FINISHED; } - -void MESH_OT_loop_select(wmOperatorType *ot) + +void MESH_OT_shortest_path_select(wmOperatorType *ot) { /* identifiers */ - ot->name= "Loop Select"; - ot->idname= "MESH_OT_loop_select"; + ot->name= "Shortest Path Select"; + ot->idname= "MESH_OT_shortest_path_select"; /* api callbacks */ - ot->invoke= mesh_loop_select_invoke; + ot->invoke= mesh_shortest_path_select_invoke; ot->poll= ED_operator_editmesh; /* properties */ RNA_def_boolean(ot->srna, "extend", 0, "Extend Select", ""); - RNA_def_boolean(ot->srna, "ring", 0, "Select Ring", ""); } + /* ************************************************** */ @@ -3603,13 +3633,12 @@ void EM_selectmode_menu(EditMesh *em) void editmesh_mark_seam(EditMesh *em, int clear) { + Mesh *me= NULL; // XXX EditEdge *eed; /* auto-enable seams drawing */ if(clear==0) { - if(!(G.f & G_DRAWSEAMS)) { - G.f |= G_DRAWSEAMS; - } + me->drawflag |= ME_DRAWSEAMS; } if(clear) { @@ -3637,16 +3666,13 @@ void editmesh_mark_seam(EditMesh *em, int clear) void editmesh_mark_sharp(EditMesh *em, int set) { + Mesh *me= NULL; EditEdge *eed; -#if 0 /* auto-enable sharp edge drawing */ if(set) { - if(!(G.f & G_DRAWSEAMS)) { - G.f |= G_DRAWSEAMS; - } + me->drawflag |= ME_DRAWSHARP; } -#endif if(set) { eed= em->edges.first; diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c index 68d75f64065..23a810ba66b 100644 --- a/source/blender/editors/mesh/editmesh_tools.c +++ b/source/blender/editors/mesh/editmesh_tools.c @@ -3901,7 +3901,8 @@ typedef struct SlideVert { int EdgeSlide(EditMesh *em, short immediate, float imperc) { -// NumInput num; +// NumInput num; XXX + Mesh *me= NULL; // XXX EditFace *efa; EditEdge *eed,*first=NULL,*last=NULL, *temp = NULL; EditVert *ev, *nearest; @@ -4180,7 +4181,7 @@ int EdgeSlide(EditMesh *em, short immediate, float imperc) return 0; } - if(G.f & G_DRAW_EDGELEN) { + if(me->drawflag & ME_DRAW_EDGELEN) { if(!(tempsv->up->f & SELECT)) { tempsv->up->f |= SELECT; tempsv->up->f2 |= 16; @@ -4633,7 +4634,7 @@ int EdgeSlide(EditMesh *em, short immediate, float imperc) } - if(G.f & G_DRAW_EDGELEN) { + if(me->drawflag & ME_DRAW_EDGELEN) { look = vertlist; while(look) { tempsv = BLI_ghash_lookup(vertgh,(EditVert*)look->link); diff --git a/source/blender/editors/mesh/mesh_intern.h b/source/blender/editors/mesh/mesh_intern.h index 45b2d1fc5f7..e665b7e70fc 100644 --- a/source/blender/editors/mesh/mesh_intern.h +++ b/source/blender/editors/mesh/mesh_intern.h @@ -185,7 +185,7 @@ void MESH_OT_reveal_mesh(struct wmOperatorType *ot); void MESH_OT_righthandfaces(struct wmOperatorType *ot); void MESH_OT_select_linked_flat_faces(struct wmOperatorType *ot); void MESH_OT_select_sharp_edges(struct wmOperatorType *ot); - +void MESH_OT_shortest_path_select(struct wmOperatorType *ot); extern EditEdge *findnearestedge(ViewContext *vc, int *dist); extern void EM_automerge(int update); diff --git a/source/blender/editors/mesh/mesh_ops.c b/source/blender/editors/mesh/mesh_ops.c index 1b86add2376..4df5b39ac47 100644 --- a/source/blender/editors/mesh/mesh_ops.c +++ b/source/blender/editors/mesh/mesh_ops.c @@ -146,6 +146,8 @@ void ED_operatortypes_mesh(void) WM_operatortype_append(MESH_OT_dupli_extrude_cursor); WM_operatortype_append(MESH_OT_loop_select); WM_operatortype_append(MESH_OT_add_edge_face); + WM_operatortype_append(MESH_OT_shortest_path_select); + } @@ -156,6 +158,7 @@ void ED_keymap_mesh(wmWindowManager *wm) wmKeymapItem *kmi; /* selecting */ + /* standard mouse selection goes via space_view3d */ WM_keymap_add_item(keymap, "MESH_OT_loop_select", SELECTMOUSE, KM_PRESS, KM_ALT, 0); kmi= WM_keymap_add_item(keymap, "MESH_OT_loop_select", SELECTMOUSE, KM_PRESS, KM_SHIFT|KM_ALT, 0); RNA_boolean_set(kmi->ptr, "extend", 1); @@ -164,7 +167,9 @@ void ED_keymap_mesh(wmWindowManager *wm) kmi= WM_keymap_add_item(keymap, "MESH_OT_loop_select", SELECTMOUSE, KM_PRESS, KM_SHIFT|KM_ALT|KM_CTRL, 0); RNA_boolean_set(kmi->ptr, "extend", 1); RNA_boolean_set(kmi->ptr, "ring", 1); - + + WM_keymap_add_item(keymap, "MESH_OT_shortest_path_select", SELECTMOUSE, KM_PRESS, KM_CTRL, 0); + WM_keymap_add_item(keymap, "MESH_OT_de_select_all", AKEY, KM_PRESS, 0, 0); WM_keymap_add_item(keymap, "MESH_OT_select_more", PADPLUSKEY, KM_PRESS, KM_CTRL, 0); WM_keymap_add_item(keymap, "MESH_OT_select_less", PADMINUS, KM_PRESS, KM_CTRL, 0); diff --git a/source/blender/editors/space_view3d/drawmesh.c b/source/blender/editors/space_view3d/drawmesh.c index f34f520e269..92c8b8f0b69 100644 --- a/source/blender/editors/space_view3d/drawmesh.c +++ b/source/blender/editors/space_view3d/drawmesh.c @@ -135,13 +135,14 @@ static EdgeHash *get_tface_mesh_marked_edge_info(Mesh *me) static int draw_tfaces3D__setHiddenOpts(void *userData, int index) { struct { Mesh *me; EdgeHash *eh; } *data = userData; - MEdge *med = &data->me->medge[index]; + Mesh *me= data->me; + MEdge *med = &me->medge[index]; uintptr_t flags = (intptr_t) BLI_edgehash_lookup(data->eh, med->v1, med->v2); - if((G.f & G_DRAWSEAMS) && (med->flag&ME_SEAM)) { + if((me->drawflag & ME_DRAWSEAMS) && (med->flag&ME_SEAM)) { return 0; - } else if(G.f & G_DRAWEDGES){ - if (G.f&G_HIDDENEDGES) { + } else if(me->drawflag & ME_DRAWEDGES){ + if (me->drawflag & ME_HIDDENEDGES) { return 1; } else { return (flags & eEdge_Visible); @@ -154,11 +155,12 @@ static int draw_tfaces3D__setHiddenOpts(void *userData, int index) static int draw_tfaces3D__setSeamOpts(void *userData, int index) { struct { Mesh *me; EdgeHash *eh; } *data = userData; + Mesh *me= data->me; MEdge *med = &data->me->medge[index]; uintptr_t flags = (intptr_t) BLI_edgehash_lookup(data->eh, med->v1, med->v2); - if (med->flag&ME_SEAM) { - if (G.f&G_HIDDENEDGES) { + if (med->flag & ME_SEAM) { + if (me->drawflag & ME_HIDDENEDGES) { return 1; } else { return (flags & eEdge_Visible); @@ -217,7 +219,7 @@ static void draw_tfaces3D(RegionView3D *rv3d, Object *ob, Mesh *me, DerivedMesh dm->drawMappedEdges(dm, draw_tfaces3D__setHiddenOpts, &data); /* Draw Seams */ - if(G.f & G_DRAWSEAMS) { + if(me->drawflag & ME_DRAWSEAMS) { UI_ThemeColor(TH_EDGE_SEAM); glLineWidth(2); @@ -227,7 +229,7 @@ static void draw_tfaces3D(RegionView3D *rv3d, Object *ob, Mesh *me, DerivedMesh } /* Draw Selected Faces */ - if(G.f & G_DRAWFACES) { + if(me->drawflag & ME_DRAWFACES) { glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); UI_ThemeColor4(TH_FACE_SELECT); diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c index 8430e4b874b..dd101231b49 100644 --- a/source/blender/editors/space_view3d/drawobject.c +++ b/source/blender/editors/space_view3d/drawobject.c @@ -1712,7 +1712,7 @@ static void draw_em_fancy_verts(Scene *scene, View3D *v3d, Object *obedit, EditM glPointSize(1.0); } -static void draw_em_fancy_edges(Scene *scene, View3D *v3d, DerivedMesh *cageDM, short sel_only, EditEdge *eed_act) +static void draw_em_fancy_edges(Scene *scene, View3D *v3d, Mesh *me, DerivedMesh *cageDM, short sel_only, EditEdge *eed_act) { int pass; unsigned char wireCol[4], selCol[4], actCol[4]; @@ -1746,7 +1746,7 @@ static void draw_em_fancy_edges(Scene *scene, View3D *v3d, DerivedMesh *cageDM, if(scene->selectmode == SCE_SELECT_FACE) { draw_dm_edges_sel(cageDM, wireCol, selCol, actCol, eed_act); } - else if( (G.f & G_DRAWEDGES) || (scene->selectmode & SCE_SELECT_EDGE) ) { + else if( (me->drawflag & ME_DRAWEDGES) || (scene->selectmode & SCE_SELECT_EDGE) ) { if(cageDM->drawMappedEdgesInterp && (scene->selectmode & SCE_SELECT_VERTEX)) { glShadeModel(GL_SMOOTH); draw_dm_edges_sel_interp(cageDM, wireCol, selCol); @@ -1771,6 +1771,7 @@ static void draw_em_fancy_edges(Scene *scene, View3D *v3d, DerivedMesh *cageDM, static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d, Object *ob, EditMesh *em) { + Mesh *me= ob->data; EditEdge *eed; EditFace *efa; float v1[3], v2[3], v3[3], v4[3]; @@ -1800,7 +1801,7 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d, Object *ob, E if(v3d->zbuf) bglPolygonOffset(rv3d->dist, 5.0); - if(G.f & G_DRAW_EDGELEN) { + if(me->drawflag & ME_DRAW_EDGELEN) { UI_GetThemeColor3fv(TH_TEXT, col); /* make color a bit more red */ if(col[0]> 0.5) {col[1]*=0.7; col[2]*= 0.7;} @@ -1826,7 +1827,7 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d, Object *ob, E } } - if(G.f & G_DRAW_FACEAREA) { + if(me->drawflag & ME_DRAW_FACEAREA) { // XXX extern int faceselectedOR(EditFace *efa, int flag); // editmesh.h shouldn't be in this file... ok for now? UI_GetThemeColor3fv(TH_TEXT, col); @@ -1862,7 +1863,7 @@ static void draw_em_measure_stats(View3D *v3d, RegionView3D *rv3d, Object *ob, E } } - if(G.f & G_DRAW_EDGEANG) { + if(me->drawflag & ME_DRAW_EDGEANG) { EditEdge *e1, *e2, *e3, *e4; UI_GetThemeColor3fv(TH_TEXT, col); @@ -2018,7 +2019,7 @@ static void draw_em_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object } } - if((G.f & (G_DRAWFACES)) || FACESEL_PAINT_TEST) { /* transp faces */ + if((me->drawflag & (ME_DRAWFACES)) || FACESEL_PAINT_TEST) { /* transp faces */ unsigned char col1[4], col2[4], col3[4]; UI_GetThemeColor4ubv(TH_FACE, (char *)col1); @@ -2055,14 +2056,14 @@ static void draw_em_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object } /* here starts all fancy draw-extra over */ - if((G.f & G_DRAWEDGES)==0 && CHECK_OB_DRAWTEXTURE(v3d, dt)) { - /* we are drawing textures and 'G_DRAWEDGES' is disabled, dont draw any edges */ + if((me->drawflag & ME_DRAWEDGES)==0 && CHECK_OB_DRAWTEXTURE(v3d, dt)) { + /* we are drawing textures and 'ME_DRAWEDGES' is disabled, dont draw any edges */ /* only draw selected edges otherwise there is no way of telling if a face is selected */ - draw_em_fancy_edges(scene, v3d, cageDM, 1, eed_act); + draw_em_fancy_edges(scene, v3d, me, cageDM, 1, eed_act); } else { - if(G.f & G_DRAWSEAMS) { + if(me->drawflag & ME_DRAWSEAMS) { UI_ThemeColor(TH_EDGE_SEAM); glLineWidth(2); @@ -2072,7 +2073,7 @@ static void draw_em_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object glLineWidth(1); } - if(G.f & G_DRAWSHARP) { + if(me->drawflag & ME_DRAWSHARP) { UI_ThemeColor(TH_EDGE_SHARP); glLineWidth(2); @@ -2082,30 +2083,30 @@ static void draw_em_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, Object glLineWidth(1); } - if(G.f & G_DRAWCREASES) { + if(me->drawflag & ME_DRAWCREASES) { draw_dm_creases(cageDM); } - if(G.f & G_DRAWBWEIGHTS) { + if(me->drawflag & ME_DRAWBWEIGHTS) { draw_dm_bweights(scene, cageDM); } - draw_em_fancy_edges(scene, v3d, cageDM, 0, eed_act); + draw_em_fancy_edges(scene, v3d, me, cageDM, 0, eed_act); } if(em) { // XXX retopo_matrix_update(v3d); draw_em_fancy_verts(scene, v3d, ob, em, cageDM, eve_act); - if(G.f & G_DRAWNORMALS) { + if(me->drawflag & ME_DRAWNORMALS) { UI_ThemeColor(TH_NORMAL); draw_dm_face_normals(scene, cageDM); } - if(G.f & G_DRAW_VNORMALS) { + if(me->drawflag & ME_DRAW_VNORMALS) { UI_ThemeColor(TH_NORMAL); draw_dm_vert_normals(scene, cageDM); } - if(G.f & (G_DRAW_EDGELEN|G_DRAW_FACEAREA|G_DRAW_EDGEANG)) + if(me->drawflag & (ME_DRAW_EDGELEN|ME_DRAW_FACEAREA|ME_DRAW_EDGEANG)) draw_em_measure_stats(v3d, rv3d, ob, em); } @@ -4903,9 +4904,6 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, int flag) dtx= dtx & (OB_DRAWWIRE|OB_TEXSPACE); } - if(G.f & G_DRAW_EXT) { - if(ob->type==OB_EMPTY || ob->type==OB_CAMERA || ob->type==OB_LAMP) dt= OB_WIRE; - } } /* draw outline for selected solid objects, mesh does itself */ diff --git a/source/blender/editors/uvedit/uvedit_draw.c b/source/blender/editors/uvedit/uvedit_draw.c index ddb45bdd736..5bffe6b1124 100644 --- a/source/blender/editors/uvedit/uvedit_draw.c +++ b/source/blender/editors/uvedit/uvedit_draw.c @@ -413,6 +413,7 @@ static void draw_uvs_stretch(SpaceImage *sima, Scene *scene, EditMesh *em, MTFac static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit) { ToolSettings *settings; + Mesh *me= obedit->data; EditMesh *em; EditFace *efa, *efa_act; MTFace *tf, *activetf = NULL; @@ -422,7 +423,7 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit) int drawfaces, interpedges, lastsel, sel; Image *ima= sima->image; - em= ((Mesh*)obedit->data)->edit_mesh; + em= me->edit_mesh; activetf= EM_get_active_mtface(em, &efa_act, NULL, 0); /* will be set to NULL if hidden */ settings= scene->toolsettings; @@ -457,7 +458,7 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit) if(sima->flag & SI_DRAW_STRETCH) { draw_uvs_stretch(sima, scene, em, activetf); } - else if(G.f & G_DRAWFACES) { + else if(me->drawflag & ME_DRAWFACES) { /* draw transparent faces */ UI_GetThemeColor4ubv(TH_FACE, col1); UI_GetThemeColor4ubv(TH_FACE_SELECT, col2); @@ -614,7 +615,7 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit) col2[0] = col2[1] = col2[2] = 128; col2[3] = 255; glColor4ubv((unsigned char *)col2); - if(G.f & G_DRAWEDGES) { + if(me->drawflag & ME_DRAWEDGES) { UI_GetThemeColor4ubv(TH_VERTEX_SELECT, col1); lastsel = sel = 0; diff --git a/source/blender/makesdna/DNA_mesh_types.h b/source/blender/makesdna/DNA_mesh_types.h index 7da057efdb1..3ecfe416c79 100644 --- a/source/blender/makesdna/DNA_mesh_types.h +++ b/source/blender/makesdna/DNA_mesh_types.h @@ -89,8 +89,9 @@ typedef struct Mesh { float size[3]; float rot[3]; - float cubemapsize, pad; - + float cubemapsize; + + int drawflag; short smoothresh, flag; short subdiv, subdivr; @@ -126,6 +127,45 @@ typedef struct TFace { #define ME_SUBSURF 128 #define ME_OPT_EDGES 256 +/* me->drawflag, int */ +#define ME_DRAWEDGES (1 << 0) +#define ME_DRAWFACES (1 << 1) +#define ME_DRAWNORMALS (1 << 2) +#define ME_DRAW_VNORMALS (1 << 3) + +#define ME_ALLEDGES (1 << 4) +#define ME_HIDDENEDGES (1 << 5) + +#define ME_DRAWCREASES (1 << 6) +#define ME_DRAWSEAMS (1 << 7) +#define ME_DRAWSHARP (1 << 8) +#define ME_DRAWBWEIGHTS (1 << 8) + +#define ME_DRAW_EDGELEN (1 << 10) +#define ME_DRAW_FACEAREA (1 << 11) +#define ME_DRAW_EDGEANG (1 << 12) + +/* old global flags: +#define G_DRAWEDGES (1 << 18) +#define G_DRAWFACES (1 << 7) +#define G_DRAWNORMALS (1 << 6) +#define G_DRAW_VNORMALS (1 << 14) + +#define G_ALLEDGES (1 << 11) +#define G_HIDDENEDGES (1 << 21) + +#define G_DRAWCREASES (1 << 19) +#define G_DRAWSEAMS (1 << 20) +#define G_DRAWSHARP (1 << 28) +#define G_DRAWBWEIGHTS (1 << 31) + +#define G_DRAW_EDGELEN (1 << 22) +#define G_DRAW_FACEAREA (1 << 23) +#define G_DRAW_EDGEANG (1 << 24) +*/ + + + /* Subsurf Type */ #define ME_CC_SUBSURF 0 #define ME_SIMPLE_SUBSURF 1 diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index 7df47ce3462..3d7cb25b134 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -72,14 +72,6 @@ void wm_event_add(wmWindow *win, wmEvent *event_to_add) BLI_addtail(&win->queue, event); } -wmEvent *wm_event_next(wmWindow *win) -{ - wmEvent *event= win->queue.first; - - if(event) BLI_remlink(&win->queue, event); - return event; -} - static void wm_event_free(wmEvent *event) { if(event->customdata && event->customdatafree) @@ -789,9 +781,9 @@ void wm_event_do_handlers(bContext *C) if( win->screen==NULL ) wm_event_free_all(win); - while( (event=wm_event_next(win)) ) { + while( (event= win->queue.first) ) { int action; - + CTX_wm_window_set(C, win); /* we let modal handlers get active area/region, also wm_paintcursor_test needs it */ @@ -852,6 +844,9 @@ void wm_event_do_handlers(bContext *C) win->eventstate->prevy= event->y; } } + + /* unlink and free here, blender-quit then frees all */ + BLI_remlink(&win->queue, event); wm_event_free(event); } diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c index a496ebc3bea..55d0fd4ab46 100644 --- a/source/blender/windowmanager/intern/wm_operators.c +++ b/source/blender/windowmanager/intern/wm_operators.c @@ -461,6 +461,15 @@ static void WM_OT_window_fullscreen_toggle(wmOperatorType *ot) ot->poll= WM_operator_winactive; } +static int wm_exit_blender_op(bContext *C, wmOperator *op) +{ + WM_operator_free(op); + + WM_exit(C); + + return OPERATOR_FINISHED; +} + static void WM_OT_exit_blender(wmOperatorType *ot) { ot->name= "Exit Blender"; @@ -531,18 +540,18 @@ static int border_apply(bContext *C, wmOperator *op, int event_type) if(rect->xmin==rect->xmax || rect->ymin==rect->ymax) return 0; - else { - - /* operator arguments and storage. */ - RNA_int_set(op->ptr, "xmin", rect->xmin); - RNA_int_set(op->ptr, "ymin", rect->ymin); - RNA_int_set(op->ptr, "xmax", rect->xmax); - RNA_int_set(op->ptr, "ymax", rect->ymax); - if( RNA_struct_find_property(op->ptr, "event_type") ) - RNA_int_set(op->ptr, "event_type", event_type); - op->type->exec(C, op); - } + /* operator arguments and storage. */ + RNA_int_set(op->ptr, "xmin", rect->xmin); + RNA_int_set(op->ptr, "ymin", rect->ymin); + RNA_int_set(op->ptr, "xmax", rect->xmax); + RNA_int_set(op->ptr, "ymax", rect->ymax); + if( RNA_struct_find_property(op->ptr, "event_type") ) + RNA_int_set(op->ptr, "event_type", event_type); + + op->type->exec(C, op); + + return 1; } static void wm_gesture_end(bContext *C, wmOperator *op) diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c index eebf89982c1..bf34406b111 100644 --- a/source/blender/windowmanager/intern/wm_window.c +++ b/source/blender/windowmanager/intern/wm_window.c @@ -322,21 +322,6 @@ int wm_window_fullscreen_toggle_op(bContext *C, wmOperator *op) } - -/* exit blender */ -int wm_exit_blender_op(bContext *C, wmOperator *op) -{ - wmWindowManager *wm= CTX_wm_manager(C); - wmWindow *win= wm->windows.first; - - while(win) { - wm_window_close(C, win); - win= win->next; - } - - return OPERATOR_FINISHED; -} - /* ************ events *************** */ diff --git a/source/blender/windowmanager/wm_event_system.h b/source/blender/windowmanager/wm_event_system.h index 8a5806497a3..5205c8c17e1 100644 --- a/source/blender/windowmanager/wm_event_system.h +++ b/source/blender/windowmanager/wm_event_system.h @@ -78,7 +78,6 @@ enum { /* wm_event_system.c */ void wm_event_add(wmWindow *win, wmEvent *event_to_add); void wm_event_free_all (wmWindow *win); -wmEvent *wm_event_next (wmWindow *win); /* goes over entire hierarchy: events -> window -> screen -> area -> region */ void wm_event_do_handlers (bContext *C); diff --git a/source/blender/windowmanager/wm_window.h b/source/blender/windowmanager/wm_window.h index 97b9f434982..86ceac9203e 100644 --- a/source/blender/windowmanager/wm_window.h +++ b/source/blender/windowmanager/wm_window.h @@ -58,7 +58,6 @@ void wm_window_testbreak (void); int wm_window_duplicate_op (bContext *C, wmOperator *op); int wm_window_rip_op (bContext *C, wmOperator *op, struct wmEvent *event); int wm_window_fullscreen_toggle_op(bContext *C, wmOperator *op); -int wm_exit_blender_op(bContext *C, wmOperator *op); #endif /* WM_WINDOW_H */ |