@@ -1,4 +1,4 @@ | |||
/* $Id: s_triangle.c,v 1.9 2001/01/23 23:39:37 brianp Exp $ */ | |||
/* $Id: s_triangle.c,v 1.10 2001/01/29 18:51:25 brianp Exp $ */ | |||
/* | |||
* Mesa 3-D graphics library | |||
@@ -1826,6 +1826,7 @@ static void lambda_textured_triangle1( GLcontext *ctx, | |||
#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE | |||
#define INTERP_RGB 1 | |||
#define INTERP_ALPHA 1 | |||
#define INTERP_LAMBDA 1 | |||
#define INTERP_TEX 1 | |||
#define SETUP_CODE \ | |||
@@ -1864,8 +1865,7 @@ static void lambda_textured_triangle1( GLcontext *ctx, | |||
s[i] = ss*invQ; \ | |||
t[i] = tt*invQ; \ | |||
u[i] = uu*invQ; \ | |||
lambda[i] = compute_lambda( dsdx, dsdy, dtdx, dtdy, \ | |||
invQ, twidth, theight );\ | |||
lambda[i] = COMPUTE_LAMBDA(invQ); \ | |||
ffz += fdzdx; \ | |||
fffog += fdfogdx; \ | |||
ss += dsdx; \ | |||
@@ -1886,8 +1886,7 @@ static void lambda_textured_triangle1( GLcontext *ctx, | |||
s[i] = ss*invQ; \ | |||
t[i] = tt*invQ; \ | |||
u[i] = uu*invQ; \ | |||
lambda[i] = compute_lambda( dsdx, dsdy, dtdx, dtdy, \ | |||
invQ, twidth, theight );\ | |||
lambda[i] = COMPUTE_LAMBDA(invQ); \ | |||
ffz += fdzdx; \ | |||
fffog += fdfogdx; \ | |||
ffr += fdrdx; \ | |||
@@ -1932,6 +1931,7 @@ static void lambda_textured_spec_triangle1( GLcontext *ctx, | |||
#define INTERP_SPEC 1 | |||
#define INTERP_ALPHA 1 | |||
#define INTERP_TEX 1 | |||
#define INTERP_LAMBDA 1 | |||
#define SETUP_CODE \ | |||
const struct gl_texture_object *obj = ctx->Texture.Unit[0]._Current; \ | |||
@@ -1976,8 +1976,7 @@ static void lambda_textured_spec_triangle1( GLcontext *ctx, | |||
s[i] = ss*invQ; \ | |||
t[i] = tt*invQ; \ | |||
u[i] = uu*invQ; \ | |||
lambda[i] = compute_lambda( dsdx, dsdy, dtdx, dtdy, \ | |||
invQ, twidth, theight );\ | |||
lambda[i] = COMPUTE_LAMBDA(invQ); \ | |||
fffog += fdfogdx; \ | |||
ffz += fdzdx; \ | |||
ss += dsdx; \ | |||
@@ -2001,8 +2000,7 @@ static void lambda_textured_spec_triangle1( GLcontext *ctx, | |||
s[i] = ss*invQ; \ | |||
t[i] = tt*invQ; \ | |||
u[i] = uu*invQ; \ | |||
lambda[i] = compute_lambda( dsdx, dsdy, dtdx, dtdy, \ | |||
invQ, twidth, theight );\ | |||
lambda[i] = COMPUTE_LAMBDA(invQ); \ | |||
fffog += fdfogdx; \ | |||
ffz += fdzdx; \ | |||
ffr += fdrdx; \ | |||
@@ -2307,6 +2305,7 @@ _swrast_choose_triangle( GLcontext *ctx ) | |||
&& image->Border==0 | |||
&& ((format = image->Format)==GL_RGB || format==GL_RGBA) | |||
&& (filter = current2Dtex->MinFilter)==current2Dtex->MagFilter | |||
/* ==> current2Dtex->MinFilter != GL_XXX_MIPMAP_XXX */ | |||
&& ctx->Light.Model.ColorControl==GL_SINGLE_COLOR | |||
&& ctx->Texture.Unit[0].EnvMode!=GL_COMBINE_EXT) { | |||
@@ -2384,7 +2383,7 @@ _swrast_choose_triangle( GLcontext *ctx ) | |||
} | |||
else { | |||
if (needLambda) { | |||
swrast->Triangle = lambda_textured_triangle; | |||
swrast->Triangle = lambda_textured_triangle; | |||
dputs("lambda_textured_triangle"); | |||
} | |||
else { |
@@ -1,10 +1,10 @@ | |||
/* $Id: s_tritemp.h,v 1.7 2001/01/23 23:39:37 brianp Exp $ */ | |||
/* $Id: s_tritemp.h,v 1.8 2001/01/29 18:51:25 brianp Exp $ */ | |||
/* | |||
* Mesa 3-D graphics library | |||
* Version: 3.5 | |||
* | |||
* Copyright (C) 1999-2000 Brian Paul All Rights Reserved. | |||
* Copyright (C) 1999-2001 Brian Paul All Rights Reserved. | |||
* | |||
* Permission is hereby granted, free of charge, to any person obtaining a | |||
* copy of this software and associated documentation files (the "Software"), | |||
@@ -39,6 +39,8 @@ | |||
* INTERP_INDEX - if defined, interpolate color index values | |||
* INTERP_INT_TEX - if defined, interpolate integer ST texcoords | |||
* (fast, simple 2-D texture mapping) | |||
* INTERP_LAMBDA - if defined, the lambda value is computed at every | |||
* pixel, to apply MIPMAPPING, and min/maxification | |||
* INTERP_TEX - if defined, interpolate set 0 float STRQ texcoords | |||
* NOTE: OpenGL STRQ = Mesa STUV (R was taken for red) | |||
* INTERP_MULTITEX - if defined, interpolate N units of STRQ texcoords | |||
@@ -278,6 +280,14 @@ | |||
GLfloat dudx[MAX_TEXTURE_UNITS], dudy[MAX_TEXTURE_UNITS]; | |||
GLfloat dvdx[MAX_TEXTURE_UNITS], dvdy[MAX_TEXTURE_UNITS]; | |||
#endif | |||
#ifdef INTERP_LAMBDA | |||
#ifndef INTERP_TEX | |||
#error "Mipmapping without texturing doesn't make sense." | |||
#endif | |||
GLfloat lambda_nominator; | |||
#endif | |||
/* | |||
* Execute user-supplied setup code | |||
@@ -955,6 +965,36 @@ | |||
if (ffi<0) ffi = 0; | |||
#endif | |||
#ifdef INTERP_LAMBDA | |||
/* | |||
* The lambda value is: | |||
* log_2(sqrt(f(n))) = 1/2*log_2(f(n)), where f(n) is a function | |||
* defined by | |||
* f(n):= dudx * dudx + dudy * dudy + dvdx * dvdx + dvdy * dvdy; | |||
* and each of this terms is resp. | |||
* dudx = dsdx * invQ(n) * tex_width; | |||
* dudy = dsdy * invQ(n) * tex_width; | |||
* dvdx = dtdx * invQ(n) * tex_height; | |||
* dvdy = dtdy * invQ(n) * tex_height; | |||
* Therefore the function lambda can be represented (by factoring out) as: | |||
* f(n) = lambda_nominator * invQ(n) * invQ(n), | |||
* which saves some computation time. | |||
*/ | |||
{ | |||
GLfloat dudx = dsdx /* * invQ*/ * twidth; | |||
GLfloat dudy = dsdy /* * invQ*/ * twidth; | |||
GLfloat dvdx = dtdx /* * invQ*/ * theight; | |||
GLfloat dvdy = dtdy /* * invQ*/ * theight; | |||
GLfloat r1 = dudx * dudx + dudy * dudy; | |||
GLfloat r2 = dvdx * dvdx + dvdy * dvdy; | |||
GLfloat rho2 = r1 + r2; /* used to be: rho2 = MAX2(r1,r2); */ | |||
lambda_nominator = rho2; | |||
} | |||
/* return log base 2 of sqrt(rho) */ | |||
#define COMPUTE_LAMBDA(X) log( lambda_nominator * (X)*(X) ) * 1.442695F * 0.5F /* 1.442695 = 1/log(2) */ | |||
#endif | |||
INNER_LOOP( left, right, iy ); | |||
/* | |||
@@ -1084,6 +1124,8 @@ | |||
#undef INTERP_SPEC | |||
#undef INTERP_ALPHA | |||
#undef INTERP_INDEX | |||
#undef INTERP_LAMBDA | |||
#undef COMPUTE_LAMBDA | |||
#undef INTERP_INT_TEX | |||
#undef INTERP_TEX | |||
#undef INTERP_MULTITEX |