%!PS-Adobe-2.0 %%BoundingBox: 0 0 160 150 (../../ps/colours.inc) run /cx 80 def /cy 86 def (../../ps/ps3d.inc) run (bsp.inc) run /w 0.25 def /z 0.25 def % ------------------------------------------------------ /p [ /A 120 def /T A 30 sub def /dx A 90 sub cos w mul def /dy A 90 sub sin w mul def [ [T cos dx add T sin dy add z] [T cos dx sub T sin dy sub z] [T 120 sub cos dx sub T 120 sub sin dy sub z neg] [T 120 sub cos dx add T 120 sub sin dy add z neg] ] /A 240 def /T A 30 sub def /dx A 90 sub cos w mul def /dy A 90 sub sin w mul def [ [T cos dx add T sin dy add z] [T cos dx sub T sin dy sub z] [T 120 sub cos dx sub T 120 sub sin dy sub z neg] [T 120 sub cos dx add T 120 sub sin dy add z neg] ] /A 0 def /T A 30 sub def /dx A 90 sub cos w mul def /dy A 90 sub sin w mul def [ [T cos dx add T sin dy add z] [T cos dx sub T sin dy sub z] [T 120 sub cos dx sub T 120 sub sin dy sub z neg] [T 120 sub cos dx add T 120 sub sin dy add z neg] ] ] def % colours for the three plates /C [ [0.9 0 0] [0.7 0.6 0.6 ] [0.5 0.5 0.5] ] def % p now holds the three basic rectangles % -------------------------------------------------------- /page-begin { gsave cx cy translate 72 dup scale 1 72 div setlinewidth 1 setlinecap 1 setlinejoin } def /page-end { grestore showpage } def [0 0 10 1] set-eye % f is the procedure to be called on each face in the BSP /f { % [ polygon normal-function sign colour ] aload pop /c exch def /mu exch def /N exch def /P exch def /ell P length def N E dot-product mu mul 0 ge { newpath P ell 1 sub get aload pop moveto3d P { aload pop lineto3d } forall closepath gsave /s N light dot-product mu mul 1 add 2 div def c 0 get s mul c 1 get s mul c 2 get s mul setrgbcolor fill grestore % stroke } if } def /p [ 0 1 p length 1 sub { /i exch def /v p i get def /N v normal-function def [ v N 1 C i get ] [ v N -1 C i get ] } for ] def /b p /polygon-interp bsp-tree def [1 0 0 ] 156 rotate3d page-begin /E get-eye cim3d transform3d def /light [-0.25 1 0.25 0 ] normalized cim3d transform3d def b /f traverse page-end