⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 texstate.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 5 页
字号:
	       if (!ctx->Extensions.ARB_texture_env_dot3) {                  TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", mode);		  return;	       }	       break;	    case GL_MODULATE_ADD_ATI:	    case GL_MODULATE_SIGNED_ADD_ATI:	    case GL_MODULATE_SUBTRACT_ATI:	       if (!ctx->Extensions.ATI_texture_env_combine3) {                  TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", mode);		  return;	       }	       break;	    default:               TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", mode);	       return;	    }	    FLUSH_VERTICES(ctx, _NEW_TEXTURE);	    texUnit->Combine.ModeRGB = mode;	 }	 else {            TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);	    return;	 }         break;      case GL_COMBINE_ALPHA:	 if (ctx->Extensions.EXT_texture_env_combine ||             ctx->Extensions.ARB_texture_env_combine) {	    const GLenum mode = (GLenum) (GLint) *param;	    if (texUnit->Combine.ModeA == mode)	       return;            switch (mode) {	    case GL_REPLACE:	    case GL_MODULATE:	    case GL_ADD:	    case GL_ADD_SIGNED:	    case GL_INTERPOLATE:	       /* OK */	       break;	    case GL_SUBTRACT:	       if (!ctx->Extensions.ARB_texture_env_combine) {		  TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", mode);		  return;	       }	       break;	    case GL_MODULATE_ADD_ATI:	    case GL_MODULATE_SIGNED_ADD_ATI:	    case GL_MODULATE_SUBTRACT_ATI:	       if (!ctx->Extensions.ATI_texture_env_combine3) {                  TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", mode);		  return;	       }	       break;	    default:	       TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", mode);	       return;	    }	    FLUSH_VERTICES(ctx, _NEW_TEXTURE);	    texUnit->Combine.ModeA = mode;	 }	 else {            TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);	    return;	 }	 break;      case GL_SOURCE0_RGB:      case GL_SOURCE1_RGB:      case GL_SOURCE2_RGB:	 if (ctx->Extensions.EXT_texture_env_combine ||	     ctx->Extensions.ARB_texture_env_combine) {	    const GLenum source = (GLenum) (GLint) *param;	    const GLuint s = pname - GL_SOURCE0_RGB;	    if (texUnit->Combine.SourceRGB[s] == source)	       return;            if (source == GL_TEXTURE ||                source == GL_CONSTANT ||                source == GL_PRIMARY_COLOR ||                source == GL_PREVIOUS ||                (ctx->Extensions.ARB_texture_env_crossbar &&                 source >= GL_TEXTURE0 &&                 source < GL_TEXTURE0 + ctx->Const.MaxTextureUnits) ||                (ctx->Extensions.ATI_texture_env_combine3 &&                 (source == GL_ZERO || source == GL_ONE))) {               /* legal */	       FLUSH_VERTICES(ctx, _NEW_TEXTURE);	       texUnit->Combine.SourceRGB[s] = source;            }            else {               TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", source);	       return;	    }	 }	 else {            TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);	    return;	 }	 break;      case GL_SOURCE0_ALPHA:      case GL_SOURCE1_ALPHA:      case GL_SOURCE2_ALPHA:	 if (ctx->Extensions.EXT_texture_env_combine ||             ctx->Extensions.ARB_texture_env_combine) {	    const GLenum source = (GLenum) (GLint) *param;	    const GLuint s = pname - GL_SOURCE0_ALPHA;	    if (texUnit->Combine.SourceA[s] == source)	       return;            if (source == GL_TEXTURE ||                source == GL_CONSTANT ||                source == GL_PRIMARY_COLOR ||                source == GL_PREVIOUS ||                (ctx->Extensions.ARB_texture_env_crossbar &&                 source >= GL_TEXTURE0 &&                 source < GL_TEXTURE0 + ctx->Const.MaxTextureUnits) ||		(ctx->Extensions.ATI_texture_env_combine3 &&                 (source == GL_ZERO || source == GL_ONE))) {               /* legal */	       FLUSH_VERTICES(ctx, _NEW_TEXTURE);	       texUnit->Combine.SourceA[s] = source;            }            else {               TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", source);	       return;	    }	 }	 else {            TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);	    return;	 }	 break;      case GL_OPERAND0_RGB:      case GL_OPERAND1_RGB:	 if (ctx->Extensions.EXT_texture_env_combine ||	     ctx->Extensions.ARB_texture_env_combine) {	    const GLenum operand = (GLenum) (GLint) *param;	    const GLuint s = pname - GL_OPERAND0_RGB;	    if (texUnit->Combine.OperandRGB[s] == operand)	       return;	    switch (operand) {	    case GL_SRC_COLOR:	    case GL_ONE_MINUS_SRC_COLOR:	    case GL_SRC_ALPHA:	    case GL_ONE_MINUS_SRC_ALPHA:	       FLUSH_VERTICES(ctx, _NEW_TEXTURE);	       texUnit->Combine.OperandRGB[s] = operand;	       break;	    default:               TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", operand);	       return;	    }	 }	 else {            TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);	    return;	 }	 break;      case GL_OPERAND0_ALPHA:      case GL_OPERAND1_ALPHA:	 if (ctx->Extensions.EXT_texture_env_combine ||             ctx->Extensions.ARB_texture_env_combine) {	    const GLenum operand = (GLenum) (GLint) *param;	    if (texUnit->Combine.OperandA[pname-GL_OPERAND0_ALPHA] == operand)	       return;	    switch (operand) {	    case GL_SRC_ALPHA:	    case GL_ONE_MINUS_SRC_ALPHA:	       FLUSH_VERTICES(ctx, _NEW_TEXTURE);	       texUnit->Combine.OperandA[pname-GL_OPERAND0_ALPHA] = operand;	       break;	    default:               TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", operand);	       return;	    }	 }	 else {            TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);	    return;	 }	 break;      case GL_OPERAND2_RGB:	 if (ctx->Extensions.ARB_texture_env_combine) {	    const GLenum operand = (GLenum) (GLint) *param;	    if (texUnit->Combine.OperandRGB[2] == operand)	       return;	    switch (operand) {	    case GL_SRC_COLOR:           /* ARB combine only */	    case GL_ONE_MINUS_SRC_COLOR: /* ARB combine only */	    case GL_SRC_ALPHA:	    case GL_ONE_MINUS_SRC_ALPHA: /* ARB combine only */	       FLUSH_VERTICES(ctx, _NEW_TEXTURE);	       texUnit->Combine.OperandRGB[2] = operand;               break;	    default:               TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", operand);	       return;	    }	 }	 else if (ctx->Extensions.EXT_texture_env_combine) {	    const GLenum operand = (GLenum) (GLint) *param;	    if (texUnit->Combine.OperandRGB[2] == operand)	       return;	    /* operand must be GL_SRC_ALPHA which is the initial value - thus	       don't need to actually compare the operand to the possible value */	    else {               TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", operand);	       return;	    }	 }	 else {            TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);	    return;	 }	 break;      case GL_OPERAND2_ALPHA:	 if (ctx->Extensions.ARB_texture_env_combine) {	    const GLenum operand = (GLenum) (GLint) *param;	    if (texUnit->Combine.OperandA[2] == operand)	       return;	    switch (operand) {	    case GL_SRC_ALPHA:	    case GL_ONE_MINUS_SRC_ALPHA: /* ARB combine only */	       FLUSH_VERTICES(ctx, _NEW_TEXTURE);	       texUnit->Combine.OperandA[2] = operand;	       break;	    default:               TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", operand);	       return;	    }	 }	 else if (ctx->Extensions.EXT_texture_env_combine) {	    const GLenum operand = (GLenum) (GLint) *param;	    if (texUnit->Combine.OperandA[2] == operand)	       return;	    /* operand must be GL_SRC_ALPHA which is the initial value - thus	       don't need to actually compare the operand to the possible value */	    else {               TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", operand);	       return;	    }	 }	 else {            TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);	    return;	 }	 break;      case GL_RGB_SCALE:	 if (ctx->Extensions.EXT_texture_env_combine ||             ctx->Extensions.ARB_texture_env_combine) {	    GLuint newshift;	    if (*param == 1.0) {	       newshift = 0;	    }	    else if (*param == 2.0) {	       newshift = 1;	    }	    else if (*param == 4.0) {	       newshift = 2;	    }	    else {	       _mesa_error( ctx, GL_INVALID_VALUE,                            "glTexEnv(GL_RGB_SCALE not 1, 2 or 4)" );	       return;	    }	    if (texUnit->Combine.ScaleShiftRGB == newshift)	       return;	    FLUSH_VERTICES(ctx, _NEW_TEXTURE);	    texUnit->Combine.ScaleShiftRGB = newshift;	 }	 else {            TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);	    return;	 }	 break;      case GL_ALPHA_SCALE:	 if (ctx->Extensions.EXT_texture_env_combine ||             ctx->Extensions.ARB_texture_env_combine) {	    GLuint newshift;	    if (*param == 1.0) {	       newshift = 0;	    }	    else if (*param == 2.0) {	       newshift = 1;	    }	    else if (*param == 4.0) {	       newshift = 2;	    }	    else {	       _mesa_error( ctx, GL_INVALID_VALUE,                            "glTexEnv(GL_ALPHA_SCALE not 1, 2 or 4)" );	       return;	    }	    if (texUnit->Combine.ScaleShiftA == newshift)	       return;	    FLUSH_VERTICES(ctx, _NEW_TEXTURE);	    texUnit->Combine.ScaleShiftA = newshift;	 }	 else {            TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);	    return;	 }	 break;      default:	 _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(pname)" );	 return;      }   }   else if (target == GL_TEXTURE_FILTER_CONTROL_EXT) {      /* GL_EXT_texture_lod_bias */      if (!ctx->Extensions.EXT_texture_lod_bias) {	 _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(target=0x%x)", target );	 return;      }      if (pname == GL_TEXTURE_LOD_BIAS_EXT) {	 if (texUnit->LodBias == param[0])	    return;	 FLUSH_VERTICES(ctx, _NEW_TEXTURE);         texUnit->LodBias = param[0];      }      else {         TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);	 return;      }   }   else if (target == GL_POINT_SPRITE_NV) {      /* GL_ARB_point_sprite / GL_NV_point_sprite */      if (!ctx->Extensions.NV_point_sprite	  && !ctx->Extensions.ARB_point_sprite) {	 _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(target=0x%x)", target );	 return;      }      if (pname == GL_COORD_REPLACE_NV) {         const GLenum value = (GLenum) param[0];         if (value == GL_TRUE || value == GL_FALSE) {            /* It's kind of weird to set point state via glTexEnv,             * but that's what the spec calls for.             */            const GLboolean state = (GLboolean) value;            if (ctx->Point.CoordReplace[ctx->Texture.CurrentUnit] == state)               return;            FLUSH_VERTICES(ctx, _NEW_POINT);            ctx->Point.CoordReplace[ctx->Texture.CurrentUnit] = state;         }         else {            _mesa_error( ctx, GL_INVALID_VALUE, "glTexEnv(param=0x%x)", value);            return;         }      }      else {         _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(pname=0x%x)", pname );         return;      }   }   else {      _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(target=0x%x)",target );      return;   }   if (MESA_VERBOSE&(VERBOSE_API|VERBOSE_TEXTURE))      _mesa_debug(ctx, "glTexEnv %s %s %.1f(%s) ...\n",                  _mesa_lookup_enum_by_nr(target),                  _mesa_lookup_enum_by_nr(pname),                  *param,                  _mesa_lookup_enum_by_nr((GLenum) (GLint) *param));   /* Tell device driver about the new texture environment */   if (ctx->Driver.TexEnv) {      (*ctx->Driver.TexEnv)( ctx, target, pname, param );   }}void GLAPIENTRY_mesa_TexEnvf( GLenum target, GLenum pname, GLfloat param ){   _mesa_TexEnvfv( target, pname, &param );}void GLAPIENTRY_mesa_TexEnvi( GLenum target, GLenum pname, GLint param ){   GLfloat p[4];   p[0] = (GLfloat) param;   p[1] = p[2] = p[3] = 0.0;   _mesa_TexEnvfv( target, pname, p );

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -