foo
[vrlugburz] / src / mesh.c
index 538f7c9..91f8fcf 100644 (file)
@@ -16,6 +16,7 @@ void init_mesh(struct mesh *m)
 
 void destroy_mesh(struct mesh *m)
 {
+       free(m->name);
        free(m->varr);
        free(m->iarr);
 
@@ -29,9 +30,11 @@ void destroy_mesh(struct mesh *m)
 
 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;
@@ -39,6 +42,38 @@ void clear_mesh(struct mesh *m)
        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);
@@ -274,7 +309,7 @@ static int update_mesh_vbo(struct mesh *m)
 
 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;
@@ -309,8 +344,10 @@ static int update_meshgroup_vbo(struct meshgroup *mg)
                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;
                }
        }
 
@@ -333,3 +370,17 @@ static int update_meshgroup_vbo(struct meshgroup *mg)
        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_v3m4(&mesh->varr[i].pos, mat);
+               cgm_vmul_v3m3(&mesh->varr[i].norm, mat);
+               cgm_vmul_v3m3(&mesh->varr[i].tang, mat);
+       }
+}