#include #include #include #include #include #include int main(int argc, const char** argv) { const char* slang = NULL; const char* vs_asm = NULL; const char* ps_asm = NULL; const char* vs_out = NULL; const char* ps_out = NULL; for(int i = 1; i < argc - 1; i+=2) { if(!strcmp(argv[i], "--slang")) slang = argv[i + 1]; else if(!strcmp(argv[i], "--vsource")) vs_asm = argv[i + 1]; else if(!strcmp(argv[i], "--psource")) ps_asm = argv[i + 1]; else if(!strcmp(argv[i], "--vsh")) vs_out = argv[i + 1]; else if(!strcmp(argv[i], "--psh")) ps_out = argv[i + 1]; } if(!slang || !vs_out || !ps_out || (!vs_asm && ps_asm) || (vs_asm && !ps_asm)) { printf("Usage :\n"); printf("%s --slang --vsh --psh \n", argv[0]); printf("%s --slang --vsource --psource --vsh --psh \n", argv[0]); } char* slang_buffer; size_t slang_filesize; { FILE* slang_file = fopen(slang, "rb"); fseek(slang_file, 0, SEEK_END); slang_filesize = ftell(slang_file); fseek(slang_file, 0, SEEK_SET); slang_buffer = malloc(slang_filesize + 1); fread(slang_buffer, 1, slang_filesize, slang_file); fclose(slang_file); } slang_buffer[slang_filesize] = '\0'; FILE* vs_out_fp = fopen(vs_out, "wb"); FILE* ps_out_fp = fopen(ps_out, "wb"); const char* line = "#version 150\n"; fwrite(line, 1, strlen(line),vs_out_fp); fwrite(line, 1, strlen(line),ps_out_fp); char* next = slang_buffer; bool vson = true; bool pson = true; while (*next) { const char* line = next; while (*next && *next != '\n' && *next != '\r') next++; if (*next == '\r') *next++ = '\0'; *next++ = '\0'; #if 0 while ((*next == '\n') || (*next == '\r')) *next++ = '\0'; #endif if(strstr(line, "#version")) continue; if(strstr(line, "#pragma")) { if(strstr(line, "#pragma stage vertex")) { vson = true; pson = false; } else if(strstr(line, "#pragma stage fragment")) { vson = false; pson = true; } continue; } char* layout = strstr(line, "layout("); if(layout) { while (*layout != ')') layout++; layout++; while (*layout && isspace(*layout)) layout++; if(!strncmp(layout, "uniform", 7)) line = layout; } if(vson) { fwrite(line, 1, strlen(line),vs_out_fp); fputc('\n', vs_out_fp); } if(pson) { fwrite(line, 1, strlen(line),ps_out_fp); fputc('\n', ps_out_fp); } } fclose(vs_out_fp); fclose(ps_out_fp); free(slang_buffer); return 0; }