Exemple #1
0
		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;
				}
			}
		}
Exemple #2
0
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();
}
Exemple #3
0
		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 );
		}