diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2019-01-10 19:59:11 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2019-01-11 18:00:23 +0300 |
commit | 621a6d4a5de872a94f81d239ff627d24afecc56b (patch) | |
tree | e5b563f388f9a7f635b8255549c33b49d1ce83ff /source/blender/gpu | |
parent | 5f3fdee53a3e2716013147029e6da9e90e2c8ba8 (diff) |
UVEdit: Add back uv angle stretch aspect correction
This is now done in shader so that the batches are shared across ImageUV
areas.
Diffstat (limited to 'source/blender/gpu')
-rw-r--r-- | source/blender/gpu/GPU_shader.h | 3 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_shader.c | 8 | ||||
-rw-r--r-- | source/blender/gpu/shaders/gpu_shader_2D_edituvs_stretch_vert.glsl | 30 |
3 files changed, 39 insertions, 2 deletions
diff --git a/source/blender/gpu/GPU_shader.h b/source/blender/gpu/GPU_shader.h index ea7983f8a2e..71536523caf 100644 --- a/source/blender/gpu/GPU_shader.h +++ b/source/blender/gpu/GPU_shader.h @@ -349,7 +349,8 @@ typedef enum GPUBuiltinShader { GPU_SHADER_2D_UV_EDGES, GPU_SHADER_2D_UV_EDGES_SMOOTH, GPU_SHADER_2D_UV_FACES, - GPU_SHADER_2D_UV_FACES_STRETCH, + GPU_SHADER_2D_UV_FACES_STRETCH_AREA, + GPU_SHADER_2D_UV_FACES_STRETCH_ANGLE, /* Selection */ GPU_SHADER_3D_FLAT_SELECT_ID, GPU_SHADER_3D_UNIFORM_SELECT_ID, diff --git a/source/blender/gpu/intern/gpu_shader.c b/source/blender/gpu/intern/gpu_shader.c index 88d4f1e5c52..8a3581c54df 100644 --- a/source/blender/gpu/intern/gpu_shader.c +++ b/source/blender/gpu/intern/gpu_shader.c @@ -933,7 +933,10 @@ static const GPUShaderStages builtin_shader_stages[GPU_NUM_BUILTIN_SHADERS] = { [GPU_SHADER_2D_UV_FACES] = { datatoc_gpu_shader_2D_edituvs_faces_vert_glsl, datatoc_gpu_shader_flat_color_frag_glsl }, - [GPU_SHADER_2D_UV_FACES_STRETCH] = + [GPU_SHADER_2D_UV_FACES_STRETCH_AREA] = + { datatoc_gpu_shader_2D_edituvs_stretch_vert_glsl, + datatoc_gpu_shader_2D_smooth_color_frag_glsl }, + [GPU_SHADER_2D_UV_FACES_STRETCH_ANGLE] = { datatoc_gpu_shader_2D_edituvs_stretch_vert_glsl, datatoc_gpu_shader_2D_smooth_color_frag_glsl }, @@ -1010,6 +1013,9 @@ static const char *gpu_shader_get_builtin_shader_defines( case GPU_SHADER_3D_UNIFORM_SELECT_ID: return "#define UNIFORM_ID\n"; + case GPU_SHADER_2D_UV_FACES_STRETCH_ANGLE: + return "#define STRETCH_ANGLE\n"; + default: return NULL; } 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); } |