示例#1
0
Lazy<TriangleTree>* AssemblyTree::create_triangle_tree(const Assembly& assembly) const
{
    // Compute the assembly space bounding box of the assembly.
    const GAABB3 assembly_bbox =
        get_parent_bbox<GAABB3>(
            assembly.object_instances().begin(),
            assembly.object_instances().end());

    RegionInfoVector regions;
    collect_regions(assembly, regions);

    auto_ptr<ILazyFactory<TriangleTree> > triangle_tree_factory(
        new TriangleTreeFactory(
            TriangleTree::Arguments(
                assembly.get_uid(),
                assembly_bbox,
                assembly,
                regions)));

    return new Lazy<TriangleTree>(triangle_tree_factory);
}
RegionTree::RegionTree(const Arguments& arguments)
  : m_assembly_uid(arguments.m_assembly_uid)
{
    // Build the intermediate representation of the tree.
    IntermRegionTree interm_tree(arguments);

    // Copy tree bounding box.
    m_bbox = interm_tree.m_bbox;

    // Copy tree nodes.
    m_nodes = interm_tree.m_nodes;

    // Create final tree leaves.
    const size_t leaf_count = interm_tree.m_leaves.size();
    for (size_t i = 0; i < leaf_count; ++i)
    {
        // Fetch the intermediate representation of this leaf.
        const IntermRegionLeaf* interm_leaf = interm_tree.m_leaves[i];

        // Get a new unique ID for this triangle tree.
        const UniqueID triangle_tree_uid = new_guid();

        // Create the triangle tree factory.
        auto_ptr<ILazyFactory<TriangleTree> > triangle_tree_factory(
            new TriangleTreeFactory(
                TriangleTree::Arguments(
                    arguments.m_scene,
                    triangle_tree_uid,
                    interm_leaf->m_extent,
                    interm_leaf->m_assembly,
                    interm_leaf->m_regions)));

        // Create and store the triangle tree.
        m_triangle_trees.insert(
            make_pair(triangle_tree_uid, new Lazy<TriangleTree>(triangle_tree_factory)));

        // Create and store the leaf.
        m_leaves.push_back(new RegionLeaf(*this, triangle_tree_uid));
    }
}