diff --git a/CMakeLists.txt b/CMakeLists.txt index 667a9fb..dc5eae1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,11 +8,11 @@ add_compile_definitions(_POSIX_C_SOURCE=200112L) add_compile_definitions(_GNU_SOURCE) add_compile_options(-fno-trapping-math) -add_executable(main src/l1/main.c) - add_executable(0_test src/l1/tests/t0.c) add_executable(1_test src/l1/tests/t1.c) +add_executable(codegen_l2 src/l2/codegen.c) + add_executable(0_render_test src/l2/tests/r0.c) target_link_libraries(0_render_test -lvulkan -lX11 -lm) @@ -25,4 +25,4 @@ target_link_libraries(0_play_test -lncurses) # Recursively collect all .h files in the src directory. file(GLOB_RECURSE HEADER_FILES "${CMAKE_SOURCE_DIR}/src/*.h") # Do not build utku -add_executable(utka src/l1/main.c ${HEADER_FILES}) +add_executable(utka src/l1/tests/t0.c ${HEADER_FILES}) diff --git a/src/l1/codegen/codegen.h b/src/l1/codegen/codegen.h new file mode 100644 index 0000000..04e3813 --- /dev/null +++ b/src/l1/codegen/codegen.h @@ -0,0 +1,51 @@ +#ifndef PROTOTYPE1_SRC_L1_CODEGEN_CODEGEN_H +#define PROTOTYPE1_SRC_L1_CODEGEN_CODEGEN_H + +#include +#include "../system/fileio.h" +#include "../core/VecU8_format.h" + +NODISCARD VecU8 begin_header(ConstSpanU8 guard) { + VecU8 res = VecU8_new(); + VecU8_append_span(&res, cstr("#ifndef ")); + VecU8_append_span(&res, guard); + VecU8_append_span(&res, cstr("\n#define ")); + VecU8_append_span(&res, guard); + VecU8_append_span(&res, cstr("\n/* Automatically generated file. Do not edit it. */\n\n")); + return res; +} + +/* Codegen script's working directory should be `gen` */ +void finish_header(VecU8 text_before_endif, const char* filename) { + VecU8_append_span(&text_before_endif, cstr("#endif\n")); + write_whole_file_or_abort(filename, VecU8_to_ConstSpanU8(&text_before_endif)); + VecU8_drop(text_before_endif); +} + +#define SPACE4 " " +#define SPACE8 " " +#define SPACE12 " " + +NODISCARD VecU8 generate_type_triv_methods_and_vec(ConstSpanU8 member) { + VecU8 res = VecU8_from_cstr("#define "); + VecU8_append_span(&res, member); + VecU8_append_span(&res, cstr("_drop(x) {}\n#define ")); + VecU8_append_span(&res, member); + VecU8_append_span(&res, cstr("_clone(xp) (*(xp))\n\n")); + VecU8_append_span(&res, cstr("VecT_trivmove_struct_Definition(")); + VecU8_append_span(&res, member); + VecU8_append_span(&res, cstr(")\nVecT_trivmove_method_Definition(")); + VecU8_append_span(&res, member); + VecU8_append_span(&res, cstr(")\nVecT_primitive_zeroinit_method_Definition(")); + VecU8_append_span(&res, member); + VecU8_append_span(&res, cstr(")\n\n")); + return res; +} + +/* code generation function. We don't append vector data to vecu8, we append vector name to string in VecU8 */ +void VecU8_append_vecoft(VecU8* str, ConstSpanU8 t) { + VecU8_append_span(str, cstr("Vec")); + VecU8_append_span(str, t); +} + +#endif diff --git a/src/l1/main.c b/src/l2/codegen.c similarity index 50% rename from src/l1/main.c rename to src/l2/codegen.c index ea6e3a5..518bf26 100644 --- a/src/l1/main.c +++ b/src/l2/codegen.c @@ -1,6 +1,8 @@ -#include "gen/geom_and_textures.h" +#include "codegen/geom.h" +#include "codegen/pixel_masses.h" int main() { generate_geom_header(); generate_pixel_masses_header(); -} \ No newline at end of file + return 0; +} diff --git a/src/l1/gen/geom_and_textures.h b/src/l2/codegen/geom.h similarity index 68% rename from src/l1/gen/geom_and_textures.h rename to src/l2/codegen/geom.h index a4c036c..abefdb7 100644 --- a/src/l1/gen/geom_and_textures.h +++ b/src/l2/codegen/geom.h @@ -1,31 +1,7 @@ -#ifndef PROTOTYPE_SRC_L1_GEN_GEOM_AND_TEXTURES_H -#define PROTOTYPE_SRC_L1_GEN_GEOM_AND_TEXTURES_H +#ifndef PROTOTYPE_SRC_L2_CODEGEN_GEOM_H +#define PROTOTYPE_SRC_L2_CODEGEN_GEOM_H -#include - -#include "../system/fileio.h" -#include "../core/VecU8_format.h" - -NODISCARD VecU8 begin_header(ConstSpanU8 guard) { - VecU8 res = VecU8_new(); - VecU8_append_span(&res, cstr("#ifndef ")); - VecU8_append_span(&res, guard); - VecU8_append_span(&res, cstr("\n#define ")); - VecU8_append_span(&res, guard); - VecU8_append_span(&res, cstr("\n/* Automatically generated file. Do not edit it. */\n\n")); - return res; -} - -/* Codegen script's working directory should be `gen` */ -void finish_header(VecU8 text_before_endif, const char* filename) { - VecU8_append_span(&text_before_endif, cstr("#endif\n")); - write_whole_file_or_abort(filename, VecU8_to_ConstSpanU8(&text_before_endif)); - VecU8_drop(text_before_endif); -} - -#define SPACE4 " " -#define SPACE8 " " -#define SPACE12 " " +#include "../../l1/codegen/codegen.h" void string_append_vec_field_name(VecU8* str, int ci) { assert(0 <= ci && ci < 4); @@ -646,207 +622,4 @@ void generate_geom_header() { finish_header(res, "geom.h"); } -VecU8 generate_type_triv_methods_and_vec(ConstSpanU8 member) { - VecU8 res = VecU8_from_cstr("#define "); - VecU8_append_span(&res, member); - VecU8_append_span(&res, cstr("_drop(x) {}\n#define ")); - VecU8_append_span(&res, member); - VecU8_append_span(&res, cstr("_clone(xp) (*(xp))\n\n")); - VecU8_append_span(&res, cstr("VecT_trivmove_struct_Definition(")); - VecU8_append_span(&res, member); - VecU8_append_span(&res, cstr(")\nVecT_trivmove_method_Definition(")); - VecU8_append_span(&res, member); - VecU8_append_span(&res, cstr(")\nVecT_primitive_zeroinit_method_Definition(")); - VecU8_append_span(&res, member); - VecU8_append_span(&res, cstr(")\n\n")); - return res; -} - -/* code generation function. We don't append vector data to vecu8, we append vector name to string in VecU8 */ -void VecU8_append_vecoft(VecU8* str, ConstSpanU8 t) { - VecU8_append_span(str, cstr("Vec")); - VecU8_append_span(str, t); -} - -void VecU8_append_resoftexdatat(VecU8* str, ConstSpanU8 texdatat) { - VecU8_append_span(str, cstr("Result")); - VecU8_append_span(str, texdatat); - VecU8_append_span(str, cstr("OrConstSpanU8")); -} - -/* Used to generate both _at() and _cat() methods */ -VecU8 generate_texture_data_method_at(ConstSpanU8 texdatat, ConstSpanU8 member, bool const_access) { - VecU8 res = VecU8_from_span(member); - VecU8_append_span(&res, cstr("* ")); - VecU8_append_span(&res, texdatat); - VecU8_append_span(&res, const_access ? cstr("_cat") : cstr("_at")); - VecU8_append_span(&res, cstr("(")); - VecU8_append_span(&res, texdatat); - VecU8_append_span(&res, cstr("* self, size_t x, size_t y) {\n" SPACE4 "assert(x < self->width);\n" - SPACE4 "return ")); - VecU8_append_vecoft(&res, member); - VecU8_append_span(&res, const_access ? cstr("_cat") : cstr("_at")); - VecU8_append_span(&res, cstr("(&self->pixels, x + y * self->width);\n}\n\n")); - return res; -} - -VecU8 generate_texture_data_struct_and_necc_methods(ConstSpanU8 texdatat, ConstSpanU8 member) { - VecU8 res = VecU8_from_cstr("typedef struct {\n" SPACE4); - VecU8_append_vecoft(&res, member); - VecU8_append_span(&res, cstr(" pixels;\n" SPACE4 "size_t width;\n} ")); - VecU8_append_span(&res, texdatat); - VecU8_append_span(&res, cstr(";\n\n")); - /* Method _new() */ - VecU8_append_span(&res, texdatat); - VecU8_append_span(&res, cstr(" ")); - VecU8_append_span(&res, texdatat); - VecU8_append_span(&res, cstr("_new(U32 width, U32 height) {\n" - SPACE4 "assert(!(SIZE_MAX / width / height < 100 || UINT32_MAX / width < 10 || UINT32_MAX / height < 10));\n" - SPACE4 "return (")); - VecU8_append_span(&res, texdatat); - VecU8_append_span(&res, cstr("){.pixels = ")); - VecU8_append_vecoft(&res, member); - VecU8_append_span(&res, cstr("_new_zeroinit((size_t)width * height), .width = width};\n}\n\n")); - /* Method _drop() */ - VecU8_append_span(&res, cstr("void ")); - VecU8_append_span(&res, texdatat); - VecU8_append_span(&res, cstr("_drop(")); - VecU8_append_span(&res, texdatat); - VecU8_append_span(&res, cstr(" self) {\n" SPACE4)); - VecU8_append_vecoft(&res, member); - VecU8_append_span(&res, cstr("_drop(self.pixels);\n}\n\n")); - /* Method _get_height() */ - VecU8_append_span(&res, cstr("size_t ")); - VecU8_append_span(&res, texdatat); - VecU8_append_span(&res, cstr("_get_height(const ")); - VecU8_append_span(&res, texdatat); - VecU8_append_span(&res, cstr("* self) {\n" SPACE4 "return self->pixels.len / self->width;\n}\n\n")); - /* Methods _at and _cat */ - VecU8_append_vec(&res, generate_texture_data_method_at(texdatat, member, false)); - VecU8_append_span(&res, cstr("const ")); - VecU8_append_vec(&res, generate_texture_data_method_at(texdatat, member, true)); - /* Method _get_size_in_bytes */ - VecU8_append_span(&res, cstr("size_t ")); - VecU8_append_span(&res, texdatat); - VecU8_append_span(&res, cstr("_get_size_in_bytes(const ")); - VecU8_append_span(&res, texdatat); - VecU8_append_span(&res, cstr("* self) {\n" SPACE4 "return self->pixels.len * sizeof(")); - VecU8_append_span(&res, member); - VecU8_append_span(&res, cstr(");\n}\n\n")); - /* Method _to_bitmap_text() - * We use the assumption that bytes in type member are tightly packed */ - VecU8_append_span(&res, cstr("VecU8 ")); - VecU8_append_span(&res, texdatat); - VecU8_append_span(&res, cstr("_to_bitmap_text(const ")); - VecU8_append_span(&res, texdatat); - VecU8_append_span(&res, cstr("* self) {\n" - SPACE4 "assert(SIZE_MAX / self->pixels.len >= 100);\n" - SPACE4 "size_t len = self->pixels.len * sizeof(")); - VecU8_append_span(&res, member); - VecU8_append_span(&res, cstr(");\n" - SPACE4 "VecU8 res = VecU8_new_zeroinit(8 + len);\n" - SPACE4 "size_t width = self->width;\n" - SPACE4 "size_t height = self->pixels.len / self->width;\n" - SPACE4 "assert(UINT32_MAX / width >= 10 && UINT32_MAX / height >= 10);\n" - SPACE4 "for (int i = 0; i < 4; i++)\n" - SPACE4 SPACE4 "*VecU8_at(&res, 0 + i) = (width >> (8 * i)) & 0xff;\n" - SPACE4 "for (int i = 0; i < 4; i++)\n" - SPACE4 SPACE4 "*VecU8_at(&res, 4 + i) = (height >> (8 * i)) & 0xff;\n" - SPACE4 "memcpy(res.buf + 8, self->pixels.buf, len);\n" - SPACE4 "return res;\n" - "}\n\n")); - /* Method _write_to_file - * Aborts on failure */ - VecU8_append_span(&res, cstr("void ")); - VecU8_append_span(&res, texdatat); - VecU8_append_span(&res, cstr("_write_to_file(const ")); - VecU8_append_span(&res, texdatat); - VecU8_append_span(&res, cstr("* self, const char* path) {\n" SPACE4 "VecU8 data = ")); - VecU8_append_span(&res, texdatat); - VecU8_append_span(&res, cstr("_to_bitmap_text(self);\n" - SPACE4 "write_whole_file_or_abort(path, VecU8_to_ConstSpanU8(&data));\n" - SPACE4 "VecU8_drop(data);\n" - "}\n\n")); - /* Result stucture */ - VecU8_append_span(&res, cstr("typedef struct {\n" SPACE4 "Result_variant variant;\n" SPACE4 "union {\n" SPACE8 )); - VecU8_append_span(&res, texdatat); - VecU8_append_span(&res, cstr(" ok;\n" SPACE4 SPACE4 "ConstSpanU8 err;\n" SPACE4 "};\n} ")); - VecU8_append_resoftexdatat(&res, texdatat); - VecU8_append_span(&res, cstr(";\n\n")); - /* Method _from_bitmap_text() - * We assume that bytes are tightly packed in member type - */ - VecU8_append_resoftexdatat(&res, texdatat); - VecU8_append(&res, ' '); - VecU8_append_span(&res, texdatat); - VecU8_append_span(&res, cstr("_from_bitmap_text(ConstSpanU8 text) {\n" - SPACE4 "if (text.len < 8)\n" - SPACE4 SPACE4 "return (")); - VecU8_append_resoftexdatat(&res, texdatat); - VecU8_append_span(&res, cstr("){.variant = Result_Err, " - ".err = cstr(\"No header *crying emoji*\")};\n" - SPACE4 "size_t width = 0, height = 0;\n" - SPACE4 "for (int i = 0; i < 4; i++)\n" - SPACE4 SPACE4 "width |= (((size_t)*ConstSpanU8_at(text, 0 + i)) << (8 * i));\n" - SPACE4 "for (int i = 0; i < 4; i++)\n" - SPACE4 SPACE4 "height |= (((size_t)*ConstSpanU8_at(text, 4 + i)) << (8 * i));\n" - SPACE4 "if (SIZE_MAX / width / height < 100 || UINT32_MAX / width < 10 || UINT32_MAX / height < 10)\n" - SPACE4 SPACE4 "return (")); - VecU8_append_resoftexdatat(&res, texdatat); - VecU8_append_span(&res, cstr("){.variant = Result_Err, " - ".err = cstr(\"Image is too big\")};\n" - SPACE4 "size_t len = width * height * sizeof(")); - VecU8_append_span(&res, member); - VecU8_append_span(&res, cstr(");\n" - SPACE4 "if (text.len < 8 + len)\n" - SPACE4 SPACE4 "return (")); - VecU8_append_resoftexdatat(&res, texdatat); - VecU8_append_span(&res, cstr("){.variant = Result_Err, " - ".err = cstr(\"Texture size and file size mismatch\")};\n" SPACE4)); - VecU8_append_span(&res, texdatat); - VecU8_append_span(&res, cstr(" res = ")); - VecU8_append_span(&res, texdatat); - VecU8_append_span(&res, cstr("_new(width, height);\n" - SPACE4 "memcpy(res.pixels.buf, text.data + 8, len);\n" - SPACE4 "return (")); - VecU8_append_resoftexdatat(&res, texdatat); - VecU8_append_span(&res, cstr("){.variant = Result_Ok, .ok = res};\n}\n\n")); - /* Method _read_from_file */ - VecU8_append_span(&res, texdatat); - VecU8_append(&res, ' '); - VecU8_append_span(&res, texdatat); - VecU8_append_span(&res, cstr("_read_from_file(const char* path) {\n" - SPACE4 "VecU8 data = read_whole_file_or_abort(path);\n" SPACE4)); - VecU8_append_resoftexdatat(&res, texdatat); - VecU8_append_span(&res, cstr(" res = ")); - VecU8_append_span(&res, texdatat); - VecU8_append_span(&res, cstr("_from_bitmap_text(VecU8_to_ConstSpanU8(&data));\n" - SPACE4 "if (res.variant != Result_Ok) {\n" - SPACE8 "fprintf(stderr, \"Tried loading bitmap texture from file, but encountered decoding error: \");\n" - SPACE8 "ConstSpanU8_fprint(res.err, stderr);\n" - SPACE8 "abortf(\"\\n\");\n" SPACE4 "}\n" SPACE4 "VecU8_drop(data);\n" SPACE4 "return res.ok;\n}\n\n")); - /* Method _is_inside() */ - VecU8_append_span(&res, cstr("bool ")); - VecU8_append_span(&res, texdatat); - VecU8_append_span(&res, cstr("_is_inside(const ")); - VecU8_append_span(&res, texdatat); - VecU8_append_span(&res, cstr("* self, S32 x, S32 y) {\n" - SPACE4 "return x >= 0 && y >= 0 && x < self->width && self->width * y + x < self->pixels.len;\n" - "}\n\n")); - return res; -} - -void generate_pixel_masses_header() { - VecU8 res = begin_header(cstr("PROTOTYPE1_GEN_PIXEL_MASSES")); - VecU8_append_span(&res, cstr("#include \"geom.h\"\n\n")); - VecU8_append_span(&res, cstr("#include \"../src/l1/core/VecSpan_int_primitives.h\"\n\n")); - VecU8_append_span(&res, cstr("#include \"../src/l1/system/fileio.h\"\n\n")); - VecU8_append_vec(&res, generate_type_triv_methods_and_vec(cstr("cvec3"))); - VecU8_append_vec(&res, generate_type_triv_methods_and_vec(cstr("cvec4"))); - VecU8_append_vec(&res, generate_texture_data_struct_and_necc_methods(cstr("TextureDataR8"), cstr("U8"))); - VecU8_append_vec(&res, generate_texture_data_struct_and_necc_methods(cstr("TextureDataR8G8B8"), cstr("cvec3"))); - VecU8_append_vec(&res, generate_texture_data_struct_and_necc_methods(cstr("TextureDataR8G8B8A8"), cstr("cvec4"))); - finish_header(res, "pixel_masses.h"); -} - #endif diff --git a/src/l2/codegen/pixel_masses.h b/src/l2/codegen/pixel_masses.h new file mode 100644 index 0000000..d3a98f0 --- /dev/null +++ b/src/l2/codegen/pixel_masses.h @@ -0,0 +1,188 @@ +#ifndef PROTOTYPE_SRC_L2_CODEGEN_PIXEL_MASSES_H +#define PROTOTYPE_SRC_L2_CODEGEN_PIXEL_MASSES_H + +#include "../../l1/codegen/codegen.h" + +void VecU8_append_resoftexdatat(VecU8* str, ConstSpanU8 texdatat) { + VecU8_append_span(str, cstr("Result")); + VecU8_append_span(str, texdatat); + VecU8_append_span(str, cstr("OrConstSpanU8")); +} + +/* Used to generate both _at() and _cat() methods */ +VecU8 generate_texture_data_method_at(ConstSpanU8 texdatat, ConstSpanU8 member, bool const_access) { + VecU8 res = VecU8_from_span(member); + VecU8_append_span(&res, cstr("* ")); + VecU8_append_span(&res, texdatat); + VecU8_append_span(&res, const_access ? cstr("_cat") : cstr("_at")); + VecU8_append_span(&res, cstr("(")); + VecU8_append_span(&res, texdatat); + VecU8_append_span(&res, cstr("* self, size_t x, size_t y) {\n" SPACE4 "assert(x < self->width);\n" + SPACE4 "return ")); + VecU8_append_vecoft(&res, member); + VecU8_append_span(&res, const_access ? cstr("_cat") : cstr("_at")); + VecU8_append_span(&res, cstr("(&self->pixels, x + y * self->width);\n}\n\n")); + return res; +} + +VecU8 generate_texture_data_struct_and_necc_methods(ConstSpanU8 texdatat, ConstSpanU8 member) { + VecU8 res = VecU8_from_cstr("typedef struct {\n" SPACE4); + VecU8_append_vecoft(&res, member); + VecU8_append_span(&res, cstr(" pixels;\n" SPACE4 "size_t width;\n} ")); + VecU8_append_span(&res, texdatat); + VecU8_append_span(&res, cstr(";\n\n")); + /* Method _new() */ + VecU8_append_span(&res, texdatat); + VecU8_append_span(&res, cstr(" ")); + VecU8_append_span(&res, texdatat); + VecU8_append_span(&res, cstr("_new(U32 width, U32 height) {\n" + SPACE4 "assert(!(SIZE_MAX / width / height < 100 || UINT32_MAX / width < 10 || UINT32_MAX / height < 10));\n" + SPACE4 "return (")); + VecU8_append_span(&res, texdatat); + VecU8_append_span(&res, cstr("){.pixels = ")); + VecU8_append_vecoft(&res, member); + VecU8_append_span(&res, cstr("_new_zeroinit((size_t)width * height), .width = width};\n}\n\n")); + /* Method _drop() */ + VecU8_append_span(&res, cstr("void ")); + VecU8_append_span(&res, texdatat); + VecU8_append_span(&res, cstr("_drop(")); + VecU8_append_span(&res, texdatat); + VecU8_append_span(&res, cstr(" self) {\n" SPACE4)); + VecU8_append_vecoft(&res, member); + VecU8_append_span(&res, cstr("_drop(self.pixels);\n}\n\n")); + /* Method _get_height() */ + VecU8_append_span(&res, cstr("size_t ")); + VecU8_append_span(&res, texdatat); + VecU8_append_span(&res, cstr("_get_height(const ")); + VecU8_append_span(&res, texdatat); + VecU8_append_span(&res, cstr("* self) {\n" SPACE4 "return self->pixels.len / self->width;\n}\n\n")); + /* Methods _at and _cat */ + VecU8_append_vec(&res, generate_texture_data_method_at(texdatat, member, false)); + VecU8_append_span(&res, cstr("const ")); + VecU8_append_vec(&res, generate_texture_data_method_at(texdatat, member, true)); + /* Method _get_size_in_bytes */ + VecU8_append_span(&res, cstr("size_t ")); + VecU8_append_span(&res, texdatat); + VecU8_append_span(&res, cstr("_get_size_in_bytes(const ")); + VecU8_append_span(&res, texdatat); + VecU8_append_span(&res, cstr("* self) {\n" SPACE4 "return self->pixels.len * sizeof(")); + VecU8_append_span(&res, member); + VecU8_append_span(&res, cstr(");\n}\n\n")); + /* Method _to_bitmap_text() + * We use the assumption that bytes in type member are tightly packed */ + VecU8_append_span(&res, cstr("VecU8 ")); + VecU8_append_span(&res, texdatat); + VecU8_append_span(&res, cstr("_to_bitmap_text(const ")); + VecU8_append_span(&res, texdatat); + VecU8_append_span(&res, cstr("* self) {\n" + SPACE4 "assert(SIZE_MAX / self->pixels.len >= 100);\n" + SPACE4 "size_t len = self->pixels.len * sizeof(")); + VecU8_append_span(&res, member); + VecU8_append_span(&res, cstr(");\n" + SPACE4 "VecU8 res = VecU8_new_zeroinit(8 + len);\n" + SPACE4 "size_t width = self->width;\n" + SPACE4 "size_t height = self->pixels.len / self->width;\n" + SPACE4 "assert(UINT32_MAX / width >= 10 && UINT32_MAX / height >= 10);\n" + SPACE4 "for (int i = 0; i < 4; i++)\n" + SPACE4 SPACE4 "*VecU8_at(&res, 0 + i) = (width >> (8 * i)) & 0xff;\n" + SPACE4 "for (int i = 0; i < 4; i++)\n" + SPACE4 SPACE4 "*VecU8_at(&res, 4 + i) = (height >> (8 * i)) & 0xff;\n" + SPACE4 "memcpy(res.buf + 8, self->pixels.buf, len);\n" + SPACE4 "return res;\n" + "}\n\n")); + /* Method _write_to_file + * Aborts on failure */ + VecU8_append_span(&res, cstr("void ")); + VecU8_append_span(&res, texdatat); + VecU8_append_span(&res, cstr("_write_to_file(const ")); + VecU8_append_span(&res, texdatat); + VecU8_append_span(&res, cstr("* self, const char* path) {\n" SPACE4 "VecU8 data = ")); + VecU8_append_span(&res, texdatat); + VecU8_append_span(&res, cstr("_to_bitmap_text(self);\n" + SPACE4 "write_whole_file_or_abort(path, VecU8_to_ConstSpanU8(&data));\n" + SPACE4 "VecU8_drop(data);\n" + "}\n\n")); + /* Result stucture */ + VecU8_append_span(&res, cstr("typedef struct {\n" SPACE4 "Result_variant variant;\n" SPACE4 "union {\n" SPACE8 )); + VecU8_append_span(&res, texdatat); + VecU8_append_span(&res, cstr(" ok;\n" SPACE4 SPACE4 "ConstSpanU8 err;\n" SPACE4 "};\n} ")); + VecU8_append_resoftexdatat(&res, texdatat); + VecU8_append_span(&res, cstr(";\n\n")); + /* Method _from_bitmap_text() + * We assume that bytes are tightly packed in member type + */ + VecU8_append_resoftexdatat(&res, texdatat); + VecU8_append(&res, ' '); + VecU8_append_span(&res, texdatat); + VecU8_append_span(&res, cstr("_from_bitmap_text(ConstSpanU8 text) {\n" + SPACE4 "if (text.len < 8)\n" + SPACE4 SPACE4 "return (")); + VecU8_append_resoftexdatat(&res, texdatat); + VecU8_append_span(&res, cstr("){.variant = Result_Err, " + ".err = cstr(\"No header *crying emoji*\")};\n" + SPACE4 "size_t width = 0, height = 0;\n" + SPACE4 "for (int i = 0; i < 4; i++)\n" + SPACE4 SPACE4 "width |= (((size_t)*ConstSpanU8_at(text, 0 + i)) << (8 * i));\n" + SPACE4 "for (int i = 0; i < 4; i++)\n" + SPACE4 SPACE4 "height |= (((size_t)*ConstSpanU8_at(text, 4 + i)) << (8 * i));\n" + SPACE4 "if (SIZE_MAX / width / height < 100 || UINT32_MAX / width < 10 || UINT32_MAX / height < 10)\n" + SPACE4 SPACE4 "return (")); + VecU8_append_resoftexdatat(&res, texdatat); + VecU8_append_span(&res, cstr("){.variant = Result_Err, " + ".err = cstr(\"Image is too big\")};\n" + SPACE4 "size_t len = width * height * sizeof(")); + VecU8_append_span(&res, member); + VecU8_append_span(&res, cstr(");\n" + SPACE4 "if (text.len < 8 + len)\n" + SPACE4 SPACE4 "return (")); + VecU8_append_resoftexdatat(&res, texdatat); + VecU8_append_span(&res, cstr("){.variant = Result_Err, " + ".err = cstr(\"Texture size and file size mismatch\")};\n" SPACE4)); + VecU8_append_span(&res, texdatat); + VecU8_append_span(&res, cstr(" res = ")); + VecU8_append_span(&res, texdatat); + VecU8_append_span(&res, cstr("_new(width, height);\n" + SPACE4 "memcpy(res.pixels.buf, text.data + 8, len);\n" + SPACE4 "return (")); + VecU8_append_resoftexdatat(&res, texdatat); + VecU8_append_span(&res, cstr("){.variant = Result_Ok, .ok = res};\n}\n\n")); + /* Method _read_from_file */ + VecU8_append_span(&res, texdatat); + VecU8_append(&res, ' '); + VecU8_append_span(&res, texdatat); + VecU8_append_span(&res, cstr("_read_from_file(const char* path) {\n" + SPACE4 "VecU8 data = read_whole_file_or_abort(path);\n" SPACE4)); + VecU8_append_resoftexdatat(&res, texdatat); + VecU8_append_span(&res, cstr(" res = ")); + VecU8_append_span(&res, texdatat); + VecU8_append_span(&res, cstr("_from_bitmap_text(VecU8_to_ConstSpanU8(&data));\n" + SPACE4 "if (res.variant != Result_Ok) {\n" + SPACE8 "fprintf(stderr, \"Tried loading bitmap texture from file, but encountered decoding error: \");\n" + SPACE8 "ConstSpanU8_fprint(res.err, stderr);\n" + SPACE8 "abortf(\"\\n\");\n" SPACE4 "}\n" SPACE4 "VecU8_drop(data);\n" SPACE4 "return res.ok;\n}\n\n")); + /* Method _is_inside() */ + VecU8_append_span(&res, cstr("bool ")); + VecU8_append_span(&res, texdatat); + VecU8_append_span(&res, cstr("_is_inside(const ")); + VecU8_append_span(&res, texdatat); + VecU8_append_span(&res, cstr("* self, S32 x, S32 y) {\n" + SPACE4 "return x >= 0 && y >= 0 && x < self->width && self->width * y + x < self->pixels.len;\n" + "}\n\n")); + return res; +} + +void generate_pixel_masses_header() { + VecU8 res = begin_header(cstr("PROTOTYPE1_GEN_PIXEL_MASSES")); + VecU8_append_span(&res, cstr("#include \"geom.h\"\n\n")); + VecU8_append_span(&res, cstr("#include \"../src/l1/core/VecSpan_int_primitives.h\"\n\n")); + VecU8_append_span(&res, cstr("#include \"../src/l1/system/fileio.h\"\n\n")); + VecU8_append_vec(&res, generate_type_triv_methods_and_vec(cstr("cvec3"))); + VecU8_append_vec(&res, generate_type_triv_methods_and_vec(cstr("cvec4"))); + VecU8_append_vec(&res, generate_texture_data_struct_and_necc_methods(cstr("TextureDataR8"), cstr("U8"))); + VecU8_append_vec(&res, generate_texture_data_struct_and_necc_methods(cstr("TextureDataR8G8B8"), cstr("cvec3"))); + VecU8_append_vec(&res, generate_texture_data_struct_and_necc_methods(cstr("TextureDataR8G8B8A8"), cstr("cvec4"))); + finish_header(res, "pixel_masses.h"); +} + + +#endif diff --git a/src/l2/marie/clipping.h b/src/l2/marie/clipping.h new file mode 100644 index 0000000..dd7d40a --- /dev/null +++ b/src/l2/marie/clipping.h @@ -0,0 +1,8 @@ +#ifndef PROTOTYPE1_SRC_L2_MARIE_CLIPPING_H +#define PROTOTYPE1_SRC_L2_MARIE_CLIPPING_H + +#include "graphics_geom.h" + + + +#endif diff --git a/src/l2/marie/graphics_geom.h b/src/l2/marie/graphics_geom.h index 5711d7a..0d58e3f 100644 --- a/src/l2/marie/graphics_geom.h +++ b/src/l2/marie/graphics_geom.h @@ -83,4 +83,9 @@ vec3 marie_normal_from_tang_space_gradient(float delt_x, float delta_z) { return (vec3){-delt_x * N, N, -delta_z * N}; } +float marie_surface(vec2 vi, vec2 vj, vec2 u) { + return u.x * (vi.y - vj.y) + u.y * (vj.x - vi.x) + (vi.x * vj.y - vj.x * vi.y); +} + + #endif diff --git a/src/l2/marie/rasterization.h b/src/l2/marie/rasterization.h index 28cb054..764671c 100644 --- a/src/l2/marie/rasterization.h +++ b/src/l2/marie/rasterization.h @@ -51,10 +51,6 @@ typedef struct { MarieVertAttr attr; } MariePlaneVertAttr; -float marie_surface(vec2 vi, vec2 vj, vec2 u) { - return u.x * (vi.y - vj.y) + u.y * (vj.x - vi.x) + (vi.x * vj.y - vj.x * vi.y); -} - typedef struct { float c1; float c0;