multithreading support for sun shadow and super anti aliasing screen shot calculations.
new brightness/reflectivity ratios which makes the walls whiter and the sky bluer.
calc/view now more conveniently given as commmand line argument via two links.
Labyrinth 3D is a program to render the light and shadow situation on the walls of a 3D labyrinth under a natural sunny sky, and then to walk and look around in the labyrinth. In places where no sunlight, skylight or reflections of them can reach, lamps can be put. The geometry of the labyrinth is purposely held simple to allow for fast computation. The labyrinth is generated randomly, based on a single number, the "level number". There is also a level editor where one can place blocks and stairs by hand.
The computed high dynamic range data is stored in float textures, they are saved as they are computed and displayed, without compression. The only real-time computation that is done besides the usual polygon and texture rendering is the exposure. It is done in real-time on a per pixel basis in a shader, and it simply tries to hold the amount of light on the screen constant. This looks great for a wide range of light intensities, but gets worse for extremely low light situations. There a nocturnal vision calculation (blue sensitivity, grain, etc.) would be nice, but is not implemented yet.
The .zip contains three versions:
- Labyrinth, the main program
- LevelEditorFB, the working, usable level editor in FreeBasic
- LevelEditor, a shader based version for the real-time visualization of the sun shadow, work in progress
How to make a new level
- choose a level number, say 7 in the following
- make a copy of the levxxxx directory
- rename it to your chosen level number with four digits and leading zeros, i.e. lev0007
- in it edit Labyrinth.cfg: give the size (Abmessung), goal field (Ziel) and level number (Levelzahl)
- make a link for Labyrinth.exe and edit it, so that it executes in the lev0007 directory
- give a "1" as program argument (i.e. write "...\...\Labyrith.exe 1") and name the link "...-calc"
- make a second link with "0" as argument and name it "...-view"
- note: the shader files have to be on the same directory level as lev0007
(because the path for the shader files is set to the constant "../")
- when you start the calculating link now, it should start calculating the level
- it will open a logfile and write to it e.g. your OpenGL version string
- it will try to build a labyrinth and if it succeeds will save it to a file Weg.dat
- it will compute a visibility file called Sicht.dat and store it in the lev0007 directory
- at first you will see only a black labyrinth while the sun shadows are computed, this can take a while
- then you should be able to watch a few rendering passes ("pass 1,2,3,4,...")
- press q to abort the current rendering pass
- now if you look in the file Berechnung.dat you should see the pass and field number where you aborted
- the tex directories should be full up to the number where you aborted
say you aborted in pass 4/field 10, then tex4 should contain 10 files of texture data
- if you start the calc link again, it should continue with rendering at exactly this point
now it can load Weg.dat, Sicht.dat and previously rendered textures, and so is faster
- if you want to walk around instead, simply call the viewing link (the one with 0 as argument)
- you can continue rendering anytime by calling the calc link (that has 1 as argument) again
- you have to turn on antialiasing/multisampling/supersampling for Labyrinth.exe by hand
by using your graphics card vendor's system management utility to get the maximum precision for the rendering
- walk around with the edsf keys or by holding the right mouse button. look around with the mouse.
- full key descriptions at the beginning of the main.cpp file
- for fullscreen, edit the numbers 1024 and 768 in Labyrinth.cfg at the end, to fit your screen resolution
- if you have rendered it to the end, you don't have to keep all the texture data of intermediate passes,
at this point you can delete the tex1-tex8 directories and just keep the data in tex0 and tex9
How to use the FreeBasic level editor
How to load/save, etc. see the key descriptions at the head of the .bas file.
Levels that are designed with the level editor have numbers >=1000. There is an important difference to the usual, automatically generated levels: the size now includes the ground. Normally, for say a level with 9x9x6 blocks, you would get in reality a level with 13x13x7 blocks, since one ground level is added and 4 blocks surrounding. In the designed levels the size is the true size, so for a 9x9x6 size you get 9x9x6 blocks and for 13x13x7 size you get 13x13x7 blocks. You could even decide to have no ground, or holes in it, but this is not recommended. If you aren't sure about a "solution path" or a "goal field" in your level, just make a ground the size AxB and let the starting field be 1,1,1 and the goal field A,B,1, so that there always exists a solution "around" your labyrinth.
When you have created and saved a weg2.dat, copy it to Weg.dat in a levxxxx directory. As there is now a Weg.dat, it will not generate a random labyrinth, but load it instead. If there is no Sicht.dat, it will calculate and save it now for your level. Note that if you decide to alter your level, you have to delete the old Sicht.dat, so that a new one is generated. Also, if anything has changed and has to be computed anew, delete all files in tex0, since existing files there will be loaded automatically and prevent them being calculated.
How to use the GLSL level editor
It is work in progress and at the moment mainly a visualization tool for experimenting with the look of the sun incidence angles in real-time. Later it also could be a full editor where one can do the same things as in the FreeBasic editor.
Check out my labyrinths at youtube.com/user/ionreq