aboutsummaryrefslogtreecommitdiff
path: root/assets/shaders/TwistVert.vert.glsl
blob: 29cb30eafc1155b1cdbdccc748875d4d56f1f71a (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
/* <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_twistAmount;
uniform float u_center;

// texture sampler uniforms
uniform sampler2D u_tex0;
uniform sampler2D u_tex1;

uniform vec4 color;


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

//varying vec4 v_color;
varying float v_zNormal;
varying vec2 v_texcoord;


float GetAngle( float t )
{
	float angle= 0.0;
	if (t < u_limit2)
	{
		if (t < u_limit1)
		{
			angle = u_twistAmount;
		}
		else
		{
			angle = (t - u_limit2)/(u_limit1 - u_limit2)*u_twistAmount;
		}
	}

	return angle;
}


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

	//v_color = vec4(texcoord.x, texcoord.y, 0, 1);

	v_zNormal = 1.0;
	if (uv.x < u_limit2)
	{
		float angle = GetAngle( uv.x );
		float cs = cos(angle),  sn = sin(angle);

		pos.y -= u_center;
		vec3 ctrPt = pos;
		float y = pos.y*cs - pos.z*sn + u_center;
		pos.z   = pos.y*sn + pos.z*cs;
		pos.y = y;

		// rotate the normal
		mat3 rotMat = mat3( vec3( 1.0,  0.0,  0.0 ),  vec3( 0.0,   cs,   sn ),  vec3( 0.0,  -sn,   cs ) );
		vec3 pt0 = ctrPt, pt1 = vec3(ctrPt.x, ctrPt.y+1.0, ctrPt.z),  pt2 = vec3( ctrPt.x+1.0, ctrPt.y, ctrPt.z);
		pt0 = rotMat * pt0;  pt1 = rotMat * pt1;
		angle = GetAngle(1.0);
		cs = cos(angle); sn = sin(angle);
		rotMat = mat3( vec3( 1.0,  0.0,  0.0 ),  vec3( 0.0,   cs,   sn ),  vec3( 0.0,  -sn,   cs ) );
		pt2 = rotMat * pt2;
		pt0.y += u_center;  pt1.y += u_center;  pt2.y += u_center;
		//vec4 nrm = u_projMatrix * u_mvMatrix * vec4( cross(pt1-pt0, pt2-pt0), 1.0 );
		vec4 nrm = vec4( cross(pt1-pt0, pt2-pt0), 1.0 );
		
		//v_zNormal   = normal.y*sn + normal.z*cs;
		v_zNormal   = -nrm.z;
	}

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