diff --git a/src/texture/Image.cc b/src/texture/Image.cc index 67ff8b1..408b713 100644 --- a/src/texture/Image.cc +++ b/src/texture/Image.cc @@ -36,9 +36,9 @@ Rgba Image::pixelAt(int x, int y) const { } Rgba Image::pixelUv(float u, float v) const { - int x = u * _width; - int y = v * _height; - + int x = (u * _width) -1; //不管_width还是_height都是从0开始的, + int y = (v * _height) -1;//所以这里要减去1 + return pixelAt(x, y); //return Rgba(255,0,0); } diff --git a/src/texture/Raster.cc b/src/texture/Raster.cc index dc27742..dfd333c 100644 --- a/src/texture/Raster.cc +++ b/src/texture/Raster.cc @@ -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; } } diff --git a/src/texture/Raster.h b/src/texture/Raster.h index 83d550f..b1e2deb 100644 --- a/src/texture/Raster.h +++ b/src/texture/Raster.h @@ -114,6 +114,7 @@ public: Rgba* buffer; Raster(int width, int height); virtual ~Raster(); + void drawLine(float2 p1, float2 p2, Rgba color); void drawPoint(int x, int y, Rgba color = Rgba(255, 0, 0, 0), int pointSize = 1); void drawSpan(const Span &span, Image* image); void drawEge(const Ege& e1, const Ege& e2, Image* image); diff --git a/src/texture/texture.cc b/src/texture/texture.cc index a26c7ca..2402104 100644 --- a/src/texture/texture.cc +++ b/src/texture/texture.cc @@ -20,13 +20,14 @@ Raster raster(width, height); void example() { Image* image = Image::loadFromFile("/home/blobt/Documents/dev/cpp/3dbase/image/scale.jpg"); - Raster::Vertex ver1 = { - int2(10, 10), float2(0.0f, 0.0f), Rgba(), - int2(10, 110), float2(0.0f, 1.0f), Rgba(), - int2(110, 10), float2(1.0f, 0.0f), Rgba() - }; + Raster::Vertex ver1 = { + int2(10, 10), float2(0.0f, 0.0f), Rgba(), + int2(10, 110), float2(0.0f, 1.0f), Rgba(), + int2(110, 10), float2(1.0f, 0.0f), Rgba() + }; + + raster.drawTriangle(ver1, image); - raster.drawTriangle(ver1, image); Raster::Vertex ver2 = { @@ -37,6 +38,11 @@ void example() { raster.drawTriangle(ver2, image); +// raster.drawPoint(10, 110, Rgba(255, 0, 0, 0), 3); +// raster.drawPoint(110, 10, Rgba(255, 0, 0, 0), 3); + + //raster.drawLine(float2(10, 110), float2(110, 10), Rgba(255, 255, 255)); + delete image; }