From 0940719b5ab3a35b6a3bd0d42b30dfe284550b14 Mon Sep 17 00:00:00 2001 From: Hans Goudey Date: Sun, 27 Nov 2022 22:37:23 -0600 Subject: [PATCH] Line Art: Use local spans for mesh arrays Avoid accessing arrays from the mesh for every element and add safety by using Span instead of raw pointers. Similar to previous commits. --- .../intern/lineart/lineart_cpu.cc | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.cc b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.cc index 8367950eb72..f9967ff3d02 100644 --- a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.cc +++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.cc @@ -1476,6 +1476,7 @@ struct EdgeFeatData { const int *material_indices; blender::Span edges; blender::Span loops; + blender::Span polys; LineartTriangle *tri_array; LineartVert *v_array; float crease_threshold; @@ -1641,13 +1642,11 @@ static void lineart_identify_mlooptri_feature_edges(void *__restrict userdata, } if (!only_contour) { - const MPoly *polys = BKE_mesh_polys(me); - if (ld->conf.use_crease) { bool do_crease = true; if (!ld->conf.force_crease && !e_feat_data->use_auto_smooth && - (polys[mlooptri[f1].poly].flag & ME_SMOOTH) && - (polys[mlooptri[f2].poly].flag & ME_SMOOTH)) { + (e_feat_data->polys[mlooptri[f1].poly].flag & ME_SMOOTH) && + (e_feat_data->polys[mlooptri[f2].poly].flag & ME_SMOOTH)) { do_crease = false; } if (do_crease && (dot_v3v3_db(tri1->gn, tri2->gn) < e_feat_data->crease_threshold)) { @@ -1786,6 +1785,8 @@ static void lineart_triangle_adjacent_assign(LineartTriangle *tri, struct TriData { LineartObjectInfo *ob_info; + blender::Span verts; + blender::Span loops; const MLoopTri *mlooptri; const int *material_indices; LineartVert *vert_arr; @@ -1799,13 +1800,13 @@ static void lineart_load_tri_task(void *__restrict userdata, const TaskParallelTLS *__restrict /*tls*/) { TriData *tri_task_data = (TriData *)userdata; - Mesh *me = tri_task_data->ob_info->original_me; LineartObjectInfo *ob_info = tri_task_data->ob_info; + const blender::Span verts = tri_task_data->verts; + const blender::Span loops = tri_task_data->loops; const MLoopTri *mlooptri = &tri_task_data->mlooptri[i]; const int *material_indices = tri_task_data->material_indices; LineartVert *vert_arr = tri_task_data->vert_arr; LineartTriangle *tri = tri_task_data->tri_arr; - const MLoop *loops = BKE_mesh_loops(me); tri = (LineartTriangle *)(((uchar *)tri) + tri_task_data->lineart_triangle_size * i); @@ -1838,7 +1839,6 @@ static void lineart_load_tri_task(void *__restrict userdata, double gn[3]; float no[3]; - const MVert *verts = BKE_mesh_verts(me); normal_tri_v3(no, verts[v1].co, verts[v2].co, verts[v3].co); copy_v3db_v3fl(gn, no); mul_v3_mat3_m4v3_db(tri->gn, ob_info->normal, gn); @@ -2044,6 +2044,7 @@ static void lineart_geometry_object_load(LineartObjectInfo *ob_info, TriData tri_data; tri_data.ob_info = ob_info; tri_data.mlooptri = mlooptri; + tri_data.verts = me->verts(); tri_data.material_indices = material_indices; tri_data.vert_arr = la_v_arr; tri_data.tri_arr = la_tri_arr; @@ -2074,6 +2075,7 @@ static void lineart_geometry_object_load(LineartObjectInfo *ob_info, edge_feat_data.mlooptri = mlooptri; edge_feat_data.material_indices = material_indices; edge_feat_data.edges = me->edges(); + edge_feat_data.polys = me->polys(); edge_feat_data.loops = me->loops(); edge_feat_data.edge_nabr = lineart_build_edge_neighbor(me, total_edges); edge_feat_data.tri_array = la_tri_arr;