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


C++ BVHNode::createLeaf方法代码示例

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


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

示例1: buildRecursive

    BVHNode* BVH::buildRecursive(std::vector<BVHPrimitive> & data, unsigned start, unsigned end,
        std::vector<Face*> & orderedPrimitives, unsigned & totalNodes)
    {
        // Primitives in this branch
        const unsigned nPrimitives = end - start;

        // Allocate node (TODO: get from pool)
        BVHNode *node = new BVHNode;
        totalNodes++;

        // Calculate bounding box for all primitives given
        glm::aabb bounds;
        for(unsigned i = start; i < end; ++i)
            bounds = glm::aabb::combine(bounds, data[i].bounds);

        if(nPrimitives <= m_primitivesPerNode) // only n primitive left, create leaf node
        {
            const unsigned firstPrimitive = (unsigned)orderedPrimitives.size();
            for(unsigned i = start; i < end; ++i)
            {
                const unsigned primitive = data[i].primitive;
                orderedPrimitives.push_back(&mesh->faces[primitive]);
            }
            node->createLeaf(firstPrimitive, nPrimitives, bounds);
        }
        else
        {
            // Choose split dimension based on aabb centroids
            glm::aabb centroidBounds;
            for(unsigned i = start; i < end; ++i)
                centroidBounds.expand(data[i].centroid);
            if(centroidBounds.empty())
            {
                // All centroids the same, just create a leaf node

                const unsigned firstPrimitive = (unsigned)orderedPrimitives.size();
                for(unsigned i = start; i < end; ++i)
                {
                    const unsigned primitive = data[i].primitive;
                    orderedPrimitives.push_back(&mesh->faces[primitive]);
                }
                node->createLeaf(firstPrimitive, nPrimitives, bounds);

                return node;
            }

            const int dim = centroidBounds.largest_axis();                

            // Partition primitives to two subtrees
            const unsigned mid = (start + end) / 2;
            std::nth_element(&data[start], &data[mid], &data[end-1]+1,
                [=] (const BVHPrimitive & a, const BVHPrimitive & b)
                {
                    return a.centroid[dim] < b.centroid[dim];
                });

            node->createInterior(dim,
                buildRecursive(data, start, mid, orderedPrimitives, totalNodes),
                buildRecursive(data, mid, end, orderedPrimitives, totalNodes));
        }

        return node;
    }
开发者ID:sebis,项目名称:Raytracer,代码行数:63,代码来源:BVH.cpp


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