/* Copyright (c) 2001, Stanford University * All rights reserved * * See the file LICENSE.txt for information on redistributing this software. */ #include #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); }