Advertisement
Guest User

Untitled

a guest
Sep 21st, 2017
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.30 KB | None | 0 0
  1.     void RasterizeTriangle( Point4 p1, Point4 p2, Point4 p3, Color c )
  2.     {
  3.         Point4 T, M, B;
  4.         Point4 zT, zM, zB;
  5.         f32 x, y, mL, mR, xL, xR;
  6.         bool M_is_left;
  7.  
  8.         if ( p1.y < p2.y ) // 1, 2, 5
  9.         {
  10.             if( p1.y < p3.y ) // 1, 2
  11.             {
  12.                 if( p2.y < p3.y ) // 1
  13.                 {
  14.                     T = p1;
  15.                     M = p2;
  16.                     B = p3;
  17.                     zT = p1;
  18.                     zM = p2;
  19.                     zB = p3;
  20.                     M_is_left = true;
  21.                 }
  22.                 else // 2
  23.                 {
  24.                     T = p1;
  25.                     M = p3;
  26.                     B = p2;
  27.                     zT = p1;
  28.                     zM = p3;
  29.                     zB = p2;
  30.                     M_is_left = false;
  31.                 }
  32.             }
  33.             else // 5
  34.             {
  35.                 T = p3;
  36.                 M = p1;
  37.                 B = p2;
  38.                 zT = p3;
  39.                 zM = p1;
  40.                 zB = p2;
  41.                 M_is_left = true;
  42.             }
  43.         }
  44.         else if( p2.y <= p1.y ) // 3, 4, 6
  45.         {
  46.             if( p2.y < p3.y ) // 3, 4
  47.             {
  48.                 if( p3.y < p1.y ) // 3
  49.                 {
  50.                     T = p2;
  51.                     M = p3;
  52.                     B = p1;
  53.                     zT = p2;
  54.                     zM = p3;
  55.                     zB = p1;
  56.                     M_is_left = true;
  57.                 }
  58.                 else // 4
  59.                 {
  60.                     T = p2;
  61.                     M = p1;
  62.                     B = p3;
  63.                     zT = p2;
  64.                     zM = p1;
  65.                     zB = p3;
  66.                     M_is_left = false;
  67.                 }
  68.             }
  69.             else // 6
  70.             {
  71.                 T = p3;
  72.                 M = p2;
  73.                 B = p1;
  74.                 zT = p3;
  75.                 zM = p2;
  76.                 zB = p1;
  77.                 M_is_left = false;
  78.             }
  79.         }
  80.  
  81.         if( M_is_left )
  82.         {
  83.             mL = ( ( M.x - T.x ) / ( M.y - T.y ) );
  84.             mR = ( ( B.x - T.x ) / ( B.y - T.y ) );
  85.         }
  86.         else
  87.         {
  88.             mL = ( ( B.x - T.x ) / ( B.y - T.y ) );
  89.             mR = ( ( M.x - T.x ) / ( M.y - T.y ) );
  90.         }
  91.  
  92.             // POINT INIT
  93.  
  94.         y = T.y;
  95.         xL = T.x;
  96.         xR = xL;
  97.  
  98.  
  99.             // DB INIT
  100.  
  101.         // z1
  102.         Vector4 MTz1 = ( M - T );
  103.         MTz1.z = zM.x - zT.x;
  104.         Vector4 BTz1 = ( B - T );
  105.         BTz1.z = zB.x - zT.x;
  106.         // z2
  107.         Vector4 MTz2 = ( M - T );
  108.         MTz2.z = zM.y - zT.y;
  109.         Vector4 BTz2 = ( B - T );
  110.         BTz2.z = zB.y - zT.y;
  111.         // z3
  112.         Vector4 MTz3 = ( M - T );
  113.         MTz3.z = zM.z - zT.z;
  114.         Vector4 BTz3 = ( B - T );
  115.         BTz3.z = zB.z - zT.z;
  116.  
  117.         Point4 z1;
  118.         z1.x = MTz1.x * BTz1.x;
  119.         z1.y = MTz1.y * BTz1.y;
  120.         z1.z = MTz1.z * BTz1.z;
  121.  
  122.         Point4 z2;
  123.         z2.x = MTz2.x * BTz2.x;
  124.         z2.y = MTz2.y * BTz2.y;
  125.         z2.z = MTz2.z * BTz2.z;
  126.  
  127.         Point4 z3;
  128.         z3.x = MTz3.x * BTz3.x;
  129.         z3.y = MTz3.y * BTz3.y;
  130.         z3.z = MTz3.z * BTz3.z;
  131.  
  132.         Point4 zz0 = zT;
  133.         Point4 zz = zz0;
  134.  
  135.         Point4 zX( (-z3.x / z3.z), (-z3.x / z3.z), (-z3.x / z3.z) );
  136.         Point4 zY( (-z3.y / z3.z), (-z3.y / z3.z), (-z3.y / z3.z) );
  137.  
  138.  
  139.  
  140.         // DRAW THE TOP HALF
  141.         for( y = ceil(T.y); y < ceil(M.y); ++y )
  142.         {
  143.             zz = zz0;
  144.  
  145.             for( x = ceil(xL); x < ceil(xR); ++x )
  146.             {
  147.                 DBSetPixel(Point4(x,y,zz.z),c.r,c.g,c.b);
  148.                 //DBSetPixel(Point4(x,y,p1.z),c.r,c.g,c.b);
  149.  
  150.                 zz.x += zX.x;
  151.                 zz.y += zX.y;
  152.                 zz.z += zX.z;
  153.             }
  154.             xL += mL;
  155.             xR += mR;
  156.  
  157.             zz0.x += ((zX.x * mL) + zY.x);
  158.             zz0.y += ((zX.y * mL) + zY.y);
  159.             zz0.z += ((zX.z * mL) + zY.z);
  160.         }
  161.  
  162.         // READJUST SLOPE
  163.         if( M_is_left )
  164.         {
  165.             mL = ( ( B.x - M.x ) / ( B.y - M.y ) );
  166.             xL = M.x;
  167.         }
  168.         else
  169.         {
  170.             mR = ( ( B.x - M.x ) / ( B.y - M.y ) );
  171.             xR = M.x;
  172.         }
  173.  
  174.         // DRAW THE BOTTOM HALF
  175.         for( y = ceil(M.y); y < ceil(B.y); ++y )
  176.         {
  177.             zz = zz0;
  178.             for( x = ceil(xL); x < ceil(xR); ++x )
  179.             {
  180.                 DBSetPixel(Point4(x,y,zz.z),c.r,c.g,c.b);
  181.                 //DBSetPixel(Point4(x,y,p1.z),c.r,c.g,c.b);
  182.  
  183.                 zz.x += zX.x;
  184.                 zz.y += zX.y;
  185.                 zz.z += zX.z;
  186.             }
  187.             xL += mL;
  188.             xR += mR;
  189.  
  190.             zz0.x += ((zX.x * mL) + zY.x);
  191.             zz0.y += ((zX.y * mL) + zY.y);
  192.             zz0.z += ((zX.z * mL) + zY.z);
  193.         }
  194.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement