void destroy_mesh(struct mesh *m)
{
+ free(m->name);
free(m->varr);
free(m->iarr);
void clear_mesh(struct mesh *m)
{
+ free(m->name);
free(m->varr);
free(m->iarr);
+ m->name = 0;
m->varr = 0;
m->iarr = 0;
m->num_verts = m->max_verts = m->num_idx = m->max_idx = 0;
m->bbvalid = m->vbovalid = 0;
}
+int copy_mesh(struct mesh *dest, struct mesh *src)
+{
+ init_mesh(dest);
+
+ if(src->name) {
+ dest->name = strdup(src->name);
+ }
+
+ if(src->max_verts && !(dest->varr = malloc(src->max_verts * sizeof *dest->varr))) {
+ return -1;
+ }
+ if(src->max_idx && !(dest->iarr = malloc(src->max_idx * sizeof *dest->iarr))) {
+ free(dest->varr);
+ dest->varr = 0;
+ return -1;
+ }
+
+ dest->num_verts = src->num_verts;
+ dest->max_verts = src->max_verts;
+ if(dest->varr) {
+ memcpy(dest->varr, src->varr, src->num_verts * sizeof *dest->varr);
+ }
+
+ dest->num_idx = src->num_idx;
+ dest->max_idx = src->max_idx;
+ if(dest->iarr) {
+ memcpy(dest->iarr, src->iarr, src->num_idx * sizeof *dest->iarr);
+ }
+
+ return 0;
+}
+
void init_meshgroup(struct meshgroup *mg)
{
memset(mg, 0, sizeof *mg);
static int update_meshgroup_vbo(struct meshgroup *mg)
{
- int i;
+ int i, j, idx0 = 0;
struct vertex *varr, *vptr;
unsigned int *iarr = 0, *iptr;
struct mesh *m;
vptr += m->num_verts;
if(iarr) {
- memcpy(iptr, m->iarr, m->num_idx * sizeof *iptr);
- iptr += m->num_idx;
+ for(j=0; j<m->num_idx; j++) {
+ *iptr++ = m->iarr[j] + idx0;
+ }
+ idx0 += m->num_idx;
}
}
free(iarr);
return 0;
}
+
+void xform_mesh(struct mesh *mesh, float *mat)
+{
+ int i;
+
+ mesh->vbovalid = 0;
+ mesh->bbvalid = 0;
+
+ for(i=0; i<mesh->num_verts; i++) {
+ cgm_vmul_m4v3(&mesh->varr[i].pos, mat);
+ cgm_vmul_m3v3(&mesh->varr[i].norm, mat);
+ cgm_vmul_m3v3(&mesh->varr[i].tang, mat);
+ }
+}