Advertisement
Guest User

Untitled

a guest
Jan 2nd, 2025
124
0
18 days
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.95 KB | None | 0 0
  1. void clRasterizer::DrawTri(clList<Fragment> *pFragList, const clVec2 &v1, const clVec2 &v2, const clVec2 &v3)
  2. {
  3.   Fragment f1(v1, 0);
  4.   Fragment f2(v2, 1);
  5.   Fragment f3(v3, 2);
  6.   Span s[3] = { Span(f1, f2) , Span(f2, f3), Span(f3, f1) };
  7.   if (s[2].Length() > s[1].Length()) clSwap(s[1], s[2]);
  8.   if (s[1].Length() > s[0].Length()) clSwap(s[0], s[1]);
  9.   DrawSpan(pFragList, s[0], s[1]);
  10.   DrawSpan(pFragList, s[0], s[2]);
  11. }
  12.  
  13. void clRasterizer::DrawSpan(clList<Fragment> *pFragList, const Span &longSpan, const Span &shortSpan)
  14. {
  15.   clVec2 shortLine = shortSpan.PositionDelta();
  16.   clVec2 longLine = longSpan.PositionDelta();
  17.   if (shortLine.y == 0 || longLine.y == 0) return; // Skip if span is empty
  18.  
  19.   float shortTop = shortSpan.m_f1.m_position.y; // Calculate Spans Vertical Extents
  20.   float shortBot = shortSpan.m_f2.m_position.y;
  21.   i64 yTop = (i64)ceil(shortTop);
  22.   i64 yBot = (i64)ceil(shortBot);
  23.  
  24.   float shortStepX = (shortLine.x / shortLine.y); // Calculate Spans Stepping rates
  25.   float longStepX = (longLine.x / longLine.y);
  26.   clVec3 shortStepInf = (shortSpan.m_f2.m_influence - shortSpan.m_f1.m_influence) / shortLine.y;
  27.   clVec3 longStepInf = (longSpan.m_f2.m_influence - longSpan.m_f1.m_influence) / longLine.y;
  28.  
  29.   float longStart = (shortTop - longSpan.m_f1.m_position.y) / longLine.y; // Calculate long edge start pos
  30.  
  31.   float shortPosX = shortSpan.m_f1.m_position.x; // Calculate the Scans Initial xPosition
  32.   float longPosX = longSpan.m_f1.m_position.x * (1.0f - longStart) + longSpan.m_f2.m_position.x * (longStart);
  33.  
  34.   clVec3 shortInf = shortSpan.m_f1.m_influence; // Calculate the Scans Initial Influence
  35.   clVec3 longInf = longSpan.m_f1.m_influence * (1.0f - longStart) + longSpan.m_f2.m_influence * (longStart);
  36.  
  37.   float fillOffset = (yTop - shortTop); // Apply OpenGLs fragment filling conventions
  38.   shortPosX += shortStepX * fillOffset;
  39.   longPosX += longStepX * fillOffset;
  40.   shortInf += shortStepInf * fillOffset;
  41.   longInf += longStepInf * fillOffset;
  42.  
  43.   for (i64 y = yTop; y < yBot; y++) // Draw all Scans in Span
  44.   {
  45.     Fragment shortEdge({ shortPosX, (float)y }, shortInf);
  46.     Fragment longEdge({ longPosX, (float)y }, longInf);
  47.     DrawScan(pFragList, { shortEdge, longEdge });
  48.     shortPosX += shortStepX;
  49.     longPosX += longStepX;
  50.     shortInf += shortStepInf;
  51.     longInf += longStepInf;
  52.   }
  53. }
  54.  
  55. void clRasterizer::DrawScan(clList<Fragment> *pFragList, const Scan &scan)
  56. {
  57.   i64 leftPosX = (i64)(clFloor(scan.m_f1.m_position.x)); // Calculate Scan line Extents
  58.   i64 rightPosX = (i64)(clCeil(scan.m_f2.m_position.x));
  59.   i64 posY = (i64)scan.m_f1.m_position.y;
  60.   clVec3 influence = scan.m_f1.m_influence; // Calculate Stepping Rates
  61.   clVec3 stepInfluence = (scan.m_f2.m_influence - scan.m_f1.m_influence) / (float(rightPosX) - leftPosX);
  62.   for (i64 x = leftPosX; x < rightPosX; x++) // Draw all fragments in Scan
  63.   {
  64.     pFragList->EmplaceBack(clVec2((float)x, (float)posY), influence);
  65.     influence += stepInfluence;
  66.   }
  67. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement