📄 tdfx_texstate.c
字号:
} 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 + -