ccGenericPrimitive* ccGenericPrimitive::finishCloneJob(ccGenericPrimitive* primitive) const { if (primitive) { //'clone' vertices (everything but the points that are already here) if (primitive->m_associatedCloud && m_associatedCloud && m_associatedCloud->size() == primitive->m_associatedCloud->size()) { primitive->m_associatedCloud = m_associatedCloud->clone(primitive->m_associatedCloud); primitive->m_associatedCloud->setName(m_associatedCloud->getName()); } primitive->showNormals(normalsShown()); primitive->showColors(colorsShown()); primitive->showSF(sfShown()); //primitive->showMaterials(materialsShown()); //primitive->setName(getName()+QString(".clone")); primitive->setVisible(isVisible()); primitive->setEnabled(isEnabled()); } else { //if the calling primitive provide a null pointer, it means that the cloned version creation failed! ccLog::Warning("[ccGenericPrimitive::clone] Not enough memory!"); } return primitive; }
void ccDrawableObject::getDrawingParameters(glDrawParams& params) const { //color override if (isColorOverriden()) { params.showColors=true; params.showNorms=hasNormals() && normalsShown()/*false*/; params.showSF=false; } else { params.showNorms = hasNormals() && normalsShown(); params.showSF = hasDisplayedScalarField() && sfShown(); //colors are not displayed if scalar field is displayed params.showColors = !params.showSF && hasColors() && colorsShown(); } }
void ccDrawableObject::toggleNormals() { showNormals(!normalsShown()); }
ccSubMesh* ccSubMesh::createNewSubMeshFromSelection(bool removeSelectedFaces, IndexMap* indexMap/*=0*/) { ccGenericPointCloud* vertices = getAssociatedCloud(); assert(vertices && m_associatedMesh); if (!vertices || !m_associatedMesh) { return NULL; } ccGenericPointCloud::VisibilityTableType* verticesVisibility = vertices->getTheVisibilityArray(); if (!verticesVisibility || !verticesVisibility->isAllocated()) { ccLog::Error(QString("[Sub-mesh %1] Internal error: vertex visibility table not instantiated!").arg(getName())); return NULL; } //we count the number of remaining faces unsigned triNum = m_triIndexes->currentSize(); unsigned visibleFaces = 0; { for (unsigned i=0; i<triNum; ++i) { const unsigned& globalIndex = m_triIndexes->getValue(i); const CCLib::VerticesIndexes* tsi = m_associatedMesh->getTriangleVertIndexes(globalIndex); //triangle is visible? if ( verticesVisibility->getValue(tsi->i1) == POINT_VISIBLE && verticesVisibility->getValue(tsi->i2) == POINT_VISIBLE && verticesVisibility->getValue(tsi->i3) == POINT_VISIBLE) { ++visibleFaces; } } } //nothing to do if (visibleFaces == 0) { if (indexMap) //we still have to translate global indexes! { for (unsigned i=0; i<triNum; ++i) { unsigned globalIndex = m_triIndexes->getValue(i); globalIndex = indexMap->getValue(globalIndex); m_triIndexes->setValue(i,globalIndex); } } return 0; } ccSubMesh* newSubMesh = new ccSubMesh(m_associatedMesh); if (!newSubMesh->reserve(size())) { ccLog::Error("[ccSubMesh::createNewSubMeshFromSelection] Not enough memory!"); return NULL; } //create sub-mesh { unsigned lastTri = 0; for (unsigned i=0; i<triNum; ++i) { unsigned globalIndex = m_triIndexes->getValue(i); const CCLib::VerticesIndexes* tsi = m_associatedMesh->getTriangleVertIndexes(globalIndex); if (indexMap) //translate global index? globalIndex = indexMap->getValue(globalIndex); //triangle is visible? if ( verticesVisibility->getValue(tsi->i1) == POINT_VISIBLE && verticesVisibility->getValue(tsi->i2) == POINT_VISIBLE && verticesVisibility->getValue(tsi->i3) == POINT_VISIBLE) { newSubMesh->addTriangleIndex(globalIndex); } else if (removeSelectedFaces) //triangle is not visible? It stays in the original mesh! { //we replace the current triangle by the 'last' valid one assert(lastTri <= i); m_triIndexes->setValue(lastTri++,globalIndex); } } //resize original mesh if (removeSelectedFaces && lastTri < triNum) { if (lastTri == 0) m_triIndexes->clear(true); else resize(lastTri); m_bBox.setValidity(false); notifyGeometryUpdate(); } } if (newSubMesh->size()) { newSubMesh->setName(getName()+QString(".part")); newSubMesh->resize(newSubMesh->size()); newSubMesh->setDisplay(getDisplay()); newSubMesh->showColors(colorsShown()); newSubMesh->showNormals(normalsShown()); newSubMesh->showMaterials(materialsShown()); newSubMesh->showSF(sfShown()); newSubMesh->enableStippling(stipplingEnabled()); newSubMesh->showWired(isShownAsWire()); } else { assert(false); delete newSubMesh; newSubMesh = 0; } return newSubMesh; }