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.31 by greg, Tue Nov 27 06:20:37 2018 UTC

# Line 287 | Line 287 | getmeshpseudo(                 /* get mesh pseudo object for materia
287          OBJECT  mo
288   )
289   {
290 <        if (mo < mp->mat0 || mo >= mp->mat0 + mp->nmats)
290 >        if ((mo < mp->mat0) | (mo >= mp->mat0 + mp->nmats))
291                  error(INTERNAL, "modifier out of range in getmeshpseudo");
292          if (mp->pseudo == NULL) {
293                  int     i;
# Line 374 | Line 374 | addmeshvert(                   /* find/add a mesh vertex */
374                  goto nomem;
375          if (lvp->key == NULL) {
376                  lvp->key = (char *)malloc(sizeof(MCVERT)+sizeof(int32));
377 <                memcpy((void *)lvp->key, (void *)&cv, sizeof(MCVERT));
377 >                memcpy(lvp->key, &cv, sizeof(MCVERT));
378          }
379          if (lvp->data == NULL) {        /* new vertex */
380                  MESHPATCH       *pp;
# Line 385 | Line 385 | addmeshvert(                   /* find/add a mesh vertex */
385                                  goto nomem;
386                          mp->npatches = 1;
387                  } else if (mp->patch[mp->npatches-1].nverts >= 256) {
388 +                        if (mp->npatches >= 1L<<22)
389 +                                error(INTERNAL, "too many mesh patches");
390                          if (mp->npatches % MPATCHBLKSIZ == 0) {
391 <                                mp->patch = (MESHPATCH *)realloc(
392 <                                                (void *)mp->patch,
393 <                                        (mp->npatches + MPATCHBLKSIZ)*
394 <                                                sizeof(MESHPATCH));
393 <                                memset((void *)(mp->patch + mp->npatches), '\0',
391 >                                mp->patch = (MESHPATCH *)realloc(mp->patch,
392 >                                                (mp->npatches + MPATCHBLKSIZ)*
393 >                                                        sizeof(MESHPATCH));
394 >                                memset((mp->patch + mp->npatches), '\0',
395                                          MPATCHBLKSIZ*sizeof(MESHPATCH));
396                          }
397 <                        if (mp->npatches++ >= 1L<<22)
397 <                                error(INTERNAL, "too many mesh patches");
397 >                        mp->npatches++;
398                  }
399                  pp = &mp->patch[mp->npatches-1];
400                  if (pp->xyz == NULL) {
# Line 510 | 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          }
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;
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 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