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