[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