-/* $Id: s_fog.c,v 1.3 2000/11/15 00:26:01 brianp Exp $ */
+/* $Id: s_fog.c,v 1.9 2001/03/03 20:33:30 brianp Exp $ */
/*
* Mesa 3-D graphics library
#include "s_context.h"
#include "s_fog.h"
+#include "s_pb.h"
/*
const GLfixed fog[],
GLchan rgba[][4] )
{
- GLfixed rFog = ctx->Fog.Color[0] * CHAN_MAXF;
- GLfixed gFog = ctx->Fog.Color[1] * CHAN_MAXF;
- GLfixed bFog = ctx->Fog.Color[2] * CHAN_MAXF;
GLuint i;
+ GLchan rFog, gFog, bFog;
- for (i=0;i<n;i++) {
- GLfixed f = CLAMP(fog[i], 0, FIXED_ONE);
- GLfixed g = FIXED_ONE - f;
- rgba[i][0] = (f*rgba[i][0] + g*rFog) >> FIXED_SHIFT;
- rgba[i][1] = (f*rgba[i][1] + g*gFog) >> FIXED_SHIFT;
- rgba[i][2] = (f*rgba[i][2] + g*bFog) >> FIXED_SHIFT;
+ UNCLAMPED_FLOAT_TO_CHAN(rFog, ctx->Fog.Color[RCOMP]);
+ UNCLAMPED_FLOAT_TO_CHAN(gFog, ctx->Fog.Color[GCOMP]);
+ UNCLAMPED_FLOAT_TO_CHAN(bFog, ctx->Fog.Color[BCOMP]);
+
+#if CHAN_TYPE == GL_FLOAT
+ for (i = 0; i < n; i++) {
+ const GLfixed cf = CLAMP(fog[i], 0, FIXED_ONE);
+ const GLfloat f = FixedToFloat(cf);
+ const GLfloat g = 1.0F - f;
+ rgba[i][RCOMP] = f * rgba[i][RCOMP] + g * rFog;
+ rgba[i][GCOMP] = f * rgba[i][GCOMP] + g * gFog;
+ rgba[i][BCOMP] = f * rgba[i][BCOMP] + g * bFog;
+ }
+#else
+ for (i = 0; i < n; i++) {
+ const GLfixed f = CLAMP(fog[i], 0, FIXED_ONE);
+ const GLfixed g = FIXED_ONE - f;
+ rgba[i][0] = (f * rgba[i][0] + g * rFog) >> FIXED_SHIFT;
+ rgba[i][1] = (f * rgba[i][1] + g * gFog) >> FIXED_SHIFT;
+ rgba[i][2] = (f * rgba[i][2] + g * bFog) >> FIXED_SHIFT;
}
+#endif
}
-
/*
* Apply fog to an array of color index pixels.
* Input: n - number of pixels
GLuint i;
for (i=0;i<n;i++) {
- GLfixed f = FixedToFloat(CLAMP(fog[i], 0, FIXED_ONE));
+ GLfloat f = FixedToFloat(CLAMP(fog[i], 0, FIXED_ONE));
index[i] = (GLuint) ((GLfloat) index[i] + (1.0F-f) * idx);
}
}
const GLfloat p10 = ctx->ProjectionMatrix.m[10];
const GLfloat p14 = ctx->ProjectionMatrix.m[14];
const GLfloat tz = ctx->Viewport._WindowMap.m[MAT_TZ];
- const GLfloat szInv = 1.0F / ctx->Viewport._WindowMap.m[MAT_SZ];
+ GLfloat szInv;
GLuint i;
+ if (ctx->Viewport._WindowMap.m[MAT_SZ] == 0.0)
+ szInv = 1.0F;
+ else
+ szInv = 1.0F / ctx->Viewport._WindowMap.m[MAT_SZ];
+
/*
* Note: to compute eyeZ from the ndcZ we have to solve the following:
*
case GL_LINEAR:
{
GLfloat fogEnd = ctx->Fog.End;
- GLfloat fogScale = (GLfloat) FIXED_ONE / (ctx->Fog.End -
- ctx->Fog.Start);
+ GLfloat fogScale;
+ if (ctx->Fog.Start == ctx->Fog.End)
+ fogScale = 1.0;
+ else
+ fogScale = 1.0F / (ctx->Fog.End - ctx->Fog.Start);
if (ortho) {
for (i=0;i<n;i++) {
GLfloat ndcz = ((GLfloat) z[i] - tz) * szInv;
GLfloat eyez = (ndcz - p14) / p10;
- if (eyez < 0.0) eyez = -eyez;
- fogcoord[i] = (GLint) ((fogEnd - eyez) * fogScale);
+ if (eyez < 0.0)
+ eyez = -eyez;
+ fogcoord[i] = FloatToFixed((fogEnd - eyez) * fogScale);
}
}
else {
for (i=0;i<n;i++) {
GLfloat ndcz = ((GLfloat) z[i] - tz) * szInv;
GLfloat eyez = p14 / (ndcz + p10);
- if (eyez < 0.0) eyez = -eyez;
- fogcoord[i] = (GLint) ((fogEnd - eyez) * fogScale);
+ if (eyez < 0.0)
+ eyez = -eyez;
+ fogcoord[i] = FloatToFixed((fogEnd - eyez) * fogScale);
}
}
}
for (i=0;i<n;i++) {
GLfloat ndcz = ((GLfloat) z[i] - tz) * szInv;
GLfloat eyez = (ndcz - p14) / p10;
- if (eyez < 0.0) eyez = -eyez;
+ if (eyez < 0.0)
+ eyez = -eyez;
fogcoord[i] = FloatToFixed(exp( -ctx->Fog.Density * eyez ));
}
}
for (i=0;i<n;i++) {
GLfloat ndcz = ((GLfloat) z[i] - tz) * szInv;
GLfloat eyez = p14 / (ndcz + p10);
- if (eyez < 0.0) eyez = -eyez;
+ if (eyez < 0.0)
+ eyez = -eyez;
fogcoord[i] = FloatToFixed(exp( -ctx->Fog.Density * eyez ));
}
}
}
break;
default:
- gl_problem(ctx, "Bad fog mode in _mesa_win_fog_coords_from_z");
+ _mesa_problem(ctx, "Bad fog mode in _mesa_win_fog_coords_from_z");
return;
}
}
_mesa_depth_fog_rgba_pixels( const GLcontext *ctx,
GLuint n, const GLdepth z[], GLchan rgba[][4] )
{
- GLfixed fog[MAX_WIDTH];
+ GLfixed fog[PB_SIZE];
+ ASSERT(n <= PB_SIZE);
_mesa_win_fog_coords_from_z( ctx, n, z, fog );
_mesa_fog_rgba_pixels( ctx, n, fog, rgba );
}
_mesa_depth_fog_ci_pixels( const GLcontext *ctx,
GLuint n, const GLdepth z[], GLuint index[] )
{
- GLfixed fog[MAX_WIDTH];
+ GLfixed fog[PB_SIZE];
+ ASSERT(n <= PB_SIZE);
_mesa_win_fog_coords_from_z( ctx, n, z, fog );
_mesa_fog_ci_pixels( ctx, n, fog, index );
}