diff --git a/CMakeLists.txt b/CMakeLists.txt index 8254d52..67e0201 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,11 +16,6 @@ link_directories(${GTK2_LIBRARY_DIRS}) list(APPEND FC_DEP_LIBS ${GTK2_LIBRARIES}) list(APPEND FC_DEP_LIBS freeimage) -set(commom_src - Rgba.cc - Raster.cc - Image.cc -) - -add_subdirectory(src) +#add_subdirectory(src/raster) +add_subdirectory(src/texture) diff --git a/image/1.jpg b/image/1.jpg new file mode 100644 index 0000000..edf0e81 Binary files /dev/null and b/image/1.jpg differ diff --git a/image/bg.png b/image/bg.png new file mode 100644 index 0000000..83ebbf0 Binary files /dev/null and b/image/bg.png differ diff --git a/image/bg.psd b/image/bg.psd new file mode 100644 index 0000000..a0e4ce4 Binary files /dev/null and b/image/bg.psd differ diff --git a/image/colorKey.bmp b/image/colorKey.bmp new file mode 100644 index 0000000..f67e8a0 Binary files /dev/null and b/image/colorKey.bmp differ diff --git a/image/colorKey.png b/image/colorKey.png new file mode 100644 index 0000000..9d79a4d Binary files /dev/null and b/image/colorKey.png differ diff --git a/image/grass.png b/image/grass.png new file mode 100644 index 0000000..3ecbce1 Binary files /dev/null and b/image/grass.png differ diff --git a/image/scale.jpg b/image/scale.jpg new file mode 100644 index 0000000..c6cf126 Binary files /dev/null and b/image/scale.jpg differ diff --git a/image/test.bmp b/image/test.bmp new file mode 100644 index 0000000..f23ba8c Binary files /dev/null and b/image/test.bmp differ diff --git a/src/CELLMath.hpp b/src/raster/CELLMath.hpp similarity index 100% rename from src/CELLMath.hpp rename to src/raster/CELLMath.hpp diff --git a/src/CMakeLists.txt b/src/raster/CMakeLists.txt similarity index 89% rename from src/CMakeLists.txt rename to src/raster/CMakeLists.txt index c1cd2e4..7b83a64 100644 --- a/src/CMakeLists.txt +++ b/src/raster/CMakeLists.txt @@ -1,3 +1,9 @@ +set(commom_src + Rgba.cc + Raster.cc + Image.cc +) + add_executable(draw_image draw_image.cc ${commom_src}) target_link_libraries (draw_image ${FC_DEP_LIBS}) diff --git a/src/Image.cc b/src/raster/Image.cc similarity index 100% rename from src/Image.cc rename to src/raster/Image.cc diff --git a/src/Image.h b/src/raster/Image.h similarity index 100% rename from src/Image.h rename to src/raster/Image.h diff --git a/src/Raster.cc b/src/raster/Raster.cc similarity index 91% rename from src/Raster.cc rename to src/raster/Raster.cc index b5e2da2..a886afc 100644 --- a/src/Raster.cc +++ b/src/raster/Raster.cc @@ -359,6 +359,36 @@ void Raster::drawImage(int startX, int startY, const Image* image) { } } +void Raster::drawImage(int startX, int startY, const Image* image, int px, int py, int pw, int ph) { + /*越界部分不描画*/ + int left = tmax(startX, 0); + int bottom = tmax(startY, 0); + + int right = tmin(startX + pw, _width); + int top = tmin(startY + ph, _height); + + for (int x = left; x < right; x++) { + for (int y = bottom; y < top; y++) { + Rgba color = image->pixelAt(x - left + px, y - bottom + py); + setPixel(x, y, color); + } + } +} + +void Raster::drawImageScale(int startX, int startY, int scaleW, int scaleH, const Image* image) { + float xScale = (float) image->width() / (float) scaleW; + float yScale = (float) image->height() / (float) scaleH; + + for (int x = startX; x < startX + scaleW; x++) { + for (int y = startY; y < startY + scaleH; y++) { + int px = (x - startX) * xScale; + int py = (y - startY) * yScale; + Rgba color = image->pixelAt(px, py); + setPixel(x, y, color); + } + } +} + void Raster::drawImageWithKey(int startX, int startY, const Image* image, Rgba key) { /*越界部分不描画*/ int left = tmax(startX, 0); diff --git a/src/Raster.h b/src/raster/Raster.h similarity index 93% rename from src/Raster.h rename to src/raster/Raster.h index a0ef514..c983baa 100644 --- a/src/Raster.h +++ b/src/raster/Raster.h @@ -96,6 +96,8 @@ public: void drawFilledRect(int startX, int startY, int width, int height); void drawRect(const int2* points, const Rgba* colors); void drawImage(int startX, int startY, const Image* image); + void drawImage(int startX, int startY, const Image* image, int px, int py, int pw, int ph); + void drawImageScale(int startX, int startY, int scaleW, int scaleH, const Image* image); void drawImageWithKey(int startX, int startY, const Image* image, Rgba key); void drawImageAlphaTest(int startX, int startY, const Image* image, byte key); void drawImageAlphaBlend(int startX, int startY, const Image* image, float alpha = 1); diff --git a/src/Rgba.cc b/src/raster/Rgba.cc similarity index 100% rename from src/Rgba.cc rename to src/raster/Rgba.cc diff --git a/src/Rgba.h b/src/raster/Rgba.h similarity index 100% rename from src/Rgba.h rename to src/raster/Rgba.h diff --git a/src/common.h b/src/raster/common.h similarity index 100% rename from src/common.h rename to src/raster/common.h diff --git a/src/draw_filled_rect.cc b/src/raster/draw_filled_rect.cc similarity index 100% rename from src/draw_filled_rect.cc rename to src/raster/draw_filled_rect.cc diff --git a/src/draw_image.cc b/src/raster/draw_image.cc similarity index 77% rename from src/draw_image.cc rename to src/raster/draw_image.cc index e0c574e..37cc746 100644 --- a/src/draw_image.cc +++ b/src/raster/draw_image.cc @@ -18,7 +18,7 @@ Raster raster(width, height); void example1() { //画背景 - Image* image1 = Image::loadFromFile("/home/blobt/Documents/dev/cpp/3dbase/build/bin/image/bg.png"); + Image* image1 = Image::loadFromFile("/home/blobt/Documents/dev/cpp/3dbase/image/bg.png"); raster.drawImage(0, 0, image1); delete image1; @@ -30,12 +30,32 @@ void example1() { //画草 Image* image3 = Image::loadFromFile("/home/blobt/Documents/dev/cpp/3dbase/build/bin/image/grass.png"); //raster.drawImageAlphaTest(400, 250, image3, 100); - raster.drawImageAlphaBlend(400, 250, image3,0.5); + raster.drawImageAlphaBlend(400, 250, image3, 0.5); delete image3; } void example2() { + Image* imageBg = Image::loadFromFile("/home/blobt/Documents/dev/cpp/3dbase/image/bg.png"); + raster.drawImage(0, 0, imageBg); + delete imageBg; + + Image* image = Image::loadFromFile("/home/blobt/Documents/dev/cpp/3dbase/image/bg.png"); + raster.drawImage(100, 100, image, 400, 50, 100, 100); + delete image; +} + +void example3() { + Image* imageBg = Image::loadFromFile("/home/blobt/Documents/dev/cpp/3dbase/image/bg.png"); + raster.drawImage(0, 0, imageBg); + delete imageBg; + + Image* image = Image::loadFromFile("/home/blobt/Documents/dev/cpp/3dbase/build/bin/image/scale.jpg"); + raster.drawImageScale(100, 100, 300, 300, image); + delete image; +} + +void example4() { int left = 0; int bottom = 0; @@ -67,7 +87,7 @@ void example2() { unsigned char* makeBitmap() { raster.clean(); - example1(); + example3(); return (unsigned char*) raster.buffer; } diff --git a/src/draw_rect.cc b/src/raster/draw_rect.cc similarity index 100% rename from src/draw_rect.cc rename to src/raster/draw_rect.cc diff --git a/src/draw_triangle.cc b/src/raster/draw_triangle.cc similarity index 100% rename from src/draw_triangle.cc rename to src/raster/draw_triangle.cc diff --git a/src/drawbezzier.cc b/src/raster/drawbezzier.cc similarity index 100% rename from src/drawbezzier.cc rename to src/raster/drawbezzier.cc diff --git a/src/drawline.cc b/src/raster/drawline.cc similarity index 100% rename from src/drawline.cc rename to src/raster/drawline.cc diff --git a/src/gtktest.cc b/src/raster/gtktest.cc similarity index 100% rename from src/gtktest.cc rename to src/raster/gtktest.cc diff --git a/src/timer.cc b/src/raster/timer.cc similarity index 100% rename from src/timer.cc rename to src/raster/timer.cc diff --git a/src/tt.cc b/src/raster/tt.cc similarity index 100% rename from src/tt.cc rename to src/raster/tt.cc diff --git a/src/texture/CMakeLists.txt b/src/texture/CMakeLists.txt new file mode 100644 index 0000000..5428f06 --- /dev/null +++ b/src/texture/CMakeLists.txt @@ -0,0 +1,8 @@ +set(commom_src + Rgba.cc + Raster.cc + Image.cc +) + +add_executable(texture texture.cc ${commom_src}) +target_link_libraries (texture ${FC_DEP_LIBS}) diff --git a/src/texture/Image.cc b/src/texture/Image.cc new file mode 100644 index 0000000..67ff8b1 --- /dev/null +++ b/src/texture/Image.cc @@ -0,0 +1,44 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +/* + * File: Image.cc + * Author: Blobt + * + * Created on February 10, 2020, 5:55 PM + */ + +#include "Image.h" +#include + +Image::Image(int width, int height, void* data) { + if (width == 0 || height == 0 || data == 0) { + _width = 0; + _height = 0; + _pixel = 0; + } else { + _width = width; + _height = height; + _pixel = new unsigned int[width * height]; + memcpy(_pixel, data, width * height * sizeof (unsigned int)); + } +} + +Image::~Image() { + delete [] _pixel; +} + +Rgba Image::pixelAt(int x, int y) const { + return Rgba(_pixel[y * _width + x]); +} + +Rgba Image::pixelUv(float u, float v) const { + int x = u * _width; + int y = v * _height; + + return pixelAt(x, y); + //return Rgba(255,0,0); +} diff --git a/src/texture/Image.h b/src/texture/Image.h new file mode 100644 index 0000000..15b800e --- /dev/null +++ b/src/texture/Image.h @@ -0,0 +1,78 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +/* + * File: Image.h + * Author: Blobt + * + * Created on February 10, 2020, 5:55 PM + */ + +#ifndef IMAGE_H +#define IMAGE_H +#include "common.h" +#include "Rgba.h" +#include "FreeImage.h" +#include "stdio.h" + +class Image { +public: + Image(int width, int height, void* data); + virtual ~Image(); + + int width() const { + return _width; + } + + int height() const { + return _height; + } + + Rgba pixelAt(int x, int y) const; + + Rgba pixelUv(float u, float v) const; + + static Image* loadFromFile(const char* fileName) { + + //检查文件类型 + FREE_IMAGE_FORMAT fifmt = FreeImage_GetFileType(fileName, 0); + if (fifmt == FIF_UNKNOWN) { + die("FreeImage_GetFileType"); + } + + //获取 + FIBITMAP* dib = FreeImage_Load(fifmt, fileName, 0); + + //转换 + FIBITMAP* temp = dib; + dib = FreeImage_ConvertTo32Bits(dib); + FreeImage_Unload(temp); + + + BYTE* pixels = (BYTE*) FreeImage_GetBits(dib); + int width = FreeImage_GetWidth(dib); + int height = FreeImage_GetHeight(dib); + + //颜色为数调换 + for (int i = 0; i < width * height * 4; i += 4) { + BYTE temp = pixels[i]; + pixels[i] = pixels[i + 2]; + pixels[i + 2] = temp; + } + + Image* image = new Image(width, height, (void*) pixels); + FreeImage_Unload(dib); + + return image; + + } +private: + int _width; + int _height; + unsigned int* _pixel; +}; +#endif /* IMAGE_H */ + diff --git a/src/texture/Raster.cc b/src/texture/Raster.cc new file mode 100644 index 0000000..dc27742 --- /dev/null +++ b/src/texture/Raster.cc @@ -0,0 +1,205 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +/* + * File: Raster.cc + * Author: blobt + * + * Created on January 23, 2020, 6:00 PM + */ + +#include "Rgba.h" +#include "Raster.h" +#include "Image.h" +#include +#include +#include +#include + +using namespace std; + +Raster::Raster(int width, int height) { + _width = width; + _height = height; + + buffer = new Rgba[width * height]; +} + +Raster::~Raster() { + delete buffer; +} + +void Raster::drawPoint(int x, int y, Rgba color, int pointSize) { + switch (pointSize) { + case 1: + setPixel(x, y, color); + break; + case 2: + setPixel(x, y, color); + setPixel(x + 1, y, color); + setPixel(x, y + 1, color); + setPixel(x + 1, y + 1, color); + break; + case 3: + setPixel(x - 1, y - 1, color); + setPixel(x, y - 1, color); + setPixel(x + 1, y - 1, color); + + setPixel(x - 1, y, color); + setPixel(x, y, color); + setPixel(x + 1, y, color); + + setPixel(x - 1, y + 1, color); + setPixel(x, y + 1, color); + setPixel(x + 1, y + 1, color); + break; + } +} + +/** + * 画一条平行于x轴的直线 + * @param span + */ +void Raster::drawSpan(const Span &span, Image* image) { + //float length = tmax(span.xStart - span.xEnd, 1); //取保length不为0 + + Rgba color; + float2 uv; + float scale; + float length = span.xEnd - span.xStart; + + + int startX = tmax(span.xStart, 0); + int endX = tmin(span.xEnd, _width); + + int t = 0; + //优化3 x轴越界处理 + for (int i = startX; i <= endX; i++) { + + + if (length == 0) { + scale = 0; + } else { + scale = (float) (i - startX) / length; + } + + uv = uvLerp(span.uvStart, span.uvEnd, scale); + + color = image->pixelUv(uv.x, uv.y); + setPixel(i, span.y, color); + } +} + +void Raster::drawEge(const Ege& e1, const Ege& e2, Image* image) { + + float xOffset1 = fabs(e1.x2 - e1.x1); + float yOffset1 = fabs(e1.y2 - e1.y1); + float setp1 = 1 / yOffset1; + float scale1 = (e1.y2 - e2.y2) / yOffset1; //TODO:yOffset1 不能为0 + + float xOffset2 = fabs(e2.x2 - e2.x1); + float yOffset2 = fabs(e2.y2 - e2.y1); + float setp2 = 1 / yOffset2; //TODO:yOffset2 不能为0 + float scale2 = 0; + + + //优化2 y轴越界处理 + int startY2 = tmin(e2.y2, _height); + int endY2 = tmax(e2.y1, 0); + scale2 = (e2.y2 - startY2) / yOffset2; + + int startY1 = tmin(e1.y2, _height); + float s = (e1.y2 - startY1) / yOffset1; + scale1 = tmax(scale1, s); + + float2 uvE1; + float2 uvE2; + for (int y = startY2; y > endY2; y--) { + + int x2; + if (e2.x2 < e2.x1) { + x2 = e2.x2 + xOffset2 * scale2; + } else { + x2 = e2.x2 - xOffset2 * scale2; + } + uvE2 = uvLerp(e2.uv2, e2.uv1, scale2); + scale2 += setp2; + //setPixel(x2, y, e2.color2); + + + int x1; + if (e1.x2 < e1.x1) { + x1 = e1.x2 + xOffset1 * scale1; + } else { + x1 = e1.x2 - xOffset1 * scale1; + } + uvE1 = uvLerp(e1.uv2, e1.uv1, scale1); + scale1 += setp1; + //setPixel(x1, y, e1.color2); + + Span span(x1, x2, y, Rgba(255,255,255), Rgba(255,255,255), uvE1, uvE2); + drawSpan(span, image); + } +} + +void Raster::drawTriangle(const Vertex& vertex, Image* image) { + + //优化1 不画3个点都不在坐标内的三角形 + if (!isIn(vertex.p0) && !isIn(vertex.p1) && !isIn(vertex.p2)) { + return; + } + + Ege eges[3] = { + Ege(vertex.p0.x, vertex.p0.y, vertex.p1.x, vertex.p1.y, vertex.c0, vertex.c1, vertex.uv0, vertex.uv1), + Ege(vertex.p1.x, vertex.p1.y, vertex.p2.x, vertex.p2.y, vertex.c1, vertex.c2, vertex.uv1, vertex.uv2), + Ege(vertex.p2.x, vertex.p2.y, vertex.p0.x, vertex.p0.y, vertex.c2, vertex.c0, vertex.uv2, vertex.uv0), + }; + + int iMax = 0; + int length = eges[0].y2 - eges[0].y1; + + int curLength = 0; + + for (int i = 1; i < 3; i++) { + curLength = eges[i].y2 - eges[i].y1; + if (curLength > length) { + iMax = i; + } + } + + int iShort1 = (iMax + 1) % 3; + int iShort2 = (iMax + 2) % 3; + + drawEge(eges[iMax], eges[iShort1], image); + drawEge(eges[iMax], eges[iShort2], image); +} + +int Raster::size() { + return _width * _height * sizeof (Rgba); +} + +void Raster::clean() { + memset(buffer, 0, size()); +} + +bool Raster::setPixel(int x, int y, Rgba color) { + if (x < 0 || y < 0 || x >= _width || y >= _height) { + return false; + } + //行列是反的 + buffer[ ((_height - 1) - y) * _width + x] = color; +} + +Rgba Raster::getPixel(int x, int y) { + return buffer[ ((_height - 1) - y) * _width + x]; +} + +bool Raster::isIn(int2 point) { + if (point.x >= 0 && point.x <= _width && point.y >= 0 && point.y < _height) { + return true; + } + return false; +} \ No newline at end of file diff --git a/src/texture/Raster.h b/src/texture/Raster.h new file mode 100644 index 0000000..83d550f --- /dev/null +++ b/src/texture/Raster.h @@ -0,0 +1,132 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +/* + * File: Rester.h + * Author: blobt + * + * Created on January 23, 2020, 6:00 PM + */ + +#ifndef RESTER_H +#define RESTER_H + +#include "common.h" +#include "Rgba.h" +#include "Image.h" + +enum DRAWMODE { + DM_POINTS = 0, + DM_LINES = 1, + DM_LINES_LOOP = 2, + DM_LINES_TRIP = 3 +}; + +class Span { +public: + int xStart; + int xEnd; + int y; + + float2 uvStart; + float2 uvEnd; + + Rgba color1; + Rgba color2; + + Span(int xStart, int xEnd, int y, Rgba color1, Rgba color2, float2 uvStart, float2 uvEnd) { + + if (xStart < xEnd) { + this->xStart = xStart; + this->xEnd = xEnd; + this->uvStart = uvStart; + this->uvEnd = uvEnd; + this->color1 = color1; + this->color2 = color2; + } else { + this->xStart = xEnd; + this->xEnd = xStart; + this->uvStart = uvEnd; + this->uvEnd = uvStart; + this->color1 = color2; + this->color2 = color1; + } + + this->y = y; + } +}; + +class Ege { +public: + int x1; + int y1; + float2 uv1; + Rgba color1; + + int x2; + int y2; + float2 uv2; + Rgba color2; + + Ege(int x1, int y1, int x2, int y2, Rgba color1, Rgba color2, float2 uv1, float2 uv2) { + if (y1 < y2) { + this->x1 = x1; + this->y1 = y1; + this->x2 = x2; + this->y2 = y2; + this->uv1 = uv1; + this->uv2 = uv2; + this->color1 = color1; + this->color2 = color2; + } else { + this->x1 = x2; + this->y1 = y2; + this->x2 = x1; + this->y2 = y1; + this->uv1 = uv2; + this->uv2 = uv1; + this->color1 = color2; + this->color2 = color1; + } + } +}; + +class Raster { + +public: + struct Vertex { + int2 p0; + float2 uv0; + Rgba c0; + + int2 p1; + float2 uv1; + Rgba c1; + + int2 p2; + float2 uv2; + Rgba c2; + }; +public: + Rgba* buffer; + Raster(int width, int height); + virtual ~Raster(); + 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); + void drawTriangle(const Vertex& vertex, Image* image); + int size(); + void clean(); + bool setPixel(int x, int y, Rgba color); + Rgba getPixel(int x, int y); + bool isIn(int2 point); +private: + int _width; + int _height; +}; + +#endif /* RESTER_H */ + diff --git a/src/texture/Rgba.cc b/src/texture/Rgba.cc new file mode 100644 index 0000000..c99bf47 --- /dev/null +++ b/src/texture/Rgba.cc @@ -0,0 +1,76 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +/* + * File: Rgba.cc + * Author: Blobt + * + * Created on January 22, 2020, 11:36 PM + */ + +#include +#include +#include "Rgba.h" + +using namespace std; + +Rgba::Rgba(unsigned char r, unsigned char g, unsigned char b, unsigned char a) { + _r = r; + _g = g; + _b = b; + _a = a; +} + +Rgba::Rgba(unsigned int rgba) { + _color = rgba; +} + +bool operator==(Rgba &left, Rgba &right) { + return left._a == right._a && left._b == right._b && left._g == right._g && left._r == right._r; +} + +bool operator!=(Rgba &left, Rgba &right) { + return left._a != right._a || left._b != right._b || left._g != right._g || left._r != right._r; +} + +Rgba::operator unsigned() { + unsigned int ret; + + unsigned char* p = (unsigned char*) &ret; + p[0] = _r; + p[1] = _g; + p[2] = _b; + p[3] = _a; + + //bitset<32> set = ret; + //cout << set << endl; + + return ret; +} + +Rgba::operator int() { + int ret; + + unsigned char* p = (unsigned char*) &ret; + p[0] = _r; + p[1] = _g; + p[2] = _b; + p[3] = _a; + + return ret; +} + +Rgba::operator long() { + long ret; + + unsigned char* p = (unsigned char*) &ret; + p[0] = _r; + p[1] = _g; + p[2] = _b; + p[3] = _a; + + return ret; +} \ No newline at end of file diff --git a/src/texture/Rgba.h b/src/texture/Rgba.h new file mode 100644 index 0000000..d6ab5a3 --- /dev/null +++ b/src/texture/Rgba.h @@ -0,0 +1,44 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +/* + * File: Rgba.h + * Author: Blobt + * + * Created on January 22, 2020, 11:36 PM + */ + +#ifndef RGBA_H +#define RGBA_H + +#include "stdio.h" + +class Rgba { +public: + Rgba(unsigned char r = 0, unsigned char g = 0, unsigned char b = 0, unsigned char a = 255); + Rgba(unsigned int rgba); + friend bool operator==(Rgba &left, Rgba &right); + friend bool operator!=(Rgba &left, Rgba &righe); + operator unsigned(); + operator int(); + operator long(); +public: + + /*这里使用了联合,可以是类能使用unsigned int 直接赋值*/ + union { + + struct { + unsigned char _r; + unsigned char _g; + unsigned char _b; + unsigned char _a; + }; + unsigned int _color; + }; +}; + +#endif /* RGBA_H */ + diff --git a/src/texture/common.h b/src/texture/common.h new file mode 100644 index 0000000..d51a002 --- /dev/null +++ b/src/texture/common.h @@ -0,0 +1,99 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ + +/* + * File: common.h + * Author: Blobt + * + * Created on October 5, 2019, 4:55 PM + */ + +#ifndef COMMON_H +#define COMMON_H + +#include +#include +#include +#include "Rgba.h" + +#define die(m) do { perror(m); exit(EXIT_FAILURE); } while(0) +#define def2rad(theta) (0.01745329251994329 * (theta)) //每个角度所对应的弧度 + +template inline T tmin(T a, T b) { + return a < b ? a : b; +} + +template inline T tmax(T a, T b) { + return a > b ? a : b; +} + +template +struct tvec2 { + typedef T value_type; + typedef std::size_t size_type; + typedef tvec2 type; + + value_type x; + value_type y; + + size_type length() const { + return 2; + } + + value_type operator[](size_type i) { + assert(i < this->length()); + return (&x)[i]; + } + + tvec2() { + x = 0; + y = 0; + } + + tvec2(const value_type &s) { + x = s; + y = s; + } + + tvec2(const value_type &s1, const value_type &s2) { + x = s1; + y = s2; + } +}; + + +typedef tvec2 float2; +typedef tvec2 int2; +typedef unsigned char byte; + +inline Rgba colorLerp(const Rgba& color1, const Rgba& color2, float step) { + Rgba ret; + + ret._r = (unsigned char) color1._r + step * (color2._r - color1._r); + ret._g = (unsigned char) color1._g + step * (color2._g - color1._g); + ret._b = (unsigned char) color1._b + step * (color2._b - color1._b); + ret._a = (unsigned char) color1._a + step * (color2._a - color1._a); + + return ret; +} + +inline float2 uvLerp(const float2& uv1, const float2& uv2, float step) { + + if(step < 0 || step > 1){ + printf("step : %f\n", step); + die("step must more than zero and less than 1"); + } + + float2 ret; + + ret.x = (float) uv1.x + (uv2.x - uv1.x) * step; + ret.y = (float) uv1.y + (uv2.y - uv1.y) * step; + + return ret; +} + +#endif /* COMMON_H */ + diff --git a/src/texture/texture.cc b/src/texture/texture.cc new file mode 100644 index 0000000..a26c7ca --- /dev/null +++ b/src/texture/texture.cc @@ -0,0 +1,94 @@ +#include +#include +#include +#include +#include "Rgba.h" +#include "Raster.h" +#include "common.h" + +using namespace std; + + +gint height = 500; +gint width = 500; + +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.drawTriangle(ver1, image); + + + Raster::Vertex ver2 = { + int2(10, 110), float2(0.0f, 1.0f), Rgba(), + int2(110, 110), float2(1.0f, 1.0f), Rgba(), + int2(110, 10), float2(1.0f, 0.0f), Rgba() + }; + + raster.drawTriangle(ver2, image); + + delete image; +} + +unsigned char* makeBitmap() { + raster.clean(); + + example(); + + return (unsigned char*) raster.buffer; +} + +void render(GtkWidget *widget) { + //允许窗口可以绘图 + gtk_widget_set_app_paintable(widget, TRUE); + gtk_widget_realize(widget); + gtk_widget_queue_draw(widget); + + //模拟一张图片 + unsigned char* data = makeBitmap(); + + GdkPixbuf *pixbuf = gdk_pixbuf_new_from_data(data, GDK_COLORSPACE_RGB, TRUE, 8, width, height, width * 4, NULL, NULL); + + GdkPixmap *pixmap = NULL; + + gdk_pixbuf_render_pixmap_and_mask(pixbuf, &pixmap, NULL, 128); + + gdk_window_set_back_pixmap(widget->window, pixmap, FALSE); + + g_object_unref(pixbuf); + g_object_unref(pixmap); + //delete data; +} + +int main(int argc, char* argv[]) { + + gtk_init(&argc, &argv); + + //创建窗口 + GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_widget_set_size_request(window, width, height); + + gtk_window_set_title(GTK_WINDOW(window), "Gtk testing"); + gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER_ALWAYS); + + //窗口关闭时候,关闭程序 + g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); + //设置渲染 + g_signal_connect(window, "expose-event", G_CALLBACK(render), window); + + + gtk_widget_show_all(window); + gtk_main(); + + return 0; +} diff --git a/src/texture/tt.cc b/src/texture/tt.cc new file mode 100644 index 0000000..39caeff --- /dev/null +++ b/src/texture/tt.cc @@ -0,0 +1,38 @@ +#include "Rgba.h" +#include +#include +#include +#include +#include "common.h" + +using namespace std; + +struct Ms { + int x; + int y; + + int operator[](int i) { + return (&x)[i]; + } +}; + +int main() { + /*tvec2 x(2, 6); + cout << x[0] << endl;*/ + + /*int y = 67305985; + + bitset<32> set = y; + cout << set << endl; + + unsigned char* p; + + p = (unsigned char*) &y; + + cout << (int) p[3] << endl;*/ + + + float2 x(2.0, 1.2); + + cout << x[0] << endl; +}