2f7c16790fe6d81d900b9c2d535157b8d74ce3ec
1 #define STB_INCLUDE_IMPLEMENTATION
2 #define STB_INCLUDE_LINE_GLSL
3 #include "../dep/stb/stb_include.h"
13 static int uniform_count
;
15 static int compile_subshader( FILE *header
, char *name
)
18 char *full
= stb_include_file( name
, "", ".", error
);
22 fprintf( stderr
, "stb_include_file error:\n%s\n", error
);
29 fprintf( header
, "{\n"
30 ".orig_file = \"../shaders/%s\",\n"
31 ".static_src = \n", name
);
33 char *cur
= full
, *start
= full
;
37 if( c
== '\n' || c
== '\0' )
40 fputs( "\"", header
);
41 fputs( start
, header
);
43 if( !strncmp(start
,"uniform",7) )
46 struct uniform
*uf
= &uniform_buffer
[ uniform_count
++ ];
49 if( start
[i
] == '\0' )
55 strncpy( uf
->name
, start
, sizeof(uf
->name
) );
61 strncpy( uf
->type
, start
, sizeof(uf
->type
) );
70 fputs( "\"", header
);
74 fputs( "\\n\"\n", header
);
80 fputs( "},", header
);
87 int main( int argc
, char *argv
[] )
89 if( argc
< 2 || (argc
-1)%3 != 0 )
91 fprintf( stderr
, "invalid\n" );
96 int shader_count
= (argc
-1)/3;
97 for( int i
=0; i
<shader_count
; i
++ )
99 char **args
= &argv
[1+i
*3];
100 strcpy( path
, args
[0] );
101 strcat( path
, ".h" );
103 printf( "Compiling shader called '%s'\n", args
[0] );
105 FILE *header
= fopen( path
, "w" );
108 fprintf(stderr
, "Could not open '%s'\n", path
);
112 fprintf( header
, "#ifndef SHADER_%s_H\n"
113 "#define SHADER_%s_H\n", args
[0], args
[0] );
114 fprintf( header
, "static void shader_%s_link(void);\n", args
[0] );
115 fprintf( header
, "static void shader_%s_register(void);\n", args
[0] );
116 fprintf( header
, "static struct vg_shader _shader_%s = {\n"
118 " .link = shader_%s_link,\n"
119 " .vs = \n", args
[0], args
[0], args
[0] );
122 if( !compile_subshader(header
,args
[1]) )
128 fprintf( header
, "\n .fs = \n" );
129 if( !compile_subshader(header
,args
[2]) )
135 fprintf( header
, "\n};\n\n" );
137 for( int i
=0; i
<uniform_count
; i
++ )
139 struct uniform
*uf
= &uniform_buffer
[i
];
140 fprintf( header
, "static GLuint _uniform_%s_%s;\n", args
[0], uf
->name
);
143 for( int i
=0; i
<uniform_count
; i
++ )
145 struct uniform
*uf
= &uniform_buffer
[i
];
146 if( !strcmp(uf
->type
,"vec2") )
148 fprintf( header
, "static void shader_%s_%s(v2f v){\n"
149 " glUniform2fv( _uniform_%s_%s, 1, v );\n"
150 "}\n", args
[0], uf
->name
, args
[0], uf
->name
);
152 if( !strcmp(uf
->type
,"vec3") )
154 fprintf( header
, "static void shader_%s_%s(v3f v){\n"
155 " glUniform3fv( _uniform_%s_%s, 1, v );\n"
156 "}\n", args
[0], uf
->name
, args
[0], uf
->name
);
158 if( !strcmp(uf
->type
,"vec4") )
160 fprintf( header
, "static void shader_%s_%s(v4f v){\n"
161 " glUniform4fv( _uniform_%s_%s, 1, v );\n"
162 "}\n", args
[0], uf
->name
, args
[0], uf
->name
);
164 if( !strcmp(uf
->type
,"sampler2D") )
166 fprintf( header
, "static void shader_%s_%s(int i){\n"
167 " glUniform1i( _uniform_%s_%s, i );\n"
168 "}\n", args
[0], uf
->name
, args
[0], uf
->name
);
170 if( !strcmp(uf
->type
,"float") )
172 fprintf( header
, "static void shader_%s_%s(float f){\n"
173 " glUniform1f( _uniform_%s_%s, f );\n"
174 "}\n", args
[0], uf
->name
, args
[0], uf
->name
);
176 if( !strcmp(uf
->type
,"mat4x3") )
179 "static void shader_%s_%s(m4x3f m){\n"
180 " glUniformMatrix4x3fv"
181 "( _uniform_%s_%s, 1, GL_FALSE, (float *)m );\n"
182 "}\n", args
[0], uf
->name
, args
[0], uf
->name
);
184 if( !strcmp(uf
->type
,"mat3") )
187 "static void shader_%s_%s(m3x3f m){\n"
188 " glUniformMatrix3fv"
189 "( _uniform_%s_%s, 1, GL_FALSE, (float *)m );\n"
190 "}\n", args
[0], uf
->name
, args
[0], uf
->name
);
192 if( !strcmp(uf
->type
,"mat4") )
195 "static void shader_%s_%s(m4x4f m){\n"
196 " glUniformMatrix4fv"
197 "( _uniform_%s_%s, 1, GL_FALSE, (float *)m );\n"
198 "}\n", args
[0], uf
->name
, args
[0], uf
->name
);
203 "static void shader_%s_register(void){\n"
204 " vg_shader_register( &_shader_%s );\n"
209 "static void shader_%s_use(void){ glUseProgram(_shader_%s.id); }\n",
213 "static void shader_%s_link(void){\n",
216 for( int i
=0; i
<uniform_count
; i
++ )
218 struct uniform
*uf
= &uniform_buffer
[i
];
221 "glGetUniformLocation( _shader_%s.id, \"%s\" );\n",
226 fprintf( header
, "}\n" );
227 fprintf( header
, "#endif /* SHADER_%s_H */\n", args
[0] );