int MainWindow::qt_metacall(QMetaObject::Call _c, int _id, void **_a) { _id = QMainWindow::qt_metacall(_c, _id, _a); if (_id < 0) return _id; if (_c == QMetaObject::InvokeMetaMethod) { switch (_id) { case 0: setGL(); break; case 1: setPixelmap(); break; case 2: refresh(); break; case 3: grabFrameBuffer(); break; case 4: clearPixmap(); break; case 5: about(); break; case 6: open(); break; case 7: hideDim(); break; case 8: ctxMenu((*reinterpret_cast< const QPoint(*)>(_a[1]))); break; case 9: dimensionClick((*reinterpret_cast< const QPoint(*)>(_a[1]))); break; case 10: marginClick((*reinterpret_cast< const QPoint(*)>(_a[1]))); break; case 11: setLinear(); break; case 12: setLog(); break; case 13: insertDim(); break; case 14: brush(); break; case 15: reset(); break; case 16: finishedDrawing(); break; default: ; } _id -= 17; } return _id; }
void SW::GLViewer::init() { setGL(); initGLSL(); #if BUFFER_ //glClearColor(0.0, 0.0, 0.0, 0.0); //glDisable(GL_DITHER); glShadeModel(GL_FLAT); //glEnable(GL_DEPTH_TEST); enum{Vertices, Color, Elements, NumVBOs}; GLuint buffers[NumVBOs]; // glew init is very important or errors occur glewInit(); // generate vertex arrays, and each array is corresponding to a object to be render glGenVertexArrays(1, &arrayId); #ifdef QT_BUFFER QGLFunctions qtgl; qtgl.initializeGLFunctions(0); #endif // 3D world coordinate of points #ifdef QT_BUFFER QVector<QVector3D> Verts; Verts.append(QVector3D(-1.0, -1.0, -1.0)); Verts.append(QVector3D(-1.0, -1.0, 1.0)); Verts.append(QVector3D(-1.0, 1.0, -1.0)); Verts.append(QVector3D(-1.0, 1.0, 1.0)); Verts.append(QVector3D(1.0, -1.0, -1.0)); Verts.append(QVector3D(1.0, -1.0, 1.0)); Verts.append(QVector3D(1.0, 1.0, -1.0)); Verts.append(QVector3D(1.0, 1.0, 1.0)); #else GLfloat Verts[][3] = { {-1.0, -1.0, -1.0}, {-1.0, -1.0, 1.0}, {-1.0, 1.0, -1.0}, {-1.0, 1.0, 1.0}, {1.0, -1.0, -1.0}, {1.0, -1.0, 1.0}, {1.0, 1.0, -1.0}, {1.0, 1.0, 1.0}, }; #endif // colors of points #ifdef QT_BUFFER QVector<QVector3D> Colors; Colors.append(QVector3D(0, 0.0, 0.0)); Colors.append(QVector3D(0, 0.0, 1.0)); Colors.append(QVector3D(0, 1.0, 0.0)); Colors.append(QVector3D(0, 1.0, 1.0)); Colors.append(QVector3D(1.0, 0.0, 0.0)); Colors.append(QVector3D(1.0, 0.0, 1.0)); Colors.append(QVector3D(1.0, 1.0, 0.0)); Colors.append(QVector3D(1.0, 1.0, 1.0)); #else GLfloat Colors[][3] = { {0.0, 0.0, 0.0}, {0.0, 0.0, 1.0}, {0.0, 1.0, 0.0}, {0.0, 1.0, 1.0}, {1.0, 0.0, 0.0}, {1.0, 0.0, 1.0}, {1.0, 1.0, 0.0}, {1.0, 1.0, 1.0}, }; #endif // indices of points #ifdef QT_BUFFER QVector<uint> Indices; Indices.append(0);Indices.append(1);Indices.append(3);Indices.append(2); Indices.append(4);Indices.append(6);Indices.append(7);Indices.append(5); Indices.append(2);Indices.append(3);Indices.append(7);Indices.append(6); Indices.append(0);Indices.append(4);Indices.append(5);Indices.append(1); Indices.append(0);Indices.append(2);Indices.append(6);Indices.append(4); Indices.append(1);Indices.append(5);Indices.append(7);Indices.append(3); #else GLubyte Indices[]={ 0, 1, 3, 2, 4, 6, 7, 5, 2, 3, 7, 6, 0, 4, 5, 1, 0, 2, 6, 4, 1, 5, 7, 3, }; #endif // active a vertex array glBindVertexArray(arrayId); // generate buffer objects, and each attribute(vertices, color, and normal..) is corresponding to one buffer #ifdef QT_BUFFER qtgl.glGenBuffers(NumVBOs, buffers); #else glGenBuffers(NumVBOs, buffers); #endif //---------------------------------------buffer for vertices----------------------------------// // active a buffer object #ifdef QT_BUFFER qtgl.glBindBuffer(GL_ARRAY_BUFFER, buffers[Vertices]); #else glBindBuffer(GL_ARRAY_BUFFER, buffers[Vertices]); #endif // alloc a space for buffer #ifdef QT_BUFFER qtgl.glBufferData(GL_ARRAY_BUFFER, Verts.size()*sizeof(GLfloat), Verts.data(), GL_STATIC_DRAW); #else glBufferData(GL_ARRAY_BUFFER, sizeof(Verts), Verts, GL_STATIC_DRAW); #endif // put the data into the corresponding buffer glVertexPointer(3, GL_FLOAT, 0,BUFFER_OFFSET(0)); glEnableClientState(GL_VERTEX_ARRAY); //---------------------------------------buffer for colors----------------------------------// // buffer for colors #ifdef QT_BUFFER qtgl.glBindBuffer(GL_ARRAY_BUFFER, buffers[Color]); #else glBindBuffer(GL_ARRAY_BUFFER, buffers[Color]); #endif #ifdef QT_BUFFER qtgl.glBufferData(GL_ARRAY_BUFFER, Colors.size()*sizeof(GLfloat), Colors.data(), GL_STATIC_DRAW); #else glBufferData(GL_ARRAY_BUFFER, sizeof(Colors), Colors, GL_STATIC_DRAW); #endif glColorPointer(3, GL_FLOAT, 0, BUFFER_OFFSET(0)); glEnableClientState(GL_COLOR_ARRAY); //---------------------------------------buffer for elements----------------------------------// // buffer for elements #ifdef QT_BUFFER numElement = Indices.size(); #else numElement = sizeof(Indices)/sizeof(Indices[0]); #endif #ifdef QT_BUFFER qtgl.glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[Elements]); #else glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[Elements]); #endif #ifdef QT_BUFFER qtgl.glBufferData(GL_ELEMENT_ARRAY_BUFFER, Indices.size()*sizeof(uint), Indices.data(), GL_STATIC_DRAW); #else glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Indices), Indices, GL_STATIC_DRAW); #endif #endif }