[Bf-blender-cvs] [b4b2f638e94] temp-lineart-contained: LineArt: Working intersection filtering.

YimingWu noreply at git.blender.org
Sun May 9 07:17:18 CEST 2021


Commit: b4b2f638e942c5d07eca883d531f58f603506e3a
Author: YimingWu
Date:   Sun May 9 13:17:03 2021 +0800
Branches: temp-lineart-contained
https://developer.blender.org/rBb4b2f638e942c5d07eca883d531f58f603506e3a

LineArt: Working intersection filtering.

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

M	release/scripts/startup/bl_ui/properties_collection.py
M	source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c
M	source/blender/gpencil_modifiers/intern/lineart/lineart_chain.c
M	source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
M	source/blender/makesdna/DNA_gpencil_modifier_types.h
M	source/blender/makesrna/intern/rna_collection.c
M	source/blender/makesrna/intern/rna_gpencil_modifier.c

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

diff --git a/release/scripts/startup/bl_ui/properties_collection.py b/release/scripts/startup/bl_ui/properties_collection.py
index 9f3bd5f5d65..a16410fcec9 100644
--- a/release/scripts/startup/bl_ui/properties_collection.py
+++ b/release/scripts/startup/bl_ui/properties_collection.py
@@ -89,7 +89,8 @@ class COLLECTION_PT_lineart_collection(CollectionButtonsPanel, Panel):
         row.prop(collection, "lineart_usage")
 
         layout.prop(collection, "lineart_use_intersection_mask")
-        layout.prop(collection, "lineart_intersection_mask", text="Masks", toggle=True)
+        row = layout.row()
+        row.prop(collection, "lineart_intersection_mask", text="Masks", toggle=True)
 
 
 classes = (
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c b/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c
index 86f1b5fa92c..d9e920684d5 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c
@@ -300,9 +300,8 @@ static void panel_draw(const bContext *UNUSED(C), Panel *panel)
 
   uiLayout *sub = uiLayoutRow(col, true);
   uiLayoutSetActive(sub,
-                    RNA_boolean_get(ptr, "use_crease") &&
-                        (!RNA_boolean_get(ptr, "use_cached_result") ||
-                         BKE_gpencil_lineart_is_first_run(ob_ptr.data, ptr->data)));
+                    RNA_boolean_get(ptr, "use_crease") ||
+                        BKE_gpencil_lineart_is_first_run(ob_ptr.data, ptr->data));
   uiLayoutSetPropSep(sub, true);
   uiItemR(sub, ptr, "crease_threshold", UI_ITEM_R_SLIDER, " ", ICON_NONE);
 
@@ -441,17 +440,33 @@ static void transparency_panel_draw(const bContext *UNUSED(C), Panel *panel)
   uiItemR(col, ptr, "use_transparency_match", 0, IFACE_("Match All Masks"), ICON_NONE);
 }
 
+static void intersection_panel_draw_header(const bContext *UNUSED(C), Panel *panel)
+{
+  uiLayout *layout = panel->layout;
+  PointerRNA *ptr = gpencil_modifier_panel_get_property_pointers(panel, NULL);
+
+  const bool is_baked = RNA_boolean_get(ptr, "is_baked");
+  const bool use_isec = RNA_boolean_get(ptr, "use_intersection");
+
+  uiLayoutSetEnabled(layout, !is_baked);
+  uiLayoutSetActive(layout, use_isec);
+
+  uiItemR(layout, ptr, "use_intersection_filter", 0, IFACE_("Filter Intersection"), ICON_NONE);
+}
+
 static void intersection_panel_draw(const bContext *UNUSED(C), Panel *panel)
 {
   uiLayout *layout = panel->layout;
   PointerRNA *ptr = gpencil_modifier_panel_get_property_pointers(panel, NULL);
 
   const bool is_baked = RNA_boolean_get(ptr, "is_baked");
+  const bool use_isec = RNA_boolean_get(ptr, "use_intersection");
+  const bool use_isec_filter = RNA_boolean_get(ptr, "use_intersection_filter");
   uiLayoutSetEnabled(layout, !is_baked);
 
   uiLayoutSetPropSep(layout, true);
 
-  uiLayoutSetActive(layout, RNA_boolean_get(ptr, "use_intersection"));
+  uiLayoutSetActive(layout, use_isec && use_isec_filter);
 
   uiLayout *row = uiLayoutRow(layout, true);
   uiLayoutSetPropDecorate(row, false);
@@ -589,8 +604,12 @@ static void panelRegister(ARegionType *region_type)
                                      transparency_panel_draw_header,
                                      transparency_panel_draw,
                                      occlusion_panel);
