diff options
Diffstat (limited to 'source/blender/draw')
8 files changed, 22 insertions, 20 deletions
diff --git a/source/blender/draw/intern/draw_cache_extract_mesh_render_data.c b/source/blender/draw/intern/draw_cache_extract_mesh_render_data.c index 8b0fbf86360..df1758fc1a2 100644 --- a/source/blender/draw/intern/draw_cache_extract_mesh_render_data.c +++ b/source/blender/draw/intern/draw_cache_extract_mesh_render_data.c @@ -379,14 +379,15 @@ void mesh_render_data_update_normals(MeshRenderData *mr, const eMRDataType data_ if (mr->extract_type != MR_EXTRACT_BMESH) { /* Mesh */ + mr->vert_normals = BKE_mesh_vertex_normals_ensure(mr->me); if (data_flag & (MR_DATA_POLY_NOR | MR_DATA_LOOP_NOR | MR_DATA_TAN_LOOP_NOR)) { - BKE_mesh_ensure_normals_for_display(mr->me); - mr->poly_normals = CustomData_get_layer(&mr->me->pdata, CD_NORMAL); + mr->poly_normals = BKE_mesh_poly_normals_ensure(mr->me); } if (((data_flag & MR_DATA_LOOP_NOR) && is_auto_smooth) || (data_flag & MR_DATA_TAN_LOOP_NOR)) { mr->loop_normals = MEM_mallocN(sizeof(*mr->loop_normals) * mr->loop_len, __func__); short(*clnors)[2] = CustomData_get_layer(&mr->me->ldata, CD_CUSTOMLOOPNORMAL); BKE_mesh_normals_loop_split(mr->me->mvert, + mr->vert_normals, mr->vert_len, mr->me->medge, mr->edge_len, diff --git a/source/blender/draw/intern/draw_cache_impl_subdivision.cc b/source/blender/draw/intern/draw_cache_impl_subdivision.cc index 372566a8f90..6eb1fbf26fa 100644 --- a/source/blender/draw/intern/draw_cache_impl_subdivision.cc +++ b/source/blender/draw/intern/draw_cache_impl_subdivision.cc @@ -23,6 +23,7 @@ #include "DNA_scene_types.h" #include "BKE_editmesh.h" +#include "BKE_mesh.h" #include "BKE_modifier.h" #include "BKE_object.h" #include "BKE_scene.h" @@ -1668,6 +1669,7 @@ void draw_subdiv_init_mesh_render_data(DRWSubdivCache *cache, mr->mvert = mesh->mvert; mr->mpoly = mesh->mpoly; mr->mloop = mesh->mloop; + mr->vert_normals = BKE_mesh_vertex_normals_ensure(mesh); mr->vert_len = mesh->totvert; mr->edge_len = mesh->totedge; mr->poly_len = mesh->totpoly; diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh.h b/source/blender/draw/intern/mesh_extractors/extract_mesh.h index 2db8f721e76..7c6f4dea6c9 100644 --- a/source/blender/draw/intern/mesh_extractors/extract_mesh.h +++ b/source/blender/draw/intern/mesh_extractors/extract_mesh.h @@ -100,8 +100,9 @@ typedef struct MeshRenderData { BMFace *efa_act_uv; /* Data created on-demand (usually not for #BMesh based data). */ MLoopTri *mlooptri; + const float (*vert_normals)[3]; + const float (*poly_normals)[3]; float (*loop_normals)[3]; - float (*poly_normals)[3]; int *lverts, *ledges; struct { diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edge_fac.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edge_fac.cc index 5ee34d7fdb2..8470a71059f 100644 --- a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edge_fac.cc +++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edge_fac.cc @@ -149,9 +149,8 @@ static void extract_edge_fac_iter_poly_mesh(const MeshRenderData *mr, const MLoop *ml_next = &mr->mloop[ml_index_other]; const MVert *v1 = &mr->mvert[ml->v]; const MVert *v2 = &mr->mvert[ml_next->v]; - float vnor_f[3]; - normal_short_to_float_v3(vnor_f, v1->no); - float ratio = loop_edge_factor_get(mr->poly_normals[mp_index], v1->co, vnor_f, v2->co); + float ratio = loop_edge_factor_get( + mr->poly_normals[mp_index], v1->co, mr->vert_normals[ml->v], v2->co); data->vbo_data[ml_index] = ratio * 253 + 1; } else { diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_lnor.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_lnor.cc index d30c38ef050..93b94b210b2 100644 --- a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_lnor.cc +++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_lnor.cc @@ -87,7 +87,7 @@ static void extract_lnor_iter_poly_mesh(const MeshRenderData *mr, *lnor_data = GPU_normal_convert_i10_v3(mr->loop_normals[ml_index]); } else if (mp->flag & ME_SMOOTH) { - *lnor_data = GPU_normal_convert_i10_s3(mr->mvert[ml->v].no); + *lnor_data = GPU_normal_convert_i10_v3(mr->vert_normals[ml->v]); } else { *lnor_data = GPU_normal_convert_i10_v3(mr->poly_normals[mp_index]); @@ -210,7 +210,7 @@ static void extract_lnor_hq_iter_poly_mesh(const MeshRenderData *mr, normal_float_to_short_v3(&lnor_data->x, mr->loop_normals[ml_index]); } else if (mp->flag & ME_SMOOTH) { - copy_v3_v3_short(&lnor_data->x, mr->mvert[ml->v].no); + normal_float_to_short_v3(&lnor_data->x, mr->vert_normals[ml->v]); } else { normal_float_to_short_v3(&lnor_data->x, mr->poly_normals[mp_index]); diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_mesh_analysis.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_mesh_analysis.cc index 33a33c81bc2..706c6ad5403 100644 --- a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_mesh_analysis.cc +++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_mesh_analysis.cc @@ -460,7 +460,7 @@ static void statvis_calc_distort(const MeshRenderData *mr, float *r_distort) float fac = -1.0f; if (mp->totloop > 3) { - float *f_no = mr->poly_normals[mp_index]; + const float *f_no = mr->poly_normals[mp_index]; fac = 0.0f; for (int i = 1; i <= mp->totloop; i++) { @@ -555,7 +555,7 @@ static void statvis_calc_sharp(const MeshRenderData *mr, float *r_sharp) void **pval; bool value_is_init = BLI_edgehash_ensure_p(eh, l_curr->v, l_next->v, &pval); if (!value_is_init) { - *pval = mr->poly_normals[mp_index]; + *pval = (void *)mr->poly_normals[mp_index]; /* non-manifold edge, yet... */ continue; } diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_pos_nor.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_pos_nor.cc index 00ed4ca6359..5d2ea923658 100644 --- a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_pos_nor.cc +++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_pos_nor.cc @@ -74,9 +74,8 @@ static void extract_pos_nor_init(const MeshRenderData *mr, } } else { - const MVert *mv = mr->mvert; - for (int v = 0; v < mr->vert_len; v++, mv++) { - data->normals[v].low = GPU_normal_convert_i10_s3(mv->no); + for (int v = 0; v < mr->vert_len; v++) { + data->normals[v].low = GPU_normal_convert_i10_v3(mr->vert_normals[v]); } } } @@ -255,7 +254,7 @@ static void extract_pos_nor_init_subdiv(const DRWSubdivCache *subdiv_cache, } static void extract_pos_nor_loose_geom_subdiv(const DRWSubdivCache *subdiv_cache, - const MeshRenderData *UNUSED(mr), + const MeshRenderData *mr, const MeshExtractLooseGeom *loose_geom, void *buffer, void *UNUSED(data)) @@ -285,11 +284,11 @@ static void extract_pos_nor_loose_geom_subdiv(const DRWSubdivCache *subdiv_cache const MVert *loose_vert2 = &coarse_verts[loose_edge->v2]; copy_v3_v3(edge_data[0].pos, loose_vert1->co); - normal_short_to_float_v3(edge_data[0].nor, loose_vert1->no); + copy_v3_v3(edge_data[0].nor, mr->vert_normals[loose_edge->v1]); edge_data[0].flag = 0.0f; copy_v3_v3(edge_data[1].pos, loose_vert2->co); - normal_short_to_float_v3(edge_data[1].nor, loose_vert2->no); + copy_v3_v3(edge_data[1].nor, mr->vert_normals[loose_edge->v2]); edge_data[1].flag = 0.0f; GPU_vertbuf_update_sub( @@ -304,7 +303,7 @@ static void extract_pos_nor_loose_geom_subdiv(const DRWSubdivCache *subdiv_cache const MVert *loose_vertex = &coarse_verts[loose_geom->verts[i]]; copy_v3_v3(vert_data.pos, loose_vertex->co); - normal_short_to_float_v3(vert_data.nor, loose_vertex->no); + copy_v3_v3(vert_data.nor, mr->vert_normals[loose_geom->verts[i]]); GPU_vertbuf_update_sub( vbo, offset * sizeof(SubdivPosNorLoop), sizeof(SubdivPosNorLoop), &vert_data); @@ -380,9 +379,8 @@ static void extract_pos_nor_hq_init(const MeshRenderData *mr, } } else { - const MVert *mv = mr->mvert; - for (int v = 0; v < mr->vert_len; v++, mv++) { - copy_v3_v3_short(data->normals[v].high, mv->no); + for (int v = 0; v < mr->vert_len; v++) { + normal_float_to_short_v3(data->normals[v].high, mr->vert_normals[v]); } } } diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_tan.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_tan.cc index 7a3b2cf49ff..03d1b327689 100644 --- a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_tan.cc +++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_tan.cc @@ -138,6 +138,7 @@ static void extract_tan_ex_init(const MeshRenderData *mr, calc_active_tangent, tangent_names, tan_len, + mr->vert_normals, mr->poly_normals, mr->loop_normals, orco, |