~s Radiance Digest, v2n1
Dear Radiance Users,

Here once again we have a culling of e-mail exchanges to share.
I hope by now that most of you have picked up version 2.0 of the
program, which seems mostly stable except for one or two minor
glitches.  Please check also the previous digest, v2n0, if you
have not seen it already.  As always, back issues of the digest
are available via anonymous ftp from hobbes.lbl.gov (128.3.12.38)
in the pub/digest directory.

Here is a table of contents that you can use for finding the
sections you are interested in.  Use the search string /^==*$/
to skip to the next section.

	BUG		- A memory bug in rpict
	DAYLIGHT	- Daylight Scripts and TIM's
	ALIASING	- Anti-aliasing in Radiance (again?)
	LANGUAGE	- Radiance input language definitions
	NEXT		- Radiance compilation on the NeXT

By the way, if anyone has need of some first rate consulting or training
on Radiance, I have someone I can recommend (besides myself!).

-Greg

===========================================================
BUG		- A memory bug in rpict

Date: Wed, 11 Dec 91 00:59:10 MED
From: bojsen@moria (Per Bojsen)
To: greg@hobbes.lbl.gov
Subject: Bug in rpict (rpict.c)?

Hi Greg,

[I'm the guy working on the Amiga port of Radiance if you don't remember me.]

A couple of weeks ago I picked up Radiance 2.0, and now have a working port.
I think I may have discovered a bug in rpict, specifically the rpict.c
module, though.  Rpict crashes when run with anything other than `-sp 1'.
Rpict overwrites (or rather underwrites ;-) memory just before a malloc()'d
buffer.  The amount of bytes overwritten is proportinal to the `-sp'
setting.  On the Amiga such overwriting is nasty because the free memory
list will be mangled.

I snooped around in the source a bit to find something that depends on
`-sp', i.e., the psample variable.  I found something in the
fillscanline() routine that may be the cause of the bug.  Take a look
on fillscanline():

fillscanline(scanline, zline, sd, xres, y, xstep)       /* fill scan at y */
register COLOR  *scanline;
register float  *zline;
register char  *sd;
int  xres, y, xstep;
{
        static int  nc = 0;             /* number of calls */
        int  bl = xstep, b = xstep;
        double  z;
        register int  i;

        z = pixvalue(scanline[0], 0, y);
        if (zline) zline[0] = z;
                                /* zig-zag start for quincunx pattern */
        for (i = ++nc & 1 ? xstep : xstep/2; i < xres-1+xstep; i += xstep) {
                                   ^^^^^^^^^
                if (i >= xres) {
                        xstep += xres-1-i;
                        i = xres-1;
                }
                z = pixvalue(scanline[i], i, y);
                if (zline) zline[i] = z;
                if (sd) b = sd[0] > sd[1] ? sd[0] : sd[1];
                b = fillsample(scanline+i-xstep, zline ? zline+i-xstep : NULL,
                               ^^^^^^^^^^^^^^^^
                                i-xstep, y, xstep, 0, b/2);
                if (sd) *sd++ = nc & 1 ? bl : b;
                bl = b;
        }
        if (sd && nc & 1) *sd = bl;
}

Now, every other call of fillscanline() will have `i' start with xstep/2
in the for loop.  In the call to fillsample() the first parameter is
`scanline + i - xstep', i.e., `scanline - xstep/2' (xstep is even, if xstep
is odd it will be `scanline - xstep/2 - 1', I think).  If xstep is greater
than 2 (it is 6 for -sp 4), the pointer represented by `scanline + i - xstep'
will point to some memory (on reasonable systems, anyway) before the scanline
array.  If the fillsample() routine writes to colline[0], for example,
we have found a bug.

Could you try to look into this and confirm if its indeed a bug?  I'll
try to change some things to see if my problem goes away.

Thanks for making your work available!

--
"There had been something loose about the          // Greetings from Per Bojsen
 station dock all morning, skulking in            //
 amongst the gantries and the lines and the    \\//   cbmehq!lenler!bojsen
 canisters which were waiting to be moved ..."  \/    pb@id.dth.dk

Date: Wed, 11 Dec 91 01:15:06 MED
From: bojsen@moria (Per Bojsen)
To: greg@hobbes.lbl.gov
Subject: Bug in rpict.c fillscanline()

I just tried a simple thing:  I malloc()'d a somewhat larger buffers for
the scanlines and pointed the scanbar[] pointers into these larger buffers
to allow for the overwrite of the memory before the buffer.  This made
the symptom of the bug go away (no crash).  So I'm pretty certain that
what I described in my previous mail must be a bug.  The question is:
how do I fix it?

--
"There had been something loose about the          // Greetings from Per Bojsen
 station dock all morning, skulking in            //
 amongst the gantries and the lines and the    \\//   cbmehq!lenler!bojsen
 canisters which were waiting to be moved ..."  \/    pb@id.dth.dk

From greg Tue Dec 10 17:48:15 1991
Return-Path: <greg>
Date: Tue, 10 Dec 91 17:48:12 PST
From: greg (Gregory J. Ward)
To: bojsen@moria
Subject: Re:  Bug in rpict (rpict.c)?
Status: RO

Hi Per,

Of course I remember you.  There aren't many people with your kind of nerve,
going where no programmer has gone before and all that.

You have indeed found a bug.  A bit of stupidity on my part after the last
so-called "enhancement" to my sampling code.  I guess it doesn't show up on
most machines (including mine) because the memory doesn't get freed until
after the program is done.  Anyway, here is the routine returned to its
original intent, and thanks for your thorough analysis of the problem!!

-Greg
-----------------

------- rpict.c -------
4c4
< static char SCCSid[] = "%Z%%M% %I% %G% LBL";
---
> static char SCCSid[] = "@(#)rpict.c 2.3 12/10/91 LBL";
280,281c280,285
< 		b = fillsample(scanline+i-xstep, zline ? zline+i-xstep : NULL,
< 				i-xstep, y, xstep, 0, b/2);
---
> 		if (i <= xstep)
> 			b = fillsample(scanline, zline, 0, y, i, 0, b/2);
> 		else
> 			b = fillsample(scanline+i-xstep,
> 					zline ? zline+i-xstep : NULL,
> 					i-xstep, y, xstep, 0, b/2);

From bojsen@dc.dth.dk Thu Dec 12 06:13:23 1991
Return-Path: <bojsen@dc.dth.dk>
Date: Thu, 12 Dec 91 15:12:01 +0100
From: bojsen@dc.dth.dk (Per Bojsen)
To: greg@hobbes.lbl.gov
Subject: bug and fix
Status: RO

Hi Greg.

I've incorporated the bug fix now and it works like a charm!  Thanks
for acting so promptly.

