[Bf-blender-cvs] [6a2e29f662a] usd-importer-T81257-merge: USD importer stage traversal options.

makowalski noreply at git.blender.org
Mon Feb 8 22:21:43 CET 2021


Commit: 6a2e29f662ab4e160eede2eb0b9c0415fec4581f
Author: makowalski
Date:   Wed Feb 3 16:49:01 2021 -0500
Branches: usd-importer-T81257-merge
https://developer.blender.org/rB6a2e29f662ab4e160eede2eb0b9c0415fec4581f

USD importer stage traversal options.

Added new stage traversal options to filter prim import
based on purpose (guide, proxy and render) and whether
to traverse instances with instance proxies.  Also modified
the stage traversal logic to avoid a small memory leak due to
creating a reader for the pseudo root which is never used or
deleted.

===================================================================

M	source/blender/editors/io/io_usd.c
M	source/blender/io/usd/intern/usd_reader_stage.cc
M	source/blender/io/usd/usd.h

===================================================================

diff --git a/source/blender/editors/io/io_usd.c b/source/blender/editors/io/io_usd.c
index da94e132860..7bb149b1e7b 100644
--- a/source/blender/editors/io/io_usd.c
+++ b/source/blender/editors/io/io_usd.c
@@ -298,11 +298,17 @@ static int wm_usd_import_exec(bContext *C, wmOperator *op)
 
   const bool import_subdiv = RNA_boolean_get(op->ptr, "import_subdiv");
 
+  const bool import_instance_proxies = RNA_boolean_get(op->ptr, "import_instance_proxies");
+
   const bool create_collection = RNA_boolean_get(op->ptr, "create_collection");
 
   char *prim_path_mask = malloc(1024);
   RNA_string_get(op->ptr, "prim_path_mask", prim_path_mask);
 
+  const bool import_guide = RNA_boolean_get(op->ptr, "import_guide");
+  const bool import_proxy = RNA_boolean_get(op->ptr, "import_proxy");
+  const bool import_render = RNA_boolean_get(op->ptr, "import_render");
+
   int offset = 0;
   int sequence_len = 1;
 
@@ -338,7 +344,11 @@ static int wm_usd_import_exec(bContext *C, wmOperator *op)
       import_volumes,
       prim_path_mask,
       import_subdiv,
+      import_instance_proxies,
       create_collection,
+      import_guide,
+      import_proxy,
+      import_render,
   };
 
   bool ok = USD_import(C, filename, &params, as_background_job);
@@ -390,6 +400,9 @@ static void wm_usd_import_draw(bContext *UNUSED(C), wmOperator *op)
   row = uiLayoutRow(box, false);
   uiItemR(row, ptr, "import_subdiv", 0, NULL, ICON_NONE);
 
+  row = uiLayoutRow(box, false);
+  uiItemR(row, ptr, "import_instance_proxies", 0, NULL, ICON_NONE);
+
   row = uiLayoutRow(box, false);
   uiItemR(row, ptr, "create_collection", 0, NULL, ICON_NONE);
 
@@ -411,6 +424,13 @@ static void wm_usd_import_draw(bContext *UNUSED(C), wmOperator *op)
   uiItemR(box, ptr, "import_materials", 0, NULL, ICON_NONE);
   uiItemR(box, ptr, "import_meshes", 0, NULL, ICON_NONE);
   uiItemR(box, ptr, "import_volumes", 0, NULL, ICON_NONE);
+
+  box = uiLayoutBox(layout);
+  uiItemL(box, IFACE_("Purpose"), ICON_NONE);
+  uiItemR(box, ptr, "import_guide", 0, NULL, ICON_NONE);
+  uiItemR(box, ptr, "import_proxy", 0, NULL, ICON_NONE);
+  uiItemR(box, ptr, "import_render", 0, NULL, ICON_NONE);
+
 }
 
 void WM_OT_usd_import(struct wmOperatorType *ot)
@@ -508,6 +528,13 @@ void WM_OT_usd_import(struct wmOperatorType *ot)
                   "If enabled, subdiv surface modifiers will be created based on USD "
                   "SubdivisionScheme attribute");
 
+  RNA_def_boolean(ot->srna,
+                  "import_instance_proxies",
+                  true,
+                  "Import Instance Proxies",
+                  "If enabled, USD instances will be traversed with instance proxies, "
+                  "creating a unique Blender object for each instance");
+
   RNA_def_boolean(ot->srna,
                   "create_collection",
                   false,
@@ -530,6 +557,13 @@ void WM_OT_usd_import(struct wmOperatorType *ot)
                  1024,
                  "",
                  "If set, this will specify a specific primitive from the usd stage");
