809efd28a3
git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@1367 8092fc87-c524-0410-9efc-e669fe64eaf9
55 lines
2.8 KiB
Plaintext
55 lines
2.8 KiB
Plaintext
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.
|
|
|