A question regarding your special malloc() implementation.  Do you
depend on the memory added by subsequent sbrk() calls to be contiguous
with the already allocated memory?  The problem is that the sbrk()
that comes with the SAS/C compiler is *not* compatible with UNIX in
that regard (an can never be due to the way memory allocation works on
the Amiga);  every time sbrk() is called you get a new memory block
that is uncontiguous with the rest.

Your malloc() does seem to work, though.  I just want to be sure
there's no hidden danger.

--------------------------------------------------------------------------------
Per Bojsen                The VLSI Research Group        EMail: bojsen@dc.dth.dk
MoDAG                 Technical University of Denmark
--------------------------------------------------------------------------------

From greg Thu Dec 12 09:46:09 1991
Return-Path: <greg>
Date: Thu, 12 Dec 91 09:45:59 PST
From: greg (Gregory J. Ward)
To: bojsen@dc.dth.dk
Subject: Re:  bug and fix
Status: RO

Hi Per,

My malloc does indeed work better if sbrk() returns contiguous blocks of
memory, but it does not depend on it.

-Greg

==============================================================
DAYLIGHT	- Daylight Scripts and TIM's

[TIM stands for Transparent Insulation Materials -- if you don't know
what it is than you probably wouldn't care. -G]

Date: Wed, 11 Dec 91 13:59:32 PST
From: greg (Gregory J. Ward)
To: apian@ise.fhg.de
Subject: RE: Questions

Hi Peter,

> Modelling rooms with TIM windows looks very promising and take most
> of my time beside end-of-year paperwork etc.

Raphael Compagnon recently started looking at these, and I tried to
help him out with the BRDF description of a certain kind of TIM,
the kind made up of many closely packed plastic cells aligned
perpendicular to the window surface.  Here is the .cal file I made:

--------------------------------
{
	Calculate BRTDF of Transparent Insulation Materials
	made up of many small tubes packed tightly together.

	29 Nov 1991	Greg Ward and Raphael Compagnon

	Apply with following BRTDfunc:

	mod BRTDfunc tim1
	10	0	0	0
		stran	stran	stran
		brtdf	brtdf	brtdf
		tim1.cal
	0
	7 0 0 0 R T 1 K

	where:
		R = diffuse reflectance when Ktan_t is zero
		T = total transmittance divided by (1-R)
		K = ratio of tube length to diameter
}

Ktan_t = A7 * Sqrt(1-Rdot*Rdot)/Rdot;

stran = if(1-Ktan_t, 2/PI*Acos(Ktan_t) - Ktan_t/PI*Sqrt(1-Ktan_t*Ktan_t), 0);

brtdf(lx,ly,lz) = (1-stran)/PI;

-------------------------------------

You might like to ask Raphael how it's going.  His e-mail is
compagnon@eldp.epfl.ch.

> If you like, an user-id at ISE would be no problem at all.
> e.g., I found access to man pages of other machines is fine sometimes.

Sure, when you get time could you do this for me?  Also, give me some
details and a model so I can reproduce the error you got from readfargs.

> I've got a question, I don't dare to ask, because it shines bright
> light on my ignorance:
> -ad N 	is the number of random rays sent out into the hemisphere to
> 		look for light coming from other surfaces
> -as N	if two of these rays differ, N other rays are sent in the
> 		directions between them
> -ar and -aa specify what happens when one of these rays hit an area
> 		on a surface where there are to ambient values (yet).
>		Either this initiates a new hemisphere sampling or the value
>		is interpolated by using other ambient values on that the	
>		surface. -aa spicifies the threshold when a new hemisphere
>		sampling is started. 
> As for the moment, am I totally lost or somehow on the right track ?

It seems that you understand it pretty well to me.  I would add the following:

-ad N 	is the number of INITIAL rays sent out into the hemisphere to
	look for light coming from other surfaces
-as N	is the number of ADDITIONAL rays sent out to reduce variance
	in the initial hemisphere sample, based on the assumption that the
	initial sample captured all significant intensity gradients
-ar and -aa specify what happens when one of these rays hit an area
	on a surface where there are to ambient values (yet).
	Either this initiates a new hemisphere sampling or the value
	is interpolated by using other ambient values on that the	
	surface. -aa specifies the threshold when a new hemisphere
	sampling is started.  -ar specifies a maximum resolution, past
	which the -aa value will start to be relaxed.  The resolution
	is computed by the global cube size (as determined by oconv
	and displayed by getinfo -d on the octree) divided by the
	-ar parameter.

-Greg

From: Environmental Design Unit <edu@leicester-poly.ac.uk>
Date: Tue, 10 Dec 91 15:18:30 GMT
To: ray@hobbes.lbl.gov

Hi Greg,

I thought i'd get back to you about the daylight factor
scripts.  For comparison purposes, contour lines are
preferable to bands.  However, when I switch from one to the
other, the lines appear to be mid-way between the bands.  I
would have expected the line to overlap the band (or be it's
leading edge) - also the legend arrangement is different.  It does
look like one scheme is giving the mid-way values of the other.  It's
a small point but I would like to clear it up before I start to compare
results with other programs.  The modification to dayfact to allow
user fixed contour levels works fine - but ... it's still not
ideal.  Is their a way around having fixed increment scaling,
i.e. 1,3,5,7,9, and so on?  Levels of 1,2,4,6,10,15,20 etc. would
be better.

More generally, is v2.0 different in any way from the beta release
I obtained from you?  Also, could you briefly explain the changes
to the source function for windows?

Did you get the OpenWindows file-manager mods for RADIANCE, I hadn't
actually e-mailed a tar file before (or since) so I just sent it off
as normal mail, hoping that's how it is done.

Hope all is well,

-John

Date: Thu, 12 Dec 91 10:05:17 PST
From: greg (Gregory J. Ward)
To: edu@leicester-poly.ac.uk
Subject: Re:  RADIANCE

Hi John,

Yes, the contour lines do appear midway between values rather than at
those values like the bands.  Currently, there is no way to specify
exact contour levels an irregular intervals using this script.  I would
have to rewrite it significantly, which I may do when I find some time.
In the meantime, I would like you at least to have the latest version
of the dayfact script.  I made some changes following release 2.0 to
correct an error in the illuminance contour calculation and add a new
ability to calculate daylight savings.

Unfortunately, I do not remember exactly when I gave you the beta copy
so I don't know how much I changed since then.

I did get the OpenWindows modifications you sent me, and thank you.  Did
you not receive the latest Radiance Digest?  In it I included your mods
for other OpenWindows users.

-Greg

From: Environmental Design Unit <edu@leicester-poly.ac.uk>
Date: Mon, 16 Dec 91 11:25:24 GMT
To: greg@hobbes.lbl.gov
Subject: Radiance

Greg,

Thanks for the reply.  I sort of guessed that mods to
dayfact would not be trivial.  Yes I did get the digest
with my OpenWindows stuff, but it did look garbled.  Changing
the subject altogether, is RayShade a shading analysis program?
We have on occasion used a heliodon to give shading info for
our thermal analysis work - despite the complexity of current
'state of the art' programs, the treatment given to sun-patching
is still rather simplistic and best results are obtained if the
user tweaks the input a bit.  What has this to do with Radiance?
Well, must confess, I used your program in a rather trivial mode
to look at the shading effectiveness of bridge structures in
a proposed atrium design.  What surprised me was how quickly I
could generate an adequate description with a load of genbox
and xform commands and a bit of vi'ing.  A couple of simple
shell-scripts to generate the oct and pic files and Bingo!
I admit, it's a bit like using a CRAY to work out the grocery
bill, but it's quick and simple.  In fact, i'd be amazed to
find a program which does it more efficiently - a PC based
commercial package we have provides no contest.  I know this
is very much a side issue but I thought i'd let you know anyway.

Regards,

-John

P.S.  As you've no doubt guessed my daylighting project has been
put back yet another month by other work commitments.

Date: Tue, 17 Dec 91 09:46:41 PST
From: greg (Gregory J. Ward)
To: edu@leicester-poly.ac.uk

Hi John,

Yes, I think the OpenWindows stuff you sent may have been garbled.  I
couldn't tell myself because I didn't know what it was supposed to look
like!  I suggest creating a compressed tar file and uploading it to
the pub/libraries directory on hobbes.lbl.gov (128.3.12.38) by anonymous
ftp.  The libraries directory is exactly right, but I don't have one that
is so it will have to do.

I am glad that you had some success using Radiance for your shadowing
calculation.  I agree that most of the work is getting the geometry
right.  I have used vi, xform and genbox (and gensurf, genprism, etc.)
to create my models for many years now.  I still don't use a CAD system,
for better or worse.

RayShade was not made specifically for shadow calculation, although it
probably does it just as well as Radiance.  I don't think you get a
solar position program like gensky or anything like genbox, but RayShade
does provide a few more surface primitive types.  I should stop talking
about it, though, since I really don't know that much about the software.

-Greg

=======================================================
ALIASING	- Anti-aliasing in Radiance (again?)

From: Paul Douglas <douglas@ctr.columbia.edu>
Date: Thu, 9 Jan 92 13:30:47 EST
To: greg@hobbes.lbl.gov
Subject: Aliasing 

Hi Greg,
You probably don't remember, but we communicated early last year.  I was
hoping to use radiance to produce a vidoe sequence and you kindly sent me
ready-made letters and numbers.  Well, the project was shelved, but now it
looks like its on again, so I have a question.  

When I use rpict to generate the radiance image and then convert to a 
sunraster image diagonal edges are jagged.  Pfilt seems not able to reduce
this type of aliasing, but I'm guessing that it can be reduced by changing
the pixel size, although I'm not sure how.  Can you offer any quick suggestions
that will reduce the roughness of the object edges??

Thanks much
Paul

Date: Thu, 9 Jan 92 11:02:19 PST
From: greg (Gregory J. Ward)
To: douglas@ctr.columbia.edu
Subject: Re:  Aliasing

Hi Paul,

The anti-aliasing approach taken in Radiance is a little different from
other raytracers inasmuch that you must combine rpict with pfilt in order
to arrive at the desired result.  This is done by specifying an initial
picture resolution for rpict a few times greater than what you want in
the final image, then using pfilt to reduce it down.  This implements
anti-aliasing by oversampling, which is the most effective approach
for ray tracing.

For example, you might use the following commands to get a 512x512 
anti-aliased image:

	% rpict -x 1024 -y 1024 -vf scene.vp scene.oct > scene.u.pic
	% pfilt -x /2 -y /2 scene.u.pic > scene.f.pic

This would produce a reasonably anti-aliased image in a minimum of time.
To get a really fine image, you can increase your sampling rate and use
the Gaussian filter option of pfilt, like so:

	% rpict -x 1536 -y 1536 -vf scene.vp scene.oct > scene.u.pic
	% pfilt -x /3 -y /3 -r .67 scene.u.pic > scene.f.pic

I hope this helps.
-Greg

======================================================
LANGUAGE	- Radiance input language definitions

Date: Mon, 9 Dec 91 15:13:28 -0800
From: mcancill@denali.csc.calpoly.edu (Mike Cancilla)
To: GJWard@Csa2.lbl.gov
Subject: Radiance Language BNF...

Hi,
	I've been using Radiance for about 1.5 months now, and
I think it's really nice.  I've still got to ftp 2.0 though.

I'm a graduate student here at Cal Poly, and I'm currently in
a graduate languages class.  My final paper consists of a
comparison of 3 ray tracing languages, namely the Radiance
language, the language for DKB trace, and an in-house raytracing
language.

	I was wondering if I could get the BNF specs for the
Radiance language?  Any other info you might deem as helpful would
also be helpful.  I'll send you a plain text copy of the report
if you want it.

	The report will probably use three different languages to
do the same scene, and make a comparison based on ease and features.
A technical description of each language, such as sytax and semantics
will also be given.  I will also focus on any looping structures, 
math functions, texture availability, and animation features the
language may have.

Any help would be greatly appreciated.

Thanks,

Mike

Date: Mon, 9 Dec 91 20:08:26 PST
From: greg (Gregory J. Ward)
To: mcancill@denali.csc.calpoly.edu
Subject: Re:  Radiance Language BNF...

Hi Mike,

Excuse my ignorance, but what's a BNF?  Personally, I would hesitate even
to call the input format of Radiance a language!  The only reference I
can offer is in ray/doc/ray.1 of the standard distribution.  I can send
you a PostScript version if you haven't got it already.  Version 2.0 
does contain a few new BRDF material types, but other than that, the
input language looks pretty much the same as 1.4.

I would say that most of the sophistication of the Radiance scene description
is external, contained in the various object generators and auxiliary files
available.  The function files in particular use a Turing-equivalent
expression language that provides recursive functions as its prime mode
of programming as well as access to an extensive math library.

If you give me some more details of what you want, or suggestions on how
to go about describing a particular scene, I'd be happy to help.

-Greg

Date: Thu, 12 Dec 91 01:55:21 -0800
From: mcancill@denali.csc.calpoly.edu (Mike Cancilla)
To: greg@hobbes.lbl.gov
Subject: Re:  Radiance Language BNF...

Hi Greg,

	I mailed you a few days ago regarding a BNF for the Radiance scene
description language.  BNF stands for Backus-Naur (sp) Form.  Its a
way of describing the syntax of programming languages.  The YACC utility,
or BISON if you're of the GNU flavor, takes a BNF description of a language
and anonyzes the syntax of an input file written the target language.

Here's a BNF description for a Raytracing mini-language I wrote for
a class project, it's taken from an actual YACC input file:

%%

program:	open_stmt decls stmt close_stmt
		;

decls:		/* nothing */
		| decls YOBJ_TYPE YOBJ_VAR ';'
		| decls YFLOAT YNUM_VAR ';'
		;

open_stmt:	YOPEN_SCENE ';'
		;

close_stmt:	YCLOSE_SCENE ';'
		;

stmt:		/* nothing */
		| stmt render_stmt
		| stmt do_loop
		| stmt assign
		| stmt foreach
		| stmt move
		| stmt specularity
		| stmt reflectivity
		| stmt ambient
		| stmt color
		;

render_stmt:	YRENDER_SCENE ';'
		;

do_loop:	YDO expr YTIMES '{' stmt '}'
		;

assign:		YNUM_VAR '=' expr ';'
		;

foreach:	YFOREACH YOBJ_TYPE '{' stmt '}'
		;

move:		YMOVE YOBJ_VAR YTO expr ',' expr ',' expr ';'
		| YMOVE YIT YTO expr ',' expr ',' expr ';'
		;

specularity:	YSPEC YOF YOBJ_VAR YIS expr ';'
		| YSPEC YOF YIT YIS expr ';'
		;

reflectivity:	YREFL YOF YOBJ_VAR YIS expr ';' 
		| YREFL YOF YIT YIS expr ';'
		;

ambient:	YAMBI YOF YSCENE YIS expr ';'
		;

color:		YCOLOR YOF YOBJ_VAR YIS expr ',' expr ',' expr ';'
		| YCOLOR YOF YIT YIS expr ',' expr ',' expr ';'
		;

expr:		assign
		| expr '+' expr
		| expr '-' expr
		| expr '*' expr
		| expr '/' expr
		| '(' expr ')'
		| YNUM_VAR
		| YNUMBER
		;
%%

	So there's a BNF.  I can probably try and derive some form of one
by looking at some example Radiance scene descriptions.  I've printed out the
Postcript version of the documentation draft for 2.0.

	Here's a list of topics I'm going to cover in my paper, the three
languages I'm going to compare are the language for Rayshade, Radiance, and
the Cal Poly raytracing project language, Goober.

Topics:

Specification of scene parameters
	- Right or left hand coordinate system
	- Eyepoint
	- View direction, etc.

Supported primitives

Lighting Models
	- Whats available, and how to specify a certain model via the lang.

Textures
	- How are they handled by the lang.
	- Can users specify their own?

Bit Mapping
	- How do you apply a bitmap, such as the infamous Mandrill,
		to an object.

Constructive Solid Geometry (CSG)
	- Is it supported, how does one build objects

Looping Constructs and/or Recursive Calls
	- Are they available, how to use

Functions or Procedures
	- Supported by lang.?

User Extensibility
	- How does the user specify his/her own objects, textures, etc.

I decided to throw out the "Let's see how three different languages specify
the same scene" idea.  They all pretty much looked the same!  Plus, with
this type of topic scheme, I get to  turn in a heavier paper, :-).

