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 58956b86b55b42de5e7e72c48beb79a4234c0b58
parent 5ac8360cb5b2f222ac5223599560dffce88a5ae0
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date:   Fri, 13 Jan 2023 11:43:51 +0100

Improve star-cad geometries lifetime management

Diffstat:
Msrc/cg_city.c | 6++++--
Msrc/cg_city_parsing.c | 12++++++++----
Msrc/cg_city_parsing_schemas.h | 3+++
Msrc/cg_constructive_mode_0.c | 5+++++
Msrc/cg_constructive_mode_1.c | 144+++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------
Msrc/cg_ground.c | 20++++++++++++++------
Msrc/cg_ground.h | 9++++++---
Msrc/cg_main.c | 4++--
8 files changed, 138 insertions(+), 65 deletions(-)

diff --git a/src/cg_city.c b/src/cg_city.c @@ -160,6 +160,7 @@ city_cad_build(struct city* city) ERR(scad_initialize(city->logger, city->allocator, city->verbosisty_level)); scad_initialized = 1; options.Mesh.MeshSizeFromPoints = 0; + options.Misc.LogOpenCascadeTagsRefCounting = Scad_log_only_undeleted; ERR(scad_set_options(&options)); /* iterate on buildings */ @@ -192,12 +193,13 @@ city_ground_build(struct city* city) struct ground ground = GROUND_NULL__; size_t i; - ERR(ground_allocate(city->allocator, city->buildings_count, &ground)); + ERR(ground_init(city->allocator, city->logger, city->buildings_count, &ground)); /* Initialize star-cad */ ERR(scad_initialize(city->logger, city->allocator, city->verbosisty_level)); scad_initialized = 1; options.Mesh.MeshSizeFromPoints = 0; + options.Misc.LogOpenCascadeTagsRefCounting = Scad_log_only_undeleted; ERR(scad_set_options(&options)); /* iterate on buildings */ @@ -214,7 +216,7 @@ city_ground_build(struct city* city) ERR(ground_export_stl(&ground, city->binary_export)); exit: - ground_release(city->allocator, &ground); + ground_clear(city->allocator, &ground); if(scad_initialized) CHK(RES_OK == scad_finalize()); return res; error: diff --git a/src/cg_city_parsing.c b/src/cg_city_parsing.c @@ -32,7 +32,7 @@ res_T parse_city - (const char* name, + (const char* filename, struct mem_allocator* allocator, struct logger* logger, const struct cyaml_config* config, @@ -42,19 +42,22 @@ parse_city struct parsed_city *parsed = NULL; cyaml_err_t err; - ASSERT(allocator && logger && name && config && out_parsed); + ASSERT(allocator && logger && filename && config && out_parsed); - err = cyaml_load_file(name, config, &city_schema, (void**)&parsed, NULL); + err = cyaml_load_file(filename, config, &city_schema, (void**)&parsed, NULL); ERR(cyaml_err_to_res_T(err)); parsed->allocator = allocator; parsed->logger = logger; + str_init(allocator, &parsed->filename); + ERR(str_set(&parsed->filename, filename)); exit: *out_parsed = parsed; return res; error: - logger_print(logger, LOG_ERROR, "Error parsing city map file '%s'.\n", name); + logger_print(logger, LOG_ERROR, + "Error parsing city map file '%s'.\n", filename); release_parsed_city(config, parsed); parsed = NULL; goto exit; @@ -71,6 +74,7 @@ release_parsed_city ASSERT(config); + str_release(&parsed->filename); err = cyaml_free(config, &city_schema, parsed, 1); CHK(RES_OK == cyaml_err_to_res_T(err)); } diff --git a/src/cg_city_parsing_schemas.h b/src/cg_city_parsing_schemas.h @@ -22,6 +22,8 @@ #include "cg_constructive_modes_parsing_schemas.h" +#include <rsys/str.h> + #include <cyaml/cyaml.h> struct mem_allocator; @@ -51,6 +53,7 @@ struct parsed_city { struct logger* logger; struct parsed_city_building* city_building_list; struct parsed_ground ground; + struct str filename; unsigned city_building_list_count; }; diff --git a/src/cg_constructive_mode_0.c b/src/cg_constructive_mode_0.c @@ -621,6 +621,11 @@ release_cad_cmode_0 } 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)); for(i = 0; i < data_cad->n_connection; i++) { SCAD(geometry_delete(data_cad->connection[i])); } diff --git a/src/cg_constructive_mode_1.c b/src/cg_constructive_mode_1.c @@ -896,29 +896,38 @@ build_boundary /* Ensure enough room for all geometries without error nor mem move */ ERR(darray_geometries_reserve(&array, 14)); - darray_geometries_push_back(&array, &data_cad->wall); - darray_geometries_push_back(&array, &data_cad->roof); - darray_geometries_push_back(&array, &data_cad->floor); - darray_geometries_push_back(&array, &data_cad->habitable_cavity); - darray_geometries_push_back(&array, &data_cad->fake_ground); - if (data_cad->foundation) - darray_geometries_push_back(&array, &data_cad->foundation); - if (data_cad->intermediate_floor) - darray_geometries_push_back(&array, &data_cad->intermediate_floor); - if (data_cad->external_insulation) - darray_geometries_push_back(&array, &data_cad->external_insulation); - if (data_cad->internal_insulation) - darray_geometries_push_back(&array, &data_cad->internal_insulation); - if (data_cad->roof_insulation) - darray_geometries_push_back(&array, &data_cad->roof_insulation); - if (data_cad->floor_insulation) - darray_geometries_push_back(&array, &data_cad->floor_insulation); - if (data_cad->attic_cavity) - darray_geometries_push_back(&array, &data_cad->attic_cavity); - if (data_cad->crawlspace_cavity) - darray_geometries_push_back(&array, &data_cad->crawlspace_cavity); - if (data_cad->glass) - darray_geometries_push_back(&array, &data_cad->glass); + ERR(darray_geometries_push_back(&array, &data_cad->wall)); + ERR(darray_geometries_push_back(&array, &data_cad->roof)); + ERR(darray_geometries_push_back(&array, &data_cad->floor)); + ERR(darray_geometries_push_back(&array, &data_cad->habitable_cavity)); + ERR(darray_geometries_push_back(&array, &data_cad->fake_ground)); + if (data_cad->foundation) { + ERR(darray_geometries_push_back(&array, &data_cad->foundation)); + } + if (data_cad->intermediate_floor) { + ERR(darray_geometries_push_back(&array, &data_cad->intermediate_floor)); + } + if (data_cad->external_insulation) { + ERR(darray_geometries_push_back(&array, &data_cad->external_insulation)); + } + if (data_cad->internal_insulation) { + ERR(darray_geometries_push_back(&array, &data_cad->internal_insulation)); + } + if (data_cad->roof_insulation) { + ERR(darray_geometries_push_back(&array, &data_cad->roof_insulation)); + } + if (data_cad->floor_insulation) { + ERR(darray_geometries_push_back(&array, &data_cad->floor_insulation)); + } + if (data_cad->attic_cavity) { + ERR(darray_geometries_push_back(&array, &data_cad->attic_cavity)); + } + if (data_cad->crawlspace_cavity) { + ERR(darray_geometries_push_back(&array, &data_cad->crawlspace_cavity)); + } + if (data_cad->glass) { + ERR(darray_geometries_push_back(&array, &data_cad->glass)); + } count = darray_geometries_size_get(&array); list = darray_geometries_data_get(&array); @@ -931,14 +940,14 @@ build_boundary boundaryname = str_get(&name); ERR(scad_geometries_common_boundaries(boundaryname, list, count, &data_cad->wall, 1, &bound)); - darray_geometries_push_back(boundary, &bound); + ERR(darray_geometries_push_back(boundary, &bound)); 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, &bound)); - darray_geometries_push_back(boundary, &bound); + ERR(darray_geometries_push_back(boundary, &bound)); if (data_cad->glass) { ERR(str_set(&name, prefix)); @@ -946,7 +955,7 @@ build_boundary boundaryname = str_get(&name); ERR(scad_geometries_common_boundaries(boundaryname, list, count, &data_cad->glass, 1, &bound)); - darray_geometries_push_back(boundary, &bound); + ERR(darray_geometries_push_back(boundary, &bound)); } if (data_cad->external_insulation) { @@ -955,7 +964,7 @@ build_boundary boundaryname = str_get(&name); ERR(scad_geometries_common_boundaries(boundaryname, list, count, &data_cad->external_insulation, 1, &bound)); - darray_geometries_push_back(boundary, &bound); + ERR(darray_geometries_push_back(boundary, &bound)); } if (data_cad->internal_insulation) { @@ -966,7 +975,11 @@ build_boundary ERR(scad_geometries_common_boundaries(boundaryname, list, count, &data_cad->internal_insulation, 1, &bound)); ERR(scad_geometry_get_count(bound, &bcount)); - if (bcount>0) darray_geometries_push_back(boundary, &bound); + if (bcount > 0) { + ERR(darray_geometries_push_back(boundary, &bound)); + } else { + SCAD(geometry_delete(bound)); + } } exit: @@ -999,14 +1012,14 @@ build_connection #define CREATE_CONNECT(G1,G2,SUFFIX) ERR(str_set(&name, prefix));\ ERR(str_append(&name, SUFFIX));\ cname = str_get(&name);\ - ERR(scad_geometries_common_boundaries\ - (cname,\ - &data_cad->G1, 1,\ - &data_cad->G2, 1,\ - &connect));\ + ERR(scad_geometries_common_boundaries(cname, &data_cad->G1, 1,\ + &data_cad->G2, 1, &connect));\ ERR(scad_geometry_get_count(connect, &count)); \ - if (count>0) { ERR(darray_geometries_push_back(connection, &connect)); } - + if (count > 0) { \ + ERR(darray_geometries_push_back(connection, &connect)); \ + } else { \ + SCAD(geometry_delete(connect)); \ + } /* -------------------------------------------------------------------------*/ /* habitable cavity connections */ @@ -1124,11 +1137,18 @@ build_fake_ground /* Ensure enough room for all geometries without error nor mem move */ ERR(darray_geometries_reserve(&array, 4)); - if (cad->foundation) darray_geometries_push_back(&array, &cad->foundation); - if (cad->crawlspace_cavity) darray_geometries_push_back(&array, &cad->crawlspace_cavity); - if (cad->floor) darray_geometries_push_back(&array, &cad->floor); - if (cad->floor_insulation) - darray_geometries_push_back(&array, &cad->floor_insulation); + if (cad->foundation) { + ERR(darray_geometries_push_back(&array, &cad->foundation)); + } + if (cad->crawlspace_cavity) { + ERR(darray_geometries_push_back(&array, &cad->crawlspace_cavity)); + } + if (cad->floor) { + ERR(darray_geometries_push_back(&array, &cad->floor)); + } + if (cad->floor_insulation) { + ERR(darray_geometries_push_back(&array, &cad->floor_insulation)); + } count = darray_geometries_size_get(&array); list = darray_geometries_data_get(&array); @@ -1182,14 +1202,27 @@ building_ground_connection /* Ensure enough room for all geometries without error nor mem move */ ERR(darray_geometries_reserve(&array, 6)); - if (cad->foundation) darray_geometries_push_back(&array, &cad->foundation); - if (cad->crawlspace_cavity) darray_geometries_push_back(&array, &cad->crawlspace_cavity); - if (cad->floor) darray_geometries_push_back(&array, &cad->floor); - if (cad->floor_insulation) - darray_geometries_push_back(&array, &cad->floor_insulation); - if (cad->external_insulation) - darray_geometries_push_back(&array, &cad->external_insulation); - if (cad->wall) darray_geometries_push_back(&array, &cad->wall); + if (cad->foundation) { + ERR(darray_geometries_push_back(&array, &cad->foundation)); + } + if (cad->crawlspace_cavity) { + ERR(darray_geometries_push_back(&array, &cad->crawlspace_cavity)); + } + if (cad->attic_cavity) { + ERR(darray_geometries_push_back(&array, &cad->attic_cavity)); + } + if (cad->floor) { + ERR(darray_geometries_push_back(&array, &cad->floor)); + } + if (cad->floor_insulation) { + ERR(darray_geometries_push_back(&array, &cad->floor_insulation)); + } + if (cad->external_insulation) { + ERR(darray_geometries_push_back(&array, &cad->external_insulation)); + } + if (cad->wall) { + ERR(darray_geometries_push_back(&array, &cad->wall)); + } count = darray_geometries_size_get(&array); list = darray_geometries_data_get(&array); @@ -1534,6 +1567,21 @@ release_cad_cmode_1 goto error; } + if(data_cad->attic_cavity) SCAD(geometry_delete(data_cad->attic_cavity)); + if(data_cad->crawlspace_cavity) SCAD(geometry_delete(data_cad->crawlspace_cavity)); + if(data_cad->external_insulation) SCAD(geometry_delete(data_cad->external_insulation)); + if(data_cad->fake_ground) SCAD(geometry_delete(data_cad->fake_ground)); + if(data_cad->floor) SCAD(geometry_delete(data_cad->floor)); + if(data_cad->floor_insulation) SCAD(geometry_delete(data_cad->floor_insulation)); + if(data_cad->foundation) SCAD(geometry_delete(data_cad->foundation)); + if(data_cad->glass) SCAD(geometry_delete(data_cad->glass)); + if(data_cad->ground_connection) SCAD(geometry_delete(data_cad->ground_connection)); + if(data_cad->habitable_cavity) SCAD(geometry_delete(data_cad->habitable_cavity)); + if(data_cad->intermediate_floor) SCAD(geometry_delete(data_cad->intermediate_floor)); + if(data_cad->internal_insulation) SCAD(geometry_delete(data_cad->internal_insulation)); + if(data_cad->roof) SCAD(geometry_delete(data_cad->roof)); + if(data_cad->roof_insulation) SCAD(geometry_delete(data_cad->roof_insulation)); + if(data_cad->wall) SCAD(geometry_delete(data_cad->wall)); for(i = 0; i < darray_geometries_size_get(&data_cad->boundary); i++) { struct scad_geometry* b = darray_geometries_data_get(&data_cad->boundary)[i]; ERR(scad_geometry_delete(b)); diff --git a/src/cg_ground.c b/src/cg_ground.c @@ -32,7 +32,6 @@ ground_build_cad res_T res = RES_OK; double origin[3]; double extent[3]; - struct scad_geometry* ground_box = NULL; struct scad_geometry* bound = NULL; if (!city || !ground) { @@ -53,8 +52,8 @@ ground_build_cad goto error; } - ERR(scad_add_box(NULL, origin, extent, &ground_box)); - ERR(scad_geometry_boundary(NULL, &ground_box, 1, &bound)); + ERR(scad_add_box(NULL, origin, extent, &ground->box)); + ERR(scad_geometry_boundary(NULL, &ground->box, 1, &bound)); ERR(scad_cut_geometries(NULL, &bound, 1, ground->footprints, ground->footprints_count, &ground->boundary)); @@ -80,16 +79,20 @@ error: } res_T -ground_allocate +ground_init (struct mem_allocator* allocator, + struct logger* logger, const size_t count, struct ground* ground) { res_T res = RES_OK; + (void)logger; + ground->box = NULL; + ground->boundary = NULL; ground->footprints_count = count; ground->footprints - = MEM_ALLOC(allocator, ground->footprints_count * sizeof(*ground->footprints)); + = MEM_CALLOC(allocator, ground->footprints_count, sizeof(*ground->footprints)); if(!ground->footprints) { res = RES_MEM_ERR; goto error; @@ -102,10 +105,15 @@ error: } void -ground_release +ground_clear (struct mem_allocator* allocator, struct ground* ground) { + size_t i; + SCAD(geometry_delete(ground->box)); SCAD(geometry_delete(ground->boundary)); + for(i = 0; i < ground->footprints_count; i++) { + SCAD(geometry_delete(ground->footprints[i])); + } MEM_RM(allocator, ground->footprints); } diff --git a/src/cg_ground.h b/src/cg_ground.h @@ -25,15 +25,17 @@ struct city; struct scad_geometry; struct mem_allocator; +struct logger; struct ground { /* cad representation */ + struct scad_geometry* box; struct scad_geometry* boundary; struct scad_geometry** footprints; /* list of building footprint */ size_t footprints_count; /* number of footprint */ }; -#define GROUND_NULL__ {NULL, NULL, 0} +#define GROUND_NULL__ {NULL, NULL, NULL, 0} static const struct ground GROUND_NULL = GROUND_NULL__; res_T @@ -45,13 +47,14 @@ res_T ground_export_stl(const struct ground* ground, const int binary); res_T -ground_allocate +ground_init (struct mem_allocator* allocator, + struct logger* logger, const size_t count, struct ground* ground); void -ground_release +ground_clear (struct mem_allocator* allocator, struct ground* ground); diff --git a/src/cg_main.c b/src/cg_main.c @@ -109,7 +109,7 @@ int main ERR(logger_init(&allocator, &logger)); logger_initialized = 1; - /* Active loggin for args parsing */ + /* Active logging for args parsing */ logger_set_stream(&logger, LOG_OUTPUT, log_prt_fn, NULL); logger_set_stream(&logger, LOG_WARNING, log_warn_fn, NULL); logger_set_stream(&logger, LOG_ERROR, log_err_fn, NULL); @@ -125,7 +125,7 @@ int main goto exit; } - /* Deactivate some loggin according to the -V arg */ + /* Deactivate some logging according to the -V arg */ if(args->verbosity_level < 1) logger_set_stream(&logger, LOG_ERROR, NULL, NULL); if(args->verbosity_level < 2)