Merge branch 'mesa_7_5_branch'
[mesa.git] / src / mesa / main / fog.c
index 632a8ed32bb04c3c7a5a7b382fdc8a4ef247ddef..50a61bd84bff8bfac1cdfc7306be2a7a3b92062e 100644 (file)
@@ -1,10 +1,8 @@
-/* $Id: fog.c,v 1.36 2002/10/24 23:57:20 brianp Exp $ */
-
 /*
  * Mesa 3-D graphics library
- * Version:  3.5
+ * Version:  5.1
  *
- * Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
+ * Copyright (C) 1999-2003  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"),
 
 
 
-void
+void GLAPIENTRY
 _mesa_Fogf(GLenum pname, GLfloat param)
 {
    _mesa_Fogfv(pname, &param);
 }
 
 
-void
+void GLAPIENTRY
 _mesa_Fogi(GLenum pname, GLint param )
 {
    GLfloat fparam = (GLfloat) param;
@@ -48,7 +46,7 @@ _mesa_Fogi(GLenum pname, GLint param )
 }
 
 
-void
+void GLAPIENTRY
 _mesa_Fogiv(GLenum pname, const GLint *params )
 {
    GLfloat p[4];
@@ -75,7 +73,15 @@ _mesa_Fogiv(GLenum pname, const GLint *params )
 }
 
 
-void
+#define UPDATE_FOG_SCALE(ctx) do {\
+      if (ctx->Fog.End == ctx->Fog.Start)\
+         ctx->Fog._Scale = 1.0f;\
+      else\
+         ctx->Fog._Scale = 1.0f / (ctx->Fog.End - ctx->Fog.Start);\
+   } while(0)
+
+
+void GLAPIENTRY
 _mesa_Fogfv( GLenum pname, const GLfloat *params )
 {
    GET_CURRENT_CONTEXT(ctx);
@@ -110,17 +116,19 @@ _mesa_Fogfv( GLenum pname, const GLfloat *params )
         ctx->Fog.Density = *params;
         break;
       case GL_FOG_START:
-        if (ctx->Fog.Start == *params)
-           return;
-        FLUSH_VERTICES(ctx, _NEW_FOG);
-        ctx->Fog.Start = *params;
-        break;
+         if (ctx->Fog.Start == *params)
+            return;
+         FLUSH_VERTICES(ctx, _NEW_FOG);
+         ctx->Fog.Start = *params;
+         UPDATE_FOG_SCALE(ctx);
+         break;
       case GL_FOG_END:
-        if (ctx->Fog.End == *params)
-           return;
-        FLUSH_VERTICES(ctx, _NEW_FOG);
-        ctx->Fog.End = *params;
-        break;
+         if (ctx->Fog.End == *params)
+            return;
+         FLUSH_VERTICES(ctx, _NEW_FOG);
+         ctx->Fog.End = *params;
+         UPDATE_FOG_SCALE(ctx);
+         break;
       case GL_FOG_INDEX:
         if (ctx->Fog.Index == *params)
            return;
@@ -131,10 +139,10 @@ _mesa_Fogfv( GLenum pname, const GLfloat *params )
         if (TEST_EQ_4V(ctx->Fog.Color, params))
            return;
         FLUSH_VERTICES(ctx, _NEW_FOG);
-        ctx->Fog.Color[0] = params[0];
-        ctx->Fog.Color[1] = params[1];
-        ctx->Fog.Color[2] = params[2];
-        ctx->Fog.Color[3] = params[3];
+        ctx->Fog.Color[0] = CLAMP(params[0], 0.0F, 1.0F);
+        ctx->Fog.Color[1] = CLAMP(params[1], 0.0F, 1.0F);
+        ctx->Fog.Color[2] = CLAMP(params[2], 0.0F, 1.0F);
+        ctx->Fog.Color[3] = CLAMP(params[3], 0.0F, 1.0F);
          break;
       case GL_FOG_COORDINATE_SOURCE_EXT: {
         GLenum p = (GLenum) (GLint) *params;
@@ -158,3 +166,23 @@ _mesa_Fogfv( GLenum pname, const GLfloat *params )
       (*ctx->Driver.Fogfv)( ctx, pname, params );
    }
 }
+
+
+/**********************************************************************/
+/*****                      Initialization                        *****/
+/**********************************************************************/
+
+void _mesa_init_fog( GLcontext * ctx )
+{
+   /* Fog group */
+   ctx->Fog.Enabled = GL_FALSE;
+   ctx->Fog.Mode = GL_EXP;
+   ASSIGN_4V( ctx->Fog.Color, 0.0, 0.0, 0.0, 0.0 );
+   ctx->Fog.Index = 0.0;
+   ctx->Fog.Density = 1.0;
+   ctx->Fog.Start = 0.0;
+   ctx->Fog.End = 1.0;
+   ctx->Fog.ColorSumEnabled = GL_FALSE;
+   ctx->Fog.FogCoordinateSource = GL_FRAGMENT_DEPTH_EXT;
+   ctx->Fog._Scale = 1.0f;
+}