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)); } }