summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsanine <sanine.not@pm.me>2023-02-06 21:46:34 -0600
committersanine <sanine.not@pm.me>2023-02-06 21:46:34 -0600
commitf547164540f4ac7f8436fef8e981b1fef503f08c (patch)
treeca576ef1221e4f4234de31b8e702b3c205e42eb9
parentd00d1029f9e2e9f55217ad3d21e5b826601ba210 (diff)
add kai_read_geometry and fix kai_read_source error handling
-rw-r--r--include/kalmia.h8
-rw-r--r--src/geometry/geometry.c69
-rw-r--r--src/geometry/geometry.h3
-rw-r--r--src/geometry/geometry.test.c58
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()