Я СОБРАЛ ПАРКЕТ

This commit is contained in:
Андреев Григорий 2026-01-23 16:33:48 +03:00
parent f4400a08a8
commit 2c4252847d
6 changed files with 111 additions and 28 deletions

View File

@ -16,6 +16,8 @@ HEADERS_src_l2 := $(HEADERS_gen_l1_5) $(call find_headers,l2)
#HEADERS_gen_l2 := $(HEADERS_src_l2) gen/l2/dorothy.txt
HEADERS_gen_l2 := gen/l2/dorothy.txt
HEADERS_src_l3 := $(HEADERS_gen_l2) $(call find_headers,l3)
cflags := -Wall -Wextra -Werror=implicit-function-declaration -Werror=return-type -Wno-unused-parameter \
--std=c99 -g -ggdb -O0 \
-fno-trapping-math -D_POSIX_C_SOURCE=200112L -D_GNU_SOURCE
@ -145,6 +147,14 @@ out/l3/r4: src/l3/r4/R4.hs src/l2/allie/Allie.hs $(full_allie_obj)
run_r4: out/l3/r4
./out/l3/r4
out/l3/r4b: src/l3/r4/r4.c $(HEADERS_src_l3) $(l_wl_protocols) $(ASSETS_gen_l_adele)
mkdir -p out/l3
$(cc) $(cflags) -o $@ $< $(xdg_shell_private_c) -lvulkan -lm -lxkbcommon -lwayland-client -lpng -lfreetype
.PHONY: run_r4b
run_r4b: out/l3/r4b
./out/l3/r4b
.PHONY: clean
clean:
rm -rf gen out

View File

@ -56,6 +56,7 @@ void write_file_by_path(VecU8 path, SpanU8 content){
if (fwrite(content.data, 1, content.len, fd) < content.len) {
abortf("fwrite\n");
}
VecU8_drop(path);
fclose(fd);
}

View File

