#include #include char shaders[][64] = { "altwater", "bloom_blur", "bloom_filter", "bloom_final", "colourtint", "crepuscular_opaque", "crepuscular_rays", "crepuscular_sky", "default2d", "defaultadditivesprite", "defaultskin", "defaultsky", "defaultsprite", "defaultwall", "defaultwarp", "drawflat_wall", "lpp_depthnorm", "lpp_light", "lpp_wall", "postproc_fisheye", "postproc_panorama", "rtlight", "underwaterwarp", "menutint", "terrain", "" }; void dumpprogstring(FILE *out, FILE *src) { int j; char line[1024]; while(fgets(line, sizeof(line), src)) { j = 0; while (line[j] == ' ' || line[j] == '\t') j++; if ((line[j] == '/' && line[j] == '/') || line[j] == '\r' || line[j] == '\n') { while (line[j]) fputc(line[j++], out); } else { fputc('\"', out); while (line[j] && line[j] != '\r' && line[j] != '\n') { if (line[j] == '\t') fputc(' ', out); else if (line[j] == '\"') { fputc('\\', out); fputc(line[j], out); } else fputc(line[j], out); j++; } fputs("\\n\"\n", out); } } } struct shadertype_s { char *filepattern; char *preprocessor; char *rendererapi; int apiversion; } shadertype[] = { {"glsl/%s.glsl", "GLQUAKE", "QR_OPENGL", 110}, //gl2+ {"gles/%s.glsl", "GLQUAKE", "QR_OPENGL", 100}, //gles {"hlsl9/%s.hlsl", "D3D9QUAKE", "QR_DIRECT3D9", 9}, //d3d9 {"hlsl11/%s.hlsl", "D3D11QUAKE", "QR_DIRECT3D11", 11}, //d3d11 }; //tbh we should precompile the d3d shaders. int main(void) { FILE *c, *s; char line[1024]; int i, j, a; c = fopen("../gl/r_bishaders.h", "wt"); if (!c) { printf("unable to open a file\n"); return; } fprintf(c, "/*\nWARNING: THIS FILE IS GENERATED BY '"__FILE__"'.\nYOU SHOULD NOT EDIT THIS FILE BY HAND\n*/\n\n"); for (i = 0; *shaders[i]; i++) { for (a = 0; a < sizeof(shadertype)/sizeof(shadertype[0]); a++) { sprintf(line, shadertype[a].filepattern, shaders[i]); s = fopen(line, "rt"); if (!s) { printf("unable to open %s\n", line); continue; } fprintf(c, "#ifdef %s\n", shadertype[a].preprocessor); fprintf(c, "{%s, %i, \"%s\",\n", shadertype[a].rendererapi, shadertype[a].apiversion, shaders[i]); while(fgets(line, sizeof(line), s)) { j = 0; while (line[j] == ' ' || line[j] == '\t') j++; if ((line[j] == '/' && line[j] == '/') || line[j] == '\r' || line[j] == '\n') { while (line[j]) fputc(line[j++], c); } else { fputc('\"', c); while (line[j] && line[j] != '\r' && line[j] != '\n') { if (line[j] == '\t') fputc(' ', c); else if (line[j] == '\"') { fputc('\\', c); fputc(line[j], c); } else fputc(line[j], c); j++; } fputs("\\n\"\n", c); } } fputs("},\n", c); fprintf(c, "#endif\n"); fclose(s); } } fclose(c); }