Приветствую. Я 3D-моделлер, изучал С#, и совсем недавно стал работать с Qt. Для одного старого проекта понадобилось сделать детализированную модель объекта и загрузить ее в opengl виджет. Сначала я хотел использовать Qt3D, но так как проект старый и делался на Qt4 то пришлось написать парсер obj файлов самому. Парсер работает, модель нормально загружается, однако теперь нужно вынести загрузку в отдельный класс и тут у меня возникли проблемы. Я с С++ и векторами в целом работал очень мало, и поэтому запихнул все в главный виджет и теперь не уверен, что нужно, а что не нужно переносить в отдельный класс.
1. В первую очередь, что делать с вертексным, индексным и текстурными буферами? Они у меня находятся в paintGL() в таком виде:
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
vertex_buffer.bind();
index_buffer->bind();
glVertexPointer(3,GL_FLOAT,sizeof(Point),0);
glNormalPointer(GL_FLOAT,sizeof(Point),(void*)12);
glTexCoordPointer(2,GL_FLOAT,sizeof(Point),(void*)24);
glDrawElements(GL_TRIANGLES,faces_points_indices.count(),GLPointIdxType,0);
index_buffer->release();
vertex_buffer.release();
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
glPopMatrix();
initializeGL()
if (vertex_buffer.create())
{
vertex_buffer.bind();
vertex_buffer.setUsagePattern(QGLBuffer::StaticDraw);
vertex_buffer.release();
}
else qDebug() << "Couldn't create vertex_buffer";
index_buffer = new QGLBuffer(QGLBuffer::IndexBuffer);
if (index_buffer&&(index_buffer->create()))
{
index_buffer->bind();
index_buffer->setUsagePattern(QGLBuffer::StaticDraw);
index_buffer->release();
}
else qDebug() << "Couldn't create index_buffer";
Как все задается в главном виджете:
typedef struct {
QVector3D vertex;
QVector3D normal;
QVector2D texcoord;
} Point;
typedef unsigned int PointIdxType;
const GLuint GLPointIdxType = GL_UNSIGNED_INT;
typedef unsigned int FaceIdxType;
QVector<QVector3D> vertices;
QVector<QVector3D> face_normal;
QVector<QVector2D> texcoords;
QVector<Point> points;
QHash<QString,PointIdxType> string_to_point_index;
QVector<PointIdxType> faces_points_indices;
QVector<QVector<FaceIdxType> > point_faces;
QGLBuffer vertex_buffer;
QGLBuffer *index_buffer;
Это работает если объект один, но что если объектов будет несколько? Постоянно включать и выключать glEnableClientState? И если переносить index_buffer в другой класс, как к нему потом обращаться? Делать указатель на указатель?
2. Для того чтобы улучшить код мне предложили вместо QVector использовать std::vector - но какая кардинальная разница между ними? Чем в данном варианте плох QVector?