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 |
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 |
|
|