[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