From f547164540f4ac7f8436fef8e981b1fef503f08c Mon Sep 17 00:00:00 2001 From: sanine Date: Mon, 6 Feb 2023 21:46:34 -0600 Subject: add kai_read_geometry and fix kai_read_source error handling --- src/geometry/geometry.c | 69 +++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 61 insertions(+), 8 deletions(-) (limited to 'src/geometry/geometry.c') 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); +} -- cgit v1.2.1