diff options
Diffstat (limited to 'src/VBox/GuestHost/OpenGL/state_tracker/state_fog.c')
-rw-r--r-- | src/VBox/GuestHost/OpenGL/state_tracker/state_fog.c | 199 |
1 files changed, 199 insertions, 0 deletions
diff --git a/src/VBox/GuestHost/OpenGL/state_tracker/state_fog.c b/src/VBox/GuestHost/OpenGL/state_tracker/state_fog.c new file mode 100644 index 00000000..41f1f313 --- /dev/null +++ b/src/VBox/GuestHost/OpenGL/state_tracker/state_fog.c @@ -0,0 +1,199 @@ +/* Copyright (c) 2001, Stanford University + * All rights reserved + * + * See the file LICENSE.txt for information on redistributing this software. + */ + +#include <stdio.h> +#include "state.h" +#include "state/cr_statetypes.h" +#include "state_internals.h" + +void crStateFogInit (CRContext *ctx) +{ + CRFogState *f = &ctx->fog; + CRStateBits *sb = GetCurrentBits(); + CRFogBits *fb = &(sb->fog); + GLcolorf black = {0.0f, 0.0f, 0.0f, 0.0f}; + + f->color = black; + RESET(fb->color, ctx->bitid); + f->density = 1.0f; + RESET(fb->density, ctx->bitid); + f->end = 1.0f; + RESET(fb->end, ctx->bitid); + f->start = 0.0f; + RESET(fb->start, ctx->bitid); + f->mode = GL_EXP; + RESET(fb->mode, ctx->bitid); + f->index = 0; + RESET(fb->index, ctx->bitid); + f->enable = GL_FALSE; + RESET(fb->enable, ctx->bitid); + +#ifdef CR_NV_fog_distance + f->fogDistanceMode = GL_EYE_PLANE_ABSOLUTE_NV; + RESET(fb->fogDistanceMode, ctx->bitid); +#endif +#ifdef CR_EXT_fog_coord + f->fogCoordinateSource = GL_FRAGMENT_DEPTH_EXT; + RESET(fb->fogCoordinateSource, ctx->bitid); +#endif + RESET(fb->dirty, ctx->bitid); +} + +void STATE_APIENTRY crStateFogf(GLenum pname, GLfloat param) +{ + crStateFogfv( pname, ¶m ); +} + +void STATE_APIENTRY crStateFogi(GLenum pname, GLint param) +{ + GLfloat f_param = (GLfloat) param; + crStateFogfv( pname, &f_param ); +} + +void STATE_APIENTRY crStateFogiv(GLenum pname, const GLint *param) +{ + GLcolor f_color; + GLfloat f_param; + switch (pname) + { + case GL_FOG_MODE: + case GL_FOG_DENSITY: + case GL_FOG_START: + case GL_FOG_END: + case GL_FOG_INDEX: + f_param = (GLfloat) (*param); + crStateFogfv( pname, &f_param ); + break; + case GL_FOG_COLOR: + f_color.r = ((GLfloat) param[0]) / ((GLfloat) CR_MAXINT); + f_color.g = ((GLfloat) param[1]) / ((GLfloat) CR_MAXINT); + f_color.b = ((GLfloat) param[2]) / ((GLfloat) CR_MAXINT); + f_color.a = ((GLfloat) param[3]) / ((GLfloat) CR_MAXINT); + crStateFogfv( pname, (GLfloat *) &f_color ); + break; +#ifdef CR_NV_fog_distance + case GL_FOG_DISTANCE_MODE_NV: + f_param = (GLfloat) (*param); + crStateFogfv( pname, &f_param ); + break; +#endif +#ifdef CR_EXT_fog_coord + case GL_FOG_COORDINATE_SOURCE_EXT: + f_param = (GLfloat) (*param); + crStateFogfv( pname, &f_param ); + break; +#endif + default: + crStateError(__LINE__, __FILE__, GL_INVALID_VALUE, "Invalid glFog Param: %d", param); + return; + } +} + +void STATE_APIENTRY crStateFogfv(GLenum pname, const GLfloat *param) +{ + CRContext *g = GetCurrentContext(); + CRFogState *f = &(g->fog); + CRStateBits *sb = GetCurrentBits(); + CRFogBits *fb = &(sb->fog); + + if (g->current.inBeginEnd) + { + crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION, "glFogfv called in Begin/End"); + return; + } + + FLUSH(); + + switch (pname) + { + case GL_FOG_MODE: + { + GLenum e = (GLenum) *param; + if (e != GL_LINEAR && e != GL_EXP && e != GL_EXP2) + { + crStateError(__LINE__, __FILE__, GL_INVALID_ENUM, "Invalid param for glFog: %d", e); + return; + } + f->mode = e; + DIRTY(fb->mode, g->neg_bitid); + } + break; + case GL_FOG_DENSITY: + f->density = *param; + if (f->density < 0.0f) + { + f->density = 0.0f; + } + DIRTY(fb->density, g->neg_bitid); + break; + case GL_FOG_START: + f->start = *param; + DIRTY(fb->start, g->neg_bitid); + break; + case GL_FOG_END: + f->end = *param; + DIRTY(fb->end, g->neg_bitid); + break; + case GL_FOG_INDEX: + f->index = (GLint) *param; + DIRTY(fb->index, g->neg_bitid); + break; + case GL_FOG_COLOR: + f->color.r = param[0]; + f->color.g = param[1]; + f->color.b = param[2]; + f->color.a = param[3]; + DIRTY(fb->color, g->neg_bitid); + break; +#ifdef CR_NV_fog_distance + case GL_FOG_DISTANCE_MODE_NV: + if (g->extensions.NV_fog_distance) + { + if (param[0] != GL_EYE_RADIAL_NV && + param[0] != GL_EYE_PLANE && + param[0] != GL_EYE_PLANE_ABSOLUTE_NV ) + { + crStateError(__LINE__, __FILE__, GL_INVALID_ENUM, + "Fogfv: GL_FOG_DISTANCE_MODE_NV called with illegal parameter: 0x%x", (GLenum) param[0]); + return; + } + f->fogDistanceMode = (GLenum) param[0]; + DIRTY(fb->fogDistanceMode, g->neg_bitid); + } + else + { + crStateError(__LINE__, __FILE__, GL_INVALID_VALUE, "Invalid glFog Param: %d", param); + return; + } + break; +#endif +#ifdef CR_EXT_fog_coord + case GL_FOG_COORDINATE_SOURCE_EXT: + if (g->extensions.EXT_fog_coord) + { + if ((GLenum) param[0] != GL_FOG_COORDINATE_EXT && + (GLenum) param[0] != GL_FRAGMENT_DEPTH_EXT) + { + crStateError(__LINE__, __FILE__, GL_INVALID_ENUM, + "Fogfv: GL_FOG_COORDINATE_SOURCE_EXT called with illegal parameter: 0x%x", (GLenum) param[0]); + return; + } + f->fogCoordinateSource = (GLenum) param[0]; + DIRTY(fb->fogCoordinateSource, g->neg_bitid); + } + else + { + crStateError(__LINE__, __FILE__, GL_INVALID_VALUE, "Invalid glFog Param: 0x%x", (GLint) param[0]); + return; + } + break; +#endif + default: + crStateError(__LINE__, __FILE__, GL_INVALID_VALUE, "Invalid glFog Param: %d", param); + return; + } + DIRTY(fb->dirty, g->neg_bitid); +} |