[Bf-blender-cvs] [a5b34967850] temp-lineart-contained: LineArt: Filtering feature line using face mark.

YimingWu noreply at git.blender.org
Mon May 10 05:38:33 CEST 2021


Commit: a5b349678501ed8e5953819c67eb3bfbc16092c6
Author: YimingWu
Date:   Mon May 10 11:38:17 2021 +0800
Branches: temp-lineart-contained
https://developer.blender.org/rBa5b349678501ed8e5953819c67eb3bfbc16092c6

LineArt: Filtering feature line using face mark.

===================================================================

M	source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c
M	source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
M	source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
M	source/blender/makesdna/DNA_gpencil_modifier_types.h
M	source/blender/makesdna/DNA_lineart_types.h
M	source/blender/makesrna/intern/rna_gpencil_modifier.c

===================================================================

diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c b/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c
index d9e920684d5..40d3a72c2f4 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c
@@ -483,6 +483,44 @@ static void intersection_panel_draw(const bContext *UNUSED(C), Panel *panel)
   uiItemR(col, ptr, "use_intersection_match", 0, IFACE_("Match All Masks"), ICON_NONE);
 }
 
+static void face_mark_panel_draw_header(const bContext *UNUSED(C), Panel *panel)
+{
+  uiLayout *layout = panel->layout;
+  PointerRNA ob_ptr;
+  PointerRNA *ptr = gpencil_modifier_panel_get_property_pointers(panel, &ob_ptr);
+
+  const bool is_baked = RNA_boolean_get(ptr, "is_baked");
+  const bool use_cache = RNA_boolean_get(ptr, "use_cached_result");
+
+  uiLayoutSetEnabled(layout,
+                     !is_baked &&
+                         (!use_cache || BKE_gpencil_lineart_is_first_run(ob_ptr.data, ptr->data)));
+
+  uiItemR(layout, ptr, "use_face_mark", 0, IFACE_("Filter Face Mark"), ICON_NONE);
+}
+
+static void face_mark_panel_draw(const bContext *UNUSED(C), Panel *panel)
+{
+  uiLayout *layout = panel->layout;
+  PointerRNA ob_ptr;
+  PointerRNA *ptr = gpencil_modifier_panel_get_property_pointers(panel, &ob_ptr);
+
+  const bool is_baked = RNA_boolean_get(ptr, "is_baked");
+  const bool use_mark = RNA_boolean_get(ptr, "use_face_mark");
+  const bool use_cache = RNA_boolean_get(ptr, "use_cached_result");
+
+  uiLayoutSetEnabled(layout,
+                     !is_baked &&
+                         (!use_cache || BKE_gpencil_lineart_is_first_run(ob_ptr.data, ptr->data)));
+
+  uiLayoutSetPropSep(layout, true);
+
+  uiLayoutSetActive(layout, use_mark);
+
+  uiItemR(layout, ptr, "use_face_mark_invert", 0, NULL, ICON_NONE);
+  uiItemR(layout, ptr, "use_face_mark_boundaries", 0, NULL, ICON_NONE);
+}
+
 static void chaining_panel_draw(const bContext *UNUSED(C), Panel *panel)
 {
   PointerRNA ob_ptr;
@@ -610,6 +648,8 @@ static void panelRegister(ARegionType *region_type)
                                      intersection_panel_draw_header,
                                      intersection_panel_draw,
                                      panel_type);
