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.
This commit is contained in:
2022-11-27 22:37:23 -06:00
parent baba5d2214
commit 0940719b5a

View File

@@ -1476,6 +1476,7 @@ struct EdgeFeatData {
const int *material_indices; const int *material_indices;
blender::Span<MEdge> edges; blender::Span<MEdge> edges;
blender::Span<MLoop> loops; blender::Span<MLoop> loops;
blender::Span<MPoly> polys;
LineartTriangle *tri_array; LineartTriangle *tri_array;
LineartVert *v_array; LineartVert *v_array;
float crease_threshold; float crease_threshold;
@@ -1641,13 +1642,11 @@ static void lineart_identify_mlooptri_feature_edges(void *__restrict userdata,
} }
if (!only_contour) { if (!only_contour) {
const MPoly *polys = BKE_mesh_polys(me);
if (ld->conf.use_crease) { if (ld->conf.use_crease) {
bool do_crease = true; bool do_crease = true;
if (!ld->conf.force_crease && !e_feat_data->use_auto_smooth && if (!ld->conf.force_crease && !e_feat_data->use_auto_smooth &&
(polys[mlooptri[f1].poly].flag & ME_SMOOTH) && (e_feat_data->polys[mlooptri[f1].poly].flag & ME_SMOOTH) &&
(polys[mlooptri[f2].poly].flag & ME_SMOOTH)) { (e_feat_data->polys[mlooptri[f2].poly].flag & ME_SMOOTH)) {
do_crease = false; do_crease = false;
} }
if (do_crease && (dot_v3v3_db(tri1->gn, tri2->gn) < e_feat_data->crease_threshold)) { 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 { struct TriData {
LineartObjectInfo *ob_info; LineartObjectInfo *ob_info;
blender::Span<MVert> verts;
blender::Span<MLoop> loops;
const MLoopTri *mlooptri; const MLoopTri *mlooptri;
const int *material_indices; const int *material_indices;
LineartVert *vert_arr; LineartVert *vert_arr;
@@ -1799,13 +1800,13 @@ static void lineart_load_tri_task(void *__restrict userdata,
const TaskParallelTLS *__restrict /*tls*/) const TaskParallelTLS *__restrict /*tls*/)
{ {
TriData *tri_task_data = (TriData *)userdata; TriData *tri_task_data = (TriData *)userdata;
Mesh *me = tri_task_data->ob_info->original_me;
LineartObjectInfo *ob_info = tri_task_data->ob_info; LineartObjectInfo *ob_info = tri_task_data->ob_info;
const blender::Span<MVert> verts = tri_task_data->verts;
const blender::Span<MLoop> loops = tri_task_data->loops;
const MLoopTri *mlooptri = &tri_task_data->mlooptri[i]; const MLoopTri *mlooptri = &tri_task_data->mlooptri[i];
const int *material_indices = tri_task_data->material_indices; const int *material_indices = tri_task_data->material_indices;
LineartVert *vert_arr = tri_task_data->vert_arr; LineartVert *vert_arr = tri_task_data->vert_arr;
LineartTriangle *tri = tri_task_data->tri_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); 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]; double gn[3];
float no[3]; float no[3];
const MVert *verts = BKE_mesh_verts(me);
normal_tri_v3(no, verts[v1].co, verts[v2].co, verts[v3].co); normal_tri_v3(no, verts[v1].co, verts[v2].co, verts[v3].co);
copy_v3db_v3fl(gn, no); copy_v3db_v3fl(gn, no);
mul_v3_mat3_m4v3_db(tri->gn, ob_info->normal, gn); 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; TriData tri_data;
tri_data.ob_info = ob_info; tri_data.ob_info = ob_info;
tri_data.mlooptri = mlooptri; tri_data.mlooptri = mlooptri;
tri_data.verts = me->verts();
tri_data.material_indices = material_indices; tri_data.material_indices = material_indices;
tri_data.vert_arr = la_v_arr; tri_data.vert_arr = la_v_arr;
tri_data.tri_arr = la_tri_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.mlooptri = mlooptri;
edge_feat_data.material_indices = material_indices; edge_feat_data.material_indices = material_indices;
edge_feat_data.edges = me->edges(); edge_feat_data.edges = me->edges();
edge_feat_data.polys = me->polys();
edge_feat_data.loops = me->loops(); edge_feat_data.loops = me->loops();
edge_feat_data.edge_nabr = lineart_build_edge_neighbor(me, total_edges); edge_feat_data.edge_nabr = lineart_build_edge_neighbor(me, total_edges);
edge_feat_data.tri_array = la_tri_arr; edge_feat_data.tri_array = la_tri_arr;