[Bf-blender-cvs] [1dfe4938cdd] universal-scene-description: Merge branch 'master' into universal-scene-description
Michael Kowalski
noreply at git.blender.org
Mon Aug 15 22:33:34 CEST 2022
Commit: 1dfe4938cdd4e0eb0c7d8febff51f5b2ab31e81f
Author: Michael Kowalski
Date: Sun Aug 14 17:16:40 2022 -0400
Branches: universal-scene-description
https://developer.blender.org/rB1dfe4938cdd4e0eb0c7d8febff51f5b2ab31e81f
Merge branch 'master' into universal-scene-description
===================================================================
===================================================================
diff --cc source/blender/io/usd/intern/usd_capi_import.cc
index d224715588a,03af3aed2d0..7c9e403e108
--- a/source/blender/io/usd/intern/usd_capi_import.cc
+++ b/source/blender/io/usd/intern/usd_capi_import.cc
@@@ -412,56 -227,32 +413,88 @@@ static void import_startjob(void *custo
archive->collect_readers(data->bmain);
+ if (data->params.import_lights && data->params.create_background_shader &&
+ !archive->dome_lights().empty()) {
+ dome_light_to_world_material(
+ data->params, data->settings, data->scene, data->bmain, archive->dome_lights().front());
+ }
+
+ *data->do_update = true;
*data->progress = 0.2f;
const float size = static_cast<float>(archive->readers().size());
size_t i = 0;
+ /* Read data, set prenting and create a cache file, if needed. */
+
+ /* We defer creating a cache file until we know that we need
+ * one. This is not only more efficient, but also avoids
+ * the problem where we can't overwrite the USD the
+ * cachefile is referencing because it has a pointer to the
+ * open stage for the lifetime of the scene. */
+ CacheFile *cache_file = nullptr;
+
+ /* Handle instance prototypes.
+ * TODO(makowalski): Move this logic inside USDReaderStage? */
++
++ /* Create prototype objects.
++ * TODO(makowalski): Sort prototype objects by name, as below? */
++ for (const auto &pair : archive->proto_readers()) {
++ for (USDPrimReader *reader : pair.second) {
++ if (reader) {
++ reader->create_object(data->bmain, 0.0);
++ }
++ }
++ }
++
+ for (const auto &pair : archive->proto_readers()) {
+
+ for (USDPrimReader *reader : pair.second) {
+
+ if (!reader) {
+ continue;
+ }
+
+ /* TODO(makowalski): Here and below, should we call
+ * read_object_data() with the actual time? */
+ reader->read_object_data(data->bmain, 0.0);
+
+ apply_cache_file(reader, data, &cache_file);
+
+ Object *ob = reader->object();
+
+ if (!ob) {
+ continue;
+ }
+
+ const USDPrimReader *parent_reader = reader->parent();
+
+ ob->parent = parent_reader ? parent_reader->object() : nullptr;
+
+ /* TODO(makowalski): Handle progress update. */
+ }
+ }
+
+ /* 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) {
diff --cc source/blender/io/usd/intern/usd_reader_stage.cc
index 6bd47704945,df75be849e2..d5631d3ad7d
--- a/source/blender/io/usd/intern/usd_reader_stage.cc
+++ b/source/blender/io/usd/intern/usd_reader_stage.cc
@@@ -291,9 -255,7 +294,7 @@@ USDPrimReader *USDStageReader::collect_
return nullptr;
}
- reader->create_object(bmain, 0.0);
-
- readers_.push_back(reader);
+ r_readers.push_back(reader);
reader->incref();
/* Set each child reader's parent. */
@@@ -364,27 -311,14 +365,37 @@@ void USDStageReader::clear_readers(
readers_.clear();
}
+void USDStageReader::clear_proto_readers()
+{
+ for (auto &pair : proto_readers_) {
+
+ for (USDPrimReader *reader : pair.second) {
+
+ if (!reader) {
+ continue;
+ }
+
+ reader->decref();
+
+ if (reader->refcount() == 0) {
+ delete reader;
+ }
+ }
+
+ pair.second.clear();
+ }
+
+ proto_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 --cc source/blender/io/usd/intern/usd_reader_stage.h
index 51bfc9aa7e5,5f4a343f874..87f8a782568
--- a/source/blender/io/usd/intern/usd_reader_stage.h
+++ b/source/blender/io/usd/intern/usd_reader_stage.h
@@@ -80,16 -63,10 +80,18 @@@ class USDStageReader
return readers_;
};
+ const std::vector<pxr::UsdLuxDomeLight> &dome_lights() const
+ {
+ return dome_lights_;
+ };
+
+ void sort_readers();
+
private:
- USDPrimReader *collect_readers(Main *bmain, const pxr::UsdPrim &prim);
+ USDPrimReader *collect_readers(Main *bmain,
+ const pxr::UsdPrim &prim,
+ pxr::UsdGeomXformCache *xf_cache,
+ std::vector<USDPrimReader *> &r_readers);
/**
* Returns true if the given prim should be included in the
More information about the Bf-blender-cvs
mailing list