[Bf-blender-cvs] [75e17be7e76] lineart-shadow: LineArt: UI and correct logic for shadow region chaining
YimingWu
noreply at git.blender.org
Mon Apr 11 09:09:01 CEST 2022
Commit: 75e17be7e7603458f7a5d09da42dcac34b629db1
Author: YimingWu
Date: Mon Apr 11 15:08:21 2022 +0800
Branches: lineart-shadow
https://developer.blender.org/rB75e17be7e7603458f7a5d09da42dcac34b629db1
LineArt: UI and correct logic for shadow region chaining
===================================================================
M source/blender/blenkernel/BKE_gpencil_modifier.h
M source/blender/blenkernel/intern/gpencil_modifier.c
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/makesdna/DNA_lineart_types.h
M source/blender/makesrna/intern/rna_gpencil_modifier.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_gpencil_modifier.h b/source/blender/blenkernel/BKE_gpencil_modifier.h
index 96c405e46ec..ff8b2a92f75 100644
--- a/source/blender/blenkernel/BKE_gpencil_modifier.h
+++ b/source/blender/blenkernel/BKE_gpencil_modifier.h
@@ -383,6 +383,7 @@ typedef struct GpencilLineartLimitInfo {
char min_level;
char max_level;
short edge_types;
+ char shadow_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 faafd1e1040..dc95816be75 100644
--- a/source/blender/blenkernel/intern/gpencil_modifier.c
+++ b/source/blender/blenkernel/intern/gpencil_modifier.c
@@ -221,6 +221,7 @@ 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);
}
}
}
@@ -237,11 +238,13 @@ 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;
}
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;
}
}
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c b/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c
index 6b9c3c3c543..9ff7d0defb9 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c
@@ -91,6 +91,7 @@ static void generate_strokes_actual(
lmd->intersection_mask,
lmd->thickness,
lmd->opacity,
+ lmd->shadow_selection,
lmd->source_vertex_group,
lmd->vgname,
lmd->flags);
@@ -196,6 +197,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)));
@@ -363,7 +365,8 @@ static void edge_types_panel_draw(const bContext *UNUSED(C), Panel *panel)
uiLayoutSetActive(sub, RNA_pointer_get(ptr, "light_contour_object").data != NULL);
uiItemR(sub, ptr, "use_light_contour", 0, NULL, ICON_NONE);
- uiItemR(sub, ptr, "use_shadow", 0, IFACE_("Casted Shadow"), ICON_NONE);
+ uiItemR(sub, ptr, "use_shadow", 0, IFACE_("Cast Shadow"), ICON_NONE);
+ uiItemR(sub, ptr, "shadow_region_filtering", 0, NULL, ICON_NONE);
uiItemR(layout, ptr, "use_overlap_edge_type_support", 0, IFACE_("Allow Overlap"), ICON_NONE);
}
diff --git a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
index b9e05e3639c..22fa1517202 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
+++ b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
@@ -213,6 +213,7 @@ typedef struct LineartEdgeChain {
int loop_id;
unsigned char material_mask_bits;
unsigned char intersection_mask;
+ unsigned char shadow_mask_bits;
struct Object *object_ref;
} LineartEdgeChain;
@@ -228,6 +229,7 @@ typedef struct LineartEdgeChainItem {
char occlusion;
unsigned char material_mask_bits;
unsigned char intersection_mask;
+ unsigned char shadow_mask_bits;
size_t index;
} LineartEdgeChainItem;
@@ -367,7 +369,7 @@ typedef struct LineartRenderBuffer {
bool use_shadow;
bool use_contour_secondary; /* From viewing camera, during shadow calculation. */
- bool needs_shadow_separation;
+ char shadow_selection;
bool fuzzy_intersections;
bool fuzzy_everything;
@@ -925,6 +927,7 @@ void MOD_lineart_gpencil_generate(LineartCache *cache,
unsigned char intersection_mask,
short thickness,
float opacity,
+ unsigned char shadow_selection,
const char *source_vgname,
const char *vgname,
int modifier_flags);
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_chain.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_chain.c
index 1b56fe1fb33..be45a112fd0 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_chain.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_chain.c
@@ -93,6 +93,7 @@ static LineartEdgeChainItem *lineart_chain_append_point(LineartRenderBuffer *rb,
char type,
int level,
unsigned char material_mask_bits,
+ unsigned char shadow_mask_bits,
size_t index)
{
LineartEdgeChainItem *eci;
@@ -105,6 +106,7 @@ static LineartEdgeChainItem *lineart_chain_append_point(LineartRenderBuffer *rb,
old_eci->line_type = type;
old_eci->occlusion = level;
old_eci->material_mask_bits = material_mask_bits;
+ old_eci->shadow_mask_bits = shadow_mask_bits;
return old_eci;
}
@@ -117,6 +119,7 @@ static LineartEdgeChainItem *lineart_chain_append_point(LineartRenderBuffer *rb,
eci->line_type = type & LRT_EDGE_FLAG_ALL_TYPE;
eci->occlusion = level;
eci->material_mask_bits = material_mask_bits;
+ eci->shadow_mask_bits = shadow_mask_bits;
BLI_addtail(&ec->chain, eci);
return eci;
@@ -130,6 +133,7 @@ static LineartEdgeChainItem *lineart_chain_prepend_point(LineartRenderBuffer *rb
char type,
int level,
unsigned char material_mask_bits,
+ unsigned char shadow_mask_bits,
size_t index)
{
LineartEdgeChainItem *eci;
@@ -147,6 +151,7 @@ static LineartEdgeChainItem *lineart_chain_prepend_point(LineartRenderBuffer *rb
eci->line_type = type & LRT_EDGE_FLAG_ALL_TYPE;
eci->occlusion = level;
eci->material_mask_bits = material_mask_bits;
+ eci->shadow_mask_bits = shadow_mask_bits;
BLI_addhead(&ec->chain, eci);
return eci;
@@ -160,6 +165,7 @@ void MOD_lineart_chain_feature_lines(LineartRenderBuffer *rb)
LineartEdgeSegment *es;
int last_occlusion;
unsigned char last_transparency;
+ unsigned char last_shadow;
/* Used when converting from double. */
float use_fbcoord[4];
float use_gpos[3];
@@ -219,6 +225,7 @@ void MOD_lineart_chain_feature_lines(LineartRenderBuffer *rb)
e->flags,
es->occlusion,
es->material_mask_bits,
+ es->shadow_mask_bits,
e->v1->index);
while (ba && (new_e = lineart_line_get_connected(
ba, new_vt, &new_vt, e->flags, ec->intersection_mask))) {
@@ -256,15 +263,18 @@ void MOD_lineart_chain_feature_lines(LineartRenderBuffer *rb)
new_e->flags,
es->occlusion,
es->material_mask_bits,
+ es->shadow_mask_bits,
new_e->v1->index);
last_occlusion = es->occlusion;
last_transparency = es->material_mask_bits;
+ last_shadow = es->shadow_mask_bits;
}
}
else if (new_vt == new_e->v2) {
es = new_e->segments.first;
last_occlusion = es->occlusion;
last_transparency = es->material_mask_bits;
+ last_shadow = es->shadow_mask_bits;
es = es->next;
for (; es; es = es->next) {
double gpos[3], lpos[3];
@@ -282,9 +292,11 @@ void MOD_lineart_chain_feature_lines(LineartRenderBuffer *rb)
new_e->flags,
last_occlusion,
last_transparency,
+ last_shadow,
new_e->v2->index);
last_occlusion = es->occlusion;
last_transparency = es->material_mask_bits;
+ last_shadow = es->shadow_mask_bits;
}
VERT_COORD_TO_FLOAT(new_e->v2);
lineart_chain_prepend_point(rb,
@@ -295,6 +307,7 @@ void MOD_lineart_chain_feature_lines(LineartRenderBuffer *rb)
new_e->flags,
last_occlusion,
last_transparency,
+ last_shadow,
new_e->v2->index);
}
ba = MOD_lineart_get_bounding_area(rb, new_vt->fbcoord[0], new_vt->fbcoord[1]);
@@ -320,6 +333,7 @@ void MOD_lineart_chain_feature_lines(LineartRenderBuffer *rb)
es = e->segments.first;
last_occlusion = ((LineartEdgeSegment *)es)->occlusion;
last_transparency = ((LineartEdgeSegment *)es)->material_mask_bits;
+ last_shadow = ((LineartEdgeSegment *)es)->shadow_mask_bits;
for (es = es->next; es; es = es->next) {
double gpos[3], lpos[3];
double *lfb = e->v1->fbcoord, *rfb = e->v2->fbcoord;
@@ -336,9 +350,11 @@ void MOD_lineart_chain_feature_lines(LineartRen
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list