From 4dc9e783920b64363d62ceea460657793ff5808d Mon Sep 17 00:00:00 2001 From: blobt <380255922@qq.com> Date: Fri, 21 Feb 2020 16:20:48 +0800 Subject: [PATCH] =?UTF-8?q?=E8=81=9A=E9=A4=90=E5=A4=8D=E5=90=88=E6=93=8D?= =?UTF-8?q?=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/4matrix/Raster.cc | 25 +++++++++++++++--- src/4matrix/Raster.h | 4 +++ src/4matrix/matrix.cc | 50 +++++++++++++++++++++++++++++++++--- src/4matrix/struct/tmat3x3.h | 9 +++++++ src/4matrix/struct/tvec3.h | 16 +++++++++--- 5 files changed, 93 insertions(+), 11 deletions(-) diff --git a/src/4matrix/Raster.cc b/src/4matrix/Raster.cc index 7952e15..8accdae 100644 --- a/src/4matrix/Raster.cc +++ b/src/4matrix/Raster.cc @@ -42,6 +42,7 @@ Raster::Raster(int width, int height) { _defaultUvPointer.stride = sizeof (float2); _defaultUvPointer.data = _defaultUvArray; + _matModel = matrix3(1); } Raster::~Raster() { @@ -322,13 +323,23 @@ void Raster::drawArrays(DRAWMODE pri, int start, int count) { for (int i = start; i < start + count; i += 3) { float* pp = (float*) posData; - int2 p0(pp[0], pp[1]); + float3 mp0(pp[0], pp[1],1); + mp0 = _matModel * mp0; + posData += _positionPointer.stride; pp = (float*) posData; - int2 p1(pp[0], pp[1]); + float3 mp1(pp[0], pp[1],1); + mp1 = _matModel * mp1; + posData += _positionPointer.stride; pp = (float*) posData; - int2 p2(pp[0], pp[1]); + float3 mp2(pp[0], pp[1],1); + mp2 = _matModel * mp2; + + int2 p0(mp0.x,mp0.y); + int2 p1(mp1.x,mp1.y); + int2 p2(mp2.x,mp2.y); + posData += _positionPointer.stride; Rgba* pc = (Rgba*) cData; @@ -371,6 +382,14 @@ void Raster::drawArrays(DRAWMODE pri, int start, int count) { } +void Raster::loadMatrix(const matrix3& mat){ + _matModel = mat; +} + +void Raster::loadIdentity(){ + _matModel = matrix3(1); +} + void Raster::bindTexture(Image* image) { _texture = image; } diff --git a/src/4matrix/Raster.h b/src/4matrix/Raster.h index a480e66..60d840a 100644 --- a/src/4matrix/Raster.h +++ b/src/4matrix/Raster.h @@ -139,6 +139,8 @@ public: void drawTriangle(Ege eges[3], Image* image); void drawArrays(DRAWMODE pri, int start, int count); void bindTexture(Image* image); + void loadMatrix(const matrix3& mat); + void loadIdentity(); int size(); void clean(); bool setPixel(int x, int y, Rgba color); @@ -149,6 +151,8 @@ private: int _height; Rgba _color; Image* _texture; + + matrix3 _matModel; DataElementDes _positionPointer; DataElementDes _colorPointer; diff --git a/src/4matrix/matrix.cc b/src/4matrix/matrix.cc index 7d90629..9ef4c21 100644 --- a/src/4matrix/matrix.cc +++ b/src/4matrix/matrix.cc @@ -20,9 +20,51 @@ struct Vertex { Rgba color; }; -/** - * - */ +void example3() { + Vertex vertexs[] = { + {-10, -10, 0.0f, 0.0f, Rgba(255, 0, 0, 255)}, + {210, 210, 1.0f, 1.0f, Rgba(255, 0, 0, 255)}, + {210, -10, 1.0f, 0.0f, Rgba(255, 0, 0, 255)}, + + {-10, -10, 0.0f, 0.0f, Rgba(255, 255, 255, 255)}, + {210, 210, 1.0f, 1.0f, Rgba(255, 255, 255, 255)}, + {-10, 210, 0.0f, 1.0f, Rgba(255, 255, 255, 255)}, + }; + + matrix3 tranMat1; + tranMat1.translate(-110, -110); + + matrix3 mat; + static float angle = 0; + mat.rotate(angle); + angle += 0.5; + + matrix3 scaleMat; + scaleMat.scale(0.5f, 0.5f); + + matrix3 tranMat2; + tranMat2.translate(110, 110); + + + matrix3 all = tranMat2 * (mat * scaleMat * tranMat1); + + raster.loadMatrix(all); + + //raster.loadIdentity(); + + Image* image = Image::loadFromFile("/home/blobt/Documents/dev/cpp/3dbase/image/scale.jpg"); + + + raster.bindTexture(image); + + raster.vertexPointer(2, DT_FLOAT, sizeof (Vertex), &vertexs[0].x); + raster.colorPointer(4, DT_BYTE, sizeof (Vertex), &vertexs[0].color); + raster.textureCoordPointer(2, DT_FLOAT, sizeof (Vertex), &vertexs[0].u); + + + raster.drawArrays(DM_TRIANGES, 0, 6); +} + void example2() { Vertex vertexs[] = { {-10, -10, 0.0f, 0.0f, Rgba(255, 0, 0, 255)}, @@ -87,7 +129,7 @@ void example1() { unsigned char* makeBitmap() { raster.clean(); - example2(); + example3(); return (unsigned char*) raster.buffer; } diff --git a/src/4matrix/struct/tmat3x3.h b/src/4matrix/struct/tmat3x3.h index 435cc8d..8039e9a 100644 --- a/src/4matrix/struct/tmat3x3.h +++ b/src/4matrix/struct/tmat3x3.h @@ -63,6 +63,7 @@ public: value[2] = col_type(zero, zero, s); } + tmat3x3( value_type const &x0, value_type const &y0, value_type const &z0, value_type const &x1, value_type const &y1, value_type const &z1, @@ -93,6 +94,14 @@ public: value[0] = s[0]; value[1] = s[1]; value[2] = s[2]; + return *this; + } + + type const &operator=(type const & s) { + value[0] = s[0]; + value[1] = s[1]; + value[2] = s[2]; + return *this; } tvec3 operator*(const tvec3 &s) const { diff --git a/src/4matrix/struct/tvec3.h b/src/4matrix/struct/tvec3.h index 216f667..9c447e1 100644 --- a/src/4matrix/struct/tvec3.h +++ b/src/4matrix/struct/tvec3.h @@ -70,9 +70,9 @@ struct tvec3 { */ template tvec3(U s) { -// x = value_type(s); -// y = value_type(s); -// z = value_type(s); + // x = value_type(s); + // y = value_type(s); + // z = value_type(s); } template @@ -82,7 +82,15 @@ struct tvec3 { z = value_type(s3); } - tvec3& operator=(tvec3 const &s) { + tvec3& operator=(tvec3 &s) { + x = s.x; + y = s.y; + z = s.z; + + return *this; + } + + tvec3 const & operator=(tvec3 const &s) { x = s.x; y = s.y; z = s.z;