From 621a6d4a5de872a94f81d239ff627d24afecc56b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Thu, 10 Jan 2019 17:59:11 +0100 Subject: UVEdit: Add back uv angle stretch aspect correction This is now done in shader so that the batches are shared across ImageUV areas. --- .../gpu_shader_2D_edituvs_stretch_vert.glsl | 30 ++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'source/blender/gpu/shaders') diff --git a/source/blender/gpu/shaders/gpu_shader_2D_edituvs_stretch_vert.glsl b/source/blender/gpu/shaders/gpu_shader_2D_edituvs_stretch_vert.glsl index 4588e41573b..c575e06ed3b 100644 --- a/source/blender/gpu/shaders/gpu_shader_2D_edituvs_stretch_vert.glsl +++ b/source/blender/gpu/shaders/gpu_shader_2D_edituvs_stretch_vert.glsl @@ -1,8 +1,16 @@ uniform mat4 ModelViewProjectionMatrix; +uniform vec2 aspect; in vec2 pos; + +#ifndef STRETCH_ANGLE in float stretch; +#else + +in vec4 uv_adj; +in float angle; +#endif noperspective out vec4 finalColor; @@ -42,8 +50,30 @@ vec3 weight_to_rgb(float weight) return r_rgb; } +#define M_PI 3.1415926535897932 + +/* Adapted from BLI_math_vector.h */ +float angle_normalized_v2v2(vec2 v1, vec2 v2) +{ + v1 = normalize(v1 * aspect); + v2 = normalize(v2 * aspect); + /* this is the same as acos(dot_v3v3(v1, v2)), but more accurate */ + bool q = (dot(v1, v2) >= 0.0); + vec2 v = (q) ? (v1 - v2) : (v1 + v2); + float a = 2.0 * asin(length(v) / 2.0); + return (q) ? a : M_PI - a; +} + void main() { gl_Position = ModelViewProjectionMatrix * vec4(pos, 0.0, 1.0); + +#ifdef STRETCH_ANGLE + float uv_angle = angle_normalized_v2v2(uv_adj.xy, uv_adj.zw) / M_PI; + float stretch = 1.0 - abs(uv_angle - angle); + stretch = stretch; + stretch = 1.0 - stretch * stretch; +#endif + finalColor = vec4(weight_to_rgb(stretch), 1.0); } -- cgit v1.2.3