From 4506f730556aab929ee987323dcfb87fe0880114 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 29 Mar 2013 04:01:52 +0000 Subject: add edge-angle drawing in editmode for manifold edges. --- source/blender/editors/include/UI_resources.h | 1 + source/blender/editors/interface/resources.c | 3 + source/blender/editors/space_view3d/drawobject.c | 75 +++++++++++++++++++----- source/blender/makesdna/DNA_mesh_types.h | 3 +- source/blender/makesdna/DNA_userdef_types.h | 2 +- source/blender/makesrna/intern/rna_mesh.c | 6 ++ source/blender/makesrna/intern/rna_userdef.c | 5 ++ 7 files changed, 79 insertions(+), 16 deletions(-) (limited to 'source/blender') diff --git a/source/blender/editors/include/UI_resources.h b/source/blender/editors/include/UI_resources.h index d84e392ae34..51d16094609 100644 --- a/source/blender/editors/include/UI_resources.h +++ b/source/blender/editors/include/UI_resources.h @@ -185,6 +185,7 @@ enum { TH_EDGE_CREASE, TH_DRAWEXTRA_EDGELEN, + TH_DRAWEXTRA_EDGEANG, TH_DRAWEXTRA_FACEAREA, TH_DRAWEXTRA_FACEANG, diff --git a/source/blender/editors/interface/resources.c b/source/blender/editors/interface/resources.c index 39a6109bd62..d9b179795b8 100644 --- a/source/blender/editors/interface/resources.c +++ b/source/blender/editors/interface/resources.c @@ -309,6 +309,8 @@ const unsigned char *UI_ThemeGetColorPtr(bTheme *btheme, int spacetype, int colo cp = &ts->facedot_size; break; case TH_DRAWEXTRA_EDGELEN: cp = ts->extra_edge_len; break; + case TH_DRAWEXTRA_EDGEANG: + cp = ts->extra_edge_angle; break; case TH_DRAWEXTRA_FACEAREA: cp = ts->extra_face_area; break; case TH_DRAWEXTRA_FACEANG: @@ -766,6 +768,7 @@ void ui_theme_init_default(void) btheme->tv3d.facedot_size = 4; rgba_char_args_set(btheme->tv3d.extra_edge_len, 32, 0, 0, 255); + rgba_char_args_set(btheme->tv3d.extra_edge_angle, 32, 32, 0, 255); rgba_char_args_set(btheme->tv3d.extra_face_area, 0, 32, 0, 255); rgba_char_args_set(btheme->tv3d.extra_face_angle, 0, 0, 128, 255); diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c index 5a537f6f6c5..0fc401e88d4 100644 --- a/source/blender/editors/space_view3d/drawobject.c +++ b/source/blender/editors/space_view3d/drawobject.c @@ -2601,9 +2601,9 @@ static void draw_em_measure_stats(View3D *v3d, Object *ob, BMEditMesh *em, UnitS unsigned char col[4] = {0, 0, 0, 255}; /* color of the text to draw */ float area; /* area of the face */ float grid = unit->system ? unit->scale_length : v3d->grid; - const int do_split = unit->flag & USER_UNIT_OPT_SPLIT; - const int do_global = v3d->flag & V3D_GLOBAL_STATS; - const int do_moving = G.moving; + const bool do_split = (unit->flag & USER_UNIT_OPT_SPLIT) != 0; + const bool do_global = (v3d->flag & V3D_GLOBAL_STATS) != 0; + const bool do_moving = G.moving; BMIter iter; int i; @@ -2644,7 +2644,7 @@ static void draw_em_measure_stats(View3D *v3d, Object *ob, BMEditMesh *em, UnitS unit->system, B_UNIT_LENGTH, do_split, false); } else { - sprintf(numstr, conv_float, len_v3v3(v1, v2)); + BLI_snprintf(numstr, sizeof(numstr), conv_float, len_v3v3(v1, v2)); } view3d_cached_text_draw_add(vmid, numstr, 0, txt_flag, col); @@ -2652,6 +2652,50 @@ static void draw_em_measure_stats(View3D *v3d, Object *ob, BMEditMesh *em, UnitS } } + if (me->drawflag & ME_DRAWEXTRA_EDGEANG) { + const bool is_rad = (unit->system_rotation == USER_UNIT_ROT_RADIANS); + BMEdge *eed; + + UI_GetThemeColor3ubv(TH_DRAWEXTRA_EDGEANG, col); + + // invert_m4_m4(ob->imat, ob->obmat); // this is already called + + eed = BM_iter_new(&iter, em->bm, BM_EDGES_OF_MESH, NULL); + for (; eed; eed = BM_iter_step(&iter)) { + /* draw selected edges, or edges next to selected verts while draging */ + if (BM_elem_flag_test(eed, BM_ELEM_SELECT) || + (do_moving && (BM_elem_flag_test(eed->v1, BM_ELEM_SELECT) || + BM_elem_flag_test(eed->v2, BM_ELEM_SELECT)))) + { + BMFace *f_a, *f_b; + if (BM_edge_face_pair(eed, &f_a, &f_b)) { + float angle; + copy_v3_v3(v1, eed->v1->co); + copy_v3_v3(v2, eed->v2->co); + + mid_v3_v3v3(vmid, v1, v2); + + if (do_global) { + float no_a[3]; + float no_b[3]; + copy_v3_v3(no_a, f_a->no); + copy_v3_v3(no_b, f_b->no); + mul_mat3_m4_v3(ob->imat, no_a); + mul_mat3_m4_v3(ob->imat, no_b); + angle = angle_v3v3(no_a, no_b); + } + else { + angle = angle_normalized_v3v3(f_a->no, f_b->no); + } + + BLI_snprintf(numstr, sizeof(numstr), "%.3f", is_rad ? angle : RAD2DEGF(angle)); + + view3d_cached_text_draw_add(vmid, numstr, 0, txt_flag, col); + } + } + } + } + if (me->drawflag & ME_DRAWEXTRA_FACEAREA) { /* would be nice to use BM_face_calc_area, but that is for 2d faces * so instead add up tessellation triangle areas */ @@ -2714,7 +2758,7 @@ static void draw_em_measure_stats(View3D *v3d, Object *ob, BMEditMesh *em, UnitS if (me->drawflag & ME_DRAWEXTRA_FACEANG) { BMFace *efa; - int is_rad = unit->system_rotation == USER_UNIT_ROT_RADIANS; + const bool is_rad = (unit->system_rotation == USER_UNIT_ROT_RADIANS); UI_GetThemeColor3ubv(TH_DRAWEXTRA_FACEANG, col); @@ -2787,7 +2831,7 @@ static void draw_em_indices(BMEditMesh *em) UI_GetThemeColor3ubv(TH_DRAWEXTRA_FACEANG, col); BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) { if (BM_elem_flag_test(v, BM_ELEM_SELECT)) { - sprintf(numstr, "%d", i); + BLI_snprintf(numstr, sizeof(numstr), "%d", i); view3d_cached_text_draw_add(v->co, numstr, 0, txt_flag, col); } i++; @@ -2799,7 +2843,7 @@ static void draw_em_indices(BMEditMesh *em) UI_GetThemeColor3ubv(TH_DRAWEXTRA_EDGELEN, col); BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) { if (BM_elem_flag_test(e, BM_ELEM_SELECT)) { - sprintf(numstr, "%d", i); + BLI_snprintf(numstr, sizeof(numstr), "%d", i); mid_v3_v3v3(pos, e->v1->co, e->v2->co); view3d_cached_text_draw_add(pos, numstr, 0, txt_flag, col); } @@ -2813,7 +2857,7 @@ static void draw_em_indices(BMEditMesh *em) BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) { if (BM_elem_flag_test(f, BM_ELEM_SELECT)) { BM_face_calc_center_mean(f, pos); - sprintf(numstr, "%d", i); + BLI_snprintf(numstr, sizeof(numstr), "%d", i); view3d_cached_text_draw_add(pos, numstr, 0, txt_flag, col); } i++; @@ -3002,7 +3046,10 @@ static void draw_em_fancy(Scene *scene, View3D *v3d, RegionView3D *rv3d, draw_dm_vert_normals(em, scene, ob, cageDM); } - if ((me->drawflag & (ME_DRAWEXTRA_EDGELEN | ME_DRAWEXTRA_FACEAREA | ME_DRAWEXTRA_FACEANG)) && + if ((me->drawflag & (ME_DRAWEXTRA_EDGELEN | + ME_DRAWEXTRA_FACEAREA | + ME_DRAWEXTRA_FACEANG | + ME_DRAWEXTRA_EDGEANG)) && !(v3d->flag2 & V3D_RENDER_OVERRIDE)) { draw_em_measure_stats(v3d, ob, em, &scene->unit); @@ -3059,7 +3106,7 @@ static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D eWireDrawMode draw_wire = OBDRAW_WIRE_OFF; int /* totvert,*/ totedge, totface; DerivedMesh *dm = mesh_get_derived_final(scene, ob, scene->customdata_mask); - const short is_obact = (ob == OBACT); + const bool is_obact = (ob == OBACT); int draw_flags = (is_obact && paint_facesel_test(ob)) ? DRAW_FACE_SELECT : 0; if (!dm) @@ -4396,15 +4443,15 @@ static void draw_new_particle_system(Scene *scene, View3D *v3d, RegionView3D *rv if (part->draw & PART_DRAW_NUM) { if (a < totpart && (part->draw & PART_DRAW_HEALTH) && (part->phystype == PART_PHYS_BOIDS)) { - sprintf(val_pos, "%d:%.2f", a, pa_health); + BLI_snprintf(val_pos, sizeof(numstr), "%d:%.2f", a, pa_health); } else { - sprintf(val_pos, "%d", a); + BLI_snprintf(val_pos, sizeof(numstr), "%d", a); } } else { if (a < totpart && (part->draw & PART_DRAW_HEALTH) && (part->phystype == PART_PHYS_BOIDS)) { - sprintf(val_pos, "%.2f", pa_health); + BLI_snprintf(val_pos, sizeof(numstr), "%.2f", pa_health); } } @@ -6279,7 +6326,7 @@ void draw_object(Scene *scene, ARegion *ar, View3D *v3d, Base *base, const short short dtx; char dt; short zbufoff = 0; - const short is_obact = (ob == OBACT); + const bool is_obact = (ob == OBACT); /* only once set now, will be removed too, should become a global standard */ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); diff --git a/source/blender/makesdna/DNA_mesh_types.h b/source/blender/makesdna/DNA_mesh_types.h index f2ee73392c7..87f45c28ed9 100644 --- a/source/blender/makesdna/DNA_mesh_types.h +++ b/source/blender/makesdna/DNA_mesh_types.h @@ -197,9 +197,10 @@ typedef struct TFace { #define ME_DRAWEXTRA_EDGELEN (1 << 10) #define ME_DRAWEXTRA_FACEAREA (1 << 11) #define ME_DRAWEXTRA_FACEANG (1 << 12) +#define ME_DRAWEXTRA_EDGEANG (1 << 13) /* debug only option */ -#define ME_DRAWEXTRA_INDICES (1 << 13) +#define ME_DRAWEXTRA_INDICES (1 << 14) /* Subsurf Type */ #define ME_CC_SUBSURF 0 diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h index e459347c4e3..56c767b600f 100644 --- a/source/blender/makesdna/DNA_userdef_types.h +++ b/source/blender/makesdna/DNA_userdef_types.h @@ -234,7 +234,7 @@ typedef struct ThemeSpace { char edge_seam[4], edge_sharp[4], edge_facesel[4], edge_crease[4]; char face[4], face_select[4]; /* solid faces */ char face_dot[4]; /* selected color */ - char extra_edge_len[4], extra_face_angle[4], extra_face_area[4], pad3[4]; + char extra_edge_len[4], extra_edge_angle[4], extra_face_angle[4], extra_face_area[4]; char normal[4]; char vertex_normal[4]; char bone_solid[4], bone_pose[4], bone_pose_active[4]; diff --git a/source/blender/makesrna/intern/rna_mesh.c b/source/blender/makesrna/intern/rna_mesh.c index 729e8db8cfd..e03dfc9b8ec 100644 --- a/source/blender/makesrna/intern/rna_mesh.c +++ b/source/blender/makesrna/intern/rna_mesh.c @@ -2945,6 +2945,12 @@ static void rna_def_mesh(BlenderRNA *brna) "Display selected edge lengths, using global values when set in the transform panel"); RNA_def_property_update(prop, 0, "rna_Mesh_update_draw"); + prop = RNA_def_property(srna, "show_extra_edge_angle", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAWEXTRA_EDGEANG); + RNA_def_property_ui_text(prop, "Edge Angle", + "Display selected edge angle, using global values when set in the transform panel"); + RNA_def_property_update(prop, 0, "rna_Mesh_update_draw"); + prop = RNA_def_property(srna, "show_extra_face_angle", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAWEXTRA_FACEANG); RNA_def_property_ui_text(prop, "Face Angles", diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c index a279ec375a9..f8085e8224e 100644 --- a/source/blender/makesrna/intern/rna_userdef.c +++ b/source/blender/makesrna/intern/rna_userdef.c @@ -1465,6 +1465,11 @@ static void rna_def_userdef_theme_space_view3d(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Edge Length Text", ""); RNA_def_property_update(prop, 0, "rna_userdef_update"); + prop = RNA_def_property(srna, "extra_edge_angle", PROP_FLOAT, PROP_COLOR_GAMMA); + RNA_def_property_array(prop, 3); + RNA_def_property_ui_text(prop, "Edge Angle Text", ""); + RNA_def_property_update(prop, 0, "rna_userdef_update"); + prop = RNA_def_property(srna, "extra_face_angle", PROP_FLOAT, PROP_COLOR_GAMMA); RNA_def_property_array(prop, 3); RNA_def_property_ui_text(prop, "Face Angle Text", ""); -- cgit v1.2.3