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 }
|