better water
[carveJwlIkooP6JGAAIwe30JlM.git] / shaders / planeinf.h
1 #ifndef SHADER_planeinf_H
2 #define SHADER_planeinf_H
3 static void shader_planeinf_link(void);
4 static void shader_planeinf_register(void);
5 static struct vg_shader _shader_planeinf = {
6 .name = "planeinf",
7 .link = shader_planeinf_link,
8 .vs =
9 {
10 .orig_file = "../shaders/standard.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 vec4 aColour;\n"
23 "out vec2 aUv;\n"
24 "out vec3 aNorm;\n"
25 "out vec3 aCo;\n"
26 "\n"
27 "void main()\n"
28 "{\n"
29 " gl_Position = uPv * vec4( uMdl * vec4(a_co,1.0), 1.0 );\n"
30 " aColour = a_colour;\n"
31 " aUv = a_uv;\n"
32 " aNorm = mat3(uMdl) * a_norm;\n"
33 " aCo = a_co;\n"
34 "}\n"
35 ""},
36 .fs =
37 {
38 .orig_file = "../shaders/planeinf.fs",
39 .static_src =
40 "vec4 water_surf( vec3 halfview, vec3 vnorm, float depthvalue, \n"
41 " vec4 beneath, vec4 above )\n"
42 "{\n"
43 " vec3 colour_shore = vec3( 0.21, 0.6, 0.8 );\n"
44 " vec3 colour_ocean = vec3( 0.01, 0.1, 0.2 );\n"
45 " vec3 surface_tint = mix(colour_shore, colour_ocean, depthvalue);\n"
46 "\n"
47 " float ffresnel = pow(1.0-dot( vnorm, halfview ),5.0);\n"
48 "\n"
49 " vec3 lightdir = vec3(0.95,0.0,-0.3);\n"
50 " vec3 specdir = reflect( -lightdir, vnorm );\n"
51 " float spec = pow(max(dot(halfview,specdir),0.0),20.0)*0.3;\n"
52 " \n"
53 " // Depth \n"
54 " float depthblend = pow( beneath.a,0.8 );\n"
55 "\n"
56 " // Composite\n"
57 " vec3 vsurface = mix(surface_tint, above.rgb, ffresnel );\n"
58 " //vsurface += spec;\n"
59 "\n"
60 " return vec4( vsurface,depthblend );\n"
61 "}\n"
62 "\n"
63 "#line 2 0 \n"
64 "\n"
65 "out vec4 FragColor;\n"
66 "\n"
67 "uniform vec3 uCamera;\n"
68 "uniform vec4 uPlane;\n"
69 "\n"
70 "in vec4 aColour;\n"
71 "in vec2 aUv;\n"
72 "in vec3 aNorm;\n"
73 "in vec3 aCo;\n"
74 "\n"
75 "float ray_plane( vec3 pos, vec3 dir, vec4 plane )\n"
76 "{\n"
77 " float d = dot( plane.xyz, dir );\n"
78 " float t = dot((plane.xyz*plane.w - pos),plane.xyz) / d;\n"
79 " return t;\n"
80 "}\n"
81 "\n"
82 "void main()\n"
83 "{\n"
84 " float fdist = ray_plane( uCamera, -aNorm, uPlane );\n"
85 " vec3 world_pos = uCamera - aNorm*fdist;\n"
86 "\n"
87 " FragColor = vec4(fract(world_pos*0.1),1.0);\n"
88 "}\n"
89 ""},
90 };
91
92 static GLuint _uniform_planeinf_uPv;
93 static GLuint _uniform_planeinf_uMdl;
94 static GLuint _uniform_planeinf_uCamera;
95 static GLuint _uniform_planeinf_uPlane;
96 static void shader_planeinf_uPv(m4x4f m){
97 glUniformMatrix4fv( _uniform_planeinf_uPv, 1, GL_FALSE, (float *)m );
98 }
99 static void shader_planeinf_uMdl(m4x3f m){
100 glUniformMatrix4x3fv( _uniform_planeinf_uMdl, 1, GL_FALSE, (float *)m );
101 }
102 static void shader_planeinf_uCamera(v3f v){
103 glUniform3fv( _uniform_planeinf_uCamera, 1, v );
104 }
105 static void shader_planeinf_uPlane(v4f v){
106 glUniform4fv( _uniform_planeinf_uPlane, 1, v );
107 }
108 static void shader_planeinf_register(void){
109 vg_shader_register( &_shader_planeinf );
110 }
111 static void shader_planeinf_use(void){ glUseProgram(_shader_planeinf.id); }
112 static void shader_planeinf_link(void){
113 _uniform_planeinf_uPv = glGetUniformLocation( _shader_planeinf.id, "uPv" );
114 _uniform_planeinf_uMdl = glGetUniformLocation( _shader_planeinf.id, "uMdl" );
115 _uniform_planeinf_uCamera = glGetUniformLocation( _shader_planeinf.id, "uCamera" );
116 _uniform_planeinf_uPlane = glGetUniformLocation( _shader_planeinf.id, "uPlane" );
117 }
118 #endif /* SHADER_planeinf_H */