diff options
author | Philipp Oeser <info@graphics-engineer.com> | 2020-01-20 23:14:30 +0300 |
---|---|---|
committer | Philipp Oeser <info@graphics-engineer.com> | 2020-01-20 23:14:30 +0300 |
commit | b6051f1f01a466d2382a7915c956262c6e7c7674 (patch) | |
tree | eb31c9ee41fcf8e68c2c6e661e27c0a0750fe909 | |
parent | 6b902d78b3297e94258b677aa8a4a7a05efd2694 (diff) | |
parent | ddddb94517bc4315afe53665c870adc5192c1474 (diff) |
Merge branch 'blender-v2.82-release'
3 files changed, 75 insertions, 40 deletions
diff --git a/source/blender/draw/engines/overlay/shaders/antialiasing_frag.glsl b/source/blender/draw/engines/overlay/shaders/antialiasing_frag.glsl index 4784d420e1d..0d01f67c6ea 100644 --- a/source/blender/draw/engines/overlay/shaders/antialiasing_frag.glsl +++ b/source/blender/draw/engines/overlay/shaders/antialiasing_frag.glsl @@ -144,6 +144,8 @@ void main() vec4 lines = vec4(neightbor_line0.z, neightbor_line1.z, neightbor_line2.z, neightbor_line3.z); /* Count number of line neighbors. */ float blend = dot(vec4(0.25), step(0.001, lines)); + /* Only do blend if there is more than 2 neighbor. This avoid loosing too much AA. */ + blend = clamp(blend * 2.0 - 1.0, 0.0, 1.0); fragColor = mix(fragColor, fragColor / fragColor.a, blend); } #endif diff --git a/source/blender/draw/engines/overlay/shaders/outline_detect_frag.glsl b/source/blender/draw/engines/overlay/shaders/outline_detect_frag.glsl index f5a3aa2c332..c77c89396af 100644 --- a/source/blender/draw/engines/overlay/shaders/outline_detect_frag.glsl +++ b/source/blender/draw/engines/overlay/shaders/outline_detect_frag.glsl @@ -57,6 +57,34 @@ bvec4 gather_edges(vec2 uv, uint ref) return notEqual(ids, uvec4(ref)); } +/* Clockwise */ +vec2 rotate_90(vec2 v) +{ + return vec2(v.y, -v.x); +} +vec2 rotate_180(vec2 v) +{ + return vec2(-v.x, -v.y); +} +vec2 rotate_270(vec2 v) +{ + return vec2(-v.y, v.x); +} + +/* Counter-Clockwise */ +bvec4 rotate_90(bvec4 v) +{ + return v.yzwx; +} +bvec4 rotate_180(bvec4 v) +{ + return v.zwxy; +} +bvec4 rotate_270(bvec4 v) +{ + return v.wxyz; +} + /* Apply offset to line endpoint based on surrounding edges infos. */ bool line_offset(bvec2 edges, vec2 ofs, inout vec2 line_point) { @@ -79,6 +107,7 @@ bool line_offset(bvec2 edges, vec2 ofs, inout vec2 line_point) /* Use surrounding edges to approximate the outline direction to create smooth lines. */ void straight_line_dir(bvec4 edges1, bvec4 edges2, out vec2 line_start, out vec2 line_end) { + /* Y_POS as reference. Other cases are rotated to match reference. */ line_end = vec2(1.5, 0.5 + PROXIMITY_OFS); line_start = vec2(-line_end.x, line_end.y); @@ -92,53 +121,50 @@ void straight_line_dir(bvec4 edges1, bvec4 edges2, out vec2 line_start, out vec2 } } -/* Compute line direction vector from the bottom left corner. */ -void diag_dir(bvec4 edges, out vec2 line_start, out vec2 line_end) +vec2 diag_offset(bvec4 edges) { - /* TODO Improve diagonal antialiasing. */ + /* X_NEG | Y_POS as reference. Other cases are rotated to match reference. + * So the line is comming from bottom left. */ if (all(edges.wz)) { - line_start = vec2(-3.0, -0.5 + PROXIMITY_OFS); - line_end = vec2(3.0, 0.5 + PROXIMITY_OFS); + /* Horizontal line. */ + return vec2(2.5, 0.5); } else if (all(not(edges.xw))) { - line_start = vec2(-0.5 - PROXIMITY_OFS, -3.0); - line_end = vec2(0.5 - PROXIMITY_OFS, 3.0); + /* Vertical line. */ + return vec2(0.5, 2.5); } else if (edges.w) { - line_start = vec2(-1.0, -0.5 - PROXIMITY_OFS); - line_end = vec2(2.0, 0.5 - PROXIMITY_OFS); + /* Less horizontal Line. */ + return vec2(2.5, 0.5); } else { - line_start = vec2(-0.6, -0.5 + PROXIMITY_OFS); - line_end = vec2(0.6 - PROXIMITY_OFS, 0.5); + /* Less vertical Line. */ + return vec2(0.5, 2.5); } } -/* Clockwise */ -vec2 rotate_90(vec2 v) -{ - return vec2(v.y, -v.x); -} -vec2 rotate_180(vec2 v) -{ - return vec2(-v.x, -v.y); -} -vec2 rotate_270(vec2 v) -{ - return vec2(-v.y, v.x); -} -/* Counter-Clockwise */ -bvec4 rotate_90(bvec4 v) -{ - return v.yzwx; -} -bvec4 rotate_180(bvec4 v) -{ - return v.zwxy; -} -bvec4 rotate_270(bvec4 v) +/* Compute line direction vector from the bottom left corner. */ +void diag_dir(bvec4 edges1, bvec4 edges2, out vec2 line_start, out vec2 line_end) { - return v.wxyz; + /* Negate instead of rotating back the result of diag_offset. */ + edges2 = not(edges2); + edges2 = rotate_180(edges2); + line_end = diag_offset(edges1); + line_end += diag_offset(edges2); + + if (line_end.x == line_end.y) { + /* Perfect diagonal line. Push line start towards edge. */ + line_start = vec2(-1.0, 1.0) * PROXIMITY_OFS * 0.4; + } + else if (line_end.x > line_end.y) { + /* Horizontal Line. Lower line start. */ + line_start = vec2(0.0, PROXIMITY_OFS); + } + else { + /* Vertical Line. Push line start to the right. */ + line_start = -vec2(PROXIMITY_OFS, 0.0); + } + line_end += line_start; } void main() @@ -292,26 +318,33 @@ void main() /* Diagonal */ case DIAG_XNEG_YPOS: extra_edges = gather_edges(uvs + ofs.xy * vec2(1.5), ref); - diag_dir(extra_edges, line_start, line_end); + extra_edges2 = gather_edges(uvs + ofs.xy * vec2(-1.5), ref); + diag_dir(extra_edges, extra_edges2, line_start, line_end); break; case DIAG_XPOS_YNEG: extra_edges = gather_edges(uvs - ofs.xy * vec2(1.5), ref); + extra_edges2 = gather_edges(uvs - ofs.xy * vec2(-1.5), ref); extra_edges = rotate_180(extra_edges); - diag_dir(extra_edges, line_start, line_end); + extra_edges2 = rotate_180(extra_edges2); + diag_dir(extra_edges, extra_edges2, line_start, line_end); line_start = rotate_180(line_start); line_end = rotate_180(line_end); break; case DIAG_XPOS_YPOS: extra_edges = gather_edges(uvs + ofs.xy * vec2(1.5, -1.5), ref); + extra_edges2 = gather_edges(uvs - ofs.xy * vec2(1.5, -1.5), ref); extra_edges = rotate_90(extra_edges); - diag_dir(extra_edges, line_start, line_end); + extra_edges2 = rotate_90(extra_edges2); + diag_dir(extra_edges, extra_edges2, line_start, line_end); line_start = rotate_90(line_start); line_end = rotate_90(line_end); break; case DIAG_XNEG_YNEG: extra_edges = gather_edges(uvs - ofs.xy * vec2(1.5, -1.5), ref); + extra_edges2 = gather_edges(uvs + ofs.xy * vec2(1.5, -1.5), ref); extra_edges = rotate_270(extra_edges); - diag_dir(extra_edges, line_start, line_end); + extra_edges2 = rotate_270(extra_edges2); + diag_dir(extra_edges, extra_edges2, line_start, line_end); line_start = rotate_270(line_start); line_end = rotate_270(line_end); break; diff --git a/source/blender/editors/space_sequencer/sequencer_select.c b/source/blender/editors/space_sequencer/sequencer_select.c index a51b08f7525..ea93ef2e040 100644 --- a/source/blender/editors/space_sequencer/sequencer_select.c +++ b/source/blender/editors/space_sequencer/sequencer_select.c @@ -1292,7 +1292,7 @@ static bool select_grouped_time_overlap(Editing *ed, Sequence *actseq) bool changed = false; SEQP_BEGIN (ed, seq) { - if (!((seq->startdisp >= actseq->enddisp) || (seq->enddisp < actseq->startdisp))) { + if (seq->startdisp < actseq->enddisp && seq->enddisp > actseq->startdisp) { seq->flag |= SELECT; changed = true; } |