Asset loading with metadesk
parent
e3186e68f9
commit
68bd1d5d68
@ -0,0 +1,4 @@
|
||||
@image merchant:
|
||||
{
|
||||
filepath = "merchant.png",
|
||||
}
|
@ -0,0 +1,83 @@
|
||||
#include <stdio.h>
|
||||
|
||||
#define assert(cond, explanation) { if(!cond) { printf("Codegen assertion %s failed: %.*s\n", #cond, MD_S8VArg(explanation)); exit(1); } }
|
||||
|
||||
#pragma warning(disable : 4996) // nonsense about fopen being insecure
|
||||
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable : 4244) // loss of data warning
|
||||
#pragma warning(disable : 4101) // unreferenced local variable
|
||||
#include "md.h"
|
||||
#include "md.c"
|
||||
#pragma warning(pop)
|
||||
|
||||
|
||||
MD_String8 OUTPUT_FOLDER = MD_S8LitComp("gen"); // no trailing slash
|
||||
MD_String8 ASSETS_FOLDER = MD_S8LitComp("assets");
|
||||
|
||||
#define log(...) { printf("Codegen: "); printf(__VA_ARGS__); }
|
||||
|
||||
void dump(MD_ParseResult parse) {
|
||||
// Iterate through each top-level node
|
||||
for(MD_EachNode(node, parse.node->first_child))
|
||||
{
|
||||
printf("/ %.*s\n", MD_S8VArg(node->string));
|
||||
|
||||
// Print the name of each of the node's tags
|
||||
for(MD_EachNode(tag, node->first_tag))
|
||||
{
|
||||
printf("|-- Tag %.*s\n", MD_S8VArg(tag->string));
|
||||
}
|
||||
|
||||
// Print the name of each of the node's children
|
||||
for(MD_EachNode(child, node->first_child))
|
||||
{
|
||||
printf("|-- Child %.*s\n", MD_S8VArg(child->string));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
MD_Arena *cg_arena = MD_ArenaAlloc();
|
||||
assert(cg_arena, MD_S8Lit("Memory"));
|
||||
|
||||
// I hope to God MD_String8's are null terminated...
|
||||
MD_String8 writeto = MD_S8Fmt(cg_arena, "%.*s/assets.gen.c", MD_S8VArg(OUTPUT_FOLDER));
|
||||
log("Writing to %.*s\n", MD_S8VArg(writeto));
|
||||
FILE *output = fopen(writeto.str, "w");
|
||||
|
||||
MD_ParseResult parse = MD_ParseWholeFile(cg_arena, MD_S8Lit("assets.mdesk"));
|
||||
|
||||
//dump(parse);
|
||||
|
||||
MD_String8List declarations_list = {0};
|
||||
MD_String8List load_list = {0};
|
||||
for(MD_EachNode(node, parse.node->first_child)) {
|
||||
if(MD_S8Match(node->first_tag->string, MD_S8Lit("image"), 0)) {
|
||||
MD_String8 variable_name = MD_S8Fmt(cg_arena, "image_%.*s", MD_S8VArg(node->string));
|
||||
log("New image variable %.*s\n", MD_S8VArg(variable_name));
|
||||
MD_String8 filepath = {0};
|
||||
for(MD_EachNode(child, node->first_child)) {
|
||||
if(MD_S8Match(child->string, MD_S8Lit("filepath"), 0)) {
|
||||
filepath = child->next->next->string;
|
||||
}
|
||||
}
|
||||
filepath = MD_S8Fmt(cg_arena, "%.*s/%.*s", MD_S8VArg(ASSETS_FOLDER), MD_S8VArg(filepath));
|
||||
assert(filepath.str != 0, MD_S8Fmt(cg_arena, "No filepath specified for image '%.*s'", MD_S8VArg(node->string)));
|
||||
FILE *asset_file = fopen(filepath.str, "r");
|
||||
assert(asset_file, MD_S8Fmt(cg_arena, "Could not open filepath %.*s for asset '%.*s'", MD_S8VArg(filepath), MD_S8VArg(node->string)));
|
||||
fclose(asset_file);
|
||||
|
||||
MD_S8ListPush(cg_arena, &declarations_list, MD_S8Fmt(cg_arena, "sg_image %.*s = {0};\n", MD_S8VArg(variable_name)));
|
||||
MD_S8ListPush(cg_arena, &load_list, MD_S8Fmt(cg_arena, "%.*s = load_image(\"%.*s\");\n", MD_S8VArg(variable_name), MD_S8VArg(filepath)));
|
||||
}
|
||||
}
|
||||
|
||||
MD_StringJoin join = MD_ZERO_STRUCT;
|
||||
MD_String8 declarations = MD_S8ListJoin(cg_arena, declarations_list, &join);
|
||||
MD_String8 loads = MD_S8ListJoin(cg_arena, load_list, &join);
|
||||
fprintf(output, "%.*s\nvoid load_assets() {\n%.*s\n}", MD_S8VArg(declarations), MD_S8VArg(loads));
|
||||
|
||||
fclose(output);
|
||||
return 0;
|
||||
}
|
@ -1,8 +1,14 @@
|
||||
@echo off
|
||||
rmdir /S /q gen
|
||||
mkdir gen
|
||||
|
||||
@REM shaders
|
||||
thirdparty\sokol-shdc.exe --input quad.glsl --output gen\quad-sapp.glsl.h --slang glsl330:hlsl5:metal_macos || goto :error
|
||||
|
||||
@REM metadesk codegen
|
||||
cl /Ithirdparty /W3 /Zi /WX codegen.c || goto :error
|
||||
codegen || goto :error
|
||||
|
||||
goto :EOF
|
||||
|
||||
:error
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue