Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* select zero/other for RGB */
- if (!TEXMODE_TC_ZERO_OTHER(TEXMODE))
- {
- tr = COTHER.rgb.r;
- tg = COTHER.rgb.g;
- tb = COTHER.rgb.b;
- }
- else
- tr = tg = tb = 0;
- /* select zero/other for alpha */
- if (!TEXMODE_TCA_ZERO_OTHER(TEXMODE))
- ta = COTHER.rgb.a;
- else
- ta = 0;
- /* potentially subtract c_local */
- if (TEXMODE_TC_SUB_CLOCAL(TEXMODE))
- {
- tr -= c_local.rgb.r;
- tg -= c_local.rgb.g;
- tb -= c_local.rgb.b;
- }
- if (TEXMODE_TCA_SUB_CLOCAL(TEXMODE))
- ta -= c_local.rgb.a;
- /* blend RGB */
- switch (TEXMODE_TC_MSELECT(TEXMODE))
- {
- default:/* reserved */
- case 0:/* zero */
- blendr = blendg = blendb = 0;
- break;
- case 1:/* c_local */
- blendr = c_local.rgb.r;
- blendg = c_local.rgb.g;
- blendb = c_local.rgb.b;
- break;
- case 2:/* a_other */
- blendr = blendg = blendb = COTHER.rgb.a;
- break;
- case 3:/* a_local */
- blendr = blendg = blendb = c_local.rgb.a;
- break;
- case 4:/* LOD (detail factor) */
- if ((TT)->detailbias <= lod)
- blendr = blendg = blendb = 0;
- else
- {
- blendr = ((((TT)->detailbias - lod) << (TT)->detailscale) >> 8);
- if (blendr > (TT)->detailmax)
- blendr = (TT)->detailmax;
- blendg = blendb = blendr;
- }
- break;
- case 5:/* LOD fraction */
- blendr = blendg = blendb = lod & 0xff;
- break;
- }
- /* blend alpha */
- switch (TEXMODE_TCA_MSELECT(TEXMODE))
- {
- default:/* reserved */
- case 0:/* zero */
- blenda = 0;
- break;
- case 1:/* c_local */
- blenda = c_local.rgb.a;
- break;
- case 2:/* a_other */
- blenda = COTHER.rgb.a;
- break;
- case 3:/* a_local */
- blenda = c_local.rgb.a;
- break;
- case 4:/* LOD (detail factor) */
- if ((TT)->detailbias <= lod)
- blenda = 0;
- else
- {
- blenda = ((((TT)->detailbias - lod) << (TT)->detailscale) >> 8);
- if (blenda > (TT)->detailmax)
- blenda = (TT)->detailmax;
- }
- break;
- case 5:/* LOD fraction */
- blenda = lod & 0xff;
- break;
- }
- /* reverse the RGB blend */
- if (!TEXMODE_TC_REVERSE_BLEND(TEXMODE))
- {
- blendr ^= 0xff;
- blendg ^= 0xff;
- blendb ^= 0xff;
- }
- /* reverse the alpha blend */
- if (!TEXMODE_TCA_REVERSE_BLEND(TEXMODE))
- blenda ^= 0xff;
- /* do the blend */
- tr = (tr * (blendr + 1)) >> 8;
- tg = (tg * (blendg + 1)) >> 8;
- tb = (tb * (blendb + 1)) >> 8;
- ta = (ta * (blenda + 1)) >> 8;
- /* add clocal or alocal to RGB */
- switch (TEXMODE_TC_ADD_ACLOCAL(TEXMODE))
- {
- case 3:/* reserved */
- case 0:/* nothing */
- break;
- case 1:/* add c_local */
- tr += c_local.rgb.r;
- tg += c_local.rgb.g;
- tb += c_local.rgb.b;
- break;
- case 2:/* add_alocal */
- tr += c_local.rgb.a;
- tg += c_local.rgb.a;
- tb += c_local.rgb.a;
- break;
- }
- /* add clocal or alocal to alpha */
- if (TEXMODE_TCA_ADD_ACLOCAL(TEXMODE))
- ta += c_local.rgb.a;
- /* clamp */
- RESULT.rgb.r = (tr < 0) ? 0 : (tr > 0xff) ? 0xff : tr;
- RESULT.rgb.g = (tg < 0) ? 0 : (tg > 0xff) ? 0xff : tg;
- RESULT.rgb.b = (tb < 0) ? 0 : (tb > 0xff) ? 0xff : tb;
- RESULT.rgb.a = (ta < 0) ? 0 : (ta > 0xff) ? 0xff : ta;
- /* invert */
- if (TEXMODE_TC_INVERT_OUTPUT(TEXMODE))
- RESULT.u ^= 0x00ffffff;
- if (TEXMODE_TCA_INVERT_OUTPUT(TEXMODE))
- RESULT.rgb.a ^= 0xff;
Advertisement
Add Comment
Please, Sign In to add comment