#ifndef QUBE_H #define QUBE_H #include #include "../../../geo/Triangle3.h" #include "../../../math/Matrix4.h" class Cube { private: std::vector trias; public: /** ctor */ Cube() { unitCube(true); } /** ctor with position, size and rotation */ Cube(Point3 pos, Point3 size, Point3 rot_deg, const bool topAndBottom = true) { unitCube(topAndBottom); const Matrix4 mRot = Matrix4::getRotationDeg(rot_deg.x, rot_deg.y, rot_deg.z); const Matrix4 mSize = Matrix4::getScale(size.x, size.y, size.z); const Matrix4 mPos = Matrix4::getTranslation(pos.x, pos.y, pos.z); const Matrix4 mat = mPos * mRot * mSize; transform(mat); } /** get the cube's triangles */ const std::vector getTriangles() const { return trias; } void transform(const Matrix4& mat) { for (Triangle3& tria : trias) { Vector4 v1(tria.p1.x, tria.p1.y, tria.p1.z, 1); Vector4 v2(tria.p2.x, tria.p2.y, tria.p2.z, 1); Vector4 v3(tria.p3.x, tria.p3.y, tria.p3.z, 1); v1 = mat*v1; v2 = mat*v2; v3 = mat*v3; tria.p1 = Point3(v1.x, v1.y, v1.z); tria.p2 = Point3(v2.x, v2.y, v2.z); tria.p3 = Point3(v3.x, v3.y, v3.z); } } /** get a transformed version */ Cube transformed(const Matrix4& mat) const { Cube res = *this; res.transform(mat); return res; } private: /** build unit-cube faces */ void unitCube(const bool topAndBottom) { const float s = 1.0f; // left? addQuad( Point3(+s, -s, -s), Point3(+s, -s, +s), Point3(-s, -s, +s), Point3(-s, -s, -s) ); // right? addQuad( Point3(-s, +s, -s), Point3(-s, +s, +s), Point3(+s, +s, +s), Point3(+s, +s, -s) ); // small side if (1 == 1) { // front addQuad( Point3(-s, -s, -s), Point3(-s, -s, +s), Point3(-s, +s, +s), Point3(-s, +s, -s) ); // read addQuad( Point3(+s, +s, -s), Point3(+s, +s, +s), Point3(+s, -s, +s), Point3(+s, -s, -s) ); } if (topAndBottom) { // top addQuad( Point3(+s, +s, +s), Point3(-s, +s, +s), Point3(-s, -s, +s), Point3(+s, -s, +s) ); // bottom addQuad( Point3(+s, -s, -s), Point3(-s, -s, -s), Point3(-s, +s, -s), Point3(+s, +s, -s) ); } } void addQuad(Point3 p1, Point3 p2, Point3 p3, Point3 p4) { trias.push_back( Triangle3(p1,p2,p3) ); trias.push_back( Triangle3(p1,p3,p4) ); } }; #endif // QUBE_H