diff options
author | Campbell Barton <ideasman42@gmail.com> | 2013-04-18 21:09:56 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2013-04-18 21:09:56 +0400 |
commit | 5c72a19c09a8066b0cbe49730dc129bd93d5857a (patch) | |
tree | 0afce5d4f7636b17082ab830e5e49419b4af1fb8 /source/blender | |
parent | feeab1ad53f1b7cd4496fb8e7f173f21e460aac0 (diff) |
add display mode for sharp edges.
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenkernel/BKE_editmesh.h | 6 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/DerivedMesh.c | 39 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/editderivedmesh.c | 86 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/editmesh.c | 37 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/scene.c | 3 | ||||
-rw-r--r-- | source/blender/blenloader/intern/readfile.c | 3 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_scene_types.h | 4 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_mesh.c | 11 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_scene.c | 19 |
9 files changed, 157 insertions, 51 deletions
diff --git a/source/blender/blenkernel/BKE_editmesh.h b/source/blender/blenkernel/BKE_editmesh.h index b18354627ab..0b6507b85d3 100644 --- a/source/blender/blenkernel/BKE_editmesh.h +++ b/source/blender/blenkernel/BKE_editmesh.h @@ -96,11 +96,13 @@ BMEditMesh *BKE_editmesh_from_object(struct Object *ob); void BKE_editmesh_free(BMEditMesh *em); void BKE_editmesh_update_linked_customdata(BMEditMesh *em); +void BKE_editmesh_color_free(BMEditMesh *em); +void BKE_editmesh_color_ensure(BMEditMesh *em, const char htype); + /* editderivedmesh.c */ /* should really be defined in editmesh.c, but they use 'EditDerivedBMesh' */ void BKE_editmesh_statvis_calc(BMEditMesh *em, struct DerivedMesh *dm, - struct MeshStatVis *statvis, - unsigned char (*r_face_colors)[4]); + struct MeshStatVis *statvis); float (*BKE_editmesh_vertexCos_get(struct BMEditMesh *em, struct Scene *scene, int *r_numVerts))[3]; diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index 255723b0977..1860ea6d53f 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -53,6 +53,7 @@ #include "BKE_pbvh.h" #include "BKE_cdderivedmesh.h" #include "BKE_displist.h" +#include "BKE_editmesh.h" #include "BKE_key.h" #include "BKE_modifier.h" #include "BKE_mesh.h" @@ -1204,22 +1205,8 @@ void DM_update_weight_mcol(Object *ob, DerivedMesh *dm, int const draw_flag, int i; if (em) { - - /* no need to store both */ - if (em->derivedFaceColor) { - MEM_freeN(em->derivedFaceColor); - em->derivedFaceColor = NULL; - em->derivedFaceColorLen = 0; - } - - if (em->derivedVertColor && em->derivedVertColorLen == numVerts) { - wtcol_v = em->derivedVertColor; - } - else { - if (em->derivedVertColor) MEM_freeN(em->derivedVertColor); - wtcol_v = em->derivedVertColor = MEM_mallocN(sizeof(*wtcol_v) * numVerts, __func__); - em->derivedVertColorLen = numVerts; - } + BKE_editmesh_color_ensure(em, BM_VERT); + wtcol_v = em->derivedVertColor; } else { wtcol_v = MEM_mallocN(sizeof(*wtcol_v) * numVerts, __func__); @@ -1294,26 +1281,8 @@ void DM_update_weight_mcol(Object *ob, DerivedMesh *dm, int const draw_flag, static void DM_update_statvis_color(Scene *scene, Object *ob, DerivedMesh *dm) { BMEditMesh *em = BKE_editmesh_from_object(ob); - int numFaces = em->bm->totface; - unsigned char (*wtcol_f)[4]; - - /* no need to store both */ - if (em->derivedVertColor) { - MEM_freeN(em->derivedVertColor); - em->derivedVertColor = NULL; - em->derivedVertColorLen = 0; - } - - if (em->derivedFaceColor && em->derivedFaceColorLen == numFaces) { - wtcol_f = em->derivedFaceColor; - } - else { - if (em->derivedFaceColor) MEM_freeN(em->derivedFaceColor); - wtcol_f = em->derivedFaceColor = MEM_mallocN(sizeof(*wtcol_f) * numFaces, __func__); - em->derivedFaceColorLen = numFaces; - } - BKE_editmesh_statvis_calc(em, dm, &scene->toolsettings->statvis, wtcol_f); + BKE_editmesh_statvis_calc(em, dm, &scene->toolsettings->statvis); } static void shapekey_layers_to_keyblocks(DerivedMesh *dm, Mesh *me, int actshape_uid) diff --git a/source/blender/blenkernel/intern/editderivedmesh.c b/source/blender/blenkernel/intern/editderivedmesh.c index df380726c3a..37f4a787a36 100644 --- a/source/blender/blenkernel/intern/editderivedmesh.c +++ b/source/blender/blenkernel/intern/editderivedmesh.c @@ -323,8 +323,8 @@ static void emDM_drawMappedFaces(DerivedMesh *dm, const int skip_normals = !glIsEnabled(GL_LIGHTING); /* could be passed as an arg */ MLoopCol *lcol[3] = {NULL} /* , dummylcol = {0} */; - unsigned char(*color_vert_array)[4] = (((Mesh *)em->ob->data)->drawflag & ME_DRAWEIGHT) ? em->derivedVertColor : NULL; - unsigned char(*color_face_array)[4] = (((Mesh *)em->ob->data)->drawflag & ME_DRAW_STATVIS) ? em->derivedFaceColor : NULL; + unsigned char(*color_vert_array)[4] = em->derivedVertColor; + unsigned char(*color_face_array)[4] = em->derivedFaceColor; bool has_vcol_preview = (color_vert_array != NULL) && !skip_normals; bool has_fcol_preview = (color_face_array != NULL) && !skip_normals; bool has_vcol_any = has_vcol_preview; @@ -573,7 +573,7 @@ static void emDM_drawFacesTex_common(DerivedMesh *dm, const int cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_MLOOPUV); const int cd_loop_color_offset = CustomData_get_offset(&bm->ldata, CD_MLOOPCOL); const int cd_poly_tex_offset = CustomData_get_offset(&bm->pdata, CD_MTEXPOLY); - unsigned char(*color_vert_array)[4] = (((Mesh *)em->ob->data)->drawflag & ME_DRAWEIGHT) ? em->derivedVertColor : NULL; + unsigned char(*color_vert_array)[4] = em->derivedVertColor; bool has_uv = (cd_loop_uv_offset != -1); bool has_vcol_preview = (color_vert_array != NULL); bool has_vcol = (cd_loop_color_offset != -1) && (has_vcol_preview == false); @@ -1709,6 +1709,8 @@ static void statvis_calc_thickness( } } + BKE_bmbvh_free(bmtree); + /* convert floats into color! */ for (i = 0; i < bm->totface; i++) { float fac = face_dists[i]; @@ -1726,8 +1728,6 @@ static void statvis_calc_thickness( copy_v4_v4_char((char *)r_face_colors[i], (const char *)col_fallback); } } - - BKE_bmbvh_free(bmtree); } static void statvis_calc_intersect( @@ -1867,9 +1867,58 @@ static void statvis_calc_distort( } } +static void statvis_calc_sharp( + BMEditMesh *em, + const float (*vertexCos)[3], + /* values for calculating */ + const float min, const float max, + /* result */ + unsigned char (*r_vert_colors)[4]) +{ + float *vert_angles = (float *)r_vert_colors; /* cheating */ + BMIter iter; + BMesh *bm = em->bm; + BMEdge *e; + //float f_no[3]; + const float minmax_irange = 1.0f / (max - min); + int i; + + /* fallback */ + const char col_fallback[4] = {64, 64, 64, 255}; + + (void)vertexCos; /* TODO */ + + fill_vn_fl(vert_angles, em->bm->totvert, -M_PI); + + /* first assign float values to verts */ + BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) { + float angle = BM_edge_calc_face_angle_signed(e); + float *col1 = &vert_angles[BM_elem_index_get(e->v1)]; + float *col2 = &vert_angles[BM_elem_index_get(e->v2)]; + *col1 = max_ff(*col1, angle); + *col2 = max_ff(*col2, angle); + } + + /* convert floats into color! */ + for (i = 0; i < bm->totvert; i++) { + float fac = vert_angles[i]; + + /* important not '<=' */ + if (fac > min) { + float fcol[3]; + fac = (fac - min) * minmax_irange; + CLAMP(fac, 0.0f, 1.0f); + weight_to_rgb(fcol, fac); + rgb_float_to_uchar(r_vert_colors[i], fcol); + } + else { + copy_v4_v4_char((char *)r_vert_colors[i], (const char *)col_fallback); + } + } +} + void BKE_editmesh_statvis_calc(BMEditMesh *em, DerivedMesh *dm, - MeshStatVis *statvis, - unsigned char (*r_face_colors)[4]) + MeshStatVis *statvis) { EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm; BLI_assert(dm == NULL || dm->type == DM_TYPE_EDITBMESH); @@ -1877,39 +1926,54 @@ void BKE_editmesh_statvis_calc(BMEditMesh *em, DerivedMesh *dm, switch (statvis->type) { case SCE_STATVIS_OVERHANG: { + BKE_editmesh_color_ensure(em, BM_FACE); statvis_calc_overhang( em, bmdm ? (const float (*)[3])bmdm->polyNos : NULL, statvis->overhang_min / (float)M_PI, statvis->overhang_max / (float)M_PI, statvis->overhang_axis, - r_face_colors); + em->derivedFaceColor); break; } case SCE_STATVIS_THICKNESS: { const float scale = 1.0f / mat4_to_scale(em->ob->obmat); + BKE_editmesh_color_ensure(em, BM_FACE); statvis_calc_thickness( em, bmdm ? (const float (*)[3])bmdm->vertexCos : NULL, statvis->thickness_min * scale, statvis->thickness_max * scale, statvis->thickness_samples, - r_face_colors); + em->derivedFaceColor); break; } case SCE_STATVIS_INTERSECT: { + BKE_editmesh_color_ensure(em, BM_FACE); statvis_calc_intersect( em, bmdm ? (const float (*)[3])bmdm->vertexCos : NULL, - r_face_colors); + em->derivedFaceColor); break; } case SCE_STATVIS_DISTORT: { + BKE_editmesh_color_ensure(em, BM_FACE); statvis_calc_distort( em, bmdm ? (const float (*)[3])bmdm->vertexCos : NULL, statvis->distort_min, statvis->distort_max, - r_face_colors); + em->derivedFaceColor); + break; + } + case SCE_STATVIS_SHARP: + { + BKE_editmesh_color_ensure(em, BM_VERT); + statvis_calc_sharp( + em, bmdm ? (const float (*)[3])bmdm->vertexCos : NULL, + statvis->sharp_min, + statvis->sharp_max, + /* in this case they are vertex colors */ + em->derivedVertColor); break; } } diff --git a/source/blender/blenkernel/intern/editmesh.c b/source/blender/blenkernel/intern/editmesh.c index 6ddc7c07d0a..7c6a5643c8d 100644 --- a/source/blender/blenkernel/intern/editmesh.c +++ b/source/blender/blenkernel/intern/editmesh.c @@ -327,8 +327,7 @@ void BKE_editmesh_free(BMEditMesh *em) em->derivedCage = NULL; } - if (em->derivedVertColor) MEM_freeN(em->derivedVertColor); - if (em->derivedFaceColor) MEM_freeN(em->derivedFaceColor); + BKE_editmesh_color_free(em); if (em->looptris) MEM_freeN(em->looptris); @@ -339,3 +338,37 @@ void BKE_editmesh_free(BMEditMesh *em) if (em->bm) BM_mesh_free(em->bm); } + +void BKE_editmesh_color_free(BMEditMesh *em) +{ + if (em->derivedVertColor) MEM_freeN(em->derivedVertColor); + if (em->derivedFaceColor) MEM_freeN(em->derivedFaceColor); + em->derivedVertColor = NULL; + em->derivedFaceColor = NULL; + + em->derivedVertColorLen = 0; + em->derivedFaceColorLen = 0; + +} + +void BKE_editmesh_color_ensure(BMEditMesh *em, const char htype) +{ + switch (htype) { + case BM_VERT: + if (em->derivedVertColorLen != em->bm->totvert) { + BKE_editmesh_color_free(em); + em->derivedVertColor = MEM_mallocN(sizeof(*em->derivedVertColor) * em->bm->totvert, __func__); + em->derivedVertColorLen = em->bm->totvert; + } + break; + case BM_FACE: + if (em->derivedFaceColorLen != em->bm->totface) { + BKE_editmesh_color_free(em); + em->derivedFaceColor = MEM_mallocN(sizeof(*em->derivedFaceColor) * em->bm->totface, __func__); + em->derivedFaceColorLen = em->bm->totface; + } + break; + default: + BLI_assert(0); + } +} diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index ff384b28293..29396a7edfe 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -528,6 +528,9 @@ Scene *BKE_scene_add(Main *bmain, const char *name) sce->toolsettings->statvis.distort_min = DEG2RADF(5.0f); sce->toolsettings->statvis.distort_max = DEG2RADF(45.0f); + sce->toolsettings->statvis.sharp_min = DEG2RADF(90.0f); + sce->toolsettings->statvis.sharp_max = DEG2RADF(180.0f); + sce->toolsettings->proportional_size = 1.0f; sce->physics_settings.gravity[0] = 0.0f; diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 09835852c0f..07230736124 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -9359,6 +9359,9 @@ static void do_versions(FileData *fd, Library *lib, Main *main) statvis->distort_min = DEG2RADF(5.0f); statvis->distort_max = DEG2RADF(45.0f); + + statvis->sharp_min = DEG2RADF(90.0f); + statvis->sharp_max = DEG2RADF(180.0f); } } diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h index f3809c4090e..e5127e51d13 100644 --- a/source/blender/makesdna/DNA_scene_types.h +++ b/source/blender/makesdna/DNA_scene_types.h @@ -949,6 +949,9 @@ typedef struct MeshStatVis { /* distort */ float distort_min, distort_max; + + /* sharp */ + float sharp_min, sharp_max; } MeshStatVis; @@ -1470,6 +1473,7 @@ typedef struct Scene { #define SCE_STATVIS_THICKNESS 1 #define SCE_STATVIS_INTERSECT 2 #define SCE_STATVIS_DISTORT 3 +#define SCE_STATVIS_SHARP 4 /* toolsettings->particle.selectmode for particles */ #define SCE_SELECT_PATH 1 diff --git a/source/blender/makesrna/intern/rna_mesh.c b/source/blender/makesrna/intern/rna_mesh.c index 56d93cc1d3b..4386ae0cf1d 100644 --- a/source/blender/makesrna/intern/rna_mesh.c +++ b/source/blender/makesrna/intern/rna_mesh.c @@ -129,6 +129,15 @@ static void rna_Mesh_update_data(Main *bmain, Scene *scene, PointerRNA *ptr) } } +static void rna_Mesh_update_statvis(Main *bmain, Scene *scene, PointerRNA *ptr) +{ + Mesh *me = rna_mesh(ptr); + rna_Mesh_update_data(bmain, scene, ptr); + if (me->edit_btmesh) { + BKE_editmesh_color_free(me->edit_btmesh); + } +} + static void rna_Mesh_update_select(Main *bmain, Scene *scene, PointerRNA *ptr) { ID *id = ptr->id.data; @@ -2957,7 +2966,7 @@ static void rna_def_mesh(BlenderRNA *brna) prop = RNA_def_property(srna, "show_statvis", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAW_STATVIS); RNA_def_property_ui_text(prop, "Stat Vis", "Display statistical information about the mesh"); - RNA_def_property_update(prop, 0, "rna_Mesh_update_data"); + RNA_def_property_update(prop, 0, "rna_Mesh_update_statvis"); prop = RNA_def_property(srna, "show_extra_edge_length", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "drawflag", ME_DRAWEXTRA_EDGELEN); diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index 1ff2805f4e2..d5aea5d2585 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -2010,6 +2010,7 @@ static void rna_def_statvis(BlenderRNA *brna) {SCE_STATVIS_THICKNESS, "THICKNESS", 0, "Thickness", ""}, {SCE_STATVIS_INTERSECT, "INTERSECT", 0, "Intersect", ""}, {SCE_STATVIS_DISTORT, "DISTORT", 0, "Distort", ""}, + {SCE_STATVIS_SHARP, "SHARP", 0, "Sharp", ""}, {0, NULL, 0, NULL, NULL}}; srna = RNA_def_struct(brna, "MeshStatVis", NULL); @@ -2069,6 +2070,7 @@ static void rna_def_statvis(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Samples", "Number of samples to test per face"); RNA_def_property_update(prop, 0, "rna_EditMesh_update"); + /* distort */ prop = RNA_def_property(srna, "distort_min", PROP_FLOAT, PROP_ANGLE); RNA_def_property_float_sdna(prop, NULL, "distort_min"); RNA_def_property_float_default(prop, 0.5f); @@ -2084,6 +2086,23 @@ static void rna_def_statvis(BlenderRNA *brna) RNA_def_property_ui_range(prop, 0.0f, DEG2RADF(180.0f), 0.001, 3); RNA_def_property_ui_text(prop, "Distort Max", "Maximum angle to display"); RNA_def_property_update(prop, 0, "rna_EditMesh_update"); + + /* sharp */ + prop = RNA_def_property(srna, "sharp_min", PROP_FLOAT, PROP_ANGLE); + RNA_def_property_float_sdna(prop, NULL, "sharp_min"); + RNA_def_property_float_default(prop, 0.5f); + RNA_def_property_range(prop, -DEG2RADF(180.0f), DEG2RADF(180.0f)); + RNA_def_property_ui_range(prop, -DEG2RADF(180.0f), DEG2RADF(180.0f), 0.001, 3); + RNA_def_property_ui_text(prop, "Distort Min", "Minimum angle to display"); + RNA_def_property_update(prop, 0, "rna_EditMesh_update"); + + prop = RNA_def_property(srna, "sharp_max", PROP_FLOAT, PROP_ANGLE); + RNA_def_property_float_sdna(prop, NULL, "sharp_max"); + RNA_def_property_float_default(prop, 0.5f); + RNA_def_property_range(prop, -DEG2RADF(180.0f), DEG2RADF(180.0f)); + RNA_def_property_ui_range(prop, -DEG2RADF(180.0f), DEG2RADF(180.0f), 0.001, 3); + RNA_def_property_ui_text(prop, "Distort Max", "Maximum angle to display"); + RNA_def_property_update(prop, 0, "rna_EditMesh_update"); } static void rna_def_unit_settings(BlenderRNA *brna) |