ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/common/mesh.c
(Generate patch)

Comparing ray/src/common/mesh.c (file contents):
Revision 2.25 by greg, Tue Nov 6 01:56:37 2012 UTC vs.
Revision 2.30 by greg, Tue Nov 27 01:04:33 2018 UTC

# Line 52 | Line 52 | static int
52   cvcmp(const char *vv1, const char *vv2)         /* compare encoded vertices */
53   {
54          const MCVERT    *v1 = (const MCVERT *)vv1, *v2 = (const MCVERT *)vv2;
55 +
56          if (v1->fl != v2->fl)
57                  return(1);
58          if (v1->xyz[0] != v2->xyz[0])
# Line 99 | Line 100 | getmesh(                               /* get new mesh data reference */
100          }
101          if ((pathname = getpath(mname, getrlibpath(), R_OK)) == NULL) {
102                  sprintf(errmsg, "cannot find mesh file \"%s\"", mname);
103 <                error(USER, errmsg);
103 >                error(SYSTEM, errmsg);
104          }
105          flags &= ~ms->ldflags;
106          if (flags)
# Line 148 | Line 149 | nextmeshtri(                           /* get next triangle ID */
149          MESH *mp
150   )
151   {
151        int             advance = 1;
152          int             pn;
153          MESHPATCH       *pp;
154  
155 <        if (*tip == OVOID) {                    /* check for first index */
156 <                *tip = 0;
157 <                advance = 0;
158 <        }
159 <        pn = *tip >> 10;
155 >        pn = ++(*tip) >> 10;                    /* next triangle (OVOID init) */
156          while (pn < mp->npatches) {
157                  pp = &mp->patch[pn];
158                  if (!(*tip & 0x200)) {          /* local triangle? */
159 <                        if ((*tip & 0x1ff) < pp->ntris - advance) {
164 <                                *tip += advance;
159 >                        if ((*tip & 0x1ff) < pp->ntris)
160                                  return(1);
166                        }
161                          *tip &= ~0x1ff;         /* move on to single-joiners */
162                          *tip |= 0x200;
169                        advance = 0;
163                  }
164                  if (!(*tip & 0x100)) {          /* single joiner? */
165 <                        if ((*tip & 0xff) < pp->nj1tris - advance) {
173 <                                *tip += advance;
165 >                        if ((*tip & 0xff) < pp->nj1tris)
166                                  return(1);
175                        }
167                          *tip &= ~0xff;          /* move on to double-joiners */
168                          *tip |= 0x100;
178                        advance = 0;
169                  }
170 <                if ((*tip & 0xff) < pp->nj2tris - advance) {
181 <                        *tip += advance;
170 >                if ((*tip & 0xff) < pp->nj2tris)
171                          return(1);
183                }
172                  *tip = ++pn << 10;              /* first in next patch */
185                advance = 0;
173          }
174          return(0);                              /* out of patches */
175   }
# Line 341 | Line 328 | getmeshtri(                    /* get triangle vertices */
328  
329   int32
330   addmeshvert(                    /* find/add a mesh vertex */
331 <        MESH    *mp,
331 >        MESH            *mp,
332          MESHVERT        *vp
333   )
334   {
335 <        LUENT           *lvp;
336 <        MCVERT          cv;
335 >        LUENT   *lvp;
336 >        MCVERT  cv;
337          int     i;
338  
339          if (!(vp->fl & MT_V))
# Line 453 | Line 440 | addmeshtri(                    /* add a new mesh triangle */
440          OBJECT          mo
441   )
442   {
443 <        int32                   vid[3], t;
444 <        int                     pn[3], i;
443 >        int32           vid[3], t;
444 >        int             pn[3], i;
445          MESHPATCH       *pp;
446  
447          if (!(tv[0].fl & tv[1].fl & tv[2].fl & MT_V))
# Line 473 | Line 460 | addmeshtri(                    /* add a new mesh triangle */
460                          error(INTERNAL, "modifier range error in addmeshtri");
461          }
462                                  /* assign triangle */
463 <        if (pn[0] == pn[1] && pn[1] == pn[2]) { /* local case */
463 >        if ((pn[0] == pn[1]) & (pn[1] == pn[2])) {      /* local case */
464                  pp = &mp->patch[pn[0]];
465                  if (pp->tri == NULL) {
466                          pp->tri = (struct PTri *)malloc(
# Line 499 | Line 486 | addmeshtri(                    /* add a new mesh triangle */
486                                  pp->trimat[pp->ntris] = mo;
487                          return(pn[0] << 10 | pp->ntris++);
488                  }
489 <        }
503 <        if (pn[0] == pn[1]) {
489 >        } else if (pn[0] == pn[1]) {
490                  t = vid[2]; vid[2] = vid[1]; vid[1] = vid[0]; vid[0] = t;
491                  i = pn[2]; pn[2] = pn[1]; pn[1] = pn[0]; pn[0] = i;
492          } else if (pn[0] == pn[2]) {
# Line 524 | Line 510 | addmeshtri(                    /* add a new mesh triangle */
510                  }
511          }
512                                                  /* double link */
513 <        pp = &mp->patch[pn[2]];
513 >        pp = &mp->patch[pn[i=0]];
514 >        if (pp->nj2tris >= 256)
515 >                pp = &mp->patch[pn[i=1]];
516 >        if (pp->nj2tris >= 256)
517 >                pp = &mp->patch[pn[i=2]];
518 >        if (pp->nj2tris >= 256)
519 >                error(INTERNAL, "too many patch triangles in addmeshtri");
520          if (pp->j2tri == NULL) {
521                  pp->j2tri = (struct PJoin2 *)malloc(
522                                          256*sizeof(struct PJoin2));
523                  if (pp->j2tri == NULL)
524                          goto nomem;
525          }
534        if (pp->nj2tris >= 256)
535                error(INTERNAL, "too many patch triangles in addmeshtri");
536        pp->j2tri[pp->nj2tris].v1j = vid[0];
537        pp->j2tri[pp->nj2tris].v2j = vid[1];
538        pp->j2tri[pp->nj2tris].v3 = vid[2] & 0xff;
526          pp->j2tri[pp->nj2tris].mat = mo;
527 <        return(pn[2] << 10 | 0x300 | pp->nj2tris++);
527 >        switch (i) {
528 >        case 0:
529 >                pp->j2tri[pp->nj2tris].v3 = vid[0] & 0xff;
530 >                pp->j2tri[pp->nj2tris].v1j = vid[1];
531 >                pp->j2tri[pp->nj2tris].v2j = vid[2];
532 >                return(pn[0] << 10 | 0x300 | pp->nj2tris++);
533 >        case 1:
534 >                pp->j2tri[pp->nj2tris].v2j = vid[0];
535 >                pp->j2tri[pp->nj2tris].v3 = vid[1] & 0xff;
536 >                pp->j2tri[pp->nj2tris].v1j = vid[2];
537 >                return(pn[1] << 10 | 0x300 | pp->nj2tris++);
538 >        case 2:
539 >                pp->j2tri[pp->nj2tris].v1j = vid[0];
540 >                pp->j2tri[pp->nj2tris].v2j = vid[1];
541 >                pp->j2tri[pp->nj2tris].v3 = vid[2] & 0xff;
542 >                return(pn[2] << 10 | 0x300 | pp->nj2tris++);
543 >        }
544   nomem:
545          error(SYSTEM, "out of memory in addmeshtri");
546          return(OVOID);
# Line 549 | Line 552 | checkmesh(MESH *mp)                    /* validate mesh data */
552   {
553          static char     embuf[128];
554          int             nouvbounds = 1;
555 <        int     i;
555 >        int             i;
556                                          /* basic checks */
557          if (mp == NULL)
558                  return("NULL mesh pointer");

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines