2 * Mesa 3-D graphics library
5 * Copyright (C) 1999-2003 Brian Paul All Rights Reserved.
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 * and/or sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions:
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
35 _mesa_Fogf(GLenum pname
, GLfloat param
)
37 _mesa_Fogfv(pname
, ¶m
);
42 _mesa_Fogi(GLenum pname
, GLint param
)
44 GLfloat fparam
= (GLfloat
) param
;
45 _mesa_Fogfv(pname
, &fparam
);
50 _mesa_Fogiv(GLenum pname
, const GLint
*params
)
59 case GL_FOG_COORDINATE_SOURCE_EXT
:
60 p
[0] = (GLfloat
) *params
;
63 p
[0] = INT_TO_FLOAT( params
[0] );
64 p
[1] = INT_TO_FLOAT( params
[1] );
65 p
[2] = INT_TO_FLOAT( params
[2] );
66 p
[3] = INT_TO_FLOAT( params
[3] );
69 /* Error will be caught later in _mesa_Fogfv */
72 _mesa_Fogfv(pname
, p
);
76 #define UPDATE_FOG_SCALE(ctx) do {\
77 if (ctx->Fog.End == ctx->Fog.Start)\
78 ctx->Fog._Scale = 1.0f;\
80 ctx->Fog._Scale = 1.0f / (ctx->Fog.End - ctx->Fog.Start);\
85 _mesa_Fogfv( GLenum pname
, const GLfloat
*params
)
87 GET_CURRENT_CONTEXT(ctx
);
89 ASSERT_OUTSIDE_BEGIN_END(ctx
);
93 m
= (GLenum
) (GLint
) *params
;
100 _mesa_error( ctx
, GL_INVALID_ENUM
, "glFog" );
103 if (ctx
->Fog
.Mode
== m
)
105 FLUSH_VERTICES(ctx
, _NEW_FOG
);
110 _mesa_error( ctx
, GL_INVALID_VALUE
, "glFog" );
113 if (ctx
->Fog
.Density
== *params
)
115 FLUSH_VERTICES(ctx
, _NEW_FOG
);
116 ctx
->Fog
.Density
= *params
;
119 if (ctx
->Fog
.Start
== *params
)
121 FLUSH_VERTICES(ctx
, _NEW_FOG
);
122 ctx
->Fog
.Start
= *params
;
123 UPDATE_FOG_SCALE(ctx
);
126 if (ctx
->Fog
.End
== *params
)
128 FLUSH_VERTICES(ctx
, _NEW_FOG
);
129 ctx
->Fog
.End
= *params
;
130 UPDATE_FOG_SCALE(ctx
);
133 if (ctx
->Fog
.Index
== *params
)
135 FLUSH_VERTICES(ctx
, _NEW_FOG
);
136 ctx
->Fog
.Index
= *params
;
139 if (TEST_EQ_4V(ctx
->Fog
.Color
, params
))
141 FLUSH_VERTICES(ctx
, _NEW_FOG
);
142 ctx
->Fog
.Color
[0] = CLAMP(params
[0], 0.0F
, 1.0F
);
143 ctx
->Fog
.Color
[1] = CLAMP(params
[1], 0.0F
, 1.0F
);
144 ctx
->Fog
.Color
[2] = CLAMP(params
[2], 0.0F
, 1.0F
);
145 ctx
->Fog
.Color
[3] = CLAMP(params
[3], 0.0F
, 1.0F
);
147 case GL_FOG_COORDINATE_SOURCE_EXT
: {
148 GLenum p
= (GLenum
) (GLint
) *params
;
149 if (!ctx
->Extensions
.EXT_fog_coord
||
150 (p
!= GL_FOG_COORDINATE_EXT
&& p
!= GL_FRAGMENT_DEPTH_EXT
)) {
151 _mesa_error(ctx
, GL_INVALID_ENUM
, "glFog");
154 if (ctx
->Fog
.FogCoordinateSource
== p
)
156 FLUSH_VERTICES(ctx
, _NEW_FOG
);
157 ctx
->Fog
.FogCoordinateSource
= p
;
161 _mesa_error( ctx
, GL_INVALID_ENUM
, "glFog" );
165 if (ctx
->Driver
.Fogfv
) {
166 (*ctx
->Driver
.Fogfv
)( ctx
, pname
, params
);
171 /**********************************************************************/
172 /***** Initialization *****/
173 /**********************************************************************/
175 void _mesa_init_fog( GLcontext
* ctx
)
178 ctx
->Fog
.Enabled
= GL_FALSE
;
179 ctx
->Fog
.Mode
= GL_EXP
;
180 ASSIGN_4V( ctx
->Fog
.Color
, 0.0, 0.0, 0.0, 0.0 );
181 ctx
->Fog
.Index
= 0.0;
182 ctx
->Fog
.Density
= 1.0;
183 ctx
->Fog
.Start
= 0.0;
185 ctx
->Fog
.ColorSumEnabled
= GL_FALSE
;
186 ctx
->Fog
.FogCoordinateSource
= GL_FRAGMENT_DEPTH_EXT
;
187 ctx
->Fog
._Scale
= 1.0f
;