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 /src/geometry/geometry.c | |
parent | d00d1029f9e2e9f55217ad3d21e5b826601ba210 (diff) |
add kai_read_geometry and fix kai_read_source error handling
Diffstat (limited to 'src/geometry/geometry.c')
-rw-r--r-- | src/geometry/geometry.c | 69 |
1 files changed, 61 insertions, 8 deletions
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); +} |