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 69757d03fa6ea40dd0fd419afb7506a57131406a
parent bdc6ea4e418cc394a990437e3d9ce4b7a8e31ba4
Author: Benjamin Piaud <benjamin.piaud@meso-star.com>
Date:   Thu,  6 Oct 2022 17:30:28 +0200

Restructuring city parsing and adding a functor to init building data

Diffstat:
Msrc/cg_building.h | 1+
Msrc/cg_building_model0.c | 31+++++++++++++++++++++++++++++++
Msrc/cg_building_model0.h | 3+++
Msrc/cg_city.c | 51+++++++++++++++------------------------------------
Msrc/cg_parsing.c | 66+++++++++++++++++++++++++++++++++++++++++++++++-------------------
Msrc/cg_parsing.h | 24++++++++++++++++--------
6 files changed, 113 insertions(+), 63 deletions(-)

diff --git a/src/cg_building.h b/src/cg_building.h @@ -44,6 +44,7 @@ struct building { void* data_cad; /* functors depending model */ + res_T (*init)(struct building* building); res_T (*build_cad)(struct building* building); res_T (*build_footprint) (struct building* building, diff --git a/src/cg_building_model0.c b/src/cg_building_model0.c @@ -23,6 +23,7 @@ #define ERR(Expr) if((res = (Expr)) != RES_OK) goto error; else (void)0 + static res_T build_floor_footprint (const struct pg_polygon* pg, @@ -411,6 +412,36 @@ error: goto exit; } +/*----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ +/*----------------------------------------------------------------------------*/ + +res_T +init_model0 + (struct building* building) +{ + res_T res = RES_OK; + struct data_model0 data; + + data.wall = 0.2; + data.floor = 0.3; + building->data = malloc(sizeof(struct data_model0)); + if (!building->data) { + res = RES_MEM_ERR; + goto error; + } + *(struct data_model0*)(building->data) = data; + building->build_cad = &build_cad_model0; + building->export_stl = &export_stl_model0; + building->release = &release_model0; + building->build_footprint = &build_footprint_model0; + +exit: + return res; +error: + goto exit; +} + res_T build_cad_model0(struct building* building) { diff --git a/src/cg_building_model0.h b/src/cg_building_model0.h @@ -41,6 +41,9 @@ struct data_cad_model0 { }; res_T +init_model0(struct building* building); + +res_T build_cad_model0(struct building* building); res_T diff --git a/src/cg_city.c b/src/cg_city.c @@ -30,49 +30,28 @@ res_T city_init(struct logger* logger, struct city* city, struct args* args) { res_T res = RES_OK; + size_t i=0; struct txtrdr* reader = NULL; - char* line = NULL; - struct building* building = NULL; - struct building b; - struct data_model0 data0; ERR(txtrdr_file(NULL, str_cget(&args->city_model_file), '#', &reader)); - - ERR(txtrdr_read_line(reader)); -parse: - while (txtrdr_get_line(reader)){ - line = txtrdr_get_line(reader); - ERR(strtolower(line, line)); - if (strcmp(line, "[building]") == 0) { - ERR(parse_building(logger, reader, &b)); - b.model = MODEL0; - b.data = malloc(sizeof(struct data_model0)); - data0.wall = 0.2; - data0.floor = 0.3; - *(struct data_model0*)(b.data) = data0; - b.build_cad = &build_cad_model0; - b.export_stl = &export_stl_model0; - b.release = &release_model0; - b.build_footprint = &build_footprint_model0; - sa_push(city->building, b); - goto parse; - } - if (strcmp(line, "[ground]") == 0) { - ERR(parse_ground(logger, reader, &city->ground)); - goto parse; - } - ERR(txtrdr_read_line(reader)); - } - - city->n = sa_size(city->building); + ERR(parse_city(logger, reader, city)); + + for (i=0; i<city->n ; ++i) { + switch(city->building[i].model) { + case MODEL0: + city->building[i].init = &init_model0; + break; + default: + res = RES_BAD_ARG; + goto error; + } + ERR(city->building[i].init(&city->building[i])); + } + exit: return res; - error: - if (building[0].pg) free(building[0].pg); - if (building[1].pg) free(building[1].pg); - if (building) free(building); goto exit; } diff --git a/src/cg_parsing.c b/src/cg_parsing.c @@ -18,6 +18,7 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include <rsys/cstr.h> +#include <rsys/stretchy_array.h> #include "cg_parsing.h" @@ -47,7 +48,7 @@ remove_spaces(char *string) return string; } -res_T +static res_T strtolower(const char * src, char* dst ) { res_T res = RES_OK; @@ -64,7 +65,7 @@ error: goto exit; } -res_T +static res_T parse_ground (struct logger* logger, struct txtrdr* reader, @@ -131,7 +132,7 @@ error: } -res_T +static res_T parse_building (struct logger* logger, struct txtrdr* reader, @@ -188,22 +189,49 @@ parse_building } check: -/* [>check depth<]*/ - /*if (ground->depth <= 0) {*/ - /*logger_print(logger, LOG_ERROR, */ - /*"[ground] depth value not valid: must be > 0.\n");*/ - /*res = RES_BAD_ARG;*/ - /*goto error;*/ - /*} */ - - /*[>check extent<]*/ - /*if (ground->extent[0] >= ground->extent[1]*/ - /*|| ground->extent[2] >= ground->extent[3]) {*/ - /*logger_print(logger, LOG_ERROR, */ - /*"[ground] extent value not valid: xmax must be > xmin and ymax must be > ymin.\n");*/ - /*res = RES_BAD_ARG;*/ - /*goto error;*/ -/* }*/ + +exit: + return res; +error: + goto exit; +} + + +res_T +parse_city + (struct logger* logger, + struct txtrdr* reader, + struct city* city) +{ + res_T res = RES_OK; + char* line = NULL; + struct building b; + + ERR(txtrdr_read_line(reader)); + +parse: + while (txtrdr_get_line(reader)){ + line = txtrdr_get_line(reader); + ERR(strtolower(line, line)); + if (strcmp(line, "[building]") == 0) { + ERR(parse_building(logger, reader, &b)); + b.model = MODEL0; + sa_push(city->building, b); + goto parse; + } + if (strcmp(line, "[ground]") == 0) { + ERR(parse_ground(logger, reader, &city->ground)); + goto parse; + } + if (strcmp(line, "[model]") == 0) { + /* TODO FINISH */ + b.model = MODEL0; + goto parse; + } + ERR(txtrdr_read_line(reader)); + } + + city->n = sa_size(city->building); exit: diff --git a/src/cg_parsing.h b/src/cg_parsing.h @@ -25,23 +25,31 @@ #include "cg_ground.h" #include "cg_building.h" +#include "cg_city.h" #ifndef PARSING_H #define PARSING_H -res_T strtolower(const char * src, char* dst ); +/*res_T strtolower(const char * src, char* dst ); */ -res_T -parse_ground - (struct logger* logger, - struct txtrdr* reader, - struct ground* ground); +/*res_T*/ +/*parse_ground*/ + /*(struct logger* logger,*/ + /*struct txtrdr* reader,*/ + /*struct ground* ground);*/ + +/*res_T*/ +/*parse_building*/ + /*(struct logger* logger,*/ + /*struct txtrdr* reader,*/ + /*struct building* building);*/ res_T -parse_building +parse_city (struct logger* logger, struct txtrdr* reader, - struct building* building); + struct city* city); + #endif /*PARSING_H*/