Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Groove/Ridge/Hidden borders #657

Merged
merged 3 commits into from Dec 22, 2016
Merged
Changes from 1 commit
Commits
File filter...
Filter file types
Jump to…
Jump to file
Failed to load files.

Always

Just for now

Proper groove & ridge borders support

  • Loading branch information
kvark committed Dec 22, 2016
commit cb9384e4ab973697a4345812d980db081c366eff
@@ -303,6 +303,44 @@ void draw_solid_border(float distanceFromMixLine, vec2 localPos) {
}
}

vec4 draw_mixed_edge(float distance, float border_len, vec4 color, vec2 brightness_mod) {
float modulator = distance / border_len > 0.5 ? brightness_mod.x : brightness_mod.y;
return vec4(color.xyz * modulator, color.a);
}

void draw_mixed_border(float distanceFromMixLine, float distanceFromMiddle, vec2 localPos, vec2 brightness_mod) {
switch (vBorderPart) {
case PST_TOP_LEFT:
case PST_TOP_RIGHT:
case PST_BOTTOM_LEFT:
case PST_BOTTOM_RIGHT: {
// This is the conversion factor for transformations and device pixel scaling.
float pixelsPerFragment = length(fwidth(localPos.xy));
vec4 color = get_fragment_color(distanceFromMixLine, pixelsPerFragment);

float distance = distance(vRefPoint, localPos) - vRadii.z;
float length = vRadii.x - vRadii.z;
if (distanceFromMiddle < 0.0) {
distance = length - distance;
}

oFragColor = 0.0 <= distance && distance <= length ?
draw_mixed_edge(distance, length, color, brightness_mod) : vec4(0.0, 0.0, 0.0, 0.0);
break;
}
case PST_BOTTOM:
case PST_TOP: {
oFragColor = draw_mixed_edge(localPos.y - vPieceRect.y, vPieceRect.w, vVerticalColor, brightness_mod);
break;
}
case PST_LEFT:
case PST_RIGHT: {
oFragColor = draw_mixed_edge(localPos.x - vPieceRect.x, vPieceRect.z, vHorizontalColor, brightness_mod);
break;
}
}
}

