diff options
author | Campbell Barton <ideasman42@gmail.com> | 2013-04-18 08:24:18 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2013-04-18 08:24:18 +0400 |
commit | 8a06acfd7af8800f274e1c4712de1d129ef63e58 (patch) | |
tree | 8883f0215dd6fb2e812696f54cd47ecdc31522d5 /source/blender/blenkernel/intern | |
parent | e7895abb327feda219749120563c50093a4528ff (diff) |
add mesh distort display mode (highlights distorted faces)
Diffstat (limited to 'source/blender/blenkernel/intern')
-rw-r--r-- | source/blender/blenkernel/intern/editderivedmesh.c | 87 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/editmesh_bvh.c | 4 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/scene.c | 2 |
3 files changed, 85 insertions, 8 deletions
diff --git a/source/blender/blenkernel/intern/editderivedmesh.c b/source/blender/blenkernel/intern/editderivedmesh.c index eda8957bb1b..c9e8cd2e249 100644 --- a/source/blender/blenkernel/intern/editderivedmesh.c +++ b/source/blender/blenkernel/intern/editderivedmesh.c @@ -1556,7 +1556,7 @@ static void axis_from_enum_v3(float v[3], const char axis) static void statvis_calc_overhang( BMEditMesh *em, - float (*polyNos)[3], + const float (*polyNos)[3], /* values for calculating */ const float min, const float max, const char axis, /* result */ @@ -1616,7 +1616,7 @@ static void uv_from_jitter_v2(float uv[2]) static void statvis_calc_thickness( BMEditMesh *em, - float (*vertexCos)[3], + const float (*vertexCos)[3], /* values for calculating */ const float min, const float max, const int samples, /* result */ @@ -1732,7 +1732,7 @@ static void statvis_calc_thickness( static void statvis_calc_intersect( BMEditMesh *em, - float (*vertexCos)[3], + const float (*vertexCos)[3], /* result */ unsigned char (*r_face_colors)[4]) { @@ -1797,6 +1797,72 @@ static void statvis_calc_intersect( BKE_bmbvh_free(bmtree); } +static void statvis_calc_distort( + BMEditMesh *em, + const float (*vertexCos)[3], + /* values for calculating */ + const float min, const float max, + /* result */ + unsigned char (*r_face_colors)[4]) +{ + BMIter iter; + BMesh *bm = em->bm; + BMFace *f; + float f_no[3]; + int index; + const float minmax_irange = 1.0f / (max - min); + + /* fallback */ + const char col_fallback[4] = {64, 64, 64, 255}; + + /* now convert into global space */ + BM_ITER_MESH_INDEX (f, &iter, bm, BM_FACES_OF_MESH, index) { + float fac; + + if (f->len == 3) { + fac = -1.0f; + } + else { + BMLoop *l_iter, *l_first; + if (vertexCos) { + BM_face_normal_update_vcos(bm, f, f_no, vertexCos); + } + else { + copy_v3_v3(f_no, f->no); + } + + fac = 0.0f; + l_iter = l_first = BM_FACE_FIRST_LOOP(f); + do { + float no_corner[3]; + if (vertexCos) { + normal_tri_v3(no_corner, + vertexCos[BM_elem_index_get(l_iter->prev->v)], + vertexCos[BM_elem_index_get(l_iter->v)], + vertexCos[BM_elem_index_get(l_iter->next->v)]); + } + else { + BM_loop_calc_face_normal(l_iter, no_corner); + } + fac = max_ff(fac, angle_normalized_v3v3(f_no, no_corner)); + } while ((l_iter = l_iter->next) != l_first); + fac /= (float)M_1_PI; + } + + /* remap */ + 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_face_colors[index], fcol); + } + else { + copy_v4_v4_char((char *)r_face_colors[index], (const char *)col_fallback); + } + } +} + void BKE_editmesh_statvis_calc(BMEditMesh *em, DerivedMesh *dm, MeshStatVis *statvis, unsigned char (*r_face_colors)[4]) @@ -1808,7 +1874,7 @@ void BKE_editmesh_statvis_calc(BMEditMesh *em, DerivedMesh *dm, case SCE_STATVIS_OVERHANG: { statvis_calc_overhang( - em, bmdm ? bmdm->polyNos : NULL, + em, bmdm ? (const float (*)[3])bmdm->polyNos : NULL, statvis->overhang_min / (float)M_PI, statvis->overhang_max / (float)M_PI, statvis->overhang_axis, @@ -1819,7 +1885,7 @@ void BKE_editmesh_statvis_calc(BMEditMesh *em, DerivedMesh *dm, { const float scale = 1.0f / mat4_to_scale(em->ob->obmat); statvis_calc_thickness( - em, bmdm ? bmdm->vertexCos : NULL, + em, bmdm ? (const float (*)[3])bmdm->vertexCos : NULL, statvis->thickness_min * scale, statvis->thickness_max * scale, statvis->thickness_samples, @@ -1829,10 +1895,19 @@ void BKE_editmesh_statvis_calc(BMEditMesh *em, DerivedMesh *dm, case SCE_STATVIS_INTERSECT: { statvis_calc_intersect( - em, bmdm ? bmdm->vertexCos : NULL, + em, bmdm ? (const float (*)[3])bmdm->vertexCos : NULL, r_face_colors); break; } + case SCE_STATVIS_DISTORT: + { + statvis_calc_distort( + em, bmdm ? (const float (*)[3])bmdm->vertexCos : NULL, + statvis->distort_min / (float)M_PI, + statvis->distort_max / (float)M_PI, + r_face_colors); + break; + } } } diff --git a/source/blender/blenkernel/intern/editmesh_bvh.c b/source/blender/blenkernel/intern/editmesh_bvh.c index 27fb1798e7c..14e6eedec7c 100644 --- a/source/blender/blenkernel/intern/editmesh_bvh.c +++ b/source/blender/blenkernel/intern/editmesh_bvh.c @@ -47,13 +47,13 @@ struct BMBVHTree { BMEditMesh *em; BMesh *bm; - float (*cos_cage)[3]; + const float (*cos_cage)[3]; bool cos_cage_free; int flag; }; -BMBVHTree *BKE_bmbvh_new(BMEditMesh *em, int flag, float (*cos_cage)[3], const bool cos_cage_free) +BMBVHTree *BKE_bmbvh_new(BMEditMesh *em, int flag, const float (*cos_cage)[3], const bool cos_cage_free) { /* could become argument */ const float epsilon = FLT_EPSILON * 2.0f; diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index 86dbc2a36b3..ff384b28293 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -525,6 +525,8 @@ Scene *BKE_scene_add(Main *bmain, const char *name) sce->toolsettings->statvis.overhang_max = DEG2RADF(45.0f); sce->toolsettings->statvis.thickness_max = 0.1f; sce->toolsettings->statvis.thickness_samples = 1; + sce->toolsettings->statvis.distort_min = DEG2RADF(5.0f); + sce->toolsettings->statvis.distort_max = DEG2RADF(45.0f); sce->toolsettings->proportional_size = 1.0f; |