aboutsummaryrefslogtreecommitdiff
path: root/assets/shaders/Taper.vert.glsl
blob: eb562c2f974dd8f5649ce38045251ac64a25c1a2 (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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/* <copyright>
This file contains proprietary software owned by Motorola Mobility, Inc.<br/>
No rights, expressed or implied, whatsoever to this software are provided by Motorola Mobility, Inc. hereunder.<br/>
(c) Copyright 2011 Motorola Mobility, Inc.  All Rights Reserved.
</copyright> */


#ifdef GL_ES
precision highp float;
#endif


// attributes
attribute vec3 vert;
attribute vec3 normal;
attribute vec2 texcoord;

// scalar uniforms
uniform float u_limit1;
uniform float u_limit2;
uniform float u_limit3;
uniform float u_taperAmount;
uniform float u_minVal;
uniform float u_maxVal;
uniform float u_center;


// matrix uniforms
uniform mat4 u_mvMatrix;
uniform mat4 u_projMatrix;
uniform mat4 u_worldMatrix;

varying vec4 v_color;



float TaperAmount( float param )
{
	// Bezier coordinates of the X coordinate.
	// Adjust these to get tighter or looser
	float tightness = 0.8;

	float x0, y0,  x1, y1,  x2, y2;
	float t;
	if (param < 0.5)
	{
		t = 2.0*param;
		x0 = 0.0;  y0 = 0.0;
		x1 = tightness;  y1 = 0.0;
		x2 = 1.0;  y2 = 0.5;
	}
	else
	{
		t = (param - 0.5)*2.0;
		x0 = 0.0;  y0 = 0.5;
		x1 = 1.0 - tightness;  y1 = 1.0;
		x2 = 1.0;  y2 = 1.0;
	}

	float a = x0 - 2.0*x1 + x2;
	float b = 2.0*(x1 - x0);
	float c = x0 - t;

	float descr = sqrt( b*b - 4.0*a*c );
	float denom = 2.0*a;
	float n1 = (-b + descr)/denom;
	float n2 = (-b - descr)/denom;
	if      ((n1 >= 0.0) || (n1 <= 1.0))  t = n1;
	else if ((n2 >= 0.0) || (n2 <= 1.0))  t = n2;
	else
		t = 0.0;

	float ya = y0 + t*(y1 - y0);
	float yb = y1 + t*(y2 - y1);
	float yc = ya + t*(yb - ya);

	return yc;
}


void main(void)
{
	vec3 pos = vert;
	vec2 uv = texcoord;


	float	limit1 = u_limit1,
			limit2 = u_limit2,
			limit3 = u_limit2;

	v_color = vec4(texcoord.x, texcoord.y, 0, 1);
	if ((uv.x > u_limit1) && (uv.x < u_limit3))
	{
		float t;
		if (uv.x < u_limit2)
		{
			t = (uv.x - u_limit1)/(u_limit2 - u_limit1);
		}
		else
		{
			t = 1.0 - (uv.x - u_limit2)/(u_limit3 - u_limit2);
		}
		t = TaperAmount( t );

		float maxVal;
		if (pos.y > u_center)
		{
			maxVal = u_maxVal;
		}
		else
		{
			maxVal = u_minVal;
		}

		float yFrac = (pos.y - u_center)/(maxVal-u_center);
		pos.y = pos.y - yFrac * (maxVal - u_center)*t*u_taperAmount;
	}

	gl_Position = u_projMatrix * u_mvMatrix * vec4(pos,1.0) ;
}