Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/gpu/shaders/gpu_shader_keyframe_diamond_vert.glsl')
-rw-r--r--source/blender/gpu/shaders/gpu_shader_keyframe_diamond_vert.glsl81
1 files changed, 65 insertions, 16 deletions
diff --git a/source/blender/gpu/shaders/gpu_shader_keyframe_diamond_vert.glsl b/source/blender/gpu/shaders/gpu_shader_keyframe_diamond_vert.glsl
index c49832bf9b4..26eb864821a 100644
--- a/source/blender/gpu/shaders/gpu_shader_keyframe_diamond_vert.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_keyframe_diamond_vert.glsl
@@ -1,34 +1,83 @@
uniform mat4 ModelViewProjectionMatrix;
+uniform vec2 ViewportSize = vec2(-1, -1);
-const float pixel_fudge = sqrt(2.0);
-const float outline_width = 1.15 * pixel_fudge;
+const float line_falloff = 1.0;
+const float circle_scale = sqrt(2.0 / 3.1416);
+const float square_scale = sqrt(0.5);
+
+const float diagonal_scale = sqrt(0.5);
in vec2 pos;
in float size;
in vec4 color;
in vec4 outlineColor;
-out vec4 finalColor;
-out vec4 finalOutlineColor;
-out vec4 radii;
+in int flags;
+
+flat out vec4 finalColor;
+flat out vec4 finalOutlineColor;
+
+flat out int finalFlags;
+
+flat out vec4 radii;
+flat out vec4 thresholds;
+
+bool test(int bit) {
+ return (flags & bit) != 0;
+}
+
+vec2 line_thresholds(float width) {
+ return vec2(max(0, width - line_falloff), width);
+}
void main() {
gl_Position = ModelViewProjectionMatrix * vec4(pos, 0.0, 1.0);
- // pass through unchanged
- gl_PointSize = size + pixel_fudge; // 0.5 pixel_fudge on either side
+ /* Align to pixel grid if the viewport size is known. */
+ if (ViewportSize.x > 0) {
+ vec2 scale = ViewportSize * 0.5;
+ vec2 px_pos = (gl_Position.xy + 1) * scale;
+ vec2 adj_pos = round(px_pos - 0.5) + 0.5;
+ gl_Position.xy = adj_pos / scale - 1;
+ }
+
+ /* Pass through parameters. */
finalColor = color;
finalOutlineColor = outlineColor;
+ finalFlags = flags;
+
+ if (!test(0xF)) {
+ finalFlags |= 1;
+ }
+
+ /* Size-dependent line thickness. */
+ float half_width = (0.06 + (size - 10) * 0.04);
+ float line_width = half_width + line_falloff;
+
+ /* Outline thresholds. */
+ thresholds.xy = line_thresholds(line_width);
+
+ /* Inner dot thresholds. */
+ thresholds.zw = line_thresholds(line_width * 1.6);
+
+ /* Extend the primitive size by half line width on either side; odd for symmetry. */
+ float ext_radius = round(0.5 * size) + thresholds.x;
+
+ gl_PointSize = ceil(ext_radius + thresholds.y) * 2 + 1;
+
+ /* Diamond radius. */
+ radii[0] = ext_radius * diagonal_scale;
+
+ /* Circle radius. */
+ radii[1] = ext_radius * circle_scale;
- // calculate concentric radii in pixels
- float radius = 0.5 * gl_PointSize;
+ /* Square radius. */
+ radii[2] = round(ext_radius * square_scale);
- // start at the outside and progress toward the center
- radii[0] = radius;
- radii[1] = radius - pixel_fudge;
- radii[2] = radius - outline_width;
- radii[3] = radius - outline_width - pixel_fudge;
+ /* Min/max cutout offset. */
+ radii[3] = -line_falloff;
- // convert to PointCoord units
- radii /= size;
+ /* Convert to PointCoord units. */
+ radii /= gl_PointSize;
+ thresholds /= gl_PointSize;
}