+  gpencil_modifier_subpanel_register(
+      region_type, "face_mark", "", face_mark_panel_draw_header, face_mark_panel_draw, panel_type);
   gpencil_modifier_subpanel_register(
       region_type, "chaining", "Chaining", NULL, chaining_panel_draw, panel_type);
   gpencil_modifier_subpanel_register(
diff --git a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
index a5f17481bce..46888d5fe75 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
+++ b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
@@ -305,6 +305,10 @@ typedef struct LineartRenderBuffer {
   bool remove_doubles;
   bool floating_as_contour;
 
+  bool filter_face_mark;
+  bool filter_face_mark_invert;
+  bool filter_face_mark_boundaries;
+
   /* Keep an copy of these data so when line art is running it's self-contained. */
   bool cam_is_persp;
   float cam_obmat[4][4];
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
index fdf2d3f3653..adc77fbd25c 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
@@ -1415,10 +1415,12 @@ static char lineart_identify_feature_line(LineartRenderBuffer *rb,
                                           LineartVert *rv_array,
                                           float crease_threshold,
                                           bool no_crease,
-                                          bool count_freestyle,
+                                          bool use_freestyle_edge,
+                                          bool use_freestyle_face,
                                           BMesh *bm_if_freestyle)
 {
   BMLoop *ll, *lr = NULL;
+
   ll = e->l;
   if (ll) {
     lr = e->l->radial_next;
@@ -1426,11 +1428,48 @@ static char lineart_identify_feature_line(LineartRenderBuffer *rb,
 
   if (!ll && !lr) {
     if (!rb->floating_as_contour) {
+      if (use_freestyle_face && rb->filter_face_mark) {
+        if (rb->filter_face_mark_invert) {
+          return LRT_EDGE_FLAG_FLOATING;
+        }
+        return 0;
+      }
       return LRT_EDGE_FLAG_FLOATING;
     }
   }
 
-  if (ll == lr || !lr) {
+  FreestyleEdge *fel, *fer;
+  bool face_mark_filtered = false;
+
+  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 {
+      /* Hanles 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;
+    }
+  }
+
+  /* Mesh boundary */
+  if (!lr || ll == lr) {
     return LRT_EDGE_FLAG_CONTOUR;
   }
 
@@ -1447,7 +1486,6 @@ static char lineart_identify_feature_line(LineartRenderBuffer *rb,
   double *view_vector = vv;
   double dot_1 = 0, dot_2 = 0;
   double result;
-  FreestyleEdge *fe;
   char edge_flag_result = 0;
 
   if (rb->cam_is_persp) {
@@ -1472,7 +1510,8 @@ static char lineart_identify_feature_line(LineartRenderBuffer *rb,
   else if (rb->use_material && (ll->f->mat_nr != lr->f->mat_nr)) {
     edge_flag_result |= LRT_EDGE_FLAG_MATERIAL;
   }
-  else if (count_freestyle && rb->use_edge_marks) {
+  else 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;
@@ -1620,7 +1659,8 @@ static void lineart_geometry_object_load(LineartObjectInfo *obi, LineartRenderBu
   LineartLineSegment *o_la_s;
   LineartTriangle *ort;
   Object *orig_ob;
-  int CanFindFreestyle = 0;
+  bool can_find_freestyle_edge = false;
+  bool can_find_freestyle_face = false;
   int i;
   float use_crease = 0;
 
@@ -1656,7 +1696,10 @@ static void lineart_geometry_object_load(LineartObjectInfo *obi, LineartRenderBu
   BM_mesh_elem_index_ensure(bm, BM_VERT | BM_EDGE | BM_FACE);
 
   if (CustomData_has_layer(&bm->edata, CD_FREESTYLE_EDGE)) {
-    CanFindFreestyle = 1;
+    can_find_freestyle_edge = true;
+  }
+  if (CustomData_has_layer(&bm->pdata, CD_FREESTYLE_FACE)) {
+    can_find_freestyle_face = true;
   }
 
   /* Only allocate memory for verts and tris as we don't know how many lines we will generate
@@ -1765,8 +1808,15 @@ static void lineart_geometry_object_load(LineartObjectInfo *obi, LineartRenderBu
     e = BM_edge_at_index(bm, i);
 
     /* Because e->head.hflag is char, so line type flags should not exceed positive 7 bits. */
-    char eflag = lineart_identify_feature_line(
-        rb, e, ort, orv, use_crease, orig_ob->type == OB_FONT, CanFindFreestyle, bm);
+    char eflag = lineart_identify_feature_line(rb,
+                                               e,
+                                               ort,
+                                               orv,
+                                               use_crease,
+                                               orig_ob->type == OB_FONT,
+                                               can_find_freestyle_edge,
+                                               can_find_freestyle_face,
+                                               bm);
     if (eflag) {
       /* Only allocate for feature lines (instead of all lines) to save memory. */
       allocate_la_e += lineart_edge_type_duplication_count(eflag);
@@ -2972,6 +3022,11 @@ static LineartRenderBuffer *lineart_create_render_buffer(Scene *scene,
   rb->use_intersections = (lmd->edge_types_override & LRT_EDGE_FLAG_INTERSECTION) != 0;
   rb->use_floating = (lmd->edge_types_override & LRT_EDGE_FLAG_FLOATING) != 0;
 
+  rb->filter_face_mark_invert = (lmd->calculation_flags & LRT_FILTER_FACE_MARK_INVERT) != 0;
+  rb->filter_face_mark = (lmd->calculation_flags & LRT_FILTER_FACE_MARK) != 0;
+  rb->filter_face_mark_boundaries = (lmd->calculation_flags & LRT_FILTER_FACE_MARK_BOUNDARIES) !=
+                                    0;
+
   rb->chain_data_pool = &lc->chain_data_pool;
 
   BLI_spin_init(&rb->lock_task);
diff --git a/source/blender/makesdna/DNA_gpencil_modifier_types.h b/source/blender/makesdna/DNA_gpencil_modifier_types.h
index 024cf448b02..899dcf0f925 100644
--- a/source/blender/makesdna/DNA_gpencil_modifier_types.h
+++ b/source/blender/makesdna/DNA_gpencil_modifier_types.h
@@ -839,9 +839,10 @@ typedef enum eLineartGpencilModifierSource {
   LRT_SOURCE_SCENE = 2,
 } eLineartGpencilModifierSource;
 
+/* This enumis for modifier internal state only. */
 typedef enum eLineArtGPencilModifierFlags {
-  LRT_GPENCIL_INVERT_SOURCE_VGROUP = (1 << 0),
-  LRT_GPENCIL_MATCH_OUTPUT_VGROUP = (1 << 1),
+  /* LRT_GPENCIL_INVERT_SOURCE_VGROUP = (1 << 0), Moved to eLineartMainFlags */
+  /* LRT_GPENCIL_MATCH_OUTPUT_VGROUP = (1 << 1), Moved to eLineartMainFlags */
   LRT_GPENCIL_BINARY_WEIGHTS = (1 << 2) /* Deprecated, this is removed for lack of use case. */,
   LRT_GPENCIL_IS_BAKED = (1 << 3),
   LRT_GPENCIL_USE_CACHE = (1 << 4),
@@ -905,7 +906,7 @@ typedef struct LineartGpencilModifierData {
   /* eLineartMainFlags, for one time calculation. */
   int calculation_flags;
 
-  /* eLineArtGPencilModifierFlags, for stroke selection in each modifier. */
+  /* eLineArtGPencilModifierFlags, modifier internal state. */
   int flags;
 


@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list