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.28 by greg, Wed Mar 1 21:51:38 2017 UTC vs.
Revision 2.33 by greg, Sat Apr 4 04:34:08 2020 UTC

# Line 5 | Line 5 | static const char RCSid[] = "$Id$";
5   * Mesh support routines
6   */
7  
8 #include <string.h>
9
8   #include "rtio.h"
9   #include "rtmath.h"
10   #include "rterror.h"
# Line 287 | Line 285 | getmeshpseudo(                 /* get mesh pseudo object for materia
285          OBJECT  mo
286   )
287   {
288 <        if (mo < mp->mat0 || mo >= mp->mat0 + mp->nmats)
288 >        if ((mo < mp->mat0) | (mo >= mp->mat0 + mp->nmats))
289                  error(INTERNAL, "modifier out of range in getmeshpseudo");
290          if (mp->pseudo == NULL) {
291                  int     i;
# Line 374 | Line 372 | addmeshvert(                   /* find/add a mesh vertex */
372                  goto nomem;
373          if (lvp->key == NULL) {
374                  lvp->key = (char *)malloc(sizeof(MCVERT)+sizeof(int32));
375 <                memcpy((void *)lvp->key, (void *)&cv, sizeof(MCVERT));
375 >                memcpy(lvp->key, &cv, sizeof(MCVERT));
376          }
377          if (lvp->data == NULL) {        /* new vertex */
378                  MESHPATCH       *pp;
# Line 385 | Line 383 | addmeshvert(                   /* find/add a mesh vertex */
383                                  goto nomem;
384                          mp->npatches = 1;
385                  } else if (mp->patch[mp->npatches-1].nverts >= 256) {
386 +                        if (mp->npatches >= 1L<<22)
387 +                                error(INTERNAL, "too many mesh patches");
388                          if (mp->npatches % MPATCHBLKSIZ == 0) {
389 <                                mp->patch = (MESHPATCH *)realloc(
390 <                                                (void *)mp->patch,
391 <                                        (mp->npatches + MPATCHBLKSIZ)*
392 <                                                sizeof(MESHPATCH));
393 <                                memset((void *)(mp->patch + mp->npatches), '\0',
389 >                                mp->patch = (MESHPATCH *)realloc(mp->patch,
390 >                                                (mp->npatches + MPATCHBLKSIZ)*
391 >                                                        sizeof(MESHPATCH));
392 >                                memset((mp->patch + mp->npatches), '\0',
393                                          MPATCHBLKSIZ*sizeof(MESHPATCH));
394                          }
395 <                        if (mp->npatches++ >= 1L<<22)
397 <                                error(INTERNAL, "too many mesh patches");
395 >                        mp->npatches++;
396                  }
397                  pp = &mp->patch[mp->npatches-1];
398                  if (pp->xyz == NULL) {
# Line 510 | Line 508 | addmeshtri(                    /* add a new mesh triangle */
508                  }
509          }
510                                                  /* double link */
511 <        pp = &mp->patch[pn[2]];
511 >        pp = &mp->patch[pn[i=0]];
512 >        if (pp->nj2tris >= 256)
513 >                pp = &mp->patch[pn[i=1]];
514 >        if (pp->nj2tris >= 256)
515 >                pp = &mp->patch[pn[i=2]];
516 >        if (pp->nj2tris >= 256)
517 >                error(INTERNAL, "too many patch triangles in addmeshtri");
518          if (pp->j2tri == NULL) {
519                  pp->j2tri = (struct PJoin2 *)malloc(
520                                          256*sizeof(struct PJoin2));
521                  if (pp->j2tri == NULL)
522                          goto nomem;
523          }
520        if (pp->nj2tris >= 256)
521                error(INTERNAL, "too many patch triangles in addmeshtri");
522        pp->j2tri[pp->nj2tris].v1j = vid[0];
523        pp->j2tri[pp->nj2tris].v2j = vid[1];
524        pp->j2tri[pp->nj2tris].v3 = vid[2] & 0xff;
524          pp->j2tri[pp->nj2tris].mat = mo;
525 <        return(pn[2] << 10 | 0x300 | pp->nj2tris++);
525 >        switch (i) {
526 >        case 0:
527 >                pp->j2tri[pp->nj2tris].v3 = vid[0] & 0xff;
528 >                pp->j2tri[pp->nj2tris].v1j = vid[1];
529 >                pp->j2tri[pp->nj2tris].v2j = vid[2];
530 >                return(pn[0] << 10 | 0x300 | pp->nj2tris++);
531 >        case 1:
532 >                pp->j2tri[pp->nj2tris].v2j = vid[0];
533 >                pp->j2tri[pp->nj2tris].v3 = vid[1] & 0xff;
534 >                pp->j2tri[pp->nj2tris].v1j = vid[2];
535 >                return(pn[1] << 10 | 0x300 | pp->nj2tris++);
536 >        case 2:
537 >                pp->j2tri[pp->nj2tris].v1j = vid[0];
538 >                pp->j2tri[pp->nj2tris].v2j = vid[1];
539 >                pp->j2tri[pp->nj2tris].v3 = vid[2] & 0xff;
540 >                return(pn[2] << 10 | 0x300 | pp->nj2tris++);
541 >        }
542   nomem:
543          error(SYSTEM, "out of memory in addmeshtri");
544          return(OVOID);
# Line 563 | Line 578 | checkmesh(MESH *mp)                    /* validate mesh data */
578                          return("unbounded scene in mesh");
579                  if (mp->mat0 < 0 || mp->mat0+mp->nmats > nobjects)
580                          return("bad mesh modifier range");
581 +                if (mp->nmats > 0)      /* allocate during preload_objs()! */
582 +                        getmeshpseudo(mp, mp->mat0);
583                  for (i = mp->mat0+mp->nmats; i-- > mp->mat0; ) {
584                          int     otyp = objptr(i)->otype;
585                          if (!ismodifier(otyp)) {
# Line 709 | Line 726 | freemesh(MESH *ms)             /* free mesh data */
726                  MESHPATCH       *pp = ms->patch + ms->npatches;
727                  while (pp-- > ms->patch) {
728                          if (pp->j2tri != NULL)
729 <                                free((void *)pp->j2tri);
729 >                                free(pp->j2tri);
730                          if (pp->j1tri != NULL)
731 <                                free((void *)pp->j1tri);
731 >                                free(pp->j1tri);
732                          if (pp->tri != NULL)
733 <                                free((void *)pp->tri);
733 >                                free(pp->tri);
734                          if (pp->uv != NULL)
735 <                                free((void *)pp->uv);
735 >                                free(pp->uv);
736                          if (pp->norm != NULL)
737 <                                free((void *)pp->norm);
737 >                                free(pp->norm);
738                          if (pp->xyz != NULL)
739 <                                free((void *)pp->xyz);
739 >                                free(pp->xyz);
740 >                        if (pp->trimat != NULL)
741 >                                free(pp->trimat);
742                  }
743 <                free((void *)ms->patch);
743 >                free(ms->patch);
744          }
745          if (ms->pseudo != NULL)
746 <                free((void *)ms->pseudo);
747 <        free((void *)ms);
746 >                free(ms->pseudo);
747 >        free(ms);
748   }
749  
750  
# Line 735 | Line 754 | freemeshinst(OBJREC *o)                /* free mesh instance */
754          if (o->os == NULL)
755                  return;
756          freemesh((*(MESHINST *)o->os).msh);
757 <        free((void *)o->os);
757 >        free(o->os);
758          o->os = NULL;
759   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines