Use a lookup table to compute exponents in tnl fogging code. Slightly
clean up the shine table lookup macro.
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
/* $Id: xm_tri.c,v 1.17 2001/01/23 23:39:37 brianp Exp $ */
|
||||
/* $Id: xm_tri.c,v 1.18 2001/02/06 04:06:36 keithw Exp $ */
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
@@ -1521,7 +1521,7 @@ do { \
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
static swrast_tri_func get_triangle_func( GLcontext *ctx )
|
||||
{
|
||||
SWcontext *swrast = SWRAST_CONTEXT(ctx);
|
||||
|
||||
+5
-5
@@ -1,4 +1,4 @@
|
||||
/* $Id: dd.h,v 1.49 2001/01/29 20:47:39 keithw Exp $ */
|
||||
/* $Id: dd.h,v 1.50 2001/02/06 04:06:34 keithw Exp $ */
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
@@ -900,12 +900,13 @@ struct dd_function_table {
|
||||
#define PRIM_UNKNOWN GL_POLYGON+3
|
||||
|
||||
GLuint CurrentExecPrimitive;
|
||||
/* Set by the driver-supplied t&l engine. Set to GL_POLYGON+1 when
|
||||
* outside begin/end.
|
||||
/* Set by the driver-supplied t&l engine. Set to
|
||||
* PRIM_OUTSIDE_BEGIN_END when outside begin/end.
|
||||
*/
|
||||
|
||||
GLuint CurrentSavePrimitive;
|
||||
/* Current state of an inprogress compilation.
|
||||
/* Current state of an in-progress compilation. May take on any of
|
||||
* the additional values defined above.
|
||||
*/
|
||||
|
||||
|
||||
@@ -926,7 +927,6 @@ struct dd_function_table {
|
||||
* if (flags & FLUSH_STORED_VERTICES) flushes any buffered vertices,
|
||||
* if (flags & FLUSH_UPDATE_CURRENT) updates ctx->Current
|
||||
* and ctx->Light.Material
|
||||
* returns GL_TRUE.
|
||||
*
|
||||
* Note that the default t&l engine never clears the
|
||||
* FLUSH_UPDATE_CURRENT bit, even after performing the update.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* $Id: imports.c,v 1.4 2001/01/08 04:09:41 keithw Exp $ */
|
||||
/* $Id: imports.c,v 1.5 2001/02/06 04:06:35 keithw Exp $ */
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
@@ -158,7 +158,7 @@ _mesa_InitDefaultImports(__GLimports *imports, void *driverCtx, void *other)
|
||||
imports->warning = _mesa_warning;
|
||||
imports->fatal = _mesa_fatal;
|
||||
imports->getenv = _mesa_getenv;
|
||||
/* imports->atoi = _mesa_atoi; */
|
||||
imports->atoi = _mesa_atoi;
|
||||
imports->sprintf = _mesa_sprintf;
|
||||
imports->fopen = _mesa_fopen;
|
||||
imports->fclose = _mesa_fclose;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* $Id: light.h,v 1.8 2000/12/26 05:09:29 keithw Exp $ */
|
||||
/* $Id: light.h,v 1.9 2001/02/06 04:06:35 keithw Exp $ */
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
@@ -82,13 +82,12 @@ _mesa_GetMaterialiv( GLenum face, GLenum pname, GLint *params );
|
||||
#define GET_SHINE_TAB_ENTRY( table, dp, result ) \
|
||||
do { \
|
||||
struct gl_shine_tab *_tab = table; \
|
||||
if (dp>1.0) \
|
||||
float f = (dp * (SHINE_TABLE_SIZE-1)); \
|
||||
int k = (int) f; \
|
||||
if (k > SHINE_TABLE_SIZE-2) \
|
||||
result = pow( dp, _tab->shininess ); \
|
||||
else { \
|
||||
float f = (dp * (SHINE_TABLE_SIZE-1)); \
|
||||
int k = (int) f; \
|
||||
else \
|
||||
result = _tab->tab[k] + (f-k)*(_tab->tab[k+1]-_tab->tab[k]); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
|
||||
|
||||
+42
-7
@@ -1,4 +1,4 @@
|
||||
/* $Id: t_vb_fog.c,v 1.2 2001/01/03 22:56:23 brianp Exp $ */
|
||||
/* $Id: t_vb_fog.c,v 1.3 2001/02/06 04:06:36 keithw Exp $ */
|
||||
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
@@ -49,10 +49,42 @@ struct fog_stage_data {
|
||||
|
||||
#define FOG_STAGE_DATA(stage) ((struct fog_stage_data *)stage->private)
|
||||
|
||||
#define FOG_EXP_TABLE_SIZE 256
|
||||
#define FOG_MAX (5.0)
|
||||
#define EXP_FOG_MAX .0006595
|
||||
#define FOG_INCR (FOG_MAX/FOG_EXP_TABLE_SIZE)
|
||||
static GLfloat exp_table[FOG_EXP_TABLE_SIZE];
|
||||
static GLfloat inited = 0;
|
||||
|
||||
#if 1
|
||||
#define NEG_EXP( result, narg ) \
|
||||
do { \
|
||||
float f = (narg * (1.0/FOG_INCR)); \
|
||||
int k = (int) f; \
|
||||
if (k > FOG_EXP_TABLE_SIZE-2) \
|
||||
result = EXP_FOG_MAX; \
|
||||
else \
|
||||
result = exp_table[k] + (f-k)*(exp_table[k+1]-exp_table[k]); \
|
||||
} while (0)
|
||||
#else
|
||||
#define NEG_EXP( result, narg ) \
|
||||
do { \
|
||||
result = exp(-narg); \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
|
||||
static void init_static_data( void )
|
||||
{
|
||||
float f = 0;
|
||||
int i = 0;
|
||||
for ( ; i < FOG_EXP_TABLE_SIZE ; i++, f += FOG_INCR) {
|
||||
exp_table[i] = exp(-f);
|
||||
}
|
||||
inited = 1;
|
||||
}
|
||||
|
||||
|
||||
/* Use lookup table & interpolation?
|
||||
*/
|
||||
static void make_win_fog_coords( GLcontext *ctx, GLvector1f *out,
|
||||
const GLvector1f *in )
|
||||
{
|
||||
@@ -76,15 +108,15 @@ static void make_win_fog_coords( GLcontext *ctx, GLvector1f *out,
|
||||
data[i] = (end - ABSF(*v)) * d;
|
||||
break;
|
||||
case GL_EXP:
|
||||
d = -ctx->Fog.Density;
|
||||
d = ctx->Fog.Density;
|
||||
for ( i = 0 ; i < n ; i++, STRIDE_F(v,stride))
|
||||
data[i] = exp( d*ABSF(*v) );
|
||||
NEG_EXP( data[i], d*ABSF(*v) );
|
||||
break;
|
||||
case GL_EXP2:
|
||||
d = -(ctx->Fog.Density*ctx->Fog.Density);
|
||||
d = ctx->Fog.Density*ctx->Fog.Density;
|
||||
for ( i = 0 ; i < n ; i++, STRIDE_F(v, stride)) {
|
||||
GLfloat z = *v;
|
||||
data[i] = exp( d*z*z );
|
||||
NEG_EXP( data[i], d*z*z );
|
||||
}
|
||||
break;
|
||||
default:
|
||||
@@ -173,6 +205,9 @@ static GLboolean alloc_fog_data( GLcontext *ctx,
|
||||
gl_vector1f_alloc( &store->fogcoord, 0, tnl->vb.Size, 32 );
|
||||
gl_vector1f_init( &store->input, 0, 0 );
|
||||
|
||||
if (!inited)
|
||||
init_static_data();
|
||||
|
||||
/* Now run the stage.
|
||||
*/
|
||||
stage->run = run_fog_stage;
|
||||
|
||||
Reference in New Issue
Block a user