3 static void shader_wire_link(void);
4 static void shader_wire_register(void);
5 static struct vg_shader _shader_wire
= {
7 .link
= shader_wire_link
,
10 .orig_file
= "shaders/wire.vs.glsl",
12 "layout (location=0) in vec2 a_co;\n"
13 "uniform vec3 uStart;\n"
14 "uniform vec3 uEnd;\n"
16 "uniform float uCurve;\n"
18 "out vec2 aTexCoords;\n"
20 "vec3 sample_curve_time( float t ){\n"
21 " vec3 line_coord = mix( uStart, uEnd, t );\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"
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"
32 " vec2 line_tangent = normalize(p1.xy-p0.xy);\n"
33 " vec2 line_normal = vec2( -line_tangent.y, line_tangent.x );\n"
35 " vec2 worldfinal = p0.xy + line_normal*a_co.y*p0.z;\n"
37 " gl_Position = vec4( uPv * vec3(worldfinal, 1.0), 1.0 );\n"
39 " // Create texture coords (todo: include stretch adjusted coords?)\n"
40 " aTexCoords = vec2( a_co.x, a_co.y + 0.5 );\n"
45 .orig_file
= "shaders/wire.fs.glsl",
47 "out vec4 FragColor;\n"
49 "uniform sampler2D uTexMain;\n"
50 "uniform vec4 uColour;\n"
51 "uniform float uTime;\n"
52 "uniform float uGlow;\n"
54 "in vec2 aTexCoords;\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"
61 " vec3 colour_comp = mix( vec3(0.0,0.0,0.0), uColour.rgb, masking );\n"
63 " float flow_thing = fract( aTexCoords.x + uTime );\n"
64 " vec3 final_comp = colour_comp + flow_thing * uGlow;\n"
66 " FragColor = vec4( final_comp, max( shadow* 0.2, masking ) * uColour.a );\n"
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
);
82 static void shader_wire_uEnd(v3f
const v
){
83 glUniform3fv(_uniform_wire_uEnd
,1,v
);
85 static void shader_wire_uPv(m3x3f m
){
86 glUniformMatrix3fv(_uniform_wire_uPv
,1,GL_FALSE
,(float*)m
);
88 static void shader_wire_uCurve(float f
){
89 glUniform1f(_uniform_wire_uCurve
,f
);
91 static void shader_wire_uTexMain(int i
){
92 glUniform1i(_uniform_wire_uTexMain
,i
);
94 static void shader_wire_uColour(v4f
const v
){
95 glUniform4fv(_uniform_wire_uColour
,1,v
);
97 static void shader_wire_uTime(float f
){
98 glUniform1f(_uniform_wire_uTime
,f
);
100 static void shader_wire_uGlow(float f
){
101 glUniform1f(_uniform_wire_uGlow
,f
);
103 static void shader_wire_register(void){
104 vg_shader_register( &_shader_wire
);
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" );
117 #endif /* SHADER_wire_H */