Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormakowalski <makowalski@nvidia.com>2021-02-04 00:49:01 +0300
committermakowalski <makowalski@nvidia.com>2021-02-05 00:23:55 +0300
commit6a2e29f662ab4e160eede2eb0b9c0415fec4581f (patch)
tree1119961d4d2812cd41eea1620a815a61ebeb39fd
parent3f03983976602cd02b40cee6610b0bf2679b0a49 (diff)
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.
-rw-r--r--source/blender/editors/io/io_usd.c34
-rw-r--r--source/blender/io/usd/intern/usd_reader_stage.cc57
-rw-r--r--source/blender/io/usd/usd.h4
3 files changed, 86 insertions, 9 deletions
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);
@@ -391,6 +401,9 @@ static void wm_usd_import_draw(bContext *UNUSED(C), wmOperator *op)
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);
// row = uiLayoutRow(box, false);
@@ -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)
@@ -509,6 +529,13 @@ void WM_OT_usd_import(struct wmOperatorType *ot)
"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,
"Create Collection",
@@ -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.