@ -842,21 +842,79 @@ void r4_asset_gen_generic_mesh_one_fourth_of_a_cylinder_2(U64 w, U64 r, U64 k) {
VecU8_fmt("l2/textures/log_%u_%u_%u_NORMAL.png", w, r, k));
}
#define pow2_14 16384
/* P : Vec<Vec<vec2#.(14) >>*/
void r4_asset_gen_generic_mesh_horizontal_polygon(const VecVecs64vec2* P, mat3x2 tex_trans, VecU8 save_path){
VecMarieHoleAndVertexId triangulation = marie_polygon_hole_removal_triangulation(P);
VecU64 hole_pref_vert_sz = VecU64_new_zeroinit(P->len + 1);
for (size_t h = 0; h < P->len; h++) {
hole_pref_vert_sz.buf[h + 1] = hole_pref_vert_sz.buf[h] + P->buf[h].len;
}
U64 tvn = hole_pref_vert_sz.buf[P->len];
VecGenericMeshVertexInc vertices = VecGenericMeshVertexInc_new_zeroinit(tvn);
for (size_t h = 0; h < P->len; h++) {
for (size_t i = 0; i < P->buf[h].len; i++) {
size_t vi = hole_pref_vert_sz.buf[h] + i;
s64vec2 pos = P->buf[h].buf[i];
vec2 pos_float_plane = {(float)pos.x / pow2_14, (float)pos.y / pow2_14};
vec3 pos_float = {pos_float_plane.x, 0, -pos_float_plane.y};
*VecGenericMeshVertexInc_mat(&vertices, vi) = (GenericMeshVertexInc){.pos = pos_float,
.tex = mat3x2_mul_vec3(tex_trans, vec2_and_one(pos_float_plane))};
}
}
VecU32 indexes = VecU32_new_zeroinit(triangulation.len);
for (size_t ii = 0; ii < triangulation.len; ii++) {
MarieHoleAndVertexId p = triangulation.buf[ii];
assert(p.hole_id < P->len);
assert(p.vertex_in_hole_id < P->buf[p.hole_id].len);
U64 vi = hole_pref_vert_sz.buf[p.hole_id] + p.vertex_in_hole_id;
assert(vi < tvn);
indexes.buf[ii] = (U32)vi;
}
alice_write_generic_mesh_to_file((GenericMeshTopology){.vertices = vertices, .indexes = indexes}, save_path);
VecU64_drop(hole_pref_vert_sz);
VecMarieHoleAndVertexId_drop(triangulation);
}
/* #.(q) */
VecVecs64vec2 generate_funny_polygon(){
Vecs64vec2 A = Vecs64vec2_new_zeroinit(60);
for (int i = 0; i < 60; i++) {
float x = cosf((float)i * 2 * M_PIf / 60) * 2;
float y = sinf((float)i * 2 * M_PIf / 60);
A.buf[i] = (s64vec2){(S64)roundf(x * pow2_14), (S64)roundf(y * pow2_14)};
}
VecVecs64vec2 P = VecVecs64vec2_new();
VecVecs64vec2_append(&P, A);
return P;
}
/* We are on l2 */
int gen_assets_for_r4() {
mkdir_nofail("l2/models");
mkdir_nofail("l2/textures");
mkdir_nofail("l2/textures/r4");
r4_asset_gen_generic_mesh_one_fourth_of_a_cylinder_2(10, 2, 6);
alice_write_shiny_mesh_to_file(generate_shiny_cube((vec3){0.6f, 0.6f, 0.7f}), vcstr("l2/models/cube.AliceShinyMesh"));
alice_write_shiny_mesh_to_file(generate_shiny_lamp(0.3f, 0.13f, 0.19f), vcstr("l2/models/lamp.AliceShinyMesh"));
r4_asset_gen_generic_mesh_quad(10, 10, vcstr("l2/models/quad.AliceGenericMesh"));
r4_asset_gen_generic_mesh_cylinder(200, 0.4f, 0.17f, 30, vcstr("l2/models/puck.AliceGenericMesh"),
vcstr("l2/textures/puck_TEMPLATE.png"), vcstr("l2/textures/puck_NORMAL.png"));
r4_asset_gen_generic_mesh_cylinder(100, 0.04f, 1.5f, 4, vcstr("l2/models/stick.AliceGenericMesh"),
vcstr("l2/textures/stick_TEMPLATE.png"), vcstr("l2/textures/stick_NORMAL.png"));
r4_generate_flat_normal_map(vcstr("l2/textures/flat_NORMAL.png"));
generate_single_pixel_gray_tex(vcstr("l2/textures/no_SPECULAR.png"), 0);
// mkdir_nofail("l2/models");
// mkdir_nofail("l2/textures");
// mkdir_nofail("l2/textures/r4");
// r4_asset_gen_generic_mesh_one_fourth_of_a_cylinder_2(10, 2, 6);
// alice_write_shiny_mesh_to_file(generate_shiny_cube((vec3){0.6f, 0.6f, 0.7f}), vcstr("l2/models/cube.AliceShinyMesh"));
// alice_write_shiny_mesh_to_file(generate_shiny_lamp(0.3f, 0.13f, 0.19f), vcstr("l2/models/lamp.AliceShinyMesh"));
// r4_asset_gen_generic_mesh_quad(10, 10, vcstr("l2/models/quad.AliceGenericMesh"));
// r4_asset_gen_generic_mesh_cylinder(200, 0.4f, 0.17f, 30, vcstr("l2/models/puck.AliceGenericMesh"),
// vcstr("l2/textures/puck_TEMPLATE.png"), vcstr("l2/textures/puck_NORMAL.png"));
// r4_asset_gen_generic_mesh_cylinder(100, 0.04f, 1.5f, 4, vcstr("l2/models/stick.AliceGenericMesh"),
// vcstr("l2/textures/stick_TEMPLATE.png"), vcstr("l2/textures/stick_NORMAL.png"));
// r4_generate_flat_normal_map(vcstr("l2/textures/flat_NORMAL.png"));
// generate_single_pixel_gray_tex(vcstr("l2/textures/no_SPECULAR.png"), 0);
{ /* Just a test */
VecVecs64vec2 P = generate_funny_polygon();
r4_asset_gen_generic_mesh_horizontal_polygon(&P, (mat3x2){.x.x = 1, .y.y = 1},
vcstr("l2/models/floor1.AliceGenericMesh"));
VecVecs64vec2_drop(P);
}
return 0;
}

View File