ANY input on how the Radiance Language fits in to these topics would be
appreciated.  I'm sure I can look most of it up in the documentation.

Thanks a bunch,

Mike

Date: Thu, 12 Dec 91 12:50:42 PST
From: greg (Gregory J. Ward)
To: mcancill@denali.csc.calpoly.edu
Subject: Re:  Radiance Language BNF...

Hi Mike,

Thanks for explaining a BNR.  I figured it was something like that.  Since
I did not use yacc or similar for the parser, I will try to come up with
a BNR independently.  The first thing to understand is that altogether
there are at least 4 "languages" involved with Radiance scene descriptions:
the basic scene input language, the function file language, the data file
language and the font language.  All except the function file language are
exceedingly simple.

Scene Input
=========== 

statement:	primitive
		| alias
		| command
		| comment

primitive:	STRING type STRING
		INTEGER string_args
		INTEGER integer_args
		INTEGER real_args

alias:		STRING alias STRING STRING

command:	'!' STRING string_args

comment:	'#' string_args

string_args:	/* nothing */
		| STRING string_args

integer_args:	/* nothing */
		| INTEGER integer_args

real_args:	/* nothing */
		| REAL real_args

type:		"polygon"
		| "cone"
		| "sphere"
		| "texfunc"
		| "ring"
		| "cylinder"
		| "instance"
		| "cup"
		| "bubble"
		| "tube"
		| "plastic"
		| "metal"
		| "glass"
		| "trans"
		| "dielectric"
		| "interface"
		| "plasfunc"
		| "metfunc"
		| "brightfunc"
		| "brightdata"
		| "brighttext"
		| "colorpict"
		| "glow"
		| "source"
		| "light"
		| "illum"
		| "spotlight"
		| "mirror"
		| "transfunc"
		| "BRTDfunc"
		| "plasdata"
		| "metdata"
		| "transdata"
		| "colorfunc"
		| "antimatter"
		| "colordata"
		| "colortext"
		| "texdata"
		| "mixfunc"
		| "mixdata"
		| "mixtext"
		| "prism1"
		| "prism2"

