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:
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);