Commit: 6dd8ceef2a21f64cbb61a96560c50c162f9dae39 Author: Yiming Wu Date: Wed Jun 29 22:54:29 2022 +0800 Branches: master https://developer.blender.org/rB6dd8ceef2a21f64cbb61a96560c50c162f9dae39
LineArt: Shadow and related functionalities. This patch includes the full shadow functionality for LineArt: - Light contour and cast shadow lines. - Lit/shaded region selection. - Enclosed light/shadow shape calculation. - Silhouette/anti-silhouette selection. - Intersection priority based on shadow edge identifier. Reviewed By: Sebastian Parborg (zeddb) Differential Revision: https://developer.blender.org/D15109 =================================================================== M release/scripts/startup/bl_ui/properties_collection.py M release/scripts/startup/bl_ui/properties_material.py M release/scripts/startup/bl_ui/properties_object.py M source/blender/blenkernel/BKE_gpencil_modifier.h M source/blender/blenkernel/intern/gpencil_modifier.c M source/blender/blenlib/BLI_math_vector.h M source/blender/blenlib/intern/math_vector_inline.c M source/blender/blenloader/intern/versioning_300.c M source/blender/gpencil_modifiers/CMakeLists.txt 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_intern.h M source/blender/gpencil_modifiers/intern/lineart/lineart_ops.c A source/blender/gpencil_modifiers/intern/lineart/lineart_shadow.c M source/blender/makesdna/DNA_collection_types.h M source/blender/makesdna/DNA_gpencil_modifier_defaults.h M source/blender/makesdna/DNA_gpencil_modifier_types.h M source/blender/makesdna/DNA_lineart_types.h M source/blender/makesdna/DNA_material_types.h M source/blender/makesdna/DNA_object_types.h M source/blender/makesrna/intern/rna_collection.c M source/blender/makesrna/intern/rna_gpencil_modifier.c M source/blender/makesrna/intern/rna_material.c M source/blender/makesrna/intern/rna_object.c =================================================================== diff --git a/release/scripts/startup/bl_ui/properties_collection.py b/release/scripts/startup/bl_ui/properties_collection.py index 220e35041c1..95debb259b0 100644 --- a/release/scripts/startup/bl_ui/properties_collection.py +++ b/release/scripts/startup/bl_ui/properties_collection.py @@ -96,6 +96,12 @@ class COLLECTION_PT_lineart_collection(CollectionButtonsPanel, Panel): if i == 3: row = col.row(align=True) + row = layout.row(heading="Intersection Priority") + row.prop(collection, "use_lineart_intersection_priority", text="") + subrow = row.row() + subrow.active = collection.use_lineart_intersection_priority + subrow.prop(collection, "lineart_intersection_priority", text="") + class COLLECTION_PT_collection_custom_props(CollectionButtonsPanel, PropertyPanel, Panel): _context_path = "collection" diff --git a/release/scripts/startup/bl_ui/properties_material.py b/release/scripts/startup/bl_ui/properties_material.py index 44fa93054d3..ba6ed9ae6a2 100644 --- a/release/scripts/startup/bl_ui/properties_material.py +++ b/release/scripts/startup/bl_ui/properties_material.py @@ -287,6 +287,12 @@ class MATERIAL_PT_lineart(MaterialButtonsPanel, Panel): row = layout.row(align=True, heading="Custom Occlusion") row.prop(lineart, "mat_occlusion", text="Levels") + row = layout.row(heading="Intersection Priority") + row.prop(lineart, "use_intersection_priority_override", text="") + subrow = row.row() + subrow.active = lineart.use_intersection_priority_override + subrow.prop(lineart, "intersection_priority", text="") + classes = ( MATERIAL_MT_context_menu, diff --git a/release/scripts/startup/bl_ui/properties_object.py b/release/scripts/startup/bl_ui/properties_object.py index 904c2af3a5e..7afa2f81b97 100644 --- a/release/scripts/startup/bl_ui/properties_object.py +++ b/release/scripts/startup/bl_ui/properties_object.py @@ -317,6 +317,12 @@ class OBJECT_PT_lineart(ObjectButtonsPanel, Panel): subrow.active = lineart.use_crease_override subrow.prop(lineart, "crease_threshold", slider=True, text="") + row = layout.row(heading="Intersection Priority") + row.prop(lineart, "use_intersection_priority_override", text="") + subrow = row.row() + subrow.active = lineart.use_intersection_priority_override + subrow.prop(lineart, "intersection_priority", text="") + class OBJECT_PT_motion_paths(MotionPathButtonsPanel, Panel): #bl_label = "Object Motion Paths" diff --git a/source/blender/blenkernel/BKE_gpencil_modifier.h b/source/blender/blenkernel/BKE_gpencil_modifier.h index 96c405e46ec..6472c804e05 100644 --- a/source/blender/blenkernel/BKE_gpencil_modifier.h +++ b/source/blender/blenkernel/BKE_gpencil_modifier.h @@ -383,6 +383,8 @@ typedef struct GpencilLineartLimitInfo { char min_level; char max_level; short edge_types; + char shadow_selection; + char silhouette_selection; } GpencilLineartLimitInfo; GpencilLineartLimitInfo BKE_gpencil_get_lineart_modifier_limits(const struct Object *ob); diff --git a/source/blender/blenkernel/intern/gpencil_modifier.c b/source/blender/blenkernel/intern/gpencil_modifier.c index 0bf5418ea8f..8739f2f7082 100644 --- a/source/blender/blenkernel/intern/gpencil_modifier.c +++ b/source/blender/blenkernel/intern/gpencil_modifier.c @@ -221,6 +221,9 @@ GpencilLineartLimitInfo BKE_gpencil_get_lineart_modifier_limits(const Object *ob info.max_level = MAX2(info.max_level, (lmd->use_multiple_levels ? lmd->level_end : lmd->level_start)); info.edge_types |= lmd->edge_types; + info.shadow_selection = MAX2(lmd->shadow_selection, info.shadow_selection); + info.silhouette_selection = MAX2(lmd->silhouette_selection, info.silhouette_selection); + is_first = false; } } } @@ -237,11 +240,15 @@ void BKE_gpencil_set_lineart_modifier_limits(GpencilModifierData *md, lmd->level_start_override = info->min_level; lmd->level_end_override = info->max_level; lmd->edge_types_override = info->edge_types; + lmd->shadow_selection_override = info->shadow_selection; + lmd->shadow_use_silhouette_override = info->silhouette_selection; } else { lmd->level_start_override = lmd->level_start; lmd->level_end_override = lmd->level_end; lmd->edge_types_override = lmd->edge_types; + lmd->shadow_selection_override = lmd->shadow_selection; + lmd->shadow_use_silhouette_override = lmd->silhouette_selection; } } diff --git a/source/blender/blenlib/BLI_math_vector.h b/source/blender/blenlib/BLI_math_vector.h index f3283371a3c..0b178064a4c 100644 --- a/source/blender/blenlib/BLI_math_vector.h +++ b/source/blender/blenlib/BLI_math_vector.h @@ -40,6 +40,10 @@ MINLINE void swap_v2_v2(float a[2], float b[2]); MINLINE void swap_v3_v3(float a[3], float b[3]); MINLINE void swap_v4_v4(float a[4], float b[4]); +MINLINE void swap_v2_v2_db(double a[2], double b[2]); +MINLINE void swap_v3_v3_db(double a[3], double b[3]); +MINLINE void swap_v4_v4_db(double a[4], double b[4]); + /* unsigned char */ MINLINE void copy_v2_v2_uchar(unsigned char r[2], const unsigned char a[2]); diff --git a/source/blender/blenlib/intern/math_vector_inline.c b/source/blender/blenlib/intern/math_vector_inline.c index 3e9443dddb0..27c17a90f5f 100644 --- a/source/blender/blenlib/intern/math_vector_inline.c +++ b/source/blender/blenlib/intern/math_vector_inline.c @@ -316,6 +316,27 @@ MINLINE void swap_v4_v4(float a[4], float b[4]) SWAP(float, a[3], b[3]); } +MINLINE void swap_v2_v2_db(double a[2], double b[2]) +{ + SWAP(double, a[0], b[0]); + SWAP(double, a[1], b[1]); +} + +MINLINE void swap_v3_v3_db(double a[3], double b[3]) +{ + SWAP(double, a[0], b[0]); + SWAP(double, a[1], b[1]); + SWAP(double, a[2], b[2]); +} + +MINLINE void swap_v4_v4_db(double a[4], double b[4]) +{ + SWAP(double, a[0], b[0]); + SWAP(double, a[1], b[1]); + SWAP(double, a[2], b[2]); + SWAP(double, a[3], b[3]); +} + /* float args -> vec */ MINLINE void copy_v2_fl2(float v[2], float x, float y) diff --git a/source/blender/blenloader/intern/versioning_300.c b/source/blender/blenloader/intern/versioning_300.c index 9514f1667b1..ea8653bd0f4 100644 --- a/source/blender/blenloader/intern/versioning_300.c +++ b/source/blender/blenloader/intern/versioning_300.c @@ -3126,6 +3126,17 @@ void blo_do_versions_300(FileData *fd, Library *UNUSED(lib), Main *bmain) } } FOREACH_NODETREE_END; + + LISTBASE_FOREACH (Object *, ob, &bmain->objects) { + LISTBASE_FOREACH (GpencilModifierData *, gpd, &ob->greasepencil_modifiers) { + if (gpd->type == eGpencilModifierType_Lineart) { + LineartGpencilModifierData *lmd = (LineartGpencilModifierData *)gpd; + lmd->shadow_camera_near = 0.1f; + lmd->shadow_camera_far = 200.0f; + lmd->shadow_camera_size = 200.0f; + } + } + } } if (!MAIN_VERSION_ATLEAST(bmain, 303, 2)) { diff --git a/source/blender/gpencil_modifiers/CMakeLists.txt b/source/blender/gpencil_modifiers/CMakeLists.txt index 69fc26c99e9..947fc32f8c0 100644 --- a/source/blender/gpencil_modifiers/CMakeLists.txt +++ b/source/blender/gpencil_modifiers/CMakeLists.txt @@ -68,6 +68,7 @@ set(SRC intern/lineart/lineart_cpp_bridge.cc intern/lineart/lineart_cpu.c intern/lineart/lineart_ops.c + intern/lineart/lineart_shadow.c intern/lineart/lineart_util.c intern/lineart/MOD_lineart.h diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c b/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c index 8d77fb50c71..1c5485d2640 100644 --- a/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c +++ b/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c @@ -88,6 +88,8 @@ static void generate_strokes_actual( lmd->intersection_mask, lmd->thickness, lmd->opacity, + lmd->shadow_selection, + lmd->silhouette_selection, lmd->source_vertex_group, lmd->vgname, lmd->flags); @@ -193,6 +195,7 @@ static void bakeModifier(Main *UNUSED(bmain), * modifiers in the stack. */ lmd->edge_types_override = lmd->edge_types; lmd->level_end_override = lmd->level_end; + lmd->shadow_selection_override = lmd->shadow_selection; MOD_lineart_compute_feature_lines( depsgraph, lmd, &gpd->runtime.lineart_cache, (!(ob->dtx & OB_DRAW_IN_FRONT))); @@ -263,6 +266,10 @@ static void updateDepsgraph(GpencilModifierData *md, DEG_add_object_relation( ctx->node, ctx->scene->camera, DEG_OB_COMP_PARAMETERS, "Line Art Modifier"); } + if (lmd->light_contour_object) { + DEG_add_object_relation( + ctx->node, lmd->light_contour_object, DEG_OB_COMP_TRANSFORM, "Line Art Modifier"); + } } static void foreachIDLink(GpencilModifierData *md, Object *ob, IDWalkFunc walk, void *userData) @@ -274,6 +281,7 @@ static void foreachIDLink(GpencilModifierData *md, Object *ob, IDWalkFunc walk, walk(userData, ob, (ID **)&lmd->source_object, IDWALK_CB_NOP); walk(userData, ob, (ID **)&lmd->source_camera, IDWALK_CB_NOP); + walk(userData, ob, (ID **)&lmd->light_contour_object, IDWALK_CB_NOP); } static void panel_draw(const bContext *UNUSED(C), Panel *panel) @@ -340,31 +348,107 @@ static void edge_types_panel_draw(const bContext *UNUSED(C), Panel *panel) const bool is_baked = RNA_boolean_get(ptr, "is_baked"); const bool use_cache = RNA_boolean_get(ptr, "use_cache"); const bool is_first = BKE_gpencil_is_first_lineart_in_stack(ob_ptr.data, ptr->data); + const bool has_light = RNA_pointer_get(ptr, "light_contour_object").data != NULL; uiLayoutSetEnabled(layout, !is_baked); uiLayoutSetPropSep(layout, true); + uiLayout *sub = uiLayoutRow(layout, false); + uiLayoutSetActive(sub, has_light); + uiItemR(sub, ptr, "shadow_region_filtering", 0, IFACE_("Illumination Filtering"), ICON_NONE); + uiLayout *col = uiLayoutColumn(layout, true); - uiItemR(col, ptr, "use_contour", 0, IFACE_("Contour"), ICON_NONE); - uiItemR(col, ptr, "use_loose", 0, IFACE_("Loose"), ICON_NONE); - uiItemR(col, ptr, "use_material", 0, @@ 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
