char *sep;
struct rbtree *rbtree = 0;
+ memset(scn, 0, sizeof *scn);
varr_size = varr_max = narr_size = narr_max = tarr_size = tarr_max = 0;
varr = narr = 0;
if(!(rbtree = rb_create(cmp_facevert))) {
fprintf(stderr, "load_scenefile: failed to create facevertex search tree\n");
- fclose(fp);
- return -1;
+ goto fail;
}
rb_set_delete_func(rbtree, free_rbnode_key, 0);
path_prefix = alloca(strlen(buf) + 1);
strcpy(path_prefix, buf);
+ if(sep) {
+ sep = (char*)fname + (sep - buf);
+ }
+ if(!(scn->fname = strdup(sep ? sep + 1 : fname))) {
+ fprintf(stderr, "failed to allocate scenefile name buffer\n");
+ goto fail;
+ }
+
if(!(mesh = malloc(sizeof *mesh))) {
fprintf(stderr, "failed to allocate mesh\n");
fclose(fp);
goto fail;
}
init_mesh(mesh);
+ mesh->name = strdup(cleanline(line + 2));
}
break;
}
mesh = 0;
- printf("load_scenefile: loaded %d meshes, %d vertices\n", scn->num_meshes,
- varr_size);
+ printf("load_scenefile %s: loaded %d meshes, %d vertices\n", scn->fname,
+ scn->num_meshes, varr_size);
res = 0;
+ if(0) {
fail:
+ free(scn->fname);
+ }
+
fclose(fp);
free(mesh);
free(varr);
FILE *fp;
char buf[256], *line;
struct objmtl om;
- struct material *mtl;
+ struct material *mtl = 0;
if(path_prefix && *path_prefix) {
sprintf(buf, "%s/%s", path_prefix, mtlfname);
if(memcmp(line, "newmtl", 6) == 0) {
if(mtl) {
+ conv_mtl(mtl, &om, path_prefix);
mtl->next = scn->mtllist;
scn->mtllist = mtl;
}
- if((mtl = calloc(1, sizeof *mtl))) {
- if((line = cleanline(line + 6))) {
- mtl->name = strdup(line);
- }
+ mtl = calloc(1, sizeof *mtl);
+
+ memset(&om, 0, sizeof om);
+
+ if((line = cleanline(line + 6))) {
+ om.name = strdup(line);
}
+
} else if(memcmp(line, "Kd", 2) == 0) {
sscanf(line + 3, "%f %f %f", &om.kd.x, &om.kd.y, &om.kd.z);
} else if(memcmp(line, "Ks", 2) == 0) {
om.map_alpha = strdup(line);
}
}
- conv_mtl(mtl, &om, path_prefix);
}
if(mtl) {
+ conv_mtl(mtl, &om, path_prefix);
mtl->next = scn->mtllist;
scn->mtllist = mtl;
}
int len, prefix_len, maxlen = 0;
memset(mm, 0, sizeof *mm);
- mm->name = strdup(om->name);
+ mm->name = om->name;
mm->color = om->kd;
mm->spec = om->ks;
mm->shininess = om->shin;