Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void clRasterizer::DrawTri(clList<Fragment> *pFragList, const clVec2 &v1, const clVec2 &v2, const clVec2 &v3)
- {
- Fragment f1(v1, 0);
- Fragment f2(v2, 1);
- Fragment f3(v3, 2);
- Span s[3] = { Span(f1, f2) , Span(f2, f3), Span(f3, f1) };
- if (s[2].Length() > s[1].Length()) clSwap(s[1], s[2]);
- if (s[1].Length() > s[0].Length()) clSwap(s[0], s[1]);
- DrawSpan(pFragList, s[0], s[1]);
- DrawSpan(pFragList, s[0], s[2]);
- }
- void clRasterizer::DrawSpan(clList<Fragment> *pFragList, const Span &longSpan, const Span &shortSpan)
- {
- clVec2 shortLine = shortSpan.PositionDelta();
- clVec2 longLine = longSpan.PositionDelta();
- if (shortLine.y == 0 || longLine.y == 0) return; // Skip if span is empty
- float shortTop = shortSpan.m_f1.m_position.y; // Calculate Spans Vertical Extents
- float shortBot = shortSpan.m_f2.m_position.y;
- i64 yTop = (i64)ceil(shortTop);
- i64 yBot = (i64)ceil(shortBot);
- float shortStepX = (shortLine.x / shortLine.y); // Calculate Spans Stepping rates
- float longStepX = (longLine.x / longLine.y);
- clVec3 shortStepInf = (shortSpan.m_f2.m_influence - shortSpan.m_f1.m_influence) / shortLine.y;
- clVec3 longStepInf = (longSpan.m_f2.m_influence - longSpan.m_f1.m_influence) / longLine.y;
- float longStart = (shortTop - longSpan.m_f1.m_position.y) / longLine.y; // Calculate long edge start pos
- float shortPosX = shortSpan.m_f1.m_position.x; // Calculate the Scans Initial xPosition
- float longPosX = longSpan.m_f1.m_position.x * (1.0f - longStart) + longSpan.m_f2.m_position.x * (longStart);
- clVec3 shortInf = shortSpan.m_f1.m_influence; // Calculate the Scans Initial Influence
- clVec3 longInf = longSpan.m_f1.m_influence * (1.0f - longStart) + longSpan.m_f2.m_influence * (longStart);
- float fillOffset = (yTop - shortTop); // Apply OpenGLs fragment filling conventions
- shortPosX += shortStepX * fillOffset;
- longPosX += longStepX * fillOffset;
- shortInf += shortStepInf * fillOffset;
- longInf += longStepInf * fillOffset;
- for (i64 y = yTop; y < yBot; y++) // Draw all Scans in Span
- {
- Fragment shortEdge({ shortPosX, (float)y }, shortInf);
- Fragment longEdge({ longPosX, (float)y }, longInf);
- DrawScan(pFragList, { shortEdge, longEdge });
- shortPosX += shortStepX;
- longPosX += longStepX;
- shortInf += shortStepInf;
- longInf += longStepInf;
- }
- }
- void clRasterizer::DrawScan(clList<Fragment> *pFragList, const Scan &scan)
- {
- i64 leftPosX = (i64)(clFloor(scan.m_f1.m_position.x)); // Calculate Scan line Extents
- i64 rightPosX = (i64)(clCeil(scan.m_f2.m_position.x));
- i64 posY = (i64)scan.m_f1.m_position.y;
- clVec3 influence = scan.m_f1.m_influence; // Calculate Stepping Rates
- clVec3 stepInfluence = (scan.m_f2.m_influence - scan.m_f1.m_influence) / (float(rightPosX) - leftPosX);
- for (i64 x = leftPosX; x < rightPosX; x++) // Draw all fragments in Scan
- {
- pFragList->EmplaceBack(clVec2((float)x, (float)posY), influence);
- influence += stepInfluence;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement