| 760 | } |
| 761 | |
| 762 | void Scene::build_cpu_accels() |
| 763 | { |
| 764 | /* select acceleration structures to build */ |
| 765 | unsigned int new_enabled_geometry_types = world.enabledGeometryTypesMask(); |
| 766 | |
| 767 | if (flags_modified || new_enabled_geometry_types != enabled_geometry_types) |
| 768 | { |
| 769 | accels_init(); |
| 770 | |
| 771 | /* we need to make all geometries modified, otherwise two level builder will |
| 772 | not rebuild currently not modified geometries */ |
| 773 | parallel_for(geometryModCounters_.size(), [&] ( const size_t i ) { |
| 774 | geometryModCounters_[i] = 0; |
| 775 | }); |
| 776 | |
| 777 | if (getNumPrimitives(TriangleMesh::geom_type,false)) createTriangleAccel(); |
| 778 | if (getNumPrimitives(TriangleMesh::geom_type,true)) createTriangleMBAccel(); |
| 779 | if (getNumPrimitives(QuadMesh::geom_type,false)) createQuadAccel(); |
| 780 | if (getNumPrimitives(QuadMesh::geom_type,true)) createQuadMBAccel(); |
| 781 | if (getNumPrimitives(GridMesh::geom_type,false)) createGridAccel(); |
| 782 | if (getNumPrimitives(GridMesh::geom_type,true)) createGridMBAccel(); |
| 783 | if (getNumPrimitives(SubdivMesh::geom_type,false)) createSubdivAccel(); |
| 784 | if (getNumPrimitives(SubdivMesh::geom_type,true)) createSubdivMBAccel(); |
| 785 | if (getNumPrimitives(Geometry::MTY_CURVES,false)) createHairAccel(); |
| 786 | if (getNumPrimitives(Geometry::MTY_CURVES,true)) createHairMBAccel(); |
| 787 | if (getNumPrimitives(UserGeometry::geom_type,false)) createUserGeometryAccel(); |
| 788 | if (getNumPrimitives(UserGeometry::geom_type,true)) createUserGeometryMBAccel(); |
| 789 | if (getNumPrimitives(Geometry::MTY_INSTANCE_CHEAP,false)) createInstanceAccel(); |
| 790 | if (getNumPrimitives(Geometry::MTY_INSTANCE_CHEAP,true)) createInstanceMBAccel(); |
| 791 | if (getNumPrimitives(Geometry::MTY_INSTANCE_EXPENSIVE,false)) createInstanceExpensiveAccel(); |
| 792 | if (getNumPrimitives(Geometry::MTY_INSTANCE_EXPENSIVE,true)) createInstanceExpensiveMBAccel(); |
| 793 | if (getNumPrimitives(Geometry::MTY_INSTANCE_ARRAY,false)) createInstanceArrayAccel(); |
| 794 | if (getNumPrimitives(Geometry::MTY_INSTANCE_ARRAY,true)) createInstanceArrayMBAccel(); |
| 795 | |
| 796 | flags_modified = false; |
| 797 | enabled_geometry_types = new_enabled_geometry_types; |
| 798 | } |
| 799 | |
| 800 | /* select fast code path if no filter function is present */ |
| 801 | accels_select(hasFilterFunction()); |
| 802 | |
| 803 | /* build all hierarchies of this scene */ |
| 804 | accels_build(); |
| 805 | |
| 806 | /* make static geometry immutable */ |
| 807 | if (!isDynamicAccel()) { |
| 808 | accels_immutable(); |
| 809 | flags_modified = true; // in non-dynamic mode we have to re-create accels |
| 810 | } |
| 811 | |
| 812 | if (device->verbosity(2)) { |
| 813 | std::cout << "created scene intersector" << std::endl; |
| 814 | accels_print(2); |
| 815 | std::cout << "selected scene intersector" << std::endl; |
| 816 | intersectors.print(2); |
| 817 | } |
| 818 | } |
| 819 |
nothing calls this directly
no test coverage detected