| 11 |
|
#include <string.h> |
| 12 |
|
|
| 13 |
|
#include "platform.h" |
| 14 |
< |
#include "mgflib/parser.h" |
| 14 |
> |
#include "mgf_parser.h" |
| 15 |
|
#include "color.h" |
| 16 |
|
#include "tmesh.h" |
| 17 |
|
|
| 26 |
|
FILE *matfp; /* material output file */ |
| 27 |
|
|
| 28 |
|
|
| 29 |
< |
int r_comment(int ac, char **av); |
| 30 |
< |
int r_cone(int ac, char **av); |
| 31 |
< |
int r_cyl(int ac, char **av); |
| 32 |
< |
int r_sph(int ac, char **av); |
| 33 |
< |
int r_ring(int ac, char **av); |
| 34 |
< |
int r_face(int ac, char **av); |
| 35 |
< |
int r_ies(int ac, char **av); |
| 36 |
< |
char * material(void); |
| 37 |
< |
char * object(void); |
| 38 |
< |
char * addarg(char *op, char *arg); |
| 39 |
< |
void do_tri(char *mat, C_VERTEX *cv1, C_VERTEX *cv2, C_VERTEX *cv3, int iv); |
| 40 |
< |
void cvtcolor(COLOR radrgb, register C_COLOR *ciec, double intensity); |
| 29 |
> |
extern int r_comment(int ac, char **av); |
| 30 |
> |
extern int r_cone(int ac, char **av); |
| 31 |
> |
extern int r_cyl(int ac, char **av); |
| 32 |
> |
extern int r_sph(int ac, char **av); |
| 33 |
> |
extern int r_ring(int ac, char **av); |
| 34 |
> |
extern int r_face(int ac, char **av); |
| 35 |
> |
extern int r_ies(int ac, char **av); |
| 36 |
> |
extern void putsided(char *mname); |
| 37 |
> |
extern char * material(void); |
| 38 |
> |
extern char * object(void); |
| 39 |
> |
extern char * addarg(char *op, char *arg); |
| 40 |
> |
extern void do_tri(char *mat, C_VERTEX *cv1, C_VERTEX *cv2, C_VERTEX *cv3, int iv); |
| 41 |
> |
extern void cvtcolor(COLOR radrgb, register C_COLOR *ciec, double intensity); |
| 42 |
|
|
| 43 |
|
|
| 44 |
|
int |
| 475 |
|
bcoor[i][1] = n2[i]; |
| 476 |
|
bcoor[i][2] = n3[i]; |
| 477 |
|
} |
| 478 |
< |
put_baryc(&bvecs, bcoor, 3); |
| 478 |
> |
fput_baryc(&bvecs, bcoor, 3, stdout); |
| 479 |
|
/* put out triangle */ |
| 480 |
|
printf("\nT-nor polygon %st%d\n", object(), ++ntris); |
| 481 |
|
printf("0\n0\n9\n"); |
| 485 |
|
} |
| 486 |
|
|
| 487 |
|
|
| 488 |
+ |
void |
| 489 |
+ |
putsided(char *mname) /* print out mixfunc for sided material */ |
| 490 |
+ |
{ |
| 491 |
+ |
fprintf(matfp, "\nvoid mixfunc %s\n", mname); |
| 492 |
+ |
fprintf(matfp, "4 %s void if(Rdot,1,0) .\n0\n0\n", mname); |
| 493 |
+ |
} |
| 494 |
+ |
|
| 495 |
+ |
|
| 496 |
|
char * |
| 497 |
|
material(void) /* get (and print) current material */ |
| 498 |
|
{ |
| 555 |
|
} |
| 556 |
|
/* check for trans */ |
| 557 |
|
if (c_cmaterial->td > .01 || c_cmaterial->ts > .01) { |
| 558 |
< |
double ts, a5, a6; |
| 550 |
< |
|
| 551 |
< |
if (c_cmaterial->sided) { |
| 552 |
< |
ts = sqrt(c_cmaterial->ts); /* approximate */ |
| 553 |
< |
a5 = .5; |
| 554 |
< |
} else { |
| 555 |
< |
ts = c_cmaterial->ts; |
| 556 |
< |
a5 = 1.; |
| 557 |
< |
} |
| 558 |
> |
double a5, a6; |
| 559 |
|
/* average colors */ |
| 560 |
< |
d = c_cmaterial->rd + c_cmaterial->td + ts; |
| 560 |
> |
d = c_cmaterial->rd + c_cmaterial->td + c_cmaterial->ts; |
| 561 |
|
cvtcolor(radrgb, &c_cmaterial->rd_c, c_cmaterial->rd/d); |
| 562 |
|
cvtcolor(c2, &c_cmaterial->td_c, c_cmaterial->td/d); |
| 563 |
|
addcolor(radrgb, c2); |
| 564 |
< |
cvtcolor(c2, &c_cmaterial->ts_c, ts/d); |
| 564 |
> |
cvtcolor(c2, &c_cmaterial->ts_c, c_cmaterial->ts/d); |
| 565 |
|
addcolor(radrgb, c2); |
| 566 |
< |
if (c_cmaterial->rs + ts > .0001) |
| 566 |
> |
if (c_cmaterial->rs + c_cmaterial->ts > .0001) |
| 567 |
|
a5 = (c_cmaterial->rs*c_cmaterial->rs_a + |
| 568 |
< |
ts*a5*c_cmaterial->ts_a) / |
| 569 |
< |
(c_cmaterial->rs + ts); |
| 570 |
< |
a6 = (c_cmaterial->td + ts) / |
| 571 |
< |
(c_cmaterial->rd + c_cmaterial->td + ts); |
| 568 |
> |
c_cmaterial->ts*c_cmaterial->ts_a) / |
| 569 |
> |
(c_cmaterial->rs + c_cmaterial->ts); |
| 570 |
> |
a6 = (c_cmaterial->td + c_cmaterial->ts) / |
| 571 |
> |
(c_cmaterial->rd + c_cmaterial->td + c_cmaterial->ts); |
| 572 |
|
if (a6 < .999) |
| 573 |
|
d = c_cmaterial->rd/(1. - c_cmaterial->rs)/(1. - a6); |
| 574 |
|
else |
| 575 |
< |
d = c_cmaterial->td + ts; |
| 575 |
> |
d = c_cmaterial->td + c_cmaterial->ts; |
| 576 |
|
scalecolor(radrgb, d); |
| 577 |
|
fprintf(matfp, "\nvoid trans %s\n0\n0\n", mname); |
| 578 |
|
fprintf(matfp, "7 %f %f %f\n", colval(radrgb,RED), |
| 579 |
|
colval(radrgb,GRN), colval(radrgb,BLU)); |
| 580 |
|
fprintf(matfp, "\t%f %f %f %f\n", c_cmaterial->rs, a5, a6, |
| 581 |
< |
ts/(ts + c_cmaterial->td)); |
| 581 |
> |
c_cmaterial->ts/(c_cmaterial->ts + c_cmaterial->td)); |
| 582 |
> |
if (c_cmaterial->sided) |
| 583 |
> |
putsided(mname); |
| 584 |
|
return(mname); |
| 585 |
|
} |
| 586 |
|
/* check for plastic */ |
| 587 |
< |
if (c_cmaterial->rs < .1) { |
| 587 |
> |
if (c_cmaterial->rs < .08 && (c_cmaterial->rs < .1*c_cmaterial->rd || |
| 588 |
> |
c_isgrey(&c_cmaterial->rs_c))) { |
| 589 |
|
cvtcolor(radrgb, &c_cmaterial->rd_c, |
| 590 |
|
c_cmaterial->rd/(1.-c_cmaterial->rs)); |
| 591 |
|
fprintf(matfp, "\nvoid plastic %s\n0\n0\n", mname); |
| 592 |
|
fprintf(matfp, "5 %f %f %f %f %f\n", colval(radrgb,RED), |
| 593 |
|
colval(radrgb,GRN), colval(radrgb,BLU), |
| 594 |
|
c_cmaterial->rs, c_cmaterial->rs_a); |
| 595 |
+ |
if (c_cmaterial->sided) |
| 596 |
+ |
putsided(mname); |
| 597 |
|
return(mname); |
| 598 |
|
} |
| 599 |
|
/* else it's metal */ |
| 606 |
|
colval(radrgb,GRN), colval(radrgb,BLU), |
| 607 |
|
c_cmaterial->rs/(c_cmaterial->rd + c_cmaterial->rs), |
| 608 |
|
c_cmaterial->rs_a); |
| 609 |
+ |
if (c_cmaterial->sided) |
| 610 |
+ |
putsided(mname); |
| 611 |
|
return(mname); |
| 612 |
|
} |
| 613 |
|
|