10 |
|
#include "rmatrix.h" |
11 |
|
#include "platform.h" |
12 |
|
|
13 |
< |
#ifndef MAXCOMP |
14 |
< |
#define MAXCOMP MAXCSAMP /* #components we support */ |
15 |
< |
#endif |
13 |
> |
/* Preferred BSDF component: |
14 |
> |
none, transmission, reflection front (normal side), reflection back */ |
15 |
> |
typedef enum {RMPnone=-1, RMPtrans=0, RMPreflF, RMPreflB} RMPref; |
16 |
|
|
17 |
|
/* Unary matrix operation(s) */ |
18 |
|
typedef struct { |
39 |
|
int |
40 |
|
loadmatrix(ROPMAT *rop) |
41 |
|
{ |
42 |
< |
if (rop->mtx != NULL) /* already loaded? */ |
42 |
> |
if (rop->mtx) /* already loaded? */ |
43 |
|
return(0); |
44 |
+ |
/* check for BSDF input */ |
45 |
+ |
if ((rop->inspec[0] != '!') & (rop->rmp != RMPnone)) { |
46 |
+ |
const char *sp = strrchr(rop->inspec, '.'); |
47 |
+ |
if (sp > rop->inspec && !strcasecmp(sp+1, "XML")) { |
48 |
+ |
CMATRIX *cm = rop->rmp==RMPtrans ? cm_loadBTDF(rop->inspec) : |
49 |
+ |
cm_loadBRDF(rop->inspec, rop->rmp==RMPreflB) ; |
50 |
+ |
if (!cm) |
51 |
+ |
return(-1); |
52 |
+ |
rop->mtx = rmx_from_cmatrix(cm); |
53 |
+ |
cm_free(cm); |
54 |
+ |
rop->mtx->dtype = DTascii; |
55 |
+ |
return(1); /* loaded BSDF XML file */ |
56 |
+ |
} |
57 |
+ |
} /* else load regular matrix */ |
58 |
+ |
rop->mtx = rmx_load(rop->inspec); |
59 |
|
|
60 |
< |
rop->mtx = rmx_load(rop->inspec, rop->rmp); |
46 |
< |
|
47 |
< |
return(!rop->mtx ? -1 : 1); |
60 |
> |
return(rop->mtx ? 1 : -1); |
61 |
|
} |
62 |
|
|
63 |
|
extern int checksymbolic(ROPMAT *rop); |
693 |
|
mres = loadop(mop+nmats); |
694 |
|
if (mres == NULL) |
695 |
|
return(1); |
696 |
< |
if (outfmt == DTfromHeader) /* check data type */ |
696 |
> |
if ((outfmt == DTfromHeader) & (mres->dtype < DTspec)) |
697 |
|
outfmt = mres->dtype; |
698 |
< |
if (outfmt == DTrgbe) { |
698 |
> |
if (outfmt == DTrgbe) { /* check data type */ |
699 |
|
if (mres->ncomp > 3) |
700 |
|
outfmt = DTspec; |
701 |
|
else if (mres->dtype == DTxyze) |
702 |
|
outfmt = DTxyze; |
703 |
|
} |
704 |
+ |
#if DTrmx_native==DTfloat |
705 |
+ |
if (outfmt == DTdouble) |
706 |
+ |
fprintf(stderr, |
707 |
+ |
"%s: warning - writing float result as double\n", |
708 |
+ |
argv[0]); |
709 |
+ |
#endif |
710 |
|
newheader("RADIANCE", stdout); /* write result to stdout */ |
711 |
|
printargs(argc, argv, stdout); |
712 |
|
return(rmx_write(mres, outfmt, stdout) ? 0 : 1); |