Updated all files to new format
[platform/core/uifw/dali-demo.git] / examples / waves / shaders / waves.vert
1 #define FMA(a, b, c) ((a) * (b) + (c))  // fused multiply-add
2
3 precision highp float;
4
5 const float kTile = 1.;
6
7 const float kPi = 3.1415926535;
8 const float kEpsilon = 1. / 32.;
9
10 // DALI uniforms
11 uniform vec3 uSize;
12 uniform mat4 uModelView;
13 uniform mat4 uProjection;
14 uniform mat3 uNormalMatrix;
15
16 // our uniforms
17 uniform float uTime;
18 uniform vec2 uScrollScale;
19 uniform float uWaveRate;
20 uniform float uWaveAmplitude;
21 uniform float uParallaxAmount;
22
23 attribute vec2 aPosition;
24 attribute vec2 aTexCoord;
25
26 varying vec2 vUv;
27 varying vec3 vViewPos;
28 varying vec3 vNormal;
29 varying float vHeight;
30
31 float CubicHermite(float B, float C, float t)
32 {
33   float dCB = (C - B) * .5;
34   float A = B - dCB;
35   float D = B + dCB;
36   vec3 p = vec3(D + .5 * (((B - C) * 3.) - A), A - 2.5 * B + 2. * C - D,
37     .5 * (C - A));
38   return FMA(FMA(FMA(p.x, t, p.y), t, p.z), t, B);
39 }
40
41 float Hash(float n)
42 {
43   return fract(sin(n) * 43751.5453123);
44 }
45
46 float HeightAtTile(vec2 pos)
47 {
48   float rate = Hash(Hash(pos.x) * Hash(pos.y));
49
50   return (sin(uTime * rate * uWaveRate) * .5 + .5) * uWaveAmplitude;
51 }
52
53 float CalculateHeight(vec2 position)
54 {
55   vec2 tile = floor(position);
56   position = fract(position);
57
58   vec2 cp = vec2(
59     CubicHermite(
60       HeightAtTile(tile + vec2( kTile * -0.5, kTile * -0.5)),
61       HeightAtTile(tile + vec2( kTile * +0.5, kTile * -0.5)),
62       position.x),
63     CubicHermite(
64       HeightAtTile(tile + vec2( kTile * -0.5, kTile * +0.5)),
65       HeightAtTile(tile + vec2( kTile * +0.5, kTile * +0.5)),
66       position.x)
67   );
68
69   return CubicHermite(cp.x, cp.y, position.y);
70 }
71
72 vec3 CalculateNormal(vec2 position)
73 {
74   vec3 normal = vec3(
75     CalculateHeight(vec2(position.x - kEpsilon, position.y)) -
76       CalculateHeight(vec2(position.x + kEpsilon, position.y)),
77     .25,
78     CalculateHeight(vec2(position.x, position.y - kEpsilon)) -
79       CalculateHeight(vec2(position.x, position.y + kEpsilon))
80   );
81   return normal;
82 }
83
84 void main()
85 {
86   vUv = aTexCoord;
87
88   vec2 scrollPosition = aPosition * uScrollScale + vec2(0., uTime * -kPi);
89   vNormal = uNormalMatrix * CalculateNormal(scrollPosition);
90
91   float h = CalculateHeight(scrollPosition);
92   vHeight = h * uParallaxAmount;
93   vec3 position = vec3(aPosition.x, h, aPosition.y);
94
95   vec4 viewPosition = uModelView * vec4(position * uSize, 1.);
96   vViewPos = -viewPosition.xyz;
97
98   gl_Position = uProjection * viewPosition;
99 }