e50253c9854de1bf6d232e375385c186c646d426
[carveJwlIkooP6JGAAIwe30JlM.git] / shaders / water.h
1 #ifndef SHADER_water_H
2 #define SHADER_water_H
3 static void shader_water_link(void);
4 static void shader_water_register(void);
5 static struct vg_shader _shader_water = {
6 .name = "water",
7 .link = shader_water_link,
8 .vs =
9 {
10 .orig_file = "../shaders/water.vs",
11 .static_src =
12 "layout (location=0) in vec3 a_co;\n"
13 "layout (location=1) in vec3 a_norm;\n"
14 "layout (location=2) in vec4 a_colour;\n"
15 "layout (location=3) in vec2 a_uv;\n"
16 "\n"
17 "#line 2 0 \n"
18 "\n"
19 "uniform mat4 uPv;\n"
20 "uniform mat4x3 uMdl;\n"
21 "\n"
22 "out vec2 aUv;\n"
23 "\n"
24 "void main()\n"
25 "{\n"
26 " vec3 world_pos = uMdl * vec4( a_co, 1.0 );\n"
27 " gl_Position = uPv * vec4(world_pos,1.0);\n"
28 " aUv = vec2(world_pos[0],world_pos[2])*0.15;\n"
29 "}\n"
30 ""},
31 .fs =
32 {
33 .orig_file = "../shaders/water.fs",
34 .static_src =
35 "out vec4 FragColor;\n"
36 "\n"
37 "uniform sampler2D uTexMain;\n"
38 "uniform sampler2D uTexDudv;\n"
39 "uniform vec2 uInvRes;\n"
40 "uniform float uTime;\n"
41 "\n"
42 "in vec2 aUv;\n"
43 "\n"
44 "void main()\n"
45 "{\n"
46 " vec2 ssuv = gl_FragCoord.xy*uInvRes;\n"
47 " vec4 dudva = texture( uTexDudv, aUv + vec2(uTime*0.04f,uTime*0.03f) );\n"
48 " vec4 dudvb = texture( uTexDudv, aUv - vec2(uTime*0.1,uTime*0.054) );\n"
49 "\n"
50 " vec2 distortamt = (dudva.rg-0.5) * (dudvb.ba-0.5) * 2.0;\n"
51 "\n"
52 " vec4 reflected = texture( uTexMain, ssuv+distortamt );\n"
53 " FragColor = vec4(reflected.rgb*1.0,reflected.a);\n"
54 "}\n"
55 ""},
56 };
57
58 static GLuint _uniform_water_uPv;
59 static GLuint _uniform_water_uMdl;
60 static GLuint _uniform_water_uTexMain;
61 static GLuint _uniform_water_uTexDudv;
62 static GLuint _uniform_water_uInvRes;
63 static GLuint _uniform_water_uTime;
64 static void shader_water_uPv(m4x4f m){
65 glUniformMatrix4fv( _uniform_water_uPv, 1, GL_FALSE, (float *)m );
66 }
67 static void shader_water_uMdl(m4x3f m){
68 glUniformMatrix4x3fv( _uniform_water_uMdl, 1, GL_FALSE, (float *)m );
69 }
70 static void shader_water_uTexMain(int i){
71 glUniform1i( _uniform_water_uTexMain, i );
72 }
73 static void shader_water_uTexDudv(int i){
74 glUniform1i( _uniform_water_uTexDudv, i );
75 }
76 static void shader_water_uInvRes(v2f v){
77 glUniform2fv( _uniform_water_uInvRes, 1, v );
78 }
79 static void shader_water_uTime(float f){
80 glUniform1f( _uniform_water_uTime, f );
81 }
82 static void shader_water_register(void){
83 vg_shader_register( &_shader_water );
84 }
85 static void shader_water_use(void){ glUseProgram(_shader_water.id); }
86 static void shader_water_link(void){
87 _uniform_water_uPv = glGetUniformLocation( _shader_water.id, "uPv" );
88 _uniform_water_uMdl = glGetUniformLocation( _shader_water.id, "uMdl" );
89 _uniform_water_uTexMain = glGetUniformLocation( _shader_water.id, "uTexMain" );
90 _uniform_water_uTexDudv = glGetUniformLocation( _shader_water.id, "uTexDudv" );
91 _uniform_water_uInvRes = glGetUniformLocation( _shader_water.id, "uInvRes" );
92 _uniform_water_uTime = glGetUniformLocation( _shader_water.id, "uTime" );
93 }
94 #endif /* SHADER_water_H */