本文整理汇总了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;
}