当前位置: 首页>>代码示例>>C++>>正文


C++ SpatialSort::FindIdenticalPositions方法代码示例

本文整理汇总了C++中SpatialSort::FindIdenticalPositions方法的典型用法代码示例。如果您正苦于以下问题:C++ SpatialSort::FindIdenticalPositions方法的具体用法?C++ SpatialSort::FindIdenticalPositions怎么用?C++ SpatialSort::FindIdenticalPositions使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在SpatialSort的用法示例。


在下文中一共展示了SpatialSort::FindIdenticalPositions方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。

示例1: ProcessMesh

// ------------------------------------------------------------------------------------------------
// Unites identical vertices in the given mesh
int JoinVerticesProcess::ProcessMesh( aiMesh* pMesh, unsigned int meshIndex)
{
    static_assert( AI_MAX_NUMBER_OF_COLOR_SETS    == 8, "AI_MAX_NUMBER_OF_COLOR_SETS    == 8");
	static_assert( AI_MAX_NUMBER_OF_TEXTURECOORDS == 8, "AI_MAX_NUMBER_OF_TEXTURECOORDS == 8");

    // Return early if we don't have any positions
    if (!pMesh->HasPositions() || !pMesh->HasFaces()) {
        return 0;
    }

    // We'll never have more vertices afterwards.
    std::vector<Vertex> uniqueVertices;
    uniqueVertices.reserve( pMesh->mNumVertices);

    // For each vertex the index of the vertex it was replaced by.
    // Since the maximal number of vertices is 2^31-1, the most significand bit can be used to mark
    //  whether a new vertex was created for the index (true) or if it was replaced by an existing
    //  unique vertex (false). This saves an additional std::vector<bool> and greatly enhances
    //  branching performance.
    static_assert(AI_MAX_VERTICES == 0x7fffffff, "AI_MAX_VERTICES == 0x7fffffff");
    std::vector<unsigned int> replaceIndex( pMesh->mNumVertices, 0xffffffff);

    // A little helper to find locally close vertices faster.
    // Try to reuse the lookup table from the last step.
    const static float epsilon = 1e-5f;
    // float posEpsilonSqr;
    SpatialSort* vertexFinder = NULL;
    SpatialSort _vertexFinder;

    typedef std::pair<SpatialSort,float> SpatPair;
    if (shared) {
        std::vector<SpatPair >* avf;
        shared->GetProperty(AI_SPP_SPATIAL_SORT,avf);
        if (avf)    {
            SpatPair& blubb = (*avf)[meshIndex];
            vertexFinder  = &blubb.first;
            // posEpsilonSqr = blubb.second;
        }
    }
    if (!vertexFinder)  {
        // bad, need to compute it.
        _vertexFinder.Fill(pMesh->mVertices, pMesh->mNumVertices, sizeof( aiVector3D));
        vertexFinder = &_vertexFinder;
        // posEpsilonSqr = ComputePositionEpsilon(pMesh);
    }

    // Squared because we check against squared length of the vector difference
    static const float squareEpsilon = epsilon * epsilon;

    // Again, better waste some bytes than a realloc ...
    std::vector<unsigned int> verticesFound;
    verticesFound.reserve(10);

    // Run an optimized code path if we don't have multiple UVs or vertex colors.
    // This should yield false in more than 99% of all imports ...
    const bool complex = ( pMesh->GetNumColorChannels() > 0 || pMesh->GetNumUVChannels() > 1);

    // Now check each vertex if it brings something new to the table
    for( unsigned int a = 0; a < pMesh->mNumVertices; a++)  {
        // collect the vertex data
        Vertex v(pMesh,a);

        // collect all vertices that are close enough to the given position
        vertexFinder->FindIdenticalPositions( v.position, verticesFound);
        unsigned int matchIndex = 0xffffffff;

        // check all unique vertices close to the position if this vertex is already present among them
        for( unsigned int b = 0; b < verticesFound.size(); b++) {

            const unsigned int vidx = verticesFound[b];
            const unsigned int uidx = replaceIndex[ vidx];
            if( uidx & 0x80000000)
                continue;

            const Vertex& uv = uniqueVertices[ uidx];
            // Position mismatch is impossible - the vertex finder already discarded all non-matching positions

            // We just test the other attributes even if they're not present in the mesh.
            // In this case they're initialized to 0 so the comparison succeeds.
            // By this method the non-present attributes are effectively ignored in the comparison.
            if( (uv.normal - v.normal).SquareLength() > squareEpsilon)
                continue;
            if( (uv.texcoords[0] - v.texcoords[0]).SquareLength() > squareEpsilon)
                continue;
            if( (uv.tangent - v.tangent).SquareLength() > squareEpsilon)
                continue;
            if( (uv.bitangent - v.bitangent).SquareLength() > squareEpsilon)
                continue;

            // Usually we won't have vertex colors or multiple UVs, so we can skip from here
            // Actually this increases runtime performance slightly, at least if branch
            // prediction is on our side.
            if (complex){
                // manually unrolled because continue wouldn't work as desired in an inner loop,
                // also because some compilers seem to fail the task. Colors and UV coords
                // are interleaved since the higher entries are most likely to be
                // zero and thus useless. By interleaving the arrays, vertices are,
                // on average, rejected earlier.
//.........这里部分代码省略.........
开发者ID:Kvalme,项目名称:assimp,代码行数:101,代码来源:JoinVerticesProcess.cpp


注:本文中的SpatialSort::FindIdenticalPositions方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。