Function File
============= 

decl:		';'
		| function_decl ';'
		| variable_decl ';'

function_decl:	ID '(' id_list ')' assign_op e1

variable_decl:	ID assign_op e1

id_list:	ID
		| ID ',' id_list

assign_op:	'='
		| ':'

e1:		e1 '+' e2
		| e1 '-' e2
		| e2

e2:		e2 '*' e3
		| e2 '/' e3
		| e3

e3:		e4 '^' e3
		| e4

e4:		'+' e5
		| '-' e5
		| e5

e5:		'(' e1 ')'
		| ID
		| ID '(' id_list ')'
		| REAL
		| '$' INTEGER

Comments may appear between any two tokens set off by curly braces {},
and may be nested to any level.

Data File
========= 

data:		dimensions value_list

dimensions:	INTEGER dim_list

dim_list:	dim
		| dim dim_list

dim:		REAL REAL INTEGER
		| '0' '0' INTEGER indep_list

indep_list:	REAL
		| REAL indep_list

value_list:	/* nothing */
		| REAL value_list

Font File
========= 

glyph_list:	/* nothing */
		| glyph glyph_list

glyph:		INTEGER INTEGER coord_list

coord_list:	/* nothing */
		| INTEGER INTEGER coord_list

--------------------------------------------------------------

With regards to your topics, I have the following comments.

Specification of scene parameters:
	- Radiance uses a right-hand coordinate system
	- The eyepoint and view direction are given as options
		to the renderers, and can be stored in a separate file

Supported primitives:
	- N-sided polygons
	- spheres
	- cones, cylinders, rings
	- hierarchical instancing for very complex geometries

Lighting models:
	- Completely general
	- Converter provided for IES luminaire specification

