struct cmesh_vattrib {
int nelem; /* num elements per attribute [1, 4] */
float *data;
- unsigned int count;
+ unsigned int count; /* number of floats in data */
unsigned int vbo;
int vbo_valid, data_valid;
};
char *name;
unsigned int nverts, nfaces;
- struct submesh *sublist;
+ struct submesh *sublist, *subtail;
int subcount;
/* current value for each attribute for the immediate mode interface */
nelem = cmsrc->vattr[i].nelem;
cmdest->vattr[i].nelem = nelem;
cmdest->vattr[i].data = varr[i];
- cmdest->vattr[i].count = vcount;
+ cmdest->vattr[i].count = vcount * nelem;
vptr = cmsrc->vattr[i].data + vstart * nelem;
memcpy(cmdest->vattr[i].data, vptr, vcount * nelem * sizeof(float));
cmdest->vattr[i].data_valid = 1;
}
cmdest->sublist = head;
+ cmdest->subtail = tail;
cmdest->subcount = cmsrc->subcount;
}
assert(cmdest->vattr[i].nelem == cmsrc->vattr[i].nelem);
nelem = cmdest->vattr[i].nelem;
origsz = cmdest->nverts * nelem;
- newsz = cmdest->nverts + cmsrc->nverts * nelem;
+ newsz = (cmdest->nverts + cmsrc->nverts) * nelem;
if(!(vptr = realloc(cmdest->vattr[i].data, newsz * sizeof *vptr))) {
return -1;
}
}
+ cmdest->nverts += cmsrc->nverts;
+ cmdest->nfaces += cmsrc->nfaces;
+
cmdest->wire_ibo_valid = 0;
cmdest->aabb_valid = 0;
cmdest->bsph_valid = 0;
free(sm);
}
cm->subcount = 0;
+ cm->subtail = 0;
}
int cmesh_submesh(struct cmesh *cm, const char *name, int fstart, int fcount)
sm->vcount = fcount * 3;
}
- sm->next = cm->sublist;
- cm->sublist = sm;
+ sm->next = 0;
+ if(cm->sublist) {
+ cm->subtail->next = sm;
+ cm->subtail = sm;
+ } else {
+ cm->sublist = cm->subtail = sm;
+ }
cm->subcount++;
return 0;
}
free(sm->name);
free(sm);
+ if(cm->subtail == sm) {
+ cm->subtail = prev;
+ }
+
cm->subcount--;
assert(cm->subcount >= 0);
- cm->sublist = dummy.next;
+ if(!dummy.next) {
+ cm->sublist = cm->subtail = 0;
+ } else {
+ cm->sublist = dummy.next;
+ }
return 0;
}
cgm_vec3 n, t;
float *vptr;
+ if(!dir_xform) {
+ dir_xform = xform;
+ }
+
for(i=0; i<cm->nverts; i++) {
if(!(vptr = get_vec4(cm, CMESH_ATTR_VERTEX, i, &v))) {
return;
static const char *fmtstr[] = {" %u", " %u//%u", " %u/%u", " %u/%u/%u"};
int i, j, num, nelem;
unsigned int aflags = 0;
+ const struct submesh *sub = cm->sublist;
if(!cmesh_has_attrib(cm, CMESH_ATTR_VERTEX)) {
return -1;
assert(numidx % 3 == 0);
for(i=0; i<numtri; i++) {
+ if(sub && sub->istart <= *idxptr) {
+ fprintf(fp, "o %s\n", sub->name);
+ sub = sub->next;
+ }
+
fputc('f', fp);
for(j=0; j<3; j++) {
unsigned int idx = *idxptr++ + 1 + voffs;
int numtri = cm->nverts / 3;
unsigned int idx = 1 + voffs;
for(i=0; i<numtri; i++) {
+ if(sub && sub->vstart == idx - 1) {
+ fprintf(fp, "o %s\n", sub->name);
+ sub = sub->next;
+ }
+
fputc('f', fp);
for(j=0; j<3; j++) {
fprintf(fp, fmtstr[aflags], idx, idx, idx);