[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