summaryrefslogtreecommitdiff
path: root/gsk/vulkan/resources/outset-shadow.vert
blob: 6fdaf1717125c61a91e30a27a045d33bd99169ca (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#version 420 core

#include "clip.vert.glsl"

layout(location = 0) in vec4 inOutline;
layout(location = 1) in vec4 inOutlineCornerWidths;
layout(location = 2) in vec4 inOutlineCornerHeights;
layout(location = 3) in vec4 inColor;
layout(location = 4) in vec2 inOffset;
layout(location = 5) in float inSpread;
layout(location = 6) in float inBlurRadius;

layout(location = 0) out vec2 outPos;
layout(location = 1) out flat vec4 outOutline;
layout(location = 2) out flat vec4 outOutlineCornerWidths;
layout(location = 3) out flat vec4 outOutlineCornerHeights;
layout(location = 4) out flat vec4 outColor;
layout(location = 5) out flat vec2 outOffset;
layout(location = 6) out flat float outSpread;
layout(location = 7) out flat float outBlurRadius;

vec2 offsets[6] = { vec2(0.0, 0.0),
                    vec2(1.0, 0.0),
                    vec2(0.0, 1.0),
                    vec2(0.0, 1.0),
                    vec2(1.0, 0.0),
                    vec2(1.0, 1.0) };

float radius_pixels(float radius) {
  return radius * (3.0 * sqrt(2 * 3.141592653589793) / 4) * 1.5;
}

void main() {
  vec4 rect = inOutline;
  float spread = inSpread + radius_pixels(inBlurRadius);
  rect += vec4(inOffset - spread, vec2(2 * spread));
  
  clip (inOutline);

  vec2 pos = rect.xy + rect.zw * offsets[gl_VertexIndex];
  gl_Position = push.mvp * vec4 (pos, 0.0, 1.0);
  outPos = pos;

  outOutline = inOutline;
  outOutlineCornerWidths = inOutlineCornerWidths;
  outOutlineCornerHeights = inOutlineCornerHeights;
  outColor = inColor;
  outOffset = inOffset;
  outSpread = inSpread;
  outBlurRadius = inBlurRadius;
}