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. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs