nuclear@0: #include nuclear@0: #include nuclear@0: #include nuclear@0: #include nuclear@0: #include "mesh.h" nuclear@0: nuclear@0: int mattr_init(struct mesh_attrib *ma) nuclear@0: { nuclear@0: memset(ma, 0, sizeof *ma); nuclear@0: return 0; nuclear@0: } nuclear@0: nuclear@0: void mattr_destroy(struct mesh_attrib *ma) nuclear@0: { nuclear@0: if(ma) { nuclear@0: free(ma->name); nuclear@0: free(ma->data); nuclear@0: } nuclear@0: } nuclear@0: nuclear@0: int mattr_set_name(struct mesh_attrib *ma, const char *name) nuclear@0: { nuclear@0: char *tmp; nuclear@0: nuclear@0: if(!(tmp = malloc(strlen(name) + 1))) { nuclear@0: return -1; nuclear@0: } nuclear@0: strcpy(tmp, name); nuclear@0: nuclear@0: free(ma->name); nuclear@0: ma->name = tmp; nuclear@0: return 0; nuclear@0: } nuclear@0: nuclear@0: #define INITSZ (16 * ma->elem_size) nuclear@0: int mattr_add_elem(struct mesh_attrib *ma, void *data) nuclear@0: { nuclear@0: int nsz = (ma->count + 1) * ma->elem_size; nuclear@0: nuclear@0: if(nsz > ma->datasz) { nuclear@0: void *tmp; nuclear@0: nuclear@0: nsz = ma->datasz ? ma->datasz * 2 : INITSZ; nuclear@0: nuclear@0: if(!(tmp = realloc(ma->data, nsz))) { nuclear@0: return -1; nuclear@0: } nuclear@0: ma->data = tmp; nuclear@0: ma->datasz = nsz; nuclear@0: } nuclear@0: nuclear@0: memcpy((char*)ma->data + ma->elem_size * ma->count++, data, ma->elem_size); nuclear@0: return 0; nuclear@0: } nuclear@0: nuclear@0: /* -------- mesh -------- */ nuclear@0: nuclear@0: int mesh_init(struct mesh *m) nuclear@0: { nuclear@0: memset(m, 0, sizeof *m); nuclear@0: return 0; nuclear@0: } nuclear@0: nuclear@0: void mesh_destroy(struct mesh *m) nuclear@0: { nuclear@0: int i; nuclear@0: nuclear@0: free(m->name); nuclear@0: nuclear@0: for(i=0; inum_attr; i++) { nuclear@0: mattr_destroy(&m->attr[i]); nuclear@0: } nuclear@0: free(m->attr); nuclear@0: nuclear@0: for(i=0; inum_attr; i++) { nuclear@0: free(m->polyidx[i]); nuclear@0: } nuclear@0: free(m->polyidx); nuclear@0: } nuclear@0: nuclear@0: int mesh_set_name(struct mesh *m, const char *name) nuclear@0: { nuclear@0: char *tmp; nuclear@0: nuclear@0: if(!(tmp = malloc(strlen(name) + 1))) { nuclear@0: return -1; nuclear@0: } nuclear@0: strcpy(tmp, name); nuclear@0: nuclear@0: free(m->name); nuclear@0: m->name = tmp; nuclear@0: return 0; nuclear@0: } nuclear@0: nuclear@0: int mesh_add_attrib(struct mesh *m, struct mesh_attrib *attr) nuclear@0: { nuclear@0: void *tmp; nuclear@0: int idx = m->num_attr++; nuclear@0: nuclear@0: if(!(tmp = realloc(m->attr, m->num_attr * sizeof *attr))) { nuclear@0: return -1; nuclear@0: } nuclear@0: m->attr = tmp; nuclear@0: m->attr[idx] = *attr; nuclear@0: nuclear@0: if(!(tmp = realloc(m->polyidx, m->num_attr * sizeof *m->polyidx))) { nuclear@0: m->num_attr--; nuclear@0: return -1; nuclear@0: } nuclear@0: m->polyidx[idx] = 0; nuclear@0: nuclear@0: return 0; nuclear@0: } nuclear@0: nuclear@0: int mesh_find_attrib(struct mesh *m, const char *name) nuclear@0: { nuclear@0: int i; nuclear@0: nuclear@0: for(i=0; inum_attr; i++) { nuclear@0: if(strcmp(m->attr[i].name, name) == 0) { nuclear@0: return i; nuclear@0: } nuclear@0: } nuclear@0: return -1; nuclear@0: }