X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Fmesh.c;h=1811bb6112e89480c05d6adda595395cb699bcf3;hb=refs%2Fheads%2Fmaster;hp=149fbe7a78565ea9bb490a38a54a889a87b1f29b;hpb=f3d32774e0c196175d8143c21313097bcc8ff3a2;p=vrlugburz diff --git a/src/mesh.c b/src/mesh.c index 149fbe7..1811bb6 100644 --- a/src/mesh.c +++ b/src/mesh.c @@ -3,9 +3,7 @@ #include #include #include -#define GL_GLEXT_PROTOTYPES 1 -#include -#include +#include "opengl.h" #include "mesh.h" static int update_mesh_vbo(struct mesh *m); @@ -18,6 +16,7 @@ void init_mesh(struct mesh *m) void destroy_mesh(struct mesh *m) { + free(m->name); free(m->varr); free(m->iarr); @@ -31,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; @@ -41,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); @@ -276,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; @@ -311,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; jnum_idx; j++) { + *iptr++ = m->iarr[j] + idx0; + } + idx0 += m->num_idx; } } @@ -335,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; inum_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); + } +}