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