-  gpencil_modifier_subpanel_register(
-      region_type, "intersection", "Intersection", NULL, intersection_panel_draw, panel_type);
+  gpencil_modifier_subpanel_register(region_type,
+                                     "intersection",
+                                     "",
+                                     intersection_panel_draw_header,
+                                     intersection_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/lineart_chain.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_chain.c
index 0971e46ba8b..da5d3f12fd7 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_chain.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_chain.c
@@ -199,9 +199,10 @@ void MOD_lineart_chain_feature_lines(LineartRenderBuffer *rb)
 
     rlc = lineart_chain_create(rb);
 
-    /* One chain can only have one object_ref,
-     * so we assign it based on the first segment we found. */
+    /* One chain can only have one object_ref and intersection_mask,
+     * so we assign them based on the first segment we found. */
     rlc->object_ref = e->object_ref;
+    rlc->intersection_mask = e->intersection_mask;
 
     LineartEdge *new_e = e;
     LineartVert *new_rv;
@@ -236,7 +237,7 @@ void MOD_lineart_chain_feature_lines(LineartRenderBuffer *rb)
                                 rls->transparency_mask,
                                 e->v1_obindex);
     while (ba && (new_e = lineart_line_get_connected(
-                      ba, new_rv, &new_rv, e->flags, e->intersection_mask))) {
+                      ba, new_rv, &new_rv, e->flags, rlc->intersection_mask))) {
       new_e->flags |= LRT_EDGE_FLAG_CHAIN_PICKED;
 
       if (new_e->t1 || new_e->t2) {
@@ -367,7 +368,7 @@ void MOD_lineart_chain_feature_lines(LineartRenderBuffer *rb)
     ba = MOD_lineart_get_bounding_area(rb, e->v2->fbcoord[0], e->v2->fbcoord[1]);
     new_rv = e->v2;
     while (ba && (new_e = lineart_line_get_connected(
-                      ba, new_rv, &new_rv, e->flags, e->intersection_mask))) {
+                      ba, new_rv, &new_rv, e->flags, rlc->intersection_mask))) {
       new_e->flags |= LRT_EDGE_FLAG_CHAIN_PICKED;
 
       if (new_e->t1 || new_e->t2) {
@@ -619,6 +620,7 @@ void MOD_lineart_chain_split_for_fixed_occlusion(LineartRenderBuffer *rb)
                                    rlci->index);
         new_rlc->object_ref = rlc->object_ref;
         new_rlc->type = rlc->type;
+        new_rlc->intersection_mask = rlc->intersection_mask;
         rlc = new_rlc;
         fixed_occ = rlci->occlusion;
         fixed_trans_mask = rlci->transparency_mask;
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
index f83620475a5..fdf2d3f3653 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
@@ -1867,11 +1867,30 @@ static bool _lineart_object_not_in_source_collection(Collection *source, Object
   return true;
 }
 
+static uchar lineart_intersection_mask_check(Collection *c, Object *ob)
+{
+  LISTBASE_FOREACH (CollectionChild *, cc, &c->children) {
+    uchar result = lineart_intersection_mask_check(cc->collection, ob);
+    if (result) {
+      return result;
+    }
+  }
+
+  if (c->children.first == NULL) {
+    if (BKE_collection_has_object(c, (Object *)(ob->id.orig_id))) {
+      if (c->lineart_flags & COLLECTION_LRT_USE_INTERSECTION_MASK) {
+        return c->lineart_intersection_mask;
+      }
+    }
+  }
+  return 0;
+}
+
 /**
  * See if this object in such collection is used for generating line art,
  * Disabling a collection for line art will doable all objects inside.
  */
-static int lineart_usage_check(Collection *c, Object *ob, unsigned char *r_intersection_mask)
+static int lineart_usage_check(Collection *c, Object *ob)
 {
 
   if (!c) {
@@ -1886,7 +1905,6 @@ static int lineart_usage_check(Collection *c, Object *ob, unsigned char *r_inter
 
   if (c->children.first == NULL) {
     if (BKE_collection_has_object(c, (Object *)(ob->id.orig_id))) {
-      (*r_intersection_mask) = c->lineart_intersection_mask;
       if (ob->lineart.usage == OBJECT_LRT_INHERIT) {
         switch (c->lineart_usage) {
           case COLLECTION_LRT_OCCLUSION_ONLY:
@@ -1902,14 +1920,11 @@ static int lineart_usage_check(Collection *c, Object *ob, unsigned char *r_inter
       }
       return ob->lineart.usage;
     }
-    return OBJECT_LRT_INHERIT;
   }
 
   LISTBASE_FOREACH (CollectionChild *, cc, &c->children) {
-    unsigned char temp_intersection_mask = 0;
-    int result = lineart_usage_check(cc->collection, ob, &temp_intersection_mask);
+    int result = lineart_usage_check(cc->collection, ob);
     if (result > OBJECT_LRT_INHERIT) {
-      (*r_intersection_mask) = temp_intersection_mask;
       return result;
     }
   }
@@ -2010,9 +2025,9 @@ static void lineart_main_load_geometries(
 
   DEG_OBJECT_ITER_BEGIN (depsgraph, ob, flags) {
     LineartObjectInfo *obi = lineart_mem_aquire(&rb->render_data_pool, sizeof(LineartObjectInfo));
-    obi->override_usage = lineart_usage_check(
-        scene->master_collection, ob, &obi->override_intersection_mask);
-
+    obi->override_usage = lineart_usage_check(scene->master_collection, ob);
+    obi->override_intersection_mask = lineart_intersection_mask_check(scene->master_collection,
+                                                                      ob);
     /* TODO: We better make it so we can extract BMesh in parallel or at least for those objects
      * who doesn't have instances or just simply have transformation channel set. */
     Object *use_ob = DEG_get_evaluated_object(depsgraph, ob);
@@ -4030,8 +4045,8 @@ bool MOD_lineart_compute_feature_lines(Depsgraph *depsgraph,
 
     if (rb->chain_smooth_tolerance > FLT_EPSILON) {
       /* Keeping UI range of 0-1 for ease of read while scaling down the actual value for best
-       * effective range in image-space (Coordinate only goes from -1 to 1). This value is somewhat
-       * arbitrary, but works best for the moment.  */
+       * effective range in image-space (Coordinate only goes from -1 to 1). This value is
+       * somewhat arbitrary, but works best for the moment.  */
       MOD_lineart_smooth_chains(rb, rb->chain_smooth_tolerance / 50);
     }
 
@@ -4157,7 +4172,8 @@ static void lineart_gpencil_generate(LineartCache *cache,
         }
       }
     }
-    if (types & LRT_EDGE_FLAG_INTERSECTION) {
+    if (rlc->type == LRT_EDGE_FLAG_INTERSECTION &&
+        (mask_switches & LRT_GPENCIL_INTERSECTION_FILTER)) {
       if (mask_switches & LRT_GPENCIL_IN

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list