Fix minor fog / fragment program state bug.
authorBrian Paul <brian.paul@tungstengraphics.com>
Wed, 13 Oct 2004 15:54:48 +0000 (15:54 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Wed, 13 Oct 2004 15:54:48 +0000 (15:54 +0000)
Don't add diffuse and specular colors when using fragment program.

src/mesa/swrast/s_context.c
src/mesa/swrast/s_context.h
src/mesa/swrast/s_fog.c
src/mesa/swrast/s_span.c

index 87d4bf8cdf39f4f7e7af17c1a07575fc87d5004b..e9755e9199799fca8d98a0156b804753b1ddf953 100644 (file)
@@ -196,19 +196,22 @@ _swrast_update_fog_state( GLcontext *ctx )
    CLAMPED_FLOAT_TO_CHAN(swrast->_FogColor[GCOMP], ctx->Fog.Color[GCOMP]);
    CLAMPED_FLOAT_TO_CHAN(swrast->_FogColor[BCOMP], ctx->Fog.Color[BCOMP]);
 
-   /* determine if fog is needed */
+   /* determine if fog is needed, and if so, which fog mode */
    swrast->_FogEnabled = GL_FALSE;
-   if (ctx->Fog.Enabled) {
-      swrast->_FogEnabled = GL_TRUE;
-   }
-   else if (ctx->FragmentProgram._Enabled &&
-        ctx->FragmentProgram.Current->Base.Target == GL_FRAGMENT_PROGRAM_ARB) {
-      const struct fragment_program *p;
-      p = (struct fragment_program *) ctx->FragmentProgram.Current;
-      if (p->FogOption != GL_NONE) {
-         swrast->_FogEnabled = GL_TRUE;
+   if (ctx->FragmentProgram._Enabled) {
+      if (ctx->FragmentProgram.Current->Base.Target==GL_FRAGMENT_PROGRAM_ARB) {
+         const struct fragment_program *p
+            = (struct fragment_program *) ctx->FragmentProgram.Current;
+         if (p->FogOption != GL_NONE) {
+            swrast->_FogEnabled = GL_TRUE;
+            swrast->_FogMode = p->FogOption;
+         }
       }
    }
+   else if (ctx->Fog.Enabled) {
+      swrast->_FogEnabled = GL_TRUE;
+      swrast->_FogMode = ctx->Fog.Mode;
+   }
 }
 
 
@@ -480,7 +483,7 @@ _swrast_validate_derived( GLcontext *ctx )
       if (swrast->NewState & _SWRAST_NEW_TEXTURE_ENV_MODE)
         _swrast_update_texture_env( ctx );
 
-      if (swrast->NewState & _NEW_FOG)
+      if (swrast->NewState & (_NEW_FOG | _NEW_PROGRAM))
          _swrast_update_fog_state( ctx );
 
       if (swrast->NewState & _NEW_PROGRAM)
index ea877a4bd25681817a1da31c6e1b77807c5fbfbc..aba32755d1549d2f99271adfcae9e0da1f16e6d7 100644 (file)
@@ -286,6 +286,7 @@ typedef struct
    GLboolean _AnyTextureCombine;
    GLchan _FogColor[3];
    GLboolean _FogEnabled;
+   GLenum _FogMode;  /* either GL_FOG_MODE or fragment program's fog mode */
 
    /* Accum buffer temporaries.
     */
index 89ed1152b28c3aeebc78b30f59005392db4b1e31..613759d1c1d8c0c124e8237cc42c843b2886fae6 100644 (file)
@@ -1,9 +1,8 @@
-
 /*
  * Mesa 3-D graphics library
- * Version:  4.1
+ * Version:  6.3
  *
- * Copyright (C) 1999-2002  Brian Paul   All Rights Reserved.
+ * Copyright (C) 1999-2004  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"),
@@ -34,8 +33,6 @@
 #include "s_span.h"
 
 
-
-
 /**
  * Used to convert current raster distance to a fog factor in [0,1].
  */
@@ -99,7 +96,7 @@ _swrast_fog_rgba_span( const GLcontext *ctx, struct sw_span *span )
       /* The span's fog values are fog coordinates, now compute blend factors
        * and blend the fragment colors with the fog color.
        */
-      switch (ctx->Fog.Mode) {
+      switch (swrast->_FogMode) {
       case GL_LINEAR:
          {
             const GLfloat fogEnd = ctx->Fog.End;
index c4a86f141c5b770c822aa9f5a645a5447d1a1d72..247c7ee688ca7f1cd38d3461076d8f0f8be48908 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Mesa 3-D graphics library
- * Version:  6.1
+ * Version:  6.3
  *
  * Copyright (C) 1999-2004  Brian Paul   All Rights Reserved.
  *
@@ -1473,15 +1473,17 @@ _swrast_write_texture_span( GLcontext *ctx, struct sw_span *span)
 
    ASSERT(span->arrayMask & SPAN_RGBA);
 
-   /* Add base and specular colors */
-   if (ctx->Fog.ColorSumEnabled ||
-       (ctx->Light.Enabled &&
-        ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR)) {
-      if (span->interpMask & SPAN_SPEC) {
-         interpolate_specular(ctx, span);
+   if (!ctx->FragmentProgram._Enabled) {
+      /* Add base and specular colors */
+      if (ctx->Fog.ColorSumEnabled ||
+          (ctx->Light.Enabled &&
+           ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR)) {
+         if (span->interpMask & SPAN_SPEC) {
+            interpolate_specular(ctx, span);
+         }
+         ASSERT(span->arrayMask & SPAN_SPEC);
+         add_colors( span->end, span->array->rgba, span->array->spec );
       }
-      ASSERT(span->arrayMask & SPAN_SPEC);
-      add_colors( span->end, span->array->rgba, span->array->spec );
    }
 
    /* Fog */