+
+  RNA_def_boolean(ot->srna, "import_guide", false, "Guide", "When checked, import guide geometry");
+
+  RNA_def_boolean(ot->srna, "import_proxy", true, "Proxy", "When checked, import proxy geometry");
+
+  RNA_def_boolean(
+    ot->srna, "import_render", true, "Render", "When checked, import final render geometry");
 }
 
 #endif /* WITH_USD */
diff --git a/source/blender/io/usd/intern/usd_reader_stage.cc b/source/blender/io/usd/intern/usd_reader_stage.cc
index cda32aa5ea2..bb5511c1c80 100644
--- a/source/blender/io/usd/intern/usd_reader_stage.cc
+++ b/source/blender/io/usd/intern/usd_reader_stage.cc
@@ -72,6 +72,33 @@ bool USDStageReader::valid() const
   return true;
 }
 
+/* Returns true if the given prim should be excluded from the
+ * traversal because it has a purpose which was not requested
+ * by the user; e.g., the prim represents guide geometry and
+ * the import_guide parameter is toggled off. */
+bool _filter_by_purpose(const pxr::UsdPrim &prim,
+                        const USDImportParams &params)
+{
+  if (prim.IsA<pxr::UsdGeomImageable>() &&
+      !(params.import_guide && params.import_proxy && params.import_render)) {
+
+    pxr::UsdGeomImageable imageable(prim);
+    if (imageable) {
+      if (pxr::UsdAttribute purpose_attr = imageable.GetPurposeAttr()) {
+        pxr::TfToken purpose;
+        purpose_attr.Get(&purpose);
+        if ((!params.import_guide && purpose == pxr::UsdGeomTokens->guide) ||
+            (!params.import_proxy && purpose == pxr::UsdGeomTokens->proxy) ||
+            (!params.import_render && purpose == pxr::UsdGeomTokens->render)) {
+          return true;
+        }
+      }
+    }
+  }
+
+  return false;
+}
+
 static USDPrimReader *_handlePrim(Main *bmain,
                                   pxr::UsdStageRefPtr stage,
                                   const USDImportParams &params,
@@ -80,23 +107,34 @@ static USDPrimReader *_handlePrim(Main *bmain,
                                   std::vector<USDPrimReader *> &readers,
                                   ImportSettings &settings)
 {
-  USDPrimReader *reader = NULL;
-
-  reader = create_reader(stage, prim, params, settings);
-
-  if (reader == NULL)
-    return NULL;
+  if (_filter_by_purpose(prim, params)) {
+    return false;
+  }
 
-  reader->parent(parent_reader);
-  reader->createObject(bmain, 0.0);
+  USDPrimReader *reader = NULL;
 
   // This check prevents the pseudo 'root' prim to be added
   if (prim != stage->GetPseudoRoot()) {
+    reader = blender::io::usd::create_reader(stage, prim, params, settings);
+    if (reader == NULL)
+      return NULL;
+
+    reader->parent(parent_reader);
+    reader->createObject(bmain, 0.0);
+
     readers.push_back(reader);
     reader->incref();
   }
 
-  for (const auto &childPrim : prim.GetChildren()) {
+  pxr::Usd_PrimFlagsPredicate filter_predicate = pxr::UsdPrimDefaultPredicate;
+
+  if (params.import_instance_proxies) {
+    filter_predicate = pxr::UsdTraverseInstanceProxies(filter_predicate);
+  }
+
+  pxr::UsdPrimSiblingRange children = prim.GetFilteredChildren(filter_predicate);
+
+  for (const auto &childPrim : children) {
     _handlePrim(bmain, stage, params, childPrim, reader, readers, settings);
   }
 
@@ -151,3 +189,4 @@ void USDStageReader::clear_readers()
 }
 
 }  // Namespace blender::io::usd
+
diff --git a/source/blender/io/usd/usd.h b/source/blender/io/usd/usd.h
index d2d3503c69f..a7275fae33e 100644
--- a/source/blender/io/usd/usd.h
+++ b/source/blender/io/usd/usd.h
@@ -61,7 +61,11 @@ struct USDImportParams {
   bool import_volumes;
   char *prim_path_mask;
   bool import_subdiv;
+  bool import_instance_proxies;
   bool create_collection;
+  bool import_guide;
+  bool import_proxy;
+  bool import_render;
 };
 
 /* The USD_export takes a as_background_job parameter, and returns a boolean.



More information about the Bf-blender-cvs mailing list