/*############################################################################## ## Author: Shaun Reed ## ## Legal: All Content (c) 2022 Shaun Reed, all rights reserved ## ## About: Collection of static mesh data for quick initialization ## ## ## ## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ## ##############################################################################*/ #include Cube::Cube(DrawMode mode) { mDrawMode = mode; switch(mode) { // Cube data for use with glDrawArrays case QTK_DRAW_ARRAYS: mIndices = { /* No indices needed for glDrawArrays */ }; mNormals = {FACE_FRONT, FACE_BACK, FACE_TOP, FACE_BOTTOM, FACE_LEFT, FACE_RIGHT}; mVertices = { // Face 1 (Front) VERTEX_FTR, VERTEX_FTL, VERTEX_FBL, VERTEX_FBL, VERTEX_FBR, VERTEX_FTR, // Face 2 (Back) VERTEX_BBR, VERTEX_BTL, VERTEX_BTR, VERTEX_BTL, VERTEX_BBR, VERTEX_BBL, // Face 3 (Top) VERTEX_FTR, VERTEX_BTR, VERTEX_BTL, VERTEX_BTL, VERTEX_FTL, VERTEX_FTR, // Face 4 (Bottom) VERTEX_FBR, VERTEX_FBL, VERTEX_BBL, VERTEX_BBL, VERTEX_BBR, VERTEX_FBR, // Face 5 (Left) VERTEX_FBL, VERTEX_FTL, VERTEX_BTL, VERTEX_FBL, VERTEX_BTL, VERTEX_BBL, // Face 6 (Right) VERTEX_FTR, VERTEX_FBR, VERTEX_BBR, VERTEX_BBR, VERTEX_BTR, VERTEX_FTR }; mColors = { // Face 1 (Front) RED, GREEN, BLUE, BLUE, WHITE, RED, // Face 2 (Back) YELLOW, CYAN, MAGENTA, CYAN, YELLOW, BLACK, // Face 3 (Top) RED, MAGENTA, CYAN, CYAN, GREEN, RED, // Face 4 (Bottom) WHITE, BLUE, BLACK, BLACK, YELLOW, WHITE, // Face 5 (Left) BLUE, GREEN, CYAN, BLUE, CYAN, BLACK, // Face 6 (Right) RED, WHITE, YELLOW, YELLOW, MAGENTA, RED }; mTexCoords = { // Face 1 (Front) UV_TOP, UV_ORIGIN, UV_RIGHT, UV_RIGHT, UV_CORNER, UV_TOP, // Face 2 (Back) UV_TOP, UV_RIGHT, UV_CORNER, UV_RIGHT, UV_TOP, UV_ORIGIN, // Face 3 (Top) UV_CORNER, UV_TOP, UV_ORIGIN, UV_ORIGIN, UV_RIGHT, UV_CORNER, // Face 4 (Bottom) UV_TOP, UV_ORIGIN, UV_RIGHT, UV_RIGHT, UV_CORNER, UV_TOP, // Face 5 (Left) UV_TOP, UV_CORNER, UV_RIGHT, UV_TOP, UV_RIGHT, UV_ORIGIN, // Face 6 (Right) UV_TOP, UV_CORNER, UV_RIGHT, UV_RIGHT, UV_ORIGIN, UV_TOP }; break; // Cube data for use with glDrawElements case QTK_DRAW_ELEMENTS: mNormals = {/* For normals and glDrawElements, see QTK_DRAW_ELEMENTS_NORMALS */}; mTexCoords = { /* For UVs and glDrawElements, see QTK_DRAW_ELEMENTS_NORMALS */ }; mColors = {RED, GREEN, BLUE, WHITE, YELLOW, CYAN, MAGENTA, BLACK}; mVertices = { // 0 1 2 3 VERTEX_FTR, VERTEX_FTL, VERTEX_FBL, VERTEX_FBR, // 4 5 6 7 VERTEX_BTR, VERTEX_BTL, VERTEX_BBL, VERTEX_BBR }; mIndices = { // Face 1 (Front) 0, 1, 2, 2, 3, 0, // Face 2 (Back) 7, 5, 4, 5, 7, 6, // Face 3 (Top) 0, 4, 5, 5, 1, 0, // Face 4 (Bottom) 3, 2, 6, 6, 7, 3, // Face 5 (Left) 2, 1, 5, 2, 5, 6, // Face 6 (Right) 0, 3, 7, 7, 4, 0 }; break; // Cube shape data for using normals and UVs with glDrawElements case QTK_DRAW_ELEMENTS_NORMALS: mColors = {RED, GREEN, BLUE, WHITE, YELLOW, CYAN, MAGENTA, BLACK}; mVertices = { // Face 1 (Front) // 0 1 2 3 VERTEX_FTL, VERTEX_FBL, VERTEX_FBR, VERTEX_FTR, // Face 2 (Back) // 4 5 6 7 VERTEX_BTL, VERTEX_BBL, VERTEX_BBR, VERTEX_BTR, // Face 3 (Top) // 8 9 10 11 VERTEX_FTL, VERTEX_BTL, VERTEX_BTR, VERTEX_FTR, // Face 4 (Bottom) // 12 13 14 15 VERTEX_FBL, VERTEX_BBL, VERTEX_BBR, VERTEX_FBR, // Face 5 (Left) // 16 17 18 19 VERTEX_FBL, VERTEX_BBL, VERTEX_BTL, VERTEX_FTL, // Face 6 (Right) // 20 21 22 23 VERTEX_FBR, VERTEX_BBR, VERTEX_BTR, VERTEX_FTR }; mIndices = { // Face 1 (Front) 0, 1, 2, 2, 3, 0, // Face 2 (Back) 4, 5, 6, 6, 7, 4, // Face 3 (Top) 8, 9, 10, 10, 11, 8, // Face 4 (Bottom) 12, 13, 14, 14, 15, 12, // Face 5 (Left) 16, 17, 18, 18, 19, 16, // Face 6 (Right) 20, 21, 22, 22, 23, 20 }; mNormals = { VECTOR_FORWARD, VECTOR_FORWARD, VECTOR_FORWARD, VECTOR_FORWARD, VECTOR_BACK, VECTOR_BACK, VECTOR_BACK, VECTOR_BACK, VECTOR_UP, VECTOR_UP, VECTOR_UP, VECTOR_UP, VECTOR_DOWN, VECTOR_DOWN, VECTOR_DOWN, VECTOR_DOWN, VECTOR_LEFT, VECTOR_LEFT, VECTOR_LEFT, VECTOR_LEFT, VECTOR_RIGHT, VECTOR_RIGHT, VECTOR_RIGHT, VECTOR_RIGHT, }; mTexCoords = { // Face 1 (Front) UV_TOP, UV_RIGHT, UV_CORNER, UV_RIGHT, UV_TOP, UV_ORIGIN, // Face 2 (Back) UV_TOP, UV_RIGHT, UV_CORNER, UV_RIGHT, UV_TOP, UV_ORIGIN, // Face 3 (Top) UV_TOP, UV_RIGHT, UV_CORNER, UV_RIGHT, UV_TOP, UV_ORIGIN, // Face 4 (Bottom) UV_TOP, UV_RIGHT, UV_CORNER, UV_RIGHT, UV_TOP, UV_ORIGIN, // Face 5 (Left) UV_TOP, UV_RIGHT, UV_CORNER, UV_RIGHT, UV_TOP, UV_ORIGIN, // Face 6 (Right) UV_TOP, UV_RIGHT, UV_CORNER, UV_RIGHT, UV_TOP, UV_ORIGIN, }; break; } } Triangle::Triangle(DrawMode mode) { mDrawMode = mode; const QVector3D triangleTop = QVector3D(0.0f, 0.5f, 0.0f); switch(mode) { case QTK_DRAW_ARRAYS: mIndices = { /* No indices needed for glDrawArrays */ }; mColors = { RED, GREEN, BLUE, WHITE, YELLOW, CYAN, MAGENTA, BLACK }; mVertices = { // Bottom face (Base of the pyramid) VERTEX_BBL, VERTEX_BBR, VERTEX_FBR, VERTEX_FBR, VERTEX_FBL, VERTEX_BBL, // Front face VERTEX_FBL, VERTEX_FBR, triangleTop, // Back face VERTEX_BBR, VERTEX_BBL, triangleTop, // Left face VERTEX_BBL, VERTEX_FBL, triangleTop, // Right face VERTEX_FBR, VERTEX_BBR, triangleTop, }; // Find normals for each triangle of the mesh for (int i = 0; i < mVertices.size(); i += 3) { QVector3D vertexNormal = QVector3D::normal(mVertices[i], mVertices[i+1], mVertices[i+2]); // Three points share this normal for (int j = 0; j < 3; j++) { mNormals.push_back(vertexNormal); } } mTexCoords = { // Bottom face (Base of the pyramid) UV_ORIGIN, UV_RIGHT, UV_CORNER, UV_CORNER, UV_TOP, UV_ORIGIN, // Front face UV_ORIGIN, UV_RIGHT, UV_CORNER, // Back face UV_ORIGIN, UV_RIGHT, UV_CORNER, // Left face UV_ORIGIN, UV_RIGHT, UV_CORNER, // Right face UV_ORIGIN, UV_RIGHT, UV_CORNER, }; break; // Triangle shape data for using glDrawElements case QTK_DRAW_ELEMENTS: mColors = { RED, GREEN, BLUE, WHITE, YELLOW, CYAN, MAGENTA, BLACK }; mVertices = {VERTEX_FBL, VERTEX_FBR, VERTEX_BBL, VERTEX_BBR, triangleTop}; mIndices = { // Bottom face (Base of the pyramid) 2, 3, 1, // Use customVertexes[2], then 3, 1... 1, 0, 2, // Use customVertexes[1], then 0, 2 0, 1, 4, // Front face 3, 2, 4, // Back face 2, 0, 4, // Left face 1, 3, 4, // Right face }; mNormals = {/* Use QTK_DRAW_ELEMENTS_NORMALS for normals with glDrawElements */}; mTexCoords = { /* No UVs for triangle with glDrawElements */ }; break; // Triangle shape data for using normals and UVs with glDrawElements case QTK_DRAW_ELEMENTS_NORMALS: mColors = { RED, GREEN, BLUE, WHITE, YELLOW, CYAN, MAGENTA, BLACK }; mVertices = { // Bottom face // 0 1 2 VERTEX_FBL, VERTEX_FBR, VERTEX_BBL, // 3 4 5 VERTEX_BBR, VERTEX_FBR, VERTEX_BBL, // Front face // 6 7 8 VERTEX_FBL, VERTEX_FBR, triangleTop, // Back face // 9 10 11 VERTEX_BBR, VERTEX_BBL, triangleTop, // Left face // 12 13 14 VERTEX_BBL, VERTEX_FBL, triangleTop, // Right face // 15 16 17 VERTEX_FBR, VERTEX_BBR, triangleTop, }; mIndices = { // Bottom face (Base of the pyramid) 0, 1, 2, // Use customVertexes[2], then 3, 1... 3, 4, 5, // Use customVertexes[1], then 0, 2 6, 7, 8, // Front face 9, 10, 11, // Back face 12, 13, 14, // Left face 15, 16, 17, // Right face }; // Find normals for each triangle of the mesh for (int i = 0; i < mVertices.size(); i += 3) { QVector3D vertexNormal = QVector3D::normal(mVertices[mIndices[i]], mVertices[mIndices[i+1]], mVertices[mIndices[i+2]]); // Three points share this normal for (int j = 0; j < 3; j++) { mNormals.push_back(vertexNormal); } } mTexCoords = { // Bottom face UV_ORIGIN, UV_RIGHT, UV_TOP, UV_CORNER, UV_RIGHT, UV_TOP, // Front face UV_ORIGIN, UV_RIGHT, UV_CORNER, // Back face UV_ORIGIN, UV_RIGHT, UV_CORNER, // Left face UV_ORIGIN, UV_RIGHT, UV_CORNER, // Right face UV_ORIGIN, UV_RIGHT, UV_CORNER, }; break; } }