Some refactoring in codegenerating utility

This commit is contained in:
Андреев Григорий 2025-08-03 02:02:41 +03:00
parent 09a64f4965
commit 11bdeb949e
8 changed files with 262 additions and 239 deletions

View File

@ -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})

51
src/l1/codegen/codegen.h Normal file
View File

@ -0,0 +1,51 @@
#ifndef PROTOTYPE1_SRC_L1_CODEGEN_CODEGEN_H
#define PROTOTYPE1_SRC_L1_CODEGEN_CODEGEN_H
#include <stdio.h>
#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

View File

@ -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();
}
return 0;
}

View File

@ -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 <stdio.h>
#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<texdatat, ConstSpanU8> 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

View File

@ -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<texdatat, ConstSpanU8> 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

8
src/l2/marie/clipping.h Normal file
View File

@ -0,0 +1,8 @@
#ifndef PROTOTYPE1_SRC_L2_MARIE_CLIPPING_H
#define PROTOTYPE1_SRC_L2_MARIE_CLIPPING_H
#include "graphics_geom.h"
#endif

View File

@ -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

View File

@ -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;