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

Comparing ray/src/hd/rhcopy.c (file contents):
Revision 3.34 by greg, Wed Nov 16 00:12:49 2022 UTC vs.
Revision 3.35 by greg, Wed Nov 16 00:44:04 2022 UTC

# Line 478 | Line 478 | write_ray(RAYPAR *rp, FILE *fp)
478          return 0;                       /* write error? */
479   }
480  
481 + static BEAMI    *beamdir;
482 +
483 + static int
484 + bpcmp(                  /* compare beam positions on disk */
485 +        const void      *b1p,
486 +        const void      *b2p
487 + )
488 + {
489 +        off_t   pdif = beamdir[*(int *)b1p].fo - beamdir[*(int *)b2p].fo;
490 +
491 +        if (pdif > 0L) return(1);
492 +        if (pdif < 0L) return(-1);
493 +        return(0);
494 + }
495 +
496   /* Write all rays from holodeck to stream */
497   static void
498   writerays(FILE *fp)
# Line 498 | Line 513 | writerays(FILE *fp)
513   #endif
514          for (sn = 0; sn < nholosects; sn++) {   /* write each holodeck section */
515                  HOLO    *hp = hdlist[sn];
516 <                for (bi = nbeams(hp); bi > 0; bi--) {
517 <                        BEAM    *bp = hdgetbeam(hp, bi);
516 >                int     nb = nbeams(hp);        /* sort beams by file location */
517 >                int     *bq = (int *)malloc(nb*sizeof(int));
518 >                if (!bq)
519 >                        error(SYSTEM, "out of memory in writerays()");
520 >                for (bi = nb; bi--; ) bq[bi] = bi+1;
521 >                beamdir = hp->bi;
522 >                qsort(bq, nb, sizeof(*bq), bpcmp);
523 >                for (bi = 0; bi < nb; bi++) {
524 >                        BEAM    *bp = hdgetbeam(hp, bq[bi]);
525                          if (!bp)                /* empty beam? */
526                                  continue;
527 <                        hdbcoord(gc, hp, bi);   /* else write rays */
527 >                        hdbcoord(gc, hp, bq[bi]);
528                          rv = hdbray(bp);
529                          for (k = bp->nrm; k--; rv++) {
530                                  ryp.d = hdray(ryp.ro, ryp.rd, hp, gc, rv->r);
# Line 512 | Line 534 | writerays(FILE *fp)
534                                          ryp.d = 0.;
535                                  ryp.d = hddepth(hp, rv->d) - ryp.d;
536                                  copycolr(ryp.cv, rv->v);
537 <                                if (!write_ray(&ryp, fp))
537 >                                if (!write_ray(&ryp, fp)) {
538 >                                        free(bq);
539                                          goto writError;
540 +                                }
541                          }
542 <                        hdfreebeam(hp, bi);
542 >                        hdfreebeam(hp, bq[bi]);
543                  }
544 +                free(bq);
545          }
546          if (fflush(fp) != EOF)
547                  return;
# Line 524 | Line 549 | writError:
549          error(SYSTEM, "error writing holodeck rays");
550   }
551  
527 static BEAMI    *beamdir;
528
552   static int
530 bpcmp(                  /* compare beam positions on disk */
531        const void      *b1p,
532        const void      *b2p
533 )
534 {
535        off_t   pdif = beamdir[*(int*)b1p].fo - beamdir[*(int*)b2p].fo;
536
537        if (pdif > 0L) return(1);
538        if (pdif < 0L) return(-1);
539        return(0);
540 }
541
542 static int
553   addclump(               /* transfer the given clump and free */
554          HOLO    *hp,
555          int     *bq,
# Line 554 | Line 564 | addclump(              /* transfer the given clump and free */
564          BEAM    *bp;
565                                          /* sort based on file position */
566          beamdir = hp->bi;
567 <        qsort((char *)bq, nb, sizeof(*bq), bpcmp);
567 >        qsort(bq, nb, sizeof(*bq), bpcmp);
568                                          /* transfer each beam */
569          for (i = 0; i < nb; i++) {
570                  bp = hdgetbeam(hp, bq[i]);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines