#include "ViewCube.h" #include #include ViewCube::ViewCube() { } void ViewCube::initializeGL() { initializeOpenGLFunctions(); createFaceTextures(); } void ViewCube::paintGL(const QMatrix4x4& viewMatrix, int width, int height) { int viewCubeSize = 150; glViewport(width - viewCubeSize, height - viewCubeSize, viewCubeSize, viewCubeSize); glClear(GL_DEPTH_BUFFER_BIT); QMatrix4x4 viewCubeProjection; viewCubeProjection.ortho(-2, 2, -2, 2, -10, 10); glMatrixMode(GL_PROJECTION); glLoadMatrixf(viewCubeProjection.constData()); glMatrixMode(GL_MODELVIEW); glLoadMatrixf(viewMatrix.constData()); drawViewCube(); drawAxes(); } void ViewCube::createFaceTextures() { QStringList labels = {"FRONT", "BACK", "TOP", "BOTTOM", "RIGHT", "LEFT"}; glGenTextures(6, faceTextures); for (int i = 0; i < 6; ++i) { QImage image(128, 128, QImage::Format_RGBA8888); image.fill(qRgba(204, 204, 204, 255)); // light gray background QPainter painter(&image); painter.setPen(Qt::black); painter.setFont(QFont("Arial", 24, QFont::Bold)); painter.drawText(image.rect(), Qt::AlignCenter, labels[i]); QImage glImage = image.mirrored(false, true); glBindTexture(GL_TEXTURE_2D, faceTextures[i]); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, glImage.width(), glImage.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, glImage.bits()); } } void ViewCube::drawViewCube() { float size = 0.75; glEnable(GL_TEXTURE_2D); glColor3f(1.0, 1.0, 1.0); // Use white so texture colors are not modulated // Front face glBindTexture(GL_TEXTURE_2D, faceTextures[0]); glBegin(GL_QUADS); glTexCoord2f(0.0, 0.0); glVertex3f(-size, -size, size); glTexCoord2f(1.0, 0.0); glVertex3f(size, -size, size); glTexCoord2f(1.0, 1.0); glVertex3f(size, size, size); glTexCoord2f(0.0, 1.0); glVertex3f(-size, size, size); glEnd(); // Back face glBindTexture(GL_TEXTURE_2D, faceTextures[1]); glBegin(GL_QUADS); glTexCoord2f(1.0, 0.0); glVertex3f(-size, -size, -size); glTexCoord2f(1.0, 1.0); glVertex3f(-size, size, -size); glTexCoord2f(0.0, 1.0); glVertex3f(size, size, -size); glTexCoord2f(0.0, 0.0); glVertex3f(size, -size, -size); glEnd(); // Top face glBindTexture(GL_TEXTURE_2D, faceTextures[2]); glBegin(GL_QUADS); glTexCoord2f(0.0, 1.0); glVertex3f(-size, size, -size); glTexCoord2f(0.0, 0.0); glVertex3f(-size, size, size); glTexCoord2f(1.0, 0.0); glVertex3f(size, size, size); glTexCoord2f(1.0, 1.0); glVertex3f(size, size, -size); glEnd(); // Bottom face glBindTexture(GL_TEXTURE_2D, faceTextures[3]); glBegin(GL_QUADS); glTexCoord2f(1.0, 1.0); glVertex3f(-size, -size, -size); glTexCoord2f(0.0, 1.0); glVertex3f(size, -size, -size); glTexCoord2f(0.0, 0.0); glVertex3f(size, -size, size); glTexCoord2f(1.0, 0.0); glVertex3f(-size, -size, size); glEnd(); // Right face glBindTexture(GL_TEXTURE_2D, faceTextures[4]); glBegin(GL_QUADS); glTexCoord2f(1.0, 0.0); glVertex3f(size, -size, -size); glTexCoord2f(1.0, 1.0); glVertex3f(size, size, -size); glTexCoord2f(0.0, 1.0); glVertex3f(size, size, size); glTexCoord2f(0.0, 0.0); glVertex3f(size, -size, size); glEnd(); // Left face glBindTexture(GL_TEXTURE_2D, faceTextures[5]); glBegin(GL_QUADS); glTexCoord2f(0.0, 0.0); glVertex3f(-size, -size, -size); glTexCoord2f(1.0, 0.0); glVertex3f(-size, -size, size); glTexCoord2f(1.0, 1.0); glVertex3f(-size, size, size); glTexCoord2f(0.0, 1.0); glVertex3f(-size, size, -size); glEnd(); glDisable(GL_TEXTURE_2D); } void ViewCube::drawAxes() { glLineWidth(2.0f); glBegin(GL_LINES); // X-axis (red) glColor3f(1.0, 0.0, 0.0); glVertex3f(0.0, 0.0, 0.0); glVertex3f(1.5, 0.0, 0.0); // Y-axis (green) glColor3f(0.0, 1.0, 0.0); glVertex3f(0.0, 0.0, 0.0); glVertex3f(0.0, 1.5, 0.0); // Z-axis (blue) glColor3f(0.0, 0.0, 1.0); glVertex3f(0.0, 0.0, 0.0); glVertex3f(0.0, 0.0, 1.5); glEnd(); glLineWidth(1.0f); }