diff options
Diffstat (limited to 'source/blender/io/usd/intern')
-rw-r--r-- | source/blender/io/usd/intern/usd_capi_import.cc | 24 | ||||
-rw-r--r-- | source/blender/io/usd/intern/usd_reader_stage.cc | 15 | ||||
-rw-r--r-- | source/blender/io/usd/intern/usd_reader_stage.h | 2 |
3 files changed, 37 insertions, 4 deletions
diff --git a/source/blender/io/usd/intern/usd_capi_import.cc b/source/blender/io/usd/intern/usd_capi_import.cc index 13ae6f4d4c0..03af3aed2d0 100644 --- a/source/blender/io/usd/intern/usd_capi_import.cc +++ b/source/blender/io/usd/intern/usd_capi_import.cc @@ -218,6 +218,7 @@ static void import_startjob(void *customdata, short *stop, short *do_update, flo data->scene->r.efra = stage->GetEndTimeCode(); } + *data->do_update = true; *data->progress = 0.15f; USDStageReader *archive = new USDStageReader(stage, data->params, data->settings); @@ -226,13 +227,32 @@ static void import_startjob(void *customdata, short *stop, short *do_update, flo archive->collect_readers(data->bmain); + *data->do_update = true; *data->progress = 0.2f; const float size = static_cast<float>(archive->readers().size()); size_t i = 0; - /* Setup parenthood */ + /* Sort readers by name: when creating a lot of objects in Blender, + * it is much faster if the order is sorted by name. */ + archive->sort_readers(); + *data->do_update = true; + *data->progress = 0.25f; + + /* Create blender objects. */ + for (USDPrimReader *reader : archive->readers()) { + if (!reader) { + continue; + } + reader->create_object(data->bmain, 0.0); + if ((++i & 1023) == 0) { + *data->do_update = true; + *data->progress = 0.25f + 0.25f * (i / size); + } + } + /* Setup parenthood and read actual object data. */ + i = 0; for (USDPrimReader *reader : archive->readers()) { if (!reader) { @@ -252,7 +272,7 @@ static void import_startjob(void *customdata, short *stop, short *do_update, flo ob->parent = parent->object(); } - *data->progress = 0.2f + 0.8f * (++i / size); + *data->progress = 0.5f + 0.5f * (++i / size); *data->do_update = true; if (G.is_break) { diff --git a/source/blender/io/usd/intern/usd_reader_stage.cc b/source/blender/io/usd/intern/usd_reader_stage.cc index 583c58a1356..df75be849e2 100644 --- a/source/blender/io/usd/intern/usd_reader_stage.cc +++ b/source/blender/io/usd/intern/usd_reader_stage.cc @@ -28,6 +28,9 @@ #include <iostream> +#include "BLI_sort.hh" +#include "BLI_string.h" + namespace blender::io::usd { USDStageReader::USDStageReader(pxr::UsdStageRefPtr stage, @@ -252,8 +255,6 @@ USDPrimReader *USDStageReader::collect_readers(Main *bmain, const pxr::UsdPrim & return nullptr; } - reader->create_object(bmain, 0.0); - readers_.push_back(reader); reader->incref(); @@ -310,4 +311,14 @@ void USDStageReader::clear_readers() readers_.clear(); } +void USDStageReader::sort_readers() +{ + blender::parallel_sort( + readers_.begin(), readers_.end(), [](const USDPrimReader *a, const USDPrimReader *b) { + const char *na = a ? a->name().c_str() : ""; + const char *nb = b ? b->name().c_str() : ""; + return BLI_strcasecmp(na, nb) < 0; + }); +} + } // Namespace blender::io::usd diff --git a/source/blender/io/usd/intern/usd_reader_stage.h b/source/blender/io/usd/intern/usd_reader_stage.h index 0ed964c7679..5f4a343f874 100644 --- a/source/blender/io/usd/intern/usd_reader_stage.h +++ b/source/blender/io/usd/intern/usd_reader_stage.h @@ -63,6 +63,8 @@ class USDStageReader { return readers_; }; + void sort_readers(); + private: USDPrimReader *collect_readers(Main *bmain, const pxr::UsdPrim &prim); |