ÚÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³ Name: ³ L-SYSTEM PARSER/MUTATOR ³ (C) RenderStar Technology BV. ³ ÃÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ Author: ³ Laurens J. Lapre ³ Version: ³ 2.0 ³ 1993-10-13 ³ ÃÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ RenderStar Technology BV, Keizersgracht 448 ³ ³ 1016 GD Amsterdam, the Netherlands ³ ³ Fax (+31) 20 622 4939 ³ ÃÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ Email: ³ 2:283/203.8 fidonet ³ 'Lj Lapre' PCGnet ³ ljlapre@hacktic.nl ³ ÀÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ Disclaimer ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ This software is free and may be freely distributed, but is copyrighted by the company RenderStar Technology BV. This software is provided as is without any guarantees. The author and company assume no liability for damages, direct or consequential, which may result from the use of this software. The 'lparser.exe' file may not be used as part of any commercial package without the explicit written consent of the author or company. General ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ An l-system is a rule like description of a 3d form. It contains descriptions of parts and how they should be assembeld together. The program reads a l-system description in and processes it into a 3d form which can then be outputed in several formats, including DXF and POV. The description is applied to itself a number of times (= recursion levels) so fractal and recursive forms are very easy to describe in an l-system. That's why they are used a lot for plants and natural looking organic forms. By increasing the recursion level the form slowly 'grows' and becomes more complex. This implementation of a l-system parser also allows 'mutations' to take place during the growing of the form. These mutations can change the form slightly or quite dramaticly. This allows you to create a form once and then create a whole series of forms all clearly 'descendant' from the original l-system. Too help people get started a lot of example l-systems and POV files have been included. The lparser.exe is a protected mode program using the royalty free Rational dos-extender (dos4gw.exe) supplied with Watcom 9. It needs a 386/387 or 486 with 4meg ram. Execute like this : ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ lparser [options] [name] examples : lparser -x rcylin -d lsys03.ls lparser -vc -t0.5 -u10 -i30000 -g lsys05 lparser spider Name is an l-system file with the ls extension. It will standard generate a RenderStar compatible 'output.vol' file. The standard output.vol file can be taken directly to the lviewer with the command : 'lviewer output'. You will get some information about the loaded object and it will bring you into a standard VGA 640x480 16 color screen. Here you can rotate the object, zoom in/out and pan. For key usage see the lviewer.txt file. It can also be shown and rendered directly in RenderStar with the command : 'rs2 l'. The l.* files are RenderStar support files. Persistence of Vision (POV) output : ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Part off the POV file is setup by the user and the output.pov file is then attached to the user's file. -v make POV object file Generates a POV file format description. Only the body part of the file is generated with a series of a l_base objects and leafs as triangles. See the 'exam.pov' file for more explanation. One can change the object definition of the l_base element used in the l-system form to any one of the valid POV shapes as long as the shape can be scaled differently in all 3 directions. With POV 2 this can also be a sphere. The file 'setup1.pov' can be used to connect to the output.inc file created with lparser -vc. The first 8 colors in the pov rendering will then match the ones in the viewer. The view will be about the same (except for the scale) as the initial startup configuration in the viewer. -b make POV blob file Instead of outputting objects, postionend components are written to the output.pov file. These can be used to create 'bloby' objects. See 'bloby.pov' for an example how to set this up. All triangles are skipped. The file 'setup2.pov' can be used to connect to the 'output.inc' file created with lparser -bc. -B make multiple POV blob files Each color part of the final form is written into its own output?.pov file. This allows you to have mutiple blob's each with its own color and material. See 'mbloby.pov' for an example. All triangles are skipped. The b*.pov files contain several different forms and setups done with POV's blob functions. The file 'setup3.pov' can be used to connect to the 'output?.inc' files created with lparser -Bc. -c output inc files instead of POV file The output files will now have the 'inc' extension for easier including in other POV files like 'setup.pov'. DXF output : ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ -d make dxf file (use with '-x cube' for fast dxf file writing) This creates AutoCad R12 polyline polyface meshes in dxf file format which can be used in Acad and 3DS. It's a much more efficient format than the 3dface format. It uses blocks and inserts. The most efficient dxf file (in size and write/load time) is generated with : lparser -x cube -d [name]. If you read the file into Acad12 make sure you have a new (no prototype) drawing since the file contains block definitions as well. The objects will have color and layer attributes set. By changing all object color attributes to BYLAYER one can use the layer overview for easy, by layer, color setting. -3 make dxf file This is a simple 3dface only dxf file format which will always work. It has no blocks or inserts but can become very large. RAW output : ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ -R make raw file This is a simple ascii RAW file format, it can become very large. One triangle per line. Other options : ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ -t [num] set minimum thickness This allows you to set the minimum thickness a form will get during recursive generation. It is to make sure the forms don't get too 'thin' to be seen and render correctly. It's typicly around 0.5 to 1.0. -u [num] mutate [num] times Mutate the l-system a number of times before starting the geometry generation fase and write the mutated l-system to disc as the file 'mutation.ls'. By re-using this file one can build mutation series of forms. -r [num] overrule recursion depth -a [num] overrule angle Overrule these values on the commandline. They are also set in the l-system file but they will not be used when an overrule option is used on the commandline. One can 'open' a form by starting with a angle of zero and increase it to the final angle. This makes nice animations. Doing the same with the -r option will slowly 'grow' the form into its final shape. -p [num] limit polygons to [num] Limit the total amount off polygons/objects outputed during the parsing of the final l-system production. After mutation the form may have grown very (VERY!) large. The whole form could be inserted in each of its branches ! The default limit is 200.000 polygons/objects. -i [num] limit string length to about [num] Limit the length of the final production string. This is also a way of limiting the size and generation time of a form. When certain mutations occur the generating time can become very long. The -i option can limit this time. Use like : lparser -p50000 -i30000 lsys00. The default string limit is 500.000 chars. The program can handle final l-systems strings up to 1 million chars. -x [name] use name.vol as base form Instead of a simple block a special object (*.vol) can be used as a base element. Example forms are ball, cube, cone, cylin8 (cylinder with 8 faces), cylin16 (cylinder with 16 faces), min (only two faces in a cross), rcylin (cylinder with rounded edges) and tube. This is for generating vol or dxf files only. Try : lparser -x ball lsys00. Just use the small *.vol files supplied with the parser for this purpose. Using larger lparser generated .vol files may not work. The changing of the base forms for POV output is done by the user in the POV headers. See *.pov for examples. -l show final L-string Prints the l-system production to the screen. This is the final string which is then interpreted into a 3d form. -g add ground plane Adds a large ground plane (2 triangles) touching the lowest point of the form. This is for easy shadow projection and horizon. More info ... ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ The book 'Evolutionary Art and Computers' by S. Todd and W. Latham was used to base the genetic 3d form mutation principles on. In here you'll find a lot of interesting ideas on how to 'grow' and 'evolve' organic looking 3d forms of your own. ISBN 0-12-437185-X The implemented l-system is based on the one described in the book : 'The Algorithmic Beauty of Plants' (BOP) by P. Prusinkiewicz and A. Lindenmayer (this is where the 'L' from l-systems come form). If you want more information on making your own l-systems you'll want to check out this book. A lot can be done by changing the l-systems suplied with the parser and seeing for yourself what changes in the final form. ISBN 0-387-97297-8 For this you can use the the following l-system files: bop00.ls cordate leave BOP pag 123 bop01.ls plant BOP pag 27 bop02.ls bush BOP pag 26 bop03.ls form in 2d BOP pag 25 bop04.ls block form BOP pag 20 bop05.ls fractal BOP pag 9 bop06.ls dragon curves BOP pag 9 bop07.ls compound leave BOP pag 130 tree00.ls monopodial tree BOP page 56 tree01.ls monopodial tree BOP page 56 tree02.ls ternary tree BOP page 60 tree03.ls willow type tree tree04.ls conifer type tree tree05.ls 'best' tree tree06.ls conifer type tree tree07.ls tropism experiment Fractals : fract*.ls L-systems from FractInt Free form experiments: lsys00.ls lobster form lsys01.ls " var 1 lsys02.ls " var 2 lsys03.ls " var 3 lsys04.ls " var 4 lsys05.ls spiral bush lsys06.ls tree base lsys07.ls half circle lsys08.ls " var 1 lsys09.ls cello plant lsys10.ls circle form Mutations: mut00 - mut08 mutations of lsys00.ls mut09 - mut14 mutations of spider.ls mut15 - mut18 distant relatives of lsys02.ls Spiral forms: spiral00.ls overview of spiral types spiral01.ls spiral form spiral02.ls spiral tree spiral03.ls large spiral plant var 1 spiral04.ls large spiral plant var 2 'Plant/Animal' forms: airhorse.ls part seahorse but with external lung dinofly.ls what would this be without a dino ? flower.ls cordate leave arangement spider.ls octo-spider Syntax and movement ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ For those who are already familiar with l-systems, here are the commands and their functions for this lparser's 'dialect'. All commands are 1 char only and simpler then for most lparsers. This is to keep them from getting 'broken' by the mutation process and speeds up the parsing. There is also the posibilty to add an argument to a command. Instead off doing +++ one can do +(30) if the basic angle was 10 degrees. The argument can be a real value. The tropism command will allow you to let gravity pull branches downward by adding a 't' element togeter with and 'F'. See the file 'tropism.ls' and 'tree*.ls' for examples. When you are not sure about the current 'down' direction do a '$' command first. This will roll the turtle horizontal and make sure the current up vector is oriented in the positive z-axis direction. The turtle will start at the origin with the Z-axis as forward direction and Y-axis as left direction. See the file 'axis.ls' for an detailed example. Here you can experiment with the basic orientations and see how the 3d turtle is using a 'right-handed' coordinate system. Use your right hand with your thumb as up, forefinger as forward and an other finger as left direction. By adding &(90) in front of an axiom the turtle axis will align with the right handed coordinate system used in the viewer. Adding an additional +(90) will make it easier when working with 2d l-systems. See the 'fract*.ls' files for examples. ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³ Turtle Orientation commands ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ + turn left around up vector ³ ³ +(x) turn x left around up vector ³ ³ - turn right around up vector ³ ³ -(x) turn x right around up vector ³ ³ & pitch down around left vector ³ ³ &(x) pitch x down around left vector ³ ³ ^ pitch up around left vector ³ ³ ^(x) pitch x up around left vector ³ ³ < roll left (counter clockwise) around forward vector ³ ³ <(x) roll x left around forward vector ³ ³ > roll right (clockwise) around forward vector ³ ³ >(x) roll x right around forward vector ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ Special Orientation commands ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ | turn 180 deg around up vector ³ ³ % roll 180 deg around forward vector ³ ³ $ roll until horizontal ³ ³ ~ turn/pitch/roll in a random direction ³ ³ t correction for gravity with 0.2 ³ ³ t(x) correction for gravity with x ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ Movement commands when {} active ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ F move forward and draw full length record vertex ³ ³ F(x) move x forward and draw record vertex ³ ³ f move forward with full length record vertex ³ ³ f(x) move x forward record vertex ³ ³ g move forward with full length don't record vertex ³ ³ g(x) move x forward don't record vertex ³ ³ Z move forward and draw half length record vertex ³ ³ Z(x) move x forward record vertex ³ ³ z move forward with half length record vertex ³ ³ z(x) move x forward record vertex ³ ³ . don't move record vertex ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ Structure commands ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ [ push current state ³ ³ ] pop current state ³ ³ { start polygon shape ³ ³ } end polygon shape ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ Inc/Dec commands ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ " increment length with 1.1 ³ ³ ' decrement length with 0.9 ³ ³ "(x) multiply length with x also '(x) ³ ³ ; increment angle with 1.1 ³ ³ : decrement angle with 0.9 ³ ³ :(x) multiply angle with x also ;(x) ³ ³ ? increment thickness with 1.4 ³ ³ ! decrement thickness with 0.7 ³ ³ ?(x) multiply thickness with x also !(x) ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ Additional commands ³ ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ´ ³ c increment color index ³ ³ c(x) set color index to x ³ ³ * reset color, thickness, length and angle ³ ³ @ end of object ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ This is an example of a simple form definition (spiral01.ls) : ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ 20 10 100 a a=Fs+;'a s=[::c!!!!&&[b]^^^^[b]] b=F!+F+;'b @ This is an example of a complex form definition with comments (spider.ls) : ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ 15 # recursion level 10 # basic angle 40 # starting thickness C # axiom #-------------------------------------- Creature C=%LABHT #-------------------------------------- Body B=[???????zZZZ] #-------------------------------------- Arms A=[zf&&&&&&&&&"""[pj>>>>>>>>>S]|[qj<<<<<<<<>>>[s]>>>>[s]>>>>[s]>>>[s]>>>>>>[s]>>>[s]>>>>[s]>>>>[s]] s=+++li+++dccc??""FF # down legs l=Ft+:'l # upper leg d=FFF'd # lower leg i=;i #-------------------------------------- Head H=["">>>>>>>>>&&&&&&??FFFF!![???h][???k]%^^[??k]] k=[Z?Z?Za] # jaw assembly a=Z[co]!'a # jaw o=&&&&&&&&&!!!!!F # teeth h=[^^gcccc"Z][^^ecccc"Z] # eyes g=z!+z!+z!+z # left eye e=z!-z!-z!-z # right eye #-------------------------------------- Tail T=[f---------??""""""mccccF] m=Ft+;'m # curl t=['::c!!!&&[f<<>>n] # spikes n=[c{--z++z++z--|--z++z++z}] # leaf #-------------------------------------- End @ This is an example of using the argument based commands (tree__00.ls) : ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ 10 45 15 FFAL A=F[&'(.8)!BL]>(137)'!(.9)A B=F[-'(.8)!(.9)$CL]'!(.9)C C=F[+'(.8)!(.9)$BL]'!(.9)B L=~cc{+(30)f(2)-(120)f(2)-(120)f(2)} @ Thanks to : ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ C.J.van der Mark [2:283/203.11 fidonet, 9:580/203.11 PCGnet] for testing all versions, feedback and working on the various POV formats. BBS Bennekom [2:283/203 fidonet, 9:580/203 PCGnet] for acting as go-between. ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