/****************************************************************************** * Returns the world space point around which the viewport camera orbits. ******************************************************************************/ Point3 ViewportConfiguration::orbitCenter() { // Update orbiting center. if(orbitCenterMode() == ORBIT_SELECTION_CENTER) { Box3 selectionBoundingBox; for(SceneNode* node : dataset()->selection()->nodes()) { selectionBoundingBox.addBox(node->worldBoundingBox(dataset()->animationSettings()->time())); } if(!selectionBoundingBox.isEmpty()) return selectionBoundingBox.center(); else { Box3 sceneBoundingBox = dataset()->sceneRoot()->worldBoundingBox(dataset()->animationSettings()->time()); if(!sceneBoundingBox.isEmpty()) return sceneBoundingBox.center(); } } else if(orbitCenterMode() == ORBIT_USER_DEFINED) { return _userOrbitCenter; } return Point3::Origin(); }
Sphere& Sphere::setFrom( std::vector<glm::vec3>& points ) { Box3 box; box.setFrom( points ); this->center = box.center(); float max_radius = 0.0; for( glm::vec3 point: points ) max_radius = std::max( max_radius, glm::distance( this->center, point )); this->radius = max_radius; return *this; }
/// @overload QGLWidget void initializeGL(){ printf("OpenGL %d.%d\n",this->format().majorVersion(),this->format().minorVersion()); ///--- Background glClearColor(1.0, 1.0, 1.0, 1.0); ///--- Viewport (simple, for unresizeable window) glViewport(0, 0, this->width(), this->height()); ///--- Setup opengl flags glEnable(GL_DEPTH_TEST); ///--- Create the triangle index buffer { assert(mesh.is_triangle_mesh()); triangles.clear(); for(auto f: mesh.faces()) for(auto v: mesh.vertices(f)) triangles.push_back(v.idx()); } ///--- Create an array object to store properties { bool success = vao.create(); assert(success); vao.bind(); } ///--- Load/compile shaders { bool vok = program.addShaderFromSourceFile(QGLShader::Vertex, ":/vshader.glsl"); bool fok = program.addShaderFromSourceFile(QGLShader::Fragment, ":/fshader.glsl"); bool lok = program.link (); assert(lok && vok && fok); bool success = program.bind(); assert(success); } ///--- Create vertex buffer/attributes "position" { auto vpoints = mesh.get_vertex_property<Vec3>("v:point"); bool success = vertexbuffer.create(); assert(success); vertexbuffer.setUsagePattern( QGLBuffer::StaticDraw ); success = vertexbuffer.bind(); assert(success); vertexbuffer.allocate( vpoints.data(), sizeof(Vec3) * mesh.n_vertices() ); program.setAttributeBuffer("vpoint", GL_FLOAT, 0, 3 ); program.enableAttributeArray("vpoint"); } ///--- Create vertex buffer/attributes "normal" { auto vnormal = mesh.get_vertex_property<Vec3>("v:normal"); bool success = normalbuffer.create(); assert(success); normalbuffer.setUsagePattern( QGLBuffer::StaticDraw ); success = normalbuffer.bind(); assert(success); normalbuffer.allocate( vnormal.data(), sizeof(Vec3) * mesh.n_vertices() ); program.setAttributeBuffer("vnormal", GL_FLOAT, 0, 3 ); program.enableAttributeArray("vnormal"); } ///--- Create the index "triangle" buffer { bool success = indexbuffer.create(); assert(success); indexbuffer.setUsagePattern( QGLBuffer::StaticDraw ); success = indexbuffer.bind(); assert(success); indexbuffer.allocate(&triangles[0], triangles.size()*sizeof(unsigned int)); } #ifdef WITH_QGLVIEWER ///--- Setup camera { Box3 bbox = OpenGP::bounding_box(mesh); camera()->setType(qglviewer::Camera::ORTHOGRAPHIC); camera()->setSceneCenter(qglviewer::tr(bbox.center())); camera()->setSceneRadius(bbox.diagonal().norm()/2.0); camera()->showEntireScene(); } #endif ///--- Unbind to avoid pollution vao.release(); program.release(); }