ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/rt/p_func.c
Revision: 2.13
Committed: Wed Jan 17 17:35:35 2024 UTC (3 months, 2 weeks ago) by greg
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Changes since 2.12: +2 -3 lines
Log Message:
perf(rvu, rpict, rtrace, rcontrib): Better rendering of spectral primitives in RGB mode

File Contents

# Content
1 #ifndef lint
2 static const char RCSid[] = "$Id: p_func.c,v 2.12 2024/01/07 18:04:16 greg Exp $";
3 #endif
4 /*
5 * p_func.c - routine for procedural patterns.
6 */
7
8 #include "copyright.h"
9
10 #include "ray.h"
11 #include "func.h"
12 #include "random.h"
13 #include "rtotypes.h"
14
15 /*
16 * A procedural pattern can either be a brightness or a
17 * color function. A brightness function is given as:
18 *
19 * modifier brightfunc name
20 * 2+ bvarname filename xf
21 * 0
22 * n A1 A2 ..
23 *
24 * A color function is given as:
25 *
26 * modifier colorfunc name
27 * 4+ rvarname gvarname bvarname filename xf
28 * 0
29 * n A1 A2 ..
30 *
31 * A spectral function is given as:
32 *
33 * modifier specfunc name
34 * 2+ sfunc filename xf
35 * 0
36 * 2+ nmA nmB A3 ..
37 *
38 * Filename is the name of the file where the variable definitions
39 * can be found. The list of real arguments can be accessed by
40 * definitions in the file. The xf is a transformation
41 * to get from the original coordinates to the current coordinates.
42 * For the "specfunc" primitive, sfunc(nm) is a function of wavelength
43 * and must be defined from nmA to nmB, and should average to 1 over
44 * its range.
45 */
46
47
48 int
49 p_bfunc( /* compute brightness pattern */
50 OBJREC *m,
51 RAY *r
52 )
53 {
54 double bval;
55 MFUNC *mf;
56
57 if (m->oargs.nsargs < 2)
58 objerror(m, USER, "bad # arguments");
59 mf = getfunc(m, 1, 0x1, 0);
60 setfunc(m, r);
61 errno = 0;
62 bval = evalue(mf->ep[0]);
63 if ((errno == EDOM) | (errno == ERANGE)) {
64 objerror(m, WARNING, "compute error");
65 return(0);
66 }
67 scalescolor(r->pcol, bval);
68 return(0);
69 }
70
71
72 int
73 p_cfunc( /* compute color pattern */
74 OBJREC *m,
75 RAY *r
76 )
77 {
78 SCOLOR scval;
79 MFUNC *mf;
80
81 if (m->oargs.nsargs < 4)
82 objerror(m, USER, "bad # arguments");
83 mf = getfunc(m, 3, 0x7, 0);
84 setfunc(m, r);
85 errno = 0;
86 setscolor(scval, evalue(mf->ep[0]),
87 evalue(mf->ep[1]),
88 evalue(mf->ep[2]));
89 if ((errno == EDOM) | (errno == ERANGE)) {
90 objerror(m, WARNING, "compute error");
91 return(0);
92 }
93 smultscolor(r->pcol, scval);
94 return(0);
95 }
96
97
98 int
99 p_specfunc( /* compute spectral pattern */
100 OBJREC *m,
101 RAY *r
102 )
103 {
104 SCOLOR scsamp;
105 SCOLOR scval;
106 double wl, wlmin, wlmax, wlstep;
107 int ns, i;
108
109 if ((m->oargs.nsargs < 2) | (m->oargs.nfargs < 2))
110 objerror(m, USER, "bad # arguments");
111 if (m->oargs.farg[0] < m->oargs.farg[1]) {
112 wlmin = m->oargs.farg[0];
113 wlmax = m->oargs.farg[1];
114 } else {
115 wlmin = m->oargs.farg[1];
116 wlmax = m->oargs.farg[0];
117 }
118 if (wlmin < WLPART[3]) wlmin = WLPART[3];
119 if (wlmax > WLPART[0]) wlmax = WLPART[0];
120 if (wlmin >= wlmax) {
121 objerror(m, WARNING, "incompatible wavelength sampling");
122 return(0);
123 }
124 wlstep = (wlmax - wlmin)/(double)MAXCSAMP;
125 getfunc(m, 1, 0, 0);
126 setfunc(m, r);
127 errno = 0;
128 ns = (wlmax - wlmin)/wlstep + .1;
129 wl = wlmax - .5*wlstep;
130 for (i = ns; i-- > 0; wl -= wlstep) {
131 double ws = wl + 0.9*(.5-frandom())*wlstep;
132 scsamp[i] = funvalue(m->oargs.sarg[0], 1, &ws);
133 if ((errno == EDOM) | (errno == ERANGE)) {
134 objerror(m, WARNING, "compute error");
135 return(0);
136 }
137 }
138 convertscolorcol(scval, scsamp, ns, wlmin, wlmax);
139 smultscolor(r->pcol, scval);
140 return(0);
141 }