commit ac865761ffd7007d8ac75386dc4a3ac46d1213fc
parent b37b226deae42166df3e611f7ce791763a076346
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Tue, 22 Nov 2016 12:09:19 +0100
Add and test the iterator on parsed geometries
Diffstat:
3 files changed, 82 insertions(+), 3 deletions(-)
diff --git a/src/parser/solstice_parser.c b/src/parser/solstice_parser.c
@@ -2986,7 +2986,7 @@ solstice_parser_get_shape_stl
return darray_impgeom_cdata_get(&parser->stls) + impgeom.i;
}
-const struct solstice_sun*
+const struct solstice_sun*
solstice_parser_get_sun(const struct solstice_parser* parser)
{
ASSERT(parser && parser->sun_key);
@@ -3027,5 +3027,23 @@ solstice_parser_material_iterator_end
ASSERT(parser && it);
it->mtls__ = darray_material_cdata_get(&parser->mtls);
it->imtl__ = darray_material_size_get(&parser->mtls);
-}
+}
+
+void
+solstice_parser_geometry_iterator_begin
+ (struct solstice_parser* parser, struct solstice_geometry_iterator* it)
+{
+ ASSERT(parser && it);
+ it->geoms__ = darray_geometry_cdata_get(&parser->geometries);
+ it->igeom__ = 0;
+}
+
+void
+solstice_parser_geometry_iterator_end
+ (struct solstice_parser* parser, struct solstice_geometry_iterator* it)
+{
+ ASSERT(parser && it);
+ it->geoms__ = darray_geometry_cdata_get(&parser->geometries);
+ it->igeom__ = darray_geometry_size_get(&parser->geometries);
+}
diff --git a/src/parser/solstice_parser.h b/src/parser/solstice_parser.h
@@ -32,6 +32,12 @@ struct solstice_material_iterator {
size_t imtl__;
};
+struct solstice_geometry_iterator {
+ /* Internal data */
+ const struct solstice_geometry* geoms__;
+ size_t igeom__;
+};
+
/*******************************************************************************
* Solstice parser API.
******************************************************************************/
@@ -223,5 +229,43 @@ solstice_material_iterator_get(struct solstice_material_iterator* it)
return id;
}
+/*******************************************************************************
+ * Geometry iterator
+ ******************************************************************************/
+extern LOCAL_SYM void
+solstice_parser_geometry_iterator_begin
+ (struct solstice_parser* parser,
+ struct solstice_geometry_iterator* it);
+
+extern LOCAL_SYM void
+solstice_parser_geometry_iterator_end
+ (struct solstice_parser* parser,
+ struct solstice_geometry_iterator* it);
+
+static FINLINE void
+solstice_geometry_iterator_next(struct solstice_geometry_iterator* it)
+{
+ ASSERT(it);
+ ++it->igeom__;
+}
+
+static FINLINE int
+solstice_geometry_iterator_eq
+ (const struct solstice_geometry_iterator* a,
+ const struct solstice_geometry_iterator* b)
+{
+ ASSERT(a && b);
+ return a->geoms__ == b->geoms__ && a->igeom__ == b->igeom__;
+}
+
+static FINLINE struct solstice_geometry_id
+solstice_geometry_iterator_get(struct solstice_geometry_iterator* it)
+{
+ struct solstice_geometry_id id;
+ ASSERT(it);
+ id.i = it->igeom__;
+ return id;
+}
+
#endif /* SOLSTICE_PARSER_H */
diff --git a/src/parser/test_solstice_parser2.c b/src/parser/test_solstice_parser2.c
@@ -23,10 +23,12 @@ main(int argc, char** argv)
struct mem_allocator allocator;
struct solstice_parser* parser;
struct solstice_entity_iterator it, end;
+ struct solstice_geometry_iterator geom_it, geom_it_end;
struct solstice_material_iterator mtl_it, mtl_it_end;
struct solstice_entity_id entity_id;
struct solstice_object_id obj_id;
struct solstice_geometry_id geom_id;
+ const struct solstice_geometry* geoms[2] = { NULL, NULL };
const struct solstice_material* mtls[2] = { NULL, NULL };
const struct solstice_entity* entity, *entity1a, *entity1b, *entity2, *entity3;
const struct solstice_geometry* geom;
@@ -39,6 +41,7 @@ main(int argc, char** argv)
const struct solstice_shape_sphere* sphere;
const struct solstice_sun* sun;
size_t nmtls = 0;
+ size_t ngeoms = 0;
double tmp[3];
FILE* stream;
@@ -77,6 +80,18 @@ main(int argc, char** argv)
CHECK(solstice_parser_setup(parser, NULL, stream), RES_OK);
CHECK(solstice_parser_load(parser), RES_OK);
+ solstice_parser_geometry_iterator_begin(parser, &geom_it);
+ solstice_parser_geometry_iterator_end(parser, &geom_it_end);
+ ngeoms = 0;
+ while(!solstice_geometry_iterator_eq(&geom_it, &geom_it_end)) {
+ CHECK(ngeoms < 2, 1);
+ geom_id = solstice_geometry_iterator_get(&geom_it);
+ solstice_geometry_iterator_next(&geom_it);
+ geoms[ngeoms] = solstice_parser_get_geometry(parser, geom_id);
+ ++ngeoms;
+ }
+ CHECK(ngeoms, 2);
+
solstice_parser_material_iterator_begin(parser, &mtl_it);
solstice_parser_material_iterator_end(parser, &mtl_it_end);
nmtls = 0;
@@ -88,7 +103,7 @@ main(int argc, char** argv)
mtls[nmtls] = solstice_parser_get_material(parser, mtl_id);
++nmtls;
}
- CHECK(nmtls == 2, 1);
+ CHECK(nmtls, 2);
solstice_parser_entity_iterator_begin(parser, &it);
solstice_parser_entity_iterator_end(parser, &end);
@@ -106,6 +121,7 @@ main(int argc, char** argv)
CHECK(solstice_entity_get_children_count(entity), 2);
geom_id = entity->geometry;
geom = solstice_parser_get_geometry(parser, entity->geometry);
+ CHECK(geom == geoms[0] || geom == geoms[1], 1);
CHECK(solstice_geometry_get_objects_count(geom), 1);
obj_id = solstice_geometry_get_object(geom, 0);
obj = solstice_parser_get_object(parser, obj_id);
@@ -131,6 +147,7 @@ main(int argc, char** argv)
CHECK(solstice_entity_get_children_count(entity1a), 0);
NCHECK(entity1a->geometry.i, geom_id.i);
geom = solstice_parser_get_geometry(parser, entity1a->geometry);
+ CHECK(geom == geoms[0] || geom == geoms[1], 1);
CHECK(solstice_geometry_get_objects_count(geom), 1);
obj_id = solstice_geometry_get_object(geom, 0);
obj = solstice_parser_get_object(parser, obj_id);