194556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher/**************************************************************************
294556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher
394556f359450acebe87d6c9b4f4fd8ccf78589d8Alex DeucherCopyright 2000, 2001 ATI Technologies Inc., Ontario, Canada, and
494556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher                     Tungsten Graphics Inc., Austin, Texas.
594556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher
694556f359450acebe87d6c9b4f4fd8ccf78589d8Alex DeucherAll Rights Reserved.
794556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher
894556f359450acebe87d6c9b4f4fd8ccf78589d8Alex DeucherPermission is hereby granted, free of charge, to any person obtaining
994556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deuchera copy of this software and associated documentation files (the
1094556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher"Software"), to deal in the Software without restriction, including
1194556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucherwithout limitation the rights to use, copy, modify, merge, publish,
1294556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucherdistribute, sublicense, and/or sell copies of the Software, and to
1394556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucherpermit persons to whom the Software is furnished to do so, subject to
1494556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucherthe following conditions:
1594556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher
1694556f359450acebe87d6c9b4f4fd8ccf78589d8Alex DeucherThe above copyright notice and this permission notice (including the
1794556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deuchernext paragraph) shall be included in all copies or substantial
1894556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucherportions of the Software.
1994556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher
2094556f359450acebe87d6c9b4f4fd8ccf78589d8Alex DeucherTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
2194556f359450acebe87d6c9b4f4fd8ccf78589d8Alex DeucherEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
2294556f359450acebe87d6c9b4f4fd8ccf78589d8Alex DeucherMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
2394556f359450acebe87d6c9b4f4fd8ccf78589d8Alex DeucherIN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
2494556f359450acebe87d6c9b4f4fd8ccf78589d8Alex DeucherLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
2594556f359450acebe87d6c9b4f4fd8ccf78589d8Alex DeucherOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
2694556f359450acebe87d6c9b4f4fd8ccf78589d8Alex DeucherWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2794556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher
2894556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher**************************************************************************/
2994556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher
3094556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher/*
3194556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher * Authors:
3294556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher *   Keith Whitwell <keith@tungstengraphics.com>
3394556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher */
3494556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher
3594556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher#include "main/glheader.h"
3694556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher#include "main/imports.h"
3794556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher#include "main/context.h"
3894556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher#include "main/mtypes.h"
3994556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher#include "main/enums.h"
4094556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher#include "main/macros.h"
4194556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher
4294556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher#include "radeon_fog.h"
4394556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher
4494556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher/**********************************************************************/
4594556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher/*             Fog blend factor computation for hw tcl                */
4694556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher/*             same calculation used as in t_vb_fog.c                 */
4794556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher/**********************************************************************/
4894556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher
4994556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher#define FOG_EXP_TABLE_SIZE 256
5094556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher#define FOG_MAX (10.0)
5194556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher#define EXP_FOG_MAX .0006595
5294556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher#define FOG_INCR (FOG_MAX/FOG_EXP_TABLE_SIZE)
5394556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucherstatic GLfloat exp_table[FOG_EXP_TABLE_SIZE];
5494556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher
5594556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher#if 1
5694556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher#define NEG_EXP( result, narg )						\
5794556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucherdo {									\
5894556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher   GLfloat f = (GLfloat) (narg * (1.0/FOG_INCR));			\
5994556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher   GLint k = (GLint) f;							\
6094556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher   if (k > FOG_EXP_TABLE_SIZE-2) 					\
6194556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher      result = (GLfloat) EXP_FOG_MAX;					\
6294556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher   else									\
6394556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher      result = exp_table[k] + (f-k)*(exp_table[k+1]-exp_table[k]);	\
6494556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher} while (0)
6594556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher#else
6694556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher#define NEG_EXP( result, narg )					\
6794556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucherdo {								\
6894556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher   result = exp(-narg);						\
6994556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher} while (0)
7094556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher#endif
7194556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher
7294556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher
7394556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher/**
7494556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher * Initialize the exp_table[] lookup table for approximating exp().
7594556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher */
7694556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deuchervoid
7794556f359450acebe87d6c9b4f4fd8ccf78589d8Alex DeucherradeonInitStaticFogData( void )
7894556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher{
7994556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher   GLfloat f = 0.0F;
8094556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher   GLint i = 0;
8194556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher   for ( ; i < FOG_EXP_TABLE_SIZE ; i++, f += FOG_INCR) {
8294556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher      exp_table[i] = (GLfloat) exp(-f);
8394556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher   }
8494556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher}
8594556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher
8694556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher/**
8794556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher * Compute per-vertex fog blend factors from fog coordinates by
8894556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher * evaluating the GL_LINEAR, GL_EXP or GL_EXP2 fog function.
8994556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher * Fog coordinates are distances from the eye (typically between the
9094556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher * near and far clip plane distances).
9194556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher * Note the fog (eye Z) coords may be negative so we use ABS(z) below.
9294556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher * Fog blend factors are in the range [0,1].
9394556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher */
9494556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucherfloat
9594556f359450acebe87d6c9b4f4fd8ccf78589d8Alex DeucherradeonComputeFogBlendFactor( struct gl_context *ctx, GLfloat fogcoord )
9694556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher{
9794556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher	GLfloat end  = ctx->Fog.End;
9894556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher	GLfloat d, temp;
9994556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher	const GLfloat z = FABSF(fogcoord);
10094556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher
10194556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher	switch (ctx->Fog.Mode) {
10294556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher	case GL_LINEAR:
10394556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher		if (ctx->Fog.Start == ctx->Fog.End)
10494556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher			d = 1.0F;
10594556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher		else
10694556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher			d = 1.0F / (ctx->Fog.End - ctx->Fog.Start);
10794556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher		temp = (end - z) * d;
10894556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher		return CLAMP(temp, 0.0F, 1.0F);
10994556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher		break;
11094556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher	case GL_EXP:
11194556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher		d = ctx->Fog.Density;
11294556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher		NEG_EXP( temp, d * z );
11394556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher		return temp;
11494556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher		break;
11594556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher	case GL_EXP2:
11694556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher		d = ctx->Fog.Density*ctx->Fog.Density;
11794556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher		NEG_EXP( temp, d * z * z );
11894556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher		return temp;
11994556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher		break;
12094556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher	default:
12194556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher		_mesa_problem(ctx, "Bad fog mode in make_fog_coord");
12294556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher		return 0;
12394556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher	}
12494556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher}
12594556f359450acebe87d6c9b4f4fd8ccf78589d8Alex Deucher
126