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

📄 tdfx_texstate.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 5 页
字号:
      }      else {         /* Av = Af * At */         alphaComb.Function = GR_COMBINE_FUNCTION_SCALE_OTHER;         alphaComb.Factor = GR_COMBINE_FACTOR_LOCAL;         alphaComb.Local = locala;         alphaComb.Other = GR_COMBINE_OTHER_TEXTURE;         alphaComb.Invert = FXFALSE;      }      if (baseFormat == GL_ALPHA) {         colorComb.Function = GR_COMBINE_FUNCTION_LOCAL;         colorComb.Factor = GR_COMBINE_FACTOR_NONE;         colorComb.Local = localc;         colorComb.Other = GR_COMBINE_OTHER_NONE;         colorComb.Invert = FXFALSE;      }      else {         colorComb.Function = GR_COMBINE_FUNCTION_BLEND;         colorComb.Factor = GR_COMBINE_FACTOR_TEXTURE_RGB;         colorComb.Local = localc;         colorComb.Other = GR_COMBINE_OTHER_CONSTANT;         colorComb.Invert = FXTRUE;      }      fxMesa->Color.MonoColor = PACK_RGBA32(         ctx->Texture.Unit[unit].EnvColor[0] * 255.0f,         ctx->Texture.Unit[unit].EnvColor[1] * 255.0f,         ctx->Texture.Unit[unit].EnvColor[2] * 255.0f,         ctx->Texture.Unit[unit].EnvColor[3] * 255.0f);      fxMesa->dirty |= TDFX_UPLOAD_CONSTANT_COLOR;      break;   case GL_REPLACE:      if ((baseFormat == GL_RGB) || (baseFormat == GL_LUMINANCE)) {         alphaComb.Function = GR_COMBINE_FUNCTION_LOCAL;         alphaComb.Factor = GR_COMBINE_FACTOR_NONE;         alphaComb.Local = locala;         alphaComb.Other = GR_COMBINE_OTHER_NONE;         alphaComb.Invert = FXFALSE;      }      else {         alphaComb.Function = GR_COMBINE_FUNCTION_SCALE_OTHER;         alphaComb.Factor = GR_COMBINE_FACTOR_ONE;         alphaComb.Local = locala;         alphaComb.Other = GR_COMBINE_OTHER_TEXTURE;         alphaComb.Invert = FXFALSE;      }      if (baseFormat == GL_ALPHA) {         colorComb.Function = GR_COMBINE_FUNCTION_LOCAL;         colorComb.Factor = GR_COMBINE_FACTOR_NONE;         colorComb.Local = localc;         colorComb.Other = GR_COMBINE_OTHER_NONE;         colorComb.Invert = FXFALSE;      }      else {         colorComb.Function = GR_COMBINE_FUNCTION_SCALE_OTHER;         colorComb.Factor = GR_COMBINE_FACTOR_ONE;         colorComb.Local = localc;         colorComb.Other = GR_COMBINE_OTHER_TEXTURE;         colorComb.Invert = FXFALSE;      }      break;   case GL_ADD:      if (baseFormat == GL_ALPHA ||          baseFormat == GL_LUMINANCE_ALPHA ||          baseFormat == GL_RGBA) {         /* product of texel and fragment alpha */         alphaComb.Function = GR_COMBINE_FUNCTION_SCALE_OTHER;         alphaComb.Factor = GR_COMBINE_FACTOR_LOCAL;         alphaComb.Local = locala;         alphaComb.Other = GR_COMBINE_OTHER_TEXTURE;         alphaComb.Invert = FXFALSE;      }      else if (baseFormat == GL_LUMINANCE || baseFormat == GL_RGB) {         /* fragment alpha is unchanged */         alphaComb.Function = GR_COMBINE_FUNCTION_LOCAL;         alphaComb.Factor = GR_COMBINE_FACTOR_NONE;         alphaComb.Local = locala;         alphaComb.Other = GR_COMBINE_OTHER_NONE;         alphaComb.Invert = FXFALSE;      }      else {         ASSERT(baseFormat == GL_INTENSITY);         /* sum of texel and fragment alpha */         alphaComb.Function = GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,         alphaComb.Factor = GR_COMBINE_FACTOR_ONE;         alphaComb.Local = locala;         alphaComb.Other = GR_COMBINE_OTHER_TEXTURE;         alphaComb.Invert = FXFALSE;      }      if (baseFormat == GL_ALPHA) {         /* rgb unchanged */         colorComb.Function = GR_COMBINE_FUNCTION_LOCAL;         colorComb.Factor = GR_COMBINE_FACTOR_NONE;         colorComb.Local = localc;         colorComb.Other = GR_COMBINE_OTHER_NONE;         colorComb.Invert = FXFALSE;      }      else {         /* sum of texel and fragment rgb */         colorComb.Function = GR_COMBINE_FUNCTION_SCALE_OTHER_ADD_LOCAL,         colorComb.Factor = GR_COMBINE_FACTOR_ONE;         colorComb.Local = localc;         colorComb.Other = GR_COMBINE_OTHER_TEXTURE;         colorComb.Invert = FXFALSE;      }      break;   default: {      (void) memcpy(&colorComb, &fxMesa->ColorCombine, sizeof(colorComb));      (void) memcpy(&alphaComb, &fxMesa->AlphaCombine, sizeof(alphaComb));      _mesa_problem(ctx, "bad texture env mode in %s", __FUNCTION__);   }   }   if (colorComb.Function != fxMesa->ColorCombine.Function ||       colorComb.Factor != fxMesa->ColorCombine.Factor ||       colorComb.Local != fxMesa->ColorCombine.Local ||       colorComb.Other != fxMesa->ColorCombine.Other ||       colorComb.Invert != fxMesa->ColorCombine.Invert) {      fxMesa->ColorCombine = colorComb;      fxMesa->dirty |= TDFX_UPLOAD_COLOR_COMBINE;   }   if (alphaComb.Function != fxMesa->AlphaCombine.Function ||       alphaComb.Factor != fxMesa->AlphaCombine.Factor ||       alphaComb.Local != fxMesa->AlphaCombine.Local ||       alphaComb.Other != fxMesa->AlphaCombine.Other ||       alphaComb.Invert != fxMesa->AlphaCombine.Invert) {      fxMesa->AlphaCombine = alphaComb;      fxMesa->dirty |= TDFX_UPLOAD_ALPHA_COMBINE;   }   return GL_TRUE;}/* * Setup the Voodoo3 texture environment for dual texture units. * Return GL_TRUE for success, GL_FALSE for failure. * If failure, we'll use software rendering. */static GLbooleanSetupDoubleTexEnvVoodoo3(GLcontext *ctx, int tmu0,                         GLenum envMode0, GLenum baseFormat0,                         GLenum envMode1, GLenum baseFormat1){   tdfxContextPtr fxMesa = TDFX_CONTEXT(ctx);   const GrCombineLocal_t locala = GR_COMBINE_LOCAL_ITERATED;   const GrCombineLocal_t localc = GR_COMBINE_LOCAL_ITERATED;   const int tmu1 = 1 - tmu0;   if (envMode0 == GL_MODULATE && envMode1 == GL_MODULATE) {      GLboolean isalpha[TDFX_NUM_TMU];      isalpha[tmu0] = (baseFormat0 == GL_ALPHA);      isalpha[tmu1] = (baseFormat1 == GL_ALPHA);      if (isalpha[TDFX_TMU1]) {         fxMesa->TexCombine[1].FunctionRGB = GR_COMBINE_FUNCTION_ZERO;         fxMesa->TexCombine[1].FactorRGB = GR_COMBINE_FACTOR_NONE;         fxMesa->TexCombine[1].FunctionAlpha = GR_COMBINE_FUNCTION_LOCAL;         fxMesa->TexCombine[1].FactorAlpha = GR_COMBINE_FACTOR_NONE;         fxMesa->TexCombine[1].InvertRGB = FXTRUE;         fxMesa->TexCombine[1].InvertAlpha = FXFALSE;      }      else {         fxMesa->TexCombine[1].FunctionRGB = GR_COMBINE_FUNCTION_LOCAL;         fxMesa->TexCombine[1].FactorRGB = GR_COMBINE_FACTOR_NONE;         fxMesa->TexCombine[1].FunctionAlpha = GR_COMBINE_FUNCTION_LOCAL;         fxMesa->TexCombine[1].FactorAlpha = GR_COMBINE_FACTOR_NONE;         fxMesa->TexCombine[1].InvertRGB = FXFALSE;         fxMesa->TexCombine[1].InvertAlpha = FXFALSE;      }      if (isalpha[TDFX_TMU0]) {         fxMesa->TexCombine[0].FunctionRGB = GR_COMBINE_FUNCTION_BLEND_OTHER;         fxMesa->TexCombine[0].FactorRGB = GR_COMBINE_FACTOR_ONE;         fxMesa->TexCombine[0].FunctionAlpha = GR_COMBINE_FUNCTION_BLEND_OTHER;         fxMesa->TexCombine[0].FactorAlpha = GR_COMBINE_FACTOR_LOCAL;         fxMesa->TexCombine[0].InvertRGB = FXFALSE;         fxMesa->TexCombine[0].InvertAlpha = FXFALSE;      }      else {         fxMesa->TexCombine[0].FunctionRGB = GR_COMBINE_FUNCTION_BLEND_OTHER;         fxMesa->TexCombine[0].FactorRGB = GR_COMBINE_FACTOR_LOCAL;         fxMesa->TexCombine[0].FunctionAlpha = GR_COMBINE_FUNCTION_BLEND_OTHER;         fxMesa->TexCombine[0].FactorAlpha = GR_COMBINE_FACTOR_LOCAL;         fxMesa->TexCombine[0].InvertRGB = FXFALSE;         fxMesa->TexCombine[0].InvertAlpha = FXFALSE;      }      fxMesa->ColorCombine.Function = GR_COMBINE_FUNCTION_SCALE_OTHER;      fxMesa->ColorCombine.Factor = GR_COMBINE_FACTOR_LOCAL;      fxMesa->ColorCombine.Local = localc;      fxMesa->ColorCombine.Other = GR_COMBINE_OTHER_TEXTURE;      fxMesa->ColorCombine.Invert = FXFALSE;      fxMesa->AlphaCombine.Function = GR_COMBINE_FUNCTION_SCALE_OTHER;      fxMesa->AlphaCombine.Factor = GR_COMBINE_FACTOR_LOCAL;      fxMesa->AlphaCombine.Local = locala;      fxMesa->AlphaCombine.Other = GR_COMBINE_OTHER_TEXTURE;      fxMesa->AlphaCombine.Invert = FXFALSE;   }   else if (envMode0 == GL_REPLACE && envMode1 == GL_BLEND) { /* Quake */      if (tmu0 == TDFX_TMU1) {         fxMesa->TexCombine[1].FunctionRGB = GR_COMBINE_FUNCTION_LOCAL;         fxMesa->TexCombine[1].FactorRGB = GR_COMBINE_FACTOR_NONE;         fxMesa->TexCombine[1].FunctionAlpha = GR_COMBINE_FUNCTION_LOCAL;         fxMesa->TexCombine[1].FactorAlpha = GR_COMBINE_FACTOR_NONE;         fxMesa->TexCombine[1].InvertRGB = FXTRUE;         fxMesa->TexCombine[1].InvertAlpha = FXFALSE;         fxMesa->TexCombine[0].FunctionRGB = GR_COMBINE_FUNCTION_BLEND_OTHER;         fxMesa->TexCombine[0].FactorRGB = GR_COMBINE_FACTOR_LOCAL;         fxMesa->TexCombine[0].FunctionAlpha = GR_COMBINE_FUNCTION_BLEND_OTHER;         fxMesa->TexCombine[0].FactorAlpha = GR_COMBINE_FACTOR_LOCAL;         fxMesa->TexCombine[0].InvertRGB = FXFALSE;         fxMesa->TexCombine[0].InvertAlpha = FXFALSE;      }      else {         fxMesa->TexCombine[1].FunctionRGB = GR_COMBINE_FUNCTION_LOCAL;         fxMesa->TexCombine[1].FactorRGB = GR_COMBINE_FACTOR_NONE;         fxMesa->TexCombine[1].FunctionAlpha = GR_COMBINE_FUNCTION_LOCAL;         fxMesa->TexCombine[1].FactorAlpha = GR_COMBINE_FACTOR_NONE;         fxMesa->TexCombine[1].InvertRGB = FXFALSE;         fxMesa->TexCombine[1].InvertAlpha = FXFALSE;         fxMesa->TexCombine[0].FunctionRGB = GR_COMBINE_FUNCTION_BLEND_OTHER;         fxMesa->TexCombine[0].FactorRGB = GR_COMBINE_FACTOR_ONE_MINUS_LOCAL;         fxMesa->TexCombine[0].FunctionAlpha = GR_COMBINE_FUNCTION_BLEND_OTHER;         fxMesa->TexCombine[0].FactorAlpha = GR_COMBINE_FACTOR_ONE_MINUS_LOCAL;         fxMesa->TexCombine[0].InvertRGB = FXFALSE;         fxMesa->TexCombine[0].InvertAlpha = FXFALSE;      }      fxMesa->ColorCombine.Function = GR_COMBINE_FUNCTION_SCALE_OTHER;      fxMesa->ColorCombine.Factor = GR_COMBINE_FACTOR_ONE;      fxMesa->ColorCombine.Local = localc;      fxMesa->ColorCombine.Other = GR_COMBINE_OTHER_TEXTURE;      fxMesa->ColorCombine.Invert = FXFALSE;      fxMesa->AlphaCombine.Function = GR_COMBINE_FUNCTION_LOCAL;      fxMesa->AlphaCombine.Factor = GR_COMBINE_FACTOR_NONE;      fxMesa->AlphaCombine.Local = locala;      fxMesa->AlphaCombine.Other = GR_COMBINE_OTHER_NONE;      fxMesa->AlphaCombine.Invert = FXFALSE;   }   else if (envMode0 == GL_REPLACE && envMode1 == GL_MODULATE) {      /* Quake 2/3 */      if (tmu1 == TDFX_TMU1) {         fxMesa->TexCombine[1].FunctionRGB = GR_COMBINE_FUNCTION_LOCAL;         fxMesa->TexCombine[1].FactorRGB = GR_COMBINE_FACTOR_NONE;         fxMesa->TexCombine[1].FunctionAlpha = GR_COMBINE_FUNCTION_ZERO;         fxMesa->TexCombine[1].FactorAlpha = GR_COMBINE_FACTOR_NONE;         fxMesa->TexCombine[1].InvertRGB = FXFALSE;         fxMesa->TexCombine[1].InvertAlpha = FXTRUE;         fxMesa->TexCombine[0].FunctionRGB = GR_COMBINE_FUNCTION_BLEND_OTHER;         fxMesa->TexCombine[0].FactorRGB = GR_COMBINE_FACTOR_LOCAL;         fxMesa->TexCombine[0].FunctionAlpha = GR_COMBINE_FUNCTION_BLEND_OTHER;         fxMesa->TexCombine[0].FactorAlpha = GR_COMBINE_FACTOR_LOCAL;         fxMesa->TexCombine[0].InvertRGB = FXFALSE;         fxMesa->TexCombine[0].InvertAlpha = FXFALSE;      }      else {         fxMesa->TexCombine[1].FunctionRGB = GR_COMBINE_FUNCTION_LOCAL;         fxMesa->TexCombine[1].FactorRGB = GR_COMBINE_FACTOR_NONE;         fxMesa->TexCombine[1].FunctionAlpha = GR_COMBINE_FUNCTION_LOCAL;         fxMesa->TexCombine[1].FactorAlpha = GR_COMBINE_FACTOR_NONE;         fxMesa->TexCombine[1].InvertRGB = FXFALSE;         fxMesa->TexCombine[1].InvertAlpha = FXFALSE;         fxMesa->TexCombine[0].FunctionRGB = GR_COMBINE_FUNCTION_BLEND_OTHER;         fxMesa->TexCombine[0].FactorRGB = GR_COMBINE_FACTOR_LOCAL;         fxMesa->TexCombine[0].FunctionAlpha = GR_COMBINE_FUNCTION_BLEND_OTHER;         fxMesa->TexCombine[0].FactorAlpha = GR_COMBINE_FACTOR_ONE;         fxMesa->TexCombine[0].InvertRGB = FXFALSE;         fxMesa->TexCombine[0].InvertAlpha = FXFALSE;      }      fxMesa->ColorCombine.Function = GR_COMBINE_FUNCTION_SCALE_OTHER;      fxMesa->ColorCombine.Factor = GR_COMBINE_FACTOR_ONE;      fxMesa->ColorCombine.Local = localc;      fxMesa->ColorCombine.Other = GR_COMBINE_OTHER_TEXTURE;      fxMesa->ColorCombine.Invert = FXFALSE;      if (baseFormat0 == GL_RGB) {         fxMesa->AlphaCombine.Function = GR_COMBINE_FUNCTION_LOCAL;         fxMesa->AlphaCombine.Factor = GR_COMBINE_FACTOR_NONE;         fxMesa->AlphaCombine.Local = locala;         fxMesa->AlphaCombine.Other = GR_COMBINE_OTHER_NONE;         fxMesa->AlphaCombine.Invert = FXFALSE;      }      else {         fxMesa->AlphaCombine.Function = GR_COMBINE_FUNCTION_SCALE_OTHER;         fxMesa->AlphaCombine.Factor = GR_COMBINE_FACTOR_ONE;         fxMesa->AlphaCombine.Local = locala;         fxMesa->AlphaCombine.Other = GR_COMBINE_OTHER_NONE;         fxMesa->AlphaCombine.Invert = FXFALSE;      }   }   else if (envMode0 == GL_MODULATE && envMode1 == GL_ADD) {      /* Quake 3 sky */      GLboolean isalpha[TDFX_NUM_TMU];      isalpha[tmu0] = (baseFormat0 == GL_ALPHA);      isalpha[tmu1] = (baseFormat1 == GL_ALPHA);      if (isalpha[TDFX_TMU1]) {         fxMesa->TexCombine[1].FunctionRGB = GR_COMBINE_FUNCTION_ZERO;         fxMesa->TexCombine[1].FactorRGB = GR_COMBINE_FACTOR_NONE;         fxMesa->TexCombine[1].FunctionAlpha = GR_COMBINE_FUNCTION_LOCAL;         fxMesa->TexCombine[1].FactorAlpha = GR_COMBINE_FACTOR_NONE;

⌨️ 快捷键说明

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