fix glDraw/CopyPixels w/ fog bug. minor fog code clean-ups.
authorBrian Paul <brian.paul@tungstengraphics.com>
Mon, 18 Jun 2001 23:55:18 +0000 (23:55 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Mon, 18 Jun 2001 23:55:18 +0000 (23:55 +0000)
src/mesa/swrast/s_bitmap.c
src/mesa/swrast/s_copypix.c
src/mesa/swrast/s_drawpix.c
src/mesa/swrast/s_fog.c
src/mesa/swrast/s_fog.h
src/mesa/swrast/s_span.c

index 0c4592bc8716e3aa37434c5ca7bd419831dd4ab3..17387ba0afad19218bd1efba7149794718d81b44 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: s_bitmap.c,v 1.10 2001/05/30 15:22:05 brianp Exp $ */
+/* $Id: s_bitmap.c,v 1.11 2001/06/18 23:55:18 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -75,10 +75,12 @@ _swrast_Bitmap( GLcontext *ctx, GLint px, GLint py,
    fragZ = (GLdepth) ( ctx->Current.RasterPos[2] * ctx->DepthMaxF);
 
    if (ctx->Fog.Enabled) {
-      if (ctx->Fog.FogCoordinateSource == GL_FOG_COORDINATE_EXT)
+      if (ctx->Fog.FogCoordinateSource == GL_FOG_COORDINATE_EXT) {
          fogCoord = ctx->Current.FogCoord;
-      else
-         fogCoord = ctx->Current.RasterDistance;
+      }
+      else {
+         fogCoord = _mesa_z_to_fogfactor(ctx, ctx->Current.RasterDistance);
+      }
    }
    else {
       fogCoord = 0.0;
index f9d84975a586279db6c6ffcfbb07f9ea1966be4d..3c7ee260d9ebd60e1a7203c262f4d3974e5268e8 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: s_copypix.c,v 1.19 2001/05/30 15:22:05 brianp Exp $ */
+/* $Id: s_copypix.c,v 1.20 2001/06/18 23:55:18 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -37,6 +37,7 @@
 
 #include "s_context.h"
 #include "s_depth.h"
+#include "s_fog.h"
 #include "s_histogram.h"
 #include "s_pixeltex.h"
 #include "s_span.h"
@@ -110,9 +111,16 @@ copy_conv_rgba_pixels(GLcontext *ctx, GLint srcx, GLint srcy,
    if (ctx->Depth.Test || ctx->Fog.Enabled) {
       /* fill in array of z values */
       GLdepth z = (GLdepth) (ctx->Current.RasterPos[2] * ctx->DepthMax);
-      GLfloat fog = (ctx->Fog.FogCoordinateSource == GL_FOG_COORDINATE_EXT) ?
-         ctx->Current.RasterFogCoord : ctx->Current.RasterDistance;
+      GLfloat fog;
       GLint i;
+
+      if (ctx->Fog.FogCoordinateSource == GL_FOG_COORDINATE_EXT) {
+         fog = ctx->Current.RasterFogCoord;
+      }
+      else {
+         fog = _mesa_z_to_fogfactor(ctx, ctx->Current.RasterDistance);
+      }
+
       for (i = 0; i < width; i++) {
          zspan[i] = z;
          fogSpan[i] = fog;
@@ -344,8 +352,15 @@ copy_rgba_pixels(GLcontext *ctx, GLint srcx, GLint srcy,
    if (ctx->Depth.Test || ctx->Fog.Enabled) {
       /* fill in array of z values */
       GLdepth z = (GLdepth) (ctx->Current.RasterPos[2] * ctx->DepthMax);
-      GLfloat fog = (ctx->Fog.FogCoordinateSource == GL_FOG_COORDINATE_EXT) ?
-         ctx->Current.RasterFogCoord : ctx->Current.RasterDistance;
+      GLfloat fog;
+
+      if (ctx->Fog.FogCoordinateSource == GL_FOG_COORDINATE_EXT) {
+         fog = ctx->Current.RasterFogCoord;
+      }
+      else {
+         fog = _mesa_z_to_fogfactor(ctx, ctx->Current.RasterDistance);
+      }
+
       for (i=0;i<width;i++) {
          zspan[i] = z;
          fogSpan[i] = fog;
@@ -603,8 +618,15 @@ static void copy_ci_pixels( GLcontext *ctx,
    if (ctx->Depth.Test || ctx->Fog.Enabled) {
       /* fill in array of z values */
       GLdepth z = (GLdepth) (ctx->Current.RasterPos[2] * ctx->DepthMax);
-      GLfloat fog = (ctx->Fog.FogCoordinateSource == GL_FOG_COORDINATE_EXT) ?
-         ctx->Current.RasterFogCoord : ctx->Current.RasterDistance;
+      GLfloat fog;
+
+      if (ctx->Fog.FogCoordinateSource == GL_FOG_COORDINATE_EXT) {
+         fog = ctx->Current.RasterFogCoord;
+      }
+      else {
+         fog = _mesa_z_to_fogfactor(ctx, ctx->Current.RasterDistance);
+      }
+
       for (i=0;i<width;i++) {
          zspan[i] = z;
          fogSpan[i] = fog;
@@ -745,8 +767,15 @@ static void copy_depth_pixels( GLcontext *ctx, GLint srcx, GLint srcy,
    }
 
    if (ctx->Fog.Enabled) {
-      GLfloat fog = (ctx->Fog.FogCoordinateSource == GL_FOG_COORDINATE_EXT) ?
-         ctx->Current.RasterFogCoord : ctx->Current.RasterDistance;
+      GLfloat fog;
+
+      if (ctx->Fog.FogCoordinateSource == GL_FOG_COORDINATE_EXT) {
+         fog = ctx->Current.RasterFogCoord;
+      }
+      else {
+         fog = _mesa_z_to_fogfactor(ctx, ctx->Current.RasterDistance);
+      }
+
       for (i = 0; i < width; i++) {
          fogSpan[i] = fog;
       }
index 4ab5a7717ac1f3c360aa38aba53d616460bd6593..fb11af5e4416914549c4155d1752b6de02e62a8e 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: s_drawpix.c,v 1.20 2001/05/30 15:22:05 brianp Exp $ */
+/* $Id: s_drawpix.c,v 1.21 2001/06/18 23:55:18 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -37,6 +37,7 @@
 
 #include "s_context.h"
 #include "s_drawpix.h"
+#include "s_fog.h"
 #include "s_pixeltex.h"
 #include "s_span.h"
 #include "s_stencil.h"
@@ -497,9 +498,16 @@ draw_index_pixels( GLcontext *ctx, GLint x, GLint y,
    /* Fragment depth values */
    if (ctx->Depth.Test || ctx->Fog.Enabled) {
       GLdepth zval = (GLdepth) (ctx->Current.RasterPos[2] * ctx->DepthMaxF);
-      GLfloat fog = (ctx->Fog.FogCoordinateSource == GL_FOG_COORDINATE_EXT) ?
-         ctx->Current.RasterFogCoord : ctx->Current.RasterDistance;
+      GLfloat fog;
       GLint i;
+
+      if (ctx->Fog.FogCoordinateSource == GL_FOG_COORDINATE_EXT) {
+         fog = ctx->Current.RasterFogCoord;
+      }
+      else {
+         fog = _mesa_z_to_fogfactor(ctx, ctx->Current.RasterDistance);
+      }
+
       for (i = 0; i < drawWidth; i++) {
         zspan[i] = zval;
          fogSpan[i] = fog;
@@ -736,9 +744,16 @@ draw_rgba_pixels( GLcontext *ctx, GLint x, GLint y,
    if (ctx->Depth.Test || ctx->Fog.Enabled) {
       /* fill in array of z values */
       GLdepth z = (GLdepth) (ctx->Current.RasterPos[2] * ctx->DepthMaxF);
-      GLfloat fog = (ctx->Fog.FogCoordinateSource == GL_FOG_COORDINATE_EXT) ?
-         ctx->Current.RasterFogCoord : ctx->Current.RasterDistance;
+      GLfloat fog;
       GLint i;
+
+      if (ctx->Fog.FogCoordinateSource == GL_FOG_COORDINATE_EXT) {
+         fog = ctx->Current.RasterFogCoord;
+      }
+      else {
+         fog = _mesa_z_to_fogfactor(ctx, ctx->Current.RasterDistance);
+      }
+
       for (i=0;i<width;i++) {
         zspan[i] = z;
          fogSpan[i] = fog;
index 4b8c4f0c71e26893c49228d68857aeb2f21a201c..74431d89b9b478ffa04b66f206542900831a6a46 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: s_fog.c,v 1.12 2001/05/03 22:13:32 brianp Exp $ */
+/* $Id: s_fog.c,v 1.13 2001/06/18 23:55:18 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
 #include "s_pb.h"
 
 
+
+
+/*
+ * Used to convert current raster distance to a fog factor in [0,1].
+ */
+GLfloat
+_mesa_z_to_fogfactor(GLcontext *ctx, GLfloat z)
+{
+   GLfloat d, f;
+
+   switch (ctx->Fog.Mode) {
+   case GL_LINEAR:
+      if (ctx->Fog.Start == ctx->Fog.End)
+         d = 1.0F;
+      else
+         d = 1.0F / (ctx->Fog.End - ctx->Fog.Start);
+      f = (ctx->Fog.End - z) * d;
+      return CLAMP(f, 0.0F, 1.0F);
+   case GL_EXP:
+      d = ctx->Fog.Density;
+      f = exp(-d * z);
+      return f;
+   case GL_EXP2:
+      d = ctx->Fog.Density;
+      f = exp(-(d * d * z * z));
+      return f;
+   default:
+      _mesa_problem(ctx, "Bad fog mode in make_fog_coord");
+      return 0.0; 
+   }
+}
+
+
+
 /*
  * Apply fog to an array of RGBA pixels.
  * Input:  n - number of pixels
- *         fog - array of interpolated screen-space fog coordinates in [0..1]
+ *         fog - array of fog factors in [0,1]
  *         red, green, blue, alpha - pixel colors
  * Output:  red, green, blue, alpha - fogged pixel colors
  */
@@ -70,7 +104,7 @@ _mesa_fog_rgba_pixels( const GLcontext *ctx,
 /*
  * Apply fog to an array of color index pixels.
  * Input:  n - number of pixels
- *         z - array of integer depth values
+ *         fog - array of fog factors in [0,1]
  *         index - pixel color indexes
  * Output:  index - fogged pixel color indexes
  */
@@ -90,7 +124,7 @@ _mesa_fog_ci_pixels( const GLcontext *ctx,
 
 
 /*
- * Calculate fog coords from window z values
+ * Calculate fog factors (in [0,1]) from window z values
  * Input:  n - number of pixels
  *         z - array of integer depth values
  *         red, green, blue, alpha - pixel colors
@@ -98,11 +132,11 @@ _mesa_fog_ci_pixels( const GLcontext *ctx,
  *
  * Use lookup table & interpolation?
  */
-void
-_mesa_win_fog_coords_from_z( const GLcontext *ctx,
-                            GLuint n,
-                            const GLdepth z[],
-                            GLfloat fogcoord[] )
+static void
+compute_fog_factors_from_z( const GLcontext *ctx,
+                            GLuint n,
+                            const GLdepth z[],
+                            GLfloat fogFact[] )
 {
    const GLboolean ortho = (ctx->ProjectionMatrix.m[15] != 0.0F);
    const GLfloat p10 = ctx->ProjectionMatrix.m[10];
@@ -154,7 +188,7 @@ _mesa_win_fog_coords_from_z( const GLcontext *ctx,
                   GLfloat eyez = (ndcz - p14) / p10;
                   if (eyez < 0.0)
                      eyez = -eyez;
-                  fogcoord[i] = (fogEnd - eyez) * fogScale;
+                  fogFact[i] = (fogEnd - eyez) * fogScale;
                }
             }
             else {
@@ -164,7 +198,7 @@ _mesa_win_fog_coords_from_z( const GLcontext *ctx,
                   GLfloat eyez = p14 / (ndcz + p10);
                   if (eyez < 0.0)
                      eyez = -eyez;
-                  fogcoord[i] = (fogEnd - eyez) * fogScale;
+                  fogFact[i] = (fogEnd - eyez) * fogScale;
                }
             }
          }
@@ -176,7 +210,7 @@ _mesa_win_fog_coords_from_z( const GLcontext *ctx,
                GLfloat eyez = (ndcz - p14) / p10;
                if (eyez < 0.0)
                   eyez = -eyez;
-               fogcoord[i] = exp( -ctx->Fog.Density * eyez );
+               fogFact[i] = exp( -ctx->Fog.Density * eyez );
             }
          }
          else {
@@ -186,7 +220,7 @@ _mesa_win_fog_coords_from_z( const GLcontext *ctx,
                GLfloat eyez = p14 / (ndcz + p10);
                if (eyez < 0.0)
                   eyez = -eyez;
-               fogcoord[i] = exp( -ctx->Fog.Density * eyez );
+               fogFact[i] = exp( -ctx->Fog.Density * eyez );
             }
          }
         break;
@@ -203,7 +237,7 @@ _mesa_win_fog_coords_from_z( const GLcontext *ctx,
                   if (tmp < FLT_MIN_10_EXP)
                      tmp = FLT_MIN_10_EXP;
 #endif
-                  fogcoord[i] = exp( tmp );
+                  fogFact[i] = exp( tmp );
                }
             }
             else {
@@ -217,13 +251,13 @@ _mesa_win_fog_coords_from_z( const GLcontext *ctx,
                   if (tmp < FLT_MIN_10_EXP)
                      tmp = FLT_MIN_10_EXP;
 #endif
-                  fogcoord[i] = exp( tmp );
+                  fogFact[i] = exp( tmp );
                }
             }
          }
         break;
       default:
-         _mesa_problem(ctx, "Bad fog mode in _mesa_win_fog_coords_from_z");
+         _mesa_problem(ctx, "Bad fog mode in compute_fog_factors_from_z");
          return;
    }
 }
@@ -240,10 +274,10 @@ void
 _mesa_depth_fog_rgba_pixels( const GLcontext *ctx,
                             GLuint n, const GLdepth z[], GLchan rgba[][4] )
 {
-   GLfloat fog[PB_SIZE];
+   GLfloat fogFact[PB_SIZE];
    ASSERT(n <= PB_SIZE);
-   _mesa_win_fog_coords_from_z( ctx, n, z, fog );
-   _mesa_fog_rgba_pixels( ctx, n, fog, rgba );
+   compute_fog_factors_from_z( ctx, n, z, fogFact );
+   _mesa_fog_rgba_pixels( ctx, n, fogFact, rgba );
 }
 
 
@@ -258,8 +292,8 @@ void
 _mesa_depth_fog_ci_pixels( const GLcontext *ctx,
                      GLuint n, const GLdepth z[], GLuint index[] )
 {
-   GLfloat fog[PB_SIZE];
+   GLfloat fogFact[PB_SIZE];
    ASSERT(n <= PB_SIZE);
-   _mesa_win_fog_coords_from_z( ctx, n, z, fog );
-   _mesa_fog_ci_pixels( ctx, n, fog, index );
+   compute_fog_factors_from_z( ctx, n, z, fogFact );
+   _mesa_fog_ci_pixels( ctx, n, fogFact, index );
 }
index 88f9964cb5b21e6056a7e62d6410737f54bcbbfe..497583d778df2ffa0b42b88d661e60827d4e0ee9 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: s_fog.h,v 1.4 2001/05/03 22:13:32 brianp Exp $ */
+/* $Id: s_fog.h,v 1.5 2001/06/18 23:55:18 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
 #include "swrast.h"
 
 
+extern GLfloat
+_mesa_z_to_fogfactor(GLcontext *ctx, GLfloat z);
+
+
 extern void
 _mesa_fog_rgba_pixels( const GLcontext *ctx,
                        GLuint n, const GLfloat fog[],
index e161ff473fd1509064c2ab7c66126ab17ba3eecc..a3e4e702f083a2fcb66a4b904598a48ee992a320 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: s_span.c,v 1.14 2001/05/15 21:30:27 brianp Exp $ */
+/* $Id: s_span.c,v 1.15 2001/06/18 23:55:18 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -175,6 +175,7 @@ multi_write_index_span( GLcontext *ctx, GLuint n, GLint x, GLint y,
  * Input:  n - number of pixels in the span
  *         x, y - location of leftmost pixel in the span
  *         z - array of [n] z-values
+ *         fog - array of fog factor values in [0,1]
  *         index - array of [n] color indexes
  *         primitive - either GL_POINT, GL_LINE, GL_POLYGON, or GL_BITMAP
  */
@@ -603,6 +604,7 @@ _mesa_write_rgba_span( GLcontext *ctx, GLuint n, GLint x, GLint y,
  * Input:  n - number of pixels in the span
  *         x, y - location of leftmost pixel in the span
  *         z - array of [n] z-values
+ *         fog - array of fog factor values in [0,1]
  *         r, g, b, a - the color of the pixels
  *         primitive - either GL_POINT, GL_LINE, GL_POLYGON or GL_BITMAP.
  */