diff options
author | Keith Whitwell <[email protected]> | 1999-11-25 16:51:24 +0000 |
---|---|---|
committer | Keith Whitwell <[email protected]> | 1999-11-25 16:51:24 +0000 |
commit | 3e63be01d1888149c1c4181d0572f14952f3407c (patch) | |
tree | c9ee3dc05ee2a29592624d7dd1f434bdb686fe31 /src/mesa | |
parent | c73eedbe969da1df4cf7716f6fbc3fffade030b8 (diff) |
allow drivers to request fog coordinates
Diffstat (limited to 'src/mesa')
-rw-r--r-- | src/mesa/main/clip.c | 110 | ||||
-rw-r--r-- | src/mesa/main/context.c | 24 | ||||
-rw-r--r-- | src/mesa/main/fog.c | 141 | ||||
-rw-r--r-- | src/mesa/main/fog.h | 25 | ||||
-rw-r--r-- | src/mesa/main/lines.c | 27 |
5 files changed, 195 insertions, 132 deletions
diff --git a/src/mesa/main/clip.c b/src/mesa/main/clip.c index acecb60b6bf..8a773f8d6bc 100644 --- a/src/mesa/main/clip.c +++ b/src/mesa/main/clip.c @@ -1,8 +1,8 @@ -/* $Id: clip.c,v 1.5 1999/11/11 01:22:25 brianp Exp $ */ +/* $Id: clip.c,v 1.4.2.1 1999/11/25 16:51:24 keithw Exp $ */ /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 3.1 * * Copyright (C) 1999 Brian Paul All Rights Reserved. * @@ -25,10 +25,19 @@ */ + + + #ifdef PC_HEADER #include "all.h" #else -#include "glheader.h" +#ifndef XFree86Server +#include <string.h> +#include <stdlib.h> +#include <stdio.h> +#else +#include "GL/xf86glx.h" +#endif #include "clip.h" #include "context.h" #include "macros.h" @@ -42,6 +51,15 @@ +#define CLIP_RGBA0 0x1 +#define CLIP_RGBA1 0x2 +#define CLIP_TEX0 0x4 +#define CLIP_TEX1 0x8 +#define CLIP_INDEX0 0x10 +#define CLIP_INDEX1 0x20 +#define CLIP_FOG_COORD 0x40 + + /* Linear interpolation between A and B: */ #define LINTERP( T, A, B ) ( (A) + (T) * ( (B) - (A) ) ) @@ -58,16 +76,7 @@ do { \ } while(0) - - -#define CLIP_RGBA0 0x1 -#define CLIP_RGBA1 0x2 -#define CLIP_TEX0 0x4 -#define CLIP_TEX1 0x8 -#define CLIP_INDEX0 0x10 -#define CLIP_INDEX1 0x20 - -static clip_interp_func clip_interp_tab[0x40]; +static clip_interp_func clip_interp_tab[0x80]; #define IND 0 #define NAME clip_nil @@ -113,6 +122,50 @@ static clip_interp_func clip_interp_tab[0x40]; #define NAME clipINDEX0_INDEX1 #include "interp_tmp.h" +#define IND (CLIP_FOG_COORD) +#define NAME clip_FOG +#include "interp_tmp.h" + +#define IND (CLIP_RGBA0|CLIP_FOG_COORD) +#define NAME clipRGBA0_FOG +#include "interp_tmp.h" + +#define IND (CLIP_RGBA0|CLIP_RGBA1|CLIP_FOG_COORD) +#define NAME clipRGBA0_RGBA1_FOG +#include "interp_tmp.h" + +#define IND (CLIP_TEX0|CLIP_RGBA0|CLIP_FOG_COORD) +#define NAME clipTEX0_RGBA0_FOG +#include "interp_tmp.h" + +#define IND (CLIP_TEX0|CLIP_RGBA0|CLIP_RGBA1|CLIP_FOG_COORD) +#define NAME clipTEX0_RGBA0_RGBA1_FOG +#include "interp_tmp.h" + +#define IND (CLIP_TEX1|CLIP_TEX0|CLIP_RGBA0|CLIP_FOG_COORD) +#define NAME clipTEX1_TEX0_RGBA0_FOG +#include "interp_tmp.h" + +#define IND (CLIP_TEX0|CLIP_FOG_COORD) +#define NAME clipTEX0_FOG +#include "interp_tmp.h" + +#define IND (CLIP_TEX1|CLIP_TEX0|CLIP_FOG_COORD) +#define NAME clipTEX1_TEX0_FOG +#include "interp_tmp.h" + +#define IND (CLIP_TEX1|CLIP_TEX0|CLIP_RGBA0|CLIP_RGBA1|CLIP_FOG_COORD) +#define NAME clipTEX1_TEX0_RGBA0_RGBA1_FOG +#include "interp_tmp.h" + +#define IND (CLIP_INDEX0|CLIP_FOG_COORD) +#define NAME clipINDEX0_FOG +#include "interp_tmp.h" + +#define IND (CLIP_INDEX0|CLIP_INDEX1|CLIP_FOG_COORD) +#define NAME clipINDEX0_INDEX1_FOG +#include "interp_tmp.h" + @@ -122,17 +175,9 @@ static clip_interp_func clip_interp_tab[0x40]; -void -_mesa_ClipPlane( GLenum plane, const GLdouble *eq ) +void gl_ClipPlane( GLcontext* ctx, GLenum plane, const GLfloat *equation ) { - GET_CURRENT_CONTEXT(ctx); GLint p; - GLfloat equation[4]; - - equation[0] = eq[0]; - equation[1] = eq[1]; - equation[2] = eq[2]; - equation[3] = eq[3]; ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glClipPlane"); @@ -183,10 +228,8 @@ void gl_update_userclip( GLcontext *ctx ) } } -void -_mesa_GetClipPlane( GLenum plane, GLdouble *equation ) +void gl_GetClipPlane( GLcontext* ctx, GLenum plane, GLdouble *equation ) { - GET_CURRENT_CONTEXT(ctx); GLint p; ASSERT_OUTSIDE_BEGIN_END(ctx, "glGetClipPlane"); @@ -353,6 +396,8 @@ void gl_update_clipmask( GLcontext *ctx ) mask |= CLIP_INDEX1; } + if (ctx->FogMode == FOG_FRAGMENT && (ctx->TriangleCaps & DD_CLIP_FOG_COORD)) + mask |= CLIP_FOG_COORD; ctx->ClipInterpFunc = clip_interp_tab[mask]; ctx->poly_clip_tab = gl_poly_clip_tab[0]; @@ -448,11 +493,22 @@ void gl_init_clip(void) clip_interp_tab[CLIP_TEX1|CLIP_TEX0|CLIP_RGBA0] = clipTEX1_TEX0_RGBA0; clip_interp_tab[CLIP_TEX1|CLIP_TEX0|CLIP_RGBA0|CLIP_RGBA1] = clipTEX1_TEX0_RGBA0_RGBA1; - clip_interp_tab[CLIP_TEX0] = clipTEX0; clip_interp_tab[CLIP_TEX1|CLIP_TEX0] = clipTEX1_TEX0; - clip_interp_tab[CLIP_INDEX0] = clipINDEX0; clip_interp_tab[CLIP_INDEX0|CLIP_INDEX1] = clipINDEX0_INDEX1; + + clip_interp_tab[CLIP_FOG_COORD] = clip_FOG; + clip_interp_tab[CLIP_RGBA0|CLIP_FOG_COORD] = clipRGBA0_FOG; + clip_interp_tab[CLIP_RGBA0|CLIP_RGBA1|CLIP_FOG_COORD] = clipRGBA0_RGBA1_FOG; + clip_interp_tab[CLIP_TEX0|CLIP_RGBA0|CLIP_FOG_COORD] = clipTEX0_RGBA0_FOG; + clip_interp_tab[CLIP_TEX0|CLIP_RGBA0|CLIP_RGBA1|CLIP_FOG_COORD] = clipTEX0_RGBA0_RGBA1_FOG; + clip_interp_tab[CLIP_TEX1|CLIP_TEX0|CLIP_RGBA0|CLIP_FOG_COORD] = clipTEX1_TEX0_RGBA0_FOG; + clip_interp_tab[CLIP_TEX1|CLIP_TEX0|CLIP_RGBA0|CLIP_RGBA1|CLIP_FOG_COORD] = + clipTEX1_TEX0_RGBA0_RGBA1_FOG; + clip_interp_tab[CLIP_TEX0|CLIP_FOG_COORD] = clipTEX0_FOG; + clip_interp_tab[CLIP_TEX1|CLIP_TEX0|CLIP_FOG_COORD] = clipTEX1_TEX0_FOG; + clip_interp_tab[CLIP_INDEX0|CLIP_FOG_COORD] = clipINDEX0_FOG; + clip_interp_tab[CLIP_INDEX0|CLIP_INDEX1|CLIP_FOG_COORD] = clipINDEX0_INDEX1_FOG; } diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c index 13d6bb768d3..d4270823e50 100644 --- a/src/mesa/main/context.c +++ b/src/mesa/main/context.c @@ -1,4 +1,4 @@ -/* $Id: context.c,v 1.18.2.2 1999/11/15 22:21:18 brianp Exp $ */ +/* $Id: context.c,v 1.18.2.3 1999/11/25 16:51:24 keithw Exp $ */ /* * Mesa 3-D graphics library @@ -1977,21 +1977,17 @@ static void update_pixel_masking( GLcontext *ctx ) static void update_fog_mode( GLcontext *ctx ) { int old_mode = ctx->FogMode; + ctx->FogMode = FOG_NONE; if (ctx->Fog.Enabled) { - if (ctx->Texture.Enabled) - ctx->FogMode = FOG_FRAGMENT; - else if (ctx->Hint.Fog == GL_NICEST) - ctx->FogMode = FOG_FRAGMENT; - else - ctx->FogMode = FOG_VERTEX; + ctx->FogMode = FOG_VERTEX; - if (ctx->Driver.GetParameteri) - if ((ctx->Driver.GetParameteri)( ctx, DD_HAVE_HARDWARE_FOG )) - ctx->FogMode = FOG_FRAGMENT; - } - else { - ctx->FogMode = FOG_NONE; + if (ctx->Texture.Enabled || ctx->Hint.Fog == GL_NICEST) + ctx->FogMode = FOG_FRAGMENT; + + if ( ctx->Driver.GetParameteri && + ctx->Driver.GetParameteri( ctx, DD_HAVE_HARDWARE_FOG ) ) + ctx->FogMode = FOG_FRAGMENT; } if (old_mode != ctx->FogMode) @@ -2412,7 +2408,7 @@ void gl_update_state( GLcontext *ctx ) oldnorm = ctx->NeedEyeNormals; ctx->NeedNormals = (ctx->Light.Enabled || ctx->Texture.NeedNormals); - ctx->NeedEyeCoords = ((ctx->Fog.Enabled && ctx->Hint.Fog != GL_NICEST) || + ctx->NeedEyeCoords = (ctx->FogMode == FOG_VERTEX || ctx->Point.Attenuated); ctx->NeedEyeNormals = GL_FALSE; diff --git a/src/mesa/main/fog.c b/src/mesa/main/fog.c index e1a69f3b0d9..87887fdc21e 100644 --- a/src/mesa/main/fog.c +++ b/src/mesa/main/fog.c @@ -1,8 +1,8 @@ -/* $Id: fog.c,v 1.4 1999/11/11 01:22:26 brianp Exp $ */ +/* $Id: fog.c,v 1.3.2.1 1999/11/25 16:51:24 keithw Exp $ */ /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 3.1 * * Copyright (C) 1999 Brian Paul All Rights Reserved. * @@ -25,64 +25,29 @@ */ +/* $XFree86: xc/lib/GL/mesa/src/fog.c,v 1.4 1999/04/04 00:20:24 dawes Exp $ */ + #ifdef PC_HEADER #include "all.h" #else -#include "glheader.h" +#ifndef XFree86Server +#include <math.h> +#include <stdlib.h> +#else +#include "GL/xf86glx.h" +#endif #include "context.h" #include "fog.h" #include "macros.h" #include "mmath.h" #include "types.h" +#include "xform.h" #endif -void -_mesa_Fogf(GLenum pname, GLfloat param) -{ - _mesa_Fogfv(pname, ¶m); -} - - -void -_mesa_Fogi(GLenum pname, GLint param ) -{ - GLfloat fparam = (GLfloat) param; - _mesa_Fogfv(pname, &fparam); -} - - -void -_mesa_Fogiv(GLenum pname, const GLint *params ) -{ - GLfloat p[4]; - switch (pname) { - case GL_FOG_MODE: - case GL_FOG_DENSITY: - case GL_FOG_START: - case GL_FOG_END: - case GL_FOG_INDEX: - p[0] = (GLfloat) *params; - break; - case GL_FOG_COLOR: - p[0] = INT_TO_FLOAT( params[0] ); - p[1] = INT_TO_FLOAT( params[1] ); - p[2] = INT_TO_FLOAT( params[2] ); - p[3] = INT_TO_FLOAT( params[3] ); - break; - default: - /* Error will be caught later in gl_Fogfv */ - ; - } - _mesa_Fogfv(pname, p); -} - - -void -_mesa_Fogfv( GLenum pname, const GLfloat *params ) +void gl_Fogfv( GLcontext *ctx, GLenum pname, const GLfloat *params ) { - GET_CURRENT_CONTEXT(ctx); GLenum m; switch (pname) { @@ -106,23 +71,9 @@ _mesa_Fogfv( GLenum pname, const GLfloat *params ) } break; case GL_FOG_START: -#if 0 - /* Prior to OpenGL 1.1, this was an error */ - if (*params<0.0F) { - gl_error( ctx, GL_INVALID_VALUE, "glFog(GL_FOG_START)" ); - return; - } -#endif ctx->Fog.Start = *params; break; case GL_FOG_END: -#if 0 - /* Prior to OpenGL 1.1, this was an error */ - if (*params<0.0F) { - gl_error( ctx, GL_INVALID_VALUE, "glFog(GL_FOG_END)" ); - return; - } -#endif ctx->Fog.End = *params; break; case GL_FOG_INDEX: @@ -150,9 +101,13 @@ _mesa_Fogfv( GLenum pname, const GLfloat *params ) typedef void (*fog_func)( struct vertex_buffer *VB, GLuint side, GLubyte flag ); +typedef void (*fog_coord_func)( struct vertex_buffer *VB, + const GLvector4f *from, + GLubyte flag ); static fog_func fog_ci_tab[2]; static fog_func fog_rgba_tab[2]; +static fog_coord_func make_fog_coord_tab[2]; /* * Compute the fogged color for an array of vertices. @@ -206,6 +161,70 @@ void gl_fog_vertices( struct vertex_buffer *VB ) } } + +static void check_fog_coords( GLcontext *ctx, struct gl_pipeline_stage *d ) +{ + d->type = 0; + + if (ctx->FogMode==FOG_FRAGMENT) + { + d->type = PIPE_IMMEDIATE|PIPE_PRECALC; + d->inputs = VERT_OBJ_ANY; + d->outputs = VERT_FOG_COORD; + } +} + +void gl_make_fog_coords( struct vertex_buffer *VB ) +{ + GLcontext *ctx = VB->ctx; + + /* If full eye coords weren't required, just calculate the eye Z + * values. + */ + if (!ctx->NeedEyeCoords) { + GLfloat *m = ctx->ModelView.m; + GLfloat plane[4]; + + plane[0] = m[2]; + plane[1] = m[6]; + plane[2] = m[10]; + plane[3] = m[14]; + + gl_dotprod_tab[0][VB->ObjPtr->size](&VB->Eye, + 2, /* fill z coordinates */ + VB->ObjPtr, + plane, + 0 ); + + make_fog_coord_tab[0]( VB, &VB->Eye, 0 ); + } + else + { + make_fog_coord_tab[0]( VB, VB->EyePtr, 0 ); + } +} + + +/* Drivers that want fog coordinates in VB->Spec[0] alpha, can substitute this + * stage for the default PIPE_OP_FOG pipeline stage. + */ +struct gl_pipeline_stage gl_fog_coord_stage = { + "build fog coordinates", + PIPE_OP_FOG, + PIPE_PRECALC|PIPE_IMMEDIATE, + 0, + NEW_FOG, + NEW_LIGHTING|NEW_RASTER_OPS|NEW_FOG|NEW_MODELVIEW, + 0, 0, + 0, 0, 0, + check_fog_coords, + gl_make_fog_coords +}; + + + + + /* * Apply fog to an array of RGBA pixels. * Input: n - number of pixels diff --git a/src/mesa/main/fog.h b/src/mesa/main/fog.h index 0bb4d9d72aa..8290e872b73 100644 --- a/src/mesa/main/fog.h +++ b/src/mesa/main/fog.h @@ -1,8 +1,8 @@ -/* $Id: fog.h,v 1.2 1999/11/11 01:22:26 brianp Exp $ */ +/* $Id: fog.h,v 1.1.1.1.2.1 1999/11/25 16:51:24 keithw Exp $ */ /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 3.1 * * Copyright (C) 1999 Brian Paul All Rights Reserved. * @@ -25,6 +25,7 @@ */ + #ifndef FOG_H #define FOG_H @@ -32,21 +33,7 @@ #include "types.h" -extern void -_mesa_Fogf(GLenum pname, GLfloat param); - - -extern void -_mesa_Fogi(GLenum pname, GLint param ); - - -extern void -_mesa_Fogfv(GLenum pname, const GLfloat *params ); - - -extern void -_mesa_Fogiv(GLenum pname, const GLint *params ); - +extern void gl_Fogfv( GLcontext *ctx, GLenum pname, const GLfloat *params ); extern void gl_fog_vertices( struct vertex_buffer *VB ); @@ -58,7 +45,11 @@ extern void gl_fog_rgba_pixels( const GLcontext *ctx, extern void gl_fog_ci_pixels( const GLcontext *ctx, GLuint n, const GLdepth z[], GLuint indx[] ); +extern void gl_make_fog_coords( struct vertex_buffer *VB ); + +extern struct gl_pipeline_stage gl_fog_coord_stage; extern void gl_init_fog( void ); + #endif diff --git a/src/mesa/main/lines.c b/src/mesa/main/lines.c index 199686f60f3..03dcab55979 100644 --- a/src/mesa/main/lines.c +++ b/src/mesa/main/lines.c @@ -1,8 +1,8 @@ -/* $Id: lines.c,v 1.6 1999/11/11 01:22:27 brianp Exp $ */ +/* $Id: lines.c,v 1.5.2.1 1999/11/25 16:51:24 keithw Exp $ */ /* * Mesa 3-D graphics library - * Version: 3.3 + * Version: 3.1 * * Copyright (C) 1999 Brian Paul All Rights Reserved. * @@ -25,10 +25,17 @@ */ + + + #ifdef PC_HEADER #include "all.h" #else -#include "glheader.h" +#ifndef XFree86Server +#include <assert.h> +#else +#include "GL/xf86glx.h" +#endif #include "context.h" #include "depth.h" #include "feedback.h" @@ -43,10 +50,8 @@ -void -_mesa_LineWidth( GLfloat width ) +void gl_LineWidth( GLcontext *ctx, GLfloat width ) { - GET_CURRENT_CONTEXT(ctx); if (width<=0.0) { gl_error( ctx, GL_INVALID_VALUE, "glLineWidth" ); return; @@ -63,10 +68,8 @@ _mesa_LineWidth( GLfloat width ) -void -_mesa_LineStipple( GLint factor, GLushort pattern ) +void gl_LineStipple( GLcontext *ctx, GLint factor, GLushort pattern ) { - GET_CURRENT_CONTEXT(ctx); ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glLineStipple"); ctx->Line.StippleFactor = CLAMP( factor, 1, 256 ); ctx->Line.StipplePattern = pattern; @@ -1024,8 +1027,7 @@ void gl_set_line_function( GLcontext *ctx ) else { if (ctx->Light.ShadeModel==GL_SMOOTH) { /* Width==1, non-stippled, smooth-shaded */ - if (ctx->Depth.Test - || (ctx->Fog.Enabled && ctx->Hint.Fog==GL_NICEST)) { + if (ctx->Depth.Test || ctx->FogMode == FOG_FRAGMENT) { if (rgbmode) ctx->Driver.LineFunc = smooth_rgba_z_line; else @@ -1040,8 +1042,7 @@ void gl_set_line_function( GLcontext *ctx ) } else { /* Width==1, non-stippled, flat-shaded */ - if (ctx->Depth.Test - || (ctx->Fog.Enabled && ctx->Hint.Fog==GL_NICEST)) { + if (ctx->Depth.Test || ctx->FogMode == FOG_FRAGMENT) { if (rgbmode) ctx->Driver.LineFunc = flat_rgba_z_line; else |