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.21 by greg, Fri Oct 5 00:59:38 2012 UTC vs.
Revision 3.24 by greg, Sat Nov 17 20:15:51 2018 UTC

# Line 16 | Line 16 | static const char      RCSid[] = "$Id$";
16   #include "platform.h"
17   #include "ranimove.h"
18   #include "otypes.h"
19 + #include "otspecial.h"
20   #include "source.h"
21   #include "random.h"
22  
# Line 32 | Line 33 | short          *xmbuffer;      /* x motion at each pixel */
33   short           *ymbuffer;      /* y motion at each pixel */
34   uby8            *abuffer;       /* accuracy at each pixel */
35   uby8            *sbuffer;       /* sample count per pixel */
35 COLOR           *outbuffer;     /* output buffer (may equal cbuffer) */
36  
37   VIEW            vwprev;         /* last frame's view */
38   COLOR           *cprev;         /* last frame colors */
# Line 108 | Line 108 | next_frame(void)                       /* prepare next frame buffer */
108                  error(USER, errmsg);
109          }
110          if (cbuffer == NULL) {
111 <                int     n;              /* compute resolution and allocate */
111 >                int     n;
112 >                                        /* compute resolution and allocate */
113                  switch (sscanf(vval(RESOLUTION), "%d %d %lf",
114                                  &hres, &vres, &pixaspect)) {
115                  case 1:
# Line 137 | Line 138 | next_frame(void)                       /* prepare next frame buffer */
138                  zprev = (float *)malloc(sizeof(float)*hres*vres);
139                  oprev = (OBJECT *)malloc(sizeof(OBJECT)*hres*vres);
140                  aprev = (uby8 *)malloc(sizeof(uby8)*hres*vres);
140                if (mblur > .02)
141                        outbuffer = (COLOR *)malloc(sizeof(COLOR)*hres*vres);
142                else
143                        outbuffer = cbuffer;
141                  if ((cbuffer==NULL) | (zbuffer==NULL) | (obuffer==NULL) |
142                                  (xmbuffer==NULL) | (ymbuffer==NULL) |
143                                  (abuffer==NULL) | (sbuffer==NULL) |
144                                  (cprev==NULL) | (zprev == NULL) |
145 <                                (oprev==NULL) | (aprev==NULL) |
149 <                                (outbuffer==NULL))
145 >                                (oprev==NULL) | (aprev==NULL))
146                          error(SYSTEM, "out of memory in init_frame");
147                  for (n = hres*vres; n--; ) {
148                          zprev[n] = -1.f;
149                          oprev[n] = OVOID;
150                  }
151                  frm_stop = getTime() + rtperfrm;
152 <        } else {                        /* else just swap buffers */
152 >        } else {
153 >                COLOR   *cp;            /* else just swap buffers */
154                  float   *fp;
155                  OBJECT  *op;
156                  uby8    *bp;
157 <                if (outbuffer != cbuffer) {
161 <                        COLOR   *cp = cprev;
162 <                        cprev = cbuffer; cbuffer = cp;
163 <                } else {
164 <                        outbuffer = cprev; cprev = cbuffer;
165 <                        cbuffer = outbuffer;
166 <                }
157 >                cp = cprev; cprev = cbuffer; cbuffer = cp;
158                  fp = zprev; zprev = zbuffer; zbuffer = fp;
159                  op = oprev; oprev = obuffer; obuffer = op;
160                  bp = aprev; aprev = abuffer; abuffer = bp;
161 <                memset(abuffer, 0, sizeof(uby8)*hres*vres);
162 <                memset(sbuffer, 0, sizeof(uby8)*hres*vres);
161 >                memset(abuffer, '\0', sizeof(uby8)*hres*vres);
162 >                memset(sbuffer, '\0', sizeof(uby8)*hres*vres);
163                  frm_stop += rtperfrm;
164          }
165          cerrmap = NULL;
# Line 339 | Line 330 | setmotion(             /* compute motion vector for this pixel */
330                  multp3(ovp, wpos, obj_move[moi].bxfm);
331                  wpos = ovp;
332          }
333 <        viewloc(ovp, &vwprev, wpos);
343 <        if (ovp[2] <= FTINY)
333 >        if (viewloc(ovp, &vwprev, wpos) <= 0)
334                  return;
335          xp = (int)(ovp[0]*hres);
336          yp = (int)(ovp[1]*vres);
# Line 579 | Line 569 | comperr(               /* estimate relative error in neighborhood *
569                  }
570                  if (sbuffer[n] != 1)
571                          error(CONSISTENCY, "bad count in comperr");
572 <                copycolor(ctmp, cbuffer[n]);
573 <                multcolor(ctmp, ctmp);
572 >                setcolor(ctmp,
573 >                        colval(cbuffer[n],RED)*colval(cbuffer[n],RED),
574 >                        colval(cbuffer[n],GRN)*colval(cbuffer[n],GRN),
575 >                        colval(cbuffer[n],BLU)*colval(cbuffer[n],BLU));
576                  addcolor(csum2, ctmp);
577                  ns++;
578          }
# Line 787 | Line 779 | filter_frame(void)                     /* interpolation, motion-blur, an
779                  scalecolor(cbuffer[n], w);
780              }
781                                          /* motion blur if requested */
782 <        if (outbuffer != cbuffer) {
782 >        if (mblur > .02) {
783                  int     xs, ys, xl, yl;
784                  int     rise, run;
785                  long    rise2, run2;
786                  int     n2;
787                  int     cnt;
796 fprintf(stderr, "outbuffer=0x%lx, cbuffer=0x%lx, cprev=0x%lx\n",
797 (size_t)outbuffer, (size_t)cbuffer, (size_t)cprev);
788                                          /* sum in motion streaks */
789 <                memset(outbuffer, 0, sizeof(COLOR)*hres*vres);
790 <                memset(wbuffer, 0, sizeof(float)*hres*vres);
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);
# Line 812 | Line 802 | fprintf(stderr, "outbuffer=0x%lx, cbuffer=0x%lx, cprev
802                                  wbuffer[n] += 1.;
803                                  continue;
804                          }
805 <                        xl = x; yl = y;
805 >                        xl = x - run/4;
806 >                        yl = y - rise/4;
807                          if (run < 0) { xs = -1; run = -run; }
808                          else xs = 1;
809                          if (rise < 0) { ys = -1; rise = -rise; }
# Line 863 | Line 854 | fprintf(stderr, "outbuffer=0x%lx, cbuffer=0x%lx, cprev
854                          }
855                      }
856                                          /* compute final results */
857 <                for (n = hres*vres; n--; )
858 <                        if (wbuffer[n] > 1.02) {
859 <                                w = 1./wbuffer[n];
860 <                                scalecolor(outbuffer[n], w);
861 <                        } else if (wbuffer[n] < 0.98) {
862 <                                w = 1.-wbuffer[n];
863 <                                copycolor(cval, cprev[n]);
864 <                                scalecolor(cval, w);
865 <                                addcolor(outbuffer[n], cval);
866 <                        }
857 >                for (n = hres*vres; 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          }
877                                        /* adjust exposure */
878        for (n = ((expval < 0.98) | (expval > 1.02))*hres*vres; n--; )
879                scalecolor(outbuffer[n], expval);
868          /*
869             for (n = hres*vres; n--; )
870                     if (!sbuffer[n])
# Line 1009 | Line 997 | free_frame(void)                       /* free frame allocation */
997   {
998          if (cbuffer == NULL)
999                  return;
1012        if (outbuffer != cbuffer)
1013                free((void *)outbuffer);
1014        outbuffer = NULL;
1000          free((void *)cbuffer); cbuffer = NULL;
1001          free((void *)zbuffer); zbuffer = NULL;
1002          free((void *)obuffer); obuffer = NULL;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines