diff options
author | Campbell Barton <ideasman42@gmail.com> | 2018-10-08 04:18:45 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2018-10-08 04:18:45 +0300 |
commit | 215c23590aa7ea0cbb113d75c32ccf57ffee3fd3 (patch) | |
tree | 3d0efb401388c44413ca22986a05dc130849edb3 | |
parent | df82d35cebb32469695e806c49689b4f22949a8f (diff) |
Edit Mesh: use deformed mesh w/ face-dot & normals
-rw-r--r-- | source/blender/draw/intern/draw_cache_impl_mesh.c | 32 |
1 files changed, 28 insertions, 4 deletions
diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c index b2ec0632db2..4fe7a32a824 100644 --- a/source/blender/draw/intern/draw_cache_impl_mesh.c +++ b/source/blender/draw/intern/draw_cache_impl_mesh.c @@ -48,6 +48,7 @@ #include "BKE_customdata.h" #include "BKE_deform.h" #include "BKE_editmesh.h" +#include "BKE_editmesh_cache.h" #include "BKE_editmesh_tangent.h" #include "BKE_mesh.h" #include "BKE_mesh_tangent.h" @@ -972,8 +973,17 @@ static void mesh_render_data_ensure_poly_normals_pack(MeshRenderData *rdata) int i; pnors_pack = rdata->poly_normals_pack = MEM_mallocN(sizeof(*pnors_pack) * rdata->poly_len, __func__); - BM_ITER_MESH_INDEX(efa, &fiter, bm, BM_FACES_OF_MESH, i) { - pnors_pack[i] = GPU_normal_convert_i10_v3(efa->no); + if (rdata->edit_data && rdata->edit_data->vertexCos != NULL) { + BKE_editmesh_cache_ensure_poly_normals(rdata->edit_bmesh, rdata->edit_data); + const float (*pnors)[3] = rdata->edit_data->polyNos; + for (i = 0; i < bm->totface; i++) { + pnors_pack[i] = GPU_normal_convert_i10_v3(pnors[i]); + } + } + else { + BM_ITER_MESH_INDEX(efa, &fiter, bm, BM_FACES_OF_MESH, i) { + pnors_pack[i] = GPU_normal_convert_i10_v3(efa->no); + } } } else { @@ -1213,8 +1223,14 @@ static bool mesh_render_data_pnors_pcenter_select_get( if (BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) { return false; } - BM_face_calc_center_mean(efa, r_center); - copy_v3_v3(r_pnors, efa->no); + if (rdata->edit_data && rdata->edit_data->vertexCos) { + copy_v3_v3(r_center, rdata->edit_data->polyCos[poly]); + copy_v3_v3(r_pnors, rdata->edit_data->polyNos[poly]); + } + else { + BM_face_calc_center_mean(efa, r_center); + copy_v3_v3(r_pnors, efa->no); + } *r_selected = (BM_elem_flag_test(efa, BM_ELEM_SELECT) != 0) ? true : false; } else { @@ -2513,6 +2529,14 @@ static GPUVertBuf *mesh_batch_cache_get_facedot_pos_with_normals_and_flag( GPUVertBuf *vbo = cache->ed_fcenter_pos_with_nor_and_sel = GPU_vertbuf_create_with_format(&format); GPU_vertbuf_data_alloc(vbo, vbo_len_capacity); + + if (rdata->edit_bmesh) { + if (rdata->edit_data && rdata->edit_data->vertexCos != NULL) { + BKE_editmesh_cache_ensure_poly_normals(rdata->edit_bmesh, rdata->edit_data); + BKE_editmesh_cache_ensure_poly_centers(rdata->edit_bmesh, rdata->edit_data); + } + } + for (int i = 0; i < vbo_len_capacity; ++i) { float pcenter[3], pnor[3]; bool selected = false; |