Fixed bugs + renamed VecT_to_SpanT to VecT_to_span

This commit is contained in:
Андреев Григорий 2025-08-15 03:40:54 +03:00
parent 24969c0bc0
commit 3a062e768b
10 changed files with 95 additions and 88 deletions

View File

@ -15,8 +15,8 @@ add_compile_options(-fno-trapping-math)
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/codegen.c)
#
add_executable(codegen_l2 src/l2/codegen/codegen.c)
#add_executable(0_render_test src/l2/tests/r0/r0.c)
#target_link_libraries(0_render_test -lvulkan -lX11 -lm)
#

View File

@ -33,18 +33,22 @@ out/l1/t1: src/l1/tests/t1.c $(HEADERS_gen_l1) $(HEADERS_src_l1)
out/l2/codegen: src/l2/codegen/codegen.c $(HEADERS_src_l2) $(HEADERS_gen_l1) $(HEADERS_src_l1)
mkdir -p out/l2
$(cc) $(cflags) -o $@ $<
#out/l2/codegen_l2: src/l2/codegen/codegen.c $(HEADERS_src_l2) $(HEADERS_gen_l1) $(HEADERS_src_l1)
# mkdir -p out/l2
# $(cc) $(cflags) -o $@ $<
#
#gen/l_wl_protocols/xdg-shell-client.h: $(wl_protocols)/stable/xdg-shell/xdg-shell.xml
# mkdir -p gen/l_wl_protocols
# wayland-scanner client-header $< $@
#
#gen/l_wl_protocols/xdg-shell-private.c: $(wl_protocols)/stable/xdg-shell/xdg-shell.xml
# mkdir -p gen/l_wl_protocols
# wayland-scanner private-code $< $@
.PHONY: essence_gen_l2
essence_gen_l2: out/l2/codegen
mkdir -p gen
cd gen && ../out/l2/codegen
gen/l_wl_protocols/xdg-shell-client.h: $(wl_protocols)/stable/xdg-shell/xdg-shell.xml
mkdir -p gen/l_wl_protocols
wayland-scanner client-header $< $@
gen/l_wl_protocols/xdg-shell-private.c: $(wl_protocols)/stable/xdg-shell/xdg-shell.xml
mkdir -p gen/l_wl_protocols
wayland-scanner private-code $< $@
#
#
#

View File