Textures:
	- I break "textures" into two kinds, patterns and textures
	- Patterns are variation in color, and can be specified as
		pictures, data or functions in any combination
	- Textures are perturbations in surface normal, and can
		be specified in the same ways as patterns
	- A light source distribution is a pattern

Bit Mapping:
	- Usually given as a picture-type pattern (ie. "colorpict" type)
	- True bit-maps (ie. 1-bit depth images) may also be produced
		using a special bit font

CSG:
	- Radiance has an "antimatter" type which supports some rudimentary
		CSG subtraction, but otherwise we are strictly B-rep

Looping constructs or Recursion:
	- The function file language supports recursion
	- The "xform" program provides iteration for repeated objects

Functions or Procedures:
	- The function file language supports functions without side effects

User extensibility:
	- The user may create function files, data files and font files,
		or provide his/her own images for patterns
	- General bidirectional reflection distribution functions may
		also be specified in the same way as patterns and textures

One additional topic I would like to see evaluated are the degree to which
a language encourages the user to produce physically valid models.  I
realize that this is not the goal of many ray tracers, but I think it
should be and it is certainly a foremost consideration in Radiance.
If a simulation produces bogus results, what value is it really?
Along these lines, you made no mention of the reflectance model chosen
or its specification.  I think this is at least as important as the
geometry.

Good luck with your paper.  I'd love to see it when it's finished!

-Greg

========================================================
NEXT		- Radiance compilation on the NeXT

From: john%3jane.UUCP@mathcs.emory.edu (John B. Lockhart)
Subject: Help?
To: GJWard@Csa2.lbl.gov
Date: Sun, 15 Dec 91 16:27:23 EST

Greg:

I'm trying to compile Radiance version 2.0 on my NeXTstation (but don't
let that scare you).  I got the older version to compile; but only by
nuking all X references and changing malloc() references to something
like foo_malloc() due to conflicts with the standard library.

Note that I really appreciate your "noX11.help" file in 2.0, but
here I am again for 2.0, changing malloc() references.

Am I doing something stupid?  Every time I try to compile Radiance,
I get myriads of:

/bin/ld: multiple definitions of symbol _strcmp
/bin/ld: multiple definitions of symbol _realloc
/bin/ld: multiple definitions of symbol _malloc
/bin/ld: multiple definitions of symbol _free

messages and cannot continue without prefixing foo_ to everything.

Help.

--
|         John B. Lockhart         |.:Did you know that all the water:. .:. .:|
|      Junior/EE, Georgia Tech     |:.between California and Japan would:. .:.|
| john%3jane.uucp@mathcs.emory.edu |. fill the Pacific Ocean? .:. .:. .:. .:. |
|   (Above address NeXTmailable.)  | .:. .:. .:--John's Stupid Quotes #64721 .|

Date: Mon, 16 Dec 91 08:37:48 PST
From: greg (Gregory J. Ward)
To: john%3jane.UUCP@mathcs.emory.edu
Subject: Re:  Help?

Hi John,

Sorry you are having trouble with my C declarations.  This seems to be one
of the least well standardized parts of C.  Different C compilers seem to
insist on totally different declarations.  You may find in your cc man page
some options to affect the type of declarations the compiler will accept.
The default mode seems to be incompatible with old C standards (the ones
I use for coding).  See if there is a k+r option to the compiler, or
something to turn ANSII-type declarations off.  It should not be necessary
to change the names of the functions!

I cannot code to newer standards, because people with the older standards
wouldn't be able to cope, whereas the reverse is usually possible.

I am assuming that the errors you get are fatal ones.  If they are only
warnings, you can feel safe to disregard them and the programs should
compile anyway.

Hope this helps.
-Greg

From: john%3jane.UUCP@mathcs.emory.edu (John B. Lockhart)
Subject: Re:  Help?
To: greg@hobbes.lbl.gov (Gregory J. Ward)
Date: Mon, 16 Dec 91 16:30:49 EST

I've tried setting my C compiler to handle non-ANSI, etc, etc, which
only causes more problems.

:I cannot code to newer standards, because people with the older standards
:wouldn't be able to cope, whereas the reverse is usually possible.
I can't see how changing references "malloc" to "my_malloc" constitutes
coding to a new standard; it wouldn't hurt anyone else and it would
sure help people with the newer compilers.

:I am assuming that the errors you get are fatal ones.  If they are only
:warnings, you can feel safe to disregard them and the programs should
:compile anyway.
They're fatal, of course.  I've been relegated to renaming all of your
functions to something non-conflicting and then just compiling Radiance
using the standard library equivalents.  (The brute force method of
porting. :)


I've been wondering for some time what rview does; I've glanced over the
man pages but have been unable to run it (of course) due to the fact that
I don't have any of the drivers.  I know you don't want to write a NeXT
driver for it (seeing as I wouldn't either if I didn't have a NeXT!), but
perhaps you could give me a shove in the right direction to write my own,
which you might perhaps incorporate into a future Radiance release...

--
|         John B. Lockhart         |..As bad as it is, the U.S. Constitution..|
|      Junior/EE, Georgia Tech     |..is a lot better than what we have now...|
| john%3jane.uucp@mathcs.emory.edu |..........................................|
|   (Above address NeXTmailable.)  |...............................--Unknown..|

Date: Mon, 16 Dec 91 14:01:12 PST
From: greg (Gregory J. Ward)
To: john%3jane.UUCP@mathcs.emory.edu
Subject: Re:  Help?

Hi John,

I still say that you should not rename the functions.  The declarations
I have are either for functions in the system library (such as calloc)
or for my own replacement for these functions (such as malloc).  Renaming
functions to foo_malloc and so forth is counter-productive.  If the
advance declarations I give cause conflict, then remove them rather
than renaming them.

I hope I am not misunderstanding your problem.  Which declarations are
in conflict?  I do not believe that there is any real conflict involved,
only changes in the syntax of advance declarations.

Regarding device drivers for rview, I would be delighted if you would
write one.  You should first read the file driver.h in ray/src/rt, then
look at the routines in x11.c for ideas.  You may find that the existing
driver for NeWS is the closest to the Display PostScript used by the NeXT.

-Greg

P.S.  If you are on the network and willing to make me an account, I will
be happy to look at the compile problems myself and see if I can figure
a way around them.

From: john%3jane.UUCP@mathcs.emory.edu (John B. Lockhart)
Subject: Re: Help?
To: greg@hobbes.lbl.gov (Gregory J. Ward)
Date: Mon, 16 Dec 91 18:38:55 EST

Greg:

:I still say that you should not rename the functions.  The declarations
:I have are either for functions in the system library (such as calloc)
:or for my own replacement for these functions (such as malloc).  Renaming
:functions to foo_malloc and so forth is counter-productive.  If the
:advance declarations I give cause conflict, then remove them rather
:than renaming them.
:
:I hope I am not misunderstanding your problem.  Which declarations are
:in conflict?  I do not believe that there is any real conflict involved,
:only changes in the syntax of advance declarations.

