solstice

Compute collected power and efficiencies of a solar plant
git clone git://git.meso-star.com/solstice.git
Log | Files | Refs | README | LICENSE

commit 07eb25f6f5431ef072610cd589284db05a81a7eb
parent 4496b673300ab4e5504e6ec302bc855b8c900832
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Fri, 18 Nov 2016 11:53:16 +0100

Implement several getters

Diffstat:
Msrc/solstice_entity.h | 2++
Msrc/solstice_geometry.h | 3++-
Msrc/solstice_parser.c | 125+++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------
Msrc/solstice_parser.h | 37++++++++++++++++++++++++++++++++++++-
Msrc/test_solstice_parser2.c | 50+++++++++++++++++++++++++++++++++++++++++++++++++-
5 files changed, 180 insertions(+), 37 deletions(-)

diff --git a/src/solstice_entity.h b/src/solstice_entity.h @@ -50,6 +50,8 @@ struct solstice_entity { struct str name; struct solstice_geometry_id geometry; + + /* Internal data. Should not be acceded directly. */ struct htable_str2sols str2children; struct darray_child children; /* List of children nodes */ }; diff --git a/src/solstice_geometry.h b/src/solstice_geometry.h @@ -24,8 +24,8 @@ struct solstice_object { struct solstice_material_double_sided_id mtl2; struct solstice_shape_id shape; - double translation[3]; double rotation[3]; + double translation[3]; }; struct solstice_object_id { size_t i; }; @@ -35,6 +35,7 @@ struct solstice_object_id { size_t i; }; #include <rsys/dynamic_array.h> struct solstice_geometry { + /* Internal data. Should not be acceded directly. */ struct darray_object_id objects; }; diff --git a/src/solstice_parser.c b/src/solstice_parser.c @@ -155,9 +155,10 @@ struct solstice_parser { struct darray_sphere spheres; struct darray_impgeom stls; - /* Objects */ - struct htable_yaml2sols yaml2objs; /* Cache of objects */ + /* Geometries & objects */ + struct htable_yaml2sols yaml2geoms; /* Cache of geometries */ struct darray_object objects; + struct darray_geometry geometries; /* Sun. Note that only one sun is supported */ const yaml_node_t* sun_key; /* yaml_node_t ptr used to spawn the sun */ @@ -169,7 +170,6 @@ struct solstice_parser { struct darray_entity entities; /* Miscellaneous */ - struct darray_geometry geometries; ref_T ref; struct mem_allocator* allocator; @@ -249,9 +249,10 @@ parser_clear(struct solstice_parser* parser) darray_sphere_clear(&parser->spheres); darray_impgeom_clear(&parser->stls); - /* Objects */ - htable_yaml2sols_clear(&parser->yaml2objs); + /* Geometries */ + htable_yaml2sols_clear(&parser->yaml2geoms); darray_object_clear(&parser->objects); + darray_geometry_clear(&parser->geometries); /* Sun */ solstice_sun_clear(&parser->sun); @@ -261,9 +262,6 @@ parser_clear(struct solstice_parser* parser) htable_yaml2sols_clear(&parser->yaml2entities); htable_str2sols_clear(&parser->str2entities); darray_entity_clear(&parser->entities); - - /* Miscellaneous */ - darray_geometry_clear(&parser->geometries); } static void @@ -294,9 +292,10 @@ parser_release(ref_T* ref) darray_sphere_release(&parser->spheres); darray_impgeom_release(&parser->stls); - /* Objects */ - htable_yaml2sols_release(&parser->yaml2objs); + /* Geometries */ + htable_yaml2sols_release(&parser->yaml2geoms); darray_object_release(&parser->objects); + darray_geometry_release(&parser->geometries); /* Sun */ solstice_sun_release(&parser->sun); @@ -306,9 +305,6 @@ parser_release(ref_T* ref) htable_str2sols_release(&parser->str2entities); darray_entity_release(&parser->entities); - /* Instance */ - darray_geometry_release(&parser->geometries); - MEM_RM(parser->allocator, parser); } @@ -1723,7 +1719,6 @@ parse_object enum { MATERIAL, SHAPE, TRANSFORM }; struct solstice_object* obj = NULL; struct solstice_shape* shape = NULL; - size_t* piobj; size_t iobj = SIZE_MAX; size_t ishape = SIZE_MAX; intptr_t i, n; @@ -1731,14 +1726,6 @@ parse_object res_T res = RES_OK; ASSERT(doc && object && out_iobj); - /* Check whether or not the YAML descriptor alias an already created Solstice - * object */ - piobj = htable_yaml2sols_find(&parser->yaml2objs, &object); - if(piobj) { - obj = darray_object_data_get(&parser->objects) + *piobj; - goto exit; - } - if(object->type != YAML_MAPPING_NODE) { log_err(parser, object, "expect an object definition.\n"); res = RES_BAD_ARG; @@ -1851,13 +1838,6 @@ parse_object CHECK_PARAM(SHAPE, "shape"); #undef CHECK_PARAM - /* Cache the object */ - res = htable_yaml2sols_set(&parser->yaml2objs, &object, &iobj); - if(res != RES_OK) { - log_err(parser, object, "could not register the object.\n"); - goto error; - } - exit: out_iobj->i = iobj; return res; @@ -1878,6 +1858,7 @@ parse_geometry struct solstice_geometry_id* out_isolgeom) { struct solstice_geometry* solgeom = NULL; + size_t* pisolgeom; size_t isolgeom = SIZE_MAX; intptr_t i, n; res_T res = RES_OK; @@ -1889,6 +1870,14 @@ parse_geometry goto error; } + /* Check whether or not the YAML descriptor alias an already created Solstice + * geometry */ + pisolgeom = htable_yaml2sols_find(&parser->yaml2geoms, &geometry); + if(pisolgeom) { + isolgeom = *pisolgeom; + goto exit; + } + /* Allocate the geometry */ isolgeom = darray_geometry_size_get(&parser->geometries); res = darray_geometry_resize(&parser->geometries, isolgeom + 1); @@ -1915,6 +1904,13 @@ parse_geometry if(res != RES_OK) goto error; } + /* Cache the geometry */ + res = htable_yaml2sols_set(&parser->yaml2geoms, &geometry, &isolgeom); + if(res != RES_OK) { + log_err(parser, geometry, "could not register the geometry.\n"); + goto error; + } + exit: out_isolgeom->i = isolgeom; return res; @@ -2623,9 +2619,10 @@ solstice_parser_create darray_sphere_init(mem_allocator, &parser->spheres); darray_impgeom_init(mem_allocator, &parser->stls); - /* Objects */ - htable_yaml2sols_init(mem_allocator, &parser->yaml2objs); + /* Geometries */ + htable_yaml2sols_init(mem_allocator, &parser->yaml2geoms); darray_object_init(mem_allocator, &parser->objects); + darray_geometry_init(mem_allocator, &parser->geometries); solstice_sun_init(mem_allocator, &parser->sun); @@ -2634,9 +2631,6 @@ solstice_parser_create htable_str2sols_init(mem_allocator, &parser->str2entities); darray_entity_init(mem_allocator, &parser->entities); - /* Miscellaneous */ - darray_geometry_init(mem_allocator, &parser->geometries); - exit: *out_parser = parser; return res; @@ -2781,6 +2775,69 @@ solstice_parser_get_geometry return darray_geometry_cdata_get(&parser->geometries) + geom.i; } +const struct solstice_material* +solstice_parser_get_material + (const struct solstice_parser* parser, + const struct solstice_material_id mtl) +{ + ASSERT(parser && mtl.i < darray_material_size_get(&parser->mtls)); + return darray_material_cdata_get(&parser->mtls) + mtl.i; +} + +const struct solstice_material_double_sided* +solstice_parser_get_material_double_sided + (const struct solstice_parser* parser, + const struct solstice_material_double_sided_id mtl2) +{ + ASSERT(parser && mtl2.i < darray_material2_size_get(&parser->mtls2)); + return darray_material2_cdata_get(&parser->mtls2) + mtl2.i; +} + +const struct solstice_material_matte* +solstice_parser_get_material_matte + (const struct solstice_parser* parser, + const struct solstice_material_matte_id matte) +{ + ASSERT(parser && matte.i < darray_matte_size_get(&parser->mattes)); + return darray_matte_cdata_get(&parser->mattes) + matte.i; +} + +const struct solstice_material_mirror* +solstice_parser_get_material_mirror + (const struct solstice_parser* parser, + const struct solstice_material_mirror_id mirror) +{ + ASSERT(parser && mirror.i < darray_mirror_size_get(&parser->mirrors)); + return darray_mirror_cdata_get(&parser->mirrors) + mirror.i; +} + +const struct solstice_object* +solstice_parser_get_object + (const struct solstice_parser* parser, + const struct solstice_object_id obj) +{ + ASSERT(parser && obj.i < darray_object_size_get(&parser->objects)); + return darray_object_cdata_get(&parser->objects) + obj.i; +} + +const struct solstice_shape* +solstice_parser_get_shape + (const struct solstice_parser* parser, + const struct solstice_shape_id shape) +{ + ASSERT(parser && shape.i < darray_shape_size_get(&parser->shapes)); + return darray_shape_cdata_get(&parser->shapes) + shape.i; +} + +const struct solstice_shape_sphere* +solstice_parser_get_shape_sphere + (const struct solstice_parser* parser, + const struct solstice_shape_sphere_id sphere) +{ + ASSERT(parser && sphere.i < darray_sphere_size_get(&parser->spheres)); + return darray_sphere_cdata_get(&parser->spheres) + sphere.i; +} + void solstice_parser_entity_iterator_begin (struct solstice_parser* parser, diff --git a/src/solstice_parser.h b/src/solstice_parser.h @@ -58,11 +58,46 @@ solstice_parser_get_entity (const struct solstice_parser* parser, const struct solstice_entity_id entity); -extern LOCAL_SYM const struct solstice_geometry* +extern LOCAL_SYM const struct solstice_geometry* solstice_parser_get_geometry (const struct solstice_parser* parser, const struct solstice_geometry_id geom); +extern LOCAL_SYM const struct solstice_material* +solstice_parser_get_material + (const struct solstice_parser* parser, + const struct solstice_material_id mtl); + +extern LOCAL_SYM const struct solstice_material_double_sided* +solstice_parser_get_material_double_sided + (const struct solstice_parser* parser, + const struct solstice_material_double_sided_id mtl2); + +extern LOCAL_SYM const struct solstice_material_matte* +solstice_parser_get_material_matte + (const struct solstice_parser* parser, + const struct solstice_material_matte_id matte); + +extern LOCAL_SYM const struct solstice_material_mirror* +solstice_parser_get_material_mirror + (const struct solstice_parser* parser, + const struct solstice_material_mirror_id mirror); + +extern LOCAL_SYM const struct solstice_object* +solstice_parser_get_object + (const struct solstice_parser* parser, + const struct solstice_object_id obj); + +extern LOCAL_SYM const struct solstice_shape* +solstice_parser_get_shape + (const struct solstice_parser* parser, + const struct solstice_shape_id shape); + +extern LOCAL_SYM const struct solstice_shape_sphere* +solstice_parser_get_shape_sphere + (const struct solstice_parser* parser, + const struct solstice_shape_sphere_id sphere); + extern LOCAL_SYM void solstice_parser_entity_iterator_begin (struct solstice_parser* parser, diff --git a/src/test_solstice_parser2.c b/src/test_solstice_parser2.c @@ -23,8 +23,17 @@ main(int argc, char** argv) struct solstice_parser* parser; struct solstice_entity_iterator it, end; struct solstice_entity_id entity_id; + struct solstice_object_id obj_id; + struct solstice_geometry_id geom_id; const struct solstice_entity* entity, *entity1, *entity2; const struct solstice_geometry* geom; + const struct solstice_object* obj; + const struct solstice_shape* shape; + const struct solstice_material_double_sided* mtl2; + const struct solstice_material* mtl; + const struct solstice_material_matte* matte; + const struct solstice_material_mirror* mirror; + const struct solstice_shape_sphere* sphere; double tmp[3]; FILE* stream; @@ -48,7 +57,8 @@ main(int argc, char** argv) fprintf(stream, " - name: lvl1a\n"); fprintf(stream, " geometry: \n"); fprintf(stream, " - sphere: {radius: 2}\n"); - fprintf(stream, " material: { matte: {reflectivity: 0.5}}\n"); + fprintf(stream, " material:\n"); + fprintf(stream, " mirror: { reflectivity: 0.9, roughness: 0.1 }\n"); fprintf(stream, " - name: lvl1b\n"); fprintf(stream, " geometry: *sphere\n"); fprintf(stream, " transform: { rotation: [3.14, 0, -1] }\n"); @@ -74,7 +84,23 @@ main(int argc, char** argv) CHECK(d3_eq(entity->rotation, d3(tmp, 4, 5, 6)), 1); CHECK(strcmp("lvl0", str_cget(&entity->name)), 0); CHECK(solstice_entity_get_children_count(entity), 2); + geom_id = entity->geometry; geom = solstice_parser_get_geometry(parser, entity->geometry); + CHECK(solstice_geometry_get_objects_count(geom), 1); + obj_id = solstice_geometry_get_object(geom, 0); + obj = solstice_parser_get_object(parser, obj_id); + CHECK(d3_eq(obj->rotation, d3_splat(tmp, 0)), 1); + CHECK(d3_eq(obj->translation, d3_splat(tmp, 0)), 1); + shape = solstice_parser_get_shape(parser, obj->shape); + CHECK(shape->type, SOLSTICE_SHAPE_SPHERE); + sphere = solstice_parser_get_shape_sphere(parser, shape->data.sphere); + CHECK(sphere->radius, 1); + mtl2 = solstice_parser_get_material_double_sided(parser, obj->mtl2); + CHECK(mtl2->front.i, mtl2->back.i); + mtl = solstice_parser_get_material(parser, mtl2->front); + CHECK(mtl->type, SOLSTICE_MATERIAL_MATTE); + matte = solstice_parser_get_material_matte(parser, mtl->data.matte); + CHECK(matte->reflectivity, 1); entity_id = solstice_entity_get_child(entity, 0); entity1 = solstice_parser_get_entity(parser, entity_id); @@ -82,6 +108,24 @@ main(int argc, char** argv) CHECK(d3_eq(entity1->rotation, d3_splat(tmp, 0)), 1); CHECK(strcmp("lvl1a", str_cget(&entity1->name)), 0); CHECK(solstice_entity_get_children_count(entity1), 0); + NCHECK(entity1->geometry.i, geom_id.i); + geom = solstice_parser_get_geometry(parser, entity1->geometry); + CHECK(solstice_geometry_get_objects_count(geom), 1); + obj_id = solstice_geometry_get_object(geom, 0); + obj = solstice_parser_get_object(parser, obj_id); + CHECK(d3_eq(obj->rotation, d3_splat(tmp, 0)), 1); + CHECK(d3_eq(obj->translation, d3_splat(tmp, 0)), 1); + shape = solstice_parser_get_shape(parser, obj->shape); + CHECK(shape->type, SOLSTICE_SHAPE_SPHERE); + sphere = solstice_parser_get_shape_sphere(parser, shape->data.sphere); + CHECK(sphere->radius, 2); + mtl2 = solstice_parser_get_material_double_sided(parser, obj->mtl2); + CHECK(mtl2->front.i, mtl2->back.i); + mtl = solstice_parser_get_material(parser, mtl2->front); + CHECK(mtl->type, SOLSTICE_MATERIAL_MIRROR); + mirror = solstice_parser_get_material_mirror(parser, mtl->data.mirror); + CHECK(mirror->reflectivity, 0.9); + CHECK(mirror->roughness, 0.1); entity_id = solstice_entity_get_child(entity, 1); entity1 = solstice_parser_get_entity(parser, entity_id); @@ -89,6 +133,7 @@ main(int argc, char** argv) CHECK(d3_eq(entity1->rotation, d3(tmp, 3.14, 0, -1)), 1); CHECK(strcmp("lvl1b", str_cget(&entity1->name)), 0); CHECK(solstice_entity_get_children_count(entity1), 1); + CHECK(entity1->geometry.i, geom_id.i); entity_id = solstice_entity_get_child(entity1, 0); entity2 = solstice_parser_get_entity(parser, entity_id); @@ -96,10 +141,13 @@ main(int argc, char** argv) CHECK(d3_eq(entity2->rotation, d3_splat(tmp, 0)), 1); CHECK(strcmp("lvl2", str_cget(&entity2->name)), 0); CHECK(solstice_entity_get_children_count(entity2), 0); + CHECK(entity2->geometry.i, geom_id.i); CHECK(solstice_parser_load(parser), RES_BAD_OP); solstice_parser_ref_put(parser); + fclose(stream); + check_memory_allocator(&allocator); mem_shutdown_proxy_allocator(&allocator); CHECK(mem_allocated_size(), 0);