commit b37b226deae42166df3e611f7ce791763a076346
parent aa873c3330a3282a67008c9d13b57c78b4558b5e
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Tue, 22 Nov 2016 11:53:28 +0100
Add and test the iterator on parsed materials
Diffstat:
3 files changed, 85 insertions(+), 2 deletions(-)
diff --git a/src/parser/solstice_parser.c b/src/parser/solstice_parser.c
@@ -3011,3 +3011,21 @@ solstice_parser_entity_iterator_end
htable_str2sols_end(&parser->str2entities, &it->it__);
}
+void
+solstice_parser_material_iterator_begin
+ (struct solstice_parser* parser, struct solstice_material_iterator* it)
+{
+ ASSERT(parser && it);
+ it->mtls__ = darray_material_cdata_get(&parser->mtls);
+ it->imtl__ = 0;
+}
+
+void
+solstice_parser_material_iterator_end
+ (struct solstice_parser* parser, struct solstice_material_iterator* it)
+{
+ ASSERT(parser && it);
+ it->mtls__ = darray_material_cdata_get(&parser->mtls);
+ it->imtl__ = darray_material_size_get(&parser->mtls);
+}
+
diff --git a/src/parser/solstice_parser.h b/src/parser/solstice_parser.h
@@ -26,6 +26,12 @@ struct solstice_entity_iterator {
struct htable_str2sols_iterator it__; /* Internal data */
};
+struct solstice_material_iterator {
+ /* Internal data */
+ const struct solstice_material* mtls__;
+ size_t imtl__;
+};
+
/*******************************************************************************
* Solstice parser API.
******************************************************************************/
@@ -143,6 +149,9 @@ extern LOCAL_SYM const struct solstice_sun*
solstice_parser_get_sun
(const struct solstice_parser* parser);
+/*******************************************************************************
+ * Entity interator
+ ******************************************************************************/
extern LOCAL_SYM void
solstice_parser_entity_iterator_begin
(struct solstice_parser* parser,
@@ -162,8 +171,8 @@ solstice_entity_iterator_next(struct solstice_entity_iterator* it)
static FINLINE int
solstice_entity_iterator_eq
- (struct solstice_entity_iterator* a,
- struct solstice_entity_iterator* b)
+ (const struct solstice_entity_iterator* a,
+ const struct solstice_entity_iterator* b)
{
ASSERT(a && b);
return htable_str2sols_iterator_eq(&a->it__, &b->it__);
@@ -176,5 +185,43 @@ solstice_entity_iterator_get(struct solstice_entity_iterator* it)
return *htable_str2sols_iterator_data_get(&it->it__);
}
+/*******************************************************************************
+ * Material iterator
+ ******************************************************************************/
+extern LOCAL_SYM void
+solstice_parser_material_iterator_begin
+ (struct solstice_parser* parser,
+ struct solstice_material_iterator* it);
+
+extern LOCAL_SYM void
+solstice_parser_material_iterator_end
+ (struct solstice_parser* parser,
+ struct solstice_material_iterator* it);
+
+static FINLINE void
+solstice_material_iterator_next(struct solstice_material_iterator* it)
+{
+ ASSERT(it);
+ ++it->imtl__;
+}
+
+static FINLINE int
+solstice_material_iterator_eq
+ (const struct solstice_material_iterator* a,
+ const struct solstice_material_iterator* b)
+{
+ ASSERT(a && b);
+ return a->mtls__ == b->mtls__ && a->imtl__ == b->imtl__;
+}
+
+static FINLINE struct solstice_material_id
+solstice_material_iterator_get(struct solstice_material_iterator* it)
+{
+ struct solstice_material_id id;
+ ASSERT(it);
+ id.i = it->imtl__;
+ return id;
+}
+
#endif /* SOLSTICE_PARSER_H */
diff --git a/src/parser/test_solstice_parser2.c b/src/parser/test_solstice_parser2.c
@@ -23,9 +23,11 @@ main(int argc, char** argv)
struct mem_allocator allocator;
struct solstice_parser* parser;
struct solstice_entity_iterator 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_material* mtls[2] = { NULL, NULL };
const struct solstice_entity* entity, *entity1a, *entity1b, *entity2, *entity3;
const struct solstice_geometry* geom;
const struct solstice_object* obj;
@@ -36,6 +38,7 @@ main(int argc, char** argv)
const struct solstice_material_mirror* mirror;
const struct solstice_shape_sphere* sphere;
const struct solstice_sun* sun;
+ size_t nmtls = 0;
double tmp[3];
FILE* stream;
@@ -74,6 +77,19 @@ main(int argc, char** argv)
CHECK(solstice_parser_setup(parser, NULL, stream), RES_OK);
CHECK(solstice_parser_load(parser), RES_OK);
+ solstice_parser_material_iterator_begin(parser, &mtl_it);
+ solstice_parser_material_iterator_end(parser, &mtl_it_end);
+ nmtls = 0;
+ while(!solstice_material_iterator_eq(&mtl_it, &mtl_it_end)) {
+ struct solstice_material_id mtl_id;
+ CHECK(nmtls < 2, 1);
+ mtl_id = solstice_material_iterator_get(&mtl_it);
+ solstice_material_iterator_next(&mtl_it);
+ mtls[nmtls] = solstice_parser_get_material(parser, mtl_id);
+ ++nmtls;
+ }
+ CHECK(nmtls == 2, 1);
+
solstice_parser_entity_iterator_begin(parser, &it);
solstice_parser_entity_iterator_end(parser, &end);
CHECK(solstice_entity_iterator_eq(&it, &end), 0);
@@ -102,6 +118,7 @@ main(int argc, char** argv)
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 == mtls[0] || mtl == mtls[1], 1);
CHECK(mtl->type, SOLSTICE_MATERIAL_MATTE);
matte = solstice_parser_get_material_matte(parser, mtl->data.matte);
CHECK(matte->reflectivity, 1);
@@ -126,6 +143,7 @@ main(int argc, char** argv)
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 == mtls[0] || mtl == mtls[1], 1);
CHECK(mtl->type, SOLSTICE_MATERIAL_MIRROR);
mirror = solstice_parser_get_material_mirror(parser, mtl->data.mirror);
CHECK(mirror->reflectivity, 0.9);