diff --git a/CMakeLists.txt b/CMakeLists.txt index ab0be83..e51bf5d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -43,8 +43,8 @@ add_executable(codegen_l1_5 src/l1_5/anne/codegen.c) add_executable(0_render_test src/l2/tests/r0/r0.c gen/l_wl_protocols/xdg-shell-private.c) target_link_libraries(0_render_test -lvulkan -lwayland-client -lm -lxkbcommon -lpng -lfreetype) -#add_executable(0r_tex_init_prep src/l2/tests/r0/r0_tex_init_prep.c) -#target_link_libraries(0r_tex_init_prep -lm -lpng) +add_executable(0r_tex_init_prep src/l2/tests/r0/r0_tex_init_prep.c) +target_link_libraries(0r_tex_init_prep -lm -lpng) #add_executable(1_render_test src/l2/tests/r1/r1.c gen/l_wl_protocols/xdg-shell-private.c) #target_link_libraries(1_render_test -lwayland-client -lrt -lm -lxkbcommon) diff --git a/src/l1/anne/geom.h b/src/l1/anne/geom.h index 4c4cbc9..f975586 100644 --- a/src/l1/anne/geom.h +++ b/src/l1/anne/geom.h @@ -337,13 +337,9 @@ NODISCARD VecU8 generate_square_xmatn_methods(SpanU8 xmat, SpanU8 xvec, SpanU8 m return res; } -NODISCARD VecU8 generate_xmat4_inverse_method(SpanU8 xmat, SpanU8 xvec, SpanU8 memb){ - VecU8 g_xmat4 = codegen_name_xmatnm(xmat, 4, 4); - SpanU8 xmat4 = VecU8_to_span(&g_xmat4); - VecU8 res = VecU8_fmt( - "%s %s_inverse(%s A) {\n" - SPACE "%s m2[6][6] = {\n", - xmat4, xmat4, xmat4, memb); +NODISCARD VecU8 generate_xmat_inverse_methods(SpanU8 xmat, SpanU8 xvec, SpanU8 memb){ + VecU8 res = VecU8_fmt("%s4 %s4_inverse(%s4 A) {\n", xmat, xmat, xmat); + VecU8_append_vec(&res, VecU8_fmt(SPACE "%s m2[6][6] = {\n", memb)); SpanU8 first_of_pair[6] = {cstr("x"), cstr("x"), cstr("x"), cstr("y"), cstr("y"), cstr("z")}; SpanU8 second_of_pair[6] = {cstr("y"), cstr("z"), cstr("w"), cstr("z"), cstr("w"), cstr("w")}; for (int w_col = 0; w_col < 6; w_col++) { @@ -403,7 +399,16 @@ NODISCARD VecU8 generate_xmat4_inverse_method(SpanU8 xmat, SpanU8 xvec, SpanU8 m VecU8_append_span(&res, cstr(" }")); } VecU8_append_span(&res, cstr(" };\n}\n\n")); - VecU8_drop(g_xmat4); + + VecU8_append_vec(&res, VecU8_fmt( + "%s2 %s2_inverse(%s2 A) {\n" /* xmat, xmat, xmat */ + SPACE "%s d = 1 / (A.x.x * A.y.y - A.y.x * A.x.y);\n" /* memb */ + SPACE "return (%s2){ .x = { A.y.y * d, -A.x.y * d}, .y = {-A.y.x * d, A.x.x * d}};\n" /* xmat */ + "}\n\n", xmat, xmat, xmat, memb, xmat)); + + // VecU8_append_vec(&res, VecU8_fmt( "%s3 %s3_inverse(%s3 A) {\n", xmat, xmat, xmat)); + // VecU8_append_vec(&res, VecU8_fmt(SPACE "%s d = 1 / (")); + // VecU8_append_span(&res, cstr("}\n")); return res; } @@ -484,7 +489,7 @@ NODISCARD VecU8 generate_xmat234x234_structs_methods(SpanU8 xmat, SpanU8 xvec, S } } } - VecU8_append_vec(&res, generate_xmat4_inverse_method(xmat, xvec, memb)); + VecU8_append_vec(&res, generate_xmat_inverse_methods(xmat, xvec, memb)); return res; } diff --git a/src/l2/tests/r0/r0_assets.h b/src/l2/tests/r0/r0_assets.h index f535373..f63b5c3 100644 --- a/src/l2/tests/r0/r0_assets.h +++ b/src/l2/tests/r0/r0_assets.h @@ -179,52 +179,60 @@ GenericMeshTopology generate_one_fourth_of_a_cylinder(float w, float r, U32 k) { assert(k >= 1); const float a = M_PI_2f / (float)k; const float l = 2 * r * sinf(M_PI_4f / (float)k); - const vec2 v0tex = {r / (2 * r + w), r / (2 * r + (float)k * l)}; - const vec2 v1tex = {(r + w) / (2 * r + w), r / (2 * r + (float)k * l)}; - const vec2 v2tex = {r / (2 * r + w), 2 * r / (2 * r + (float)k * l)}; - const vec2 v3tex = {(r + w) / (2 * r + w), 2 * r / (2 * r + (float)k * l)}; - VecGenericMeshVertex vertices = VecGenericMeshVertex_new_reserved(4 * k + 6); + float tex_width = 2 * r + w; + float tex_height = 2 * r + (float)k * l; + + const vec2 v0tex = {r / tex_width, r / tex_height}; + const vec2 v1tex = {(r + w) / tex_width, r / tex_height}; + const vec2 v2tex = {r / tex_width, 2 * r / tex_height}; + const vec2 v3tex = {(r + w) / tex_width, 2 * r / tex_height}; + VecGenericMeshVertex vertices = VecGenericMeshVertex_new_reserved(6 + 4 * k + (k + 2) * 2); VecGenericMeshVertex_append(&vertices, (GenericMeshVertex){.pos = {0, 0, 0}, .tex = v0tex}); VecGenericMeshVertex_append(&vertices, (GenericMeshVertex){.pos = {w, 0, 0}, .tex = v1tex}); VecGenericMeshVertex_append(&vertices, (GenericMeshVertex){.pos = {0, r, 0}, .tex = v2tex}); VecGenericMeshVertex_append(&vertices, (GenericMeshVertex){.pos = {w, r, 0}, .tex = v3tex}); - VecGenericMeshVertex_append(&vertices, (GenericMeshVertex){.pos = {0, 0, -r}, .tex = {r / (2 * r + w), 0}}); - VecGenericMeshVertex_append(&vertices, (GenericMeshVertex){.pos = {w, 0, -r}, .tex = {(r + w) / (2 * r + w), 0}}); - for (U32 i = 1; i <= k; i++) { + VecGenericMeshVertex_append(&vertices, (GenericMeshVertex){.pos = {0, 0, -r}, .tex = {r / tex_width, 0}}); + VecGenericMeshVertex_append(&vertices, (GenericMeshVertex){.pos = {w, 0, -r}, .tex = {(r + w) / tex_width, 0}}); + + for (U32 i = 0; i < k; i++) { + for (int j = 0; j < 2; j++) { + VecGenericMeshVertex_append(&vertices, (GenericMeshVertex){ + .pos = {0, cosf(a * (float)(i + j)) * r, -sinf(a * (float)(i + j)) * r}, + .tex = {v2tex.x, v2tex.y + (float)(i + j) * l / tex_height} + }); + VecGenericMeshVertex_append(&vertices, (GenericMeshVertex){ + .pos = {w, cosf(a * (float)(i + j)) * r, -sinf(a * (float)(i + j)) * r}, + .tex = {v3tex.x, v3tex.y + (float)(i + j) * l / tex_height} + }); + } + } + assert(vertices.len == 6 + 4 * k); + + for (U32 i = 0; i <= k; i++) { VecGenericMeshVertex_append(&vertices, (GenericMeshVertex){ .pos = {0, cosf(a * (float)i) * r, -sinf(a * (float)i) * r}, - .tex = vec2_add_vec2(v0tex, (vec2){r / (2 * r + w) * -sinf(a * (float)i), r / (2*r + (float)k * l) * cosf(a * (float)i)}) + .tex = (vec2){ (r - r *sinf(a * (float)i)) / tex_width, (r + r * cosf(a * (float)i)) / tex_height}, }); } - for (U32 i = 1; i <= k; i++) { + VecGenericMeshVertex_append(&vertices, (GenericMeshVertex){.pos = {0, 0, 0}, .tex = v0tex}); + for (U32 i = 0; i <= k; i++) { VecGenericMeshVertex_append(&vertices, (GenericMeshVertex){ .pos = {w, cosf(a * (float)i) * r, -sinf(a * (float)i) * r}, - .tex = vec2_add_vec2(v1tex, (vec2){r / (2 * r + w) * sinf(a * (float)i), r / (2*r + (float)k * l) * cosf(a * (float)i)}) + .tex = (vec2){ (r + w + r * sinf(a * (float)i)) / tex_width, (r + r * cosf(a * (float)i)) / tex_height}, }); } - for (U32 i = 1; i <= k; i++) { - VecGenericMeshVertex_append(&vertices, (GenericMeshVertex){ - .pos = {0, cosf(a * (float)i) * r, -sinf(a * (float)i) * r}, - .tex = {v2tex.x, v2tex.y + (float)i * l / (2*r + (float)k * l)} - }); - } - for (U32 i = 1; i <= k; i++) { - VecGenericMeshVertex_append(&vertices, (GenericMeshVertex){ - .pos = {w, cosf(a * (float)i) * r, -sinf(a * (float)i) * r}, - .tex = {v3tex.x, v3tex.y + (float)i * l / (2*r + (float)k * l)} - }); - } - VecU32 indexes = VecU32_new_reserved(3*(2+2+2*k+2*k)); - { - U32 _span_0[] = {5, 1, 0, 5, 0, 4, 1, 3, 0, 3, 2, 0}; - VecU32_append_span(&indexes, (SpanU32){.data = _span_0, .len = ARRAY_SIZE(_span_0)}); - } - for (U32 i = 1; i <= k; i++) { + VecGenericMeshVertex_append(&vertices, (GenericMeshVertex){.pos = {w, 0, 0}, .tex = v1tex}); + assert(vertices.len == 6 + 4 * k + (k + 2) * 2); + + VecU32 indexes = VecU32_new_reserved(3*(4+2*k+2*k)); + U32 _span_0[] = {5, 1, 0, 5, 0, 4, 1, 3, 0, 3, 2, 0}; + VecU32_append_span(&indexes, (SpanU32){.data = _span_0, .len = ARRAY_SIZE(_span_0)}); + for (U32 i = 0; i < k; i++) { U32 _span_1[] = { - 0, i > 1 ? 5 + i - 1 : 2, 5 + i, - 1, 5 + k + i, i > 1 ? 5 + k + i - 1 : 3, - i > 1 ? 5 + 2 * k + i - 1 : 2, i > 1 ? 5 + 3 * k + i - 1 : 3, 5 + 2 * k + i, - 5 + 3 * k + i, 5 + 2 * k + i, i > 1 ? 5 + 3 * k + i - 1 : 3, + 6 + 4 * k + k + 1, 6 + 4 * k + i, 6 + 4 * k + i + 1, + 6 + 4 * k + 2 * k + 3, 6 + 4 * k + (k + 2) + i + 1, 6 + 4 * k + (k + 2) + i, + 6 + 4 * i + 0, 6 + 4 * i + 1, 6 + 4 * i + 3, + 6 + 4 * i + 0, 6 + 4 * i + 3, 6 + 4 * i + 2, }; VecU32_append_span(&indexes, (SpanU32){.data = _span_1, .len = ARRAY_SIZE(_span_1)}); } diff --git a/src/l2/tests/r0/r0_tex_init_prep.c b/src/l2/tests/r0/r0_tex_init_prep.c index 37bd066..3d46906 100644 --- a/src/l2/tests/r0/r0_tex_init_prep.c +++ b/src/l2/tests/r0/r0_tex_init_prep.c @@ -1,6 +1,5 @@ #include "r0_assets.h" #include "../../marie/rasterization.h" -// #include "../../margaret/png_pixel_masses.h" // todo: delete this file #include "../../../../gen/l1/margaret/png_pixel_masses.h" #include "../../marie/texture_processing.h" diff --git a/src/l2/tests/r0/textures/log_10_2_6_specular.png b/src/l2/tests/r0/textures/log_10_2_6_specular.png index c815435..1027cf7 100644 Binary files a/src/l2/tests/r0/textures/log_10_2_6_specular.png and b/src/l2/tests/r0/textures/log_10_2_6_specular.png differ