ffb_fog.c   [plain text]



/* FFB fog support:
 *
 * There are two levels of support for FOG in the Creator3D series.
 * Both involve a depth cue unit and 1 or 4 slope factors and scales
 * for varying the pixel intensity.
 *
 * Chips prior to FFB2 only have a single set of such settings, FFB2
 * and later have 4 settings.
 *
 * The basic depth cueing equation is:
 *
 *	C_final = dcsf(z) * C_orig + (1 - dcsf(z)) * C_fog
 *
 * 	C_final	--	The final color passed to blend unit or frame
 *			buffer (if blending is disabled).
 *
 *	C_orig	--	The color we start with, which comes either from
 *			the raster processor or cpu writes to the smart
 *			framebuffer aperture.
 *
 *	C_fog	--	This is the "fog" color, ie. the desired color
 *			at the deepest Z.
 *
 *	dcsf(z)	--	The depth cue scale as a function of Z.
 *
 * With pre-FFB2 chips there are four parameters to control the depth
 * cue scaling.  Here is a diagram:
 *
 *		   1.0	-------------
 *			|   |   |   |
 *			|   |   |   |
 *		Sfront	XXXXX---+---+
 *			|   |X  |   |
 *	dcsf(z)		|   | X |   |
 *			|   |  X|   |
 *		Sback	+---+---XXXXX
 *			|   |   |   |
 *		   0.0	-------------
 *			0.0 Zf  Zb 1.0
 *
 *			      z
 * Therefore:
 *
 *	for Zf < z < Zb
 *
 *		dcsf(z) = Sback + ((Sfront - Sback) / (Zf - Zb)) * (Zb - z)
 *
 *	for z <= Zf
 *
 *		dcsf(z) = Sfront
 *
 *	for z >= Zb
 *
 *		dcsf(z) = Sback
 *
 * With FFB2 and later, 3 more slope regions are provided, the first of
 * them starts at the end of the region defined above and ends at a
 * specified depth value, the next slop region starts there and ends
 * at the next specified depth value, and so on.  Each of the 3 slope
 * regions also have scale and slope settings of their own.
 *
 * The C_fog color is programmed into the alpha blending unit color1
 * and color2 registers as follows:
 *
 *	color1:		-(C_fog)
 *	color2:		C_fog - bg
 *
 * If alpha blending is disabled, the bg factor is zero.  Note that
 * the alpha blending color registers specify each of the RGB values
 * as 9 bit 1:8 signed numbers in the range -1.00 to 0.ff inclusive.
 * (ie. 0x100 == -1.00 and 0x0ff == +0.ff)
 */