first sorta working port
[fishladder.git] / shaders / button.h
1 #ifndef SHADER_button_H
2 #define SHADER_button_H
3 static void shader_button_link(void);
4 static void shader_button_register(void);
5 static struct vg_shader _shader_button = {
6 .name = "button",
7 .link = shader_button_link,
8 .vs =
9 {
10 .orig_file = "shaders/button.vs.glsl",
11 .static_src =
12 "layout (location=0) in vec2 a_co;\n"
13 "uniform vec4 uOffset; // Tile x/y, uv x/y\n"
14 "uniform mat3 uPv;\n"
15 "\n"
16 "out vec2 aTexCoords;\n"
17 "\n"
18 "void main(){\n"
19 " // Vertex transform\n"
20 " vec3 worldpos = vec3( a_co + uOffset.xy, 1.0 );\n"
21 " gl_Position = vec4( uPv * worldpos, 1.0 );\n"
22 "\n"
23 " // Create texture coords\n"
24 " vec2 edge_safe_coords = a_co * 0.98 + 0.01;\n"
25 " aTexCoords = (edge_safe_coords + uOffset.zw) * 0.25; \n"
26 "}\n"
27 ""},
28 .fs =
29 {
30 .orig_file = "shaders/button.fs.glsl",
31 .static_src =
32 "out vec4 FragColor;\n"
33 "\n"
34 "uniform sampler2D uTexMain;\n"
35 "uniform vec4 uColour; // rgb, light amount\n"
36 "\n"
37 "in vec2 aTexCoords;\n"
38 "\n"
39 "void main(){\n"
40 " vec4 glyph = texture( uTexMain, aTexCoords.xy );\n"
41 " \n"
42 " FragColor = vec4( uColour.rgb * \n"
43 " (mix(glyph.r,glyph.g,uColour.a)+0.02)*2.6 + glyph.b * 0.4, \n"
44 " glyph.a );\n"
45 "}\n"
46 ""},
47 };
48
49 static GLuint _uniform_button_uOffset;
50 static GLuint _uniform_button_uPv;
51 static GLuint _uniform_button_uTexMain;
52 static GLuint _uniform_button_uColour;
53 static void shader_button_uOffset(v4f const v){
54 glUniform4fv(_uniform_button_uOffset,1,v);
55 }
56 static void shader_button_uPv(m3x3f m){
57 glUniformMatrix3fv(_uniform_button_uPv,1,GL_FALSE,(float*)m);
58 }
59 static void shader_button_uTexMain(int i){
60 glUniform1i(_uniform_button_uTexMain,i);
61 }
62 static void shader_button_uColour(v4f const v){
63 glUniform4fv(_uniform_button_uColour,1,v);
64 }
65 static void shader_button_register(void){
66 vg_shader_register( &_shader_button );
67 }
68 static void shader_button_use(void){ glUseProgram(_shader_button.id); }
69 static void shader_button_link(void){
70 _uniform_button_uOffset = glGetUniformLocation( _shader_button.id, "uOffset" );
71 _uniform_button_uPv = glGetUniformLocation( _shader_button.id, "uPv" );
72 _uniform_button_uTexMain = glGetUniformLocation( _shader_button.id, "uTexMain" );
73 _uniform_button_uColour = glGetUniformLocation( _shader_button.id, "uColour" );
74 }
75 #endif /* SHADER_button_H */