diff options
Diffstat (limited to 'src/geometry/geometry.c')
-rw-r--r-- | src/geometry/geometry.c | 159 |
1 files changed, 49 insertions, 110 deletions
diff --git a/src/geometry/geometry.c b/src/geometry/geometry.c index 7d2e6c2..54be1c7 100644 --- a/src/geometry/geometry.c +++ b/src/geometry/geometry.c @@ -97,26 +97,17 @@ int kai_read_accessor(struct ka_accessor_t *dest, struct kai_tag_t *src) dest->source = source; dest->stride = kai_tag_attr_to_long(src, "stride", 1); - dest->param_count = kai_tag_num_children(src); - dest->param = kai_alloc( - dest->param_count * sizeof(struct ka_param_t), - "accessor tag param array" + int result; + KAI_FILL_ARRAY_FROM_TAGS( + result, + dest->param, dest->param_count, struct ka_param_t, + src, "param", + kai_read_param, kai_release_param ); - if (dest->param == NULL) { + if (result != 0) { free(source); return -1; } - struct kai_tag_t *t = src->children; - int i; - for (i=0; i<dest->param_count; i++) { - int result = kai_read_param(dest->param + i, t); - if (result != 0) { - free(dest->param); - free(dest->source); - return -1; - } - t = t->next; - } return 0; } @@ -246,31 +237,19 @@ int kai_read_vertices(struct ka_vertices_t *dest, struct kai_tag_t *src) dest->id = id; dest->name = kai_tag_attr_to_dup(src, "name"); - /* count input children */ - int count = 0; - struct kai_tag_t *child; - FOR_CHILD_OF_TYPE(src, child, "input") { - count += 1; - } + int result; + KAI_FILL_ARRAY_FROM_TAGS( + result, + dest->input, dest->input_count, struct ka_input_t, + src, "input", + kai_read_input_unshared, kai_release_input + ); - dest->input_count = count; - dest->input = malloc(count * sizeof(struct ka_input_t)); - if (dest->input == NULL) { + if (result != 0) { kai_release_vertices(*dest); return -1; } - int i=0; - FOR_CHILD_OF_TYPE(src, child, "input") { - int result = kai_read_input_unshared(dest->input + i, child); - if (result != 0) { - dest->input_count = i; - kai_release_vertices(*dest); - return -1; - } - i += 1; - } - return 0; } @@ -307,31 +286,19 @@ int kai_read_triangles(struct ka_triangles_t *dest, struct kai_tag_t *src) dest->p = NULL; /* load the child inputs into the structure */ - int input_count = 0; - struct kai_tag_t *child; - FOR_CHILD_OF_TYPE(src, child, "input") { - input_count += 1; - } + int result; + KAI_FILL_ARRAY_FROM_TAGS( + result, + dest->input, dest->input_count, struct ka_input_t, + src, "input", + kai_read_input_shared, kai_release_input + ); - dest->input = kai_alloc(input_count * sizeof(struct ka_input_t), "triangles input array"); - if (dest->input == NULL) { + if (result != 0) { kai_release_triangles(*dest); return -1; } - int i=0; - FOR_CHILD_OF_TYPE(src, child, "input") { - int result = kai_read_input_shared(dest->input + i, child); - if (result != 0) { - dest->input_count = i; - kai_release_triangles(*dest); - return -1; - } - i += 1; - } - dest->input_count = input_count; - - /* load the child p tag */ struct kai_tag_t *p = kai_tag_get_first_child_with_type(src, "p"); if (p != NULL) { @@ -381,46 +348,31 @@ int kai_read_mesh(struct ka_mesh_t *dest, struct kai_tag_t *src) if (result != 0) { return -1; } /* load sources */ - unsigned int source_count = 0; - FOR_CHILD_OF_TYPE(src, child, "source") { source_count += 1; } - - dest->source = kai_alloc(source_count * sizeof(struct ka_source_t), "mesh source array"); - if (dest->source == NULL) { return -1; } - - int i = 0; - FOR_CHILD_OF_TYPE(src, child, "source") { - result = kai_read_source(dest->source + i, child); - if (result != 0) { - dest->source_count = i; - kai_release_mesh(*dest); - return -1; - } - i += 1; + KAI_FILL_ARRAY_FROM_TAGS( + result, + dest->source, dest->source_count, struct ka_source_t, + src, "source", + kai_read_source, kai_release_source + ); + + if (result != 0) { + kai_release_mesh(*dest); + return -1; } - dest->source_count = source_count; /* load triangles */ - unsigned int triangles_count = 0; - FOR_CHILD_OF_TYPE(src, child, "triangles") { triangles_count += 1; } + KAI_FILL_ARRAY_FROM_TAGS( + result, + dest->triangles, dest->triangles_count, struct ka_triangles_t, + src, "triangles", + kai_read_triangles, kai_release_triangles + ); - dest->triangles = kai_alloc(triangles_count * sizeof(struct ka_triangles_t), "mesh triangles array"); - if (dest->triangles == NULL) { + if (result != 0) { kai_release_mesh(*dest); return -1; } - i = 0; - FOR_CHILD_OF_TYPE(src, child, "triangles") { - result = kai_read_triangles(dest->triangles + i, child); - if (result != 0) { - dest->triangles_count = i; - kai_release_mesh(*dest); - return -1; - } - i += 1; - } - dest->triangles_count = triangles_count; - return 0; } @@ -479,31 +431,18 @@ int kai_read_library_geometries(struct ka_library_geometries_t *dest, struct kai dest->id = kai_tag_attr_to_dup(src, "id"); dest->name = kai_tag_attr_to_dup(src, "name"); - struct kai_tag_t *child; - unsigned int geometry_count = 0; - FOR_CHILD_OF_TYPE(src, child, "geometry") { geometry_count += 1; } - - dest->geometry = kai_alloc( - geometry_count * sizeof(struct ka_geometry_t), - "library_geometries geometry array" + int result; + KAI_FILL_ARRAY_FROM_TAGS( + result, + dest->geometry, dest->geometry_count, struct ka_geometry_t, + src, "geometry", + kai_read_geometry, kai_release_geometry ); - if (dest->geometry == NULL) { - free(dest->id); - free(dest->name); - return -1; - } - int i=0; - FOR_CHILD_OF_TYPE(src, child, "geometry") { - int result = kai_read_geometry(dest->geometry + i, child); - if (result != 0) { - dest->geometry_count = i; - kai_release_library_geometries(*dest); - return -1; - } - i += 1; + if (result != 0) { + kai_release_library_geometries(*dest); + return -1; } - dest->geometry_count = geometry_count; return 0; } |