summaryrefslogtreecommitdiff
path: root/doc/devel/planetrender
blob: aa3c908ddc3b49a179c6cfebed128c8a5765b545 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
Planet surface rendering code
--------------------------------------------------------------

The way the planets appear on the screen (based on planet type
definition in plandata.c) is determined by several factors:

1. Topography algorithm (PlanetFrame.Type)
2. Color map (PlanetFrame.CMapInstance)
3. Elevation -> colormap index xlat table (PlanetFrame.XLatTabInstance)
4. Base elevation (PlanetFrame.base_elevation)
5. Several others not covered here: faults, craters (blemishes)

First, the planet topography is generated according to the algorithm
selected for the planet: TOPO_ALGO, CRATERED_ALGO, GAS_GIANT_ALGO.
TOPO_ALGO and CRATERED_ALGO use a fractal algorithm to pseudo-randomly
generate a surface, then 'craters' are added and, at the end, the map is
dithered for CRATERED_ALGO. GAS_GIANT_ALGO is of course different
because it needs to produce a series of ring-like structures with
'storms' added at the end.

The topographical map is a rectangle with each pixel representing an
elevation level relative to 0, so the topography is expressed in terms
of elevation relative to base elevation. Base elevation is applied to
the generated map. Topography is created with elevations -128..127,
and base elevations, currently, range from 100 to 200 (plandata.c) for
normal worlds and are always 29 for gas giants. Since the gas giants
do not have a real topography or a surface to speak of, their surfaces
are rather simulated with elevations.

At this point, the elevation levels are translated to the actual colors
using the xlat table and color map. First, the elevation is translated
to an index into the colormap using the xlat table (.xlt files), and
after that, the actual RGB color is drawn from the colormap (.ct files)
at this index.

There are 3 colormaps per instance specified in PlanetFrame. The active
colormap is selected from these 3 based on the surface temperature of
the planet: cold, normal and hot. The framework is also laid down for
3 xlat tables (one per surface temperature), but, AFAIK, distinct xlat
tables are never actually used. Currently, there is only 1 xlat table
per instance in each file.

The colormap files (.ct) seem to be in original DOS format. Probably
because they do not translate to the CLUT system very well. The colormaps
are carefully crafted and synchronized across all planet types to make
the entire system function properly. They are composed of 4 gradients of
different hue, 32 colors each (4*32=128 colors). Gradients go from the
most intense color to near black. For the most planet types, the three
colormaps per instance are all the same, so that the way a planet
surface looks does not change with the surface temperature. Notable
exceptions are: h2o_cts_ (water world) and mtl_cts_ (metal world); there
could be others as no byte-identical examination was done.
See blue-gas-giant-pal.png for an example colormap.