Ok, lemme explain again:  Any function that you declare to replace a
standard library function with the same name is causing my *linker*
to have screaming fits about "duplicate symbols."  It is *not* over-
riding the standard library functions with yours, like it should be,
and I have no idea how to get it to do so (I've tried just about every
command-line option on the man page).  In order to alleviate this,
I have renamed *your* function-declarations that are in conflict; thus
Radiance compiles using the standard library versions rather than its own.
This essentially just creates dead code; I could just comment them
out and have it work.  I was suggesting that you rename your functions
to something else to prevent conflicts with the standard library, but
as most compiler/linkers override library symbols with your own, it
isn't necessary for many machines.  The only way for me to get Radiance
to use it's own memory allocation routines is to rename them to something
that doesn't conflict with the standard library, throughout *all* of
Radiance.


In other words, it is impossible for me on my NeXT to compile:

char *malloc()
{
  return NULL;
}

main()
{
  malloc();
}

because *my* malloc() conflicts with the standard library malloc().

:Regarding device drivers for rview, I would be delighted if you would
:write one.  You should first read the file driver.h in ray/src/rt, then
:look at the routines in x11.c for ideas.  You may find that the existing
:driver for NeWS is the closest to the Display PostScript used by the NeXT.
I'll give it a shot.  First I need to get Radiance working!  :)

:P.S.  If you are on the network and willing to make me an account, I will
:be happy to look at the compile problems myself and see if I can figure
:a way around them.
Unfortunately my only InterNet account is a Sequent student account.
My 'station is at home connected via a UUCP link.  So it goes.  I've
been standing on soap boxes shouting for student SLIP or PPP (yeah, right),
to no avail.  If I get some sort of campus computer employment, then one
day Georgia Tech might suddenly have a clandestine PPP link (hehehe)...

--
|         John B. Lockhart         |..What kind of dream was this,............|
|      Junior/EE, Georgia Tech     |..so easy to destroy?.....................|
| john%3jane.uucp@mathcs.emory.edu |..........................................|
|   (Above address NeXTmailable.)  |.........................--Pet Shop Boys..|

Date: Tue, 17 Dec 91 09:36:23 PST
From: greg (Gregory J. Ward)
To: john%3jane.UUCP@mathcs.emory.edu
Subject: Re: Help?

Hi John,

I guess I had no idea of the magnitude of the problem.  I've NEVER heard
of a linker that refused to override library definitions.  That goes
against a very fundamental law of libraries.

The reason for having library replacements is efficiency.  Sometimes the
library functions do not perform well, sometimes they are unreliable on
different architectures (or missing entirely), and sometimes there is
something particular about the program that makes the library implementations
less efficient than they could be.  A simple example of where a library
function is overridden is in my definition of strcmp() (in common/savestr.c).
Most library's strcmp's do not compare the pointer values they are handed
for equality because this case never happens.  But when using savestr(),
many strings will end up pointing to the same address so comparing pointers
avoids having to test for equal bytes through the length of the string.
The new implementation of savestr does the same job as the library version,
but in the special case of equal pointers it does it much faster.
Similarly, I wrote my own malloc() routines to work in consort with a
variation called bmalloc() that allocates untagged blocks of memory.
Most libraries do a decent job nowadays with malloc (although there are
some notable exceptions), but if I use the library malloc, then bmalloc
does not work as efficiently.  (And bmalloc is what I do most of my
big allocations with.)

Sure, removing my implementations of the library functions will work,
but with some loss in efficiency.  I do not want to rename all references
myself, because some of these routines I use other places without my
particular implementations and I don't want to have to carry all my
routines with them.  It's very inconvenient to call mystrcmp() everywhere
I would normally use strcmp() when I may or may not be linking to my own
library containing mystrcmp.  I also cannot call both my library function
and the standard one because in some cases they are incompatible.  I know
there are implementations of malloc that fail catastrophically if you make
a call to sbrk() (as mymalloc would) inbetween calls to it.

In conclusion, I think you are taking the only possible course of action
by renaming or removing my implementations of the library routines.  Do
not rename the calls, though.  Just discard my replacements.

I recommend contacting the folks at NeXT to find out what is going on
with their linker.  Those guys are really out on a limb or out to lunch
or something.

-Greg

From: john%3jane.UUCP@mathcs.emory.edu (John B. Lockhart)
Subject: Re: Help?
To: greg@hobbes.lbl.gov (Gregory J. Ward)
Date: Tue, 17 Dec 91 14:51:38 EST

Greg:

:I guess I had no idea of the magnitude of the problem.  I've NEVER heard
:of a linker that refused to override library definitions.  That goes
:against a very fundamental law of libraries.

I agree.  I could be missing something; in any case I'm certainly very
frustrated.  I think I'll post that little program I gave you onto
comp.sys.next.programmer and hope someone there says "-$, stupid!" or
something...

I completely understand your replacement of the standard library functions;
I was never in disagreement with that.  Also, using the same names allows
you to use either your version or the standard version by merely including
a library or not as an arg to the compiler.  My only problem was that this
wreaks havoc with my system, which is not as it should be.

:In conclusion, I think you are taking the only possible course of action
:by renaming or removing my implementations of the library routines.  Do
:not rename the calls, though.  Just discard my replacements.

That's what I've done.  Seems to be working well enough now.

:I recommend contacting the folks at NeXT to find out what is going on
:with their linker.  Those guys are really out on a limb or out to lunch
:or something.

To tell you the truth, I don't think it's NeXT--my suspicion is that it's
GNU.  I had a friend compile my little program on a SPARC with and without
the GNU CC compiler and he got the same message when he used GNU; it worked
fine using Sun's CC.

I will take your suggestion though and try to find out what (if anything)
I'm doing wrong...

Thanks.

--John

PS:  I'll proabaly be in touch sooner or later about NeXT driver woes
     or (perhaps) the solution to the multiple-symbol-definitions problem
     so that you may add a NeXT line to your makeall script.

--
|         John B. Lockhart         |..Bow down before the one you serve.......|
|      Junior/EE, Georgia Tech     |..You're going to get what you deserve....|
| john%3jane.uucp@mathcs.emory.edu |..........................................|
|   (Above address NeXTmailable.)  |.......................--Nine Inch Nails..|

From: john%3jane.UUCP@mathcs.emory.edu (John B. Lockhart)
Subject: Multiple Symbol Madness
To: GJWard@Csa2.lbl.gov
Date: Thu, 19 Dec 91 1:15:45 EST

Greg:

You're going to *love* this.  I posted the message about the linker
having real fits about multiple symbols onto comp.sys.next.programmer,
and pretty much got flamed for not noticing this until now.  Seems
I've revived an old thread.  (Woe be unto me, for I have sinned!)

