[Bf-blender-cvs] [a7ae8379f24] lineart-shadow: LineArt: Enclosed light/shadow shape support
YimingWu
noreply at git.blender.org
Mon Apr 11 17:10:11 CEST 2022
Commit: a7ae8379f245eecd23cfba22e493ec6d7115ac20
Author: YimingWu
Date: Mon Apr 11 23:09:45 2022 +0800
Branches: lineart-shadow
https://developer.blender.org/rBa7ae8379f245eecd23cfba22e493ec6d7115ac20
LineArt: Enclosed light/shadow shape support
===================================================================
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_cpu.c
M source/blender/makesdna/DNA_lineart_types.h
M source/blender/makesrna/intern/rna_gpencil_modifier.c
===================================================================
diff --git a/source/blender/blenkernel/intern/gpencil_modifier.c b/source/blender/blenkernel/intern/gpencil_modifier.c
index dc95816be75..91ef830edcc 100644
--- a/source/blender/blenkernel/intern/gpencil_modifier.c
+++ b/source/blender/blenkernel/intern/gpencil_modifier.c
@@ -222,6 +222,7 @@ GpencilLineartLimitInfo BKE_gpencil_get_lineart_modifier_limits(const Object *ob
(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);
+ is_first = false;
}
}
}
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c b/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c
index 9ff7d0defb9..caa247c0d94 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencillineart.c
@@ -366,7 +366,7 @@ static void edge_types_panel_draw(const bContext *UNUSED(C), Panel *panel)
uiItemR(sub, ptr, "use_light_contour", 0, NULL, ICON_NONE);
uiItemR(sub, ptr, "use_shadow", 0, IFACE_("Cast Shadow"), ICON_NONE);
- uiItemR(sub, ptr, "shadow_region_filtering", 0, NULL, ICON_NONE);
+ uiItemR(sub, ptr, "shadow_region_filtering", 0, IFACE_("Regions"), ICON_NONE);
uiItemR(layout, ptr, "use_overlap_edge_type_support", 0, IFACE_("Allow Overlap"), ICON_NONE);
}
@@ -400,6 +400,8 @@ static void options_light_reference_draw(const bContext *UNUSED(C), Panel *panel
uiLayout *col = uiLayoutColumn(remaining, true);
uiItemR(col, ptr, "shadow_camera_near", 0, "Near", ICON_NONE);
uiItemR(col, ptr, "shadow_camera_far", 0, "Far", ICON_NONE);
+
+ uiItemR(layout, ptr, "shadow_enclosed_shapes", 0, IFACE_("Eclosed Shapes"), ICON_NONE);
}
static void options_panel_draw(const bContext *UNUSED(C), Panel *panel)
diff --git a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
index 22fa1517202..3135cf142c3 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
+++ b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
@@ -116,6 +116,7 @@ typedef struct LineartShadowSegmentContainer {
double fbc1[4], fbc2[4];
double g1[3], g2[3];
struct LineartEdge *e_ref;
+ struct LineartEdgeSegment *es_ref; /* Only for 3rd stage casting. */
ListBase shadow_segments;
} LineartShadowSegmentContainer;
@@ -169,7 +170,10 @@ typedef enum eLineArtVertFlags {
typedef struct LineartEdge {
struct LineartVert *v1, *v2;
+ /** These two variables are also used to specify original edge and segment during 3rd stage
+ * reprojection, So we can easily find out the line which results come from. */
struct LineartTriangle *t1, *t2;
+
ListBase segments;
char min_occ;
@@ -369,7 +373,8 @@ typedef struct LineartRenderBuffer {
bool use_shadow;
bool use_contour_secondary; /* From viewing camera, during shadow calculation. */
- char shadow_selection;
+ int shadow_selection; /* Needs to be numeric because it's not just on/off. */
+ bool shadow_enclose_shapes;
bool fuzzy_intersections;
bool fuzzy_everything;
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
index c28ea6c769f..244e600df8d 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
@@ -135,6 +135,8 @@ static void lineart_add_edge_to_list(LineartPendingEdges *pe, LineartEdge *e);
static LineartCache *lineart_init_cache(void);
+static void lineart_clear_linked_edges(LineartRenderBuffer *rb);
+
static void lineart_discard_segment(LineartRenderBuffer *rb, LineartEdgeSegment *es)
{
BLI_spin_lock(&rb->lock_cuts);
@@ -166,6 +168,12 @@ static LineartEdgeSegment *lineart_give_segment(LineartRenderBuffer *rb)
sizeof(LineartEdgeSegment));
}
+#define LRT_SHADOW_MASK_UNDEFINED 0
+#define LRT_SHADOW_MASK_LIT (1 << 0)
+#define LRT_SHADOW_MASK_SHADED (1 << 1)
+#define LRT_SHADOW_MASK_ENCLOSED_SHAPE (1 << 2)
+#define LRT_SHADOW_MASK_INHIBITED (1 << 3)
+
/**
* Cuts the edge in image space and mark occlusion level for each segment.
*/
@@ -317,7 +325,17 @@ static void lineart_edge_cut(LineartRenderBuffer *rb,
es->occlusion += mat_occlusion;
es->material_mask_bits |= material_mask_bits;
/* Currently only register lit/shade, see LineartEdgeSegment::shadow_mask_bits for details. */
- es->shadow_mask_bits |= shadow_bits;
+ if (shadow_bits == LRT_SHADOW_MASK_ENCLOSED_SHAPE) {
+ if (es->shadow_mask_bits == LRT_SHADOW_MASK_LIT) {
+ es->shadow_mask_bits = LRT_SHADOW_MASK_INHIBITED;
+ }
+ else if (es->shadow_mask_bits == LRT_SHADOW_MASK_SHADED) {
+ es->shadow_mask_bits = LRT_SHADOW_MASK_LIT;
+ }
+ }
+ else {
+ es->shadow_mask_bits |= shadow_bits;
+ }
}
/* Reduce adjacent cutting points of the same level, which saves memory. */
@@ -2148,10 +2166,6 @@ static LineartEdge *lineart_find_matching_edge(LineartElementLinkNode *shadow_el
return NULL;
}
-#define LRT_SHADOW_MASK_UNDEFINED 0
-#define LRT_SHADOW_MASK_LIT (1 << 0)
-#define LRT_SHADOW_MASK_SHADED (1 << 1)
-
static void lineart_register_shadow_cuts(LineartRenderBuffer *rb,
LineartEdge *e,
LineartEdge *shadow_edge)
@@ -3936,21 +3950,12 @@ static void lineart_main_get_view_vector(LineartRenderBuffer *rb)
}
}
-static void lineart_destroy_render_data(LineartRenderBuffer *rb)
+static void lineart_destroy_render_data_keep_init(LineartRenderBuffer *rb)
{
if (rb == NULL) {
return;
}
- memset(&rb->contour, 0, sizeof(ListBase));
- memset(&rb->crease, 0, sizeof(ListBase));
- memset(&rb->intersection, 0, sizeof(ListBase));
- memset(&rb->edge_mark, 0, sizeof(ListBase));
- memset(&rb->material, 0, sizeof(ListBase));
- memset(&rb->floating, 0, sizeof(ListBase));
- memset(&rb->light_contour, 0, sizeof(ListBase));
- memset(&rb->shadow, 0, sizeof(ListBase));
-
BLI_listbase_clear(&rb->chains);
BLI_listbase_clear(&rb->wasted_cuts);
@@ -3958,44 +3963,26 @@ static void lineart_destroy_render_data(LineartRenderBuffer *rb)
BLI_listbase_clear(&rb->line_buffer_pointers);
BLI_listbase_clear(&rb->triangle_buffer_pointers);
- BLI_spin_end(&rb->lock_task);
- BLI_spin_end(&rb->lock_cuts);
- BLI_spin_end(&rb->render_data_pool.lock_mem);
-
- for (int i = 0; i < rb->bounding_area_initial_count; i++) {
- BLI_spin_end(&rb->lock_bounding_areas[i]);
+ if (rb->pending_edges.array) {
+ MEM_freeN(rb->pending_edges.array);
}
-
- MEM_freeN(rb->pending_edges.array);
-
lineart_mem_destroy(&rb->render_data_pool);
}
-
-static void lineart_destroy_render_data_keep_init(LineartRenderBuffer *rb)
+static void lineart_destroy_render_data(LineartRenderBuffer *rb)
{
if (rb == NULL) {
return;
}
- memset(&rb->contour, 0, sizeof(ListBase));
- memset(&rb->crease, 0, sizeof(ListBase));
- memset(&rb->intersection, 0, sizeof(ListBase));
- memset(&rb->edge_mark, 0, sizeof(ListBase));
- memset(&rb->material, 0, sizeof(ListBase));
- memset(&rb->floating, 0, sizeof(ListBase));
- memset(&rb->light_contour, 0, sizeof(ListBase));
- memset(&rb->shadow, 0, sizeof(ListBase));
-
- BLI_listbase_clear(&rb->chains);
- BLI_listbase_clear(&rb->wasted_cuts);
-
- BLI_listbase_clear(&rb->vertex_buffer_pointers);
- BLI_listbase_clear(&rb->line_buffer_pointers);
- BLI_listbase_clear(&rb->triangle_buffer_pointers);
+ BLI_spin_end(&rb->lock_task);
+ BLI_spin_end(&rb->lock_cuts);
+ BLI_spin_end(&rb->render_data_pool.lock_mem);
- MEM_freeN(rb->pending_edges.array);
+ for (int i = 0; i < rb->bounding_area_initial_count; i++) {
+ BLI_spin_end(&rb->lock_bounding_areas[i]);
+ }
- lineart_mem_destroy(&rb->render_data_pool);
+ lineart_destroy_render_data_keep_init(rb);
}
void MOD_lineart_destroy_render_data(LineartGpencilModifierData *lmd)
@@ -4145,6 +4132,7 @@ static LineartRenderBuffer *lineart_create_render_buffer(Scene *scene,
(lmd->light_contour_object != NULL));
rb->shadow_selection = lmd->shadow_selection_override;
+ rb->shadow_enclose_shapes = (lmd->calculation_flags & LRT_SHADOW_ENCLOSED_SHAPES) != 0;
rb->use_back_face_culling = (lmd->calculation_flags & LRT_USE_BACK_FACE_CULLING) != 0;
@@ -4680,6 +4668,31 @@ static void lineart_bounding_area_link_edge(LineartRenderBuffer *rb,
}
}
+static void lineart_clear_linked_edges_recursive(LineartRenderBuffer *rb,
+ LineartBoundingArea *root_ba)
+{
+ if (root_ba->child) {
+ for (int i = 0; i < 4; i++) {
+ lineart_clear_linked_edges_recursive(rb, &root_ba->child[i]);
+ }
+ }
+ else {
+ root_ba->line_count = 0;
+ root_ba->max_line_count = 128;
+ root_ba->linked_lines = lineart_mem_acquire(&rb->render_data_pool,
+ sizeof(LineartEdge *) * root_ba->max_line_count);
+ }
+}
+static void lineart_clear_linked_edges(LineartRenderBuffer *rb)
+{
+ LineartBoundingArea *ba = rb->initial_bounding_areas;
+ for (int i = 0; i < rb->tile_count_x; i++) {
+ for (int j = 0; j < rb->tile_count_x; j++) {
+ lineart_clear_linked_edges_recursive(rb, &ba[i * LRT_BA_ROWS + j]);
+ }
+ }
+}
+
/**
* Link lines to their respective bounding areas.
*/
@@ -5376,7 +5389,8 @@ static bool lineart_do_closest_segment(bool is_persp,
return true;
}
-static void lineart_shadow_create_container_array(LineartRenderBuffer *rb)
+static void lineart_shadow_create_container_array(LineartRenderBuffer *rb,
+ bool transform_edge_cuts)
{
#define DISCARD_NONSENSE_SEGMENTS \
if (es->occlusion != 0 || \
@@ -5444,6 +5458,7 @@ static void lineart_shadow_create_container_array(LineartRenderBuffer *rb)
BLI_addtail(&ssc[i].shadow_segments, &ss[i * 2 + 1]);
ssc[i].e_ref = e;
+ ssc[i].es_ref = es;
BLI_addtail(&rb->shadow_
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list