[Bf-blender-cvs] [58511c4175f] lineart-object-load: LineArt: Face mark filtering for new object loading code.
YimingWu
noreply at git.blender.org
Wed Apr 20 16:12:59 CEST 2022
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. @@
More information about the Bf-blender-cvs
mailing list