first sorta working port
[fishladder.git] / shaders / wire.h
1 #ifndef SHADER_wire_H
2 #define SHADER_wire_H
3 static void shader_wire_link(void);
4 static void shader_wire_register(void);
5 static struct vg_shader _shader_wire = {
6 .name = "wire",
7 .link = shader_wire_link,
8 .vs =
9 {
10 .orig_file = "shaders/wire.vs.glsl",
11 .static_src =
12 "layout (location=0) in vec2 a_co;\n"
13 "uniform vec3 uStart;\n"
14 "uniform vec3 uEnd;\n"
15 "uniform mat3 uPv;\n"
16 "uniform float uCurve;\n"
17 "\n"
18 "out vec2 aTexCoords;\n"
19 "\n"
20 "vec3 sample_curve_time( float t ){\n"
21 " vec3 line_coord = mix( uStart, uEnd, t );\n"
22 "\n"
23 " float curve_amt = 1.0-(pow((t*2.0-1.0),2.0));\n"
24 " return vec3( line_coord.x, line_coord.y - curve_amt*uCurve, line_coord.z );\n"
25 "}\n"
26 "\n"
27 "void main(){\n"
28 " // Vertex transform\n"
29 " vec3 p0 = sample_curve_time( a_co.x );\n"
30 " vec3 p1 = sample_curve_time( a_co.x + 0.025 );\n"
31 " \n"
32 " vec2 line_tangent = normalize(p1.xy-p0.xy);\n"
33 " vec2 line_normal = vec2( -line_tangent.y, line_tangent.x );\n"
34 " \n"
35 " vec2 worldfinal = p0.xy + line_normal*a_co.y*p0.z;\n"
36 " \n"
37 " gl_Position = vec4( uPv * vec3(worldfinal, 1.0), 1.0 );\n"
38 "\n"
39 " // Create texture coords (todo: include stretch adjusted coords?)\n"
40 " aTexCoords = vec2( a_co.x, a_co.y + 0.5 );\n"
41 "}\n"
42 ""},
43 .fs =
44 {
45 .orig_file = "shaders/wire.fs.glsl",
46 .static_src =
47 "out vec4 FragColor;\n"
48 "\n"
49 "uniform sampler2D uTexMain;\n"
50 "uniform vec4 uColour;\n"
51 "uniform float uTime;\n"
52 "uniform float uGlow;\n"
53 "\n"
54 "in vec2 aTexCoords;\n"
55 "\n"
56 "void main(){\n"
57 " // Compute shadowing\n"
58 " float shadow = 1.0 - abs(aTexCoords.y - 0.5) * 2.0;\n"
59 " float masking = smoothstep( 0.5, 0.8, shadow );\n"
60 " \n"
61 " vec3 colour_comp = mix( vec3(0.0,0.0,0.0), uColour.rgb, masking );\n"
62 " \n"
63 " float flow_thing = fract( aTexCoords.x + uTime );\n"
64 " vec3 final_comp = colour_comp + flow_thing * uGlow;\n"
65 " \n"
66 " FragColor = vec4( final_comp, max( shadow* 0.2, masking ) * uColour.a );\n"
67 "}\n"
68 ""},
69 };
70
71 static GLuint _uniform_wire_uStart;
72 static GLuint _uniform_wire_uEnd;
73 static GLuint _uniform_wire_uPv;
74 static GLuint _uniform_wire_uCurve;
75 static GLuint _uniform_wire_uTexMain;
76 static GLuint _uniform_wire_uColour;
77 static GLuint _uniform_wire_uTime;
78 static GLuint _uniform_wire_uGlow;
79 static void shader_wire_uStart(v3f const v){
80 glUniform3fv(_uniform_wire_uStart,1,v);
81 }
82 static void shader_wire_uEnd(v3f const v){
83 glUniform3fv(_uniform_wire_uEnd,1,v);
84 }
85 static void shader_wire_uPv(m3x3f m){
86 glUniformMatrix3fv(_uniform_wire_uPv,1,GL_FALSE,(float*)m);
87 }
88 static void shader_wire_uCurve(float f){
89 glUniform1f(_uniform_wire_uCurve,f);
90 }
91 static void shader_wire_uTexMain(int i){
92 glUniform1i(_uniform_wire_uTexMain,i);
93 }
94 static void shader_wire_uColour(v4f const v){
95 glUniform4fv(_uniform_wire_uColour,1,v);
96 }
97 static void shader_wire_uTime(float f){
98 glUniform1f(_uniform_wire_uTime,f);
99 }
100 static void shader_wire_uGlow(float f){
101 glUniform1f(_uniform_wire_uGlow,f);
102 }
103 static void shader_wire_register(void){
104 vg_shader_register( &_shader_wire );
105 }
106 static void shader_wire_use(void){ glUseProgram(_shader_wire.id); }
107 static void shader_wire_link(void){
108 _uniform_wire_uStart = glGetUniformLocation( _shader_wire.id, "uStart" );
109 _uniform_wire_uEnd = glGetUniformLocation( _shader_wire.id, "uEnd" );
110 _uniform_wire_uPv = glGetUniformLocation( _shader_wire.id, "uPv" );
111 _uniform_wire_uCurve = glGetUniformLocation( _shader_wire.id, "uCurve" );
112 _uniform_wire_uTexMain = glGetUniformLocation( _shader_wire.id, "uTexMain" );
113 _uniform_wire_uColour = glGetUniformLocation( _shader_wire.id, "uColour" );
114 _uniform_wire_uTime = glGetUniformLocation( _shader_wire.id, "uTime" );
115 _uniform_wire_uGlow = glGetUniformLocation( _shader_wire.id, "uGlow" );
116 }
117 #endif /* SHADER_wire_H */