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')
-rw-r--r--source/blender/gpu/GPU_shader.h3
-rw-r--r--source/blender/gpu/intern/gpu_shader.c8
-rw-r--r--source/blender/gpu/shaders/gpu_shader_2D_edituvs_stretch_vert.glsl30
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);
}