int main(int argc, char** argv) { // Create a Qt application QApplication app( argc, argv ); // create a new OpenGL Qt window QGLWidget* gl = new QGLWidget(0); app.setMainWidget( gl ); gl->show(); return app.exec(); }
QGLWidget* DTIDEGLWidgets::requestWidget(QString title, int width, int height) { QGLFormat glFormat(QGL::SampleBuffers); glFormat.setSwapInterval(0); QGLWidget* res = new QGLWidget(glFormat); res->resize(width, height); res->setWindowTitle(title); res->show(); activeWidgets.append(res); res->makeCurrent(); return res; }
VertexBufferObjectAccess::pointer Mesh::getVertexBufferObjectAccess( accessType type, OpenCLDevice::pointer device) { if(!mIsInitialized) throw Exception("Surface has not been initialized."); if(mSurfaceIsBeingWrittenTo) throw Exception("Requesting access to a surface that is already being written to."); if (type == ACCESS_READ_WRITE) { if (isAnyDataBeingAccessed()) { throw Exception( "Trying to get write access to an object that is already being accessed"); } mSurfaceIsBeingWrittenTo = true; updateModifiedTimestamp(); } if(!mVBOHasData) { // TODO create VBO // Have to have a drawable available before glewInit and glGenBuffers #if defined(__APPLE__) || defined(__MACOSX) #else #if _WIN32 #else // If no Window is present, create a dummy gl context if(!QApplication::instance()) { // TODO make this work on all platforms SimpleWindow::initializeQtApp(); // Need a drawable for this to work QGLWidget* widget = new QGLWidget; widget->show(); widget->hide(); // TODO should probably delete widget as well std::cout << "created a drawable" << std::endl; } #endif #endif GLenum err = glewInit(); if(err != GLEW_OK) throw Exception("GLEW init error"); glGenBuffers(1, &mVBOID); glBindBuffer(GL_ARRAY_BUFFER, mVBOID); if(mHostHasData) { // If host has data, transfer it. // Create data arrays with vertices and normals interleaved uint counter = 0; float* data = new float[mNrOfTriangles*18]; for(uint i = 0; i < mNrOfTriangles; i++) { Vector3ui triangle = mTriangles[i]; for(uint j = 0; j < 3; j++) { SurfaceVertex vertex = mVertices[triangle[j]]; for(uint k = 0; k < 3; k++) { data[counter+k] = vertex.position[k]; //std::cout << data[counter+k] << std::endl; data[counter+3+k] = vertex.normal[k]; } //std::cout << "...." << std::endl; counter += 6; } } glBufferData(GL_ARRAY_BUFFER, mNrOfTriangles*18*sizeof(float), data, GL_STATIC_DRAW); delete[] data; } else { glBufferData(GL_ARRAY_BUFFER, mNrOfTriangles*18*sizeof(float), NULL, GL_STATIC_DRAW); } glBindBuffer(GL_ARRAY_BUFFER, 0); glFinish(); //std::cout << "Created VBO with ID " << mVBOID << " and " << mNrOfTriangles << " of triangles" << std::endl; // TODO Transfer data if any exist mVBOHasData = true; mVBODataIsUpToDate = true; } else { if(!mVBODataIsUpToDate) { // TODO Update data } } mVBODataIsBeingAccessed = true; VertexBufferObjectAccess::pointer accessObject(new VertexBufferObjectAccess(mVBOID, &mVBODataIsBeingAccessed, &mSurfaceIsBeingWrittenTo)); return std::move(accessObject); }