diff options
author | sanine <sanine.not@pm.me> | 2023-02-06 21:46:34 -0600 |
---|---|---|
committer | sanine <sanine.not@pm.me> | 2023-02-06 21:46:34 -0600 |
commit | f547164540f4ac7f8436fef8e981b1fef503f08c (patch) | |
tree | ca576ef1221e4f4234de31b8e702b3c205e42eb9 | |
parent | d00d1029f9e2e9f55217ad3d21e5b826601ba210 (diff) |
add kai_read_geometry and fix kai_read_source error handling
-rw-r--r-- | include/kalmia.h | 8 | ||||
-rw-r--r-- | src/geometry/geometry.c | 69 | ||||
-rw-r--r-- | src/geometry/geometry.h | 3 | ||||
-rw-r--r-- | src/geometry/geometry.test.c | 58 |
4 files changed, 130 insertions, 8 deletions
diff --git a/include/kalmia.h b/include/kalmia.h index 70ca11d..a09ab9d 100644 --- a/include/kalmia.h +++ b/include/kalmia.h @@ -143,4 +143,12 @@ struct ka_mesh_t { }; +struct ka_geometry_t { + char *id; + char *name; + + struct ka_mesh_t mesh; +}; + + #endif diff --git a/src/geometry/geometry.c b/src/geometry/geometry.c index 72af92c..25b899b 100644 --- a/src/geometry/geometry.c +++ b/src/geometry/geometry.c @@ -143,14 +143,36 @@ int kai_read_source(struct ka_source_t *dest, struct kai_tag_t *src) dest->name = kai_tag_attr_to_dup(src, "name"); struct kai_tag_t *child; - for (child = src->children; child != NULL; child = child->next) { - if (strcmp(child->type, "float_array") == 0) { - kai_read_float_array(&(dest->float_array), child); - } - else if (strcmp(child->type, "technique_common") == 0) { - kai_read_accessor(&(dest->accessor), child->children); - } - /* ignore others */ + int result; + + child = kai_tag_get_first_child_with_type(src, "float_array"); + result = kai_read_float_array(&(dest->float_array), child); + if (result != 0) { + free(dest->id); + free(dest->name); + return -1; + } + + child = kai_tag_get_first_child_with_type(src, "technique_common"); + if (child == NULL) { + free(dest->id); + free(dest->name); + kai_release_float_array(dest->float_array); + return -1; + } + child = kai_tag_get_first_child_with_type(child, "accessor"); + if (child == NULL) { + free(dest->id); + free(dest->name); + kai_release_float_array(dest->float_array); + return -1; + } + result = kai_read_accessor(&(dest->accessor), child); + if (result != 0) { + free(dest->id); + free(dest->name); + kai_release_float_array(dest->float_array); + return -1; } return 0; @@ -417,3 +439,34 @@ void kai_release_mesh(struct ka_mesh_t m) } free(m.triangles); } + + +int kai_read_geometry(struct ka_geometry_t *dest, struct kai_tag_t *src) +{ + CHECK_TAG_TYPE("geometry"); + + dest->id = kai_tag_attr_to_dup(src, "id"); + dest->name = kai_tag_attr_to_dup(src, "name"); + + struct kai_tag_t *mesh = kai_tag_get_first_child_with_type(src, "mesh"); + if (mesh == NULL) { + free(dest->id); + free(dest->name); + return -1; + } + int result = kai_read_mesh(&(dest->mesh), mesh); + if (result != 0) { + free(dest->id); + free(dest->name); + return -1; + } + + return 0; +} + +void kai_release_geometry(struct ka_geometry_t g) +{ + free(g.id); + free(g.name); + kai_release_mesh(g.mesh); +} diff --git a/src/geometry/geometry.h b/src/geometry/geometry.h index a46af87..c00704f 100644 --- a/src/geometry/geometry.h +++ b/src/geometry/geometry.h @@ -29,4 +29,7 @@ void kai_release_triangles(struct ka_triangles_t t); int kai_read_mesh(struct ka_mesh_t *dest, struct kai_tag_t *src); void kai_release_mesh(struct ka_mesh_t m); +int kai_read_geometry(struct ka_geometry_t *dest, struct kai_tag_t *src); +void kai_release_geometry(struct ka_geometry_t m); + #endif diff --git a/src/geometry/geometry.test.c b/src/geometry/geometry.test.c index 17be188..60d6698 100644 --- a/src/geometry/geometry.test.c +++ b/src/geometry/geometry.test.c @@ -538,6 +538,64 @@ LILY_TEST("read mesh tag") #include LILY_PUSH_TEST() +LILY_TEST("fail to read non-geometry tag") +{ + struct kai_tag_t *t = kai_parse_string( + "<tag />" + ); + + struct ka_geometry_t geometry; + int result = kai_read_geometry(&geometry, t); + CHECK_EQ(result, -1, "%d"); + + kai_tag_destroy(t); +} +#include LILY_PUSH_TEST() + + +LILY_TEST("read geometry tag") +{ + struct kai_tag_t *t = kai_parse_string( + "<geometry id=\"xxx\">" + " <mesh>" + " <source id=\"source\">" + " <float_array count=\"1\">0.0</float_array>" + " <technique_common>" + " <accessor count=\"1\" source=\"xxx\">" + " <param type=\"float\" />" + " </accessor>" + " </technique_common>" + " </source>" + " <vertices id=\"box-Vtx\">" + " <input semantic=\"POSITION\" source=\"#box-Pos\"/>" + " </vertices>" + " <triangles count=\"2\" material=\"Bricks\">" + " <input semantic=\"VERTEX\" source=\"#verts\" offset=\"0\"/>" + " <input semantic=\"NORMAL\" source=\"#normal\" offset=\"1\"/>" + " <p>" + " 0 0 1 3 2 1" + " 0 0 2 1 3 2" + " </p>" + " </triangles>" + " </mesh>" + "</geometry>" + ); + + struct ka_geometry_t geometry; + int result = kai_read_geometry(&geometry, t); + kai_tag_destroy(t); + + REQUIRE_EQ(result, 0, "%d"); + + CHECK_EQS(geometry.id, "xxx"); + CHECK_EQ(geometry.mesh.source_count, 1, "%d"); + CHECK_EQ(geometry.mesh.triangles_count, 1, "%d"); + + kai_release_geometry(geometry); +} +#include LILY_PUSH_TEST() + + #define LILY_FILE_END #include LILY_REGISTER_TESTS() |