city_generator2

Generated conformal 3D meshes representing a city
git clone git://git.meso-star.fr/city_generator2.git
Log | Files | Refs | README | LICENSE

commit 8ade70a0d0b788ca2fe0fb73240a629039c3faf8
parent be68aa739a64662b1a21dc53a8ee16d455367d09
Author: Benjamin Piaud <benjamin.piaud@meso-star.com>
Date:   Wed, 18 Jan 2023 11:24:35 +0100

Change strategy for boundary building of mode_0 and fix bug in cavity

Diffstat:
Msrc/cg_construction_mode_0.c | 86++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------
Msrc/cg_construction_mode_0.h | 3++-
2 files changed, 61 insertions(+), 28 deletions(-)

diff --git a/src/cg_construction_mode_0.c b/src/cg_construction_mode_0.c @@ -91,6 +91,28 @@ error: } static res_T +build_fake_ground + (struct scpr_polygon* pg, + struct scad_geometry** fake_ground) +{ + res_T res = RES_OK; + double d[3] = {0, 0, -1}; + struct scad_geometry* footprint = NULL; + + ASSERT(pg && fake_ground); + + ERR(build_floor_footprint(pg, &footprint)); + + ERR(scad_geometry_extrude(footprint, NULL, d, fake_ground)); + +exit: + SCAD(geometry_delete(footprint)); + return res; +error: + goto exit; +} + +static res_T build_roof (const char* prefix, const struct building* b, @@ -235,7 +257,7 @@ build_cavity ERR(scpr_polygon_get_vertices_count(pg, 0, &nverts)); ERR(scad_add_polygon(NULL, get_position_pg, pg, e, nverts, &polygon)); - d[2] = height - e; + d[2] = height - 2*e; ERR(scad_geometry_extrude(polygon, cavityname, d, cavity)); exit: @@ -309,42 +331,47 @@ static res_T build_boundary (const char* prefix, struct mem_allocator* allocator, - struct data_cad_cmode_0* cad) + struct data_cad_cmode_0* data_cad) { res_T res = RES_OK; + size_t count = 0; struct scad_geometry** list = NULL; - struct scad_geometry* boundary = NULL; - char* cname = NULL; + char* boundaryname = NULL; struct str name; int is_init = 0; - ASSERT(allocator && cad); + ASSERT(allocator && prefix && data_cad); + + str_init(allocator, &name); + is_init = 1; - list = MEM_ALLOC(allocator, 4 * sizeof(struct scad_geometry*)); + count = 5; + list = MEM_ALLOC(allocator, count * sizeof(struct scad_geometry*)); if(!list) { res = RES_MEM_ERR; goto error; } - list[0] = cad->floor; - list[1] = cad->wall; - list[2] = cad->roof; - list[3] = cad->cavity; - - str_init(NULL, &name); - is_init = 1; - if (prefix) { - ERR(str_set(&name, prefix)); - ERR(str_append(&name, "_boundary")); - cname = str_get(&name); - } - - ERR(scad_geometry_boundary(NULL, list, 4, &boundary)); - - ERR(scad_cut_geometries(cname, &boundary, 1, &cad->ground_connection, 1, - &cad->boundary)); - + list[0] = data_cad->floor; + list[1] = data_cad->wall; + list[2] = data_cad->roof; + list[3] = data_cad->cavity; + list[4] = data_cad->fake_ground; + + data_cad->boundary = MEM_ALLOC(allocator, 2 * sizeof(struct scad_geometry*)); + + ERR(str_set(&name, prefix)); + ERR(str_append(&name, "_boundary_wall")); + boundaryname = str_get(&name); + ERR(scad_geometries_common_boundaries(boundaryname, list, count, + &data_cad->wall, 1, &data_cad->boundary[0])); + + ERR(str_set(&name, prefix)); + ERR(str_append(&name, "_boundary_roof")); + boundaryname = str_get(&name); + ERR(scad_geometries_common_boundaries(boundaryname, list, count, + &data_cad->roof, 1, &data_cad->boundary[1])); + exit: - if(boundary) SCAD(geometry_delete(boundary)); MEM_RM(allocator, list); if (is_init) str_release(&name); return res; @@ -509,6 +536,9 @@ build_cad_cmode_0 /* build cavity */ ERR(build_cavity(name, pg_int, building, &data_cad->cavity)); + /* build fake ground */ + ERR(build_fake_ground(pg, &data_cad->fake_ground)); + ERR(scad_scene_partition()); /* build ground/building connection */ @@ -593,7 +623,8 @@ export_stl_cmode_0 } /* boundary export */ - ERR(scad_stl_export(data_cad->boundary, NULL, 0, binary)); + ERR(scad_stl_export(data_cad->boundary[0], NULL, 0, binary)); + ERR(scad_stl_export(data_cad->boundary[1], NULL, 0, binary)); /* footprint export */ ERR(scad_stl_export(data_cad->ground_connection, NULL, 0, binary)); @@ -620,15 +651,16 @@ release_cad_cmode_0 goto error; } - if(data_cad->boundary) SCAD(geometry_delete(data_cad->boundary)); if(data_cad->cavity) SCAD(geometry_delete(data_cad->cavity)); if(data_cad->floor) SCAD(geometry_delete(data_cad->floor)); if(data_cad->ground_connection) SCAD(geometry_delete(data_cad->ground_connection)); if(data_cad->roof) SCAD(geometry_delete(data_cad->roof)); if(data_cad->wall) SCAD(geometry_delete(data_cad->wall)); + if(data_cad->fake_ground) SCAD(geometry_delete(data_cad->fake_ground)); for(i = 0; i < data_cad->n_connection; i++) { SCAD(geometry_delete(data_cad->connection[i])); } + MEM_RM(allocator, data_cad->boundary); MEM_RM(allocator, data_cad->connection); MEM_RM(allocator, data_cad); diff --git a/src/cg_construction_mode_0.h b/src/cg_construction_mode_0.h @@ -54,7 +54,8 @@ struct data_cad_cmode_0 { struct scad_geometry* roof; struct scad_geometry* floor; struct scad_geometry* cavity; - struct scad_geometry* boundary; + struct scad_geometry* fake_ground; + struct scad_geometry** boundary; struct scad_geometry** connection; struct scad_geometry* ground_connection; size_t n_connection;