Esempio n. 1
0
void TriangleBvh::BuildBVH()
{
    if (faces.size() == 0)
        return;

    vector<BVHItem> buildData;
    buildData.reserve(faces.size());
    vector<uint32_t> prims(faces.size());
    for (uint32_t i = 0; i < faces.size(); ++i)
    {
        Vec3f &v0 = positions[faces[i][0]];
        Vec3f &v1 = positions[faces[i][1]];
        Vec3f &v2 = positions[faces[i][2]];
        Range3f bbox = ElementOperations::TriangleBoundingBox(v0, v1, v2);
        buildData.push_back(BVHItem(i, bbox));
        prims[i] = i;
    }

    ordered.reserve(faces.size());
    uint64_t totalNodes = 0;
    BVHBuildNode *root = RecursiveBuildBVH<uint32_t>(SPLIT_SAH, buildData.begin(), buildData.end(), &totalNodes, prims, ordered);

    bvhNodes.resize(totalNodes);
    uint32_t offset = 0;
    FlattenBVHTree(root, bvhNodes, &offset);
}
Esempio n. 2
0
void GroupBvh::BuildBVH()
{
    if (groups.size() == 0)
        return;

    vector<BVHItem> buildData;
    buildData.reserve(groups.size());
    for (uint32_t i = 0; i < groups.size(); ++i)
    {
        Range3f bbox = groups[i]->ComputeBoundingBox();
        buildData.push_back(BVHItem(i, bbox));
    }

    vector<RayEngine* > ordered;
    ordered.reserve(groups.size());

    uint64_t totalNodes = 0;
    BVHBuildNode *root = RecursiveBuildBVH<RayEngine*>(SPLIT_SAH, buildData.begin(), buildData.end(), &totalNodes, groups, ordered);

    groups = ordered;

    bvhNodes.resize(totalNodes);
    uint32_t offset = 0;
    FlattenBVHTree(root, bvhNodes, &offset);
}
Esempio n. 3
0
void SceneData::refreshBVH()
{
    BVHItems objectItems;
    for ( koi::RenderablePtr object : m_renderables )
    {
        const Bounds3f &bounds = object->getWorldBounds();
        objectItems.push_back( BVHItem( bounds ) );
    }
    
    m_bvh = BVH( objectItems );
}
Esempio n. 4
0
void SphereBvh::BuildBVH()
{
    if (centers.size() == 0)
        return;

    vector<BVHItem> buildData;
    buildData.reserve(centers.size());
    vector<uint32_t> prims(centers.size());
    for (uint32_t i = 0; i < centers.size(); ++i)
    {
        Range3f bbox = ElementOperations::SphereBoundingBox(centers[i], radius[i]);
        buildData.push_back(BVHItem(i, bbox));
        prims[i] = i;
    }

    ordered.reserve(centers.size());
    uint64_t totalNodes = 0;
    BVHBuildNode *root = RecursiveBuildBVH<uint32_t>(SPLIT_SAH, buildData.begin(), buildData.end(), &totalNodes, prims, ordered);

    bvhNodes.resize(totalNodes);
    uint32_t offset = 0;
    FlattenBVHTree(root, bvhNodes, &offset);
}