|
|
@ -32,6 +32,52 @@ Raster::~Raster() { |
|
|
|
delete buffer; |
|
|
|
} |
|
|
|
|
|
|
|
void Raster::drawLine(float2 p1, float2 p2, Rgba color) { |
|
|
|
|
|
|
|
float xOffer = p1.x - p2.x; |
|
|
|
float yOffer = p1.y - p2.y; |
|
|
|
float xStart, xEnd, yStart, yEnd; |
|
|
|
|
|
|
|
if (xOffer == 0 && yOffer == 0) { |
|
|
|
setPixel(p1.x, p1.y, color); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (fabs(xOffer) > fabs(yOffer)) { |
|
|
|
if (p1.x < p2.x) { |
|
|
|
xStart = p1.x; |
|
|
|
xEnd = p2.x; |
|
|
|
yEnd = p2.y; |
|
|
|
} else { |
|
|
|
xStart = p2.x; |
|
|
|
xEnd = p1.x; |
|
|
|
yEnd = p1.y; |
|
|
|
} |
|
|
|
|
|
|
|
float slope = yOffer / xOffer; |
|
|
|
for (float i = xStart; i < xEnd; i += 1.0) { |
|
|
|
float q = yEnd - slope * (xEnd - i); |
|
|
|
setPixel(i, q, color); |
|
|
|
} |
|
|
|
} else { |
|
|
|
if (p1.y < p2.y) { |
|
|
|
yStart = p1.y; |
|
|
|
yEnd = p2.y; |
|
|
|
xEnd = p2.x; |
|
|
|
} else { |
|
|
|
yStart = p2.y; |
|
|
|
yEnd = p1.y; |
|
|
|
xEnd = p1.x; |
|
|
|
} |
|
|
|
float slope = xOffer / yOffer; |
|
|
|
for (float i = yStart; i < yEnd; i += 1.0) { |
|
|
|
float q = xEnd - slope * (yEnd - i); |
|
|
|
setPixel(q, i, color); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
void Raster::drawPoint(int x, int y, Rgba color, int pointSize) { |
|
|
|
switch (pointSize) { |
|
|
|
case 1: |
|
|
@ -85,7 +131,7 @@ void Raster::drawSpan(const Span &span, Image* image) { |
|
|
|
} else { |
|
|
|
scale = (float) (i - startX) / length; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
uv = uvLerp(span.uvStart, span.uvEnd, scale); |
|
|
|
|
|
|
|
color = image->pixelUv(uv.x, uv.y); |
|
|
@ -127,7 +173,7 @@ void Raster::drawEge(const Ege& e1, const Ege& e2, Image* image) { |
|
|
|
} |
|
|
|
uvE2 = uvLerp(e2.uv2, e2.uv1, scale2); |
|
|
|
scale2 += setp2; |
|
|
|
//setPixel(x2, y, e2.color2);
|
|
|
|
//setPixel(x2, y, Rgba(255,0,0));
|
|
|
|
|
|
|
|
|
|
|
|
int x1; |
|
|
@ -138,9 +184,9 @@ void Raster::drawEge(const Ege& e1, const Ege& e2, Image* image) { |
|
|
|
} |
|
|
|
uvE1 = uvLerp(e1.uv2, e1.uv1, scale1); |
|
|
|
scale1 += setp1; |
|
|
|
//setPixel(x1, y, e1.color2);
|
|
|
|
//setPixel(x1, y, Rgba(255,0,0));
|
|
|
|
|
|
|
|
Span span(x1, x2, y, Rgba(255,255,255), Rgba(255,255,255), uvE1, uvE2); |
|
|
|
Span span(x1, x2, y, Rgba(255, 255, 255), Rgba(255, 255, 255), uvE1, uvE2); |
|
|
|
drawSpan(span, image); |
|
|
|
} |
|
|
|
} |
|
|
@ -166,6 +212,7 @@ void Raster::drawTriangle(const Vertex& vertex, Image* image) { |
|
|
|
for (int i = 1; i < 3; i++) { |
|
|
|
curLength = eges[i].y2 - eges[i].y1; |
|
|
|
if (curLength > length) { |
|
|
|
length = curLength; |
|
|
|
iMax = i; |
|
|
|
} |
|
|
|
} |
|
|
|