first sorta working port
[fishladder.git] / shaders / ball.h
1 #ifndef SHADER_ball_H
2 #define SHADER_ball_H
3 static void shader_ball_link(void);
4 static void shader_ball_register(void);
5 static struct vg_shader _shader_ball = {
6 .name = "ball",
7 .link = shader_ball_link,
8 .vs =
9 {
10 .orig_file = "shaders/ball.vs.glsl",
11 .static_src =
12 "layout (location=0) in vec2 a_co;\n"
13 "uniform vec3 uOffset;\n"
14 "uniform mat3 uPv;\n"
15 "\n"
16 "out vec4 aTexCoords;\n"
17 "\n"
18 "void main(){\n"
19 " // Vertex transform\n"
20 " vec3 worldpos = vec3( (a_co * 0.5 - 0.25) * uOffset.z + uOffset.xy, 1.0 );\n"
21 " gl_Position = vec4( uPv * worldpos, 1.0 );\n"
22 "\n"
23 " // Create texture coords\n"
24 " aTexCoords = vec4( a_co, worldpos.xy );\n"
25 "}\n"
26 ""},
27 .fs =
28 {
29 .orig_file = "shaders/ball.fs.glsl",
30 .static_src =
31 "out vec4 FragColor;\n"
32 "\n"
33 "uniform sampler2D uTexMain;\n"
34 "uniform vec3 uColour;\n"
35 "uniform vec2 uTexOffset;\n"
36 "\n"
37 "in vec4 aTexCoords;\n"
38 "\n"
39 "void main(){\n"
40 " vec2 center_coords = aTexCoords.xy - 0.5;\n"
41 " vec2 center_coords_sqr = center_coords*center_coords;\n"
42 " float circle_factor = smoothstep( 0.07, 0.0625, \n"
43 " center_coords_sqr.x+center_coords_sqr.y );\n"
44 " \n"
45 " float bulge_amt = center_coords_sqr.x+center_coords_sqr.y;\n"
46 " vec2 warped_coords = aTexCoords.zw+uTexOffset - center_coords;\n"
47 " vec4 noise_sample = texture( uTexMain, warped_coords );\n"
48 " \n"
49 " float rim_light = (center_coords_sqr.x+center_coords_sqr.y)*15.0;\n"
50 " \n"
51 " vec2 shadow_coords = center_coords + vec2(0.02,0.07);\n"
52 " vec2 shadow_coords_sqr = shadow_coords*shadow_coords;\n"
53 " float shadow = exp(-((shadow_coords_sqr.x+shadow_coords_sqr.y)-0.0125)*15.0);\n"
54 " \n"
55 " vec3 marble_comp = uColour*0.6 + \n"
56 " (noise_sample.x*2.7+pow(rim_light,3.0)*2.0) * 0.1;\n"
57 " vec4 colour_comp = mix( vec4(0.0,0.0,0.0,shadow), \n"
58 " vec4(marble_comp,1.0), circle_factor );\n"
59 " FragColor = colour_comp;\n"
60 "}\n"
61 ""},
62 };
63
64 static GLuint _uniform_ball_uOffset;
65 static GLuint _uniform_ball_uPv;
66 static GLuint _uniform_ball_uTexMain;
67 static GLuint _uniform_ball_uColour;
68 static GLuint _uniform_ball_uTexOffset;
69 static void shader_ball_uOffset(v3f const v){
70 glUniform3fv(_uniform_ball_uOffset,1,v);
71 }
72 static void shader_ball_uPv(m3x3f m){
73 glUniformMatrix3fv(_uniform_ball_uPv,1,GL_FALSE,(float*)m);
74 }
75 static void shader_ball_uTexMain(int i){
76 glUniform1i(_uniform_ball_uTexMain,i);
77 }
78 static void shader_ball_uColour(v3f const v){
79 glUniform3fv(_uniform_ball_uColour,1,v);
80 }
81 static void shader_ball_uTexOffset(v2f const v){
82 glUniform2fv(_uniform_ball_uTexOffset,1,v);
83 }
84 static void shader_ball_register(void){
85 vg_shader_register( &_shader_ball );
86 }
87 static void shader_ball_use(void){ glUseProgram(_shader_ball.id); }
88 static void shader_ball_link(void){
89 _uniform_ball_uOffset = glGetUniformLocation( _shader_ball.id, "uOffset" );
90 _uniform_ball_uPv = glGetUniformLocation( _shader_ball.id, "uPv" );
91 _uniform_ball_uTexMain = glGetUniformLocation( _shader_ball.id, "uTexMain" );
92 _uniform_ball_uColour = glGetUniformLocation( _shader_ball.id, "uColour" );
93 _uniform_ball_uTexOffset = glGetUniformLocation( _shader_ball.id, "uTexOffset" );
94 }
95 #endif /* SHADER_ball_H */