InternedString uniqueHandle( const InternedString &handle ) { if( m_nodes.find( handle ) == m_nodes.end() ) { return handle; } string result; for( int i = 1; true; ++i ) { result = handle.string() + std::to_string( i ); if( m_nodes.find( result ) == m_nodes.end() ) { return result; } } }
void EdgeContainer::buildNonboundaryEdgeList() { NodeContainer pContainer = m_triangleContainer.getPointContainer(); m_edgeToTriangleIndecesMap.clear(); m_edgeList.clear(); // Loop over all triangles and build a unique list of non-boundary edges. for (unsigned indexOuter = 0; indexOuter < m_triangleContainer.size() ; ++ indexOuter) { const Triangle& tOuter = m_triangleContainer.at(indexOuter); for (unsigned indexInner = indexOuter + 1; indexInner < m_triangleContainer.size() ; ++ indexInner) { if ( m_triangleContainer.hasCommonNode(indexInner, indexOuter) ) { const Triangle& tInner = m_triangleContainer.at(indexInner); // Find common nodes std::vector<NodeContainer::SizeType> edgePointList; for (unsigned ii = 0; ii < 3; ++ii) { for (unsigned jj = 0; jj < 3; ++jj) { if (tOuter.at(ii) == tInner.at(jj)) { edgePointList.push_back(pContainer.find(tOuter.at(ii))); } } } assert(edgePointList.size() < 3); // Three matching nodes = coincident triangle if (edgePointList.size() == 2) { // Found a common edge Edge e; std::sort(edgePointList.begin(), edgePointList.end()); e.set(pContainer.at(edgePointList.at(0)), pContainer.at(edgePointList.at(1))); // Add items in sorted order (smallest to largest - basis function direction) if (indexOuter < indexInner) { e.setSortedAssociatedTriangles({indexOuter, indexInner}); m_edgeToTriangleIndecesMap.push_back({indexOuter, indexInner}); } else { e.setSortedAssociatedTriangles({indexInner, indexOuter}); m_edgeToTriangleIndecesMap.push_back({indexInner, indexOuter}); } m_edgeList.push_back(e); } } } } buildTriangleToEdgeMap(); }
NodeContainer::iterator removeShader( NodeContainer::iterator it ) { if( m_output.shader == it->handle ) { m_output = Parameter(); } for( const auto &c : it->inputConnections ) { auto sourceIt = m_nodes.find( c.source.shader ); assert( sourceIt != m_nodes.end() ); sourceIt->mutableOutputConnections().erase( c.destination ); } for( const auto &c : it->outputConnections ) { auto destinationIt = m_nodes.find( c.destination.shader ); assert( destinationIt != m_nodes.end() ); destinationIt->mutableInputConnections().erase( c.destination ); } m_hashDirty = true; return m_nodes.erase( it ); }