scenefile

annotate src/mesh.c @ 0:8c6d64af9505

scenefile
author John Tsiombikas <nuclear@mutantstargoat.com>
date Fri, 13 Jan 2012 09:34:16 +0200
parents
children 38489ad82bf4
rev   line source
nuclear@0 1 #include <stdio.h>
nuclear@0 2 #include <stdlib.h>
nuclear@0 3 #include <string.h>
nuclear@0 4 #include <errno.h>
nuclear@0 5 #include "mesh.h"
nuclear@0 6
nuclear@0 7 int mattr_init(struct mesh_attrib *ma)
nuclear@0 8 {
nuclear@0 9 memset(ma, 0, sizeof *ma);
nuclear@0 10 return 0;
nuclear@0 11 }
nuclear@0 12
nuclear@0 13 void mattr_destroy(struct mesh_attrib *ma)
nuclear@0 14 {
nuclear@0 15 if(ma) {
nuclear@0 16 free(ma->name);
nuclear@0 17 free(ma->data);
nuclear@0 18 }
nuclear@0 19 }
nuclear@0 20
nuclear@0 21 int mattr_set_name(struct mesh_attrib *ma, const char *name)
nuclear@0 22 {
nuclear@0 23 char *tmp;
nuclear@0 24
nuclear@0 25 if(!(tmp = malloc(strlen(name) + 1))) {
nuclear@0 26 return -1;
nuclear@0 27 }
nuclear@0 28 strcpy(tmp, name);
nuclear@0 29
nuclear@0 30 free(ma->name);
nuclear@0 31 ma->name = tmp;
nuclear@0 32 return 0;
nuclear@0 33 }
nuclear@0 34
nuclear@0 35 #define INITSZ (16 * ma->elem_size)
nuclear@0 36 int mattr_add_elem(struct mesh_attrib *ma, void *data)
nuclear@0 37 {
nuclear@0 38 int nsz = (ma->count + 1) * ma->elem_size;
nuclear@0 39
nuclear@0 40 if(nsz > ma->datasz) {
nuclear@0 41 void *tmp;
nuclear@0 42
nuclear@0 43 nsz = ma->datasz ? ma->datasz * 2 : INITSZ;
nuclear@0 44
nuclear@0 45 if(!(tmp = realloc(ma->data, nsz))) {
nuclear@0 46 return -1;
nuclear@0 47 }
nuclear@0 48 ma->data = tmp;
nuclear@0 49 ma->datasz = nsz;
nuclear@0 50 }
nuclear@0 51
nuclear@0 52 memcpy((char*)ma->data + ma->elem_size * ma->count++, data, ma->elem_size);
nuclear@0 53 return 0;
nuclear@0 54 }
nuclear@0 55
nuclear@0 56 /* -------- mesh -------- */
nuclear@0 57
nuclear@0 58 int mesh_init(struct mesh *m)
nuclear@0 59 {
nuclear@0 60 memset(m, 0, sizeof *m);
nuclear@0 61 return 0;
nuclear@0 62 }
nuclear@0 63
nuclear@0 64 void mesh_destroy(struct mesh *m)
nuclear@0 65 {
nuclear@0 66 int i;
nuclear@0 67
nuclear@0 68 free(m->name);
nuclear@0 69
nuclear@0 70 for(i=0; i<m->num_attr; i++) {
nuclear@0 71 mattr_destroy(&m->attr[i]);
nuclear@0 72 }
nuclear@0 73 free(m->attr);
nuclear@0 74
nuclear@0 75 for(i=0; i<m->num_attr; i++) {
nuclear@0 76 free(m->polyidx[i]);
nuclear@0 77 }
nuclear@0 78 free(m->polyidx);
nuclear@0 79 }
nuclear@0 80
nuclear@0 81 int mesh_set_name(struct mesh *m, const char *name)
nuclear@0 82 {
nuclear@0 83 char *tmp;
nuclear@0 84
nuclear@0 85 if(!(tmp = malloc(strlen(name) + 1))) {
nuclear@0 86 return -1;
nuclear@0 87 }
nuclear@0 88 strcpy(tmp, name);
nuclear@0 89
nuclear@0 90 free(m->name);
nuclear@0 91 m->name = tmp;
nuclear@0 92 return 0;
nuclear@0 93 }
nuclear@0 94
nuclear@0 95 int mesh_add_attrib(struct mesh *m, struct mesh_attrib *attr)
nuclear@0 96 {
nuclear@0 97 void *tmp;
nuclear@0 98 int idx = m->num_attr++;
nuclear@0 99
nuclear@0 100 if(!(tmp = realloc(m->attr, m->num_attr * sizeof *attr))) {
nuclear@0 101 return -1;
nuclear@0 102 }
nuclear@0 103 m->attr = tmp;
nuclear@0 104 m->attr[idx] = *attr;
nuclear@0 105
nuclear@0 106 if(!(tmp = realloc(m->polyidx, m->num_attr * sizeof *m->polyidx))) {
nuclear@0 107 m->num_attr--;
nuclear@0 108 return -1;
nuclear@0 109 }
nuclear@0 110 m->polyidx[idx] = 0;
nuclear@0 111
nuclear@0 112 return 0;
nuclear@0 113 }
nuclear@0 114
nuclear@0 115 int mesh_find_attrib(struct mesh *m, const char *name)
nuclear@0 116 {
nuclear@0 117 int i;
nuclear@0 118
nuclear@0 119 for(i=0; i<m->num_attr; i++) {
nuclear@0 120 if(strcmp(m->attr[i].name, name) == 0) {
nuclear@0 121 return i;
nuclear@0 122 }
nuclear@0 123 }
nuclear@0 124 return -1;
nuclear@0 125 }