Guest User

Rasterizer

a guest
May 23rd, 2024
666
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.03 KB | None | 0 0
  1. void RasterizeTriangle(ui32 *dest, const ui32 &destWidth, const ui32 &color, v2I t0, v2I t1, v2I t2)
  2. {
  3.   if (t0[1] > t1[1]) std::swap(t0, t1);
  4.   if (t0[1] > t2[1]) std::swap(t0, t2);
  5.   if (t1[1] > t2[1]) std::swap(t1, t2);
  6.   i32 total_height = t2[1] - t0[1];
  7.   for (i32 i = 0; i < total_height; i++)
  8.   {
  9.     bool second_half = i > t1[1] - t0[1] || t1[1] == t0[1];
  10.     i32 segment_height = second_half ? t2[1] - t1[1] : t1[1] - t0[1];
  11.     float alpha = (float)i / total_height;
  12.     float beta = (float)(i - (second_half ? t1[1] - t0[1] : 0)) / segment_height;
  13.     i32 A[2], B[2];
  14.     A[0] = i32(t0[0] + (t2[0] - t0[0]) * alpha);
  15.     B[0] = i32(second_half ? t1[0] + (t2[0] - t1[0]) * beta : t0[0] + (t1[0] - t0[0]) * beta);
  16.     A[1] = i32(t0[1] + (t2[1] - t0[1]) * alpha);
  17.     B[1] = i32(second_half ? t1[1] + (t2[1] - t1[1]) * beta : t0[1] + (t1[1] - t0[1]) * beta);
  18.     if (A[0] > B[0]) std::swap(A, B);
  19.     ui32 *pData = dest + (A[0] + (t0[1] + i) * destWidth);
  20.     for (i32 x = A[0]; x <= B[0]; x++)
  21.       *pData++ = color;
  22.   }
  23. }
  24.  
Advertisement
Add Comment
Please, Sign In to add comment