@ -84,8 +84,8 @@ void marie_ear_cutting_triangulation_check_vertex(Spans64vec2 P, const VecMarieE
}
for (U64 i = xnn; i != xp; i = rem->buf[i].next) {
s64vec2 S = P.data[i];
if (marie_precise_surface(A, B, S) >= 0 ||
marie_precise_surface(B, C, S) >= 0 || marie_precise_surface(C, A, S) >= 0) {
if (marie_precise_surface(A, B, S) >= 0 &&
marie_precise_surface(B, C, S) >= 0 && marie_precise_surface(C, A, S) >= 0) {
return;
}
}
@ -132,6 +132,8 @@ VecU64 marie_polygon_ear_cutting_triangulation(Spans64vec2 P){
n--;
}
VecU64_drop(ear_queue);
VecMarieEarCuttingTriangulVertState_drop(vertices);
return triangles;
}
@ -186,6 +188,7 @@ VecMarieHoleAndVertexId marie_polygon_hole_removal(const VecVecs64vec2* P){
VecU64 rightest_vertex = VecU64_new_zeroinit(HN);
for (size_t hole = 1; hole < HN; hole++) {
printf("C1 hole = %lu\n", hole);
U64 ans = UINT64_MAX;
size_t hs = P->buf[hole].len;
assert(hs >= 3);
@ -216,6 +219,7 @@ VecMarieHoleAndVertexId marie_polygon_hole_removal(const VecVecs64vec2* P){
VecVecVecMarieHoleAndVertexId connections = VecVecVecMarieHoleAndVertexId_new_reserved(HN);
for (size_t hole = 0; hole < HN; hole++) {
printf("C2 hole = %lu\n", hole);
size_t hs = P->buf[hole].len;
VecVecVecMarieHoleAndVertexId_append(&connections, VecVecMarieHoleAndVertexId_new_reserved(hs));
for (size_t p = 0; p < hs; p++) {
@ -224,6 +228,7 @@ VecMarieHoleAndVertexId marie_polygon_hole_removal(const VecVecs64vec2* P){
}
VecMarieHoleAndVertexId parent_vertex_of_hole = VecMarieHoleAndVertexId_new_zeroinit(HN);
for (size_t hole = 1; hole < HN; hole++) {
printf("C3 hole = %lu\n", hole);
size_t a_hs = P->buf[hole].len;
U64 ai = rightest_vertex.buf[hole];
s64vec2 a = P->buf[hole].buf[ai];
@ -273,6 +278,7 @@ VecMarieHoleAndVertexId marie_polygon_hole_removal(const VecVecs64vec2* P){
}
for (size_t hole = 0; hole < HN; hole++) {
printf("C4 hole = %lu\n", hole);
size_t hs = P->buf[hole].len;
assert(hole == 0 || connections.buf[hole].buf[rightest_vertex.buf[hole]].len >= 1);
for (size_t ai = 0; ai < hs; ai++) {
@ -287,12 +293,13 @@ VecMarieHoleAndVertexId marie_polygon_hole_removal(const VecVecs64vec2* P){
assert(vertex_connections->len >= 1);
}
}
for (size_t hole = 0; hole < HN; hole++) {
for (size_t hole = 1; hole < HN; hole++) {
printf("C5 hole = %lu\n", hole); // todo: remove debug vivod
U64 a = rightest_vertex.buf[hole];
MarieHoleAndVertexId b = parent_vertex_of_hole.buf[hole];
VecMarieHoleAndVertexId_append(&connections.buf[hole].buf[a], b);
}
// todo: debug infinite loop
VecVecU64 progress = VecVecU64_new_reserved(HN);
for (size_t h = 0; h < HN; h++) {
VecVecU64_append(&progress, VecU64_new_zeroinit(P->buf[h].len));
@ -308,7 +315,7 @@ VecMarieHoleAndVertexId marie_polygon_hole_removal(const VecVecs64vec2* P){
break;
assert(*p < conn->len);
VecMarieHoleAndVertexId_append(&detour, cur);
cur = conn->buf[*(p++)];
cur = conn->buf[(*p)++];
}
VecU64_drop(rightest_vertex);

View File

@ -9,15 +9,6 @@ AliceGenericMeshPath AliceGenericMeshPath_for_log(SpanU8 root_dir, U64 w, U64 r,
};
}
AliceGenericMeshPath AliceGenericMeshPath_for_puck(){
return (AliceGenericMeshPath){
.topology_path = VecU8_fmt("gen/l2/models/puck.AliceGenericMesh"),
.diffuse_texture_path = VecU8_fmt("src/l3/textures/puck_diffuse.png"),
.normal_texture_path = VecU8_fmt("gen/l2/textures/puck_NORMAL.png"),
.specular_texture_path = VecU8_fmt("src/l3/textures/puck_specular.png"),
};
}
vec3 project_dir_onto_plane_xz(vec3 v){
vec2 xz = vec2_normalize((vec2){v.x, v.z});
return (vec3){xz.x, 0, xz.y};
@ -147,7 +138,23 @@ int main(){
.model_t = marie_translation_mat4((vec3){5.f, -3, 12.f}),
});
ListNodeAliceGenericMeshHand* model_puck = Alice_add_generic_mesh(st.alice, AliceGenericMeshPath_for_puck());
ListNodeAliceGenericMeshHand* floor1_mesh = Alice_add_generic_mesh(st.alice, (AliceGenericMeshPath){
.topology_path = vcstr("gen/l2/models/floor1.AliceGenericMesh"),
.diffuse_texture_path = vcstr("src/l3/textures/wood.png"),
.normal_texture_path = vcstr("gen/l2/textures/flat_NORMAL.png"),
.specular_texture_path = vcstr("gen/l2/textures/no_SPECULAR.png"),
});
AliceGenericMeshHand_resize_instance_arr(alice, &floor1_mesh->el, 1);
AliceGenericMeshHand_set_inst(&floor1_mesh->el, 0, (GenericMeshInstanceInc){
.model_t = marie_translation_mat4((vec3){0, 0, 0}),
});
ListNodeAliceGenericMeshHand* model_puck = Alice_add_generic_mesh(st.alice, (AliceGenericMeshPath){
.topology_path = vcstr("gen/l2/models/puck.AliceGenericMesh"),
.diffuse_texture_path = vcstr("src/l3/textures/puck_diffuse.png"),
.normal_texture_path = vcstr("gen/l2/textures/puck_NORMAL.png"),
.specular_texture_path = vcstr("src/l3/textures/puck_specular.png"),
});
AliceGenericMeshHand_resize_instance_arr(st.alice, &model_puck->el, 100);
for (int X = 0; X < 10; X++) {
for (int Z = 0; Z < 10; Z++) {

BIN
src/l3/textures/wood.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 761 KiB