Someone did, however, mail me the following solution which, though
kludgy, hackish, and ugly besides, works:

cc -O -Dmalloc=my_malloc -o prog prog.c

Yes, that's right.  Just tell it to redefine matters and let the
preprocessor do the search/replace work for you.  This can be added
as args in your makeall script at least until something better comes
along.  "-Dmalloc=my_malloc -Dstrcmp=my_strcmp ..."

I don't like it any more than you do.

--John

--
|         John B. Lockhart         |..I don't think we're in..................|
|      Junior/EE, Georgia Tech     |..Kansas anymore, Toto!...................|
| john%3jane.uucp@mathcs.emory.edu |..........................................|
|   (Above address NeXTmailable.)  |...............................--Dorothy..|

Date: Thu, 19 Dec 91 08:51:54 PST
From: greg (Gregory J. Ward)
To: john%3jane.UUCP@mathcs.emory.edu
Subject: Re:  Multiple Symbol Madness

Hi John,

It's not a pretty solution, but at least it's a solution!  I suppose that
one of us should have thought of that...

Anyway, I am prepared to add it to the makeall script.  Rather than trying
to remember what standard library functions I have redefined, do you have
a list that you could share with me?  The only ones I can think of offhand
are malloc and strcmp.

Thanks a million!
-Greg

From: john%3jane.UUCP@mathcs.emory.edu (John B. Lockhart)
Subject: Re:  Multiple Symbol Madness
To: greg@hobbes.lbl.gov (Gregory J. Ward)
Date: Thu, 19 Dec 91 15:21:30 EST

Greg:

:It's not a pretty solution, but at least it's a solution!  I suppose that
:one of us should have thought of that...
No it isn't.  Yes we should've.  Perhaps we were thinking along the lines
of horror at the fact that the linker wasn't doing things right and "there
must be a command line switch" rather than just looking for kludgy solutions.

:Anyway, I am prepared to add it to the makeall script.  Rather than trying
:to remember what standard library functions I have redefined, do you have
:a list that you could share with me?  The only ones I can think of offhand
:are malloc and strcmp.

Ok, the ones I've got a "Z" in front of are malloc(), realloc(), free(),
and strcmp().  To assist you with adding a NeXT option:  It is of course
BSD-derived, not RISC, and has never heard of X11.  I think your noX11help
isn't entirely complete--some other Makefiles needed patching to remove
X stuff, and I can't quite remember which ones.  I had only two more fatal
errors in Radiance-in-general that I can think of:  You prototype atof()
somewhere and I think that's a macro; this caused the compiler to have
screaming fits--all that needs be done is remove the prototype.  Also,
in one file you define a macro:

#define CTRL(c)  ('c'-'@')

this *always* compiles to ('c'-'@') on ANSI preprocessors, regardless of
the argument.  Thus in your switch statement later in the same file, the
compiler barfs at duplicated case values.  I merely replaced it with
things like ('R'-'@'), etc, and everything was o.k.

Finally, I have not been able to get the AutoCad-->Radiance converter
and the TIFF library to compile.  The AutoCad-->Radiance bit has to do
with malloc() again for some reason, and the TIFF library is just a pain.

This is somewhat disturbing as TIFF is the rasterfile of choice on NeXT;
there are library calls to write pixmaps as TIFFs builtin to NeXT.  But
a machine-independent lib won't compile.  Arrrrg.

But with the patches I've listed I've been able to trace things in rpict.
Rview of course is useless.

I realize you can't make all of these patches and still have Radiance
compile well on other machines--perhaps a machine-dependent note file?
Who knows.

--
|         John B. Lockhart         |..I want to hear you scream...............|
|      Junior/EE, Georgia Tech     |..--Play some rap music...................|
| john%3jane.uucp@mathcs.emory.edu |..........................................|
|   (Above address NeXTmailable.)  |....................--The Last Boy Scout..|

Date: Thu, 19 Dec 91 14:16:10 PST
From: greg (Gregory J. Ward)
To: john%3jane.UUCP@mathcs.emory.edu
Subject: Re:  Multiple Symbol Madness

Thanks, John, for all your help.  I will incorporate as many changes as I
can figure out how to do in a machine-independent way.  Thanks especially
for spotting the macro failures -- I knew nothing about those before!

I am sorry you weren't able to figure out the TIFF library or dxfcvt.
Unfortunately, both were written by others and so I have limited ability
to fix them.

-Greg

Date: Thu, 19 Dec 91 14:21:35 PST
From: greg (Gregory J. Ward)
To: john%3jane.UUCP@mathcs.emory.edu
Subject: another thing...

Did you test this -Dmalloc=Zmalloc thing already?  As I said before, some
malloc's are incompatible with outside calls to sbrk.  If the NeXT has
such a malloc, then this redefinition will cause troubles for sure.

From: john%3jane.UUCP@mathcs.emory.edu (John B. Lockhart)
Subject: Oops!
To: greg@hobbes.lbl.gov (Gregory J. Ward)
Date: Thu, 19 Dec 91 19:19:48 EST

:Thanks, John, for all your help.  I will incorporate as many changes as I
:can figure out how to do in a machine-independent way.  Thanks especially
:for spotting the macro failures -- I knew nothing about those before!

Don't mention it.  Anyone putting out free software of Radiance's quality
deserves all the help he can get.  Note that you can add some special-cased
code if necessary with

#ifdef NeXT
...
#endif

'cause NeXT is defined in the compiler.  That may not be necessary, however.

:I am sorry you weren't able to figure out the TIFF library or dxfcvt.
:Unfortunately, both were written by others and so I have limited ability
:to fix them.

No big deal.  I don't use AutoCAD, and I can convert from Sun Raster to
TIFF anyway.

:Did you test this -Dmalloc=Zmalloc thing already?  As I said before, some
:malloc's are incompatible with outside calls to sbrk.  If the NeXT has
:such a malloc, then this redefinition will cause troubles for sure.

Oops.  What was I thinkin'!??  I tested it on that sample program but didn't
test it on Radiance due to some subconcious fear of compiling for an hour.
I looked at your malloc() stuffs, though, and noted your use of sbrk()
like you said (I've never used it before but assume it to be crucial
in bypassing malloc())... then checked the NeXT man page on a hunch:


% man sbrk

BRK(2)              UNIX Programmer's Manual               BRK(2)

NAME
     brk, sbrk - change data segment size

     The UNIX system calls brk and sbrk are not supported on the
     NeXT computer.


Ain't that just dandy?  At this point I assumed it wasn't worth the bother
of recompiling Radiance.  Since it's working fine with the standard library
malloc(), and that's what I used in v1.4, why don't we call it even and just
special-case your malloc() defs out of the Makefile or something, then just
add the -Dstrcmp=my_strcmp for strsave?


(Such a mess.  If you think this is bad, though, try porting an IBM Pascal
program to a Mac C program that uses the GUI.)

