[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