139 lines
4.2 KiB
C++
139 lines
4.2 KiB
C++
#include "ViewCube.h"
|
|
#include <QPainter>
|
|
#include <QFont>
|
|
|
|
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);
|
|
}
|