//-------------------------------------------------------------------------------------------------- /// Set the render mode (immediate, vertex array or VBO) to use when rendering the geometry //-------------------------------------------------------------------------------------------------- void DrawableGeo::setRenderMode(RenderMode renderMode) { if (m_renderMode != renderMode) { m_renderMode = renderMode; releaseBufferObjectsGPU(); } }
//-------------------------------------------------------------------------------------------------- /// Weld vertices based on vertex distance /// /// \warning Calling this function will delete all vertex related data except the vertex positions //-------------------------------------------------------------------------------------------------- void DrawableGeo::weldVertices(double weldDistance) { size_t numVertices = m_vertexBundle->vertexCount(); size_t numPrimSets = m_primitiveSets.size(); if (numVertices == 0 || numPrimSets == 0) { return; } cref<Vec3fArray> sourceVertexArray = m_vertexBundle->vertexArray(); CVF_ASSERT(sourceVertexArray.notNull()); // Try and use bounding box to guess cell size // Probably needs more experimenting here double cellSize = m_boundingBox.radius()/100; VertexWelder welder; welder.initialize(weldDistance, cellSize, static_cast<uint>(numVertices)); welder.reserveVertices(static_cast<uint>(numVertices)); Collection<PrimitiveSet> newPrimSets; size_t ip; for (ip = 0; ip < numPrimSets; ip++) { const PrimitiveSet* srcPrimSet = m_primitiveSets.at(ip); PrimitiveType primType = srcPrimSet->primitiveType(); size_t numIndices = srcPrimSet->indexCount(); ref<UIntArray> newIndices = new UIntArray; newIndices->reserve(numIndices); size_t i; for (i = 0; i < numIndices; i++) { uint idx = srcPrimSet->index(i); Vec3f v = sourceVertexArray->get(idx); uint newIndexOfVertex = welder.weldVertex(v, NULL); newIndices->add(newIndexOfVertex); } ref<PrimitiveSetIndexedUInt> primSet = new PrimitiveSetIndexedUInt(primType); primSet->setIndices(newIndices.p()); newPrimSets.push_back(primSet.p()); } releaseBufferObjectsGPU(); m_vertexBundle->clear(); m_vertexBundle->setVertexArray(welder.createVertexArray().p()); m_primitiveSets = newPrimSets; recomputeBoundingBox(); }
//-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void DrawableVectors::setGlyph(UShortArray* triangles, Vec3fArray* vertices) { m_vectorGlyph = new DrawableGeo; m_vectorGlyphPrimSet = new PrimitiveSetIndexedUShort(PT_TRIANGLES); m_vectorGlyphPrimSet->setIndices(triangles); m_vectorGlyph->setVertexArray(vertices); m_vectorGlyph->addPrimitiveSet(m_vectorGlyphPrimSet.p()); m_vectorGlyph->computeNormals(); if (m_renderWithVBO) { m_vectorGlyph->setRenderMode(DrawableGeo::BUFFER_OBJECT); } releaseBufferObjectsGPU(); }
//-------------------------------------------------------------------------------------------------- /// Deletes OpenGL resources created by this primitive set //-------------------------------------------------------------------------------------------------- PrimitiveSetIndexedUInt::~PrimitiveSetIndexedUInt() { releaseBufferObjectsGPU(); }
//-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- DrawableVectors::~DrawableVectors() { releaseBufferObjectsGPU(); }
//-------------------------------------------------------------------------------------------------- /// Deletes all OpenGL resources created by this drawable geo //-------------------------------------------------------------------------------------------------- DrawableGeo::~DrawableGeo() { releaseBufferObjectsGPU(); }
//-------------------------------------------------------------------------------------------------- /// Deletes OpenGL resources created by this primitive set //-------------------------------------------------------------------------------------------------- PrimitiveSetIndexedUShortScoped::~PrimitiveSetIndexedUShortScoped() { releaseBufferObjectsGPU(); }