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:
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user