@ -30,7 +30,7 @@ int main() {
{
VecU8 head = begin_header(cstr("PROTOTYPE1_L1_VECANDSPAN_SPAN_INT_PRIMITIVES_H"));
VecU8_append_span(&head, cstr("#include \"VecAndSpanAndOption_int_primitives.h\"\n\n"));
SpanU8 T[4] = {cstr("VecU8")};
SpanU8 T[1] = {cstr("SpanU8")};
for (size_t i = 0; i < ARRAY_SIZE(T); i++) {
VecU8_append_vec(&head, generate_util_templates_instantiation(T[i], (util_templates_instantiation_options){
.t_primitive = true, .vec = true, .vec_equal = true, .span = true, .mut_span = true,

View File

@ -18,7 +18,7 @@ NODISCARD VecU8 begin_header(SpanU8 guard) {
/* 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_SpanU8(&text_before_endif));
write_whole_file_or_abort(filename, VecU8_to_span(&text_before_endif));
VecU8_drop(text_before_endif);
}

View File

@ -6,7 +6,7 @@
/* if !primitive, requires methods T_clone, T_drop */
NODISCARD VecU8 generate_VecT_struct_and_base_methods(SpanU8 T, bool primitive) {
VecU8 g_VecT = VecU8_fmt("Vec%s", T);
SpanU8 VecT = VecU8_to_SpanU8(&g_VecT);
SpanU8 VecT = VecU8_to_span(&g_VecT);
VecU8 res = VecU8_fmt(
"typedef struct {\n"
SPACE4 "%s* buf;\n"
@ -98,7 +98,7 @@ NODISCARD VecU8 generate_VecT_struct_and_base_methods(SpanU8 T, bool primitive)
/* if !primitive, requires methods T_clone, T_drop */
NODISCARD VecU8 generate_VecT_trivmove_extended_methods(SpanU8 T, bool primitive) {
VecU8 g_VecT = VecU8_fmt("Vec%s", T);
SpanU8 VecT = VecU8_to_SpanU8(&g_VecT);
SpanU8 VecT = VecU8_to_span(&g_VecT);
VecU8 res = VecU8_new();
VecU8_append_vec(&res, VecU8_fmt(
@ -147,7 +147,7 @@ NODISCARD VecU8 generate_VecT_trivmove_extended_methods(SpanU8 T, bool primitive
/* if !integer requires method T_equal_T */
NODISCARD VecU8 generate_VecT_equal_method(SpanU8 T, bool integer) {
VecU8 g_VecT = VecU8_fmt("Vec%s", T);
SpanU8 VecT = VecU8_to_SpanU8(&g_VecT);
SpanU8 VecT = VecU8_to_span(&g_VecT);
VecU8 res = VecU8_fmt(
"bool %s_equal_%s(const %s* A, const %s* B) {\n"
SPACE4 "if (A->len != B->len)\n"
@ -172,7 +172,7 @@ NODISCARD VecU8 generate_VecT_equal_method(SpanU8 T, bool integer) {
/* requires method T_new */
NODISCARD VecU8 generate_VecT_new_of_size_method(SpanU8 T) {
VecU8 g_VecT = VecU8_fmt("Vec%s", T);
SpanU8 VecT = VecU8_to_SpanU8(&g_VecT);
SpanU8 VecT = VecU8_to_span(&g_VecT);
VecU8 res = VecU8_fmt(
"NODISCARD %s %s_new_of_size(size_t len) {\n"
SPACE4 "%s res = (%s){.buf = safe_calloc(len, sizeof(%s)), .len = len, .capacity = len};\n"
@ -188,7 +188,7 @@ NODISCARD VecU8 generate_VecT_new_of_size_method(SpanU8 T) {
/* helper function. SpanT is either SpanT or MutSpanT */
void codegen_append_some_span_equal_method(VecU8* res, SpanU8 SpanT) {
VecU8_append_vec(res, VecU8_fmt(
"bool %s_%s(%s A, %s B) {\n"
"bool %s_equal_%s(%s A, %s B) {\n"
SPACE4 "return A->data == B->data && A->len == B->len;\n"
"}\n\n", SpanT, SpanT, SpanT, SpanT));
}
@ -230,8 +230,8 @@ NODISCARD VecU8 generate_SpanT_struct_and_methods(
) {
VecU8 g_SpanT = VecU8_fmt("Span%s", T);
VecU8 g_MutSpanT = VecU8_fmt("MutSpan%s", T);
SpanU8 SpanT = VecU8_to_SpanU8(&g_SpanT);
SpanU8 MutSpanT = VecU8_to_SpanU8(&g_MutSpanT);
SpanU8 SpanT = VecU8_to_span(&g_SpanT);
SpanU8 MutSpanT = VecU8_to_span(&g_MutSpanT);
VecU8 res = VecU8_new();
codegen_append_some_span_struct(&res, T, SpanT, cstr("const "));
@ -288,9 +288,9 @@ NODISCARD VecU8 generate_SpanT_VecT_trivmove_collab(SpanU8 T, bool primitive, bo
VecU8 g_SpanT = VecU8_fmt("Span%s", T);
VecU8 g_MutSpanT = VecU8_fmt("MutSpan%s", T);
VecU8 g_VecT = VecU8_fmt("Vec%s", T);
SpanU8 SpanT = VecU8_to_SpanU8(&g_SpanT);
SpanU8 MutSpanT = VecU8_to_SpanU8(&g_MutSpanT);
SpanU8 VecT = VecU8_to_SpanU8(&g_VecT);
SpanU8 SpanT = VecU8_to_span(&g_SpanT);
SpanU8 MutSpanT = VecU8_to_span(&g_MutSpanT);
SpanU8 VecT = VecU8_to_span(&g_VecT);
VecU8 res = VecU8_new();
VecU8_append_vec(&res, VecU8_fmt(
@ -361,7 +361,7 @@ NODISCARD VecU8 generate_SpanT_VecT_trivmove_collab(SpanU8 T, bool primitive, bo
NODISCARD VecU8 generate_OptionT_struct_and_methods(SpanU8 T, bool primitive) {
VecU8 g_OptionT = VecU8_fmt("Option%s", T);
SpanU8 OptionT = VecU8_to_SpanU8(&g_OptionT);
SpanU8 OptionT = VecU8_to_span(&g_OptionT);
VecU8 res = VecU8_fmt(
"typedef struct {\n"
@ -490,7 +490,7 @@ void generate_eve_header(SpanU8 layer, SpanU8 bonus_ns, SpanU8 T, util_templates
cstr(op.span && op.option ? "And" : ""), cstr(op.option ? "Option" : ""),
cstr((int)op.vec + (int)op.span + (int)op.option > 1 ? "_" : ""), T);
VecU8_append(&filename, 0);
write_whole_file_or_abort((const char*)filename.buf, VecU8_to_SpanU8(&text));
write_whole_file_or_abort((const char*)filename.buf, VecU8_to_span(&text));
VecU8_drop(filename);
VecU8_drop(text);
}

View File

@ -82,7 +82,7 @@ NODISCARD VecU8 VecU8_from_span(SpanU8 src) {
return res;
}
SpanU8 VecU8_to_SpanU8(const VecU8* vec) {
SpanU8 VecU8_to_span(const VecU8* vec) {
return (SpanU8){vec->buf, vec->len};
}

View File

@ -2,9 +2,10 @@
#define PROTOTYPE1_SRC_L2_CODEGEN_CLIPPING_H
#include "../../l1/codegen/codegen.h"
#include "../../l1/core/Span_Span_int_primitives.h"
#include "../../../gen/l1/VecAndSpan_Span_int_primitives.h"
// todo: move all of this to marie namespace
// todo: instead of returning triangles, return points of convex polygon
typedef struct {
int order;
@ -93,12 +94,12 @@ void append_intersection_eol_stmt(VecU8* str, char tr1, int A1, int B1, char tr2
tr1, A1, tr1, B1, tr2, A2, tr2, B2));
}
ConstSpanU8 marie_names_of_two_clipping_triangles[6] = {
SpanU8 marie_names_of_two_clipping_triangles[6] = {
{"C.v0", 4}, {"C.v1", 4}, {"C.v2", 4},
{"T.v0", 4}, {"T.v1", 4}, {"T.v2", 4},
};
NODISCARD ConstSpanU8 get_firstborn_vertex_stmt(char tr, int id) {
NODISCARD SpanU8 get_firstborn_vertex_stmt(char tr, int id) {
assert(0 <= id && id < 3);
if (tr == 'C')
return marie_names_of_two_clipping_triangles[id];
@ -107,7 +108,7 @@ NODISCARD ConstSpanU8 get_firstborn_vertex_stmt(char tr, int id) {
abortf("Wrong triangle");
}
void append_triangle_registration_stmt(VecU8* str, ConstSpanU8 P0, ConstSpanU8 P1, ConstSpanU8 P2) {
void append_triangle_registration_stmt(VecU8* str, SpanU8 P0, SpanU8 P1, SpanU8 P2) {
VecU8_append_span(str, cstr("VecMarieTriangle_append(pile, (MarieTriangle){"));
VecU8_append_span(str, P0);
VecU8_append_span(str, cstr(", "));
@ -117,14 +118,14 @@ void append_triangle_registration_stmt(VecU8* str, ConstSpanU8 P0, ConstSpanU8 P
VecU8_append_span(str, cstr("});\n"));
}
void append_answering_stmt(VecU8* res, ConstSpanConstSpanU8 vertices, int tabulation_lvl) {
void append_answering_stmt(VecU8* res, SpanSpanU8 vertices, int tabulation_lvl) {
size_t n = vertices.len;
assert(n >= 3);
for (int i = 0; i < n - 2; i++) {
for (int sp = 0; sp < tabulation_lvl; sp++)
VecU8_append(res, ' ');
append_triangle_registration_stmt(res, *ConstSpanConstSpanU8_at(vertices, i),
*ConstSpanConstSpanU8_at(vertices, i + 1), *ConstSpanConstSpanU8_at(vertices, n - 1));
append_triangle_registration_stmt(res, *SpanSpanU8_at(vertices, i),
*SpanSpanU8_at(vertices, i + 1), *SpanSpanU8_at(vertices, n - 1));
}
for (int sp = 0; sp < tabulation_lvl; sp++)
VecU8_append(res, ' ');
@ -187,9 +188,9 @@ void generate_func_clip_triang_on_triang_case_where_some_vertex_stuck(VecU8* res
append_intersection_eol_stmt(res, tC, sc, mod3_inc(sc), tT, ti, TB);
VecU8_append_span(res, cstr(SPACE16 "vec2 PA = "));
append_intersection_eol_stmt(res, tC, sc, mod3_inc(sc), tT, ti, TA);
ConstSpanU8 quad[4] = {
SpanU8 quad[4] = {
get_firstborn_vertex_stmt(tT, TB), cstr("PB"), cstr("PA"), get_firstborn_vertex_stmt(tT, TA) };
append_answering_stmt(res, (ConstSpanConstSpanU8){.data = quad, .len = ARRAY_SIZE(quad)}, 16);
append_answering_stmt(res, (SpanSpanU8){.data = quad, .len = ARRAY_SIZE(quad)}, 16);
}
VecU8_append_span(res, cstr(SPACE12 "}\n"));
if (!tables_turned) {
@ -204,9 +205,9 @@ void generate_func_clip_triang_on_triang_case_where_some_vertex_stuck(VecU8* res
append_intersection_eol_stmt(res, tC, sc, mod3_dec(sc), tT, ti, TB);
VecU8_append_span(res, cstr(SPACE16 "vec2 PA = "));
append_intersection_eol_stmt(res, tC, sc, mod3_inc(sc), tT, ti, TA);
ConstSpanU8 pentagon[5] = { get_firstborn_vertex_stmt(tT, TB), cstr("PB"),
SpanU8 pentagon[5] = { get_firstborn_vertex_stmt(tT, TB), cstr("PB"),
get_firstborn_vertex_stmt(tC, sc), cstr("PA"), get_firstborn_vertex_stmt(tT, TA)};
append_answering_stmt(res, (ConstSpanConstSpanU8){.data = pentagon, .len = ARRAY_SIZE(pentagon)}, 16);
append_answering_stmt(res, (SpanSpanU8){.data = pentagon, .len = ARRAY_SIZE(pentagon)}, 16);
}
VecU8_append_span(res, cstr(SPACE12 "}\n"));
}
@ -244,8 +245,8 @@ void generate_func_clip_triang_on_triang_case_where_some_vertex_stuck(VecU8* res
append_intersection_eol_stmt(res, tT, pl, TA, tC, cr, mod3_inc(cr));
VecU8_append_span(res, cstr(SPACE12 "vec2 PB = "));
append_intersection_eol_stmt(res, tT, pl, TB, tC, cr, mod3_inc(cr));
ConstSpanU8 trig[3] = {get_firstborn_vertex_stmt(tT, pl), cstr("PA"), cstr("PB")};
append_answering_stmt(res, (ConstSpanConstSpanU8){.data = trig, .len = ARRAY_SIZE(trig)}, 12);
SpanU8 trig[3] = {get_firstborn_vertex_stmt(tT, pl), cstr("PA"), cstr("PB")};
append_answering_stmt(res, (SpanSpanU8){.data = trig, .len = ARRAY_SIZE(trig)}, 12);
}
VecU8_append_span(res, cstr(SPACE8 "}\n"));
}
@ -274,8 +275,8 @@ void generate_func_clip_triang_on_triang_case_where_some_vertex_stuck(VecU8* res
append_intersection_eol_stmt(res, tT, TA, TB, tC, mod3_inc(rc), mod3_dec(rc));
VecU8_append_span(res, cstr(SPACE16 "vec2 PB = "));
append_intersection_eol_stmt(res, tT, pl, TB, tC, mod3_inc(rc), mod3_dec(rc));
ConstSpanU8 pent[5] = {get_firstborn_vertex_stmt(tT, pl), cstr("PA"), cstr("QA"), cstr("QB"), cstr("PB")};
append_answering_stmt(res, (ConstSpanConstSpanU8){.data = pent, .len = ARRAY_SIZE(pent)}, 16);
SpanU8 pent[5] = {get_firstborn_vertex_stmt(tT, pl), cstr("PA"), cstr("QA"), cstr("QB"), cstr("PB")};
append_answering_stmt(res, (SpanSpanU8){.data = pent, .len = ARRAY_SIZE(pent)}, 16);
}
VecU8_append_span(res, cstr(SPACE12 "}"));
if (!tables_turned) {
@ -286,9 +287,9 @@ void generate_func_clip_triang_on_triang_case_where_some_vertex_stuck(VecU8* res
append_intersection_eol_stmt(res, tT, pl, TA, tC, rc, mod3_inc(rc));
VecU8_append_span(res, cstr(SPACE16 "vec2 PB = "));
append_intersection_eol_stmt(res, tT, pl, TB, tC, mod3_inc(rc), mod3_dec(rc));
ConstSpanU8 quad[4] = {get_firstborn_vertex_stmt(tT, pl), cstr("PA"),
SpanU8 quad[4] = {get_firstborn_vertex_stmt(tT, pl), cstr("PA"),
get_firstborn_vertex_stmt(tC, mod3_inc(rc)), cstr("PB")};
append_answering_stmt(res, (ConstSpanConstSpanU8){.data = quad, .len = ARRAY_SIZE(quad)}, 16);
append_answering_stmt(res, (SpanSpanU8){.data = quad, .len = ARRAY_SIZE(quad)}, 16);
VecU8_append_span(res, cstr(SPACE12 "}"));
}
VecU8_append_span(res, cstr("\n"));
@ -335,7 +336,7 @@ void generate_func_clip_triang_on_triang_case_boring(VecU8* res) {
append_on_the_left_stmt(res, 'C', cf, 'C', (cf + 2) % 3, 'T', (ti + 2) % 3);
VecU8_append_span(res, cstr(") {\n"));
{
ConstSpanU8 quad[4] = {cstr("PA"), cstr("PB"), cstr("PC"), cstr("PD")};
SpanU8 quad[4] = {cstr("PA"), cstr("PB"), cstr("PC"), cstr("PD")};
/* case A */
VecU8_append_span(res, cstr(SPACE8 "if ("));
append_on_the_left_stmt(res, 'T', ti, 'T', mod3_dec(ti), 'C', mod3_inc(cf));
@ -353,7 +354,7 @@ void generate_func_clip_triang_on_triang_case_boring(VecU8* res) {
append_intersection_eol_stmt(res, 'T', mod3_inc(ti), mod3_dec(ti), 'C', mod3_dec(cf), cf);
VecU8_append_span(res, cstr(SPACE12 "vec2 PD = "));
append_intersection_eol_stmt(res, 'T', mod3_dec(ti), ti, 'C', mod3_dec(cf), cf);
append_answering_stmt(res, (ConstSpanConstSpanU8){.data = quad, ARRAY_SIZE(quad)}, 12);
append_answering_stmt(res, (SpanSpanU8){.data = quad, ARRAY_SIZE(quad)}, 12);
}
VecU8_append_span(res, cstr(SPACE8 "}\n"));
/* case B */
@ -373,7 +374,7 @@ void generate_func_clip_triang_on_triang_case_boring(VecU8* res) {
append_intersection_eol_stmt(res, 'T', mod3_inc(ti), mod3_dec(ti), 'C', mod3_dec(cf), cf);
VecU8_append_span(res, cstr(SPACE12 "vec2 PD = "));
append_intersection_eol_stmt(res, 'T', mod3_dec(ti), ti, 'C', mod3_dec(cf), cf);
append_answering_stmt(res, (ConstSpanConstSpanU8){.data = quad, ARRAY_SIZE(quad)}, 12);
append_answering_stmt(res, (SpanSpanU8){.data = quad, ARRAY_SIZE(quad)}, 12);
}
VecU8_append_span(res, cstr(SPACE8 "}\n"));
}

View File

@ -3,6 +3,9 @@
#include "clipping.h"
#include "../../l1/system/fsmanip.h"
// todo: generate here lyndas +
//todo + generate here cvec34 vectors and vec2, vec3, vec4 vectors
int main() {
make_dir_nofail("l2");
generate_geom_header();

View File

@ -9,12 +9,12 @@ void string_append_vec_field_name(VecU8* str, int ci) {
VecU8_append(str, ci == 3 ? 'w' : 'x' + ci);
}
void string_append_xvecy(VecU8* str, ConstSpanU8 xvec, int cc) {
void string_append_xvecy(VecU8* str, SpanU8 xvec, int cc) {
VecU8_append_span(str, xvec);
VecU8_append(str, '0' + cc);
}
NODISCARD VecU8 generate_xvecy_struct_definition(ConstSpanU8 xvec, ConstSpanU8 member, int cc) {
NODISCARD VecU8 generate_xvecy_struct_definition(SpanU8 xvec, SpanU8 member, int cc) {
assert(2 <= cc && cc <= 4);
VecU8 res = VecU8_new();
VecU8_append_span(&res, cstr("typedef struct {\n"));
@ -33,7 +33,7 @@ NODISCARD VecU8 generate_xvecy_struct_definition(ConstSpanU8 xvec, ConstSpanU8 m
return res;
}
NODISCARD VecU8 generate_xvecy_method_add_xvecy(ConstSpanU8 xvec, ConstSpanU8 member, int cc) {
NODISCARD VecU8 generate_xvecy_method_add_xvecy(SpanU8 xvec, SpanU8 member, int cc) {
VecU8 res = VecU8_new();
string_append_xvecy(&res, xvec, cc);
VecU8_append_span(&res, cstr(" "));
@ -59,7 +59,7 @@ NODISCARD VecU8 generate_xvecy_method_add_xvecy(ConstSpanU8 xvec, ConstSpanU8 me
return res;
}
NODISCARD VecU8 generate_xvecy_method_minus_xvecy(ConstSpanU8 xvec, ConstSpanU8 member, int cc) {
NODISCARD VecU8 generate_xvecy_method_minus_xvecy(SpanU8 xvec, SpanU8 member, int cc) {
VecU8 res = VecU8_new();
string_append_xvecy(&res, xvec, cc);
VecU8_append_span(&res, cstr(" "));
@ -86,7 +86,7 @@ NODISCARD VecU8 generate_xvecy_method_minus_xvecy(ConstSpanU8 xvec, ConstSpanU8
}
NODISCARD VecU8 generate_xvecy_method_minus(ConstSpanU8 xvec, ConstSpanU8 member, int cc) {
NODISCARD VecU8 generate_xvecy_method_minus(SpanU8 xvec, SpanU8 member, int cc) {
VecU8 res = VecU8_new();
string_append_xvecy(&res, xvec, cc);
VecU8_append_span(&res, cstr(" "));
@ -106,7 +106,7 @@ NODISCARD VecU8 generate_xvecy_method_minus(ConstSpanU8 xvec, ConstSpanU8 member
return res;
}
NODISCARD VecU8 generate_xvecy_method_mul_scal(ConstSpanU8 xvec, ConstSpanU8 member, int cc) {
NODISCARD VecU8 generate_xvecy_method_mul_scal(SpanU8 xvec, SpanU8 member, int cc) {
VecU8 res = VecU8_new();
string_append_xvecy(&res, xvec, cc);
VecU8_append_span(&res, cstr(" "));
@ -129,7 +129,7 @@ NODISCARD VecU8 generate_xvecy_method_mul_scal(ConstSpanU8 xvec, ConstSpanU8 mem
return res;
}
NODISCARD VecU8 generate_xvecy_method_div_by_scal(ConstSpanU8 xvec, ConstSpanU8 member, int cc) {
NODISCARD VecU8 generate_xvecy_method_div_by_scal(SpanU8 xvec, SpanU8 member, int cc) {
VecU8 res = VecU8_new();
string_append_xvecy(&res, xvec, cc);
VecU8_append_span(&res, cstr(" "));
@ -144,7 +144,7 @@ NODISCARD VecU8 generate_xvecy_method_div_by_scal(ConstSpanU8 xvec, ConstSpanU8
return res;
}
NODISCARD VecU8 generate_xvecy_method_mul_xvecy(ConstSpanU8 xvec, ConstSpanU8 member, int n) {
NODISCARD VecU8 generate_xvecy_method_mul_xvecy(SpanU8 xvec, SpanU8 member, int n) {
VecU8 res = VecU8_new();
string_append_xvecy(&res, xvec, n);
VecU8_append_span(&res, cstr(" "));
@ -170,7 +170,7 @@ NODISCARD VecU8 generate_xvecy_method_mul_xvecy(ConstSpanU8 xvec, ConstSpanU8 me
return res;
}
NODISCARD VecU8 generate_xvecy_method_and_one(ConstSpanU8 xvec, int n) {
NODISCARD VecU8 generate_xvecy_method_and_one(SpanU8 xvec, int n) {
assert(2 <= n && n < 4);
VecU8 res = VecU8_new();
string_append_xvecy(&res, xvec, n + 1);
@ -190,7 +190,7 @@ NODISCARD VecU8 generate_xvecy_method_and_one(ConstSpanU8 xvec, int n) {
return res;
}
NODISCARD VecU8 generate_xvecy_method_dot(ConstSpanU8 xvec, ConstSpanU8 member, int n) {
NODISCARD VecU8 generate_xvecy_method_dot(SpanU8 xvec, SpanU8 member, int n) {
VecU8 res = VecU8_from_span(member);
VecU8_append(&res, ' ');
string_append_xvecy(&res, xvec, n);
@ -211,7 +211,7 @@ NODISCARD VecU8 generate_xvecy_method_dot(ConstSpanU8 xvec, ConstSpanU8 member,
return res;
}
NODISCARD VecU8 generate_xvec3_method_cross(ConstSpanU8 xvec) {
NODISCARD VecU8 generate_xvec3_method_cross(SpanU8 xvec) {
VecU8 res = VecU8_new();
string_append_xvecy(&res, xvec, 3);
VecU8_append(&res, ' ');
@ -227,7 +227,7 @@ NODISCARD VecU8 generate_xvec3_method_cross(ConstSpanU8 xvec) {
}
void string_append_xmatnm(VecU8* str, ConstSpanU8 xmat, int cols, int rows) {
void string_append_xmatnm(VecU8* str, SpanU8 xmat, int cols, int rows) {
VecU8_append_span(str, xmat);
VecU8_append(str, '0' + cols);
if (rows != cols) {
@ -237,7 +237,7 @@ void string_append_xmatnm(VecU8* str, ConstSpanU8 xmat, int cols, int rows) {
}
/* With columns padded to 16 bytes (for std140, std140 is our everything) */
NODISCARD VecU8 generate_xmatnm_structure_definition(ConstSpanU8 xmat, ConstSpanU8 xvec, int cols, int rows, int sizeof_member) {
NODISCARD VecU8 generate_xmatnm_structure_definition(SpanU8 xmat, SpanU8 xvec, int cols, int rows, int sizeof_member) {
int sv = (rows * sizeof_member) % 16;
VecU8 res = VecU8_from_cstr("typedef struct {\n");
for (int x = 0; x < cols; x++) {
@ -269,7 +269,7 @@ void string_append_mat_el_access(VecU8* str, int x, int y) {
string_append_vec_field_name(str, y);
}
NODISCARD VecU8 generate_xmatnm_method_new(ConstSpanU8 xmat, ConstSpanU8 xvec, ConstSpanU8 member, int cols, int rows) {
NODISCARD VecU8 generate_xmatnm_method_new(SpanU8 xmat, SpanU8 xvec, SpanU8 member, int cols, int rows) {
VecU8 res = VecU8_new();
string_append_xmatnm(&res, xmat, cols, rows);
VecU8_append(&res, ' ');
@ -305,7 +305,7 @@ NODISCARD VecU8 generate_xmatnm_method_new(ConstSpanU8 xmat, ConstSpanU8 xvec, C
return res;
}
NODISCARD VecU8 generate_square_xmatnn_E_definition(ConstSpanU8 xmat, int n) {
NODISCARD VecU8 generate_square_xmatnn_E_definition(SpanU8 xmat, int n) {
VecU8 res = VecU8_from_cstr("const ");
string_append_xmatnm(&res, xmat, n, n);
VecU8_append(&res, ' ');
@ -327,7 +327,7 @@ NODISCARD VecU8 generate_square_xmatnn_E_definition(ConstSpanU8 xmat, int n) {
return res;
}
NODISCARD VecU8 generate_xmatnm_method_add_xmatnm(ConstSpanU8 xmat, ConstSpanU8 xvec, ConstSpanU8 member, int cols, int rows) {
NODISCARD VecU8 generate_xmatnm_method_add_xmatnm(SpanU8 xmat, SpanU8 xvec, SpanU8 member, int cols, int rows) {
VecU8 res = VecU8_new();
string_append_xmatnm(&res, xmat, cols, rows);
VecU8_append(&res, ' ');
@ -358,7 +358,7 @@ NODISCARD VecU8 generate_xmatnm_method_add_xmatnm(ConstSpanU8 xmat, ConstSpanU8
return res;
}
NODISCARD VecU8 generate_xmatnm_method_minus_xmatnm(ConstSpanU8 xmat, ConstSpanU8 xvec, ConstSpanU8 member, int cols, int rows) {
NODISCARD VecU8 generate_xmatnm_method_minus_xmatnm(SpanU8 xmat, SpanU8 xvec, SpanU8 member, int cols, int rows) {
VecU8 res = VecU8_new();
string_append_xmatnm(&res, xmat, cols, rows);
VecU8_append(&res, ' ');
@ -389,7 +389,7 @@ NODISCARD VecU8 generate_xmatnm_method_minus_xmatnm(ConstSpanU8 xmat, ConstSpanU
return res;
}
NODISCARD VecU8 generate_xmatnm_method_minus(ConstSpanU8 xmat, ConstSpanU8 xvec, ConstSpanU8 member, int cols, int rows) {
NODISCARD VecU8 generate_xmatnm_method_minus(SpanU8 xmat, SpanU8 xvec, SpanU8 member, int cols, int rows) {
VecU8 res = VecU8_new();
string_append_xmatnm(&res, xmat, cols, rows);
VecU8_append(&res, ' ');
@ -412,7 +412,7 @@ NODISCARD VecU8 generate_xmatnm_method_minus(ConstSpanU8 xmat, ConstSpanU8 xvec,
return res;
}
NODISCARD VecU8 generate_xmatnm_method_mul_scal(ConstSpanU8 xmat, ConstSpanU8 xvec, ConstSpanU8 member, int cols, int rows) {
NODISCARD VecU8 generate_xmatnm_method_mul_scal(SpanU8 xmat, SpanU8 xvec, SpanU8 member, int cols, int rows) {
VecU8 res = VecU8_new();
string_append_xmatnm(&res, xmat, cols, rows);
VecU8_append(&res, ' ');
@ -437,7 +437,7 @@ NODISCARD VecU8 generate_xmatnm_method_mul_scal(ConstSpanU8 xmat, ConstSpanU8 xv
return res;
}
NODISCARD VecU8 generate_xmatnm_method_div_by_scal(ConstSpanU8 xmat, ConstSpanU8 xvec, ConstSpanU8 member, int cols, int rows) {
NODISCARD VecU8 generate_xmatnm_method_div_by_scal(SpanU8 xmat, SpanU8 xvec, SpanU8 member, int cols, int rows) {
VecU8 res = VecU8_new();
string_append_xmatnm(&res, xmat, cols, rows);
VecU8_append(&res, ' ');
@ -452,7 +452,7 @@ NODISCARD VecU8 generate_xmatnm_method_div_by_scal(ConstSpanU8 xmat, ConstSpanU8
return res;
}
NODISCARD VecU8 generate_xmatnm_method_mul_xvecn(ConstSpanU8 xmat, ConstSpanU8 xvec, int n, int m) {
NODISCARD VecU8 generate_xmatnm_method_mul_xvecn(SpanU8 xmat, SpanU8 xvec, int n, int m) {
VecU8 res = VecU8_new();
string_append_xvecy(&res, xvec, m);
VecU8_append(&res, ' ');
@ -483,7 +483,7 @@ NODISCARD VecU8 generate_xmatnm_method_mul_xvecn(ConstSpanU8 xmat, ConstSpanU8 x
return res;
}
NODISCARD VecU8 generate_xmatnm_method_mul_xmatkn(ConstSpanU8 xmat, int n, int m, int k) {
NODISCARD VecU8 generate_xmatnm_method_mul_xmatkn(SpanU8 xmat, int n, int m, int k) {
VecU8 res = VecU8_new();
string_append_xmatnm(&res, xmat, k, m);
VecU8_append(&res, ' ');
@ -521,7 +521,7 @@ NODISCARD VecU8 generate_xmatnm_method_mul_xmatkn(ConstSpanU8 xmat, int n, int m
return res;
}
VecU8 generate_xmatnm_method_transpose(ConstSpanU8 xmat, ConstSpanU8 xvec, ConstSpanU8 member, int n, int m) {
VecU8 generate_xmatnm_method_transpose(SpanU8 xmat, SpanU8 xvec, SpanU8 member, int n, int m) {
VecU8 res = VecU8_new();
string_append_xmatnm(&res, xmat, m, n);
VecU8_append(&res, ' ');
@ -548,7 +548,7 @@ VecU8 generate_xmatnm_method_transpose(ConstSpanU8 xmat, ConstSpanU8 xvec, Const
return res;
}
NODISCARD VecU8 generate_xvec234_structs_and_important_methods(ConstSpanU8 xvec, ConstSpanU8 member) {
NODISCARD VecU8 generate_xvec234_structs_and_important_methods(SpanU8 xvec, SpanU8 member) {
VecU8 res = VecU8_new();
for (int cc = 2; cc <= 4; cc++) {
VecU8_append_vec(&res, generate_xvecy_struct_definition(xvec, member, cc));
@ -559,7 +559,7 @@ NODISCARD VecU8 generate_xvec234_structs_and_important_methods(ConstSpanU8 xvec,
return res;
}
NODISCARD VecU8 generate_xvec234_structs_and_methods(ConstSpanU8 xvec, ConstSpanU8 member) {
NODISCARD VecU8 generate_xvec234_structs_and_methods(SpanU8 xvec, SpanU8 member) {
VecU8 res = generate_xvec234_structs_and_important_methods(xvec, member);
for (int cc = 2; cc <= 4; cc++) {
VecU8_append_vec(&res, generate_xvecy_method_mul_scal(xvec, member, cc));
@ -573,7 +573,7 @@ NODISCARD VecU8 generate_xvec234_structs_and_methods(ConstSpanU8 xvec, ConstSpan
return res;
}
NODISCARD VecU8 generate_xmat234x234_structs_and_methods(ConstSpanU8 xmat, ConstSpanU8 xvec, ConstSpanU8 member, int sizeof_member) {
NODISCARD VecU8 generate_xmat234x234_structs_and_methods(SpanU8 xmat, SpanU8 xvec, SpanU8 member, int sizeof_member) {
VecU8 res = VecU8_new();
for (int cols = 2; cols <= 4; cols++) {
for (int rows = 2; rows <= 4; rows++) {

View File

@ -3,14 +3,14 @@
#include "../../l1/codegen/codegen.h"
void VecU8_append_resoftexdatat(VecU8* str, ConstSpanU8 texdatat) {
void VecU8_append_resoftexdatat(VecU8* str, SpanU8 texdatat) {
VecU8_append_span(str, cstr("Result"));
VecU8_append_span(str, texdatat);
VecU8_append_span(str, cstr("OrConstSpanU8"));
VecU8_append_span(str, cstr("OrSpanU8"));
}
/* Used to generate both _at() and _cat() methods */
VecU8 generate_texture_data_method_at(ConstSpanU8 texdatat, ConstSpanU8 member, bool const_access) {
VecU8 generate_texture_data_method_at(SpanU8 texdatat, SpanU8 member, bool const_access) {
VecU8 res = VecU8_from_span(member);
VecU8_append_span(&res, cstr("* "));
VecU8_append_span(&res, texdatat);
@ -25,7 +25,7 @@ VecU8 generate_texture_data_method_at(ConstSpanU8 texdatat, ConstSpanU8 member,
return res;
}
VecU8 generate_texture_data_struct_and_necc_methods(ConstSpanU8 texdatat, ConstSpanU8 member) {
VecU8 generate_texture_data_struct_and_necc_methods(SpanU8 texdatat, SpanU8 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} "));
@ -99,13 +99,13 @@ VecU8 generate_texture_data_struct_and_necc_methods(ConstSpanU8 texdatat, ConstS
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 "write_whole_file_or_abort(path, VecU8_to_SpanU8(&data));\n"
SPACE4 "VecU8_drop(data);\n"
"}\n\n"));
/* Result<texdatat, ConstSpanU8> stucture */
/* Result<texdatat, SpanU8> 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_span(&res, cstr(" ok;\n" SPACE4 SPACE4 "SpanU8 err;\n" SPACE4 "};\n} "));
VecU8_append_resoftexdatat(&res, texdatat);
VecU8_append_span(&res, cstr(";\n\n"));
/* Method _from_bitmap_text()
@ -114,7 +114,7 @@ VecU8 generate_texture_data_struct_and_necc_methods(ConstSpanU8 texdatat, ConstS
VecU8_append_resoftexdatat(&res, texdatat);
VecU8_append(&res, ' ');
VecU8_append_span(&res, texdatat);
VecU8_append_span(&res, cstr("_from_bitmap_text(ConstSpanU8 text) {\n"
VecU8_append_span(&res, cstr("_from_bitmap_text(SpanU8 text) {\n"
SPACE4 "if (text.len < 8)\n"
SPACE4 SPACE4 "return ("));
VecU8_append_resoftexdatat(&res, texdatat);
@ -122,9 +122,9 @@ VecU8 generate_texture_data_struct_and_necc_methods(ConstSpanU8 texdatat, ConstS
".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 SPACE4 "width |= (((size_t)*SpanU8_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 SPACE4 "height |= (((size_t)*SpanU8_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);
@ -155,10 +155,10 @@ VecU8 generate_texture_data_struct_and_necc_methods(ConstSpanU8 texdatat, ConstS
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"
VecU8_append_span(&res, cstr("_from_bitmap_text(VecU8_to_SpanU8(&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 "SpanU8_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 "));
@ -176,8 +176,7 @@ void generate_pixel_masses_header() {
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")));
/// todo: include generated (by l2/codegen) headers with cvec3,4 Vec
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")));