ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/doc/filefmts.ms
Revision: 1.1
Committed: Thu Nov 10 18:05:39 2022 UTC (18 months, 1 week ago) by greg
Content type: application/x-troff-ms
Branch: MAIN
Log Message:
docs(filefmts): recovered file formats document from Randolph Fritz (thanks!!)

File Contents

# Content
1 .EQ
2 delim @@
3 .EN
4 .SH 1
5 \f[BI]Radiance\f[B] File Formats
6 .pdfhref O 1 "Radiance File Formats"
7 .pdfhref M "radiance-file-formats"
8 .LP
9 This chapter discusses the standard file formats specific to
10 \f[I]Radiance\f[R], and gives their internal structure, with pointers to
11 routines for reading and writing them.
12 The following file formats (listed with their conventional suffixes) are
13 covered:
14 .IP "\f[B]Scene Description (.rad suffix)\f[R]" 3
15 This is the main input file type, describing materials and geometry for
16 the rendering programs, and must be compiled into an octree by oconv
17 prior to ray-tracing.
18 It is an ASCII text format, and is often translated from a CAD
19 description, but may be created or edited by a text editor as well.
20 .RS 3
21 .RE
22 .IP "\f[B]Function File (.cal suffix)\f[R]" 3
23 Also a text format, these files describe mathematical patterns,
24 textures, and surface shapes.
25 In the case of patterns and textures, the functions serve as input
26 directly to the rendering programs.
27 In the case of surfaces, the functions serve as input to one of the
28 generator programs, \f[B]gensurf\f[R], \f[B]genrev\f[R] or
29 \f[B]genworm\f[R].
30 Additionally, \f[B]pcomb\f[R] may be used to perform math on
31 \f[I]Radiance\f[R] pictures and the \f[B]rcalc\f[R] utility may be used
32 in creative ways to manipulate data for scene generation and data
33 analysis.
34 .RS 3
35 .RE
36 .IP "\f[B]Data File (.dat suffix)\f[R]" 3
37 Another ASCII format, data files are used directly by the rendering
38 programs to interpolate values for luminaire photometry, among other
39 things.
40 .RS 3
41 .RE
42 .IP "\f[B]Font File (.fnt suffix)\f[R]" 3
43 A simple, polygonal font representation for rendering text patterns.
44 This ASCII format describes each character \[lq]glyph\[rq] as a sequence
45 of vertices in rectangular, integer coordinates ranging from 0 to 255.
46 .RS 3
47 .RE
48 .IP "\f[B]Octree (.oct suffix)\f[R]" 3
49 A binary data structure computed from one or more scene description
50 files by the oconv program.
51 It may contain frozen scene data in binary form, or merely references to
52 the original scene files.
53 .RS 3
54 .RE
55 .IP "\f[B]Picture (.hdr suffix)\f[R]" 3
56 A binary image file containing calibrated, real radiance values at each
57 pixel.
58 \f[I]Radiance\f[R] pictures may be displayed, analyzed, and converted to
59 other image formats.
60 .RS 3
61 .RE
62 .IP "\f[B]Z-buffer (.zbf suffix)\f[R]" 3
63 A binary file with the distances to each pixel in a corresponding
64 picture.
65 .RS 3
66 .RE
67 .IP "\f[B]Ambient File (.amb suffix)\f[R]" 3
68 A binary file used to store diffuse interreflection values, which are
69 shared between cooperating rendering processes running sequentially or
70 in parallel.
71 Since these values are view-independent, sharing this information across
72 multiple runs is highly economical.
73 .RS 3
74 .RE
75 .LP
76 We will discuss each of these formats in turn, giving examples and
77 pointers to routines in the source code for reading and writing them,
78 and the programs that use them.
79 In general, the ASCII text formats have no standard routines for writing
80 them, since they generally originate outside of \f[I]Radiance\f[R] or
81 are created with simple \f[I]printf(3)\f[R] statements.
82 Most binary file formats are machine and system independent, meaning
83 they can be moved safely from one place to another and
84 \f[I]Radiance\f[R] will still understand them (provided no unintentional
85 character translation takes place along the way)\**.
86 .FS
87 The single exception to this rule is the Z-buffer file, whose contents
88 are dictated by the floating point representation and byte order of the
89 originating machine.
90 This choice was made for economic reasons, and is rarely a problem.
91 .FE
92 Most binary files also include a standard ASCII header at their
93 beginning that may be read by the \f[B]getinfo\f[R] program.
94 This offers a convenient method for identifying the file contents when
95 the file name is ambiguous.
96 .SH 2
97 Scene Description Format (.rad suffix)
98 .pdfhref O 2 "Scene Description Format \(.rad suffix\)"
99 .pdfhref M "scene-description-format-.rad-suffix"
100 .LP
101 The semantics of the \f[I]Radiance\f[R] scene description format are
102 covered in the Reference Manual.
103 We will therefore focus on the file syntax and structure, which are
104 simple and straightforward.
105 In fact, some would say that the \f[I]Radiance\f[R] scene description
106 format is brain-dead, in the sense that it offers few language amenities
107 and requires the awkward counting of string and real arguments (not to
108 mention those non-existent integer arguments).
109 We have little to offer in its defense.
110 .PP
111 The truth is, the scene format was designed to grow with
112 \f[I]Radiance\f[R], and we wanted to keep it as simple as possible so as
113 to encourage others to write translators to and from it.
114 Specifically, we wanted to be able to read files using the
115 \f[I]scanf(3)\f[R] library function and write files using
116 \f[I]printf(3)\f[R].
117 Furthermore, we wanted everyone\[cq]s parsers to be stable over time,
118 which meant no primitive-specific syntax.
119 We also decided that a flat file structure was most practical, since
120 hierarchies are typically lost on the first translation, and sufficient
121 structure could be provided by the file system itself.
122 Since we did not intend text editing to be the primary input method, we
123 felt the effects of these programming decisions on the human readability
124 and writability of the format were less important.
125 .PP
126 Even so, the format is relatively easy to read and write once you get
127 used to it, and with the \f[I]Radiance\f[R] generator programs and
128 in-line command expansion, the text editor becomes a powerful modeling
129 tool in the hands of an experienced user.
130 Together with the need for editing material descriptions, our assumption
131 that users would rarely edit these files turned out to be mistaken.
132 Consequently, it is a good idea for all users to familiarize themselves
133 with the scene description format, awkward or not.
134 .SH 3
135 Basic File Structure
136 .pdfhref O 3 "Basic File Structure"
137 .pdfhref M "basic-file-structure"
138 .LP
139 There are four statement types in a scene description file: comments,
140 commands, primitives and aliases.
141 These may be interspersed in the file, and the only structural
142 requirement is that modifiers precede the primitives they modify.
143 .SH 4
144 Comments
145 .pdfhref O 4 "Comments"
146 .pdfhref M "comments"
147 .LP
148 The simplest statement type is a comment statement begins with a pound
149 sign (`#') and continues to the end of line:
150 .IP
151 .nf
152 \f[C]
153 # This is a comment.
154 \f[]
155 .fi
156 .SH 4
157 Commands
158 .pdfhref O 4 "Commands"
159 .pdfhref M "commands"
160 .LP
161 An in-line command, which begins with an exclamation mark (`!') and
162 continues to the end of line:
163 .IP
164 .nf
165 \f[C]
166 !xform -n chair1 -t 10 5 8 chair.rad
167 \f[]
168 .fi
169 .LP
170 The command is executed during file parsing, and its output is read as
171 more input.
172 Long commands may be continued on multiple lines by escaping the newline
173 character with a backslash (`\[rs]'):
174 .IP
175 .nf
176 \f[C]
177 !gensurf marble sink \[aq]15.5+x(theta(s),phi(t))\[aq] \[rs]
178 \[aq]10.5+y(theta(s),phi(t))\[aq] \[rs]
179 \[aq]30.75+z(theta(s),phi(t))\[aq] \[rs]
180 8 29 -f basin.cal -s
181 \f[]
182 .fi
183 .LP
184 Since the command is executed by the shell, pipes and other facilities
185 are available as well.
186 The following command creates a counter with a precisely cut hole for
187 the sink basin just given:
188 .IP
189 .nf
190 \f[C]
191 !( echo marble polygon sink_top 0 0 108 31 \[rs]
192 10.5 30.75 31 22 30.75 0 22 30.75 0 0 \[rs]
193 30.75 31 0 30.75 31 10.5 30.75 ; \[rs]
194 cnt 30 | rcalc \[rs]
195 -e \[aq]$1=15.5+x(theta(0),phi(1-$1/29))\[aq] \[rs]
196 -e \[aq]$2=10.5+y(theta(0),phi(1-$1/29))\[aq] \[rs]
197 -e \[aq]$3=30.75\[aq] -f basin.cal )
198 \f[]
199 .fi
200 .LP
201 Note in the above example that two commands are executed in sequence.
202 The first creates the counter perimeter, and the second cuts the hole.
203 The two commands are enclosed in parentheses, so if a final
204 transformation is added by \f[B]xform\f[R] with the \f[B]-c\f[R] option,
205 it will be applied to both commands, not just the last one.
206 .SH 4
207 Primitives
208 .pdfhref O 4 "Primitives"
209 .pdfhref M "primitives"
210 .LP
211 A primitive can be thought of as an indivisible unit of scene
212 information.
213 It can be a surface, material, pattern, texture or mixture.
214 The basic structure of a primitive is as follows:
215 .IP
216 .nf
217 \f[C]
218 modifier type identifier
219 n S1 S2 S3 ..Sn
220 0
221 m R1 R2 R3 ..Rm
222 \f[]
223 .fi
224 .LP
225 The \f[C]modifier\f[R] is the \f[C]identifier\f[R] of a previously
226 defined primitive, or \f[C]void\f[R] if no modifier is appropriate.
227 The type is one of the supported \f[I]Radiance\f[R] primitive keywords,
228 such as \f[I]polygon\f[R] or \f[I]plastic\f[R].
229 Following the \f[C]modifier\f[R], type and identifier are the string
230 arguments, preceded by the number of string arguments and separated by
231 white space.
232 If there are no string arguments, then 0 should be given for
233 \f[C]n\f[R].
234 The string arguments are followed by the integer arguments in the same
235 fashion.
236 (Since there are no \f[I]Radiance\f[R] primitives currently using
237 integer arguments, the count is always 0.)
238 Finally, the number of real arguments is given, followed by the real
239 arguments.
240 .PP
241 The location of the primitive in the scene description has no
242 importance, except that its modifier refers to the most recently defined
243 primitive with that identifier.
244 If no such modifier was defined, an error results.
245 In fact, \[lq]undefined modifier\[rq] is the most frequently reported
246 error when parsing an invalid scene description, since any random bit of
247 junk encountered where a statement is expected will be interpreted as a
248 modifier.
249 One final note about modifiers \[em] since surfaces never modify
250 anything, their identifiers are neither stored nor referenced in the
251 parser\[cq]s modifier list, and serve only for debugging purposes during
252 editing and rendering.
253 .PP
254 Within a primitive, white space serves only to separate words, and
255 multiple spaces, tabs, form feeds, returns, and newlines are all
256 considered as one separator.
257 Consequently, it is not possible for a string argument to contain any
258 white space, which is OK because no \f[I]Radiance\f[R] primitive needs
259 this.
260 .SH 4
261 Aliases
262 .pdfhref O 4 "Aliases"
263 .pdfhref M "aliases"
264 .LP
265 An alias simply associates a new modifier and identifier with a
266 previously defined primitive.
267 The syntax is as follows:
268 .IP
269 .nf
270 \f[C]
271 modifier alias new_identifier old_identifier
272 \f[]
273 .fi
274 .LP
275 The \f[C]old_identifier\f[R] should be associated with some modifier
276 primitive (i.e., non-surface) given earlier.
277 The \f[C]modifier\f[R], if different from the original, will be used
278 instead in later applications of \f[C]new_identifier\f[R].
279 .PP
280 Aliases are most often used to give new names to previously defined
281 materials.
282 They may also be used to associate different patterns or textures with
283 the same material.
284 .SH 3
285 Scene Hierarchy
286 .pdfhref O 3 "Scene Hierarchy"
287 .pdfhref M "scene-hierarchy"
288 .LP
289 Hierarchical scene descriptions are achieved through expansion of
290 in-line \f[B]xform\f[R] commands.
291 The \f[B]xform\f[R] command is used to read and place other
292 \f[I]Radiance\f[R] scene description files in the calling file, and
293 these other descriptions may in turn read others, and so on down the
294 tree.
295 No check is made to assure that none of the calling files is called
296 again, even by itself.
297 If this happens, commands open commands until the system runs out of
298 processes, which is a very nasty business and to be avoided.
299 .SH 3
300 \f[BI]Radiance\f[B] Programs
301 .pdfhref O 3 "Radiance Programs"
302 .pdfhref M "radiance-programs"
303 .LP
304 The following table shows programs in the main \f[I]Radiance\f[R]
305 distribution that read and write scene description files.
306 Additionally, there are other translators that write scene files, which
307 are available separately as free contributions or as part of other (CAD)
308 programs.
309 .PP
310 .na
311 .TS
312 delim(@@) tab( );
313 l l l l.
314 T{
315 Program
316 T} T{
317 Read
318 T} T{
319 Write
320 T} T{
321 Function
322 T}
323 _
324 T{
325 \f[B]arch2rad\f[R]
326 T} T{
327 T} T{
328 X
329 T} T{
330 Convert Architrion text file to \f[I]Radiance\f[R]
331 T}
332 T{
333 \f[B]genblinds\f[R]
334 T} T{
335 T} T{
336 X
337 T} T{
338 Generate curved venetian blinds
339 T}
340 T{
341 \f[B]genbox\f[R]
342 T} T{
343 T} T{
344 X
345 T} T{
346 Generate parallelepiped
347 T}
348 T{
349 \f[B]genclock\f[R]
350 T} T{
351 T} T{
352 X
353 T} T{
354 Generate analog clock
355 T}
356 T{
357 \f[B]genprism\f[R]
358 T} T{
359 T} T{
360 X
361 T} T{
362 Generate extruded polygon
363 T}
364 T{
365 \f[B]genrev\f[R]
366 T} T{
367 T} T{
368 X
369 T} T{
370 Generate surface of revolution
371 T}
372 T{
373 \f[B]gensky\f[R]
374 T} T{
375 T} T{
376 X
377 T} T{
378 Generate CIE sky distribution
379 T}
380 T{
381 \f[B]gensurf\f[R]
382 T} T{
383 T} T{
384 X
385 T} T{
386 Generate arbitrary surface patch
387 T}
388 T{
389 \f[B]genworm\f[R]
390 T} T{
391 T} T{
392 X
393 T} T{
394 Generate varying diameter curved path
395 T}
396 T{
397 \f[B]ies2rad\f[R]
398 T} T{
399 T} T{
400 X
401 T} T{
402 Convert IES luminaire file to \f[I]Radiance\f[R]
403 T}
404 T{
405 \f[B]mgf2rad\f[R]
406 T} T{
407 T} T{
408 X
409 T} T{
410 Convert MGF file to \f[I]Radiance\f[R]
411 T}
412 T{
413 \f[B]mkillum\f[R]
414 T} T{
415 X
416 T} T{
417 X
418 T} T{
419 Compute \f[I]illum\f[R] secondary sources
420 T}
421 T{
422 \f[B]nff2rad\f[R]
423 T} T{
424 T} T{
425 X
426 T} T{
427 Convert NFF file to \f[I]Radiance\f[R]
428 T}
429 T{
430 \f[B]objline\f[R]
431 T} T{
432 T} T{
433 X
434 T} T{
435 Generate line drawing of \f[I]Radiance\f[R] file
436 T}
437 T{
438 \f[B]objview\f[R]
439 T} T{
440 T} T{
441 X
442 T} T{
443 Quick view of \f[I]Radiance\f[R] object
444 T}
445 T{
446 \f[B]oconv\f[R]
447 T} T{
448 T} T{
449 X
450 T} T{
451 Compile \f[I]Radiance\f[R] scene description
452 T}
453 T{
454 \f[B]obj2rad\f[R]
455 T} T{
456 T} T{
457 X
458 T} T{
459 Convert Wavefront .OBJ file to \f[I]Radiance\f[R]
460 T}
461 T{
462 \f[B]rad\f[R]
463 T} T{
464 X
465 T} T{
466 T} T{
467 Render \f[I]Radiance\f[R] scene
468 T}
469 T{
470 \f[B]rad2mgf\f[R]
471 T} T{
472 X
473 T} T{
474 T} T{
475 Convert \f[I]Radiance\f[R] file to MGF
476 T}
477 T{
478 \f[B]raddepend\f[R]
479 T} T{
480 X
481 T} T{
482 T} T{
483 Determine scene file dependencies
484 T}
485 T{
486 \f[B]replmarks\f[R]
487 T} T{
488 X
489 T} T{
490 X
491 T} T{
492 Replace triangular markers with objects
493 T}
494 T{
495 \f[B]rpict\f[R]
496 T} T{
497 X
498 T} T{
499 T} T{
500 Batch rendering program
501 T}
502 T{
503 \f[B]rtrace\f[R]
504 T} T{
505 X
506 T} T{
507 T} T{
508 Customizable ray-tracer
509 T}
510 T{
511 \f[B]rview\f[R]
512 T} T{
513 X
514 T} T{
515 T} T{
516 Interactive renderer
517 T}
518 T{
519 \f[B]thf2rad\f[R]
520 T} T{
521 T} T{
522 X
523 T} T{
524 Convert GDS things file to \f[I]Radiance\f[R]
525 T}
526 T{
527 \f[B]tmesh2rad\f[R]
528 T} T{
529 T} T{
530 X
531 T} T{
532 Convert triangle mesh file to \f[I]Radiance\f[R]
533 T}
534 T{
535 \f[B]xform\f[R]
536 T} T{
537 X
538 T} T{
539 X
540 T} T{
541 Transform Radiance objects
542 T}
543 .TE
544 .ad
545 .LP
546 \f[B]Table 1.\f[R] Radiance programs that read and write scene
547 descriptions.
548 .SH 3
549 \f[BI]Radiance\f[B] C Library
550 .pdfhref O 3 "Radiance C Library"
551 .pdfhref M "radiance-c-library"
552 .LP
553 The principal library function for reading scene description files is
554 \f[C]readobj(inpspec)\f[R], defined in \f[C]src/common/readobj.c\f[R].
555 This routine takes the name of a file, or command beginning with `!', or
556 \f[C]NULL\f[R] if standard input is to be read, and loads the
557 \f[I]Radiance\f[R] data structures defined in
558 \f[C]src/common/object.h\f[R].
559 If loading \f[I]Radiance\f[R] data structures is not the action desired,
560 then a more custom approach is necessary, such as that used in
561 \f[C]src/gen/xform.c\f[R].
562 If using \f[I]Radiance\f[R] data structures is acceptable, but the data
563 need not remain resident in memory, then follow the lead in
564 \f[C]src/ot/getbbox.c\f[R] and use \f[C]src/ot/readobj2.c\f[R] instead.
565 In any case, the list of defined primitive types in
566 \f[C]src/common/otypes.h\f[R] is crucial.
567 .SH 2
568 Function File Format (.cal suffix)
569 .pdfhref O 2 "Function File Format \(.cal suffix\)"
570 .pdfhref M "function-file-format-.cal-suffix"
571 .LP
572 Function files are used throughout \f[I]Radiance\f[R] to specify
573 mathematical formulas and relations for procedural textures, patterns
574 and surfaces.
575 They are also used by filter programs such as rcalc to manipulate data,
576 and pcomb to manipulate pictures.
577 .PP
578 Function file syntax is simple and should be familiar to most
579 programmers, as it is based on fairly standard algebraic expressions.
580 Here is an example, which corresponds to the in-line commands given in
581 the previous section:
582 .IP
583 .nf
584 \f[C]
585 {
586 basin.cal - calculate coordinates for basin sink.
587 }
588
589 theta(s) = PI*(0.5+0.5*s);
590 phi(t) = 2*PI*t;
591
592 R(th,p) = 5 + ( 3.25*cos(p)\[ha]2 +
593 1.75*sin(p)\[ha]2 ) * sin(th)\[ha]2;
594
595 x(th,p) = R(th,p)*sin(th)*cos(p);
596 y(th,p) = R(th,p)*sin(th)*sin(p);
597 z(th,p) = R(th,p)*cos(th);
598 \f[]
599 .fi
600 .LP
601 In contrast to the usual semantics in programs where each statement
602 corresponds to an evaluation, statements in function files correspond to
603 \f[I]definitions\f[R].
604 Once a function or variable has been defined, it may be used in later
605 definitions, along with predefined functions such as \f[C]sin(x)\f[R]
606 and \f[C]cos(x)\f[R] and constants such as PI \**.
607 .FS
608 TBD - There once was a footnote here
609 .FE
610 (All math functions use standard C conventions, hence trigonometry is
611 done in radians rather than degrees.)
612 .PP
613 Evaluation order (operator precedence) follows standard rules of
614 algebra.
615 Exponentiation is performed first \f[C](x\[ha]y)\f[R], followed by
616 multiplication and division \f[C](x*y, x/y)\f[R], then addition and
617 subtraction \f[C](x+y, x-y)\f[R].
618 Unary minus is most tightly associated \f[C](-x)\f[R], and parentheses
619 override operator precedence in the usual way.
620 Semicolons separate statements, and white space is generally ignored.
621 Comments are enclosed by curly braces, which may be nested.
622 .PP
623 The above file does not actually \f[I]do\f[R] anything, it merely
624 defines functions that are useful by a program that does.
625 Taking our \f[B]gensurf\f[R] example from the previous section:
626 .IP
627 .nf
628 \f[C]
629 !gensurf marble sink \[aq]15.5+x(theta(s),phi(t))\[aq] \[rs]
630 \[aq]10.5+y(theta(s),phi(t))\[aq] \[rs]
631 \[aq]30.75+z(theta(s),phi(t))\[aq] \[rs]
632 8 29 -f basin.cal -s
633 \f[]
634 .fi
635 .LP
636 The \f[B]-f\f[R] option loads in our file, which is then used to
637 evaluate expressions such as \f[C]15.5+x(theta(s),phi(t))\f[R] for
638 specific values of \f[C]s\f[R] and \f[C]t\f[R].
639 These variables range from 0 to 1 over the surface patch in increments
640 of @1 / 8@ and @1 / 29@, respectively.
641 (See the \f[B]gensurf\f[R] manual page for details.)
642 The entire expression for each evaluation could have been written in the
643 command line, but it is much more convenient to create a function file.
644 .SH 3
645 Language Features
646 .pdfhref O 3 "Language Features"
647 .pdfhref M "language-features"
648 .LP
649 Subtle features of the functional language provide much greater power
650 than first meets the eye.
651 One of these is the ability to define recursive functions.
652 The following example defines the factorial function (\f[I]n!\f[R]):
653 .IP
654 .nf
655 \f[C]
656 fact(n) : if(n-1.5, n*fact(n-1), 1);
657 \f[]
658 .fi
659 .LP
660 This uses the library function \f[C]if(cond,e1,e0)\f[R], which returns
661 \f[C]e1\f[R] if cond is greater than zero, and \f[C]e0\f[R] otherwise.
662 Since only one of these expressions is evaluated, \f[C]fact(n)\f[R] will
663 call itself until \f[C]n\f[R] is less than 2, when the \f[C]if\f[R]
664 expression returns 1\**.
665 .FS
666 Note that we compare \f[C]n\f[R] to 1.5, so as to avoid any round-off
667 problems caused by floating point math.
668 Caution is advised because all expressions are evaluated as
669 double-precision real, and comparisons to zero are unreliable.
670 .FE
671 The colon (`:') is used in place of the usual equals assignment (`=')
672 because we want this function to have the constant attribute, which
673 means any later appearance in an expression of \f[C]fact(ce)\f[R] where
674 ce is also a constant expression will be replaced by its value.
675 This can be an important savings in cases where an expression or
676 subexpression is expensive to evaluate, and only needs to be computed
677 once.
678 All of the standard library functions have the constant attribute.
679 (See the following section for a complete list.)
680 .PP
681 Another handy language feature is the ability to pass function names as
682 arguments.
683 A simple example of this is the following function, which computes the
684 numerical derivative of a function given as its first argument:
685 .IP
686 .nf
687 \f[C]
688 FTINY : 1e-7;
689 d1(f,x) = (f(x+FTINY)-f(x-FTINY))/FTINY/2;
690 \f[]
691 .fi
692 .LP
693 Evaluating \f[C]d1(sin,1.1)\f[R] using this formula yields 0.4536, which
694 is fairly close to the true derivative, which is \f[C]cos(1.1)\f[R].
695 .PP
696 A third language feature, which is normally transparent to the user, is
697 the notion of \f[I]contexts\f[R].
698 Identifiers may be composed of parts, starting with a name and
699 continuing with one or more context names.
700 Each name is delimited by a back-quote (`\[ga]').
701 Names themselves begin with a letter and continue with any sequence of
702 letters, digits, underscores and decimal points.
703 The following are examples of valid identifiers:
704 .IP
705 .nf
706 \f[C]
707 v1, V.W, x_rand\[ga]local, \[ga]A_, Qa_5\[ga]
708 \f[]
709 .fi
710 .LP
711 If a context mark appears at the beginning of the identifier, then its
712 reference must be local.
713 If it appears at the end, then its reference must be global.
714 A local reference must be resolved in the local context, i.e., no
715 contexts above this one will be searched.
716 A global reference must correspond to the original context, ignoring any
717 local redefinitions.
718 .PP
719 The reason that contexts are normally transparent is that they are
720 controlled by the calling program \[em] there are no explicit language
721 features for establishing contexts.
722 A new context is established automatically for each function file loaded
723 by the rendering programs.
724 That way, it is safe to reuse variable names that have been used in
725 other files, and even in the main initialization file,
726 \f[C]rayinit.cal\f[R].
727 .PP
728 Although not strictly necessary, there are two good reasons to define
729 variables and functions before referencing them in a function file.
730 One is related to contexts.
731 If a previous definition of a variable name is given in an enclosing
732 context (e.g., \f[C]rayinit.cal\f[R]), then that reference will be used
733 rather than a later one in the current context, unless the reference is
734 made explicitly local by starting the identifier with a context mark.
735 The second reason for defining before referencing is constant
736 expressions.
737 If a variable or function has the constant attribute (i.e., defined with
738 `:' instead of `='), then a later subexpression referencing it can be
739 replaced by its evaluated result during compilation.
740 If the constant is not defined until after it is referenced, it remains
741 as a reference, which takes time to evaluate each time.
742 .PP
743 Other features of the language are truly transparent, but knowledge of
744 them can help one to write more efficient function files:
745 .IP \[bu] 3
746 Once a variable has been evaluated, the result is cached and it is not
747 reevaluated unless the client program changes an internal counter
748 (\f[C]eclock\f[R]), which indicates that something has changed.
749 This means that using variables to hold frequently used values will not
750 only simplify the function file, it will save time during evaluation.
751 .IP \[bu] 3
752 An argument passed in a function call is not evaluated until the
753 function calls for it specifically, and the result is also cached to
754 avoid redundant calculation.
755 The conditional evaluation feature is actually a requirement for
756 recursive functions to work, but caching is not.
757 Argument value caching means it is more efficient to pass an
758 expensive-to-compute expression than to have the function compute it
759 internally if it appears more than once in the function definition.
760 This is especially true for recursive functions with deep call trees.
761 .SH 3
762 Standard Definitions (Library)
763 .pdfhref O 3 "Standard Definitions \(Library\)"
764 .pdfhref M "standard-definitions-library"
765 .LP
766 The following are always defined:
767 .IP "\f[B]\f[CB]if(a, b, c)\f[B]\f[R]" 3
768 Conditional expression.
769 If a is positive, return b, else return c.
770 .RS 3
771 .RE
772 .IP "\f[B]\f[CB]select(N, a1, a2, ..)\f[B]\f[R]" 3
773 Return Nth argument.
774 If N is 0, then return the count of arguments excluding the first.
775 This provides basic array functionality.
776 .RS 3
777 .RE
778 .IP "\f[B]\f[CB]sqrt(x)\f[B]\f[R]" 3
779 Return square root of \f[C]x\f[R], where \f[C]x >= 0\f[R].
780 .RS 3
781 .RE
782 .IP "\f[B]\f[CB]sin(x), cos(x), tan(x), asin(x), acos(x), atan(x), atan2(y,x)\f[B]\f[R]" 3
783 Standard trigonometry functions.
784 .RS 3
785 .RE
786 .IP "\f[B]\f[CB]floor(x), ceil(x)\f[B]\f[R]" 3
787 Greatest lower bound and least upper bound (integer).
788 .RS 3
789 .RE
790 .IP "\f[B]\f[CB]exp(x), log(x), log10(x)\f[B]\f[R]" 3
791 Exponent and logarithm functions.
792 .RS 3
793 .RE
794 .IP "\f[B]\f[CB]rand(x)\f[B]\f[R]" 3
795 Return pseudo-random number in the range [0,1) for any argument x.
796 The same return value is guaranteed for the same argument.
797 .RS 3
798 .RE
799 .LP
800 The following are sometimes defined, depending on the program:
801 .IP "\f[B]PI\f[R]" 3
802 The ratio of a circle\[cq]s circumference to its diameter.
803 .RS 3
804 .RE
805 .IP "\f[B]\f[CB]erf(z), erfc(z)\f[B]\f[R]" 3
806 Error function and complimentary error function.
807 .RS 3
808 .RE
809 .IP "\f[B]\f[CB]j0(x), j1(x), jn(n,x), y0(x), y1(x), yn(n,x)\f[B]\f[R]" 3
810 Bessel functions.
811 .RS 3
812 .RE
813 .IP "\f[B]\f[CB]hermite(p0,p1,r0,r1,t)\f[B]\f[R]" 3
814 One-dimensional Hermite polynomial.
815 .RS 3
816 .RE
817 .LP
818 The rendering programs also define the following noise functions:
819 .IP "\f[B]\f[CB]noise3(x,y,z), noise3x(x,y,z), noise3y(x,y,z), noise3z(x,y,z)\f[B]\f[R]" 3
820 Perlin noise function and its gradient [Perlin85][Arvo91,p.396].
821 .RS 3
822 .RE
823 .IP "\f[B]\f[CB]fnoise3(x,y,z)\f[B]\f[R]" 3
824 Fractal noise function, ranging from -1 to 1.
825 .RS 3
826 .RE
827 .LP
828 Interaction with the renderer is achieved via special purpose variables
829 and functions whose values correspond to the current ray intersection
830 and the calling primitive.
831 Unlike the above functions, none of these have the constant attribute
832 since their values change from one ray to the next:
833 .IP "\f[B]\f[CB]Dx, Dy, Dz\f[B]\f[R]" 3
834 ray direction
835 .RS 3
836 .RE
837 .IP "\f[B]\f[CB]Nx, Ny, Nz\f[B]\f[R]" 3
838 surface normal
839 .RS 3
840 .RE
841 .LP
842 \f[C]Px, Py, Pz\f[R] :intersection point
843 .IP "\f[B]\f[CB]T\f[B]\f[R]" 3
844 distance from start
845 .RS 3
846 .RE
847 .IP "\f[B]\f[CB]Ts\f[B]\f[R]" 3
848 single ray (shadow) distance
849 .RS 3
850 .RE
851 .IP "\f[B]\f[CB]Rdot\f[B]\f[R]" 3
852 ray dot product
853 .RS 3
854 .RE
855 .IP "\f[B]\f[CB]S\f[B]\f[R]" 3
856 world scale
857 .RS 3
858 .RE
859 .IP "\f[B]\f[CB]Tx, Ty, Tz\f[B]\f[R]" 3
860 world origin
861 .RS 3
862 .RE
863 .IP "\f[B]\f[CB]Ix, Iy, Iz\f[B]\f[R]" 3
864 world i unit vector
865 .RS 3
866 .RE
867 .IP "\f[B]\f[CB]Jx, Jy, Jz\f[B]\f[R]" 3
868 world j unit vector
869 .RS 3
870 .RE
871 .IP "\f[B]\f[CB]Kx, Ky, Kz\f[B]\f[R]" 3
872 world k unit vector
873 .RS 3
874 .RE
875 .IP "\f[B]\f[CB]arg(n)\f[B]\f[R]" 3
876 real arguments, arg(0) is count
877 .RS 3
878 .RE
879 .LP
880 For BRDF primitives, the following variables are also available:
881 .IP "\f[B]\f[CB]NxP, NyP, NzP\f[B]\f[R]" 3
882 perturbed surface normal
883 .RS 3
884 .RE
885 .IP "\f[B]\f[CB]RdotP\f[B]\f[R]" 3
886 perturbed ray dot product
887 .RS 3
888 .RE
889 .IP "\f[B]\f[CB]CrP, CgP, CbP\f[B]\f[R]" 3
890 perturbed material color
891 .RS 3
892 .RE
893 .LP
894 For prism1 and prism2 primitives, the following are available:
895 .IP "\f[B]\f[CB]DxA, DyA, DzA\f[B]\f[R]" 3
896 direction to target light source
897 .RS 3
898 .RE
899 .LP
900 Other functions, variables and constants are defined as well in the file
901 \f[C]src/rt/rayinit.cal\f[R], which gets installed in the standard
902 \f[I]Radiance\f[R] library directory and can be modified or appended as
903 desired\**.
904 .FS
905 It is usually a good idea to store any such customized files in a
906 personal library location and set the \f[C]RAYPATH\f[R] environment
907 variable to search there first.
908 This way, it does not affect other users or get overwritten during the
909 next system installation.
910 .FE
911 .SH 3
912 \f[BI]Radiance\f[B] Programs
913 .pdfhref O 3 "Radiance Programs"
914 .pdfhref M "radiance-programs-1"
915 .LP
916 Table 2 shows \f[I]Radiance\f[R] programs that read and write function
917 files.
918 .PP
919 .na
920 .TS
921 delim(@@) tab( );
922 l l l l.
923 T{
924 Program
925 T} T{
926 Read
927 T} T{
928 Write
929 T} T{
930 Function
931 T}
932 _
933 T{
934 \f[B]calc\f[R]
935 T} T{
936 X
937 T} T{
938 X
939 T} T{
940 Interactive calculator
941 T}
942 T{
943 \f[B]genrev\f[R]
944 T} T{
945 X
946 T} T{
947 T} T{
948 Generate surface of revolution
949 T}
950 T{
951 \f[B]gensurf\f[R]
952 T} T{
953 X
954 T} T{
955 T} T{
956 Generate arbitrary surface patch
957 T}
958 T{
959 \f[B]genworm\f[R]
960 T} T{
961 X
962 T} T{
963 T} T{
964 Generate varying diameter curved path
965 T}
966 T{
967 \f[B]macbethcal\f[R]
968 T} T{
969 T} T{
970 X
971 T} T{
972 Compute image color & contrast correction
973 T}
974 T{
975 \f[B]pcomb\f[R]
976 T} T{
977 X
978 T} T{
979 T} T{
980 Perform arbitrary math on picture(s)
981 T}
982 T{
983 \f[B]rcalc\f[R]
984 T} T{
985 X
986 T} T{
987 T} T{
988 Record stream calculator
989 T}
990 T{
991 \f[B]rpict\f[R]
992 T} T{
993 X
994 T} T{
995 T} T{
996 Batch rendering program
997 T}
998 T{
999 \f[B]rtrace\f[R]
1000 T} T{
1001 X
1002 T} T{
1003 T} T{
1004 Customizable ray-tracer
1005 T}
1006 T{
1007 \f[B]rview\f[R]
1008 T} T{
1009 X
1010 T} T{
1011 T} T{
1012 Interactive renderer
1013 T}
1014 T{
1015 \f[B]tabfunc\f[R]
1016 T} T{
1017 T} T{
1018 X
1019 T} T{
1020 Create function file from tabulated data
1021 T}
1022 .TE
1023 .ad
1024 .LP
1025 \f[B]Table 2.\f[R] Programs in the \f[I]Radiance\f[R] distribution that
1026 read and write function files.
1027 .PP
1028 In addition, the program \f[B]ev\f[R] evaluates expressions given as
1029 command line arguments, though it does not handle function files or
1030 definitions.
1031 There are also a number of 2-d plotting routines that use a slightly
1032 modified statement syntax, called \f[B]bgraph\f[R], \f[B]dgraph\f[R],
1033 \f[B]gcomp\f[R], and \f[B]igraph\f[R].
1034 Additional utility programs are useful in combination with rcalc for
1035 data analysis and scene generation.
1036 The program \f[B]cnt\f[R] generates simple records to drive
1037 \f[B]rcalc\f[R], and the \f[B]total\f[R] program is handy for adding up
1038 results.
1039 The \f[B]histo\f[R] program computes histograms needed for certain types
1040 of statistical analysis.
1041 The \f[B]lam\f[R] program concatenates columns from multiple input
1042 files, and \f[B]neat\f[R] neatens up columns for better display.
1043 .SH 3
1044 \f[BI]Radiance\f[B] C Library
1045 .pdfhref O 3 "Radiance C Library"
1046 .pdfhref M "radiance-c-library-1"
1047 .LP
1048 The standard routines for loading and evaluating function files are
1049 divided into three modules, \f[C]src/common/calexpr.c\f[R] for
1050 expression parsing and evaluation, \f[C]src/common/caldefn.c\f[R] for
1051 variable and function storage and lookup, and
1052 \f[C]src/common/calfunc.c\f[R] for library function storage and function
1053 evaluation.
1054 There is a fourth module for writing out expressions called
1055 \f[C]src/common/calprnt.c\f[R], which we will not discuss.
1056 They all use the header file \f[C]src/common/calcomp.h\f[R], which
1057 defines common data structures and evaluation macros.
1058 Of these, the three most often used declarations for external routines
1059 are:
1060 .IP "\f[B]\f[CB]typedef struct epnode EPNODE;\f[B]\f[R]" 3
1061 Expression parse tree node.
1062 Some routines return pointers to this structure type, and the main
1063 evaluation macro, \f[C]evalue(ep)\f[R], takes an argument of this type.
1064 .RS 3
1065 .RE
1066 .IP "\f[B]\f[CB](double) evalue(ep);\f[B]\f[R]" 3
1067 Evaluate an expression parse tree.
1068 Uses node type table to access appropriate function depending on root
1069 node type.
1070 (E.g., an addition node calls \f[C]eadd(ep)\f[R].)
1071 .RS 3
1072 .RE
1073 .IP "\f[B]\f[CB]extern unsigned long eclock;\f[B]\f[R]" 3
1074 This is a counter used to determine when variable values need updating.
1075 The initial value is 0, which tells the routines always to reevaluate
1076 variables.
1077 Once incremented to 1, variable evaluations are cached and not
1078 recomputed until \f[C]eclock\f[R] is incremented again.
1079 Usually, client programs increment \f[C]eclock\f[R] each time
1080 definitions or internal states affecting returned values change.
1081 This assures the quickest evaluation of correct results.
1082 .RS 3
1083 .RE
1084 .LP
1085 The usual approach to handling definitions is to compile them into the
1086 central lookup table; variable and function references are later
1087 evaluated by traversing the stored parse trees.
1088 Syntax errors and undefined symbol errors during evaluation result in
1089 calls to the user-definable routine \f[C]eputs(s)\f[R] to report the
1090 error and \f[C]quit(status)\f[R] to exit the program.
1091 Domain and range errors during evaluation set \f[C]errno\f[R], then call
1092 the user-definable routine \f[C]wputs(s)\f[R] to report the error and
1093 return zero as the expression result.
1094 Following are standard routines provided for parsing from a file and
1095 parsing from a string:
1096 .IP "\f[B]\f[CB]EPNODE *eparse(char *expr);\f[B]\f[R]" 3
1097 Compile the string expr into a parse tree for later evaluation with
1098 evalue(ep).
1099 .RS 3
1100 .RE
1101 .IP "\f[B]\f[CB]epfree(EPNODE *ep);\f[B]\f[R]" 3
1102 Free memory associated with ep, including any variables referenced if
1103 they are no longer defined.
1104 .RS 3
1105 .RE
1106 .IP "\f[B]\f[CB]double eval(char *expr);\f[B]\f[R]" 3
1107 Immediately parse, evaluate and free the given string expression.
1108 .RS 3
1109 .RE
1110 .IP "\f[B]\f[CB]fcompile(char *fname);\f[B]\f[R]" 3
1111 Compile definitions from the given file, or standard input if fname is
1112 NULL.
1113 .RS 3
1114 .RE
1115 .IP "\f[B]\f[CB]scompile(char *str, char *fn, int ln);\f[B]\f[R]" 3
1116 Compile definitions from the string str, taken from file fn at line
1117 number ln.
1118 If no file is associated, fn can be NULL, and ln can be 0.
1119 .RS 3
1120 .RE
1121 .LP
1122 The following routines allow one to control the current context for
1123 definition lookup and storage:
1124 .IP "\f[B]\f[CB]char *setcontext(char *ctx);\f[B]\f[R]" 3
1125 Set the current context to ctx.
1126 If ctx is NULL, then simply return the current context.
1127 An empty string sets the global context.
1128 .RS 3
1129 .RE
1130 .IP "\f[B]\f[CB]char *pushcontext(char *name);\f[B]\f[R]" 3
1131 Push another context onto the stack.
1132 Return the new (full) context.
1133 .RS 3
1134 .RE
1135 .IP "\f[B]\f[CB]char *popcontext();\f[B]\f[R]" 3
1136 Pop the top context name off the stack.
1137 Return the new (full) context.
1138 .RS 3
1139 .RE
1140 .LP
1141 The following functions permit the explicit setting of variable and
1142 function values:
1143 .IP "\f[B]\f[CB]varset(char *vname, int assign, double val);\f[B]\f[R]" 3
1144 Set the specified variable to the given value, using a constant
1145 assignment if assign is `:' or a regular one if it is `='.
1146 This is always faster than compiling a string to do the same thing.
1147 .RS 3
1148 .RE
1149 .IP "\f[B]\f[CB]funset(char *fname, int nargs, int assign, double (*fptr)(char *fn));\f[B]\f[R]" 3
1150 Assign the specified library function, which takes a minimum of nargs
1151 arguments.
1152 The function will have the constant attribute if assign is `:', or not
1153 if it is `='.
1154 The only argument to the referenced function pointer is the function
1155 name, which will equal fname.
1156 (This string must therefore be declared static.)
1157 This offers a convenient method to identify calls to an identical
1158 function assigned multiple tasks.
1159 Argument values are obtained with calls back to the argument(n) library
1160 function.
1161 .RS 3
1162 .RE
1163 .LP
1164 The following functions are provided for evaluating a function or
1165 variable in the current definition set:
1166 .IP "\f[B]\f[CB]double varvalue(char *vname);\f[B]\f[R]" 3
1167 Evaluate the given variable and return the result.
1168 Since a hash lookup is necessary to resolve the reference, this is
1169 slightly less efficient than evaluating a compiled expression via
1170 evalue(ep), which uses soft links generated and maintained during
1171 compilation.
1172 .RS 3
1173 .RE
1174 .IP "\f[B]\f[CB]double funvalue(char *fn, int n, double a);\f[B]\f[R]" 3
1175 Evaluate the function fn, passing n real arguments in the array a.
1176 There is currently no mechanism for passing functions or function name
1177 arguments from client programs.
1178 .RS 3
1179 .RE
1180 .LP
1181 These routines can be used to check the existence of a specific function
1182 or variable:
1183 .IP "\f[B]\f[CB]int vardefined(char *vname);\f[B]\f[R]" 3
1184 Return non-zero if the named variable is defined.
1185 (If the symbol is defined as a function, zero is returned.)
1186 .RS 3
1187 .RE
1188 .IP "\f[B]\f[CB]int fundefined(char *fname);\f[B]\f[R]" 3
1189 Return the number of required arguments for the named function if it is
1190 defined, or zero if it is not defined.
1191 (If the symbol is defined as a variable, zero is returned.)
1192 .RS 3
1193 .RE
1194 .LP
1195 These routines allow definitions to be cleared:
1196 .IP "\f[B]\f[CB]dclear(char *dname);\f[B]\f[R]" 3
1197 Clear the given variable or function, unless it is a constant
1198 expression.
1199 .RS 3
1200 .RE
1201 .IP "\f[B]\f[CB]dremove(char *dname);\f[B]\f[R]" 3
1202 Clear the given variable or function, even if it is a constant
1203 expression.
1204 Library definitions cannot be removed, except by calling funset with a
1205 \f[C]NULL\f[R] pointer for the function argument.
1206 .RS 3
1207 .RE
1208 .IP "\f[B]\f[CB]dcleanup(int level);\f[B]\f[R]" 3
1209 Clear definitions.
1210 If level is 0, then just clear variable definitions.
1211 If level is 2, then clear constants as well.
1212 If the current context is local, then only local definitions will be
1213 affected.
1214 If global, all definitions in all contexts will be affected.
1215 .RS 3
1216 .RE
1217 .LP
1218 These routines may be used during library function evaluation:
1219 .IP "\f[B]\f[CB]int nargum();\f[B]\f[R]" 3
1220 Determine the number of arguments available in the current function
1221 evaluation context.
1222 .RS 3
1223 .RE
1224 .IP "\f[B]\f[CB]double argument(int n);\f[B]\f[R]" 3
1225 Evaluate and return the nth argument.
1226 .RS 3
1227 .RE
1228 .IP "\f[B]\f[CB]char *argfun(n);\f[B]\f[R]" 3
1229 Get the name of the function passed as argument n.\ (Generates an error
1230 if the nth argument is not a function.)
1231 .RS 3
1232 .RE
1233 .LP
1234 Other, even more specialized routines are provided for controlling the
1235 parsing process, printing out expressions and sifting through stored
1236 definitions, but these are not accessed by most client programs.
1237 Worth noting are the various compile flags that affect which features of
1238 the expression language are included.
1239 The standard library sets the flags \f[C]-DVARIABLE\f[R],
1240 \f[C]-DFUNCTION\f[R], \f[C]-DRCONST\f[R], and \f[C]-DBIGLIB\f[R].
1241 Here is a list of compile flags and their meanings:
1242 .IP "\f[B]\f[CB]-DVARIABLE\f[B]\f[R]" 3
1243 Allow user-defined variables and (if \f[C]-DFUNCTION\f[R]) user- defined
1244 functions.
1245 .RS 3
1246 .RE
1247 .IP "\f[B]\f[CB]-DFUNCTION\f[B]\f[R]" 3
1248 Compile in library functions and (if \f[C]-DVARIABLE\f[R]) allow
1249 user-supplied function definitions.
1250 .RS 3
1251 .RE
1252 .IP "\f[B]\f[CB]-DBIGLIB\f[B]\f[R]" 3
1253 Include larger library of standard functions, i.e., standard C math
1254 library.
1255 Otherwise, only minimal library is compiled in, and other functions may
1256 be added using \f[C]funset\f[R].
1257 .RS 3
1258 .RE
1259 .IP "\f[B]\f[CB]-DRCONST\f[B]\f[R]" 3
1260 Reduce constant subexpressions during compilation.
1261 This can result in substantial savings during later evaluation, but the
1262 original user-supplied expressions are lost.
1263 .RS 3
1264 .RE
1265 .IP "\f[B]\f[CB]-DREDEFW\f[B]\f[R]" 3
1266 Issue a warning via \f[C]wputs(s)\f[R] if a new definition hides a
1267 constant definition or library function, or replaces an existing,
1268 distinct definition for the same symbol.
1269 (The \f[C]varset\f[R] routine never generates warnings, however.)
1270 .RS 3
1271 .RE
1272 .IP "\f[B]\f[CB]-DINCHAN\f[B]\f[R]" 3
1273 Provide for \f[C]\[rs]$N\f[R] syntax for input channels, which result in
1274 callbacks to client-supplied chanvalue(n) routine on each evaluation.
1275 .RS 3
1276 .RE
1277 .IP "\f[B]\f[CB]-DOUTCHAN\f[B]\f[R]" 3
1278 Provide for \f[C]\[rs]$N\f[R] lvalue syntax for output channels, which
1279 are evaluated via the chanout(cs) library function, which calls
1280 \f[C](*cs)(n, value)\f[R]for each assigned channel definition.
1281 .RS 3
1282 .RE
1283 .SH 2
1284 Data File Format (.dat suffix)
1285 .pdfhref O 2 "Data File Format \(.dat suffix\)"
1286 .pdfhref M "data-file-format-.dat-suffix"
1287 .LP
1288 Although it is possible to store tabular data in a function file using
1289 the select library function, it is more convenient and efficient to
1290 devote a special file format to this purpose.
1291 \f[I]Radiance\f[R] data files store scalar values on an N-dimensional
1292 rectangular grid.
1293 Grid (independent) axes may be regularly or irregularly divided, as
1294 shown in Figure 1.
1295 This data is interpolated during rendering (using N-dimensional linear
1296 interpolation) to compute the desired values.
1297 .PSPIC "figure1.eps"
1298 .ce 1000
1299 Division of axes in .dat file
1300 .ce 0
1301 .PP
1302 \f[B]Figure 1.\f[R] A 2-dimensional grid with one regularly divided axis
1303 and one irregularly divided axis.
1304 Each intersection corresponds to a data value that appears in the file.
1305 .PP
1306 Data files are broken into two sections, the header and the body.
1307 The header specifies the grid, and the body contains the data values in
1308 a standard order.
1309 The first value in the file is a positive integer indicating the number
1310 of dimensions.
1311 Next comes that number of axis specifications, in one of two formats.
1312 For a regularly divided axis, the starting and ending value is given,
1313 followed by the number of divisions.
1314 For an irregularly divided axis, two zeros are followed by the number of
1315 divisions then that number of division values.
1316 The two zeros are merely there to indicate an irregular spacing is being
1317 specified.
1318 Once all the axes have been given, the header is done and the body of
1319 the file begins, which consists of one data value after another.
1320 The ordering of the data is such that the last axis given is the one
1321 being traversed most rapidly, similar to a static array assignment in C.
1322 .PP
1323 A file corresponding to the topology shown in Figure 1 is:
1324 .IP
1325 .nf
1326 \f[C]
1327 ######### Header ########
1328 2 # Two-dimensional data array
1329 0.5 0.1 5 # The regularly spaced axis
1330 0 0 5 3 5 10 16 20 # The irregularly spaced axis
1331 ########## Body #########
1332 # The data values, starting with the
1333 # upper left, moving right then down:
1334 19.089 7.001 14.647 6.3671 8.0003
1335 3.8388 11.873 19.294 16.605 2.7435
1336 16.699 6.387 2.8123 16.195 17.615
1337 14.36 14.413 16.184 15.635 4.5403
1338 3.6740 14.550 10.332 15.932 1.2678
1339 \f[]
1340 .fi
1341 .LP
1342 Comments begin with a pound sign (`#') and continue to the end of the
1343 line.
1344 White space is ignored except as a data separator, thus the position of
1345 header and data values on each line is irrelevant except to improve
1346 readability.
1347 .SH 3
1348 \f[BI]Radiance\f[B] Programs
1349 .pdfhref O 3 "Radiance Programs"
1350 .pdfhref M "radiance-programs-2"
1351 .LP
1352 Table 3 shows \f[I]Radiance\f[R] programs that read and write data
1353 files.
1354 .PP
1355 .na
1356 .TS
1357 delim(@@) tab( );
1358 l l l l.
1359 T{
1360 Program
1361 T} T{
1362 Read
1363 T} T{
1364 Write
1365 T} T{
1366 Function
1367 T}
1368 _
1369 T{
1370 \f[B]ies2rad\f[R]
1371 T} T{
1372 T} T{
1373 X
1374 T} T{
1375 Convert IES luminaire file to \f[I]Radiance\f[R]
1376 T}
1377 T{
1378 \f[B]mgf2rad\f[R]
1379 T} T{
1380 T} T{
1381 X
1382 T} T{
1383 Convert MGF file to \f[I]Radiance\f[R]
1384 T}
1385 T{
1386 \f[B]rpict\f[R]
1387 T} T{
1388 X
1389 T} T{
1390 T} T{
1391 Batch rendering program
1392 T}
1393 T{
1394 \f[B]rtrace\f[R]
1395 T} T{
1396 X
1397 T} T{
1398 T} T{
1399 Customizable ray-tracer
1400 T}
1401 T{
1402 \f[B]rview\f[R]
1403 T} T{
1404 X
1405 T} T{
1406 T} T{
1407 Interactive renderer
1408 T}
1409 .TE
1410 .ad
1411 .LP
1412 \f[B]Table 3.\f[R] Programs in the \f[I]Radiance\f[R] distribution that
1413 read and write data files.
1414 .SH 3
1415 \f[BI]Radiance\f[B] C Library
1416 .pdfhref O 3 "Radiance C Library"
1417 .pdfhref M "radiance-c-library-2"
1418 .LP
1419 The header file \f[C]src/rt/data.h\f[R] gives the standard data
1420 structures used by the routines in \f[C]src/rt/data.c\f[R] for reading
1421 and interpolating data files.
1422 The main data type is \f[C]DATARRAY\f[R], which is a structure
1423 containing the grid specification and a pointer to the data array, which
1424 is of the type \f[C]DATATYPE\f[R] (normally \f[B]float\f[R] to save
1425 space).
1426 .PP
1427 The main routine for reading data files is \f[C]getdata(dname)\f[R],
1428 which searches the standard \f[I]Radiance\f[R] library locations set by
1429 the \f[C]RAYPATH\f[R] environment variable.
1430 The return value is a pointer to the loaded \f[C]DATARRAY\f[R], which
1431 may have been loaded by a previous call.
1432 (The routine keeps a hash table of loaded files to minimize time and
1433 memory requirements.)
1434 The \f[C]freedata(dname)\f[R] routine frees memory associated with the
1435 named data file, or all data arrays if \f[C]dname\f[R] is
1436 \f[C]NULL\f[R].
1437 .PP
1438 The routine that interpolates data values is \f[C]datavalue(dp,pt)\f[R],
1439 which takes a \f[C]DATARRAY\f[R] pointer and an array of
1440 \f[B]double\f[R]s of the appropriate length (the number of dimensions in
1441 \f[C]dp\f[R]).
1442 The \f[B]double\f[R] returned is the interpolated value at that point in
1443 the scalar field.
1444 If the requested point lies outside the data\[cq]s grid, it is
1445 extrapolated from the perimeter values up to a distance of one division
1446 in each dimension, and falls off harmonically to zero outside of that.
1447 This was selected as the most robust compromise, but to be safe it is
1448 generally best to avoid giving out-of-domain points to
1449 \f[C]datavalue\f[R].
1450 .SH 2
1451 Font File Format (.fnt suffix)
1452 .pdfhref O 2 "Font File Format \(.fnt suffix\)"
1453 .pdfhref M "font-file-format-.fnt-suffix"
1454 .LP
1455 Font files are used for text patterns and mixtures, and by the
1456 \f[B]psign\f[R] program to generate simple text labels.
1457 Each character glyph is set up on a simple rectangular coordinate system
1458 running from [0,255] in x and y, and the glyph itself is a polygon.
1459 Figure 2 shows an example of the letter \[lq]A\[rq].
1460 .PSPIC "figure2.eps"
1461 .ce 1000
1462 Drawing of an A, based on coordinates
1463 .ce 0
1464 .PP
1465 \f[B]Figure 2.\f[R] A glyph for an \[lq]A\[rq] character in standard
1466 font coordinates.
1467 Note that the hole is made via a seam, just as with \f[I]Radiance\f[R]
1468 scene polygons.
1469 The actual aspect and spacing of the character will be determined by the
1470 client program.
1471 .PP
1472 Each glyph begins with the decimal value of that character\[cq]s index,
1473 which is 65 for \[lq]A\[rq] according to the ASCII standard.
1474 This is followed by the number of vertices, then the vertices themselves
1475 in @left ( x sub 1 , y sub 1 right ) , left ( x sub 2 , y sub 2 right )@
1476 order.
1477 White space again serves as a separator, and comments may begin with a
1478 pound sign (`#') and continue to the end of line.
1479 Here is the glyph entry for the letter \[lq]A\[rq] corresponding to
1480 Figure 2:
1481 .IP
1482 .nf
1483 \f[C]
1484 65 15 # Helvetica \[dq]A\[dq]
1485 155 222 242 48 185 48 168 86
1486 83 86 65 48 12 48 101 222
1487 155 222 128 179 126 179 97 116
1488 155 116 128 179 155 222
1489 \f[]
1490 .fi
1491 .LP
1492 If the number of vertices given is zero, then the character is a space.
1493 This is not the same as no entry, which means there is no valid glyph
1494 for that character.
1495 Glyphs may appear in any order, with indices ranging from 0 to 255.
1496 The maximum number of vertices for a single glyph is 32767.
1497 .PP
1498 Two standard font files are provided, \f[C]helvet.fnt\f[R] and
1499 \f[C]hexbit4x1.fnt\f[R].
1500 The former is a Helvetica font from the public domain Hershey font set.
1501 The second is a simple bit pattern font for hexadecimal encodings of
1502 bitmaps.
1503 .SH 3
1504 \f[BI]Radiance\f[B] Programs
1505 .pdfhref O 3 "Radiance Programs"
1506 .pdfhref M "radiance-programs-3"
1507 .LP
1508 Table 4 shows \f[I]Radiance\f[R] programs that read and write font
1509 files.
1510 .PP
1511 .na
1512 .TS
1513 delim(@@) tab( );
1514 l l l l.
1515 T{
1516 Program
1517 T} T{
1518 Read
1519 T} T{
1520 Write
1521 T} T{
1522 Function
1523 T}
1524 _
1525 T{
1526 \f[B]pcompos\f[R]
1527 T} T{
1528 X
1529 T} T{
1530 T} T{
1531 Compose \f[I]Radiance\f[R] pictures
1532 T}
1533 T{
1534 \f[B]psign\f[R]
1535 T} T{
1536 X
1537 T} T{
1538 T} T{
1539 Generate \f[I]Radiance\f[R] picture label
1540 T}
1541 T{
1542 \f[B]rpict\f[R]
1543 T} T{
1544 X
1545 T} T{
1546 T} T{
1547 Batch rendering program
1548 T}
1549 T{
1550 \f[B]rtrace\f[R]
1551 T} T{
1552 X
1553 T} T{
1554 T} T{
1555 Customizable ray-tracer
1556 T}
1557 T{
1558 \f[B]rview\f[R]
1559 T} T{
1560 X
1561 T} T{
1562 T} T{
1563 Interactive renderer
1564 T}
1565 .TE
1566 .ad
1567 .LP
1568 \f[B]Table 4.\f[R] Programs in the \f[I]Radiance\f[R] distribution that
1569 read and write font files.
1570 .SH 3
1571 \f[BI]Radiance\f[B] C Library
1572 .pdfhref O 3 "Radiance C Library"
1573 .pdfhref M "radiance-c-library-3"
1574 .LP
1575 Similar to data files, font files are usually read and stored in a
1576 lookup table.
1577 The data structures for fonts are in src/common/font.h, and the routines
1578 for reading and spacing them are in \f[C]src/common/font.c\f[R].
1579 The main structure type is \f[C]FONT\f[R].
1580 The routine \f[C]getfont(fname)\f[R] loads a font file from the
1581 \f[I]Radiance\f[R] library (set by the \f[C]RAYPATH\f[R] environment
1582 variable), and returns a pointer to the resulting \f[C]FONT\f[R]
1583 structure.
1584 If the file has been previously loaded, a pointer to the stored
1585 structure is returned.
1586 The \f[C]freefont(fname)\f[R] routine frees memory associated with the
1587 named font file and deletes it from the table, or frees all font data if
1588 \f[C]fname\f[R] is \f[C]NULL\f[R].
1589 .PP
1590 Three different routines are available for text spacing.
1591 The \f[C]uniftext(sp,tp,f\f[R]) function takes the nul-terminated string
1592 \f[C]tp\f[R] and computes uniform per-character spacing for the font
1593 \f[C]f\f[R], returned in the short integer array \f[C]sp\f[R].
1594 (This is a fairly simple process, and all spacing values will be 255
1595 unless a character has no corresponding glyph.)
1596 The \f[C]squeeztext(sp,tp,f,cis)\f[R] performs a similar function, but
1597 puts only \f[C]ci\f[R]s units between adjacent characters, based on the
1598 actual width of each font glyph.
1599 The most sophisticated spacing function is
1600 \f[C]proptext(sp,tp,f,cis,nsi)\f[R], which produces a total line length
1601 equal to what it would be with uniform spacing, while maintaining equal
1602 inter-character spacing throughout (i.e., proportional spacing).
1603 The \f[C]nsi\f[R] argument is the number of spaces (zero-vertex glyphs)
1604 considered as an indent.
1605 That is, if this many or more adjacent spaces occur in \f[C]tp\f[R], the
1606 indented text following will appear at the same point as it would have
1607 had the spacing been uniform.
1608 This maintains columns in tabulated text despite the proportional
1609 spacing.
1610 Tabs are not understood or interpreted by any of these routines, and
1611 must be expanded to the appropriate number of spaces via
1612 \f[B]expand\f[R].
1613 .SH 3
1614 Octree Format (.oct suffix)
1615 .pdfhref O 3 "Octree Format \(.oct suffix\)"
1616 .pdfhref M "octree-format-.oct-suffix"
1617 .LP
1618 In \f[I]Radiance\f[R], octrees are used to accelerate ray intersection
1619 calculations as described by Glassner [Glassner84].
1620 This data structure is computed by the \f[B]oconv\f[R] program, which
1621 produces a binary file as its output.
1622 An octree file contains a list of \f[I]Radiance\f[R] scene description
1623 files (which may be empty), some information to guarantee portability
1624 between systems and different versions of the code, followed by the
1625 octree data itself.
1626 If the octree file is \[lq]frozen,\[rq] then it will also contain the
1627 scene data, compiled into a binary format for quick loading.
1628 This is most convenient for octrees that are used in \f[I]instance\f[R]
1629 primitives, which may be moved to a different (library) location from
1630 the originating scene files.
1631 .PP
1632 An octree recursively subdivides 3-dimensional space into 8 subtrees,
1633 hence its name.
1634 Each \[lq]leaf\[rq] node contains between zero and \f[C]MAXSET\f[R]
1635 surface primitives, indicating that section of space contains part or
1636 all of those surfaces.
1637 (Surface primitives may appear more than once in the octree.)
1638 The goal of \f[B]oconv\f[R] is to build an octree that contains no more
1639 than N surfaces in each leaf node, where N is set by the \f[B]-n\f[R]
1640 option (5 by default).
1641 It may allow more surfaces in places where the octree has reached its
1642 maximum resolution (depth), set by the \f[B]-r\f[R] option (1024 \[em]
1643 depth 10 by default).
1644 Figure 3 shows a quadtree dividing 2-dimensional space, analogous to our
1645 3-dimensional octree.
1646 .PSPIC "figure3.eps"
1647 .ce 1000
1648 A quadtree dividing two-dimensional space
1649 .ce 0
1650 .PP
1651 \f[B]Figure 3.\f[R] An example quadtree divided so that no leaf node
1652 contains more than 2 objects.
1653 A three-dimensional octree works the same way.
1654 Each leaf node is either empty, or contains a list of intersecting
1655 surfaces.
1656 .SH 3
1657 Basic File Structure
1658 .pdfhref O 3 "Basic File Structure"
1659 .pdfhref M "basic-file-structure-1"
1660 .LP
1661 An octree file is divided into five sections: the information header,
1662 the scene boundaries, the scene file names, the octree data structure,
1663 and the compiled scene data.
1664 If the octree is frozen, then the compiled scene data is included and
1665 the scene file names are not.
1666 Otherwise, the scene data is left off.
1667 .SH 4
1668 Information Header
1669 .pdfhref O 4 "Information Header"
1670 .pdfhref M "information-header"
1671 .LP
1672 As with other binary \f[I]Radiance\f[R] formats, the beginning of an
1673 octree file is the information header.
1674 The first line is \[lq]#?RADIANCE\[rq] to aid in identification by the
1675 UNIX \f[B]file\f[R] program.
1676 Following this is the \f[B]oconv\f[R] command (or commands) used to
1677 produce the octree, then a line indicating the format,
1678 \f[C]FORMAT=Radiance_octree\f[R].
1679 The end of the information header is always an empty line.
1680 Here is an example of an octree information header, as reported by
1681 \f[B]getinfo\f[R]:
1682 .IP
1683 .nf
1684 \f[C]
1685 #?RADIANCE
1686 oconv model.b90 desk misc
1687 oconv -f -i modelb.oct window blinds lights lamp
1688 FORMAT=Radiance_octree
1689 \f[]
1690 .fi
1691 .LP
1692 The actual content of this header is ignored when an octree is read
1693 except for the \f[C]FORMAT\f[R] line, which if it appears must match the
1694 one shown above.
1695 .SH 4
1696 Scene Boundaries
1697 .pdfhref O 4 "Scene Boundaries"
1698 .pdfhref M "scene-boundaries"
1699 .LP
1700 After the information header, there is a magic number indicating the
1701 format version and the size of object indices (in bytes per index).
1702 This is a two-byte quantity, which must be one of the following in the
1703 current release:
1704 .PP
1705 .na
1706 .nr LLold \n[LL]
1707 .TS
1708 delim(@@) tab( );
1709 lw(35.0n) lw(35.0n).
1710 T{
1711 .nr LL 35.0n
1712 285
1713 T} T{
1714 .nr LL 35.0n
1715 Two-byte object indices.
1716 T}
1717 T{
1718 .nr LL 35.0n
1719 287
1720 T} T{
1721 .nr LL 35.0n
1722 Four-byte object indices.
1723 T}
1724 T{
1725 .nr LL 35.0n
1726 291
1727 T} T{
1728 .nr LL 35.0n
1729 Eight-byte object indices.
1730 (Only supported on architectures with 64-bit \f[B]longs\f[R].)
1731 T}
1732 .TE
1733 .nr LL \n[LLold]
1734 .ad
1735 .LP
1736 Technically, the code will also support odd-sized integers, but they are
1737 not found on any existing machine architectures so we can forget about
1738 them.
1739 .PP
1740 Following the octree magic number, we have the enclosing cube for the
1741 scene, which defines the dimensions of the octree\[cq]s root node.
1742 The cube is aligned along the world coordinate axes, so may be defined
1743 by one corner (the 3-dimensional minimum) and the side length.
1744 For historical reasons, these four values are stored as ASCII-encoded
1745 real values in nul-terminated strings.
1746 (The octree boundaries may also be read using \f[B]getinfo\f[R] with the
1747 \f[B]-d\f[R] option.)
1748 .SH 4
1749 Scene File Names
1750 .pdfhref O 4 "Scene File Names"
1751 .pdfhref M "scene-file-names"
1752 .LP
1753 Following the octree dimensions, the names of the scene description
1754 files are given, each stored a nul-terminated string.
1755 The end of this file list is indicated by an empty string.
1756 If the octree is \[lq]frozen,\[rq] meaning it contains the compiled
1757 scene information as well, then no file names will be present (i.e., the
1758 first string will be empty).
1759 .SH 4
1760 Octree Data Structure
1761 .pdfhref O 4 "Octree Data Structure"
1762 .pdfhref M "octree-data-structure"
1763 .LP
1764 After the scene description files, an N-byte integer indicates the total
1765 number of primitives given to \f[B]oconv\f[R], where N is the size
1766 derived from the magic number as we described.
1767 This object count will be used to verify that the files have not changed
1768 significantly since the octree was written\**.
1769 .FS
1770 Small changes that do not affect geometry will not cause problems, but
1771 if the primitive count changes, so does the indexing of surfaces, and
1772 with that the octree data structure becomes invalid.
1773 A second check is made to insure that no non-surface primitives appear
1774 in any leaf nodes, and this at least guarantees that the renderer will
1775 not dump core from an outdated octree, even if the results are wrong.
1776 .FE
1777 .PP
1778 After the primitive count, the actual octree is stored, using the
1779 following recursive procedure:
1780 .IP
1781 .nf
1782 \f[C]
1783 puttree(ot) begin
1784 if ot is a tree then
1785 write the character \[aq]\[rs]002\[aq]
1786 call puttree on each child node (0-7) else if ot is empty then
1787 write the character \[aq]\[rs]000\[aq]
1788 else
1789 write the character \[aq]\[rs]001\[aq]
1790 write out the number of surfaces
1791 write out each surface\[aq]s index
1792 end
1793 end puttree
1794 \f[]
1795 .fi
1796 .LP
1797 The number of surfaces and the surface indices are each N-byte integers,
1798 and the tree node types are single bytes.
1799 Reading the octree is accomplished with a complementary procedure.
1800 .SH 4
1801 Compiled Scene Data
1802 .pdfhref O 4 "Compiled Scene Data"
1803 .pdfhref M "compiled-scene-data"
1804 .LP
1805 If the octree is frozen, then this data structure is followed by a
1806 compiled version of the scene.
1807 This avoids the problems of changes to scene files, and allows an octree
1808 to be moved conveniently from one location and one system to another
1809 without worrying about the associated scene files.
1810 .PP
1811 The scene data begins with a listing of the defined primitive types.
1812 This list consists of the name of each type as a nul-terminated string,
1813 followed by an empty string once the list has been exhausted.
1814 This permits the indexing of primitive types with a single byte later
1815 on, without concern about changes to \f[I]Radiance\f[R] involving
1816 \f[C]src/common/otypes.h\f[R].
1817 .PP
1818 The scene primitives are written one at a time.
1819 First is a single byte with the primitive type index, as determined from
1820 the list given above.
1821 Second is the N-byte modifier index, followed by the primitive\[cq]s
1822 identifier as a nul-terminated string.
1823 String arguments start with a 2-byte integer indicating the argument
1824 count, followed by the strings themselves, which are nul-terminated.
1825 Real arguments next have a 2-byte count followed by the real values,
1826 each stored as a 4-byte mantissa followed by a 1-byte (signed) exponent.
1827 (The mantissa is the numerator of a fraction of @2 sup 31 \[u2212] 1@.)
1828 The end of data is indicated with a -1 value for the object type
1829 (byte=255).
1830 .SH 3
1831 \f[BI]Radiance\f[B] Programs
1832 .pdfhref O 3 "Radiance Programs"
1833 .pdfhref M "radiance-programs-4"
1834 .LP
1835 Table 5 shows \f[I]Radiance\f[R] programs that read and write octree
1836 files.
1837 .PP
1838 .na
1839 .TS
1840 delim(@@) tab( );
1841 l l l l.
1842 T{
1843 Program
1844 T} T{
1845 Read
1846 T} T{
1847 Write
1848 T} T{
1849 Function
1850 T}
1851 _
1852 T{
1853 \f[B]getinfo\f[R]
1854 T} T{
1855 X
1856 T} T{
1857 T} T{
1858 Print information header from binary file
1859 T}
1860 T{
1861 \f[B]oconv\f[R]
1862 T} T{
1863 X
1864 T} T{
1865 X
1866 T} T{
1867 Compile \f[I]Radiance\f[R] scene description
1868 T}
1869 T{
1870 \f[B]rad\f[R]
1871 T} T{
1872 X
1873 T} T{
1874 X
1875 T} T{
1876 Render \f[I]Radiance\f[R] scene
1877 T}
1878 T{
1879 \f[B]rpict\f[R]
1880 T} T{
1881 X
1882 T} T{
1883 T} T{
1884 Batch rendering program
1885 T}
1886 T{
1887 \f[B]rpiece\f[R]
1888 T} T{
1889 X
1890 T} T{
1891 T} T{
1892 Parallel batch rendering program
1893 T}
1894 T{
1895 \f[B]rtrace\f[R]
1896 T} T{
1897 X
1898 T} T{
1899 T} T{
1900 Customizable ray-tracer
1901 T}
1902 T{
1903 \f[B]rview\f[R]
1904 T} T{
1905 X
1906 T} T{
1907 T} T{
1908 Interactive renderer
1909 T}
1910 .TE
1911 .ad
1912 .LP
1913 \f[B]Table 5.\f[R] Programs in the \f[I]Radiance\f[R] distribution that
1914 read and write octree files.
1915 .SH 3
1916 \f[BI]Radiance\f[B] C Library
1917 .pdfhref O 3 "Radiance C Library"
1918 .pdfhref M "radiance-c-library-4"
1919 .LP
1920 Since reading an octree file also may involve reading a
1921 \f[I]Radiance\f[R] scene description, some of the same library routines
1922 are called indirectly.
1923 The header file \f[C]src/common/octree.h\f[R] is needed in addition to
1924 the \f[C]src/common/object.\f[R]h file.
1925 The module \f[C]src/ot/writeoct.c\f[R] contains the main routines for
1926 writing an octree to stdout, while \f[C]src/common/readoct.c\f[R]
1927 contains the corresponding routines for reading an octree from a file.
1928 Both modules access routines in \f[C]src/common/portio.c\f[R] for
1929 reading and writing portable binary data.
1930 .PP
1931 Here is the main call for writing out an octree:
1932 .IP "\f[B]\f[CB]writeoct(int store, CUBE *scene, char *ofn[]);\f[B]\f[R]" 3
1933 Write the octree stored in scene to stdout, assuming the header has
1934 already been written.
1935 The flags in store determine what will be included.
1936 Normally, this variable is one of \f[C]IO_ALL\f[R] or
1937 \f[C](IO_ALL & \[ti]IO_FILES)\f[R] correspondingto writing a normal or a
1938 frozen octree, respectively.
1939 .RS 3
1940 .RE
1941 .LP
1942 Here is the main call for reading in an octree:
1943 .IP "\f[B]\f[CB]readoct(char *fname, int load, CUBE *scene, char *ofn[]);\f[B]\f[R]" 3
1944 Read the octree file fname into scene, saving scene file names in the
1945 ofn array.
1946 What is loaded depends on the flags in load,which may be one or more of
1947 \f[C]IO_CHECK\f[R], \f[C]IO_INFO\f[R], \f[C]IO_SCENE\f[R],
1948 \f[C]IO_TREE\f[R], \f[C]IO_FILES\f[R] and \f[C]IO_BOUNDS\f[R].
1949 These correspond to checking file type and consistency, transferring the
1950 information header to stdout, loading the scene data, loading the octree
1951 structure, assigning the scene file names to ofn, and assigning the
1952 octree cube boundaries.
1953 The macro \f[C]IO_ALL\f[R] includes all of these flags, for convenience.
1954 .RS 3
1955 .RE
1956 .SH 2
1957 Picture File Format (.hdr suffix)
1958 .pdfhref O 2 "Picture File Format \(.hdr suffix\)"
1959 .pdfhref M "picture-file-format-.hdr-suffix"
1960 .LP
1961 \f[I]Radiance\f[R] pictures\**
1962 .FS
1963 The picture filename extension used to be .pic, but that conflicted with
1964 too many other programs.
1965 It was replaced with .hdr, an abbreviation of \[lq]high dynamic
1966 range.\[rq]
1967 .FE
1968 differ from standard computer graphics images inasmuch as they contain
1969 real physical data, namely radiance values at each pixel.
1970 To do this, it is necessary to maintain floating point information, and
1971 we use a 4-byte/pixel encoding described in Chapter II.5 of Graphics
1972 Gems II [Arvo91,p.80].
1973 The basic idea is to store a 1-byte mantissa for each of three
1974 primaries, and a common 1-byte exponent.
1975 The accuracy of these values will be on the order of 1% (±1 in 200) over
1976 a dynamic range from 10\*{-38\*} to 10\*{38\*}.
1977 .PP
1978 Although \f[I]Radiance\f[R] pictures \f[I]may\f[R] contain physical
1979 data, they do not \f[I]necessarily\f[R] contain physical data.
1980 If the rendering did not use properly modeled light sources, or the
1981 picture was converted from some other format, or custom filtering was
1982 applied, then the physical data will be invalid.
1983 Table 6 lists programs that read and write \f[I]Radiance\f[R] pictures,
1984 with pluses next to the X-marks indicating where physical data is
1985 preserved (or at least understood).
1986 Specifically, if the picture file read or written by a program has an
1987 \[lq]X+\[rq], then it has maintained the physical validity of the pixels
1988 by keeping track of any exposure or color corrections in the appropriate
1989 header variables, described below.
1990 .SH 3
1991 Basic File Structure
1992 .pdfhref O 3 "Basic File Structure"
1993 .pdfhref M "basic-file-structure-2"
1994 .LP
1995 \f[I]Radiance\f[R] picture files are divided into three sections: the
1996 information header, the resolution string, and the scanline records.
1997 All of these must be present or the file is incomplete.
1998 .SH 4
1999 Information Header
2000 .pdfhref O 4 "Information Header"
2001 .pdfhref M "information-header-1"
2002 .LP
2003 The information header begins with the usual \f[C]#?RADIANCE\f[R]
2004 identifier, followed by one or more lines containing the programs used
2005 to produce the picture.
2006 These commands may be interspersed with variables describing relevant
2007 information such as the view, exposure, color correction, and so on.
2008 Variable assignments begin on a new line, and the variable name (usually
2009 all upper case) is followed by an equals sign (`='), which is followed
2010 by the assigned value up until the end of line.
2011 Some variable assignments override previous assignments in the same
2012 header, where other assignments are cumulative.
2013 Here are the most important variables for \f[I]Radiance\f[R] pictures:
2014 .IP "\f[B]\f[CB]FORMAT\f[B]\f[R]" 3
2015 A line indicating the file\[cq]s format.
2016 At most one \f[C]FORMAT\f[R] line is allowed, and it must be assigned a
2017 value of either \f[C]32- bit_rle_rgbe\f[R] or \f[C]32-bit_rle_xyze\f[R]
2018 to be a valid \f[I]Radiance\f[R] picture.
2019 .RS 3
2020 .RE
2021 .IP "\f[B]\f[CB]EXPOSURE\f[B]\f[R]" 3
2022 A single floating point number indicating a multiplier that has been
2023 applied to all the pixels in the file.
2024 \f[C]EXPOSURE\f[R] values are cumulative, so the original pixel values
2025 (i.e., radiances in w/sr/m\*{2\*}) must be derived by taking the values
2026 in the file and dividing by all the \f[C]EXPOSURE\f[R] settings
2027 multiplied together.
2028 No \f[C]EXPOSURE\f[R] setting implies that no exposure changes have
2029 taken place.
2030 .RS 3
2031 .RE
2032 .IP "\f[B]\f[CB]COLORCORR\f[B]\f[R]" 3
2033 A color correction multiplier that has been applied to this picture.
2034 Similar to the \f[C]EXPOSURE\f[R] variable except given in three parts
2035 for the three primaries.
2036 In general, the value should have a brightness of unity, so that it does
2037 not affect the actual brightness of pixels, which should be tracked by
2038 \f[C]EXPOSURE\f[R] changes instead.
2039 (This variable is also cumulative.)
2040 .RS 3
2041 .RE
2042 .IP "\f[B]\f[CB]SOFTWARE\f[B]\f[R]" 3
2043 The software version used to create the picture, usually something like
2044 \f[C]RADIANCE 3.04 official release July 16, 1996\f[R].
2045 .RS 3
2046 .RE
2047 .IP "\f[B]\f[CB]PIXASPECT\f[B]\f[R]" 3
2048 The pixel aspect ratio, expressed as a decimal fraction of the height of
2049 each pixel to its width.
2050 This is not to be confused with the image aspect ratio, which is the
2051 total height over width.
2052 (The image aspect ratio is actually equal to the height in pixels over
2053 the width in pixels, \f[I]multiplied\f[R] by the pixel aspect ratio.)
2054 These assignments are cumulative, so the actual pixel aspect ratio is
2055 all ratios multiplied together.
2056 If no \f[C]PIXASPECT\f[R] assignment appears, the ratio is assumed to be
2057 1.
2058 .RS 3
2059 .RE
2060 .IP "\f[B]\f[CB]VIEW\f[B]\f[R]" 3
2061 The \f[I]Radiance\f[R] view parameters used to create this picture.
2062 Multiple assignments are cumulative inasmuch as new view options add to
2063 or override old ones.
2064 .RS 3
2065 .RE
2066 .LP
2067 \f[C]PRIMARIES\f[R] The CIE (x,y) chromaticity coordinates of the three
2068 (RGB) primaries and the white point used to standardize the
2069 picture\[cq]s color system.
2070 This is used mainly by the \f[B]ra_xyze\f[R] program to convert between
2071 color systems.
2072 If no \f[C]PRIMARIES\f[R] line appears, we assume the standard primaries
2073 defined in \f[C]src/common/color.h\f[R], namely
2074 \f[C]0.640 0.330 0.290 0.600 0.150 0.060 0.333 0.333\f[R] for red,
2075 green, blue and white, respectively.
2076 .PP
2077 As always, the end of the header is indicated by an empty line.
2078 .SH 4
2079 Resolution String
2080 .pdfhref O 4 "Resolution String"
2081 .pdfhref M "resolution-string"
2082 .LP
2083 All \f[I]Radiance\f[R] pictures have a standard coordinate system, which
2084 is shown in Figure 4.
2085 The origin is always at the lower left corner, with the X coordinate
2086 increasing to the right, and the Y coordinate increasing in the upward
2087 direction.
2088 The actual ordering of pixels in the picture file, however, is addressed
2089 by the resolution string.
2090 .PSPIC "figure4.eps"
2091 .ce 1000
2092 Radiance picture coordinate system
2093 .ce 0
2094 .PP
2095 \f[B]Figure 4.\f[R] The standard coordinate system for an MxN picture.
2096 .PP
2097 The resolution string is given as one of the following:
2098 .IP "\f[B]\f[CB]-Y N +X M\f[B]\f[R]" 3
2099 The standard orientation produced by the renderers, indicating that Y is
2100 decreasing in the file, and X is increasing.
2101 X positions are increasing in each scanline, starting with the upper
2102 left position in the picture and moving to the upper right initially,
2103 then on down the picture.
2104 Some programs will only handle pictures with this ordering.
2105 .RS 3
2106 .RE
2107 .IP "\f[B]\f[CB]-Y N -X M\f[B]\f[R]" 3
2108 The X ordering has been reversed, effectively flipping the image left to
2109 right from the standard ordering.
2110 .RS 3
2111 .RE
2112 .IP "\f[B]\f[CB]+Y N -X M\f[B]\f[R]" 3
2113 The image has been flipped left to right and also top to bottom, which
2114 is the same as rotating it by 180 degrees.
2115 .RS 3
2116 .RE
2117 .IP "\f[B]\f[CB]+Y N +X M\f[B]\f[R]" 3
2118 The image has been flipped top to bottom from the standard ordering.
2119 .RS 3
2120 .RE
2121 .IP "\f[B]\f[CB]+X M +Y N\f[B]\f[R]" 3
2122 The image has been rotated 90 degrees clockwise.
2123 .RS 3
2124 .RE
2125 .IP "\f[B]\f[CB]-X M +Y N\f[B]\f[R]" 3
2126 The image has been rotated 90 degrees clockwise, then flipped top to
2127 bottom.
2128 .RS 3
2129 .RE
2130 .IP "\f[B]\f[CB]-X M -Y N\f[B]\f[R]" 3
2131 The image has been rotated 90 degrees counter-clockwise.
2132 .RS 3
2133 .RE
2134 .IP "\f[B]\f[CB]+X M -Y N\f[B]\f[R]" 3
2135 The image has been rotate 90 degrees counter-clockwise, then flipped top
2136 to bottom.
2137 .RS 3
2138 .RE
2139 .LP
2140 The reason for tracking all these changes in picture orientation is so
2141 programs that compute ray origin and direction from the \f[C]VIEW\f[R]
2142 variable in the information header will work despite such changes.
2143 Also, it can reduce memory requirements on converting from other image
2144 formats that have a different scanline ordering, such as Targa.
2145 .SH 4
2146 Scanline Records
2147 .pdfhref O 4 "Scanline Records"
2148 .pdfhref M "scanline-records"
2149 .LP
2150 \f[I]Radiance\f[R] scanlines come in one of three flavors, described
2151 below:
2152 .IP "\f[B]Uncompressed\f[R]" 3
2153 Each scanline is represented by M pixels with 4 bytes per pixel, for a
2154 total length of 4xM bytes.
2155 This is the simplest format to read and write, since it has a one-to-one
2156 correspondence to an array of \f[C]COLR\f[R] values.
2157 .RS 3
2158 .RE
2159 .IP "\f[B]Old run-length encoded\f[R]" 3
2160 Repeated pixel values are indicated by an illegal (i.e., unnormalized)
2161 pixel that has 1\[cq]s for all three mantissas, and an exponent that
2162 corresponds to the number of times the previous pixel is repeated.
2163 Consecutive repeat indicators contain higher-order bytes of the count.
2164 .RS 3
2165 .RE
2166 .IP "\f[B]New run-length encoded\f[R]" 3
2167 In this format, the four scanline components (three primaries and
2168 exponent) are separated for better compression using adaptive run-length
2169 encoding (described by Glassner in Chapter II.8 of Graphics Gems II
2170 [Arvo91,p.89]).
2171 The record begins with an unnormalized pixel having two bytes equal to
2172 2, followed by the upper byte and the lower byte of the scanline length
2173 (which must be less than 32768).
2174 A run is indicated by a byte with its high-order bit set, corresponding
2175 to a count with excess 128.
2176 A non-run is indicated with a byte less than 128.
2177 The maximum compression ratio using this scheme is better than 100:1,
2178 but typical performance for \f[I]Radiance\f[R] pictures is more like
2179 2:1.
2180 .RS 3
2181 .RE
2182 .LP
2183 The physical values these scanlines correspond to depend on the format
2184 and other information contained in the information header.
2185 If the \f[C]FORMAT\f[R] string indicates RGB data, then the units for
2186 each primary are spectral radiances over the corresponding waveband,
2187 such that a pixel value of @left ( 1 , 1 , 1 right )@ corresponds to a
2188 total energy of 1 w/sr/m\*{2\*} over the visible spectrum.
2189 The actual luminance value (in lm/sr/m\*{2\*}) can be computed from the
2190 following formula for the standard \f[I]Radiance\f[R] RGB primaries:
2191 .PP
2192 .EQ
2193 L sub v = 179 left ( 0.265 r + 0.670 g + 0.065 b right )
2194 .EN
2195 .PP
2196 The value of 179 lm/w is the standard \f[I]luminous efficacy\f[R] of
2197 equal-energy white light that is defined and used by \f[I]Radiance\f[R]
2198 specifically for this conversion.
2199 This and the other values above are defined in
2200 \f[C]src/common/color.h\f[R], and the above formula is given as a macro,
2201 \f[C]luminance(col)\f[R].
2202 .PP
2203 If the \f[C]FORMAT\f[R] string indicates XYZ data, then the units of the
2204 Y primary are already lm/st/m\*{2\*}, so the above conversion is
2205 unnecessary.
2206 .SH 3
2207 \f[BI]Radiance\f[B] programs
2208 .pdfhref O 3 "Radiance programs"
2209 .pdfhref M "radiance-programs-5"
2210 .LP
2211 Table 6 shows the many programs that read and write \f[I]Radiance\f[R]
2212 pictures.
2213 .PP
2214 .na
2215 .TS
2216 delim(@@) tab( );
2217 l l l l.
2218 T{
2219 Program
2220 T} T{
2221 Read
2222 T} T{
2223 Write
2224 T} T{
2225 Function
2226 T}
2227 _
2228 T{
2229 \f[B]falsecolor\f[R]
2230 T} T{
2231 X+
2232 T} T{
2233 X
2234 T} T{
2235 Create false color image
2236 T}
2237 T{
2238 \f[B]findglare\f[R]
2239 T} T{
2240 X+
2241 T} T{
2242 T} T{
2243 Find sources of discomfort glare
2244 T}
2245 T{
2246 \f[B]getinfo\f[R]
2247 T} T{
2248 X
2249 T} T{
2250 T} T{
2251 Print information header from binary file
2252 T}
2253 T{
2254 \f[B]macbethcal\f[R]
2255 T} T{
2256 X
2257 T} T{
2258 X
2259 T} T{
2260 Compute image color & contrast correction
2261 T}
2262 T{
2263 \f[B]normpat\f[R]
2264 T} T{
2265 X
2266 T} T{
2267 X
2268 T} T{
2269 Normalize picture for use as pattern tile
2270 T}
2271 T{
2272 \f[B]objpict\f[R]
2273 T} T{
2274 T} T{
2275 X
2276 T} T{
2277 Generate composite picture of object
2278 T}
2279 T{
2280 \f[B]pcomb\f[R]
2281 T} T{
2282 X+
2283 T} T{
2284 X
2285 T} T{
2286 Perform arbitrary math on picture(s)
2287 T}
2288 T{
2289 \f[B]pcond\f[R]
2290 T} T{
2291 X+
2292 T} T{
2293 X
2294 T} T{
2295 Condition a picture for display
2296 T}
2297 T{
2298 \f[B]pcompos\f[R]
2299 T} T{
2300 X
2301 T} T{
2302 X
2303 T} T{
2304 Composite pictures
2305 T}
2306 T{
2307 \f[B]pextrem\f[R]
2308 T} T{
2309 X+
2310 T} T{
2311 T} T{
2312 Find minimum and maximum pixels
2313 T}
2314 T{
2315 \f[B]pfilt\f[R]
2316 T} T{
2317 X+
2318 T} T{
2319 X+
2320 T} T{
2321 Filter and anti-alias picture
2322 T}
2323 T{
2324 \f[B]pflip\f[R]
2325 T} T{
2326 X+
2327 T} T{
2328 X+
2329 T} T{
2330 Flip picture left-right and/or top-bottom
2331 T}
2332 T{
2333 \f[B]pinterp\f[R]
2334 T} T{
2335 X+
2336 T} T{
2337 X+
2338 T} T{
2339 Interpolate/extrapolate picture views
2340 T}
2341 T{
2342 \f[B]protate\f[R]
2343 T} T{
2344 X+
2345 T} T{
2346 X+
2347 T} T{
2348 Rotate picture 90 degrees clockwise
2349 T}
2350 T{
2351 \f[B]psign\f[R]
2352 T} T{
2353 T} T{
2354 X
2355 T} T{
2356 Create text picture
2357 T}
2358 T{
2359 \f[B]pvalue\f[R]
2360 T} T{
2361 X+
2362 T} T{
2363 X+
2364 T} T{
2365 Convert picture to/from simpler formats
2366 T}
2367 T{
2368 \f[B]ra_avs\f[R]
2369 T} T{
2370 X
2371 T} T{
2372 X
2373 T} T{
2374 Convert to/from AVS image format
2375 T}
2376 T{
2377 \f[B]ra_pict\f[R]
2378 T} T{
2379 X
2380 T} T{
2381 X
2382 T} T{
2383 Convert to/from Macintosh PICT2 format
2384 T}
2385 T{
2386 \f[B]ra_ppm\f[R]
2387 T} T{
2388 X
2389 T} T{
2390 X
2391 T} T{
2392 Convert to/from Poskanzer Port.
2393 Pixmap
2394 T}
2395 T{
2396 \f[B]ra_pr\f[R]
2397 T} T{
2398 X
2399 T} T{
2400 X
2401 T} T{
2402 Convert to/from Sun 8-bit rasterfile
2403 T}
2404 T{
2405 \f[B]ra_pr24\f[R]
2406 T} T{
2407 X
2408 T} T{
2409 X
2410 T} T{
2411 Convert to/from Sun 24-bit rasterfile
2412 T}
2413 T{
2414 \f[B]ra_ps\f[R]
2415 T} T{
2416 X
2417 T} T{
2418 T} T{
2419 Convert to B&W or color PostScript
2420 T}
2421 T{
2422 \f[B]ra_rgbe\f[R]
2423 T} T{
2424 X
2425 T} T{
2426 X
2427 T} T{
2428 Convert to/from uncompressed picture
2429 T}
2430 T{
2431 \f[B]ra_t8\f[R]
2432 T} T{
2433 X
2434 T} T{
2435 X
2436 T} T{
2437 Convert to/from Targa 8-bit format
2438 T}
2439 T{
2440 \f[B]ra_t16\f[R]
2441 T} T{
2442 X
2443 T} T{
2444 X
2445 T} T{
2446 Convert to/from Targa 16-bit and 24-bit
2447 T}
2448 T{
2449 \f[B]ra_tiff\f[R]
2450 T} T{
2451 X
2452 T} T{
2453 X
2454 T} T{
2455 Convert to/from TIFF 8-bit and 24-bit
2456 T}
2457 T{
2458 \f[B]ra_xyze\f[R]
2459 T} T{
2460 X
2461 T} T{
2462 X
2463 T} T{
2464 Convert to/from CIE primary picture
2465 T}
2466 T{
2467 \f[B]rad\f[R]
2468 T} T{
2469 T} T{
2470 X+
2471 T} T{
2472 Render Radiance scene
2473 T}
2474 T{
2475 \f[B]ranimate\f[R]
2476 T} T{
2477 T} T{
2478 X+
2479 T} T{
2480 Animate Radiance scene
2481 T}
2482 T{
2483 \f[B]rpict\f[R]
2484 T} T{
2485 X
2486 T} T{
2487 X+
2488 T} T{
2489 Batch rendering program
2490 T}
2491 T{
2492 \f[B]rpiece\f[R]
2493 T} T{
2494 X
2495 T} T{
2496 X+
2497 T} T{
2498 Parallel batch rendering program
2499 T}
2500 T{
2501 \f[B]rtrace\f[R]
2502 T} T{
2503 X
2504 T} T{
2505 X+
2506 T} T{
2507 Customizable ray-tracer
2508 T}
2509 T{
2510 \f[B]rview\f[R]
2511 T} T{
2512 X
2513 T} T{
2514 X+
2515 T} T{
2516 Interactive renderer
2517 T}
2518 T{
2519 \f[B]vwright\f[R]
2520 T} T{
2521 X
2522 T} T{
2523 T} T{
2524 Get view parameters and shift them
2525 T}
2526 T{
2527 \f[B]xglaresrc\f[R]
2528 T} T{
2529 X
2530 T} T{
2531 T} T{
2532 Display glare sources from \f[B]findglare\f[R]
2533 T}
2534 T{
2535 \f[B]ximage\f[R]
2536 T} T{
2537 X+
2538 T} T{
2539 T} T{
2540 Display \f[I]Radiance\f[R] picture under \f[I]X11\f[R]
2541 T}
2542 T{
2543 \f[B]xshowtrace\f[R]
2544 T} T{
2545 X
2546 T} T{
2547 T} T{
2548 Show ray traces on \f[I]X11\f[R] display
2549 T}
2550 .TE
2551 .ad
2552 .LP
2553 \f[B]Table 6.\f[R] \f[I]Radiance\f[R] programs that read and write
2554 picture files.
2555 Pluses indicate when a program makes use of or preserves physical pixel
2556 values.
2557 .SH 3
2558 \f[BI]Radiance\f[B] C Library
2559 .pdfhref O 3 "Radiance C Library"
2560 .pdfhref M "radiance-c-library-5"
2561 .LP
2562 There are a fair number of routines for reading, writing and
2563 manipulating \f[I]Radiance\f[R] pictures.
2564 If you want to write a converter to or from a 24-bit image format, you
2565 can follow the skeletal example in \f[C]src/px/ra_skel.c\f[R].
2566 This has all of the basic functionality of the other \f[B]ra_*\f[R]
2567 image conversion programs, with the actual code for the destination type
2568 removed (or simplified).
2569 The method in \f[C]ra_skel\f[R] uses the routines in
2570 \f[C]src/common/colrops.c\f[R] to avoid conversion to machine floating
2571 point, which can slow things down and is not necessary in this case.
2572 .PP
2573 Below we describe routines for reading and writing pictures, which rely
2574 heavily on definitions in \f[C]src/common/color.h\f[R].
2575 We start with the calls for manipulating information headers, followed
2576 by the calls for resolution strings, then the calls for scanline
2577 records.
2578 .PP
2579 Information headers are manipulated with the routines in
2580 \f[C]src/common/header.c\f[R] and the macros in \f[C]color.h\f[R].
2581 Features for handing views are defined in \f[C]src/common/view.h\f[R]
2582 with routines in \f[C]src/common/image.c\f[R].
2583 Here are the relevant calls for reading and copying information headers:
2584 .IP "\f[B]\f[CB]int checkheader(FILE *fin, char *fmt, FILE *fout);\f[B]\f[R]" 3
2585 Read the header information from \f[C]fin\f[R], copying to
2586 \f[C]fou\f[R]t (unless fout is \f[C]NULL\f[R]), checking any
2587 \f[C]FORMAT\f[R] line against the string \f[C]fmt\f[R].
2588 The \f[C]FORMAT\f[R] line (if it exists) will not be copied to
2589 \f[C]fout\f[R].
2590 The function returns 1 if the header was OK and the format matched, 0 if
2591 the header was OK but there was no format line, and -1 if the format
2592 line did not match or there was some problem reading the header.
2593 Wildcard characters (`*' and `?') may appear in \f[C]fmt\f[R], in which
2594 case a globbing match is applied, and the matching format value will be
2595 copied to fmt upon success.
2596 The normal \f[C]fmt\f[R] values for pictures are \f[C]COLRFMT\f[R] for
2597 \f[I]Radiance\f[R] RGB, \f[C]CIEFMT\f[R] for 4-byte XYZ pixels, or a
2598 copy of \f[C]PICFMT\f[R] for glob matches to either.
2599 (Do not pass \f[C]PICFMT\f[R] directly, as this will cause an illegal
2600 memory access on systems that store static strings in read-only memory.)
2601 .RS 3
2602 .RE
2603 .IP "\f[B]\f[CB]int getheader(FILE *fp, int (*f)(), char *p);\f[B]\f[R]" 3
2604 For those who need more control, \f[C]getheader\f[R] reads the header
2605 from \f[C]fp\f[R], calling the function \f[C]f\f[R] (if
2606 not\f[C]NULL\f[R]) with each input line and the client data pointer
2607 \f[C]p\f[R].
2608 A simple call to skip the header is \f[C]getheader(fp,NULL,NULL)\f[R].
2609 To copy the header unconditionally to \f[C]stdout\f[R], call
2610 \f[C]getheader(fp,fputs,stdout)\f[R].
2611 More often, \f[C]getheader\f[R] is called with a client function, which
2612 checks each line for specific variable settings.
2613 .RS 3
2614 .RE
2615 .IP "\f[B]\f[CB]int isformat(char *s);\f[B]\f[R]" 3
2616 Returns non-zero if the line \f[C]s\f[R] is a \f[C]FORMAT\f[R]
2617 assignment.
2618 .RS 3
2619 .RE
2620 .IP "\f[B]\f[CB]int formatval(char *r, char *s);\f[B]\f[R]" 3
2621 Returns the \f[C]FORMAT\f[R] value from line \f[C]s\f[R] in the string
2622 \f[C]r\f[R].
2623 Returns non-zero if \f[C]s\f[R] is a valid format line.
2624 .RS 3
2625 .RE
2626 .IP "\f[B]\f[CB]fputformat(char *s, FILE *fp);\f[B]\f[R]" 3
2627 Put format assignment \f[C]s\f[R] to the stream \f[C]fp\f[R].
2628 .RS 3
2629 .RE
2630 .IP "\f[B]\f[CB]isexpos(s)\f[B]\f[R]" 3
2631 Macro returns non-zero if the line \f[C]s\f[R] is an \f[C]EXPOSURE\f[R]
2632 setting.
2633 .RS 3
2634 .RE
2635 .IP "\f[B]exposval(s)\f[R]" 3
2636 Macro returns \f[B]double\f[R] exposure value from line \f[C]s\f[R].
2637 .RS 3
2638 .RE
2639 .IP "\f[B]\f[CB]fputexpos(ex,fp)\f[B]\f[R]" 3
2640 Macro** | puts real exposure value \f[C]ex\f[R] to stream \f[C]fp\f[R].
2641 .RS 3
2642 .RE
2643 .LP
2644 \f[C]iscolcor(s)\f[R] :Macro returns non-zero if the line \f[C]s\f[R] is
2645 a \f[C]COLORCORR\f[R] setting.
2646 .IP "\f[B]\f[CB]colcorval(cc,s)\f[B]\f[R]" 3
2647 Macro assign color correction value from line \f[C]s\f[R] in the
2648 \f[C]COLOR\f[R] variable \f[C]cc\f[R].
2649 .RS 3
2650 .RE
2651 .IP "\f[B]\f[CB]fputcolcor(cc,fp)\f[B]\f[R]" 3
2652 Macro puts correction \f[C]COLOR\f[R] \f[C]cc\f[R] to stream
2653 \f[C]fp\f[R].
2654 .RS 3
2655 .RE
2656 .IP "\f[B]\f[CB]isaspect(s)\f[B]\f[R]" 3
2657 Macro returns non-zero if the line \f[C]s\f[R] is a \f[C]PIXASPECT\f[R]
2658 setting.
2659 .RS 3
2660 .RE
2661 .IP "\f[B]\f[CB]aspectval(s)\f[B]\f[R]" 3
2662 Macro returns double pixel aspect value from line \f[C]s\f[R].
2663 .RS 3
2664 .RE
2665 .IP "\f[B]\f[CB]fputaspect(pa,fp)\f[B]\f[R]" 3
2666 Macro puts real pixel aspect value \f[C]pa\f[R] to stream \f[C]fp\f[R].
2667 .RS 3
2668 .RE
2669 .IP "\f[B]\f[CB]int isview(char *s);\f[B]\f[R]" 3
2670 Returns non-zero if header line \f[C]s\f[R] contains view parameters.
2671 Note that \[ga]\f[C]s\f[R] could be either a \f[C]VIEW\f[R] assignment
2672 or a rendering command.
2673 .RS 3
2674 .RE
2675 .IP "\f[B]\f[CB]int sscanview(VIEW *vp, char *s);\f[B]\f[R]" 3
2676 Scan view options from the string \f[C]s\f[R] into the \f[C]VIEW\f[R]
2677 structure pointed to by \f[C]vp\f[R].
2678 .RS 3
2679 .RE
2680 .IP "\f[B]\f[CB]fprintview(VIEW *vp, FILE *fp);\f[B]\f[R]" 3
2681 Print view options in \f[C]vp\f[R] to the stream \f[C]fp\f[R].
2682 Note that this does not print out \[lq]VIEW=\[rq] first, or end the
2683 line.
2684 Therefore, one usually calls \f[C]fputs(VIEWSTR,fp)\f[R] followed by
2685 \f[C]fprintview(vp,fp)\f[R], then \f[C]putc(\[aq]\[rs]n\[aq],fp)\f[R].
2686 .RS 3
2687 .RE
2688 .IP "\f[B]\f[CB]isprims(s)\f[B]\f[R]" 3
2689 Macro returns non-zero if the line \f[C]s\f[R] is a \f[C]PRIMARIES\f[R]
2690 setting.
2691 .RS 3
2692 .RE
2693 .IP "\f[B]\f[CB]primsval(p,s)\f[B]\f[R]" 3
2694 Macro assign color primitives from line \f[C]s\f[R] in the
2695 \f[C]RGBPRIMS\f[R] variable \f[C]p\f[R].
2696 .RS 3
2697 .RE
2698 .IP "\f[B]\f[CB]fputprims(p,fp)\f[B]\f[R]" 3
2699 Macro puts color primitives \f[C]p\f[R] to stream \f[C]fp\f[R].
2700 .RS 3
2701 .RE
2702 .LP
2703 The header file \f[C]src/common/resolu.h\f[R] has macros for resolution
2704 strings, which are handled by routines in \f[C]src/common/resolu.c\f[R].
2705 Here are the relevant calls:
2706 .IP "\f[B]\f[CB]fgetsresolu(rs,fp)\f[B]\f[R]" 3
2707 Macro to get a resolution string from the stream \f[C]fp\f[R] and put it
2708 in the \f[C]RESOLU\f[R] structure pointed to by \f[C]rs\f[R].
2709 The return value is non-zero if the resolution was successfully loaded.
2710 .RS 3
2711 .RE
2712 .IP "\f[B]\f[CB]fputsresolu(rs,fp)\f[B]\f[R]" 3
2713 Macro to write the \f[C]RESOLU\f[R] structure pointed to by rs to the
2714 stream fp.
2715 .RS 3
2716 .RE
2717 .IP "\f[B]\f[CB]scanlen(rs)\f[B]\f[R]" 3
2718 Macro to get the scanline length from the \f[C]RESOL\f[R]U structure
2719 pointed to by \f[C]rs\f[R].
2720 .RS 3
2721 .RE
2722 .IP "\f[B]\f[CB]numscans(rs)\f[B]\f[R]" 3
2723 Macro to get the number of scanlines from the \f[C]RESOLU\f[R] structure
2724 pointed to by \f[C]rs\f[R].
2725 .RS 3
2726 .RE
2727 .IP "\f[B]\f[CB]fscnresolu(slp,nsp,fp)\f[B]\f[R]" 3
2728 Macro to read in a resolution string from \f[C]f\f[R]p and assign the
2729 scanline length and number of scanlines to the integers pointed to by
2730 \f[C]slp\f[R] and \f[C]nsp\f[R], respectively.
2731 This call expects standard English-text ordered scanlines, and returns
2732 non-zero only if the resolution string agrees.
2733 .RS 3
2734 .RE
2735 .IP "\f[B]\f[CB]fprtresolu(sl,ns,fp)\f[B]\f[R]" 3
2736 Macro to print out a resolution string for \f[C]ns\f[R] scanlines of
2737 length \f[C]sl\f[R] in standard English-text ordering to \f[C]fp\f[R].
2738 .RS 3
2739 .RE
2740 .LP
2741 The file \f[C]src/common/color.c\f[R] contains the essential routines
2742 for reading and writing scanline records.
2743 Here are the relevant calls and macros:
2744 .IP "\f[B]\f[CB]int freadcolrs(COLR *scn, int sl, FILE *fp);\f[B]\f[R]" 3
2745 Read a scanline record of length \f[C]sl\f[R] from stream \f[C]fp\f[R]
2746 into the \f[C]COLR\f[R] array \f[C]scn\f[R].
2747 Interprets uncompressed, old, and new run-length encoded records.
2748 Returns 0 on success, -1 on failure.
2749 .RS 3
2750 .RE
2751 .IP "\f[B]\f[CB]int fwritecolrs(COLR *scn, int sl, FILE *fp);\f[B]\f[R]" 3
2752 Write the scanline record stored in the \f[C]COLR\f[R] array
2753 \f[C]scn\f[R], length \f[C]sl\f[R], to the stream \f[C]fp\f[R].
2754 Uses the new run-length encoding unless \f[C]sl\f[R] is less than 8 or
2755 greater than 32767, when an uncompressed record is written.
2756 Returns 0 on success, -1 if there was an error.
2757 .RS 3
2758 .RE
2759 .IP "\f[B]\f[CB]int freadscan(COLOR *fscn, int sl, FILE *fp);\f[B]\f[R]" 3
2760 Reads a scanline of length \f[C]sl\f[R] from the stream \f[C]fp\f[R] and
2761 converts to machine floating-point format in the array \f[C]fscn\f[R].
2762 Recognizes all scanline record encodings.
2763 Returns 0 on success, or -1 on failure.
2764 .RS 3
2765 .RE
2766 .IP "\f[B]\f[CB]int fwritescan(COLOR *fscn, int sl, FILE *fp);\f[B]\f[R]" 3
2767 Write the floating-point scanline of length \f[C]sl\f[R] stored in the
2768 array fscn to the stream \f[C]fp\f[R].
2769 Converts to 4-byte/pixel scanline format and calls \f[C]fwritecolrs\f[R]
2770 to do the actual write.
2771 Returns 0 on success, or -1 if there was an error.
2772 .RS 3
2773 .RE
2774 .IP "\f[B]\f[CB]colval(col,p)\f[B]\f[R]" 3
2775 Macro to get primary p from the floating-point \f[C]COLOR col\f[R].
2776 The primary index may be one of \f[C]RED\f[R], \f[C]GRN\f[R] or
2777 \f[C]BLU\f[R] for RGB colors, or CIEX, CIEY or CIEZ for XYZ colors.
2778 This macro is a valid lvalue, so can be used on the left of assignment
2779 statements as well.
2780 .RS 3
2781 .RE
2782 .IP "\f[B]\f[CB]colrval(clr,p)\f[B]\f[R]" 3
2783 Macro to get primary \f[C]p\f[R] from the 4-byte \f[C]COLR\f[R] pixel
2784 \f[C]clr\f[R].
2785 The primary index may be one of RED, GRN or BLU for RGB colors, or CIEX,
2786 CIEY or CIEZ for XYZ colors.
2787 Unless just one primary is needed, it is more efficient to call
2788 \f[C]colr_color\f[R] and use the \f[C]colval\f[R] macro on the result.
2789 .RS 3
2790 .RE
2791 .IP "\f[B]\f[CB]colr_color(COLOR col, COLR clr);\f[B]\f[R]" 3
2792 Convert the 4-byte pixel \f[C]clr\f[R] to a machine floating-point
2793 representation and store the result in \f[C]col\f[R].
2794 .RS 3
2795 .RE
2796 .IP "\f[B]\f[CB]setcolr(COLR clr, double p1, p2, p3);\f[B]\f[R]" 3
2797 Assign the 4-byte pixel \f[C]clr\f[R] according to the three primary
2798 values \f[C]p1\f[R], \f[C]p2\f[R] and \f[C]p3\f[R].
2799 These can be either \f[I]Radiance\f[R] RGB values or CIE XYZ values.
2800 .RS 3
2801 .RE
2802 .SH 2
2803 Z-buffer Format (.zbf suffix)
2804 .pdfhref O 2 "Z-buffer Format \(.zbf suffix\)"
2805 .pdfhref M "z-buffer-format-.zbf-suffix"
2806 .LP
2807 The Z-buffer format used in \f[I]Radiance\f[R] hardly qualifies as a
2808 format at all.
2809 It is in fact a straight copy on the 4-byte machine floating point
2810 values of each pixel in standard scanline order.
2811 There is no information header or resolution string that would make the
2812 file independently useful.
2813 This is usually OK, because Z-buffer files are almost always created and
2814 used in conjunction with a picture file, which has this identifying
2815 information.
2816 .PP
2817 The major shortcoming of this format is that the machine representation
2818 and byte ordering is not always the same from one system to another,
2819 which limits the portability of Z-buffer files.
2820 Since they are primarily used for interpolating animation frames, and
2821 this usually occurs on networks with similar architectures, there is
2822 usually no problem.
2823 Also, since the adoption of IEEE standard floating-point calculations,
2824 different machine representations are becoming quite rare.
2825 [TBD: is this necessary at this point?]
2826 .SH 3
2827 \f[BI]Radiance\f[B] programs
2828 .pdfhref O 3 "Radiance programs"
2829 .pdfhref M "radiance-programs-6"
2830 .LP
2831 Table 7 shows the programs that read and write \f[I]Radiance\f[R]
2832 Z-buffer files.
2833 The pvalue program may be used to convert Z-buffer files to
2834 \f[I]Radiance\f[R] pictures for the purpose of visualizing the values
2835 using falsecolor.
2836 For example, the following command converts the Z-buffer file
2837 \f[C]frame110.zbf\f[R] associated with the picture
2838 \f[C]frame110.hdr\f[R] to a viewable image:
2839 .IP
2840 .nf
2841 \f[C]
2842 % pvalue -h \[ga]getinfo -d < frame110.hdr\[ga] -r -b -df
2843 frame110.zbf | falsecolor -m 1 -s 40 -l Meters >
2844 frame110z.hdr
2845 \f[]
2846 .fi
2847 .LP
2848 The \f[B]getinfo\f[R] program appearing in back-quotes was used to get
2849 the dimensions associated with the Z-buffer from its corresponding
2850 picture file.
2851 .PP
2852 .na
2853 .TS
2854 delim(@@) tab( );
2855 l l l l.
2856 T{
2857 Program
2858 T} T{
2859 Read
2860 T} T{
2861 Write
2862 T} T{
2863 Function
2864 T}
2865 _
2866 T{
2867 \f[B]pinterp\f[R]
2868 T} T{
2869 X
2870 T} T{
2871 X
2872 T} T{
2873 Interpolate/extrapolate picture views
2874 T}
2875 T{
2876 \f[B]pvalue\f[R]
2877 T} T{
2878 X
2879 T} T{
2880 X
2881 T} T{
2882 Convert picture to/from simpler formats
2883 T}
2884 T{
2885 \f[B]rad\f[R]
2886 T} T{
2887 T} T{
2888 X
2889 T} T{
2890 Render Radiance scene
2891 T}
2892 T{
2893 \f[B]ranimate\f[R]
2894 T} T{
2895 X
2896 T} T{
2897 X
2898 T} T{
2899 Animate Radiance scene
2900 T}
2901 T{
2902 \f[B]rpict\f[R]
2903 T} T{
2904 T} T{
2905 X
2906 T} T{
2907 Batch rendering program
2908 T}
2909 T{
2910 \f[B]rtrace\f[R]
2911 T} T{
2912 T} T{
2913 X
2914 T} T{
2915 Customizable ray-tracer
2916 T}
2917 .TE
2918 .ad
2919 .LP
2920 \f[B]Table 7.\f[R] \f[I]Radiance\f[R] programs that read and write
2921 Z-buffer files.
2922 .SH 3
2923 \f[BI]Radiance\f[B] C Library
2924 .pdfhref O 3 "Radiance C Library"
2925 .pdfhref M "radiance-c-library-6"
2926 .LP
2927 There are no library functions devoted to reading and writing Z-buffer
2928 files in particular.
2929 The normal method is to read and write Z-buffer scanlines with the
2930 standard \f[C]fread\f[R] and \f[C]fwrite\f[R] library functions using an
2931 appropriate float array.
2932 .SH 2
2933 Ambient File Format (.amb suffix)
2934 .pdfhref O 2 "Ambient File Format \(.amb suffix\)"
2935 .pdfhref M "ambient-file-format-.amb-suffix"
2936 .LP
2937 \f[I]Radiance\f[R] can store its diffuse interreflection cache in an
2938 \f[I]ambient file\f[R] for reuse by other processes.
2939 This file is in a system-independent binary format, similar to an octree
2940 or picture file, with an information header that can be read using
2941 \f[B]getinfo\f[R].
2942 Following the header, there is a magic number specific to this file
2943 type, then the ambient value records themselves in encoded form.
2944 .SH 4
2945 Information Header
2946 .pdfhref O 4 "Information Header"
2947 .pdfhref M "information-header-2"
2948 .LP
2949 The information header begins with the usual \[lq]#?RADIANCE\[rq]
2950 identifier, followed by the originating program and the ambient
2951 calculation parameters (and octree name).
2952 After this is the line:
2953 .IP
2954 .nf
2955 \f[C]
2956 FORMAT=Radiance_ambval
2957 \f[]
2958 .fi
2959 .LP
2960 This identifies the general file type, followed by an empty line ending
2961 the header.
2962 As with most information headers, this exact sequence need not be
2963 followed, so long as there is no inconsistent \f[C]FORMAT\f[R] setting.
2964 .SH 4
2965 Magic Number
2966 .pdfhref O 4 "Magic Number"
2967 .pdfhref M "magic-number"
2968 .LP
2969 Following the information header is the two-byte magic number, which for
2970 the current ambient file format is 557.
2971 This number may change later should the file format be altered in
2972 incompatible ways.
2973 .SH 4
2974 Ambient Value Records
2975 .pdfhref O 4 "Ambient Value Records"
2976 .pdfhref M "ambient-value-records"
2977 .LP
2978 Ambient values are written to the file in no particular order.
2979 Each diffuse interreflection value in \f[I]Radiance\f[R] has the
2980 following members:
2981 .IP "\f[B]Level\f[R]" 3
2982 The number of reflections between the primary (eye) ray and this
2983 surface.
2984 A value with fewer reflections may be used in place of one with more,
2985 but not the other way around.
2986 .RS 3
2987 .RE
2988 .IP "\f[B]Weight\f[R]" 3
2989 The weighting value associated with this ray or ambient value.
2990 Similar to the level to avoid using inappropriate values from the cache.
2991 .RS 3
2992 .RE
2993 .IP "\f[B]Position\f[R]" 3
2994 The origin point of this interreflection calculation.
2995 .RS 3
2996 .RE
2997 .IP "\f[B]Direction\f[R]" 3
2998 The surface normal indicating the zenith of the sample hemisphere for
2999 this value.
3000 .RS 3
3001 .RE
3002 .IP "\f[B]Value\f[R]" 3
3003 The calculated indirect irradiance at this point, in w/m\*{2\*} (RGB
3004 color).
3005 .RS 3
3006 .RE
3007 .IP "\f[B]Radius\f[R]" 3
3008 The cosine-weighted, harmonic mean distance to other surfaces visible
3009 from this point, used to decide point spacing.
3010 .RS 3
3011 .RE
3012 .IP "\f[B]Posgradient\f[R]" 3
3013 The position-based gradient vector, indicating how brightness changes as
3014 a function of position in the sample plane.
3015 .RS 3
3016 .RE
3017 .IP "\f[B]Dirgradient\f[R]" 3
3018 The direction-based gradient vector, indicating how brightness changes
3019 as a function of surface orientation.
3020 .RS 3
3021 .RE
3022 .LP
3023 The members are stored one after the other in the above order using
3024 system-independent binary representations.
3025 The Level member takes 1 byte, Weight takes 5, Position takes 15,
3026 Direction another 15, Value is 4 bytes (using the same color format as
3027 \f[I]Radiance\f[R] pictures), Radius takes 5 bytes, and Posgradient and
3028 Dirgradient each take 15 bytes, for a total size of 75 bytes per record.
3029 .SH 3
3030 \f[BI]Radiance\f[B] Programs
3031 .pdfhref O 3 "Radiance Programs"
3032 .pdfhref M "radiance-programs-7"
3033 .LP
3034 Table 8 shows \f[I]Radiance\f[R] programs that read and write ambient
3035 files.
3036 The program \f[B]lookamb\f[R] is especially useful for examining the
3037 contents of ambient files and debugging problems in the calculation.
3038 .PP
3039 .na
3040 .TS
3041 delim(@@) tab( );
3042 l l l l.
3043 T{
3044 Program
3045 T} T{
3046 Read
3047 T} T{
3048 Write
3049 T} T{
3050 Function
3051 T}
3052 _
3053 T{
3054 \f[B]getinfo\f[R]
3055 T} T{
3056 X
3057 T} T{
3058 T} T{
3059 Print information header from binary file
3060 T}
3061 T{
3062 \f[B]lookamb\f[R]
3063 T} T{
3064 X
3065 T} T{
3066 X
3067 T} T{
3068 Convert \f[I]Radiance\f[R] ambient file
3069 T}
3070 T{
3071 \f[B]rad\f[R]
3072 T} T{
3073 X
3074 T} T{
3075 X
3076 T} T{
3077 Render \f[I]Radiance\f[R] scene
3078 T}
3079 T{
3080 \f[B]rpict\f[R]
3081 T} T{
3082 X
3083 T} T{
3084 X
3085 T} T{
3086 Batch rendering program
3087 T}
3088 T{
3089 \f[B]rpiece\f[R]
3090 T} T{
3091 X
3092 T} T{
3093 X
3094 T} T{
3095 Parallel batch rendering program
3096 T}
3097 T{
3098 \f[B]rtrace\f[R]
3099 T} T{
3100 X
3101 T} T{
3102 X
3103 T} T{
3104 Customizable ray-tracer
3105 T}
3106 T{
3107 \f[B]rview\f[R]
3108 T} T{
3109 X
3110 T} T{
3111 X
3112 T} T{
3113 Interactive renderer
3114 T}
3115 .TE
3116 .ad
3117 .LP
3118 \f[B]Table 8.\f[R] Programs in the \f[I]Radiance\f[R] distribution that
3119 read and write ambient files.
3120 .SH 3
3121 \f[BI]Radiance\f[B] C Library
3122 .pdfhref O 3 "Radiance C Library"
3123 .pdfhref M "radiance-c-library-7"
3124 .LP
3125 The \f[C]src/rt/ambient.h\f[R] file contains definitions of the
3126 \f[C]AMBVAL\f[R] structure and certain details of the ambient file
3127 format.
3128 The \f[C]src/rt/ambio.c\f[R] module contains the specialized routines
3129 for reading and writing ambient files, and these functions in turn
3130 access routines in \f[C]src/common/portio.c\f[R] for reading and writing
3131 portable binary data.
3132 The information header is handled by the routines in
3133 s\f[C]rc/common/header.c\f[R], similar to the method described for
3134 \f[I]Radiance\f[R] picture files.
3135 Here are the main calls from \f[C]src/rt/ambio.c\f[R]:
3136 .IP "\f[B]\f[CB]putambmagic(FILE *fp);\f[B]\f[R]" 3
3137 Put out the appropriate two-byte magic number for a \f[I]Radiance\f[R]
3138 ambient file to the stream \f[C]fp\f[R].
3139 .RS 3
3140 .RE
3141 .IP "\f[B]\f[CB]int hasambmagic(FILE *fp);\f[B]\f[R]" 3
3142 Read the next two bytes from the stream \f[C]fp\f[R] and return non-zero
3143 if they match an ambient file\[cq]s magic number.
3144 .RS 3
3145 .RE
3146 .IP "\f[B]\f[CB]int writeambval(AMBVAL *av, FILE *fp);\f[B]\f[R]" 3
3147 Write out the ambient value structure \f[C]av\f[R] to the stream
3148 \f[C]fp\f[R], returning -1 if a file error occurred, or 0 normally.
3149 .RS 3
3150 .RE
3151 .IP "\f[B]\f[CB]int readambval(AMBVAL *av, FILE *fp);\f[B]\f[R]" 3
3152 Read in the next ambient value structure from the stream \f[C]fp\f[R]
3153 and put the result in \f[C]av\f[R].
3154 Return 1 if the read was successful, 0 if the end of file was reached or
3155 there was an error.
3156 The \f[C]ambvalOK\f[R] function is used to check the consistency of the
3157 value read.
3158 .RS 3
3159 .RE
3160 .IP "\f[B]\f[CB]int ambvalOK(AMBVAL *av);\f[B]\f[R]" 3
3161 Return non-zero if the member values of the \f[C]av\f[R] structure are
3162 not too outlandish.
3163 This is handy as insurance against a corrupted ambient file.
3164 .RS 3
3165 .RE
3166 .SH 2
3167 Conclusion
3168 .pdfhref O 2 "Conclusion"
3169 .pdfhref M "conclusion"
3170 .LP
3171 We have described the main file formats native to \f[I]Radiance\f[R] and
3172 shown how even the binary formats can be reliably shared in
3173 heterogeneous computing environments.
3174 This corresponds to one of the basic philosophies of UNIX software,
3175 which is system independence.
3176 A more detailed understanding of the formats may still require some use
3177 of binary dump programs and delving into the \f[I]Radiance\f[R] source
3178 code.