diff --git a/nob.c b/nob.c index c8b6a6f..b31975b 100644 --- a/nob.c +++ b/nob.c @@ -11,7 +11,7 @@ const char *cflags[] = {"-g", "-rdynamic", "-lm", "-lwayland-client", "-lxkbcommon", "-lvulkan", "-lglfw"}; -const char *blacklist[] = {"parser.c"}; +const char *blacklist[] = {"parser.c", "paw_shh_gen.c"}; const char *comp = "cc"; const char *scomp = "glslc"; @@ -169,7 +169,17 @@ int main(int argc, char **argv) { for (int j = 0; j < len(cflags); j++) { cmd_append(&cmd, cflags[j]); } - cmd_append(&cmd, "-o", "main_layer", "main_layer.c"); + cmd_append(&cmd, "-o", "main", "main.c"); + for (int i = 0; i < src_cpaths.count; i++) { + cmd_append(&cmd, src_cpaths.items[i]); + } + cmd_run_sync_and_reset(&cmd); + + cmd_append(&cmd, comp); + for (int j = 0; j < len(cflags); j++) { + cmd_append(&cmd, cflags[j]); + } + cmd_append(&cmd, "-o", "test", "./src/test/paw_shh_gen.c"); for (int i = 0; i < src_cpaths.count; i++) { cmd_append(&cmd, src_cpaths.items[i]); } diff --git a/shader.glsl b/shader.glsl new file mode 100644 index 0000000..4b64da3 --- /dev/null +++ b/shader.glsl @@ -0,0 +1,23 @@ +#version 450 + +layout(location = 0) in vec2 inPosition; +layout(location = 1) in vec3 inColor; +layout(location = 2) in uint index; + +layout(set = 0, binding = 0) uniform UBO { + mat3 view; + mat3 proj; +} ubo; + +layout(set = 0, binding = 1) uniform UBO_INST { + mat3 model[1000]; +} ubo_inst; + +layout(location = 0) out vec3 fragColor; +layout(location = 1) out vec2 fragUV; + +void main() { + gl_Position = vec4(ubo.proj * ubo.view * ubo_inst.model[index] * vec3(inPosition, 1.0), 1.0); + fragColor = inColor; + fragUV = inPosition + vec2(0.5, 0.5); +} diff --git a/shader.glslinfo b/shader.glslinfo new file mode 100644 index 0000000..1b5c162 Binary files /dev/null and b/shader.glslinfo differ diff --git a/src/paw_log.h b/src/paw_log.h index b0c8bac..892e204 100644 --- a/src/paw_log.h +++ b/src/paw_log.h @@ -9,7 +9,7 @@ fprintf(stderr, "[%s:%d] " fmt "\n", __FILE__, __LINE__, ##__VA_ARGS__) #define crash(fmt, ...) \ fprintf(stderr, "[%s:%d] " fmt "\n", __FILE__, __LINE__, ##__VA_ARGS__); \ - *(int *)0 = 0; + abort(); void paw_print_backtrace(); const char *paw_b_to_s(bool b); diff --git a/src/string.c b/src/string.c index b7135d5..741474d 100644 --- a/src/string.c +++ b/src/string.c @@ -7,6 +7,18 @@ #include #include +struct PawSB paw_sb_make() { + char *string = malloc(1); + *string = 0x0; + return (struct PawSB){string}; +} +void paw_sb_append(struct PawSB *sb, char *string) { + char *new = realloc(sb->string, strlen(sb->string) + strlen(string) + 1); + memmove(new, sb->string, strlen(sb->string) + 1); + memcpy(new + strlen(new), string, strlen(string) + 1); +} +char *paw_sb_get(struct PawSB *sb) { return sb->string; } + struct da_string split(struct PawMem *mem, char *string, char needle) { struct da_string items; paw_da_make_inplace_mem(&items, mem); @@ -54,7 +66,7 @@ char *extract_brackets(struct PawMem *mem, char *start, char open, char close) { return res; } -// before: asddasasd(aslfaddf) +// before: asdasasd(aslfaddf) // ^ // after: asddasasd(aslfaddf) // ^ @@ -198,3 +210,10 @@ char *skip_after_char(char *string, char n) { } return string + 1; } + +char *skip_after_string(char *string, char *n) { + while (!start_matches(string, n)) { + string++; + } + return string + strlen(n); +} diff --git a/src/string.h b/src/string.h index 74046ad..46bc61f 100644 --- a/src/string.h +++ b/src/string.h @@ -6,6 +6,13 @@ #include +struct PawSB { + char *string; +}; +struct PawSB paw_sb_make(); +void paw_sb_append(struct PawSB *sb, char *string); +char *paw_sb_get(struct PawSB *sb); + struct da_string split(struct PawMem *mem, char *string, char needle); bool start_matches(char *string, char *match); char *extract_brackets(struct PawMem *mem, char *start, char open, char close); @@ -25,5 +32,6 @@ char *mem_strdup_reg(char *start, char *end, struct PawMem *mem); char *strdup_reg(char *start, char *end); char *skip_to_char(char *string, char n); char *skip_after_char(char *string, char n); +char *skip_after_string(char *string, char *n); #endif // INCLUDE_SRC_STRING_H_ diff --git a/src/test/paw_shh_gen.c b/src/test/paw_shh_gen.c new file mode 100644 index 0000000..88d5d34 --- /dev/null +++ b/src/test/paw_shh_gen.c @@ -0,0 +1,64 @@ +#include "../io.h" +#include "../paw_da.h" +#include "../paw_log.h" +#include "../string.h" + +struct Prop { + char *name; + char *type; +}; +paw_da_define(da_Prop, struct Prop); + +int main(int argc, char *argv[]) { + char *path; + char *output; + if (argc < 2) { + path = "shader.glsl"; + } else { + path = argv[1]; + } + + if (argc < 3) { + output = "shader.glslinfo"; + } else { + output = argv[2]; + } + char *file = read_text_file(path); + meow("%s", file); + + struct da_Prop props; + paw_da_make_inplace(&props); + + char *mark = + skip_after_string(file, "layout(set = 0, binding = 0) uniform UBO {\n"); + *skip_to_char(mark, '}') = 0; + + while (*mark != 0x0) { + mark = trim_start(mark); + char *middle = skip_to_char(mark, ' '); + char *end = skip_to_char(middle, ';'); + *middle = 0x0; + *end = 0x0; + paw_da_append(&props, ((struct Prop){ + .type = mark, + .name = middle + 1, + })); + mark = trim_start(end + 1); + } + + struct PawSB sb = paw_sb_make(); + for (int i = 0; i < props.count; i++) { + paw_sb_append(&sb, props.items[i].type); + paw_sb_append(&sb, " "); + paw_sb_append(&sb, props.items[i].name); + paw_sb_append(&sb, "\n"); + } + char *res = paw_sb_get(&sb); + write_binary_file(output, res, strlen(res) + 1); + + paw_da_free(&props); + free(res); + + free(file); + return 0; +} diff --git a/src/test/shader.glsl b/src/test/shader.glsl new file mode 100644 index 0000000..e69de29 diff --git a/src/wayland.c b/src/wayland.c index d7bfdc1..a5aa418 100644 --- a/src/wayland.c +++ b/src/wayland.c @@ -335,6 +335,9 @@ struct cat_Wl *cat_init_wl_layer(const char *name, struct Vk **vk) { state->wl_surface = wl_compositor_create_surface(state->compositor); + if (state->layer_shell == NULL) { + crash("your compositor does not support layer shell :["); + } state->layer_surface = zwlr_layer_shell_v1_get_layer_surface( state->layer_shell, state->wl_surface, NULL, ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND, "wlroots"); diff --git a/test b/test new file mode 100755 index 0000000..f9853aa Binary files /dev/null and b/test differ