first sorta working port
[fishladder.git] / shaders / tile_main.h
1 #ifndef SHADER_tile_main_H
2 #define SHADER_tile_main_H
3 static void shader_tile_main_link(void);
4 static void shader_tile_main_register(void);
5 static struct vg_shader _shader_tile_main = {
6 .name = "tile_main",
7 .link = shader_tile_main_link,
8 .vs =
9 {
10 .orig_file = "shaders/tile_main.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 "uniform mat2 uSubTransform;\n"
16 "uniform float uVisibility;\n"
17 "\n"
18 "out vec4 aTexCoords;\n"
19 "out vec2 aWorldCoords;\n"
20 "\n"
21 "vec2 hash22(vec2 p){\n"
22 " vec3 p3 = fract(vec3(p.xyx) * vec3(.1031, .1030, .0973));\n"
23 " p3 += dot(p3, p3.yzx+33.33);\n"
24 " return fract((p3.xx+p3.yz)*p3.zy);\n"
25 "}\n"
26 "\n"
27 "void main(){\n"
28 " vec2 hash_val = hash22(uOffset.xy);\n"
29 " float scaling_factor = smoothstep( hash_val.x, hash_val.x+1.0, uVisibility );\n"
30 "\n"
31 " // Vertex transform\n"
32 " vec2 subtransform = uSubTransform * (a_co-0.5) * scaling_factor + 0.5;\n"
33 " vec3 worldpos = vec3( subtransform + uOffset.xy, 1.0 );\n"
34 " gl_Position = vec4( uPv * worldpos, 1.0 );\n"
35 "\n"
36 " // Create texture coords\n"
37 " vec2 random_offset = floor(hash_val * 4.0) * 0.25;\n"
38 " vec2 edge_safe_coords = a_co * 0.98 + 0.01;\n"
39 " aTexCoords = vec4((edge_safe_coords + uOffset.zw) * 0.25, \n"
40 " edge_safe_coords * 0.25 + random_offset );\n"
41 " aWorldCoords = worldpos.xy; \n"
42 "}\n"
43 ""},
44 .fs =
45 {
46 .orig_file = "shaders/tile_main.fs.glsl",
47 .static_src =
48 "out vec4 FragColor;\n"
49 "\n"
50 "uniform sampler2D uTexGlyphs;\n"
51 "uniform sampler2D uTexGlow;\n"
52 "uniform sampler2D uTexWood;\n"
53 "uniform float uGhost;\n"
54 "uniform float uForeground;\n"
55 "uniform vec2 uMousePos;\n"
56 "uniform vec4 uColour;\n"
57 "uniform vec3 uShadowing;\n"
58 "uniform vec3 uGlowA;\n"
59 "uniform vec3 uGlowB;\n"
60 "\n"
61 "in vec4 aTexCoords;\n"
62 "in vec2 aWorldCoords;\n"
63 "\n"
64 "void main(){\n"
65 " vec4 glyph = texture( uTexGlyphs, aTexCoords.xy );\n"
66 " vec4 glyph_glow = texture( uTexGlow, aTexCoords.xy );\n"
67 " vec4 wood = texture( uTexWood, aTexCoords.zw );\n"
68 " vec4 wood_secondary = texture( uTexWood, aTexCoords.zw + 0.25 );\n"
69 " vec3 wood_comp = mix( wood_secondary.rgb * uShadowing, \n"
70 " wood.rgb, clamp( glyph.b*2.0-1.0, 0.0, 1.0 ) );\n"
71 " \n"
72 " vec3 shadows = mix( uShadowing, vec3(1.0,1.0,1.0), glyph.r );\n"
73 " vec4 output_regular = vec4( wood_comp * shadows, \n"
74 " mix( glyph.a, glyph.b, uForeground ) );\n"
75 " \n"
76 " float ghost_dist = clamp( 1.5-distance(uMousePos, aWorldCoords), 0.0, 1.0 );\n"
77 " vec4 output_ghost = vec4( 1.0, 1.0, 1.0, glyph.g*ghost_dist );\n"
78 " vec4 glow_comp = vec4(glyph_glow.b*uGlowA+glyph_glow.g*uGlowB,0.0);\n"
79 " \n"
80 " FragColor = mix( output_regular, output_ghost, uGhost )*uColour + glow_comp;\n"
81 "}\n"
82 ""},
83 };
84
85 static GLuint _uniform_tile_main_uOffset;
86 static GLuint _uniform_tile_main_uPv;
87 static GLuint _uniform_tile_main_uSubTransform;
88 static GLuint _uniform_tile_main_uVisibility;
89 static GLuint _uniform_tile_main_uTexGlyphs;
90 static GLuint _uniform_tile_main_uTexGlow;
91 static GLuint _uniform_tile_main_uTexWood;
92 static GLuint _uniform_tile_main_uGhost;
93 static GLuint _uniform_tile_main_uForeground;
94 static GLuint _uniform_tile_main_uMousePos;
95 static GLuint _uniform_tile_main_uColour;
96 static GLuint _uniform_tile_main_uShadowing;
97 static GLuint _uniform_tile_main_uGlowA;
98 static GLuint _uniform_tile_main_uGlowB;
99 static void shader_tile_main_uOffset(v4f const v){
100 glUniform4fv(_uniform_tile_main_uOffset,1,v);
101 }
102 static void shader_tile_main_uPv(m3x3f m){
103 glUniformMatrix3fv(_uniform_tile_main_uPv,1,GL_FALSE,(float*)m);
104 }
105 static void shader_tile_main_uSubTransform(m2x2f m){
106 glUniformMatrix2fv(_uniform_tile_main_uSubTransform,1,GL_FALSE,(float*)m);
107 }
108 static void shader_tile_main_uVisibility(float f){
109 glUniform1f(_uniform_tile_main_uVisibility,f);
110 }
111 static void shader_tile_main_uTexGlyphs(int i){
112 glUniform1i(_uniform_tile_main_uTexGlyphs,i);
113 }
114 static void shader_tile_main_uTexGlow(int i){
115 glUniform1i(_uniform_tile_main_uTexGlow,i);
116 }
117 static void shader_tile_main_uTexWood(int i){
118 glUniform1i(_uniform_tile_main_uTexWood,i);
119 }
120 static void shader_tile_main_uGhost(float f){
121 glUniform1f(_uniform_tile_main_uGhost,f);
122 }
123 static void shader_tile_main_uForeground(float f){
124 glUniform1f(_uniform_tile_main_uForeground,f);
125 }
126 static void shader_tile_main_uMousePos(v2f const v){
127 glUniform2fv(_uniform_tile_main_uMousePos,1,v);
128 }
129 static void shader_tile_main_uColour(v4f const v){
130 glUniform4fv(_uniform_tile_main_uColour,1,v);
131 }
132 static void shader_tile_main_uShadowing(v3f const v){
133 glUniform3fv(_uniform_tile_main_uShadowing,1,v);
134 }
135 static void shader_tile_main_uGlowA(v3f const v){
136 glUniform3fv(_uniform_tile_main_uGlowA,1,v);
137 }
138 static void shader_tile_main_uGlowB(v3f const v){
139 glUniform3fv(_uniform_tile_main_uGlowB,1,v);
140 }
141 static void shader_tile_main_register(void){
142 vg_shader_register( &_shader_tile_main );
143 }
144 static void shader_tile_main_use(void){ glUseProgram(_shader_tile_main.id); }
145 static void shader_tile_main_link(void){
146 _uniform_tile_main_uOffset = glGetUniformLocation( _shader_tile_main.id, "uOffset" );
147 _uniform_tile_main_uPv = glGetUniformLocation( _shader_tile_main.id, "uPv" );
148 _uniform_tile_main_uSubTransform = glGetUniformLocation( _shader_tile_main.id, "uSubTransform" );
149 _uniform_tile_main_uVisibility = glGetUniformLocation( _shader_tile_main.id, "uVisibility" );
150 _uniform_tile_main_uTexGlyphs = glGetUniformLocation( _shader_tile_main.id, "uTexGlyphs" );
151 _uniform_tile_main_uTexGlow = glGetUniformLocation( _shader_tile_main.id, "uTexGlow" );
152 _uniform_tile_main_uTexWood = glGetUniformLocation( _shader_tile_main.id, "uTexWood" );
153 _uniform_tile_main_uGhost = glGetUniformLocation( _shader_tile_main.id, "uGhost" );
154 _uniform_tile_main_uForeground = glGetUniformLocation( _shader_tile_main.id, "uForeground" );
155 _uniform_tile_main_uMousePos = glGetUniformLocation( _shader_tile_main.id, "uMousePos" );
156 _uniform_tile_main_uColour = glGetUniformLocation( _shader_tile_main.id, "uColour" );
157 _uniform_tile_main_uShadowing = glGetUniformLocation( _shader_tile_main.id, "uShadowing" );
158 _uniform_tile_main_uGlowA = glGetUniformLocation( _shader_tile_main.id, "uGlowA" );
159 _uniform_tile_main_uGlowB = glGetUniformLocation( _shader_tile_main.id, "uGlowB" );
160 }
161 #endif /* SHADER_tile_main_H */