📄 tdfx_texstate.c
字号:
env->Color.SourceC = GR_CMBX_ZERO; env->Color.InvertC = FXTRUE; env->Color.SourceD = GR_CMBX_ZERO; env->Color.InvertD = FXFALSE; } else { /* Rv = Rf * (1 - Rt) + Rc * Rt */ env->Color.SourceA = GR_CMBX_TMU_CCOLOR; env->Color.ModeA = GR_FUNC_MODE_X; env->Color.SourceB = incomingRGB; env->Color.ModeB = GR_FUNC_MODE_NEGATIVE_X; env->Color.SourceC = GR_CMBX_LOCAL_TEXTURE_RGB; env->Color.InvertC = FXFALSE; env->Color.SourceD = GR_CMBX_B; env->Color.InvertD = FXFALSE; } /* -- Setup Alpha combiner */ if (baseFormat == GL_LUMINANCE || baseFormat == GL_RGB) { /* Av = Af */ env->Alpha.SourceA = incomingAlpha; env->Alpha.ModeA = GR_FUNC_MODE_X; env->Alpha.SourceB = GR_CMBX_ZERO; env->Alpha.ModeB = GR_FUNC_MODE_ZERO; env->Alpha.SourceC = GR_CMBX_ZERO; env->Alpha.InvertC = FXTRUE; env->Alpha.SourceD = GR_CMBX_ZERO; env->Alpha.InvertD = FXFALSE; } else if (baseFormat == GL_INTENSITY) { /* Av = Af * (1 - It) + Ac * It */ env->Alpha.SourceA = GR_CMBX_TMU_CALPHA; env->Alpha.ModeA = GR_FUNC_MODE_X; env->Alpha.SourceB = incomingAlpha; env->Alpha.ModeB = GR_FUNC_MODE_NEGATIVE_X; env->Alpha.SourceC = GR_CMBX_LOCAL_TEXTURE_ALPHA; env->Alpha.InvertC = FXFALSE; env->Alpha.SourceD = GR_CMBX_B; env->Alpha.InvertD = FXFALSE; } else { /* Av = Af * At */ env->Alpha.SourceA = GR_CMBX_LOCAL_TEXTURE_ALPHA; env->Alpha.ModeA = GR_FUNC_MODE_X; env->Alpha.SourceB = GR_CMBX_ITALPHA; env->Alpha.ModeB = GR_FUNC_MODE_ZERO; env->Alpha.SourceC = incomingAlpha; env->Alpha.InvertC = FXFALSE; env->Alpha.SourceD = GR_CMBX_ZERO; env->Alpha.InvertD = FXFALSE; } /* Also have to set up the tex env constant color */ env->EnvColor = PACK_RGBA32(texUnit->EnvColor[0] * 255.0F, texUnit->EnvColor[1] * 255.0F, texUnit->EnvColor[2] * 255.0F, texUnit->EnvColor[3] * 255.0F); break; case GL_ADD: /* -- Setup RGB combiner */ if (baseFormat == GL_ALPHA) { /* Rv = Rf */ env->Color.SourceB = GR_CMBX_ZERO; env->Color.ModeB = GR_FUNC_MODE_ZERO; } else { /* Rv = Rf + Tt */ env->Color.SourceB = GR_CMBX_LOCAL_TEXTURE_RGB; env->Color.ModeB = GR_FUNC_MODE_X; } env->Color.SourceA = incomingRGB; env->Color.ModeA = GR_FUNC_MODE_X; env->Color.SourceC = GR_CMBX_ZERO; env->Color.InvertC = FXTRUE; env->Color.SourceD = GR_CMBX_ZERO; env->Color.InvertD = FXFALSE; /* -- Setup Alpha combiner */ if (baseFormat == GL_LUMINANCE || baseFormat == GL_RGB) { /* Av = Af */ env->Alpha.SourceA = incomingAlpha; env->Alpha.SourceB = GR_CMBX_ITALPHA; env->Alpha.ModeB = GR_FUNC_MODE_ZERO; env->Alpha.SourceC = GR_CMBX_ZERO; env->Alpha.InvertC = FXTRUE; } else if (baseFormat == GL_INTENSITY) { /* Av = Af + It */ env->Alpha.SourceA = incomingAlpha; env->Alpha.SourceB = GR_CMBX_LOCAL_TEXTURE_ALPHA; env->Alpha.ModeB = GR_FUNC_MODE_X; env->Alpha.SourceC = GR_CMBX_ZERO; env->Alpha.InvertC = FXTRUE; } else { /* Av = Af * At */ env->Alpha.SourceA = GR_CMBX_LOCAL_TEXTURE_ALPHA; env->Alpha.SourceB = GR_CMBX_ITALPHA; env->Alpha.ModeB = GR_FUNC_MODE_ZERO; env->Alpha.SourceC = incomingAlpha; env->Alpha.InvertC = FXFALSE; } env->Alpha.ModeA = GR_FUNC_MODE_X; env->Alpha.SourceD = GR_CMBX_ZERO; env->Alpha.InvertD = FXFALSE; break; case GL_COMBINE_EXT: { FxU32 A_RGB, B_RGB, C_RGB, D_RGB; FxU32 Amode_RGB, Bmode_RGB; FxBool Cinv_RGB, Dinv_RGB, Ginv_RGB; FxU32 Shift_RGB; FxU32 A_A, B_A, C_A, D_A; FxU32 Amode_A, Bmode_A; FxBool Cinv_A, Dinv_A, Ginv_A; FxU32 Shift_A; /* * * In the formulas below, we write: * o "1(x)" for the identity function applied to x, * so 1(x) = x. * o "0(x)" for the constant function 0, so * 0(x) = 0 for all values of x. * * Calculate the color combination. */ Shift_RGB = texUnit->Combine.ScaleShiftRGB; Shift_A = texUnit->Combine.ScaleShiftA; switch (texUnit->Combine.ModeRGB) { case GL_REPLACE: /* * The formula is: Arg0 * We implement this by the formula: * (Arg0 + 0(0))*(1-0) + 0 */ TEXENV_SETUP_ARG_RGB(A_RGB, texUnit->Combine.SourceRGB[0], texUnit->Combine.OperandRGB[0], incomingRGB, incomingAlpha); TEXENV_SETUP_MODE_RGB(Amode_RGB, texUnit->Combine.OperandRGB[0]); B_RGB = C_RGB = D_RGB = GR_CMBX_ZERO; Bmode_RGB = GR_FUNC_MODE_ZERO; Cinv_RGB = FXTRUE; Dinv_RGB = Ginv_RGB = FXFALSE; break; case GL_MODULATE: /* * The formula is: Arg0 * Arg1 * * We implement this by the formula * (Arg0 + 0(0)) * Arg1 + 0(0) */ TEXENV_SETUP_ARG_RGB(A_RGB, texUnit->Combine.SourceRGB[0], texUnit->Combine.OperandRGB[0], incomingRGB, incomingAlpha); TEXENV_SETUP_MODE_RGB(Amode_RGB, texUnit->Combine.OperandRGB[0]); B_RGB = GR_CMBX_ZERO; Bmode_RGB = GR_CMBX_ZERO; TEXENV_SETUP_ARG_RGB(C_RGB, texUnit->Combine.SourceRGB[1], texUnit->Combine.OperandRGB[1], incomingRGB, incomingAlpha); Cinv_RGB = TEXENV_OPERAND_INVERTED (texUnit->Combine.OperandRGB[1]); D_RGB = GR_CMBX_ZERO; Dinv_RGB = Ginv_RGB = FXFALSE; break; case GL_ADD: /* * The formula is Arg0 + Arg1 */ TEXENV_SETUP_ARG_RGB(A_RGB, texUnit->Combine.SourceRGB[0], texUnit->Combine.OperandRGB[0], incomingRGB, incomingAlpha); TEXENV_SETUP_MODE_RGB(Amode_RGB, texUnit->Combine.OperandRGB[0]); TEXENV_SETUP_ARG_RGB(B_RGB, texUnit->Combine.SourceRGB[1], texUnit->Combine.OperandRGB[1], incomingRGB, incomingAlpha); TEXENV_SETUP_MODE_RGB(Bmode_RGB, texUnit->Combine.OperandRGB[1]); C_RGB = D_RGB = GR_CMBX_ZERO; Cinv_RGB = FXTRUE; Dinv_RGB = Ginv_RGB = FXFALSE; break; case GL_ADD_SIGNED_EXT: /* * The formula is: Arg0 + Arg1 - 0.5. * We compute this by calculating: * (Arg0 - 1/2) + Arg1 if op0 is SRC_{COLOR,ALPHA} * Arg0 + (Arg1 - 1/2) if op1 is SRC_{COLOR,ALPHA} * If both op0 and op1 are ONE_MINUS_SRC_{COLOR,ALPHA} * we cannot implement the formula properly. */ TEXENV_SETUP_ARG_RGB(A_RGB, texUnit->Combine.SourceRGB[0], texUnit->Combine.OperandRGB[0], incomingRGB, incomingAlpha); TEXENV_SETUP_ARG_RGB(B_RGB, texUnit->Combine.SourceRGB[1], texUnit->Combine.OperandRGB[1], incomingRGB, incomingAlpha); if (!TEXENV_OPERAND_INVERTED(texUnit->Combine.OperandRGB[0])) { /* * A is not inverted. So, choose it. */ Amode_RGB = GR_FUNC_MODE_X_MINUS_HALF; if (!TEXENV_OPERAND_INVERTED (texUnit->Combine.OperandRGB[1])) { Bmode_RGB = GR_FUNC_MODE_X; } else { Bmode_RGB = GR_FUNC_MODE_ONE_MINUS_X; } } else { /* * A is inverted, so try to subtract 1/2 * from B. */ Amode_RGB = GR_FUNC_MODE_ONE_MINUS_X; if (!TEXENV_OPERAND_INVERTED (texUnit->Combine.OperandRGB[1])) { Bmode_RGB = GR_FUNC_MODE_X_MINUS_HALF; } else { /* * Both are inverted. This is the case * we cannot handle properly. We just * choose to not add the - 1/2. */ Bmode_RGB = GR_FUNC_MODE_ONE_MINUS_X; return GL_FALSE; } } C_RGB = D_RGB = GR_CMBX_ZERO; Cinv_RGB = FXTRUE; Dinv_RGB = Ginv_RGB = FXFALSE; break; case GL_INTERPOLATE_EXT: /* * The formula is: Arg0 * Arg2 + Arg1 * (1 - Arg2). * We compute this by the formula: * (Arg0 - Arg1) * Arg2 + Arg1 * == Arg0 * Arg2 - Arg1 * Arg2 + Arg1 * == Arg0 * Arg2 + Arg1 * (1 - Arg2) * However, if both Arg1 is ONE_MINUS_X, the HW does * not support it properly. */ TEXENV_SETUP_ARG_RGB(A_RGB, texUnit->Combine.SourceRGB[0], texUnit->Combine.OperandRGB[0], incomingRGB, incomingAlpha); TEXENV_SETUP_MODE_RGB(Amode_RGB, texUnit->Combine.OperandRGB[0]); TEXENV_SETUP_ARG_RGB(B_RGB, texUnit->Combine.SourceRGB[1], texUnit->Combine.OperandRGB[1], incomingRGB, incomingAlpha); if (TEXENV_OPERAND_INVERTED(texUnit->Combine.OperandRGB[1])) { /* * This case is wrong. */ Bmode_RGB = GR_FUNC_MODE_NEGATIVE_X; return GL_FALSE; } else { Bmode_RGB = GR_FUNC_MODE_NEGATIVE_X; } /* * The Source/Operand for the C value must * specify some kind of alpha value. */ TEXENV_SETUP_ARG_A(C_RGB, texUnit->Combine.SourceRGB[2], texUnit->Combine.OperandRGB[2], incomingAlpha); Cinv_RGB = FXFALSE; D_RGB = GR_CMBX_B; Dinv_RGB = Ginv_RGB = FXFALSE; break; default: /* * This is here mostly to keep from getting * a compiler warning about these not being set. * However, this should set all the texture values * to zero. */ A_RGB = B_RGB = C_RGB = D_RGB = GR_CMBX_ZERO; Amode_RGB = Bmode_RGB = GR_FUNC_MODE_X; Cinv_RGB = Dinv_RGB = Ginv_RGB = FXFALSE; break; } /* * Calculate the alpha combination. */ switch (texUnit->Combine.ModeA) { case GL_REPLACE:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -