53 |
|
|
54 |
|
static RAY thisray; /* for our convenience */ |
55 |
|
|
56 |
< |
typedef void putf_t(double v); |
56 |
> |
typedef void putf_t(RREAL *v, int n); |
57 |
|
static putf_t puta, putd, putf; |
58 |
|
|
59 |
|
typedef void oputf_t(RAY *r); |
114 |
|
) |
115 |
|
{ |
116 |
|
unsigned long vcount = (hresolu > 1) ? (unsigned long)hresolu*vresolu |
117 |
< |
: vresolu; |
118 |
< |
long nextflush = hresolu; |
117 |
> |
: (unsigned long)vresolu; |
118 |
> |
long nextflush = (vresolu > 0) & (hresolu > 1) ? 0 : hresolu; |
119 |
|
FILE *fp; |
120 |
|
double d; |
121 |
|
FVECT orig, direc; |
160 |
|
|
161 |
|
d = normalize(direc); |
162 |
|
if (d == 0.0) { /* zero ==> flush */ |
163 |
– |
if (nproc > 1 && ray_fifo_flush() < 0) |
164 |
– |
error(USER, "lost children"); |
165 |
– |
bogusray(); |
163 |
|
if (--nextflush <= 0 || !vcount) { |
164 |
+ |
if (nproc > 1 && ray_fifo_flush() < 0) |
165 |
+ |
error(USER, "lost children"); |
166 |
+ |
bogusray(); |
167 |
|
fflush(stdout); |
168 |
< |
nextflush = hresolu; |
169 |
< |
} |
168 |
> |
nextflush = (vresolu > 0) & (hresolu > 1) ? 0 : |
169 |
> |
hresolu; |
170 |
> |
} else |
171 |
> |
bogusray(); |
172 |
|
} else { /* compute and print */ |
173 |
|
rtcompute(orig, direc, lim_dist ? d : 0.0); |
174 |
|
/* flush if time */ |
410 |
|
} |
411 |
|
break; |
412 |
|
case 'f': /* binary float */ |
413 |
< |
if (fread((char *)vf, sizeof(float), 3, fp) != 3) |
413 |
> |
if (getbinary(vf, sizeof(float), 3, fp) != 3) |
414 |
|
return(-1); |
415 |
|
VCOPY(vec, vf); |
416 |
|
break; |
417 |
|
case 'd': /* binary double */ |
418 |
< |
if (fread((char *)vd, sizeof(double), 3, fp) != 3) |
418 |
> |
if (getbinary(vd, sizeof(double), 3, fp) != 3) |
419 |
|
return(-1); |
420 |
|
VCOPY(vec, vd); |
421 |
|
break; |
494 |
|
RAY *r |
495 |
|
) |
496 |
|
{ |
497 |
< |
(*putreal)(r->rorg[0]); |
496 |
< |
(*putreal)(r->rorg[1]); |
497 |
< |
(*putreal)(r->rorg[2]); |
497 |
> |
(*putreal)(r->rorg, 3); |
498 |
|
} |
499 |
|
|
500 |
|
|
503 |
|
RAY *r |
504 |
|
) |
505 |
|
{ |
506 |
< |
(*putreal)(r->rdir[0]); |
507 |
< |
(*putreal)(r->rdir[1]); |
508 |
< |
(*putreal)(r->rdir[2]); |
506 |
> |
(*putreal)(r->rdir, 3); |
507 |
|
} |
508 |
|
|
509 |
|
|
512 |
|
RAY *r |
513 |
|
) |
514 |
|
{ |
515 |
+ |
RREAL cval[3]; |
516 |
+ |
|
517 |
|
if (outform == 'c') { |
518 |
|
COLR cout; |
519 |
|
setcolr(cout, colval(r->rcol,RED), |
520 |
|
colval(r->rcol,GRN), |
521 |
|
colval(r->rcol,BLU)); |
522 |
< |
fwrite((char *)cout, sizeof(cout), 1, stdout); |
522 |
> |
putbinary(cout, sizeof(cout), 1, stdout); |
523 |
|
return; |
524 |
|
} |
525 |
< |
(*putreal)(colval(r->rcol,RED)); |
526 |
< |
(*putreal)(colval(r->rcol,GRN)); |
527 |
< |
(*putreal)(colval(r->rcol,BLU)); |
525 |
> |
cval[0] = colval(r->rcol,RED); |
526 |
> |
cval[1] = colval(r->rcol,GRN); |
527 |
> |
cval[2] = colval(r->rcol,BLU); |
528 |
> |
(*putreal)(cval, 3); |
529 |
|
} |
530 |
|
|
531 |
|
|
534 |
|
RAY *r |
535 |
|
) |
536 |
|
{ |
537 |
< |
double contr[3]; |
537 |
> |
RREAL contr[3]; |
538 |
|
|
539 |
|
raycontrib(contr, r, PRIMARY); |
540 |
|
multcolor(contr, r->rcol); |
541 |
< |
(*putreal)(contr[RED]); |
541 |
< |
(*putreal)(contr[GRN]); |
542 |
< |
(*putreal)(contr[BLU]); |
541 |
> |
(*putreal)(contr, 3); |
542 |
|
} |
543 |
|
|
544 |
|
|
547 |
|
RAY *r |
548 |
|
) |
549 |
|
{ |
550 |
< |
(*putreal)(r->rt); |
550 |
> |
(*putreal)(&r->rt, 1); |
551 |
|
} |
552 |
|
|
553 |
|
|
556 |
|
RAY *r |
557 |
|
) |
558 |
|
{ |
559 |
< |
(*putreal)(r->rot); |
559 |
> |
(*putreal)(&r->rot, 1); |
560 |
|
} |
561 |
|
|
562 |
|
|
565 |
|
RAY *r |
566 |
|
) |
567 |
|
{ |
568 |
< |
(*putreal)(r->uv[0]); |
570 |
< |
(*putreal)(r->uv[1]); |
568 |
> |
(*putreal)(r->uv, 2); |
569 |
|
} |
570 |
|
|
571 |
|
|
572 |
+ |
static RREAL vdummy[3] = {0.0, 0.0, 0.0}; |
573 |
+ |
|
574 |
+ |
|
575 |
|
static void |
576 |
|
oputp( /* print point */ |
577 |
|
RAY *r |
578 |
|
) |
579 |
|
{ |
580 |
< |
if (r->rot < FHUGE) { |
581 |
< |
(*putreal)(r->rop[0]); |
582 |
< |
(*putreal)(r->rop[1]); |
583 |
< |
(*putreal)(r->rop[2]); |
583 |
< |
} else { |
584 |
< |
(*putreal)(0.0); |
585 |
< |
(*putreal)(0.0); |
586 |
< |
(*putreal)(0.0); |
587 |
< |
} |
580 |
> |
if (r->rot < FHUGE) |
581 |
> |
(*putreal)(r->rop, 3); |
582 |
> |
else |
583 |
> |
(*putreal)(vdummy, 3); |
584 |
|
} |
585 |
|
|
586 |
|
|
589 |
|
RAY *r |
590 |
|
) |
591 |
|
{ |
592 |
< |
if (r->rot < FHUGE) { |
593 |
< |
(*putreal)(r->ron[0]); |
594 |
< |
(*putreal)(r->ron[1]); |
595 |
< |
(*putreal)(r->ron[2]); |
600 |
< |
} else { |
601 |
< |
(*putreal)(0.0); |
602 |
< |
(*putreal)(0.0); |
603 |
< |
(*putreal)(0.0); |
604 |
< |
} |
592 |
> |
if (r->rot < FHUGE) |
593 |
> |
(*putreal)(r->ron, 3); |
594 |
> |
else |
595 |
> |
(*putreal)(vdummy, 3); |
596 |
|
} |
597 |
|
|
598 |
|
|
604 |
|
FVECT pnorm; |
605 |
|
|
606 |
|
if (r->rot >= FHUGE) { |
607 |
< |
(*putreal)(0.0); |
617 |
< |
(*putreal)(0.0); |
618 |
< |
(*putreal)(0.0); |
607 |
> |
(*putreal)(vdummy, 3); |
608 |
|
return; |
609 |
|
} |
610 |
|
raynormal(pnorm, r); |
611 |
< |
(*putreal)(pnorm[0]); |
623 |
< |
(*putreal)(pnorm[1]); |
624 |
< |
(*putreal)(pnorm[2]); |
611 |
> |
(*putreal)(pnorm, 3); |
612 |
|
} |
613 |
|
|
614 |
|
|
630 |
|
RAY *r |
631 |
|
) |
632 |
|
{ |
633 |
< |
(*putreal)(r->rweight); |
633 |
> |
RREAL rwt = r->rweight; |
634 |
> |
|
635 |
> |
(*putreal)(&rwt, 1); |
636 |
|
} |
637 |
|
|
638 |
|
|
641 |
|
RAY *r |
642 |
|
) |
643 |
|
{ |
644 |
< |
double contr[3]; |
644 |
> |
RREAL contr[3]; |
645 |
> |
/* shadow ray not on source? */ |
646 |
> |
if (r->rsrc >= 0 && source[r->rsrc].so != r->ro) |
647 |
> |
setcolor(contr, 0.0, 0.0, 0.0); |
648 |
> |
else |
649 |
> |
raycontrib(contr, r, PRIMARY); |
650 |
|
|
651 |
< |
raycontrib(contr, r, PRIMARY); |
658 |
< |
(*putreal)(contr[RED]); |
659 |
< |
(*putreal)(contr[GRN]); |
660 |
< |
(*putreal)(contr[BLU]); |
651 |
> |
(*putreal)(contr, 3); |
652 |
|
} |
653 |
|
|
654 |
|
|
696 |
|
|
697 |
|
|
698 |
|
static void |
699 |
< |
puta( /* print ascii value */ |
700 |
< |
double v |
699 |
> |
puta( /* print ascii value(s) */ |
700 |
> |
RREAL *v, int n |
701 |
|
) |
702 |
|
{ |
703 |
< |
printf("%e\t", v); |
703 |
> |
if (n == 3) { |
704 |
> |
printf("%e\t%e\t%e\t", v[0], v[1], v[2]); |
705 |
> |
return; |
706 |
> |
} |
707 |
> |
while (n--) |
708 |
> |
printf("%e\t", *v++); |
709 |
|
} |
710 |
|
|
711 |
|
|
712 |
|
static void |
713 |
< |
putd(v) /* print binary double */ |
718 |
< |
double v; |
713 |
> |
putd(RREAL *v, int n) /* print binary double(s) */ |
714 |
|
{ |
715 |
< |
fwrite((char *)&v, sizeof(v), 1, stdout); |
715 |
> |
#ifdef SMLFLT |
716 |
> |
double da[3]; |
717 |
> |
int i; |
718 |
> |
|
719 |
> |
if (n > 3) |
720 |
> |
error(INTERNAL, "code error in putd()"); |
721 |
> |
for (i = n; i--; ) |
722 |
> |
da[i] = v[i]; |
723 |
> |
putbinary(da, sizeof(double), n, stdout); |
724 |
> |
#else |
725 |
> |
putbinary(v, sizeof(RREAL), n, stdout); |
726 |
> |
#endif |
727 |
|
} |
728 |
|
|
729 |
|
|
730 |
|
static void |
731 |
< |
putf(v) /* print binary float */ |
726 |
< |
double v; |
731 |
> |
putf(RREAL *v, int n) /* print binary float(s) */ |
732 |
|
{ |
733 |
< |
float f = v; |
733 |
> |
#ifndef SMLFLT |
734 |
> |
float fa[3]; |
735 |
> |
int i; |
736 |
|
|
737 |
< |
fwrite((char *)&f, sizeof(f), 1, stdout); |
737 |
> |
if (n > 3) |
738 |
> |
error(INTERNAL, "code error in putf()"); |
739 |
> |
for (i = n; i--; ) |
740 |
> |
fa[i] = v[i]; |
741 |
> |
putbinary(fa, sizeof(float), n, stdout); |
742 |
> |
#else |
743 |
> |
putbinary(v, sizeof(RREAL), n, stdout); |
744 |
> |
#endif |
745 |
|
} |