--- ray/src/common/mesh.c 2016/03/22 03:56:17 2.27 +++ ray/src/common/mesh.c 2018/11/27 01:04:33 2.30 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: mesh.c,v 2.27 2016/03/22 03:56:17 greg Exp $"; +static const char RCSid[] = "$Id: mesh.c,v 2.30 2018/11/27 01:04:33 greg Exp $"; #endif /* * Mesh support routines @@ -52,6 +52,7 @@ static int cvcmp(const char *vv1, const char *vv2) /* compare encoded vertices */ { const MCVERT *v1 = (const MCVERT *)vv1, *v2 = (const MCVERT *)vv2; + if (v1->fl != v2->fl) return(1); if (v1->xyz[0] != v2->xyz[0]) @@ -327,12 +328,12 @@ getmeshtri( /* get triangle vertices */ int32 addmeshvert( /* find/add a mesh vertex */ - MESH *mp, + MESH *mp, MESHVERT *vp ) { - LUENT *lvp; - MCVERT cv; + LUENT *lvp; + MCVERT cv; int i; if (!(vp->fl & MT_V)) @@ -439,8 +440,8 @@ addmeshtri( /* add a new mesh triangle */ OBJECT mo ) { - int32 vid[3], t; - int pn[3], i; + int32 vid[3], t; + int pn[3], i; MESHPATCH *pp; if (!(tv[0].fl & tv[1].fl & tv[2].fl & MT_V)) @@ -459,7 +460,7 @@ addmeshtri( /* add a new mesh triangle */ error(INTERNAL, "modifier range error in addmeshtri"); } /* assign triangle */ - if (pn[0] == pn[1] && pn[1] == pn[2]) { /* local case */ + if ((pn[0] == pn[1]) & (pn[1] == pn[2])) { /* local case */ pp = &mp->patch[pn[0]]; if (pp->tri == NULL) { pp->tri = (struct PTri *)malloc( @@ -485,8 +486,7 @@ addmeshtri( /* add a new mesh triangle */ pp->trimat[pp->ntris] = mo; return(pn[0] << 10 | pp->ntris++); } - } - if (pn[0] == pn[1]) { + } else if (pn[0] == pn[1]) { t = vid[2]; vid[2] = vid[1]; vid[1] = vid[0]; vid[0] = t; i = pn[2]; pn[2] = pn[1]; pn[1] = pn[0]; pn[0] = i; } else if (pn[0] == pn[2]) { @@ -510,20 +510,37 @@ addmeshtri( /* add a new mesh triangle */ } } /* double link */ - pp = &mp->patch[pn[2]]; + pp = &mp->patch[pn[i=0]]; + if (pp->nj2tris >= 256) + pp = &mp->patch[pn[i=1]]; + if (pp->nj2tris >= 256) + pp = &mp->patch[pn[i=2]]; + if (pp->nj2tris >= 256) + error(INTERNAL, "too many patch triangles in addmeshtri"); if (pp->j2tri == NULL) { pp->j2tri = (struct PJoin2 *)malloc( 256*sizeof(struct PJoin2)); if (pp->j2tri == NULL) goto nomem; } - if (pp->nj2tris >= 256) - error(INTERNAL, "too many patch triangles in addmeshtri"); - pp->j2tri[pp->nj2tris].v1j = vid[0]; - pp->j2tri[pp->nj2tris].v2j = vid[1]; - pp->j2tri[pp->nj2tris].v3 = vid[2] & 0xff; pp->j2tri[pp->nj2tris].mat = mo; - return(pn[2] << 10 | 0x300 | pp->nj2tris++); + switch (i) { + case 0: + pp->j2tri[pp->nj2tris].v3 = vid[0] & 0xff; + pp->j2tri[pp->nj2tris].v1j = vid[1]; + pp->j2tri[pp->nj2tris].v2j = vid[2]; + return(pn[0] << 10 | 0x300 | pp->nj2tris++); + case 1: + pp->j2tri[pp->nj2tris].v2j = vid[0]; + pp->j2tri[pp->nj2tris].v3 = vid[1] & 0xff; + pp->j2tri[pp->nj2tris].v1j = vid[2]; + return(pn[1] << 10 | 0x300 | pp->nj2tris++); + case 2: + pp->j2tri[pp->nj2tris].v1j = vid[0]; + pp->j2tri[pp->nj2tris].v2j = vid[1]; + pp->j2tri[pp->nj2tris].v3 = vid[2] & 0xff; + return(pn[2] << 10 | 0x300 | pp->nj2tris++); + } nomem: error(SYSTEM, "out of memory in addmeshtri"); return(OVOID); @@ -535,7 +552,7 @@ checkmesh(MESH *mp) /* validate mesh data */ { static char embuf[128]; int nouvbounds = 1; - int i; + int i; /* basic checks */ if (mp == NULL) return("NULL mesh pointer");