Guest User

texel pipeline

a guest
Mar 15th, 2011
177
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.01 KB | None | 0 0
  1. /* select zero/other for RGB */
  2. if (!TEXMODE_TC_ZERO_OTHER(TEXMODE))
  3. {
  4.     tr = COTHER.rgb.r;
  5.     tg = COTHER.rgb.g;
  6.     tb = COTHER.rgb.b;
  7. }
  8. else
  9.     tr = tg = tb = 0;
  10.  
  11. /* select zero/other for alpha */
  12. if (!TEXMODE_TCA_ZERO_OTHER(TEXMODE))
  13.     ta = COTHER.rgb.a;
  14. else
  15.     ta = 0;
  16.  
  17. /* potentially subtract c_local */
  18. if (TEXMODE_TC_SUB_CLOCAL(TEXMODE))
  19. {
  20.     tr -= c_local.rgb.r;
  21.     tg -= c_local.rgb.g;
  22.     tb -= c_local.rgb.b;
  23. }
  24. if (TEXMODE_TCA_SUB_CLOCAL(TEXMODE))
  25.     ta -= c_local.rgb.a;
  26.  
  27. /* blend RGB */
  28. switch (TEXMODE_TC_MSELECT(TEXMODE))
  29. {
  30. default:/* reserved */
  31. case 0:/* zero */
  32.     blendr = blendg = blendb = 0;
  33.     break;
  34.  
  35. case 1:/* c_local */
  36.     blendr = c_local.rgb.r;
  37.     blendg = c_local.rgb.g;
  38.     blendb = c_local.rgb.b;
  39.     break;
  40.  
  41. case 2:/* a_other */
  42.     blendr = blendg = blendb = COTHER.rgb.a;
  43.     break;
  44.  
  45. case 3:/* a_local */
  46.     blendr = blendg = blendb = c_local.rgb.a;
  47.     break;
  48.  
  49. case 4:/* LOD (detail factor) */
  50.     if ((TT)->detailbias <= lod)
  51.         blendr = blendg = blendb = 0;
  52.     else
  53.     {
  54.         blendr = ((((TT)->detailbias - lod) << (TT)->detailscale) >> 8);
  55.         if (blendr > (TT)->detailmax)
  56.             blendr = (TT)->detailmax;
  57.         blendg = blendb = blendr;
  58.     }
  59.     break;
  60.  
  61. case 5:/* LOD fraction */
  62.     blendr = blendg = blendb = lod & 0xff;
  63.     break;
  64. }
  65.  
  66. /* blend alpha */
  67. switch (TEXMODE_TCA_MSELECT(TEXMODE))
  68. {
  69. default:/* reserved */
  70. case 0:/* zero */
  71.     blenda = 0;
  72.     break;
  73.  
  74. case 1:/* c_local */
  75.     blenda = c_local.rgb.a;
  76.     break;
  77.  
  78. case 2:/* a_other */
  79.     blenda = COTHER.rgb.a;
  80.     break;
  81.  
  82. case 3:/* a_local */
  83.     blenda = c_local.rgb.a;
  84.     break;
  85.  
  86. case 4:/* LOD (detail factor) */
  87.     if ((TT)->detailbias <= lod)
  88.         blenda = 0;
  89.     else
  90.     {
  91.         blenda = ((((TT)->detailbias - lod) << (TT)->detailscale) >> 8);
  92.         if (blenda > (TT)->detailmax)
  93.             blenda = (TT)->detailmax;
  94.     }
  95.     break;
  96.  
  97. case 5:/* LOD fraction */
  98.     blenda = lod & 0xff;
  99.     break;
  100. }
  101.  
  102. /* reverse the RGB blend */
  103. if (!TEXMODE_TC_REVERSE_BLEND(TEXMODE))
  104. {
  105.     blendr ^= 0xff;
  106.     blendg ^= 0xff;
  107.     blendb ^= 0xff;
  108. }
  109.  
  110. /* reverse the alpha blend */
  111. if (!TEXMODE_TCA_REVERSE_BLEND(TEXMODE))
  112.     blenda ^= 0xff;
  113.  
  114. /* do the blend */
  115. tr = (tr * (blendr + 1)) >> 8;
  116. tg = (tg * (blendg + 1)) >> 8;
  117. tb = (tb * (blendb + 1)) >> 8;
  118. ta = (ta * (blenda + 1)) >> 8;
  119.  
  120. /* add clocal or alocal to RGB */
  121. switch (TEXMODE_TC_ADD_ACLOCAL(TEXMODE))
  122. {
  123. case 3:/* reserved */
  124. case 0:/* nothing */
  125.     break;
  126.  
  127. case 1:/* add c_local */
  128.     tr += c_local.rgb.r;
  129.     tg += c_local.rgb.g;
  130.     tb += c_local.rgb.b;
  131.     break;
  132.  
  133. case 2:/* add_alocal */
  134.     tr += c_local.rgb.a;
  135.     tg += c_local.rgb.a;
  136.     tb += c_local.rgb.a;
  137.     break;
  138. }
  139.  
  140. /* add clocal or alocal to alpha */
  141. if (TEXMODE_TCA_ADD_ACLOCAL(TEXMODE))
  142.     ta += c_local.rgb.a;
  143.  
  144. /* clamp */
  145. RESULT.rgb.r = (tr < 0) ? 0 : (tr > 0xff) ? 0xff : tr;
  146. RESULT.rgb.g = (tg < 0) ? 0 : (tg > 0xff) ? 0xff : tg;
  147. RESULT.rgb.b = (tb < 0) ? 0 : (tb > 0xff) ? 0xff : tb;
  148. RESULT.rgb.a = (ta < 0) ? 0 : (ta > 0xff) ? 0xff : ta;
  149.  
  150. /* invert */
  151. if (TEXMODE_TC_INVERT_OUTPUT(TEXMODE))
  152.     RESULT.u ^= 0x00ffffff;
  153. if (TEXMODE_TCA_INVERT_OUTPUT(TEXMODE))
  154.     RESULT.rgb.a ^= 0xff;
Advertisement
Add Comment
Please, Sign In to add comment