Commit: 58511c4175f6a505d53034809010db60e335401c Author: YimingWu Date: Thu Apr 7 09:07:55 2022 +0800 Branches: lineart-object-load https://developer.blender.org/rB58511c4175f6a505d53034809010db60e335401c
LineArt: Face mark filtering for new object loading code. =================================================================== M source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c M source/blender/makesdna/DNA_lineart_types.h =================================================================== diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c index afcde2c3a7f..3419fa4e224 100644 --- a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c +++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c @@ -1498,6 +1498,8 @@ typedef struct EdgeFeatData { float crease_threshold; float **poly_normals; bool use_auto_smooth; + bool use_freestyle_face; + int freestyle_face_index; } EdgeFeatData; typedef struct EdgeFeatReduceData { @@ -1520,127 +1522,151 @@ static void lineart_identify_mlooptri_feature_edges(void *__restrict userdata, EdgeFeatData *e_feat_data = (EdgeFeatData *)userdata; EdgeFacePair *e_f_pair = &e_feat_data->edge_pair_arr[i]; EdgeFeatReduceData *reduce_data = (EdgeFeatReduceData *)tls->userdata_chunk; - /* Mesh boundary */ - if (e_f_pair->f2 == -1) { - e_f_pair->eflag = LRT_EDGE_FLAG_CONTOUR; - reduce_data->feat_edges += 1; + Mesh *me = e_feat_data->me; + const MLoopTri *mlooptri = e_feat_data->mlooptri; + + uint16_t edge_flag_result = 0; + + FreestyleEdge *fel, *fer; + bool face_mark_filtered = false; + bool enable_face_mark = (e_feat_data->use_freestyle_face && e_feat_data->rb->filter_face_mark); + bool only_contour = false; + if (enable_face_mark) { + int index = e_feat_data->freestyle_face_index; + if (index > -1) { + fel = &((FreestyleEdge *)me->pdata.layers[index].data)[mlooptri[e_f_pair->f1].poly]; + } + if (e_f_pair->f2 != -1) { + fer = &((FreestyleEdge *)me->pdata.layers[index].data)[mlooptri[e_f_pair->f2].poly]; + } + else { + /* Handles mesh boundary case */ + fer = fel; + } + if (e_feat_data->rb->filter_face_mark_boundaries ^ e_feat_data->rb->filter_face_mark_invert) { + if ((fel->flag & FREESTYLE_FACE_MARK) || (fer->flag & FREESTYLE_FACE_MARK)) { + face_mark_filtered = true; + } + } + else { + if ((fel->flag & FREESTYLE_FACE_MARK) && (fer->flag & FREESTYLE_FACE_MARK) && (fer != fel)) { + face_mark_filtered = true; + } + } + if (e_feat_data->rb->filter_face_mark_invert) { + face_mark_filtered = !face_mark_filtered; + } + if (!face_mark_filtered) { + e_f_pair->eflag = LRT_EDGE_FLAG_INHIBIT; + if (e_feat_data->rb->filter_face_mark_keep_contour) { + only_contour = true; + } + } + } + + if (enable_face_mark && !face_mark_filtered && !only_contour) { return; } + else { - LineartTriangle *tri1, *tri2; - LineartVert *vert; - LineartRenderBuffer *rb = e_feat_data->rb; + /* Mesh boundary */ + if (e_f_pair->f2 == -1) { + e_f_pair->eflag = LRT_EDGE_FLAG_CONTOUR; + reduce_data->feat_edges += 1; + return; + } - /* The mesh should already be triangulated now, so we can assume each face is a triangle. */ - tri1 = lineart_triangle_from_index(rb, e_feat_data->tri_array, e_f_pair->f1); - tri2 = lineart_triangle_from_index(rb, e_feat_data->tri_array, e_f_pair->f2); + LineartTriangle *tri1, *tri2; + LineartVert *vert; + LineartRenderBuffer *rb = e_feat_data->rb; - vert = &e_feat_data->v_array[e_f_pair->v1]; + /* The mesh should already be triangulated now, so we can assume each face is a triangle. */ + tri1 = lineart_triangle_from_index(rb, e_feat_data->tri_array, e_f_pair->f1); + tri2 = lineart_triangle_from_index(rb, e_feat_data->tri_array, e_f_pair->f2); - double vv[3]; - double *view_vector = vv; - double dot_1 = 0, dot_2 = 0; - double result; + vert = &e_feat_data->v_array[e_f_pair->v1]; - if (rb->cam_is_persp) { - sub_v3_v3v3_db(view_vector, vert->gloc, rb->camera_pos); - } - else { - view_vector = rb->view_vector; - } + double vv[3]; + double *view_vector = vv; + double dot_1 = 0, dot_2 = 0; + double result; - dot_1 = dot_v3v3_db(view_vector, tri1->gn); - dot_2 = dot_v3v3_db(view_vector, tri2->gn); - uint16_t edge_flag_result = 0; + if (rb->cam_is_persp) { + sub_v3_v3v3_db(view_vector, vert->gloc, rb->camera_pos); + } + else { + view_vector = rb->view_vector; + } - if ((result = dot_1 * dot_2) <= 0 && (dot_1 + dot_2)) { - edge_flag_result |= LRT_EDGE_FLAG_CONTOUR; - } + dot_1 = dot_v3v3_db(view_vector, tri1->gn); + dot_2 = dot_v3v3_db(view_vector, tri2->gn); - Mesh *me = e_feat_data->me; - const MLoopTri *mlooptri = e_feat_data->mlooptri; + if ((result = dot_1 * dot_2) <= 0 && (dot_1 + dot_2)) { + edge_flag_result |= LRT_EDGE_FLAG_CONTOUR; + } - if (rb->use_crease) { - bool do_crease = true; - if (!rb->force_crease && !e_feat_data->use_auto_smooth && - (me->mpoly[mlooptri[e_f_pair->f1].poly].flag & ME_SMOOTH) && - (me->mpoly[mlooptri[e_f_pair->f2].poly].flag & ME_SMOOTH)) { - do_crease = false; + if (!only_contour) { + + if (rb->use_crease) { + bool do_crease = true; + if (!rb->force_crease && !e_feat_data->use_auto_smooth && + (me->mpoly[mlooptri[e_f_pair->f1].poly].flag & ME_SMOOTH) && + (me->mpoly[mlooptri[e_f_pair->f2].poly].flag & ME_SMOOTH)) { + do_crease = false; + } + if (do_crease && (dot_v3v3_db(tri1->gn, tri2->gn) < e_feat_data->crease_threshold)) { + edge_flag_result |= LRT_EDGE_FLAG_CREASE; + } + } + + int mat1 = me->mpoly[mlooptri[e_f_pair->f1].poly].mat_nr; + int mat2 = me->mpoly[mlooptri[e_f_pair->f2].poly].mat_nr; + + if (rb->use_material && mat1 != mat2) { + edge_flag_result |= LRT_EDGE_FLAG_MATERIAL; + } } - if (do_crease && (dot_v3v3_db(tri1->gn, tri2->gn) < e_feat_data->crease_threshold)) { - edge_flag_result |= LRT_EDGE_FLAG_CREASE; + else { /* only_contour */ + if (!edge_flag_result) { /* Other edge types inhibited */ + return; + } } - } - int mat1 = me->mpoly[mlooptri[e_f_pair->f1].poly].mat_nr; - int mat2 = me->mpoly[mlooptri[e_f_pair->f2].poly].mat_nr; - - if (rb->use_material && mat1 != mat2) { - edge_flag_result |= LRT_EDGE_FLAG_MATERIAL; - } - e_f_pair->eflag = edge_flag_result; + e_f_pair->eflag = edge_flag_result; - if (edge_flag_result) { - /* Only allocate for feature edge (instead of all edges) to save memory. - * If allow duplicated edges, one edge gets added multiple times if it has multiple types. - */ - reduce_data->feat_edges += rb->allow_duplicated_types ? - lineart_edge_type_duplication_count(edge_flag_result) : - 1; + if (edge_flag_result) { + /* Only allocate for feature edge (instead of all edges) to save memory. + * If allow duplicated edges, one edge gets added multiple times if it has multiple types. + */ + reduce_data->feat_edges += e_feat_data->rb->allow_duplicated_types ? + lineart_edge_type_duplication_count(edge_flag_result) : + 1; + } } } -static uint16_t lineart_identify_medge_feature_edges(LineartRenderBuffer *rb, - MEdge *medge, - bool use_freestyle_face, - bool use_freestyle_edge) +static uint16_t lineart_identify_medge_feature_edges( + LineartRenderBuffer *rb, Mesh *me, int edge_index, MEdge *medge, int freestyle_edge_cdindex) { if (medge->flag & ME_LOOSEEDGE) { return LRT_EDGE_FLAG_LOOSE; } - FreestyleEdge *fel, *fer; - bool face_mark_filtered = false; uint16_t edge_flag_result = 0; if (rb->use_crease && rb->sharp_as_crease && (medge->flag & ME_SHARP)) { edge_flag_result |= LRT_EDGE_FLAG_CREASE; } - // if (use_freestyle_face && rb->filter_face_mark) { - // fel = CustomData_bmesh_get(&bm_if_freestyle->pdata, ll->f->head.data, CD_FREESTYLE_FACE); - // if (ll != lr && lr) { - // fer = CustomData_bmesh_get(&bm_if_freestyle->pdata, lr->f->head.data, CD_FREESTYLE_FACE); - // } - // else { - // /* Handles mesh boundary case */ - // fer = fel; - // } - // if (rb->filter_face_mark_boundaries ^ rb->filter_face_mark_invert) { - // if ((fel->flag & FREESTYLE_FACE_MARK) || (fer->flag & FREESTYLE_FACE_MARK)) { - // face_mark_filtered = true; - // } - // } - // else { - // if ((fel->flag & FREESTYLE_FACE_MARK) && (fer->flag & FREESTYLE_FACE_MARK) && (fer != - // fel)) { - // face_mark_filtered = true; - // } - // } - // if (rb->filter_face_mark_invert) { - // face_mark_filtered = !face_mark_filtered; - // } - // if (!face_mark_filtered) { - // return 0; - // } - // } - // if (use_freestyle_edge && rb->use_edge_marks) { - // FreestyleEdge *fe; - // fe = CustomData_bmesh_get(&bm_if_freestyle->edata, e->head.data, CD_FREESTYLE_EDGE); - // if (fe->flag & FREESTYLE_EDGE_MARK) { - // edge_flag_result |= LRT_EDGE_FLAG_EDGE_MARK; - // } - // } + if (rb->use_edge_marks && (freestyle_edge_cdindex > -1)) { + FreestyleEdge *fe; + int index = freestyle_edge_cdindex; + fe = &((FreestyleEdge *)me->edata.layers[index].data)[edge_index]; + if (fe->flag & FREESTYLE_EDGE_MARK) { + edge_flag_result |= LRT_EDGE_FLAG_EDGE_MARK; + } + } + return edge_flag_result; } @@ -2242,7 +2268,11 @@ static void lineart_geometry_object_load_no_bmesh(LineartObjectInfo *ob_info, edge_feat_data.v_array = la_v_arr; edge_feat_data.crease_threshold = use_crease; edge_feat_data.use_auto_smooth = use_auto_smooth; - // edge_feat_data.poly_normals = normals; + edge_feat_data.use_freestyle_face = CustomData_has_layer(&me->pdata, CD_FREESTYLE_FACE); + if (edge_feat_data.use_freestyle_face) { + edge_feat_data.freestyle_face_index = CustomData_get_layer_index(&me->pdata, + CD_FREESTYLE_FACE); + } BLI_task_parallel_range(0, edge_pair_arr_len, @@ -2262,7 +2292,13 @@ static void lineart_geometry_object_load_no_bmesh(LineartObjectInfo *ob_info, for (int i = 0; i < me-> @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs