Commit: d1e0059eac99654624edee2a2390a3e2fdc4c7cb Author: YimingWu Date: Tue Jun 29 20:47:55 2021 +0800 Branches: master https://developer.blender.org/rBd1e0059eac99654624edee2a2390a3e2fdc4c7cb
LineArt: Filtering intersection lines using mask numbers Mask value works just like transparency mask. You are able to select intersection lines inside a collection or, between collections. Reviewed By: Sebastian Parborg (zeddb) Differential Revision: https://developer.blender.org/D11309 =================================================================== 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_collection_types.h M source/blender/makesdna/DNA_gpencil_modifier_types.h M source/blender/makesdna/intern/dna_rename_defs.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 5a98e638992..27de80bb88d 100644 --- a/release/scripts/startup/bl_ui/properties_collection.py +++ b/release/scripts/startup/bl_ui/properties_collection.py @@ -86,6 +86,13 @@ class COLLECTION_PT_lineart_collection(CollectionButtonsPanel, Panel): row = layout.row() row.prop(collection, "lineart_usage") + layout.prop(collection, "lineart_use_intersection_mask") + + row = layout.row(align=True, heading="Masks") + row.active = collection.lineart_use_intersection_mask + for i in range(0,8): + row.prop(collection, "lineart_intersection_mask", index=i, text=str(i), 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 f205559b941..9593a1364e7 100644 --- a/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c +++ b/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c @@ -101,8 +101,9 @@ static void generate_strokes_actual( lmd->use_multiple_levels ? lmd->level_end : lmd->level_start, lmd->target_material ? BKE_gpencil_object_material_index_get(ob, lmd->target_material) : 0, lmd->edge_types, - lmd->material_mask_flags, + lmd->mask_switches, lmd->material_mask_bits, + lmd->intersection_mask, lmd->thickness, lmd->opacity, lmd->source_vertex_group, @@ -462,6 +463,32 @@ static void material_mask_panel_draw(const bContext *UNUSED(C), Panel *panel) uiItemR(col, ptr, "use_material_mask_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 face_mark_panel_draw_header(const bContext *UNUSED(C), Panel *panel) { uiLayout *layout = panel->layout; @@ -626,6 +653,8 @@ static void panelRegister(ARegionType *region_type) material_mask_panel_draw_header, material_mask_panel_draw, occlusion_panel); + gpencil_modifier_subpanel_register( + region_type, "intersection", "Intersection", NULL, intersection_panel_draw, panel_type); gpencil_modifier_subpanel_register( region_type, "face_mark", "", face_mark_panel_draw_header, face_mark_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 debfabae869..247b0b3f57b 100644 --- a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h +++ b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h @@ -52,8 +52,8 @@ typedef struct LineartTriangle { /* first culled in line list to use adjacent triangle info, then go through triangle list. */ double gn[3]; - /* Material flag is removed to save space. */ unsigned char material_mask_bits; + unsigned char intersection_mask; unsigned char mat_occlusion; unsigned char flags; /* #eLineartTriangleFlags */ @@ -149,6 +149,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 @@ -174,6 +175,7 @@ typedef struct LineartEdgeChain { /** Chain now only contains one type of segments */ int type; unsigned char material_mask_bits; + unsigned char intersection_mask; struct Object *object_ref; } LineartEdgeChain; @@ -188,6 +190,7 @@ typedef struct LineartEdgeChainItem { unsigned char line_type; char occlusion; unsigned char material_mask_bits; + unsigned char intersection_mask; size_t index; } LineartEdgeChainItem; @@ -377,6 +380,7 @@ typedef struct LineartObjectInfo { double normal[4][4]; LineartElementLinkNode *v_eln; int usage; + uint8_t override_intersection_mask; int global_i_offset; bool free_use_mesh; @@ -612,8 +616,9 @@ void MOD_lineart_gpencil_generate(LineartCache *cache, int level_end, int mat_nr, short edge_types, - unsigned char material_mask_flags, + unsigned char mask_switches, unsigned char material_mask_bits, + 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 a9f290eb6fa..52485648ee0 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 *vt, LineartVert **new_vt, - int match_flag) + int match_flag, + unsigned char match_isec_mask) { for (int i = 0; i < ba->line_count; i++) { LineartEdge *n_e = ba->linked_lines[i]; @@ -51,6 +52,10 @@ static LineartEdge *lineart_line_get_connected(LineartBoundingArea *ba, continue; } + if (n_e->intersection_mask != match_isec_mask) { + continue; + } + *new_vt = LRT_OTHER_VERT(n_e, vt); if (*new_vt) { return n_e; @@ -112,11 +117,11 @@ static LineartEdgeChainItem *lineart_chain_append_point(LineartRenderBuffer *rb, /* Because the new chain point is overlapping, just replace the type and occlusion level of the * current point. This makes it so that the line to the point after this one has the correct * type and level. */ - LineartEdgeChainItem *old_rlci = ec->chain.last; - old_rlci->line_type = type; - old_rlci->occlusion = level; - old_rlci->material_mask_bits = material_mask_bits; - return old_rlci; + LineartEdgeChainItem *old_eci = ec->chain.last; + old_eci->line_type = type; + old_eci->occlusion = level; + old_eci->material_mask_bits = material_mask_bits; + return old_eci; } eci = lineart_mem_acquire(rb->chain_data_pool, sizeof(LineartEdgeChainItem)); @@ -194,9 +199,10 @@ void MOD_lineart_chain_feature_lines(LineartRenderBuffer *rb) ec = 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. */ ec->object_ref = e->object_ref; + ec->intersection_mask = e->intersection_mask; LineartEdge *new_e; LineartVert *new_vt; @@ -230,7 +236,8 @@ void MOD_lineart_chain_feature_lines(LineartRenderBuffer *rb) es->occlusion, es->material_mask_bits, e->v1_obindex); - while (ba && (new_e = lineart_line_get_connected(ba, new_vt, &new_vt, e->flags))) { + while (ba && (new_e = lineart_line_get_connected( + ba, new_vt, &new_vt, e->flags, e->intersection_mask))) { new_e->flags |= LRT_EDGE_FLAG_CHAIN_PICKED; if (new_e->t1 || new_e->t2) { @@ -360,7 +367,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_vt = e->v2; - while (ba && (new_e = lineart_line_get_connected(ba, new_vt, &new_vt, e->flags))) { + while (ba && (new_e = lineart_line_get_connected( + ba, new_vt, &new_vt, e->flags, e->intersection_mask))) { new_e->flags |= LRT_EDGE_FLAG_CHAIN_PICKED; if (new_e->t1 || new_e->t2) { @@ -560,8 +568,8 @@ static void lineart_bounding_area_link_chain(LineartRenderBuffer *rb, LineartEdg void MOD_lineart_chain_split_for_fixed_occlusion(LineartRenderBuffer *rb) { - LineartEdgeChain *ec, *new_rlc; - LineartEdgeChainItem *eci, *next_rlci; + LineartEdgeChain *ec, *new_ec; + LineartEdgeChainItem *eci, *next_eci; ListBase swap = {0}; swap.first = rb->chains.first; @@ -572,16 +580,16 @@ void MOD_lineart_chain_split_for_fixed_occlusion(LineartRenderBuffer *rb) while ((ec = BLI_pophead(&swap)) != NULL) { ec->next = ec->prev = NULL; BLI_addtail(&rb->chains, ec); - LineartEdgeChainItem *first_rlci = (LineartEdgeChainItem *)ec->chain.first; - int fixed_occ = first_rlci->occlusion; - unsigned char fixed_mask = first_rlci->material_mask_bits; + LineartEdgeChainItem *first_eci = (LineartEdgeChainItem *)ec->chain.first; + int fixed_occ = first_eci->occlusion; + unsigned char fixed_mask = first_ @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list [email protected] List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs
