This is texstate.c in view mode; [Download] [Up]
/* $Id: texstate.c,v 1.4 1997/05/28 03:26:49 brianp Exp $ */ /* * Mesa 3-D graphics library * Version: 2.3 * Copyright (C) 1995-1997 Brian Paul * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * $Log: texstate.c,v $ * Revision 1.4 1997/05/28 03:26:49 brianp * added precompiled header (PCH) support * * Revision 1.3 1997/05/03 00:53:28 brianp * misc changes related to new texture object sampling function pointer * * Revision 1.2 1997/04/28 23:34:39 brianp * simplified gl_update_texture_state() * * Revision 1.1 1997/04/14 01:59:54 brianp * Initial revision * */ #ifdef PCH #include "all.h" #else #include "context.h" #include "macros.h" #include "matrix.h" #include "texobj.h" #include "texstate.h" #include "texture.h" #include "types.h" #include "xform.h" #endif /**********************************************************************/ /* Texture Environment */ /**********************************************************************/ void gl_TexEnvfv( GLcontext *ctx, GLenum target, GLenum pname, const GLfloat *param ) { if (INSIDE_BEGIN_END(ctx)) { gl_error( ctx, GL_INVALID_OPERATION, "glTexEnv" ); return; } if (target!=GL_TEXTURE_ENV) { gl_error( ctx, GL_INVALID_ENUM, "glTexEnv(target)" ); return; } if (pname==GL_TEXTURE_ENV_MODE) { GLenum mode = (GLenum) (GLint) *param; switch (mode) { case GL_MODULATE: case GL_BLEND: case GL_DECAL: case GL_REPLACE: ctx->Texture.EnvMode = mode; break; default: gl_error( ctx, GL_INVALID_ENUM, "glTexEnv(param)" ); return; } } else if (pname==GL_TEXTURE_ENV_COLOR) { ctx->Texture.EnvColor[0] = CLAMP( param[0], 0.0, 1.0 ); ctx->Texture.EnvColor[1] = CLAMP( param[1], 0.0, 1.0 ); ctx->Texture.EnvColor[2] = CLAMP( param[2], 0.0, 1.0 ); ctx->Texture.EnvColor[3] = CLAMP( param[3], 0.0, 1.0 ); } else { gl_error( ctx, GL_INVALID_ENUM, "glTexEnv(pname)" ); return; } /* Tell device driver about the new texture environment */ if (ctx->Driver.TexEnv) { (*ctx->Driver.TexEnv)( ctx, pname, param ); } } void gl_GetTexEnvfv( GLcontext *ctx, GLenum target, GLenum pname, GLfloat *params ) { if (target!=GL_TEXTURE_ENV) { gl_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(target)" ); return; } switch (pname) { case GL_TEXTURE_ENV_MODE: *params = (GLfloat) ctx->Texture.EnvMode; break; case GL_TEXTURE_ENV_COLOR: COPY_4V( params, ctx->Texture.EnvColor ); break; default: gl_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)" ); } } void gl_GetTexEnviv( GLcontext *ctx, GLenum target, GLenum pname, GLint *params ) { if (target!=GL_TEXTURE_ENV) { gl_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(target)" ); return; } switch (pname) { case GL_TEXTURE_ENV_MODE: *params = (GLint) ctx->Texture.EnvMode; break; case GL_TEXTURE_ENV_COLOR: params[0] = FLOAT_TO_INT( ctx->Texture.EnvColor[0] ); params[1] = FLOAT_TO_INT( ctx->Texture.EnvColor[1] ); params[2] = FLOAT_TO_INT( ctx->Texture.EnvColor[2] ); params[3] = FLOAT_TO_INT( ctx->Texture.EnvColor[3] ); break; default: gl_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)" ); } } /**********************************************************************/ /* Texture Parameters */ /**********************************************************************/ void gl_TexParameterfv( GLcontext *ctx, GLenum target, GLenum pname, const GLfloat *params ) { GLenum eparam = (GLenum) (GLint) params[0]; struct gl_texture_object *texObj; switch (target) { case GL_TEXTURE_1D: texObj = ctx->Texture.Current1D; break; case GL_TEXTURE_2D: texObj = ctx->Texture.Current2D; break; case GL_TEXTURE_3D_EXT: texObj = ctx->Texture.Current3D; break; default: gl_error( ctx, GL_INVALID_ENUM, "glTexParameter(target)" ); return; } switch (pname) { case GL_TEXTURE_MIN_FILTER: if (eparam==GL_NEAREST || eparam==GL_LINEAR || eparam==GL_NEAREST_MIPMAP_NEAREST || eparam==GL_LINEAR_MIPMAP_NEAREST || eparam==GL_NEAREST_MIPMAP_LINEAR || eparam==GL_LINEAR_MIPMAP_LINEAR) { texObj->MinFilter = eparam; ctx->NewState |= NEW_TEXTURING; } else { gl_error( ctx, GL_INVALID_VALUE, "glTexParameter(param)" ); return; } break; case GL_TEXTURE_MAG_FILTER: if (eparam==GL_NEAREST || eparam==GL_LINEAR) { texObj->MagFilter = eparam; ctx->NewState |= NEW_TEXTURING; } else { gl_error( ctx, GL_INVALID_VALUE, "glTexParameter(param)" ); return; } break; case GL_TEXTURE_WRAP_S: if (eparam==GL_CLAMP || eparam==GL_REPEAT) { texObj->WrapS = eparam; } else { gl_error( ctx, GL_INVALID_VALUE, "glTexParameter(param)" ); return; } break; case GL_TEXTURE_WRAP_T: if (eparam==GL_CLAMP || eparam==GL_REPEAT) { texObj->WrapT = eparam; } else { gl_error( ctx, GL_INVALID_VALUE, "glTexParameter(param)" ); return; } break; case GL_TEXTURE_WRAP_R_EXT: if (eparam==GL_CLAMP || eparam==GL_REPEAT) { texObj->WrapR = eparam; } else { gl_error( ctx, GL_INVALID_VALUE, "glTexParameter(param)" ); } break; case GL_TEXTURE_BORDER_COLOR: texObj->BorderColor[0] = CLAMP((GLint)(params[0]*255.0), 0, 255); texObj->BorderColor[1] = CLAMP((GLint)(params[1]*255.0), 0, 255); texObj->BorderColor[2] = CLAMP((GLint)(params[2]*255.0), 0, 255); texObj->BorderColor[3] = CLAMP((GLint)(params[3]*255.0), 0, 255); break; default: gl_error( ctx, GL_INVALID_ENUM, "glTexParameter(pname)" ); return; } texObj->Dirty = GL_TRUE; /* Pass this glTexParameter*() call to the device driver. */ if (ctx->Driver.TexParameter) { GLuint ddTexObject = texObj->Name; (*ctx->Driver.TexParameter)( ctx, target, ddTexObject, pname, params ); } } void gl_GetTexLevelParameterfv( GLcontext *ctx, GLenum target, GLint level, GLenum pname, GLfloat *params ) { struct gl_texture_image *tex; if (level<0 || level>=MAX_TEXTURE_LEVELS) { gl_error( ctx, GL_INVALID_VALUE, "glGetTexLevelParameterfv" ); return; } switch (target) { case GL_TEXTURE_1D: tex = ctx->Texture.Current1D->Image[level]; switch (pname) { case GL_TEXTURE_WIDTH: *params = (GLfloat) tex->Width; break; case GL_TEXTURE_COMPONENTS: *params = (GLfloat) tex->Format; break; case GL_TEXTURE_BORDER: *params = (GLfloat) tex->Border; break; case GL_TEXTURE_RED_SIZE: case GL_TEXTURE_GREEN_SIZE: case GL_TEXTURE_BLUE_SIZE: case GL_TEXTURE_ALPHA_SIZE: case GL_TEXTURE_INTENSITY_SIZE: case GL_TEXTURE_LUMINANCE_SIZE: *params = 8.0; /* 8-bits */ break; default: gl_error( ctx, GL_INVALID_ENUM, "glGetTexLevelParameterfv(pname)" ); } break; case GL_TEXTURE_2D: tex = ctx->Texture.Current2D->Image[level]; switch (pname) { case GL_TEXTURE_WIDTH: *params = (GLfloat) tex->Width; break; case GL_TEXTURE_HEIGHT: *params = (GLfloat) tex->Height; break; case GL_TEXTURE_COMPONENTS: *params = (GLfloat) tex->Format; break; case GL_TEXTURE_BORDER: *params = (GLfloat) tex->Border; break; case GL_TEXTURE_RED_SIZE: case GL_TEXTURE_GREEN_SIZE: case GL_TEXTURE_BLUE_SIZE: case GL_TEXTURE_ALPHA_SIZE: case GL_TEXTURE_INTENSITY_SIZE: case GL_TEXTURE_LUMINANCE_SIZE: *params = 8.0; /* 8-bits */ break; default: gl_error( ctx, GL_INVALID_ENUM, "glGetTexLevelParameterfv(pname)" ); } break; case GL_TEXTURE_3D_EXT: tex = ctx->Texture.Current3D->Image[level]; switch (pname) { case GL_TEXTURE_WIDTH: *params = (GLfloat) tex->Width; break; case GL_TEXTURE_HEIGHT: *params = (GLfloat) tex->Height; break; case GL_TEXTURE_DEPTH_EXT: *params = (GLfloat) tex->Depth; break; case GL_TEXTURE_COMPONENTS: *params = (GLfloat) tex->Format; break; case GL_TEXTURE_BORDER: *params = (GLfloat) tex->Border; break; default: gl_error( ctx, GL_INVALID_ENUM, "glGetTexLevelParameterfv(pname)" ); } break; case GL_PROXY_TEXTURE_1D: tex = ctx->Texture.Proxy1D->Image[level]; switch (pname) { case GL_TEXTURE_WIDTH: *params = (GLfloat) tex->Width; break; case GL_TEXTURE_COMPONENTS: *params = (GLfloat) tex->Format; break; case GL_TEXTURE_BORDER: *params = (GLfloat) tex->Border; break; case GL_TEXTURE_RED_SIZE: case GL_TEXTURE_GREEN_SIZE: case GL_TEXTURE_BLUE_SIZE: case GL_TEXTURE_ALPHA_SIZE: case GL_TEXTURE_INTENSITY_SIZE: case GL_TEXTURE_LUMINANCE_SIZE: *params = 8.0; /* 8-bits */ break; default: gl_error( ctx, GL_INVALID_ENUM, "glGetTexLevelParameterfv(pname)" ); } break; case GL_PROXY_TEXTURE_2D: tex = ctx->Texture.Proxy2D->Image[level]; switch (pname) { case GL_TEXTURE_WIDTH: *params = (GLfloat) tex->Width; break; case GL_TEXTURE_HEIGHT: *params = (GLfloat) tex->Height; break; case GL_TEXTURE_COMPONENTS: *params = (GLfloat) tex->Format; break; case GL_TEXTURE_BORDER: *params = (GLfloat) tex->Border; break; case GL_TEXTURE_RED_SIZE: case GL_TEXTURE_GREEN_SIZE: case GL_TEXTURE_BLUE_SIZE: case GL_TEXTURE_ALPHA_SIZE: case GL_TEXTURE_INTENSITY_SIZE: case GL_TEXTURE_LUMINANCE_SIZE: *params = 8.0; /* 8-bits */ break; default: gl_error( ctx, GL_INVALID_ENUM, "glGetTexLevelParameterfv(pname)" ); } break; case GL_PROXY_TEXTURE_3D_EXT: tex = ctx->Texture.Proxy3D->Image[level]; switch (pname) { case GL_TEXTURE_WIDTH: *params = (GLfloat) tex->Width; break; case GL_TEXTURE_HEIGHT: *params = (GLfloat) tex->Height; break; case GL_TEXTURE_DEPTH_EXT: *params = (GLfloat) tex->Depth; break; case GL_TEXTURE_COMPONENTS: *params = (GLfloat) tex->Format; break; case GL_TEXTURE_BORDER: *params = (GLfloat) tex->Border; break; case GL_TEXTURE_RED_SIZE: case GL_TEXTURE_GREEN_SIZE: case GL_TEXTURE_BLUE_SIZE: case GL_TEXTURE_ALPHA_SIZE: case GL_TEXTURE_INTENSITY_SIZE: case GL_TEXTURE_LUMINANCE_SIZE: *params = 8.0; /* 8-bits */ break; default: gl_error( ctx, GL_INVALID_ENUM, "glGetTexLevelParameterfv(pname)" ); } break; default: gl_error( ctx, GL_INVALID_ENUM, "glGetTexLevelParameterfv(target)" ); } } void gl_GetTexLevelParameteriv( GLcontext *ctx, GLenum target, GLint level, GLenum pname, GLint *params ) { struct gl_texture_image *tex; if (level<0 || level>=MAX_TEXTURE_LEVELS) { gl_error( ctx, GL_INVALID_VALUE, "glGetTexLevelParameteriv" ); return; } switch (target) { case GL_TEXTURE_1D: tex = ctx->Texture.Current1D->Image[level]; switch (pname) { case GL_TEXTURE_WIDTH: *params = tex->Width; break; case GL_TEXTURE_COMPONENTS: *params = tex->Format; break; case GL_TEXTURE_BORDER: *params = tex->Border; break; case GL_TEXTURE_RED_SIZE: case GL_TEXTURE_GREEN_SIZE: case GL_TEXTURE_BLUE_SIZE: case GL_TEXTURE_ALPHA_SIZE: case GL_TEXTURE_INTENSITY_SIZE: case GL_TEXTURE_LUMINANCE_SIZE: *params = 8; /* 8-bits */ break; default: gl_error( ctx, GL_INVALID_ENUM, "glGetTexLevelParameteriv(pname)" ); } break; case GL_TEXTURE_2D: tex = ctx->Texture.Current2D->Image[level]; switch (pname) { case GL_TEXTURE_WIDTH: *params = tex->Width; break; case GL_TEXTURE_HEIGHT: *params = tex->Height; break; case GL_TEXTURE_COMPONENTS: *params = tex->Format; break; case GL_TEXTURE_BORDER: *params = tex->Border; break; case GL_TEXTURE_RED_SIZE: case GL_TEXTURE_GREEN_SIZE: case GL_TEXTURE_BLUE_SIZE: case GL_TEXTURE_ALPHA_SIZE: case GL_TEXTURE_INTENSITY_SIZE: case GL_TEXTURE_LUMINANCE_SIZE: *params = 8; /* 8-bits */ break; default: gl_error( ctx, GL_INVALID_ENUM, "glGetTexLevelParameteriv(pname)" ); } break; case GL_TEXTURE_3D_EXT: tex = ctx->Texture.Current3D->Image[level]; switch (pname) { case GL_TEXTURE_WIDTH: *params = tex->Width; break; case GL_TEXTURE_HEIGHT: *params = tex->Height; break; case GL_TEXTURE_DEPTH_EXT: *params = tex->Depth; break; case GL_TEXTURE_COMPONENTS: *params = tex->Format; break; case GL_TEXTURE_BORDER: *params = tex->Border; break; default: gl_error( ctx, GL_INVALID_ENUM, "glGetTexLevelParameteriv(pname)" ); } break; case GL_PROXY_TEXTURE_1D: tex = ctx->Texture.Proxy1D->Image[level]; switch (pname) { case GL_TEXTURE_WIDTH: *params = tex->Width; break; case GL_TEXTURE_COMPONENTS: *params = tex->Format; break; case GL_TEXTURE_BORDER: *params = tex->Border; break; case GL_TEXTURE_RED_SIZE: case GL_TEXTURE_GREEN_SIZE: case GL_TEXTURE_BLUE_SIZE: case GL_TEXTURE_ALPHA_SIZE: case GL_TEXTURE_INTENSITY_SIZE: case GL_TEXTURE_LUMINANCE_SIZE: *params = 8; /* 8-bits */ break; default: gl_error( ctx, GL_INVALID_ENUM, "glGetTexLevelParameteriv(pname)" ); } break; case GL_PROXY_TEXTURE_2D: tex = ctx->Texture.Proxy2D->Image[level]; switch (pname) { case GL_TEXTURE_WIDTH: *params = tex->Width; break; case GL_TEXTURE_HEIGHT: *params = tex->Height; break; case GL_TEXTURE_COMPONENTS: *params = tex->Format; break; case GL_TEXTURE_BORDER: *params = tex->Border; break; case GL_TEXTURE_RED_SIZE: case GL_TEXTURE_GREEN_SIZE: case GL_TEXTURE_BLUE_SIZE: case GL_TEXTURE_ALPHA_SIZE: case GL_TEXTURE_INTENSITY_SIZE: case GL_TEXTURE_LUMINANCE_SIZE: *params = 8; /* 8-bits */ break; default: gl_error( ctx, GL_INVALID_ENUM, "glGetTexLevelParameteriv(pname)" ); } break; case GL_PROXY_TEXTURE_3D_EXT: tex = ctx->Texture.Proxy3D->Image[level]; switch (pname) { case GL_TEXTURE_WIDTH: *params = tex->Width; break; case GL_TEXTURE_HEIGHT: *params = tex->Height; break; case GL_TEXTURE_DEPTH_EXT: *params = tex->Depth; break; case GL_TEXTURE_COMPONENTS: *params = tex->Format; break; case GL_TEXTURE_BORDER: *params = tex->Border; break; case GL_TEXTURE_RED_SIZE: case GL_TEXTURE_GREEN_SIZE: case GL_TEXTURE_BLUE_SIZE: case GL_TEXTURE_ALPHA_SIZE: case GL_TEXTURE_INTENSITY_SIZE: case GL_TEXTURE_LUMINANCE_SIZE: *params = 8; /* 8-bits */ break; default: gl_error( ctx, GL_INVALID_ENUM, "glGetTexLevelParameteriv(pname)" ); } break; default: gl_error( ctx, GL_INVALID_ENUM, "glGetTexLevelParameteriv(target)" ); } } void gl_GetTexParameterfv( GLcontext *ctx, GLenum target, GLenum pname, GLfloat *params ) { switch (target) { case GL_TEXTURE_1D: switch (pname) { case GL_TEXTURE_MAG_FILTER: *params = (GLfloat) ctx->Texture.Current1D->MagFilter; break; case GL_TEXTURE_MIN_FILTER: *params = (GLfloat) ctx->Texture.Current1D->MinFilter; break; case GL_TEXTURE_WRAP_S: *params = (GLfloat) ctx->Texture.Current1D->WrapS; break; case GL_TEXTURE_WRAP_T: *params = (GLfloat) ctx->Texture.Current1D->WrapT; break; case GL_TEXTURE_BORDER_COLOR: params[0] = ctx->Texture.Current1D->BorderColor[0] / 255.0f; params[1] = ctx->Texture.Current1D->BorderColor[1] / 255.0f; params[2] = ctx->Texture.Current1D->BorderColor[2] / 255.0f; params[3] = ctx->Texture.Current1D->BorderColor[3] / 255.0f; break; case GL_TEXTURE_RESIDENT: *params = (GLfloat) GL_TRUE; break; case GL_TEXTURE_PRIORITY: *params = ctx->Texture.Current1D->Priority; break; default: gl_error( ctx, GL_INVALID_ENUM, "glGetTexParameterfv(pname)" ); } break; case GL_TEXTURE_2D: switch (pname) { case GL_TEXTURE_MAG_FILTER: *params = (GLfloat) ctx->Texture.Current2D->MagFilter; break; case GL_TEXTURE_MIN_FILTER: *params = (GLfloat) ctx->Texture.Current2D->MinFilter; break; case GL_TEXTURE_WRAP_S: *params = (GLfloat) ctx->Texture.Current2D->WrapS; break; case GL_TEXTURE_WRAP_T: *params = (GLfloat) ctx->Texture.Current2D->WrapT; break; case GL_TEXTURE_BORDER_COLOR: params[0] = ctx->Texture.Current2D->BorderColor[0] / 255.0f; params[1] = ctx->Texture.Current2D->BorderColor[1] / 255.0f; params[2] = ctx->Texture.Current2D->BorderColor[2] / 255.0f; params[3] = ctx->Texture.Current2D->BorderColor[3] / 255.0f; break; case GL_TEXTURE_RESIDENT: *params = (GLfloat) GL_TRUE; break; case GL_TEXTURE_PRIORITY: *params = ctx->Texture.Current2D->Priority; break; default: gl_error( ctx, GL_INVALID_ENUM, "glGetTexParameterfv(pname)" ); } break; case GL_TEXTURE_3D_EXT: switch (pname) { case GL_TEXTURE_MAG_FILTER: *params = (GLfloat) ctx->Texture.Current3D->MagFilter; break; case GL_TEXTURE_MIN_FILTER: *params = (GLfloat) ctx->Texture.Current3D->MinFilter; break; case GL_TEXTURE_WRAP_S: *params = (GLfloat) ctx->Texture.Current3D->WrapS; break; case GL_TEXTURE_WRAP_T: *params = (GLfloat) ctx->Texture.Current3D->WrapT; break; case GL_TEXTURE_WRAP_R_EXT: *params = (GLfloat) ctx->Texture.Current3D->WrapR; break; case GL_TEXTURE_BORDER_COLOR: params[0] = ctx->Texture.Current3D->BorderColor[0] / 255.0f; params[1] = ctx->Texture.Current3D->BorderColor[1] / 255.0f; params[2] = ctx->Texture.Current3D->BorderColor[2] / 255.0f; params[3] = ctx->Texture.Current3D->BorderColor[3] / 255.0f; break; case GL_TEXTURE_RESIDENT: *params = (GLfloat) GL_TRUE; break; case GL_TEXTURE_PRIORITY: *params = ctx->Texture.Current3D->Priority; break; default: gl_error( ctx, GL_INVALID_ENUM, "glGetTexParameterfv(pname)" ); } break; default: gl_error( ctx, GL_INVALID_ENUM, "glGetTexParameterfv(target)" ); } } void gl_GetTexParameteriv( GLcontext *ctx, GLenum target, GLenum pname, GLint *params ) { switch (target) { case GL_TEXTURE_1D: switch (pname) { case GL_TEXTURE_MAG_FILTER: *params = (GLint) ctx->Texture.Current1D->MagFilter; break; case GL_TEXTURE_MIN_FILTER: *params = (GLint) ctx->Texture.Current1D->MinFilter; break; case GL_TEXTURE_WRAP_S: *params = (GLint) ctx->Texture.Current1D->WrapS; break; case GL_TEXTURE_WRAP_T: *params = (GLint) ctx->Texture.Current1D->WrapT; break; case GL_TEXTURE_BORDER_COLOR: { GLfloat color[4]; color[0] = ctx->Texture.Current1D->BorderColor[0]/255.0; color[1] = ctx->Texture.Current1D->BorderColor[1]/255.0; color[2] = ctx->Texture.Current1D->BorderColor[2]/255.0; color[3] = ctx->Texture.Current1D->BorderColor[3]/255.0; params[0] = FLOAT_TO_INT( color[0] ); params[1] = FLOAT_TO_INT( color[1] ); params[2] = FLOAT_TO_INT( color[2] ); params[3] = FLOAT_TO_INT( color[3] ); } break; case GL_TEXTURE_RESIDENT: *params = (GLint) GL_TRUE; break; case GL_TEXTURE_PRIORITY: *params = (GLint) ctx->Texture.Current1D->Priority; break; default: gl_error( ctx, GL_INVALID_ENUM, "glGetTexParameteriv(pname)" ); } break; case GL_TEXTURE_2D: switch (pname) { case GL_TEXTURE_MAG_FILTER: *params = (GLint) ctx->Texture.Current2D->MagFilter; break; case GL_TEXTURE_MIN_FILTER: *params = (GLint) ctx->Texture.Current2D->MinFilter; break; case GL_TEXTURE_WRAP_S: *params = (GLint) ctx->Texture.Current2D->WrapS; break; case GL_TEXTURE_WRAP_T: *params = (GLint) ctx->Texture.Current2D->WrapT; break; case GL_TEXTURE_BORDER_COLOR: { GLfloat color[4]; color[0] = ctx->Texture.Current2D->BorderColor[0]/255.0; color[1] = ctx->Texture.Current2D->BorderColor[1]/255.0; color[2] = ctx->Texture.Current2D->BorderColor[2]/255.0; color[3] = ctx->Texture.Current2D->BorderColor[3]/255.0; params[0] = FLOAT_TO_INT( color[0] ); params[1] = FLOAT_TO_INT( color[1] ); params[2] = FLOAT_TO_INT( color[2] ); params[3] = FLOAT_TO_INT( color[3] ); } break; case GL_TEXTURE_RESIDENT: *params = (GLint) GL_TRUE; break; case GL_TEXTURE_PRIORITY: *params = (GLint) ctx->Texture.Current2D->Priority; break; default: gl_error( ctx, GL_INVALID_ENUM, "glGetTexParameteriv(pname)" ); } break; case GL_TEXTURE_3D_EXT: switch (pname) { case GL_TEXTURE_MAG_FILTER: *params = (GLint) ctx->Texture.Current3D->MagFilter; break; case GL_TEXTURE_MIN_FILTER: *params = (GLint) ctx->Texture.Current3D->MinFilter; break; case GL_TEXTURE_WRAP_S: *params = (GLint) ctx->Texture.Current3D->WrapS; break; case GL_TEXTURE_WRAP_T: *params = (GLint) ctx->Texture.Current3D->WrapT; break; case GL_TEXTURE_WRAP_R_EXT: *params = (GLint) ctx->Texture.Current3D->WrapR; break; case GL_TEXTURE_BORDER_COLOR: { GLfloat color[4]; color[0] = ctx->Texture.Current3D->BorderColor[0]/255.0; color[1] = ctx->Texture.Current3D->BorderColor[1]/255.0; color[2] = ctx->Texture.Current3D->BorderColor[2]/255.0; color[3] = ctx->Texture.Current3D->BorderColor[3]/255.0; params[0] = FLOAT_TO_INT( color[0] ); params[1] = FLOAT_TO_INT( color[1] ); params[2] = FLOAT_TO_INT( color[2] ); params[3] = FLOAT_TO_INT( color[3] ); } break; case GL_TEXTURE_RESIDENT: *params = (GLint) GL_TRUE; break; case GL_TEXTURE_PRIORITY: *params = (GLint) ctx->Texture.Current3D->Priority; break; default: gl_error( ctx, GL_INVALID_ENUM, "glGetTexParameteriv(pname)" ); } break; default: gl_error( ctx, GL_INVALID_ENUM, "glGetTexParameteriv(target)" ); } } /**********************************************************************/ /* Texture Coord Generation */ /**********************************************************************/ void gl_TexGenfv( GLcontext *ctx, GLenum coord, GLenum pname, const GLfloat *params ) { if (INSIDE_BEGIN_END(ctx)) { gl_error( ctx, GL_INVALID_OPERATION, "glTexGenfv" ); return; } switch( coord ) { case GL_S: if (pname==GL_TEXTURE_GEN_MODE) { GLenum mode = (GLenum) (GLint) *params; if (mode==GL_OBJECT_LINEAR || mode==GL_EYE_LINEAR || mode==GL_SPHERE_MAP) { ctx->Texture.GenModeS = mode; } else { gl_error( ctx, GL_INVALID_ENUM, "glTexGenfv(param)" ); return; } } else if (pname==GL_OBJECT_PLANE) { ctx->Texture.ObjectPlaneS[0] = params[0]; ctx->Texture.ObjectPlaneS[1] = params[1]; ctx->Texture.ObjectPlaneS[2] = params[2]; ctx->Texture.ObjectPlaneS[3] = params[3]; } else if (pname==GL_EYE_PLANE) { /* Transform plane equation by the inverse modelview matrix */ if (ctx->NewModelViewMatrix) { gl_analyze_modelview_matrix(ctx); } gl_transform_vector( ctx->Texture.EyePlaneS, params, ctx->ModelViewInv ); } else { gl_error( ctx, GL_INVALID_ENUM, "glTexGenfv(pname)" ); return; } break; case GL_T: if (pname==GL_TEXTURE_GEN_MODE) { GLenum mode = (GLenum) (GLint) *params; if (mode==GL_OBJECT_LINEAR || mode==GL_EYE_LINEAR || mode==GL_SPHERE_MAP) { ctx->Texture.GenModeT = mode; } else { gl_error( ctx, GL_INVALID_ENUM, "glTexGenfv(param)" ); return; } } else if (pname==GL_OBJECT_PLANE) { ctx->Texture.ObjectPlaneT[0] = params[0]; ctx->Texture.ObjectPlaneT[1] = params[1]; ctx->Texture.ObjectPlaneT[2] = params[2]; ctx->Texture.ObjectPlaneT[3] = params[3]; } else if (pname==GL_EYE_PLANE) { /* Transform plane equation by the inverse modelview matrix */ if (ctx->NewModelViewMatrix) { gl_analyze_modelview_matrix(ctx); } gl_transform_vector( ctx->Texture.EyePlaneT, params, ctx->ModelViewInv ); } else { gl_error( ctx, GL_INVALID_ENUM, "glTexGenfv(pname)" ); return; } break; case GL_R: if (pname==GL_TEXTURE_GEN_MODE) { GLenum mode = (GLenum) (GLint) *params; if (mode==GL_OBJECT_LINEAR || mode==GL_EYE_LINEAR) { ctx->Texture.GenModeR = mode; } else { gl_error( ctx, GL_INVALID_ENUM, "glTexGenfv(param)" ); return; } } else if (pname==GL_OBJECT_PLANE) { ctx->Texture.ObjectPlaneR[0] = params[0]; ctx->Texture.ObjectPlaneR[1] = params[1]; ctx->Texture.ObjectPlaneR[2] = params[2]; ctx->Texture.ObjectPlaneR[3] = params[3]; } else if (pname==GL_EYE_PLANE) { /* Transform plane equation by the inverse modelview matrix */ if (ctx->NewModelViewMatrix) { gl_analyze_modelview_matrix(ctx); } gl_transform_vector( ctx->Texture.EyePlaneR, params, ctx->ModelViewInv ); } else { gl_error( ctx, GL_INVALID_ENUM, "glTexGenfv(pname)" ); return; } break; case GL_Q: if (pname==GL_TEXTURE_GEN_MODE) { GLenum mode = (GLenum) (GLint) *params; if (mode==GL_OBJECT_LINEAR || mode==GL_EYE_LINEAR) { ctx->Texture.GenModeQ = mode; } else { gl_error( ctx, GL_INVALID_ENUM, "glTexGenfv(param)" ); return; } } else if (pname==GL_OBJECT_PLANE) { ctx->Texture.ObjectPlaneQ[0] = params[0]; ctx->Texture.ObjectPlaneQ[1] = params[1]; ctx->Texture.ObjectPlaneQ[2] = params[2]; ctx->Texture.ObjectPlaneQ[3] = params[3]; } else if (pname==GL_EYE_PLANE) { /* Transform plane equation by the inverse modelview matrix */ if (ctx->NewModelViewMatrix) { gl_analyze_modelview_matrix(ctx); } gl_transform_vector( ctx->Texture.EyePlaneQ, params, ctx->ModelViewInv ); } else { gl_error( ctx, GL_INVALID_ENUM, "glTexGenfv(pname)" ); return; } break; default: gl_error( ctx, GL_INVALID_ENUM, "glTexGenfv(coord)" ); return; } ctx->NewState |= NEW_TEXTURING; } void gl_GetTexGendv( GLcontext *ctx, GLenum coord, GLenum pname, GLdouble *params ) { if (INSIDE_BEGIN_END(ctx)) { gl_error( ctx, GL_INVALID_OPERATION, "glGetTexGendv" ); return; } switch( coord ) { case GL_S: if (pname==GL_TEXTURE_GEN_MODE) { params[0] = ctx->Texture.GenModeS; } else if (pname==GL_OBJECT_PLANE) { COPY_4V( params, ctx->Texture.ObjectPlaneS ); } else if (pname==GL_EYE_PLANE) { COPY_4V( params, ctx->Texture.EyePlaneS ); } else { gl_error( ctx, GL_INVALID_ENUM, "glGetTexGendv(pname)" ); return; } break; case GL_T: if (pname==GL_TEXTURE_GEN_MODE) { params[0] = ctx->Texture.GenModeT; } else if (pname==GL_OBJECT_PLANE) { COPY_4V( params, ctx->Texture.ObjectPlaneT ); } else if (pname==GL_EYE_PLANE) { COPY_4V( params, ctx->Texture.EyePlaneT ); } else { gl_error( ctx, GL_INVALID_ENUM, "glGetTexGendv(pname)" ); return; } break; case GL_R: if (pname==GL_TEXTURE_GEN_MODE) { params[0] = ctx->Texture.GenModeR; } else if (pname==GL_OBJECT_PLANE) { COPY_4V( params, ctx->Texture.ObjectPlaneR ); } else if (pname==GL_EYE_PLANE) { COPY_4V( params, ctx->Texture.EyePlaneR ); } else { gl_error( ctx, GL_INVALID_ENUM, "glGetTexGendv(pname)" ); return; } break; case GL_Q: if (pname==GL_TEXTURE_GEN_MODE) { params[0] = ctx->Texture.GenModeQ; } else if (pname==GL_OBJECT_PLANE) { COPY_4V( params, ctx->Texture.ObjectPlaneQ ); } else if (pname==GL_EYE_PLANE) { COPY_4V( params, ctx->Texture.EyePlaneQ ); } else { gl_error( ctx, GL_INVALID_ENUM, "glGetTexGendv(pname)" ); return; } break; default: gl_error( ctx, GL_INVALID_ENUM, "glGetTexGendv(coord)" ); return; } } void gl_GetTexGenfv( GLcontext *ctx, GLenum coord, GLenum pname, GLfloat *params ) { if (INSIDE_BEGIN_END(ctx)) { gl_error( ctx, GL_INVALID_OPERATION, "glGetTexGenfv" ); return; } switch( coord ) { case GL_S: if (pname==GL_TEXTURE_GEN_MODE) { params[0] = ctx->Texture.GenModeS; } else if (pname==GL_OBJECT_PLANE) { COPY_4V( params, ctx->Texture.ObjectPlaneS ); } else if (pname==GL_EYE_PLANE) { COPY_4V( params, ctx->Texture.EyePlaneS ); } else { gl_error( ctx, GL_INVALID_ENUM, "glGetTexGenfv(pname)" ); return; } break; case GL_T: if (pname==GL_TEXTURE_GEN_MODE) { params[0] = ctx->Texture.GenModeT; } else if (pname==GL_OBJECT_PLANE) { COPY_4V( params, ctx->Texture.ObjectPlaneT ); } else if (pname==GL_EYE_PLANE) { COPY_4V( params, ctx->Texture.EyePlaneT ); } else { gl_error( ctx, GL_INVALID_ENUM, "glGetTexGenfv(pname)" ); return; } break; case GL_R: if (pname==GL_TEXTURE_GEN_MODE) { params[0] = ctx->Texture.GenModeR; } else if (pname==GL_OBJECT_PLANE) { COPY_4V( params, ctx->Texture.ObjectPlaneR ); } else if (pname==GL_EYE_PLANE) { COPY_4V( params, ctx->Texture.EyePlaneR ); } else { gl_error( ctx, GL_INVALID_ENUM, "glGetTexGenfv(pname)" ); return; } break; case GL_Q: if (pname==GL_TEXTURE_GEN_MODE) { params[0] = ctx->Texture.GenModeQ; } else if (pname==GL_OBJECT_PLANE) { COPY_4V( params, ctx->Texture.ObjectPlaneQ ); } else if (pname==GL_EYE_PLANE) { COPY_4V( params, ctx->Texture.EyePlaneQ ); } else { gl_error( ctx, GL_INVALID_ENUM, "glGetTexGenfv(pname)" ); return; } break; default: gl_error( ctx, GL_INVALID_ENUM, "glGetTexGenfv(coord)" ); return; } } void gl_GetTexGeniv( GLcontext *ctx, GLenum coord, GLenum pname, GLint *params ) { if (INSIDE_BEGIN_END(ctx)) { gl_error( ctx, GL_INVALID_OPERATION, "glGetTexGeniv" ); return; } switch( coord ) { case GL_S: if (pname==GL_TEXTURE_GEN_MODE) { params[0] = ctx->Texture.GenModeS; } else if (pname==GL_OBJECT_PLANE) { COPY_4V( params, ctx->Texture.ObjectPlaneS ); } else if (pname==GL_EYE_PLANE) { COPY_4V( params, ctx->Texture.EyePlaneS ); } else { gl_error( ctx, GL_INVALID_ENUM, "glGetTexGeniv(pname)" ); return; } break; case GL_T: if (pname==GL_TEXTURE_GEN_MODE) { params[0] = ctx->Texture.GenModeT; } else if (pname==GL_OBJECT_PLANE) { COPY_4V( params, ctx->Texture.ObjectPlaneT ); } else if (pname==GL_EYE_PLANE) { COPY_4V( params, ctx->Texture.EyePlaneT ); } else { gl_error( ctx, GL_INVALID_ENUM, "glGetTexGeniv(pname)" ); return; } break; case GL_R: if (pname==GL_TEXTURE_GEN_MODE) { params[0] = ctx->Texture.GenModeR; } else if (pname==GL_OBJECT_PLANE) { COPY_4V( params, ctx->Texture.ObjectPlaneR ); } else if (pname==GL_EYE_PLANE) { COPY_4V( params, ctx->Texture.EyePlaneR ); } else { gl_error( ctx, GL_INVALID_ENUM, "glGetTexGeniv(pname)" ); return; } break; case GL_Q: if (pname==GL_TEXTURE_GEN_MODE) { params[0] = ctx->Texture.GenModeQ; } else if (pname==GL_OBJECT_PLANE) { COPY_4V( params, ctx->Texture.ObjectPlaneQ ); } else if (pname==GL_EYE_PLANE) { COPY_4V( params, ctx->Texture.EyePlaneQ ); } else { gl_error( ctx, GL_INVALID_ENUM, "glGetTexGeniv(pname)" ); return; } break; default: gl_error( ctx, GL_INVALID_ENUM, "glGetTexGeniv(coord)" ); return; } } /* * This is called by gl_update_state() if the NEW_TEXTURING bit in * ctx->NewState is set. */ void gl_update_texture_state( GLcontext *ctx ) { struct gl_texture_object *t; if (ctx->Texture.Enabled & TEXTURE_3D) ctx->Texture.Current = ctx->Texture.Current3D; else if (ctx->Texture.Enabled & TEXTURE_2D) ctx->Texture.Current = ctx->Texture.Current2D; else if (ctx->Texture.Enabled & TEXTURE_1D) ctx->Texture.Current = ctx->Texture.Current1D; else ctx->Texture.Current = NULL; for (t = ctx->Shared->TexObjectList; t; t = t->Next) { if (t->Dirty) { gl_test_texture_object_completeness(t); gl_set_texture_sampler(t); t->Dirty = GL_FALSE; } } }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.