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 |
|
*/ |
367 |
|
continue; |
368 |
|
} |
369 |
|
if (!sample_here(x, y)) { /* just cast */ |
370 |
< |
rayorigin(&ir, NULL, PRIMARY, 1.0); |
370 |
> |
rayorigin(&ir, PRIMARY, NULL, NULL); |
371 |
|
if (!localhit(&ir, &thescene)) { |
372 |
|
if (ir.ro != &Aftplane) |
373 |
|
sourcehit(&ir); |
385 |
|
} |
386 |
|
if (nprocs > 1) { /* get sample */ |
387 |
|
int rval; |
388 |
< |
rayorigin(&ir, NULL, PRIMARY, 1.0); |
388 |
> |
rayorigin(&ir, PRIMARY, NULL, NULL); |
389 |
|
ir.rno = n; |
390 |
|
rval = ray_pqueue(&ir); |
391 |
|
if (!rval) |
658 |
|
init_frame(void) /* render base (low quality) frame */ |
659 |
|
{ |
660 |
|
int restart; |
661 |
– |
|
661 |
|
/* allocate/swap buffers */ |
662 |
|
next_frame(); |
663 |
|
/* check rendering status */ |
666 |
|
restart = -1; |
667 |
|
if (restart > 0) { |
668 |
|
if (nprocs > 1) |
669 |
< |
ray_pdone(1); |
669 |
> |
ray_pdone(0); |
670 |
|
else |
671 |
< |
ray_done(1); |
671 |
> |
ray_done(0); |
672 |
|
} |
673 |
|
/* post low quality parameters */ |
674 |
|
if (curparams != &lorendparams) |
744 |
|
printf("\tFiltering frame\n"); |
745 |
|
fflush(stdout); |
746 |
|
} |
747 |
< |
/* normalize samples */ |
748 |
< |
for (y = vres; y--; ) { |
749 |
< |
for (x = hres; x--; ) { |
750 |
< |
n = fndx(x, y); |
751 |
< |
if (sbuffer[n] <= 1) |
747 |
> |
/* normalize samples */ |
748 |
> |
for (y = vres; y--; ) |
749 |
> |
for (x = hres; x--; ) { |
750 |
> |
n = fndx(x, y); |
751 |
> |
if (sbuffer[n] <= 1) |
752 |
> |
continue; |
753 |
> |
w = 1.0/(double)sbuffer[n]; |
754 |
> |
scalecolor(cbuffer[n], w); |
755 |
> |
} |
756 |
> |
/* interpolate samples */ |
757 |
> |
for (y = vres; y--; ) |
758 |
> |
for (x = hres; x--; ) { |
759 |
> |
n = fndx(x, y); |
760 |
> |
if (sbuffer[n]) |
761 |
> |
continue; |
762 |
> |
nc = getclosest(neigh, NPINTERP, x, y); |
763 |
> |
setcolor(cbuffer[n], 0., 0., 0.); |
764 |
> |
if (nc <= 0) { /* no acceptable neighbors */ |
765 |
> |
if (y < vres-1) |
766 |
> |
nc = fndx(x, y+1); |
767 |
> |
else if (x < hres-1) |
768 |
> |
nc = fndx(x+1, y); |
769 |
> |
else |
770 |
|
continue; |
771 |
< |
w = 1.0/(double)sbuffer[n]; |
772 |
< |
scalecolor(cbuffer[n], w); |
771 |
> |
copycolor(cbuffer[n], cbuffer[nc]); |
772 |
> |
continue; |
773 |
|
} |
774 |
< |
} |
775 |
< |
/* interpolate samples */ |
776 |
< |
for (y = vres; y--; ) { |
777 |
< |
for (x = hres; x--; ) { |
778 |
< |
n = fndx(x, y); |
779 |
< |
if (sbuffer[n]) |
780 |
< |
continue; |
781 |
< |
nc = getclosest(neigh, NPINTERP, x, y); |
765 |
< |
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 |
< |
} |
774 |
> |
wsum = 0.; |
775 |
> |
while (nc-- > 0) { |
776 |
> |
copycolor(cval, cbuffer[neigh[nc]]); |
777 |
> |
w = sample_wt((neigh[nc]%hres) - x, |
778 |
> |
(neigh[nc]/hres) - y); |
779 |
> |
scalecolor(cval, w); |
780 |
> |
addcolor(cbuffer[n], cval); |
781 |
> |
wsum += w; |
782 |
|
} |
783 |
< |
} |
784 |
< |
/* motion blur if requested */ |
783 |
> |
w = 1.0/wsum; |
784 |
> |
scalecolor(cbuffer[n], w); |
785 |
> |
} |
786 |
> |
/* motion blur if requested */ |
787 |
|
if (mblur > .02) { |
788 |
< |
int xs, ys, xl, yl; |
789 |
< |
int rise, run; |
790 |
< |
long rise2, run2; |
791 |
< |
int n2; |
792 |
< |
int cnt; |
793 |
< |
/* sum in motion streaks */ |
794 |
< |
memset(outbuffer, '\0', sizeof(COLOR)*hres*vres); |
795 |
< |
memset(wbuffer, '\0', sizeof(float)*hres*vres); |
796 |
< |
for (y = vres; y--; ) { |
797 |
< |
for (x = hres; x--; ) { |
788 |
> |
int xs, ys, xl, yl; |
789 |
> |
int rise, run; |
790 |
> |
long rise2, run2; |
791 |
> |
int n2; |
792 |
> |
int cnt; |
793 |
> |
/* sum in motion streaks */ |
794 |
> |
memset(outbuffer, '\0', sizeof(COLOR)*hres*vres); |
795 |
> |
memset(wbuffer, '\0', sizeof(float)*hres*vres); |
796 |
> |
for (y = vres; y--; ) |
797 |
> |
for (x = hres; x--; ) { |
798 |
|
n = fndx(x, y); |
799 |
|
if (xmbuffer[n] == MO_UNK) { |
800 |
|
run = rise = 0; |
815 |
|
else ys = 1; |
816 |
|
rise2 = run2 = 0L; |
817 |
|
if (rise > run) { |
818 |
< |
cnt = rise + 1; |
819 |
< |
w = 1./cnt; |
820 |
< |
copycolor(cval, cbuffer[n]); |
821 |
< |
scalecolor(cval, w); |
822 |
< |
while (cnt) { |
823 |
< |
if (rise2 >= run2) { |
824 |
< |
if ((xl >= 0) & (xl < hres) & |
818 |
> |
cnt = rise + 1; |
819 |
> |
w = 1./cnt; |
820 |
> |
copycolor(cval, cbuffer[n]); |
821 |
> |
scalecolor(cval, w); |
822 |
> |
while (cnt) |
823 |
> |
if (rise2 >= run2) { |
824 |
> |
if ((xl >= 0) & (xl < hres) & |
825 |
|
(yl >= 0) & (yl < vres)) { |
826 |
< |
n2 = fndx(xl, yl); |
827 |
< |
addcolor(outbuffer[n2], cval); |
828 |
< |
wbuffer[n2] += w; |
829 |
< |
} |
830 |
< |
yl += ys; |
831 |
< |
run2 += run; |
832 |
< |
cnt--; |
833 |
< |
} else { |
834 |
< |
xl += xs; |
835 |
< |
rise2 += rise; |
836 |
< |
} |
837 |
< |
} |
826 |
> |
n2 = fndx(xl, yl); |
827 |
> |
addcolor(outbuffer[n2], |
828 |
> |
cval); |
829 |
> |
wbuffer[n2] += w; |
830 |
> |
} |
831 |
> |
yl += ys; |
832 |
> |
run2 += run; |
833 |
> |
cnt--; |
834 |
> |
} else { |
835 |
> |
xl += xs; |
836 |
> |
rise2 += rise; |
837 |
> |
} |
838 |
|
} else { |
839 |
|
cnt = run + 1; |
840 |
|
w = 1./cnt; |
841 |
|
copycolor(cval, cbuffer[n]); |
842 |
|
scalecolor(cval, w); |
843 |
< |
while (cnt) { |
844 |
< |
if (run2 >= rise2) { |
845 |
< |
if ((xl >= 0) & (xl < hres) & |
843 |
> |
while (cnt) |
844 |
> |
if (run2 >= rise2) { |
845 |
> |
if ((xl >= 0) & (xl < hres) & |
846 |
|
(yl >= 0) & (yl < vres)) { |
847 |
< |
n2 = fndx(xl, yl); |
848 |
< |
addcolor(outbuffer[n2], |
849 |
< |
cval); |
850 |
< |
wbuffer[n2] += w; |
847 |
> |
n2 = fndx(xl, yl); |
848 |
> |
addcolor(outbuffer[n2], |
849 |
> |
cval); |
850 |
> |
wbuffer[n2] += w; |
851 |
> |
} |
852 |
> |
xl += xs; |
853 |
> |
rise2 += rise; |
854 |
> |
cnt--; |
855 |
> |
} else { |
856 |
> |
yl += ys; |
857 |
> |
run2 += run; |
858 |
|
} |
847 |
– |
xl += xs; |
848 |
– |
rise2 += rise; |
849 |
– |
cnt--; |
850 |
– |
} else { |
851 |
– |
yl += ys; |
852 |
– |
run2 += run; |
853 |
– |
} |
854 |
– |
} |
859 |
|
} |
860 |
< |
} |
861 |
< |
/* compute final results */ |
862 |
< |
for (y = vres; y--; ) { |
863 |
< |
for (x = hres; x--; ) { |
864 |
< |
n = fndx(x, y); |
865 |
< |
if (wbuffer[n] <= FTINY) |
866 |
< |
continue; |
867 |
< |
w = 1./wbuffer[n]; |
868 |
< |
scalecolor(outbuffer[n], w); |
869 |
< |
} |
870 |
< |
} |
871 |
< |
} |
868 |
< |
} else { |
869 |
< |
for (n = hres*vres; n--; ) { |
860 |
> |
} |
861 |
> |
/* compute final results */ |
862 |
> |
for (y = vres; y--; ) |
863 |
> |
for (x = hres; x--; ) { |
864 |
> |
n = fndx(x, y); |
865 |
> |
if (wbuffer[n] <= FTINY) |
866 |
> |
continue; |
867 |
> |
w = 1./wbuffer[n]; |
868 |
> |
scalecolor(outbuffer[n], w); |
869 |
> |
} |
870 |
> |
} else |
871 |
> |
for (n = hres*vres; n--; ) |
872 |
|
copycolor(outbuffer[n], cbuffer[n]); |
871 |
– |
} |
872 |
– |
} |
873 |
|
/* |
874 |
|
for (n = hres*vres; n--; ) |
875 |
< |
if (!sbuffer[n]) |
876 |
< |
setcolor(outbuffer[n], 0., 0., 0.); |
875 |
> |
if (!sbuffer[n]) |
876 |
> |
setcolor(outbuffer[n], 0., 0., 0.); |
877 |
|
*/ |
878 |
|
/* adjust exposure */ |
879 |
|
if ((expval < 0.99) | (expval > 1.01)) |
880 |
|
for (n = hres*vres; n--; ) |
881 |
|
scalecolor(outbuffer[n], expval); |
882 |
< |
return; |
882 |
> |
#if 0 |
883 |
|
{ |
884 |
|
float *sbuf = (float *)malloc(sizeof(float)*hres*vres); |
885 |
|
char fnm[256]; |
890 |
|
write_map(sbuf, fnm); |
891 |
|
free((void *)sbuf); |
892 |
|
} |
893 |
+ |
#endif |
894 |
|
} |
895 |
|
|
896 |
|
|