// TODO: Investigate performance of this shader and see
// if it's worthwhile splitting it / removing branches etc.
void main(void) {
@@ -318,10 +356,16 @@ void main(void) {
float distance_from_mix_line = (local_pos.x - vPieceRect.x) * vPieceRect.w -
(local_pos.y - vPieceRect.y) * vPieceRect.z;
distance_from_mix_line /= vPieceRectHypotenuseLength;
float distance_from_middle = (local_pos.x - vLocalRect.x) +
(local_pos.y - vLocalRect.y) -
0.5 * (vLocalRect.z + vLocalRect.w);
#else
float distance_from_mix_line = vDistanceFromMixLine;
float distance_from_middle = vDistanceFromMiddle;
#endif

vec2 brightness_mod = vec2(0.7, 1.3);

switch (vBorderStyle) {
case BORDER_STYLE_DASHED:
case BORDER_STYLE_DOTTED:
@@ -336,8 +380,12 @@ void main(void) {
case BORDER_STYLE_NONE:
draw_solid_border(distance_from_mix_line, local_pos);
break;
case BORDER_STYLE_GROOVE: //TODO
case BORDER_STYLE_RIDGE: //TODO
case BORDER_STYLE_GROOVE:
draw_mixed_border(distance_from_mix_line, distance_from_middle, local_pos, brightness_mod.yx);
break;
case BORDER_STYLE_RIDGE:
draw_mixed_border(distance_from_mix_line, distance_from_middle, local_pos, brightness_mod.xy);
break;
case BORDER_STYLE_HIDDEN:
default:
discard;
@@ -28,4 +28,6 @@ varying vec2 vLocalPos; // The clamped position in local space.
// These two are interpolated
varying float vDistanceFromMixLine; // This is the distance from the line where two colors
// meet in border corners.
varying float vDistanceFromMiddle; // This is the distance from the line between the top
// left corner and the bottom right.
#endif
@@ -55,45 +55,81 @@ void main(void) {
switch (sub_part) {
case PST_TOP_LEFT:
segment_rect = vec4(tl_outer, tl_inner - tl_outer);
vBorderStyle = int(border.style.x);
vHorizontalColor = border.colors[BORDER_LEFT];
vVerticalColor = border.colors[BORDER_TOP];
vRadii = vec4(border.radii[0].xy,
border.radii[0].xy - border.widths.xy);
break;
case PST_TOP_RIGHT:
segment_rect = vec4(tr_inner.x,
tr_outer.y,
tr_outer.x - tr_inner.x,
tr_inner.y - tr_outer.y);
vBorderStyle = int(border.style.y);
vHorizontalColor = border.colors[BORDER_TOP];
vVerticalColor = border.colors[BORDER_RIGHT];
vRadii = vec4(border.radii[0].zw,
border.radii[0].zw - border.widths.zy);
break;
case PST_BOTTOM_RIGHT:
segment_rect = vec4(br_inner, br_outer - br_inner);
vBorderStyle = int(border.style.z);
vHorizontalColor = border.colors[BORDER_BOTTOM];
vVerticalColor = border.colors[BORDER_RIGHT];
vRadii = vec4(border.radii[1].xy,
border.radii[1].xy - border.widths.zw);
break;
case PST_BOTTOM_LEFT:
segment_rect = vec4(bl_outer.x,
bl_inner.y,
bl_inner.x - bl_outer.x,
bl_outer.y - bl_inner.y);
vBorderStyle = int(border.style.w);
vHorizontalColor = border.colors[BORDER_BOTTOM];
vVerticalColor = border.colors[BORDER_LEFT];
vRadii = vec4(border.radii[1].zw,
border.radii[1].zw - border.widths.xw);
break;
case PST_LEFT:
segment_rect = vec4(tl_outer.x,
tl_inner.y,
border.widths.x,
bl_inner.y - tl_inner.y);
vBorderStyle = int(border.style.x);
vHorizontalColor = border.colors[BORDER_LEFT];
vVerticalColor = border.colors[BORDER_LEFT];
vRadii = vec4(0.0);
break;
case PST_RIGHT:
segment_rect = vec4(tr_outer.x - border.widths.z,
tr_inner.y,
border.widths.z,
br_inner.y - tr_inner.y);
vBorderStyle = int(border.style.z);
vHorizontalColor = border.colors[BORDER_RIGHT];
vVerticalColor = border.colors[BORDER_RIGHT];
vRadii = vec4(0.0);
break;
case PST_BOTTOM:
segment_rect = vec4(bl_inner.x,
bl_outer.y - border.widths.w,
br_inner.x - bl_inner.x,
border.widths.w);
vBorderStyle = int(border.style.w);
vHorizontalColor = border.colors[BORDER_BOTTOM];
vVerticalColor = border.colors[BORDER_BOTTOM];
vRadii = vec4(0.0);
break;
case PST_TOP:
segment_rect = vec4(tl_inner.x,
tl_outer.y,
tr_inner.x - tl_inner.x,
border.widths.y);
vBorderStyle = int(border.style.y);
vHorizontalColor = border.colors[BORDER_TOP];
vVerticalColor = border.colors[BORDER_TOP];
vRadii = vec4(0.0);
break;
}

@@ -117,61 +153,6 @@ void main(void) {
vLocalRect = prim.local_rect;
#endif

switch (sub_part) {
case PST_LEFT:
vBorderStyle = int(border.style.x);
vHorizontalColor = border.colors[BORDER_LEFT];
vVerticalColor = border.colors[BORDER_LEFT];
vRadii = vec4(0.0);
break;
case PST_TOP_LEFT:
vBorderStyle = int(border.style.x);
vHorizontalColor = border.colors[BORDER_LEFT];
vVerticalColor = border.colors[BORDER_TOP];
vRadii = vec4(border.radii[0].xy,
border.radii[0].xy - border.widths.xy);
break;
case PST_TOP:
vBorderStyle = int(border.style.y);
vHorizontalColor = border.colors[BORDER_TOP];
vVerticalColor = border.colors[BORDER_TOP];
vRadii = vec4(0.0);
break;
case PST_TOP_RIGHT:
vBorderStyle = int(border.style.y);
vHorizontalColor = border.colors[BORDER_TOP];
vVerticalColor = border.colors[BORDER_RIGHT];
vRadii = vec4(border.radii[0].zw,
border.radii[0].zw - border.widths.zy);
break;
case PST_RIGHT:
vBorderStyle = int(border.style.z);
vHorizontalColor = border.colors[BORDER_RIGHT];
vVerticalColor = border.colors[BORDER_RIGHT];
vRadii = vec4(0.0);
break;
case PST_BOTTOM_RIGHT:
vBorderStyle = int(border.style.z);
vHorizontalColor = border.colors[BORDER_BOTTOM];
vVerticalColor = border.colors[BORDER_RIGHT];
vRadii = vec4(border.radii[1].xy,
border.radii[1].xy - border.widths.zw);
break;
case PST_BOTTOM:
vBorderStyle = int(border.style.w);
vHorizontalColor = border.colors[BORDER_BOTTOM];
vVerticalColor = border.colors[BORDER_BOTTOM];
vRadii = vec4(0.0);
break;
case PST_BOTTOM_LEFT:
vBorderStyle = int(border.style.w);
vHorizontalColor = border.colors[BORDER_BOTTOM];
vVerticalColor = border.colors[BORDER_LEFT];
vRadii = vec4(border.radii[1].zw,
border.radii[1].zw - border.widths.xw);
break;
}

float x0, y0, x1, y1;
switch (sub_part) {
// These are the layer tile part PrimitivePart as uploaded by the tiling.rs
@@ -236,5 +217,8 @@ void main(void) {
#else
vDistanceFromMixLine = (vi.local_clamped_pos.x - x0) * height -
(vi.local_clamped_pos.y - y0) * width;
vDistanceFromMiddle = (vi.local_clamped_pos.x - vLocalRect.x) +
(vi.local_clamped_pos.y - vLocalRect.y) -
0.5 * (vLocalRect.z + vLocalRect.w);
#endif
}
@@ -2105,6 +2105,8 @@ impl FrameBuilder {
BorderStyle::Dotted |
BorderStyle::Dashed |
BorderStyle::Inset |
BorderStyle::Ridge |
BorderStyle::Groove |
BorderStyle::Outset |
BorderStyle::Double => {
return true;
ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.