+
+ if(!(tile = malloc(sizeof *tile))) {
+ fprintf(stderr, "load_tileset: failed to allocate tile\n");
+ continue;
+ }
+ tile->type = type;
+
+ cgm_midentity(xform);
+ if((vec = ts_get_attr_vec(node, "pos", 0))) {
+ cgm_mtranslation(xform, vec[0], vec[1], vec[2]);
+ }
+
+ init_meshgroup(&tile->mgrp);
+
+ mesh = tset->scn.meshlist;
+ while(mesh) {
+ if(match_prefix(mesh->name, str)) {
+ if(vec) {
+ xform_mesh(mesh, xform);
+ }
+ add_meshgroup_mesh(&tile->mgrp, mesh);
+ }
+ mesh = mesh->next;
+ }
+ }
+ }
+
+ return 0;
+}
+
+void destroy_tileset(struct tileset *tset)
+{
+ struct tile *tile;
+
+ free(tset->name);
+ free(tset->fname);
+
+ while(tset->tiles) {
+ tile = tset->tiles;
+ tset->tiles = tile->next;
+
+ free(tile->name);
+ free(tile);
+ }
+
+ destroy_scenefile(&tset->scn);
+}
+
+struct tileset *get_tileset(const char *fname)
+{
+ struct tileset *ts = tset_list;
+ while(ts) {
+ if(strcmp(ts->fname, fname) == 0) {
+ return ts;