AOVoxelTree::AOVoxelTree( const Scene& scene, const GScalar max_extent_fraction) { assert(max_extent_fraction > GScalar(0.0)); // Print a progress message. RENDERER_LOG_INFO("building ambient occlusion voxel tree..."); // Compute the bounding box of the scene. const GAABB3 scene_bbox = scene.compute_bbox(); // Compute the maximum extent of a leaf, in world space. const GScalar max_extent = max_extent_fraction * max_value(scene_bbox.extent()); // Build the tree. BuilderType builder(m_tree, scene_bbox, max_extent); build(scene, builder); builder.complete(); // Print statistics. TreeStatisticsType tree_stats(m_tree, builder); RENDERER_LOG_DEBUG("ambient occlusion voxel tree statistics:"); tree_stats.print(global_logger()); }
void AssemblyTree::build_assembly_tree() { // Insert all assembly instances of the scene into the tree. for (const_each<AssemblyInstanceContainer> i = m_scene.assembly_instances(); i; ++i) { // Retrieve the assembly instance. const AssemblyInstance& assembly_instance = *i; // Retrieve the assembly. const Assembly& assembly = assembly_instance.get_assembly(); // Skip empty assemblies. if (assembly.object_instances().empty()) continue; // Insert the assembly instance into the root leaf. insert( assembly_instance.get_uid(), assembly_instance.compute_parent_bbox()); } // Log a progress message. RENDERER_LOG_INFO( "building assembly bvh (%s %s)...", pretty_int(size()).c_str(), plural(size(), "assembly instance").c_str()); // Build the assembly tree. AssemblyTreePartitioner partitioner; AssemblyTreeBuilder builder; builder.build(*this, partitioner); // Collect and print assembly tree statistics. AssemblyTreeStatistics tree_stats(*this, builder); RENDERER_LOG_DEBUG("assembly bvh statistics:"); tree_stats.print(global_logger()); }