--
|         John B. Lockhart         |: Then again: : : : : : : : : : : : : : : |
|      Junior/EE, Georgia Tech     | :We could all be WRONG: : : : : : : : : :|
| john%3jane.uucp@mathcs.emory.edu |: (Wouldn't be the first time.) : : : : : |
|   (Above address NeXTmailable.)  | : : : : : : : : : : : --Laurie Anderson :|

Date: Thu, 19 Dec 91 16:49:54 PST
From: greg (Gregory J. Ward)
To: john%3jane.UUCP@mathcs.emory.edu
Subject: Re:  Oops!

OK, thanks for checking.  I guess NeXT users will just have to make some
additional Makefile changes -- namely, deleting malloc.o from the Makefile's
in src/ot and src/rt.

Date: Thu, 19 Dec 91 17:02:36 PST
From: greg (Gregory J. Ward)
To: john%3jane.UUCP@mathcs.emory.edu
Subject: Re:  Oops!

Actually, it wasn't so hard to make the deletions automatically.  NeXT users
will still have to deal with the X11 shortcomings, at least until we write
a driver for Display PostScript...

From: john%3jane.UUCP@mathcs.emory.edu (John B. Lockhart)
Subject: Re:  Oops!
To: greg@hobbes.lbl.gov (Gregory J. Ward)
Date: Fri, 20 Dec 91 1:05:52 EST

:Actually, it wasn't so hard to make the deletions automatically.
That's good!

:NeXT users
:will still have to deal with the X11 shortcomings [...]
Did you make the non-X11 compilation automatic, too?  Isn't that just the
same sorta thing as removing malloc.o compilation except for several files?

:at least until we write
:a driver for Display PostScript...
Well, I'll get to work on that.  I've scanned over (not parsed :) the
code for existing drivers and am curious--do you get the entire bitmap
on the screen via rectangle painting (e.g.: bunches of small rectangles)?
Or did I miss something in my once-over--I only saw things like
open/close/clear/paint-rect etc.

'cause if that's all there is then it should be a five-minute hack
once I figure out how the hell one gets a normal bonafide window without
having a normal bonafide Objective-C app running.

Oh, one last question:  Can you route "command-line" i/o to the terminal
you started rview from and just have a floating window?  (Note that this
should be moot if I can figure out what I need to figure out.)

--
|         John B. Lockhart         |......The Georgia......|   ___      |.....|
|      Junior/EE, Georgia Tech     |.....Institute  of.....|  |  _____  |.....|
| john%3jane.uucp@mathcs.emory.edu |......Technology:......|  |___||    |.....|
|   (Above address NeXTmailable.)  |.....We don't mold!....|       |    |.....|

Date: Fri, 20 Dec 91 08:34:01 PST
From: greg (Gregory J. Ward)
To: john%3jane.UUCP@mathcs.emory.edu

Hi John,

I didn't want to take out the X11 stuff automatically for the NeXT, just in
case NeXT should support X11 in the future.  I should probably have a
special question about X11 support, though, and make the changes based
on the presence or absence of certain files.  It all gets so complicated...

Yes, the picture is drawn by rview soley with paintrect calls.  I tried to
keep the driver interface as bone-headed simple as possible.  The tricky
part is usually getting input while drawing.  Rview has to be notified
(using the inpready member) as soon as input is available or response
time suffers.  It should be possible to get this from the standard input,
although I have never done it this way.  Keep in mind that rview should
run continuously until "interrupted" by user input.  This mode of interaction
is not supported easily by all window systems, but there is usually a way.

A specific problem we have had with our NeWS driver is that the rectangles
it paints don't really mesh nicely.  Because PostScript uses its own
device-independent coordinate system, there is some inaccuracy in exactly
which pixels are drawn by a paintrect call, and the result is a lot of
ugly seams everywhere.  If you have this problem and find a solution,
I would be most curious to hear about it.

Good luck, and let me know how I can help!
-Greg

From: john%3jane.UUCP@mathcs.emory.edu (John B. Lockhart)
Subject: Re:  Oops!
To: greg@hobbes.lbl.gov (Gregory J. Ward)
Date: Fri, 20 Dec 91 13:24:27 EST

Yo, Greg.

:I didn't want to take out the X11 stuff automatically for the NeXT, just in
:case NeXT should support X11 in the future.  I should probably have a
:special question about X11 support, though, and make the changes based
:on the presence or absence of certain files.  It all gets so complicated...

That's what I wanted.  Heaven forbid you make it just a NeXT switch--
I mean ask if you have X then it compiles or doesn't compile things based
on that.  I realize it is somewhat complicated--Make isn't quite built
for all the extremes of compatibility you're pushing it to.

:Yes, the picture is drawn by rview soley with paintrect calls.  I tried to
Makes sense.

:Keep in mind that rview should
:run continuously until "interrupted" by user input.  This mode of interaction
:is not supported easily by all window systems, but there is usually a way.
I guess I'm still foggy on what you're doing because I've never seen rview
run (hell of a disadvantage, writing a driver for something you have to
write the driver for to make it work).  I'll just study the NeWS code real
well then patch a NeXT hack to get a feel for it then refine things.

:A specific problem we have had with our NeWS driver is that the rectangles
:it paints don't really mesh nicely.  Because PostScript uses its own
:device-independent coordinate system, there is some inaccuracy in exactly
:which pixels are drawn by a paintrect call, and the result is a lot of
:ugly seams everywhere.  If you have this problem and find a solution,
:I would be most curious to hear about it.

I had a feeling you'd say that.  I've run into this problem before with
PostScript resolution nastiness while trying to make a radar screen for
a game I'm working on--seems that 1/72" screen rectangles are sometimes one
pixel and sometimes two pixels wide, depending on where you draw them!
Can you say "averaging?"  I knew you could.  That looks really good in
terms of printed output and smooth transitions but it's real hell for
the sort of thing we're trying to do.

I have an idea for a kludge:  Since I imagine your rview makes the rect
call only if it has to draw a "pixel," why not make the driver allocate
a bitmap, attach it to a window, then set pixels in it on the fly while
occasionally flushing it to the window?  Though sortof aesthetically
displeasing, it should work with a reasonable amount of speed and give
normal picture quality, since PostScript knows about bitmaps...  And
as an added bonus I think that'd make it really easy to put the picture in
a resizable, scrolling window (instead of just lobbing a 1024 x 768 over
everything).  I'll look into that.

--
|         John B. Lockhart         |: : : : : : : : Alien III : : : : : : : : |
|      Junior/EE, Georgia Tech     | : : : : : : : : : : : : : : : : : : : : :|
| john%3jane.uucp@mathcs.emory.edu |: : : : : : The bitch is back!: : : : : : |
|   (Above address NeXTmailable.)  | : : : : Coming Memorial Day 1992: : : : :|

