From 39ee7c8c8af8cda3fbe1f8fca075e44400fed91d Mon Sep 17 00:00:00 2001 From: qwertzuiopy Date: Fri, 11 Apr 2025 16:50:08 +0200 Subject: [PATCH] nyaa --- .gitignore | 4 +- nob.c | 173 ++++++++++++++++++++++++++++-------------- res/shaders/frag.frag | 11 +++ res/shaders/frag.spv | Bin 860 -> 0 bytes res/shaders/vert.spv | Bin 2124 -> 0 bytes res/shaders/vert.vert | 23 ++++++ src/kitty.c | 2 +- src/lang/parser.c | 20 ++--- src/vulkan_helpers.c | 3 +- src/vulkan_helpers.h | 8 ++ 10 files changed, 174 insertions(+), 70 deletions(-) create mode 100644 res/shaders/frag.frag delete mode 100644 res/shaders/frag.spv delete mode 100644 res/shaders/vert.spv create mode 100644 res/shaders/vert.vert create mode 100644 src/vulkan_helpers.h diff --git a/.gitignore b/.gitignore index a485853..51a6a24 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ -*.frag -*.vert +*.spv nob build/* nob.old +main diff --git a/nob.c b/nob.c index 5410142..0dcba30 100644 --- a/nob.c +++ b/nob.c @@ -5,103 +5,166 @@ #define BUILD_FOLDER "build/" #define SRC_FOLDER "src/" +#define RES_FOLDER "res/" #define len NOB_ARRAY_LEN -const char *sources[] = { - "comp", "wayland", - "glfw", "vulkan", - "kitty", "string", - "gpu_allocator", "hashmap", - "util", "io", - "matrix", "paw_da", - "image", "types", - "paw_allocator", "paw_log", - "paw_object", "register", - "lang/ast", "lang/vstack", - "lang/ast_disc", "lang/functable", - "lang/glue", "Wayland/xdg-shell-protocol", -}; const char *cflags[] = {"-g", "-rdynamic", "-lm", "-lwayland-client", "-lxkbcommon", "-lvulkan", "-lglfw"}; +const char *blacklist[] = {"parser.c"}; +const char *comp = "cc"; +const char *scomp = "glslc"; -bool discover_build() { +Nob_File_Paths src_cpaths = {0}; +Procs procs = {0}; +Cmd cmd = {0}; + +bool process_res(char *res_base) { + printf("reading %s\n", res_base); + Nob_File_Paths res_paths = {0}; + if (!read_entire_dir(res_base, &res_paths)) { + return false; + } + + for (int i = 0; i < res_paths.count; i++) { + if (*res_paths.items[i] == '.') { + continue; + } + char *path = (char *)res_paths.items[i]; + switch (get_file_type(temp_sprintf("%s%s", res_base, path))) { + case NOB_FILE_REGULAR:; + bool blacklisted = false; + for (int i = 0; i < len(blacklist); i++) { + if (strcmp(path, blacklist[i]) == 0) { + printf("skipping %s\n", path); + blacklisted = true; + } + } + if (!blacklisted) { + char *tmp = path; + while (*tmp != '.') { + tmp++; + } + if (memcmp(tmp + 1, "vert", strlen("vert")) == 0 || + memcmp(tmp + 1, "frag", strlen("frag")) == 0) { + *tmp = 0x0; + // path now looks like meooow 0x0 glsl + cmd_append(&cmd, scomp, "-c"); + cmd_append(&cmd, "-o", temp_sprintf("%s%s%s", res_base, path, ".spv"), + temp_sprintf("%s%s.%s", res_base, path, tmp + 1)); + da_append(&procs, cmd_run_async_and_reset(&cmd)); + } + } + + break; + case NOB_FILE_DIRECTORY:; + char *folder_path = temp_sprintf("%s%s", res_base, res_paths.items[i]); + if (!mkdir_if_not_exists(folder_path)) { + return false; + } + if (!process_res( + temp_sprintf("%s%s%c", res_base, res_paths.items[i], '/'))) { + return false; + } + break; + case NOB_FILE_SYMLINK: + nob_log(ERROR, "symlink"); + return false; + case NOB_FILE_OTHER: + nob_log(ERROR, "other"); + return false; + } + } + return true; +} + +// base is assumed to be .mew/meooow/nyaa/ or something, note the slashes +bool discover_build(char *src_base, char *build_base) { Nob_File_Paths src_paths = {0}; - if (!read_entire_dir(SRC_FOLDER, &src_paths)) { - exit(1); + if (!read_entire_dir(src_base, &src_paths)) { + return false; } for (int i = 0; i < src_paths.count; i++) { if (*src_paths.items[i] == '.') { continue; } - char *path = temp_sprintf("%s%s", SRC_FOLDER, src_paths.items[i]); - printf("%s\n", path); - switch (get_file_type(path)) { - case NOB_FILE_REGULAR: + char *path = (char *)src_paths.items[i]; + switch (get_file_type(temp_sprintf("%s%s", src_base, path))) { + case NOB_FILE_REGULAR:; + bool blacklisted = false; + for (int i = 0; i < len(blacklist); i++) { + if (strcmp(path, blacklist[i]) == 0) { + printf("skipping %s\n", path); + blacklisted = true; + } + } + if (!blacklisted) { + char *tmp = path; + while (*tmp != '.') { + tmp++; + } + if (*(tmp + 1) == 'c') { + *tmp = 0x0; + // path now looks like meooow 0x0 c + cmd_append(&cmd, comp, "-c"); + for (int j = 0; j < len(cflags); j++) { + cmd_append(&cmd, cflags[j]); + } + cmd_append(&cmd, "-o", temp_sprintf("%s%s%s", build_base, path, ".o"), + temp_sprintf("%s%s%s", src_base, path, ".c")); + da_append(&procs, cmd_run_async_and_reset(&cmd)); + da_append(&src_cpaths, + temp_sprintf("%s%s%s", build_base, path, ".o")); + } + } + break; case NOB_FILE_DIRECTORY:; - if (!mkdir_if_not_exists( - temp_sprintf("%s%s", BUILD_FOLDER, src_paths.items[i]))) { - return 1; + char *folder_path = temp_sprintf("%s%s", build_base, src_paths.items[i]); + if (!mkdir_if_not_exists(folder_path)) { + return false; + } + if (!discover_build( + temp_sprintf("%s%s%c", src_base, src_paths.items[i], '/'), + temp_sprintf("%s%s%c", build_base, src_paths.items[i], '/'))) { + return false; } break; case NOB_FILE_SYMLINK: nob_log(ERROR, "symlink"); - exit(1); + return false; case NOB_FILE_OTHER: nob_log(ERROR, "other"); - return 1; + return false; } } + return true; } int main(int argc, char **argv) { NOB_GO_REBUILD_URSELF(argc, argv); - /* if (!discover_build()) { */ - /* return 1; */ - /* } */ - /* return 0; */ - if (!mkdir_if_not_exists(BUILD_FOLDER)) { return 1; } - - if (!mkdir_if_not_exists(BUILD_FOLDER "lang/")) { + if (!discover_build(SRC_FOLDER, BUILD_FOLDER)) { return 1; } - if (!mkdir_if_not_exists(BUILD_FOLDER "Wayland/")) { + if (!process_res(RES_FOLDER)) { return 1; } - - Procs procs = {0}; - Cmd cmd = {0}; - - for (int i = 0; i < len(sources); i++) { - cmd_append(&cmd, "cc", "-c"); - for (int j = 0; j < len(cflags); j++) { - cmd_append(&cmd, cflags[j]); - } - cmd_append(&cmd, "-o", - temp_sprintf("%s%s%s", BUILD_FOLDER, sources[i], ".o"), - temp_sprintf("%s%s%s", SRC_FOLDER, sources[i], ".c")); - da_append(&procs, cmd_run_async_and_reset(&cmd)); - } - if (!procs_wait_and_reset(&procs)) { return 1; } - - cmd_append(&cmd, "cc"); + cmd_append(&cmd, comp); for (int j = 0; j < len(cflags); j++) { cmd_append(&cmd, cflags[j]); } - cmd_append(&cmd, "-o", BUILD_FOLDER "main", "main.c"); - for (int i = 0; i < len(sources); i++) { - cmd_append(&cmd, temp_sprintf("%s%s%s", BUILD_FOLDER, sources[i], ".o")); + 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); - return 0; } diff --git a/res/shaders/frag.frag b/res/shaders/frag.frag new file mode 100644 index 0000000..1e12bb6 --- /dev/null +++ b/res/shaders/frag.frag @@ -0,0 +1,11 @@ +#version 450 +layout(location = 0) in vec3 fragColor; +layout(location = 1) in vec2 fragUV; +layout(location = 0) out vec4 outColor; + +layout(binding = 2) uniform sampler2D texSampler; + +void main() { + outColor = texture(texSampler, fragUV) * vec4(fragColor, 1.0); +} + diff --git a/res/shaders/frag.spv b/res/shaders/frag.spv deleted file mode 100644 index 36a77901a7c6285f191b04524aeaaae4276316df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 860 zcmYk3O-lk%6oyaPm}!}2U-m`TGLRM(K~#%~*$5U=EeFvl1|}69qjqijWBsZ&LGPn8 zF&EC9d*1up^KmCLdpK`4V+C8XJ)5qw%}Oz8*@<@>twwzmb?Yam#}Gx!OhA}r%h{Yf z_Sz1594yGnvUOQWEN3dBT}GMBzIAcV^5!-?x7l#k;hS11I%uFomFUymUKH*F9}`BH$Xd547({a`@BBWU!V@NvdHlx#gV_1N{>Yu{Sni{ij4YCqIi>v z3Ad1LMQ%oAcAbj0myOLv;ZPPAz`J_KVf0Dn- zFDAav?w)4jA;ZkP^UlnknbSh|Os_Fr=DZm&nEx9LoDtRV(At~suTl%*Wi>BXHs(xj6w^DuW*P2bg9e)i2 zKeSQc*KI4P#r76WK{hO`ECopm@OP_vd$S#?(Y~}lJ-tNCAP7WC7q)`t-X?UKra(o-LW0^vV z$sTM}Plf=8o!F>z{UnbaeQX^aZ#Tk5E6ZbNHcAodus=8lhsIR&eax7-?5INe0(dX! zaTs?3LpzKdFy`hkY%umnZRVBME_UWs5(b|bM~~KAl;p7)0y;aY1dqP?JpBLjz{ula zSCq%xrz9NbPp59;Uzgn@N%@6j5AIvtPFzpt=X*NLeJedY)uSih;{1G1Z1U(soE^G4 z`0Ow5vpalOkKH+cL{+FWr8zTq>@iu~$&-w$9^Z@4K1TJwPui1kW;6esZ0b+S@0W%T zR+hysT@7N0C*B2VdJ8!z@LymEDeTVme0>bSASGC{os#fG4kC#CuMJJ4JG$v_r$=;>dH*P$h{#=T`+p#dlE3>Q_@`$ zW=R}>I>Wfz9ogK?@$Y6aaQOJ_of>=_+*ye+-`AvQ^*!CRMrAj?BVoRqniRcmN<0a5h`Cy~WD|3>Zp)?~ zI2`VEU&8F)sULHn%P^@9_8`NU-=0{^bzTCO7`ytZeDH@7`Veae6U7-o%oG-x&9PsV(5c=Wcw|{bJ&o8 QrF$+U?*Z(uUd@W+AJkrrxBvhE diff --git a/res/shaders/vert.vert b/res/shaders/vert.vert new file mode 100644 index 0000000..4b64da3 --- /dev/null +++ b/res/shaders/vert.vert @@ -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/src/kitty.c b/src/kitty.c index 3256469..0360ba5 100644 --- a/src/kitty.c +++ b/src/kitty.c @@ -8,7 +8,7 @@ #include "paw_allocator.h" #include "paw_da.h" #include "vulkan.h" -#include "vulkan_helpers.c" +#include "vulkan_helpers.h" struct Kitty *kitty_make(struct PawMem *mem) { struct Kitty *kitty; diff --git a/src/lang/parser.c b/src/lang/parser.c index 9ae98b1..bdb2a7b 100644 --- a/src/lang/parser.c +++ b/src/lang/parser.c @@ -1,6 +1,6 @@ -#include "../allocator.h" #include "../io.h" -#include "../log.h" +#include "../paw_allocator.h" +#include "../paw_log.h" #include "../string.h" #include "../util.h" #include "ast.h" @@ -86,17 +86,17 @@ struct PawStackVal parse_stack_val(char *start, struct StringTable *vars, struct PawParseVal combine_val_ctrls(struct PawParseVal base, struct PawParseVal additions) { for (int i = 0; i < additions.pre.count; i++) { - dyn_array_append(&base.pre, additions.pre.items[i]); + paw_da_append(&base.pre, additions.pre.items[i]); } base.num_pops += additions.num_pops; return base; } struct PawParseVal parse_val(int offset, struct StringTable *vars, - struct Mem *tmp, struct Mem *pem, char *start, - char *end) { + struct PawMem *tmp, struct PawMem *pem, + char *start, char *end) { struct PawParseVal val = {0}; - dyn_array_create_inplace_mem(&val.pre, tmp); + paw_da_make_inplace_mem(&val.pre, tmp); meow("parsing a val"); start = trim_start(start); @@ -174,7 +174,7 @@ struct PawParseVal parse_val(int offset, struct StringTable *vars, return val; } -enum PawCtrl *parse_block(struct Mem *tmp, struct Mem *pem, int offset, +enum PawCtrl *parse_block(struct PawMem *tmp, struct PawMem *pem, int offset, struct StringTable *vars, char *start) { meow("parsing a block"); enum PawCtrl *body = make_pawctrl_seq(pem); @@ -346,8 +346,8 @@ struct PawAST *parse(char *path) { char *contents = read_text_file(path); struct PawAST *ast = ast_make(); - struct Mem *tmp = make_mem(4096); // temporary memory - struct Mem *pem = + struct PawMem *tmp = paw_memmake(4096); // temporary memory + struct PawMem *pem = ast->mem; // permanent memory, will be present once ast is evaled struct StringTable *methods = st_make(tmp); @@ -382,7 +382,7 @@ struct PawAST *parse(char *path) { tmp, pem, 0, st_make(tmp), skip_to_char(st_get(methods, st_get_nth_key(methods, i)), '{'))); } - uninit_mem(tmp); + paw_memunmake(tmp); return ast; } diff --git a/src/vulkan_helpers.c b/src/vulkan_helpers.c index e5e7f33..9dedb2e 100644 --- a/src/vulkan_helpers.c +++ b/src/vulkan_helpers.c @@ -1,7 +1,6 @@ +#include "vulkan_helpers.h" #include "paw_log.h" -#include - int get_size_of_format(enum VkFormat format) { switch (format) { case VK_FORMAT_R32_UINT: diff --git a/src/vulkan_helpers.h b/src/vulkan_helpers.h new file mode 100644 index 0000000..2c0668d --- /dev/null +++ b/src/vulkan_helpers.h @@ -0,0 +1,8 @@ +#ifndef INCLUDE_SRC_VULKAN_HELPERS_H_ +#define INCLUDE_SRC_VULKAN_HELPERS_H_ + +#include + +int get_size_of_format(enum VkFormat format); + +#endif // INCLUDE_SRC_VULKAN_HELPERS_H_