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

Comparing ray/src/util/ranimove1.c (file contents):
Revision 3.8 by schorsch, Fri Mar 26 21:36:20 2004 UTC vs.
Revision 3.20 by greg, Tue Oct 2 21:56:20 2012 UTC

# Line 4 | Line 4 | static const char      RCSid[] = "$Id$";
4   /*
5   *  ranimove1.c
6   *
7 < *  Basic frame rendering routines for ranimate(1).
7 > *  Basic frame rendering routines for ranimove(1).
8   *
9   *  Created by Gregory Ward on Wed Jan 08 2003.
10   */
# Line 30 | Line 30 | float          *zbuffer;       /* depth at each pixel */
30   OBJECT          *obuffer;       /* object id at each pixel */
31   short           *xmbuffer;      /* x motion at each pixel */
32   short           *ymbuffer;      /* y motion at each pixel */
33 < BYTE            *abuffer;       /* accuracy at each pixel */
34 < BYTE            *sbuffer;       /* sample count per pixel */
33 > uby8            *abuffer;       /* accuracy at each pixel */
34 > uby8            *sbuffer;       /* sample count per pixel */
35  
36   VIEW            vwprev;         /* last frame's view */
37   COLOR           *cprev;         /* last frame colors */
38   float           *zprev;         /* last frame depth */
39   OBJECT          *oprev;         /* last frame objects */
40 < BYTE            *aprev;         /* last frame accuracy */
40 > uby8            *aprev;         /* last frame accuracy */
41  
42   float           *cerrmap;       /* conspicuous error map */
43   COLOR           *val2map;       /* value-squared map for variance */
# Line 48 | Line 48 | double         hlsmax;         /* maximum high-level saliency this f
48  
49  
50   static void next_frame(void);
51 < static int sample_here(int      x, int  y);
52 < static int offset_cmp(const void        *p1, const void *p2);
53 < static void setmotion(int       n, FVECT        wpos);
51 > static int sample_here(int x, int y);
52 > static int offset_cmp(const void *p1, const void *p2);
53 > static void setmotion(int n, FVECT wpos);
54   static void init_frame_sample(void);
55  
56  
57 < extern void
57 > #if 0
58 > void
59   write_map(              /* write out float map (debugging) */
60          float   *mp,
61          char    *fn
# Line 79 | Line 80 | write_map(             /* write out float map (debugging) */
80          }
81          fclose(fp);
82   }
83 + #endif
84  
85  
86   static void
# Line 105 | Line 107 | next_frame(void)                       /* prepare next frame buffer */
107                  error(USER, errmsg);
108          }
109          if (cbuffer == NULL) {
110 +                int     n;
111                                          /* compute resolution and allocate */
112                  switch (sscanf(vval(RESOLUTION), "%d %d %lf",
113                                  &hres, &vres, &pixaspect)) {
# Line 128 | Line 131 | next_frame(void)                       /* prepare next frame buffer */
131                  obuffer = (OBJECT *)malloc(sizeof(OBJECT)*hres*vres);
132                  xmbuffer = (short *)malloc(sizeof(short)*hres*vres);
133                  ymbuffer = (short *)malloc(sizeof(short)*hres*vres);
134 <                abuffer = (BYTE *)calloc(hres*vres, sizeof(BYTE));
135 <                sbuffer = (BYTE *)calloc(hres*vres, sizeof(BYTE));
134 >                abuffer = (uby8 *)calloc(hres*vres, sizeof(uby8));
135 >                sbuffer = (uby8 *)calloc(hres*vres, sizeof(uby8));
136                  cprev = (COLOR *)malloc(sizeof(COLOR)*hres*vres);
137                  zprev = (float *)malloc(sizeof(float)*hres*vres);
138                  oprev = (OBJECT *)malloc(sizeof(OBJECT)*hres*vres);
139 <                aprev = (BYTE *)malloc(sizeof(BYTE)*hres*vres);
139 >                aprev = (uby8 *)malloc(sizeof(uby8)*hres*vres);
140                  if ((cbuffer==NULL) | (zbuffer==NULL) | (obuffer==NULL) |
141                                  (xmbuffer==NULL) | (ymbuffer==NULL) |
142                                  (abuffer==NULL) | (sbuffer==NULL) |
143                                  (cprev==NULL) | (zprev == NULL) |
144                                  (oprev==NULL) | (aprev==NULL))
145                          error(SYSTEM, "out of memory in init_frame");
146 +                for (n = hres*vres; n--; ) {
147 +                        zprev[n] = -1.f;
148 +                        oprev[n] = OVOID;
149 +                }
150                  frm_stop = getTime() + rtperfrm;
151          } else {
152                  COLOR   *cp;            /* else just swap buffers */
153                  float   *fp;
154                  OBJECT  *op;
155 <                BYTE    *bp;
155 >                uby8    *bp;
156                  cp = cprev; cprev = cbuffer; cbuffer = cp;
157                  fp = zprev; zprev = zbuffer; zbuffer = fp;
158                  op = oprev; oprev = obuffer; obuffer = op;
159                  bp = aprev; aprev = abuffer; abuffer = bp;
160 <                memset(abuffer, '\0', sizeof(BYTE)*hres*vres);
161 <                memset(sbuffer, '\0', sizeof(BYTE)*hres*vres);
160 >                memset(abuffer, '\0', sizeof(uby8)*hres*vres);
161 >                memset(sbuffer, '\0', sizeof(uby8)*hres*vres);
162                  frm_stop += rtperfrm;
163          }
164          cerrmap = NULL;
# Line 165 | Line 172 | next_frame(void)                       /* prepare next frame buffer */
172  
173   static int
174   sample_here(            /* 4x4 quincunx sample at this pixel? */
175 <        register int    x,
176 <        register int    y
175 >        int     x,
176 >        int     y
177   )
178   {
179          if (y & 0x1)            /* every other row has samples */
# Line 177 | Line 184 | sample_here(           /* 4x4 quincunx sample at this pixel? */
184   }
185  
186  
187 < extern void
187 > void
188   sample_pos(     /* compute jittered sample position */
189          double  hv[2],
190          int     x,
# Line 194 | Line 201 | sample_pos(    /* compute jittered sample position */
201   }
202  
203  
204 < extern double
204 > double
205   sample_wt(              /* compute interpolant sample weight */
206          int     xo,
207          int yo
# Line 228 | Line 235 | offset_cmp(            /* compare offset distances */
235   }
236  
237  
238 < extern int
238 > int
239   getclosest(     /* get nc closest neighbors on same object */
240          int     *iarr,
241          int     nc,
# Line 241 | Line 248 | getclosest(    /* get nc closest neighbors on same object
248          static int      ioffs[NSCHECK];
249          OBJECT  myobj;
250          int     i0, nf;
251 <        register int    i, j;
251 >        int     i, j;
252                                          /* get our object number */
253          myobj = obuffer[fndx(x, y)];
254                                          /* special case for borders */
# Line 305 | Line 312 | getclosest(    /* get nc closest neighbors on same object
312  
313   static void
314   setmotion(              /* compute motion vector for this pixel */
315 <                register int    n,
315 >                int     n,
316                  FVECT   wpos
317   )
318   {
# Line 344 | Line 351 | init_frame_sample(void)                /* sample our initial frame *
351   {
352          RAY     ir;
353          int     x, y;
354 <        register int    n;
354 >        int     n;
355  
356          if (!silent) {
357                  printf("\tComputing initial samples...");
# Line 355 | Line 362 | init_frame_sample(void)                /* sample our initial frame *
362              for (x = hres; x--; ) {
363                  double  hv[2];
364                  n = fndx(x, y);
365 <                xmbuffer[n] = MO_UNK;
359 <                ymbuffer[n] = MO_UNK;
365 >                xmbuffer[n] = ymbuffer[n] = MO_UNK;
366                  sample_pos(hv, x, y, 0);
367                  ir.rmax = viewray(ir.rorg, ir.rdir, &vw, hv[0], hv[1]);
368                  if (ir.rmax < -FTINY) {
# Line 367 | Line 373 | init_frame_sample(void)                /* sample our initial frame *
373                          continue;
374                  }
375                  if (!sample_here(x, y)) {       /* just cast */
376 <                        rayorigin(&ir, NULL, PRIMARY, 1.0);
376 >                        rayorigin(&ir, PRIMARY, NULL, NULL);
377                          if (!localhit(&ir, &thescene)) {
378 <                                if (ir.ro != &Aftplane)
379 <                                        sourcehit(&ir);
378 >                                if (ir.ro != &Aftplane && sourcehit(&ir)) {
379 >                                        rayshade(&ir, ir.ro->omod);
380 >                                        rayparticipate(&ir);
381 >                                }
382                                  copycolor(cbuffer[n], ir.rcol);
383                                  zbuffer[n] = ir.rot;
384                                  obuffer[n] = ir.robj;
# Line 385 | Line 393 | init_frame_sample(void)                /* sample our initial frame *
393                  }
394                  if (nprocs > 1) {               /* get sample */
395                          int     rval;
396 <                        rayorigin(&ir, NULL, PRIMARY, 1.0);
396 >                        rayorigin(&ir, PRIMARY, NULL, NULL);
397                          ir.rno = n;
398                          rval = ray_pqueue(&ir);
399                          if (!rval)
# Line 399 | Line 407 | init_frame_sample(void)                /* sample our initial frame *
407                  zbuffer[n] = ir.rot;
408                  obuffer[n] = ir.robj;
409                  sbuffer[n] = 1;
410 <                if (ir.rot >= FHUGE)
410 >                if (ir.rot >= 0.99*FHUGE)
411                          abuffer[n] = ADISTANT;
412                  else {
413                          abuffer[n] = ALOWQ;
# Line 442 | Line 450 | init_frame_sample(void)                /* sample our initial frame *
450   }
451  
452  
453 < extern int
453 > int
454   getambcolor(            /* get ambient color for object if we can */
455                  COLOR   clr,
456                  int     obj
457   )
458   {
459 <        register OBJREC *op;
459 >        OBJREC  *op;
460  
461          if (obj == OVOID)
462                  return(0);
463 <        op = objptr(obj);
464 <        if ((op->otype == OBJ_INSTANCE) & (op->omod == OVOID))
463 >        op = objptr(obj);               /* search for material */
464 >        if (op->omod == OVOID)
465                  return(0);
466 <                                        /* search for material */
467 <        do {
468 <                if (op->omod == OVOID || ofun[op->otype].flags & T_X)
461 <                        return(0);
462 <                op = objptr(op->omod);
463 <        } while (!ismaterial(op->otype));
466 >        op = findmaterial(objptr(op->omod));
467 >        if (op == NULL)
468 >                return(0);
469          /*
470           * Since this routine is called to compute the difference
471           * from rendering with and without interreflections,
# Line 474 | Line 479 | getambcolor(           /* get ambient color for object if we ca
479                          if (lv[0] == op->oname[0] &&
480                                          !strcmp(lv+1, op->oname+1))
481                                  break;
482 <                if ((lv != NULL) != hirendparams.ambincl)
482 >                if ((lv != NULL) ^ hirendparams.ambincl)
483                          return(0);
484          }
485          switch (op->otype) {
# Line 513 | Line 518 | getambcolor(           /* get ambient color for object if we ca
518   }
519  
520  
521 < extern double
521 > double
522   estimaterr(             /* estimate relative error from samples */
523                  COLOR   cs,
524                  COLOR   cs2,
# Line 539 | Line 544 | estimaterr(            /* estimate relative error from samples *
544   }
545  
546  
547 < extern double
547 > double
548   comperr(                /* estimate relative error in neighborhood */
549                  int     *neigh,
550                  int     nc,
# Line 550 | Line 555 | comperr(               /* estimate relative error in neighborhood *
555          COLOR   ctmp;
556          int     i;
557          int     ns;
558 <        register int    n;
558 >        int     n;
559                                          /* add together samples */
560          setcolor(csum, 0., 0., 0.);
561          setcolor(csum2, 0., 0., 0.);
# Line 575 | Line 580 | comperr(               /* estimate relative error in neighborhood *
580   }
581  
582  
583 < extern void
583 > void
584   comp_frame_error(void)          /* initialize frame error values */
585   {
586 <        BYTE    *edone = NULL;
586 >        uby8    *edone = NULL;
587          COLOR   objamb;
588          double  eest;
589          int     neigh[NSAMPOK];
590          int     nc;
591          int     x, y, i;
592 <        register int    n;
592 >        int     n;
593  
594          if (!silent) {
595                  printf("\tComputing error map\n");
# Line 602 | Line 607 | comp_frame_error(void)         /* initialize frame error valu
607                   * error should be less than the ambient value divided
608                   * by the returned ray value -- we take half of this.
609                   */
610 <                edone = (BYTE *)calloc(hres*vres, sizeof(BYTE));
611 <                for (y = vres; y--; )
607 <                    for (x = hres; x--; ) {
608 <                        n = fndx(x, y);
610 >                edone = (uby8 *)calloc(hres*vres, sizeof(uby8));
611 >                for (n = hres*vres; n--; ) {
612                          if ((abuffer[n] != ALOWQ) | (obuffer[n] == OVOID))
613                                  continue;
614                          if (!getambcolor(objamb, obuffer[n]))
# Line 622 | Line 625 | comp_frame_error(void)         /* initialize frame error valu
625                          else if (i >= ADISTANT/2) i = ADISTANT/2-1;
626                          abuffer[n] = i;
627                          edone[n] = 1;
628 <                    }
628 >                }
629          }
630                                          /* final statistical estimate */
631          for (y = vres; y--; )
# Line 654 | Line 657 | comp_frame_error(void)         /* initialize frame error valu
657   }
658  
659  
660 < extern void
660 > void
661   init_frame(void)                        /* render base (low quality) frame */
662   {
663          int     restart;
661
664                                          /* allocate/swap buffers */
665          next_frame();
666                                          /* check rendering status */
667          restart = (!nobjects || vdef(MOVE));
668          if (!restart && curparams != &lorendparams && nprocs > 1)
669                  restart = -1;
668        if (restart > 0) {
669                if (nprocs > 1)
670                        ray_pdone(1);
671                else
672                        ray_done(1);
673        }
670                                          /* post low quality parameters */
671          if (curparams != &lorendparams)
672                  ray_restore(curparams = &lorendparams);
# Line 702 | Line 698 | init_frame(void)                       /* render base (low quality) frame
698          init_frame_sample();
699                                          /* initialize frame error */
700          comp_frame_error();
701 < return;
701 > #if 0
702   {
703          float   *ebuf = (float *)malloc(sizeof(float)*hres*vres);
704          char    fnm[256];
705 <        register int    n;
705 >        int     n;
706          for (n = hres*vres; n--; )
707                  ebuf[n] = acctab[abuffer[n]];
708          sprintf(fnm, vval(BASENAME), fcur);
# Line 714 | Line 710 | return;
710          write_map(ebuf, fnm);
711          free((void *)ebuf);
712   }
713 + #endif
714   }
715  
716  
717 < extern void
717 > void
718   filter_frame(void)                      /* interpolation, motion-blur, and exposure */
719   {
720 <        double  expval = expspec_val(getexp(fcur));
721 <        int     x, y;
722 <        int     neigh[NPINTERP];
723 <        int     nc;
724 <        COLOR   cval;
725 <        double  w, wsum;
726 <        register int    n;
720 >        const double    expval = expspec_val(getexp(fcur));
721 >        int             x, y;
722 >        int             neigh[NPINTERP];
723 >        int             nc;
724 >        COLOR           cval;
725 >        double          w, wsum;
726 >        int             n;
727  
728   #if 0
729          /* XXX TEMPORARY!! */
# Line 740 | Line 737 | filter_frame(void)                     /* interpolation, motion-blur, an
737                  free((void *)ebuf);
738          }
739   #endif
743
740          if (!silent) {
741                  printf("\tFiltering frame\n");
742                  fflush(stdout);
743          }
744 <        /* normalize samples */
745 <        for (y = vres; y--; ) {
746 <                for (x = hres; x--; ) {
747 <                        n = fndx(x, y);
748 <                        if (sbuffer[n] <= 1)
749 <                                continue;
754 <                        w = 1.0/(double)sbuffer[n];
755 <                        scalecolor(cbuffer[n], w);
756 <                }
744 >                                        /* normalize samples */
745 >        for (n = hres*vres; n--; ) {
746 >                if (sbuffer[n] <= 1)
747 >                        continue;
748 >                w = 1.0/(double)sbuffer[n];
749 >                scalecolor(cbuffer[n], w);
750          }
751 <        /* interpolate samples */
752 <        for (y = vres; y--; ) {
753 <                for (x = hres; x--; ) {
754 <                        n = fndx(x, y);
755 <                        if (sbuffer[n])
751 >                                        /* interpolate samples */
752 >        for (y = vres; y--; )
753 >            for (x = hres; x--; ) {
754 >                n = fndx(x, y);
755 >                if (sbuffer[n])
756 >                        continue;
757 >                nc = getclosest(neigh, NPINTERP, x, y);
758 >                setcolor(cbuffer[n], 0., 0., 0.);
759 >                if (nc <= 0) {          /* no acceptable neighbors */
760 >                        if (y < vres-1)
761 >                                nc = fndx(x, y+1);
762 >                        else if (x < hres-1)
763 >                                nc = fndx(x+1, y);
764 >                        else
765                                  continue;
766 <                        nc = getclosest(neigh, NPINTERP, x, y);
767 <                        setcolor(cbuffer[n], 0., 0., 0.);
766 <                        wsum = 0.;
767 <                        while (nc-- > 0) {
768 <                                copycolor(cval, cbuffer[neigh[nc]]);
769 <                                w = sample_wt((neigh[nc]%hres) - x,
770 <                                                (neigh[nc]/hres) - y);
771 <                                scalecolor(cval, w);
772 <                                addcolor(cbuffer[n], cval);
773 <                                wsum += w;
774 <                        }
775 <                        if (wsum > FTINY) {
776 <                                w = 1.0/wsum;
777 <                                scalecolor(cbuffer[n], w);
778 <                        }
766 >                        copycolor(cbuffer[n], cbuffer[nc]);
767 >                        continue;
768                  }
769 <        }
770 <        /* motion blur if requested */
769 >                wsum = 0.;
770 >                while (nc-- > 0) {
771 >                        copycolor(cval, cbuffer[neigh[nc]]);
772 >                        w = sample_wt((neigh[nc]%hres) - x,
773 >                                        (neigh[nc]/hres) - y);
774 >                        scalecolor(cval, w);
775 >                        addcolor(cbuffer[n], cval);
776 >                        wsum += w;
777 >                }
778 >                w = 1.0/wsum;
779 >                scalecolor(cbuffer[n], w);
780 >            }
781 >                                        /* motion blur if requested */
782          if (mblur > .02) {
783 <            int xs, ys, xl, yl;
784 <            int rise, run;
785 <            long        rise2, run2;
786 <            int n2;
787 <            int cnt;
788 <            /* sum in motion streaks */
789 <            memset(outbuffer, '\0', sizeof(COLOR)*hres*vres);
790 <            memset(wbuffer, '\0', sizeof(float)*hres*vres);
791 <            for (y = vres; y--; ) {
792 <                for (x = hres; x--; ) {
783 >                int     xs, ys, xl, yl;
784 >                int     rise, run;
785 >                long    rise2, run2;
786 >                int     n2;
787 >                int     cnt;
788 >                                        /* sum in motion streaks */
789 >                memset(outbuffer, '\0', sizeof(COLOR)*hres*vres);
790 >                memset(wbuffer, '\0', sizeof(float)*hres*vres);
791 >                for (y = vres; y--; )
792 >                    for (x = hres; x--; ) {
793                          n = fndx(x, y);
794                          if (xmbuffer[n] == MO_UNK) {
795                                  run = rise = 0;
# Line 810 | Line 810 | filter_frame(void)                     /* interpolation, motion-blur, an
810                          else ys = 1;
811                          rise2 = run2 = 0L;
812                          if (rise > run) {
813 <                            cnt = rise + 1;
814 <                            w = 1./cnt;
815 <                            copycolor(cval, cbuffer[n]);
816 <                            scalecolor(cval, w);
817 <                            while (cnt) {
818 <                                if (rise2 >= run2) {
819 <                                    if ((xl >= 0) & (xl < hres) &
813 >                                cnt = rise + 1;
814 >                                w = 1./cnt;
815 >                                copycolor(cval, cbuffer[n]);
816 >                                scalecolor(cval, w);
817 >                                while (cnt)
818 >                                        if (rise2 >= run2) {
819 >                                                if ((xl >= 0) & (xl < hres) &
820                                                      (yl >= 0) & (yl < vres)) {
821 <                                            n2 = fndx(xl, yl);
822 <                                            addcolor(outbuffer[n2], cval);
823 <                                            wbuffer[n2] += w;
824 <                                    }
825 <                                    yl += ys;
826 <                                    run2 += run;
827 <                                    cnt--;
828 <                                } else {
829 <                                        xl += xs;
830 <                                        rise2 += rise;
831 <                                }
832 <                            }
821 >                                                        n2 = fndx(xl, yl);
822 >                                                        addcolor(outbuffer[n2],
823 >                                                                        cval);
824 >                                                        wbuffer[n2] += w;
825 >                                                }
826 >                                                yl += ys;
827 >                                                run2 += run;
828 >                                                cnt--;
829 >                                        } else {
830 >                                                xl += xs;
831 >                                                rise2 += rise;
832 >                                        }
833                          } else {
834                                  cnt = run + 1;
835                                  w = 1./cnt;
836                                  copycolor(cval, cbuffer[n]);
837                                  scalecolor(cval, w);
838 <                                while (cnt) {
839 <                                    if (run2 >= rise2) {
840 <                                        if ((xl >= 0) & (xl < hres) &
838 >                                while (cnt)
839 >                                        if (run2 >= rise2) {
840 >                                                if ((xl >= 0) & (xl < hres) &
841                                                      (yl >= 0) & (yl < vres)) {
842 <                                                n2 = fndx(xl, yl);
843 <                                                addcolor(outbuffer[n2],
844 <                                                                cval);
845 <                                                wbuffer[n2] += w;
842 >                                                        n2 = fndx(xl, yl);
843 >                                                        addcolor(outbuffer[n2],
844 >                                                                        cval);
845 >                                                        wbuffer[n2] += w;
846 >                                                }
847 >                                                xl += xs;
848 >                                                rise2 += rise;
849 >                                                cnt--;
850 >                                        } else {
851 >                                                yl += ys;
852 >                                                run2 += run;
853                                          }
847                                        xl += xs;
848                                        rise2 += rise;
849                                        cnt--;
850                                    } else {
851                                            yl += ys;
852                                            run2 += run;
853                                    }
854                                }
854                          }
855 <                }
856 <                /* compute final results */
858 <                for (y = vres; y--; ) {
859 <                        for (x = hres; x--; ) {
860 <                                n = fndx(x, y);
861 <                                if (wbuffer[n] <= FTINY)
862 <                                        continue;
863 <                                w = 1./wbuffer[n];
864 <                                scalecolor(outbuffer[n], w);
865 <                        }
866 <                }
867 <            }
868 <        } else {
855 >                    }
856 >                                        /* compute final results */
857                  for (n = hres*vres; n--; ) {
858 <                        copycolor(outbuffer[n], cbuffer[n]);
858 >                        if (wbuffer[n] <= FTINY)
859 >                                continue;
860 >                        w = expval/wbuffer[n];
861 >                        scalecolor(outbuffer[n], w);
862                  }
863 +        } else {                        /* no blur -- just exposure */
864 +                memcpy(outbuffer, cbuffer, sizeof(COLOR)*hres*vres);
865 +                for (n = ((expval < 0.99) | (expval > 1.01))*hres*vres; n--; )
866 +                        scalecolor(outbuffer[n], expval);
867          }
868          /*
869             for (n = hres*vres; n--; )
870 <           if (!sbuffer[n])
871 <           setcolor(outbuffer[n], 0., 0., 0.);
870 >                   if (!sbuffer[n])
871 >                           setcolor(outbuffer[n], 0., 0., 0.);
872           */
873 <        /* adjust exposure */
879 <        if ((expval < 0.99) | (expval > 1.01))
880 <                for (n = hres*vres; n--; )
881 <                        scalecolor(outbuffer[n], expval);
882 <        return;
873 > #if 0
874          {
875                  float   *sbuf = (float *)malloc(sizeof(float)*hres*vres);
876                  char    fnm[256];
# Line 890 | Line 881 | filter_frame(void)                     /* interpolation, motion-blur, an
881                  write_map(sbuf, fnm);
882                  free((void *)sbuf);
883          }
884 + #endif
885   }
886  
887  
888 < extern void
888 > void
889   send_frame(void)                        /* send frame to destination */
890   {
891 <        char    pfname[1024];
891 >        char    fname[1024];
892          double  d;
893          FILE    *fp;
894          int     y;
895                                          /* open output picture */
896 <        sprintf(pfname, vval(BASENAME), fcur);
897 <        strcat(pfname, ".pic");
898 <        fp = fopen(pfname, "w");
896 >        sprintf(fname, vval(BASENAME), fcur);
897 >        strcat(fname, ".hdr");
898 >        fp = fopen(fname, "w");
899          if (fp == NULL) {
900 <                sprintf(errmsg, "cannot open output frame \"%s\"", pfname);
900 >                sprintf(errmsg, "cannot open output frame \"%s\"", fname);
901                  error(SYSTEM, errmsg);
902          }
903          SET_FILE_BINARY(fp);
904          if (!silent) {
905 <                printf("\tWriting to \"%s\"\n", pfname);
905 >                printf("\tWriting to \"%s\"\n", fname);
906                  fflush(stdout);
907          }
908                                          /* write header */
# Line 939 | Line 931 | send_frame(void)                       /* send frame to destination */
931                          goto writerr;
932          if (fclose(fp) == EOF)
933                  goto writerr;
934 +        if (vdef(ZNAME)) {              /* output z-buffer */
935 +                sprintf(fname, vval(ZNAME), fcur);
936 +                strcat(fname, ".zbf");
937 +                fp = fopen(fname, "w");
938 +                if (fp == NULL) {
939 +                        sprintf(errmsg, "cannot open z-file \"%s\"\n", fname);
940 +                        error(SYSTEM, errmsg);
941 +                }
942 +                SET_FILE_BINARY(fp);
943 +                if (!silent) {
944 +                        printf("\tWriting depths to \"%s\"\n", fname);
945 +                        fflush(stdout);
946 +                }
947 +                for (y = vres; y--; )
948 +                        if (fwrite(zbuffer+y*hres, sizeof(float),
949 +                                                hres, fp) != hres)
950 +                                goto writerr;
951 +                if (fclose(fp) == EOF)
952 +                        goto writerr;
953 +        }
954 +        if (vdef(MNAME)) {              /* output motion buffer */
955 +                unsigned short  *mbuffer = (unsigned short *)malloc(
956 +                                                sizeof(unsigned short)*3*hres);
957 +                int             x, n;
958 +                if (mbuffer == NULL)
959 +                        error(SYSTEM, "out of memory in send_frame");
960 +                sprintf(fname, vval(MNAME), fcur);
961 +                strcat(fname, ".mvo");
962 +                fp = fopen(fname, "w");
963 +                if (fp == NULL) {
964 +                        sprintf(errmsg, "cannot open motion file \"%s\"\n",
965 +                                                        fname);
966 +                        error(SYSTEM, errmsg);
967 +                }
968 +                SET_FILE_BINARY(fp);
969 +                if (!silent) {
970 +                        printf("\tWriting motion vectors to \"%s\"\n", fname);
971 +                        fflush(stdout);
972 +                }
973 +                for (y = vres; y--; ) {
974 +                        for (x = hres; x--; ) {
975 +                                n = fndx(x,y);
976 +                                mbuffer[3*x] = xmbuffer[n] + 0x8000;
977 +                                mbuffer[3*x+1] = ymbuffer[n] + 0x8000;
978 +                                mbuffer[3*x+2] = (oprev[n]!=OVOID)*0x8000;
979 +                        }
980 +                        if (fwrite(mbuffer, sizeof(*mbuffer),
981 +                                                3*hres, fp) != 3*hres)
982 +                                goto writerr;
983 +                }
984 +                free((void *)mbuffer);
985 +                if (fclose(fp) == EOF)
986 +                        goto writerr;
987 +        }
988          return;                         /* all is well */
989   writerr:
990 <        sprintf(errmsg, "error writing frame \"%s\"", pfname);
990 >        sprintf(errmsg, "error writing file \"%s\"", fname);
991          error(SYSTEM, errmsg);
992   }
993  
994  
995 < extern void
995 > void
996   free_frame(void)                        /* free frame allocation */
997   {
998          if (cbuffer == NULL)

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines