radeon_fog.c revision 94556f359450acebe87d6c9b4f4fd8ccf78589d8
1645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez/************************************************************************** 2645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 3645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezCopyright 2000, 2001 ATI Technologies Inc., Ontario, Canada, and 4645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez Tungsten Graphics Inc., Austin, Texas. 5645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 6645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezAll Rights Reserved. 7645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 8645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezPermission is hereby granted, free of charge, to any person obtaining 9645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveza copy of this software and associated documentation files (the 10645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez"Software"), to deal in the Software without restriction, including 11645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezwithout limitation the rights to use, copy, modify, merge, publish, 12cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civellidistribute, sublicense, and/or sell copies of the Software, and to 13645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezpermit persons to whom the Software is furnished to do so, subject to 14645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezthe following conditions: 15645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 16645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezThe above copyright notice and this permission notice (including the 17645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveznext paragraph) shall be included in all copies or substantial 18645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezportions of the Software. 19645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 20645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 21645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 22645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 23cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay CivelliIN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE 24645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 25645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 26645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 27645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 28645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez**************************************************************************/ 29645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 30645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez/* 31645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez * Authors: 32645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez * Keith Whitwell <keith@tungstengraphics.com> 33645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez */ 34645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 35645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "main/glheader.h" 36645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "main/imports.h" 37645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "main/context.h" 38645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "main/mtypes.h" 39645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "main/enums.h" 40645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "main/macros.h" 41645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 42645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "radeon_fog.h" 43645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 44645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez/**********************************************************************/ 45645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez/* Fog blend factor computation for hw tcl */ 46645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez/* same calculation used as in t_vb_fog.c */ 47645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez/**********************************************************************/ 48645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 49645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#define FOG_EXP_TABLE_SIZE 256 50cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civelli#define FOG_MAX (10.0) 51cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civelli#define EXP_FOG_MAX .0006595 52cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civelli#define FOG_INCR (FOG_MAX/FOG_EXP_TABLE_SIZE) 53cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civellistatic GLfloat exp_table[FOG_EXP_TABLE_SIZE]; 54cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civelli 55645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#if 1 56645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#define NEG_EXP( result, narg ) \ 57645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezdo { \ 58645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez GLfloat f = (GLfloat) (narg * (1.0/FOG_INCR)); \ 59645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez GLint k = (GLint) f; \ 60645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (k > FOG_EXP_TABLE_SIZE-2) \ 61645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez result = (GLfloat) EXP_FOG_MAX; \ 62cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civelli else \ 63cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civelli result = exp_table[k] + (f-k)*(exp_table[k+1]-exp_table[k]); \ 64cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civelli} while (0) 65cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civelli#else 66cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civelli#define NEG_EXP( result, narg ) \ 67cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civellido { \ 68cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civelli result = exp(-narg); \ 69645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} while (0) 70645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#endif 71645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 72645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 73645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez/** 74645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez * Initialize the exp_table[] lookup table for approximating exp(). 75645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez */ 76645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezvoid 77645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezradeonInitStaticFogData( void ) 78645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez{ 79645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez GLfloat f = 0.0F; 80645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez GLint i = 0; 81645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez for ( ; i < FOG_EXP_TABLE_SIZE ; i++, f += FOG_INCR) { 82645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez exp_table[i] = (GLfloat) exp(-f); 83645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 84645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 85645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 86cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civelli/** 87cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civelli * Compute per-vertex fog blend factors from fog coordinates by 88645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez * evaluating the GL_LINEAR, GL_EXP or GL_EXP2 fog function. 89645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez * Fog coordinates are distances from the eye (typically between the 90645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez * near and far clip plane distances). 91cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civelli * Note the fog (eye Z) coords may be negative so we use ABS(z) below. 92645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez * Fog blend factors are in the range [0,1]. 93645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez */ 94645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezfloat 95645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector ChavezradeonComputeFogBlendFactor( struct gl_context *ctx, GLfloat fogcoord ) 96645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez{ 97645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez GLfloat end = ctx->Fog.End; 98645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez GLfloat d, temp; 99645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez const GLfloat z = FABSF(fogcoord); 100645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 101645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez switch (ctx->Fog.Mode) { 102645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez case GL_LINEAR: 103645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez if (ctx->Fog.Start == ctx->Fog.End) 104645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez d = 1.0F; 105645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez else 106645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez d = 1.0F / (ctx->Fog.End - ctx->Fog.Start); 107645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez temp = (end - z) * d; 108645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return CLAMP(temp, 0.0F, 1.0F); 109645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez break; 110645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez case GL_EXP: 111645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez d = ctx->Fog.Density; 112645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez NEG_EXP( temp, d * z ); 113645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return temp; 114645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez break; 115cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civelli case GL_EXP2: 116cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civelli d = ctx->Fog.Density*ctx->Fog.Density; 117cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civelli NEG_EXP( temp, d * z * z ); 118cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civelli return temp; 119cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civelli break; 120cfc1eaa913db3974e56c87b5489bda0a2bf36d93Jay Civelli default: 121645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez _mesa_problem(ctx, "Bad fog mode in make_fog_coord"); 122645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez return 0; 123645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez } 124645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez} 125645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez 126645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez