[Bf-blender-cvs] [40efc9fb580] lineart-shadow: LineArt: Light contour reprojection is working.
YimingWu
noreply at git.blender.org
Tue Apr 12 11:12:30 CEST 2022
Commit: 40efc9fb5801629081724f28db4d5cadd5518433
Author: YimingWu
Date: Tue Apr 12 16:27:20 2022 +0800
Branches: lineart-shadow
https://developer.blender.org/rB40efc9fb5801629081724f28db4d5cadd5518433
LineArt: Light contour reprojection is working.
===================================================================
M source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
M source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
===================================================================
diff --git a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
index 3135cf142c3..a9d9c11e0f3 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 LineartEdge *e_ref_light_contour;
struct LineartEdgeSegment *es_ref; /* Only for 3rd stage casting. */
ListBase shadow_segments;
} LineartShadowSegmentContainer;
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
index 244e600df8d..d96284d6b56 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
@@ -326,7 +326,7 @@ static void lineart_edge_cut(LineartRenderBuffer *rb,
es->material_mask_bits |= material_mask_bits;
/* Currently only register lit/shade, see LineartEdgeSegment::shadow_mask_bits for details. */
if (shadow_bits == LRT_SHADOW_MASK_ENCLOSED_SHAPE) {
- if (es->shadow_mask_bits == LRT_SHADOW_MASK_LIT) {
+ if (es->shadow_mask_bits == LRT_SHADOW_MASK_LIT || e->flags & LRT_EDGE_FLAG_LIGHT_CONTOUR) {
es->shadow_mask_bits = LRT_SHADOW_MASK_INHIBITED;
}
else if (es->shadow_mask_bits == LRT_SHADOW_MASK_SHADED) {
@@ -2040,6 +2040,8 @@ static void lineart_load_tri_task(void *__restrict userdata,
tri->intersection_mask = ob_info->override_intersection_mask;
+ tri->target_reference = (ob_info->obindex | (i & LRT_OBINDEX_LOWER));
+
double gn[3];
float no[3];
normal_tri_v3(no, me->mvert[v1].co, me->mvert[v2].co, me->mvert[v3].co);
@@ -3208,7 +3210,8 @@ static bool lineart_edge_from_triangle(const LineartTriangle *tri,
bool allow_overlapping_edges)
{
/* Normally we just determine from the pointer address. */
- if (e->t1 == tri || e->t2 == tri) {
+ if (e->t1 && e->t1->target_reference == tri->target_reference ||
+ (e->t2 && e->t2->target_reference == tri->target_reference)) {
return true;
}
/* If allows overlapping, then we compare the vertex coordinates one by one to determine if one
@@ -5404,9 +5407,40 @@ static void lineart_shadow_create_container_array(LineartRenderBuffer *rb,
LRT_ITER_ALL_LINES_BEGIN
{
/* Only contour and loose edges can actually cast shadows. */
- if (!(e->flags & (LRT_EDGE_FLAG_CONTOUR | LRT_EDGE_FLAG_LOOSE))) {
+ if (!(e->flags &
+ (LRT_EDGE_FLAG_CONTOUR | LRT_EDGE_FLAG_LOOSE | LRT_EDGE_FLAG_LIGHT_CONTOUR))) {
continue;
}
+ if (e->flags == LRT_EDGE_FLAG_LIGHT_CONTOUR) {
+ /* Only reproject light contours that also doubles as a view contour. */
+ LineartEdge *orig_e = (LineartEdge *)e->t1;
+ if (!orig_e->t2) {
+ e->flags |= LRT_EDGE_FLAG_CONTOUR;
+ }
+ else {
+ double vv[3];
+ double *view_vector = vv;
+ double dot_1 = 0, dot_2 = 0;
+ double result;
+
+ if (rb->cam_is_persp) {
+ sub_v3_v3v3_db(view_vector, orig_e->v1->gloc, rb->camera_pos);
+ }
+ else {
+ view_vector = rb->view_vector;
+ }
+
+ dot_1 = dot_v3v3_db(view_vector, orig_e->t1->gn);
+ dot_2 = dot_v3v3_db(view_vector, orig_e->t2->gn);
+
+ if ((result = dot_1 * dot_2) <= 0 && (dot_1 + dot_2)) {
+ e->flags |= LRT_EDGE_FLAG_CONTOUR;
+ }
+ }
+ if (!(e->flags & LRT_EDGE_FLAG_CONTOUR)) {
+ continue;
+ }
+ }
LISTBASE_FOREACH (LineartEdgeSegment *, es, &e->segments) {
DISCARD_NONSENSE_SEGMENTS
segment_count++;
@@ -5457,7 +5491,16 @@ static void lineart_shadow_create_container_array(LineartRenderBuffer *rb,
BLI_addtail(&ssc[i].shadow_segments, &ss[i * 2]);
BLI_addtail(&ssc[i].shadow_segments, &ss[i * 2 + 1]);
- ssc[i].e_ref = e;
+ if (e->flags & LRT_EDGE_FLAG_LIGHT_CONTOUR) {
+ ssc[i].e_ref = e->t1;
+ ssc[i].e_ref_light_contour = e;
+ /* Restore original edge flag. */
+ e->flags &= (~LRT_EDGE_FLAG_CONTOUR);
+ }
+ else {
+ ssc[i].e_ref = e;
+ }
+
ssc[i].es_ref = es;
BLI_addtail(&rb->shadow_containers, &ssc[i]);
@@ -5960,7 +6003,8 @@ static bool lineart_shadow_cast_generate_edges(LineartRenderBuffer *rb,
e->v1 = v1;
e->v2 = v2;
e->t1 = (LineartTriangle *)ssc->e_ref; /* See LineartEdge::t1 for usage. */
- e->t2 = (LineartTriangle *)ssc->es_ref;
+ e->t2 = (LineartTriangle *)(ssc->e_ref_light_contour ? ssc->e_ref_light_contour :
+ ssc->e_ref);
e->target_reference = ss->target_reference;
e->flags = (LRT_EDGE_FLAG_PROJECTED_SHADOW |
((ss->flag & LRT_SHADOW_FACING_LIGHT) ? LRT_EDGE_FLAG_SHADOW_FACING_LIGHT : 0));
@@ -5977,8 +6021,7 @@ static bool lineart_shadow_cast_generate_edges(LineartRenderBuffer *rb,
//}
e->v1 = v1;
e->v2 = v2;
- e->t1 = (LineartTriangle *)ssc->e_ref;
- e->t2 = (LineartTriangle *)ssc->es_ref;
+ e->t1 = e->t2 = (LineartTriangle *)ssc->e_ref;
e->flags = LRT_EDGE_FLAG_LIGHT_CONTOUR;
i++;
}
@@ -6003,8 +6046,7 @@ __attribute__((optimize("O0"))) static void lineart_shadow_register_enclosed_sha
continue;
}
double next_at = es->next ? ((LineartEdgeSegment *)es->next)->at : 1.0f;
- LineartEdge *orig_e = (LineartEdge *)e->t1;
- LineartEdgeSegment *orig_es = (LineartEdge *)e->t2;
+ LineartEdge *orig_e = (LineartEdge *)e->t2;
/* Shadow view space to global. */
double ga1 = e->v1->fbcoord[3] * es->at /
More information about the Bf-blender-cvs
mailing list