[Bf-blender-cvs] [50a104d2beb] temp-lineart-contained: LineArt: intersection mask ui and code.

YimingWu noreply at git.blender.org
Sun May 9 05:12:37 CEST 2021


Commit: 50a104d2beb1a4dcc165067e1d56a8b65abc921c
Author: YimingWu
Date:   Sun May 9 11:12:21 2021 +0800
Branches: temp-lineart-contained
https://developer.blender.org/rB50a104d2beb1a4dcc165067e1d56a8b65abc921c

LineArt: intersection mask ui and code.

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

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/MOD_lineart.h
M	source/blender/gpencil_modifiers/intern/lineart/lineart_chain.c
M	source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
M	source/blender/gpencil_modifiers/intern/lineart/lineart_ops.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 c5c35121135..9f3bd5f5d65 100644
--- a/release/scripts/startup/bl_ui/properties_collection.py
+++ b/release/scripts/startup/bl_ui/properties_collection.py
@@ -88,6 +88,9 @@ class COLLECTION_PT_lineart_collection(CollectionButtonsPanel, Panel):
         row = layout.row()
         row.prop(collection, "lineart_usage")
 
+        layout.prop(collection, "lineart_use_intersection_mask")
+        layout.prop(collection, "lineart_intersection_mask", text="Masks", toggle=True)
+
 
 classes = (
     COLLECTION_PT_collection_flags,
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c b/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c
index eebbd00162c..86f1b5fa92c 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c
@@ -103,6 +103,7 @@ static void generate_strokes_actual(
       lmd->edge_types,
       lmd->mask_switches,
       lmd->transparency_mask,
+      lmd->intersection_mask,
       lmd->thickness,
       lmd->opacity,
       lmd->source_vertex_group,
@@ -440,6 +441,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(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");
+  uiLayoutSetEnabled(layout, !is_baked);
+
+  uiLayoutSetPropSep(layout, true);
+
+  uiLayoutSetActive(layout, RNA_boolean_get(ptr, "use_intersection"));
+
+  uiLayout *row = uiLayoutRow(layout, true);
+  uiLayoutSetPropDecorate(row, false);
+  uiLayout *sub = uiLayoutRowWithHeading(row, true, IFACE_("Masks"));
+  char text[2] = "0";
+
+  PropertyRNA *prop = RNA_struct_find_property(ptr, "use_intersection_mask");
+  for (int i = 0; i < 8; i++, text[0]++) {
+    uiItemFullR(sub, ptr, prop, i, 0, UI_ITEM_R_TOGGLE, text, ICON_NONE);
+  }
+  uiItemL(row, "", ICON_BLANK1); /* Space for decorator. */
+
+  uiLayout *col = uiLayoutColumn(layout, true);
+  uiItemR(col, ptr, "use_intersection_match", 0, IFACE_("Match All Masks"), ICON_NONE);
+}
+
 static void chaining_panel_draw(const bContext *UNUSED(C), Panel *panel)
 {
   PointerRNA ob_ptr;
@@ -561,6 +589,8 @@ 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, "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 9ef29245e20..a5f17481bce 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
+++ b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
@@ -152,6 +152,7 @@ typedef struct LineartEdge {
 
   /** Also for line type determination on chaining. */
   unsigned char flags;
+  unsigned char intersection_mask;
 
   /**
    * Still need this entry because culled lines will not add to object
@@ -192,7 +193,6 @@ typedef struct LineartLineChainItem {
   unsigned char line_type;
   char occlusion;
   unsigned char transparency_mask;
-  unsigned char intersection_mask;
   size_t index;
 } LineartLineChainItem;
 
@@ -395,6 +395,7 @@ typedef struct LineartObjectInfo {
   double normal[4][4];
   LineartElementLinkNode *v_reln;
   int override_usage;
+  unsigned char override_intersection_mask;
   int global_i_offset;
 
   /* Threads will add lines inside here, when all threads are done, we combine those into the ones
@@ -637,6 +638,7 @@ void MOD_lineart_gpencil_generate(LineartCache *cache,
                                   short edge_types,
                                   unsigned char mask_switches,
                                   unsigned char transparency_mask,
+                                  unsigned char intersection_mask,
                                   short thickness,
                                   float opacity,
                                   const char *source_vgname,
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_chain.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_chain.c
index 9186966cbc2..0971e46ba8b 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_chain.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_chain.c
@@ -38,7 +38,8 @@
 static LineartEdge *lineart_line_get_connected(LineartBoundingArea *ba,
                                                LineartVert *rv,
                                                LineartVert **new_rv,
-                                               int match_flag)
+                                               int match_flag,
+                                               unsigned char match_isec_mask)
 {
   LISTBASE_FOREACH (LinkData *, lip, &ba->linked_lines) {
     LineartEdge *n_e = lip->data;
@@ -51,6 +52,10 @@ static LineartEdge *lineart_line_get_connected(LineartBoundingArea *ba,
       continue;
     }
 
+    if (n_e->intersection_mask != match_isec_mask) {
+      continue;
+    }
+
     *new_rv = LRT_OTHER_RV(n_e, rv);
     if (*new_rv) {
       return n_e;
@@ -230,7 +235,8 @@ void MOD_lineart_chain_feature_lines(LineartRenderBuffer *rb)
                                 rls->occlusion,
                                 rls->transparency_mask,
                                 e->v1_obindex);
-    while (ba && (new_e = lineart_line_get_connected(ba, new_rv, &new_rv, e->flags))) {
+    while (ba && (new_e = lineart_line_get_connected(
+                      ba, new_rv, &new_rv, e->flags, e->intersection_mask))) {
       new_e->flags |= LRT_EDGE_FLAG_CHAIN_PICKED;
 
       if (new_e->t1 || new_e->t2) {
@@ -360,7 +366,8 @@ void MOD_lineart_chain_feature_lines(LineartRenderBuffer *rb)
     /*  Step 3: grow right. */
     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))) {
+    while (ba && (new_e = lineart_line_get_connected(
+                      ba, new_rv, &new_rv, e->flags, e->intersection_mask))) {
       new_e->flags |= LRT_EDGE_FLAG_CHAIN_PICKED;
 
       if (new_e->t1 || new_e->t2) {
@@ -574,12 +581,12 @@ void MOD_lineart_chain_split_for_fixed_occlusion(LineartRenderBuffer *rb)
     BLI_addtail(&rb->chains, rlc);
     LineartLineChainItem *first_rlci = (LineartLineChainItem *)rlc->chain.first;
     int fixed_occ = first_rlci->occlusion;
-    unsigned char fixed_mask = first_rlci->transparency_mask;
+    unsigned char fixed_trans_mask = first_rlci->transparency_mask;
     rlc->level = fixed_occ;
-    rlc->transparency_mask = fixed_mask;
+    rlc->transparency_mask = fixed_trans_mask;
     for (rlci = first_rlci->next; rlci; rlci = next_rlci) {
       next_rlci = rlci->next;
-      if (rlci->occlusion != fixed_occ || rlci->transparency_mask != fixed_mask) {
+      if (rlci->occlusion != fixed_occ || rlci->transparency_mask != fixed_trans_mask) {
         if (next_rlci) {
           if (lineart_point_overlapping(next_rlci, rlci->pos[0], rlci->pos[1], 1e-5)) {
             continue;
@@ -589,7 +596,7 @@ void MOD_lineart_chain_split_for_fixed_occlusion(LineartRenderBuffer *rb)
           /* Set the same occlusion level for the end vertex, so when further connection is needed
            * the backwards occlusion info is also correct.  */
           rlci->occlusion = fixed_occ;
-          rlci->transparency_mask = fixed_mask;
+          rlci->transparency_mask = fixed_trans_mask;
           /* No need to split at the last point anyway. */
           break;
         }
@@ -608,15 +615,15 @@ void MOD_lineart_chain_split_for_fixed_occlusion(LineartRenderBuffer *rb)
                                    rlci->normal,
                                    rlci->line_type,
                                    fixed_occ,
-                                   fixed_mask,
+                                   fixed_trans_mask,
                                    rlci->index);
         new_rlc->object_ref = rlc->object_ref;
         new_rlc->type = rlc->type;
         rlc = new_rlc;
         fixed_occ = rlci->occlusion;
-        fixed_mask = rlci->transparency_mask;
+        fixed_trans_mask = rlci->transparency_mask;
         rlc->level = fixed_occ;
-        rlc->transparency_mask = fixed_mask;
+        rlc->transparency_mask = fixed_trans_mask;
       }
     }
   }
@@ -683,7 +690,8 @@ static LineartChainRegisterEntry *lineart_chain_get_closest_cre(LineartRenderBuf
                                                                 LineartLineChain *rlc,
                                                                 LineartLineChainItem *rlci,
                                                                 int occlusion,
-                                                                unsigned char transparency_mask,
+                                                                unsigned char trans_mask,
+                                                                unsigned char isec_mask,
                                                                 float dist,
                                                                 float *result_new_len,
                                                                 LineartBoundingArea *caller_ba)
@@ -712,7 +720,8 @@ static LineartChainRegisterEntry *lineart_chain_get_closest_cre(LineartRenderBuf
       continue;
     }
     if (cre->rlc == rlc || (!cre->rlc->chain.first) || (cre->rlc->level != occlusion) ||
-        (cre->rlc->transparency_mask != transparency_mask))

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list