示例#1
0
 // adds an edge. Invalidates edge iterators for the source node
 EdgeIterator InsertEdge(const NodeIterator from, const NodeIterator to, const EdgeDataT &data)
 {
     Node &node = node_list[from];
     EdgeIterator newFirstEdge = node.edges + node.firstEdge;
     if (newFirstEdge >= edge_list.size() || !isDummy(newFirstEdge))
     {
         if (node.firstEdge != 0 && isDummy(node.firstEdge - 1))
         {
             node.firstEdge--;
             edge_list[node.firstEdge] = edge_list[node.firstEdge + node.edges];
         }
         else
         {
             EdgeIterator newFirstEdge = (EdgeIterator)edge_list.size();
             unsigned newSize = node.edges * 1.1 + 2;
             EdgeIterator requiredCapacity = newSize + edge_list.size();
             EdgeIterator oldCapacity = edge_list.capacity();
             if (requiredCapacity >= oldCapacity)
             {
                 edge_list.reserve(requiredCapacity * 1.1);
             }
             edge_list.resize(edge_list.size() + newSize);
             for (const auto i : osrm::irange(0u, node.edges))
             {
                 edge_list[newFirstEdge + i] = edge_list[node.firstEdge + i];
                 makeDummy(node.firstEdge + i);
             }
             for (const auto i : osrm::irange(node.edges + 1, newSize))
             {
                 makeDummy(newFirstEdge + i);
             }
             node.firstEdge = newFirstEdge;
         }
     }
     Edge &edge = edge_list[node.firstEdge + node.edges];
     edge.target = to;
     edge.data = data;
     ++number_of_edges;
     ++node.edges;
     return EdgeIterator(node.firstEdge + node.edges);
 }
示例#2
0
 // removes an edge. Invalidates edge iterators for the source node
 void DeleteEdge(const NodeIterator source, const EdgeIterator e)
 {
     Node &node = node_list[source];
     --number_of_edges;
     --node.edges;
     BOOST_ASSERT(std::numeric_limits<unsigned>::max() != node.edges);
     const unsigned last = node.firstEdge + node.edges;
     BOOST_ASSERT(std::numeric_limits<unsigned>::max() != last);
     // swap with last edge
     edge_list[e] = edge_list[last];
     makeDummy(last);
 }
示例#3
0
// ************************************************************************
void CTextureBlend::doGenerate(bool async)
{
	if (!_BlendTex[0] || !_BlendTex[1])
	{
		makeDummy();
		return;
	}
	//NLMISC::TTicks start = NLMISC::CTime::getPerformanceTime();
	_BlendTex[0]->generate();
	_BlendTex[1]->generate();

	this->blend(*_BlendTex[0], *_BlendTex[1], _BlendFactor, true);
	/*NLMISC::TTicks end = NLMISC::CTime::getPerformanceTime();
	nlinfo("blend time = %.2f", (float) (1000 * NLMISC::CTime::ticksToSecond(end - start)));*/
}
示例#4
0
    // removes all edges (source,target)
    int32_t DeleteEdgesTo(const NodeIterator source, const NodeIterator target)
    {
        int32_t deleted = 0;
        for (EdgeIterator i = BeginEdges(source), iend = EndEdges(source); i < iend - deleted; ++i)
        {
            if (edge_list[i].target == target)
            {
                do
                {
                    deleted++;
                    edge_list[i] = edge_list[iend - deleted];
                    makeDummy(iend - deleted);
                } while (i < iend - deleted && edge_list[i].target == target);
            }
        }

        number_of_edges -= deleted;
        node_list[source].edges -= deleted;

        return deleted;
    }
示例#5
0
/*------------------------------------------------------------------*\
							doGenerate()
\*------------------------------------------------------------------*/
void CTextureMem::doGenerate(bool /* async */)
{
	if (_Data)
	{
		if (_IsFile)
		{
			NLMISC::CMemStream m (true);
			m.fill (_Data, _Length);
			load (m);
		}
		else
		{
			resize(_TexWidth, _TexHeight, _TexType);
			::memcpy(&getPixels(0)[0], _Data, _Length);
			buildMipMaps();
		}
	}
	else
	{
		makeDummy();
	}
}