Browse Source

Compute scanlines for triangles in per-pixel light renderer

pull/8058/head
staphen 9 months ago committed by Anders Jenbo
parent
commit
1be33e8cf2
  1. 34
      Source/engine/render/light_render.cpp

34
Source/engine/render/light_render.cpp

@ -88,14 +88,32 @@ void RenderTriangle(Point p1, Point p2, Point p3, uint8_t lightLevel, uint8_t *l
int cx2 = cy2;
int cx3 = cy3;
for (int x = minx; x < maxx; x++) {
if (cx1 > 0 && cx2 > 0 && cx3 > 0)
dst[x] = lightLevel;
cx1 -= fdy12;
cx2 -= fdy23;
cx3 -= fdy31;
}
int cxe1 = cx1 - fdy12 * (maxx - minx);
int cxe2 = cx2 - fdy23 * (maxx - minx);
int cxe3 = cx3 - fdy31 * (maxx - minx);
auto decrementTowardZero = [](int num) {
return num > 0 ? num - 1 : num + 1;
};
int startx = std::max({
cx1 > 0 ? minx : (cxe1 > 0 ? minx + ((cx1 + decrementTowardZero(fdy12)) / fdy12) : maxx),
cx2 > 0 ? minx : (cxe2 > 0 ? minx + ((cx2 + decrementTowardZero(fdy23)) / fdy23) : maxx),
cx3 > 0 ? minx : (cxe3 > 0 ? minx + ((cx3 + decrementTowardZero(fdy31)) / fdy31) : maxx),
});
int endx = std::min({
cxe1 > 0 ? maxx : (cx1 > 0 ? minx + ((cx1 + decrementTowardZero(fdy12)) / fdy12) : minx),
cxe2 > 0 ? maxx : (cx2 > 0 ? minx + ((cx2 + decrementTowardZero(fdy23)) / fdy23) : minx),
cxe3 > 0 ? maxx : (cx3 > 0 ? minx + ((cx3 + decrementTowardZero(fdy31)) / fdy31) : minx),
});
if (startx < endx)
memset(&dst[startx], lightLevel, endx - startx);
cx1 = cxe1;
cx2 = cxe2;
cx3 = cxe3;
cy1 += fdx12;
cy2 += fdx23;

Loading…
Cancel
Save