[Bf-blender-cvs] [deee74279c2] sybren-usd: USD: Pass 'selected/visible only' flags to the exporter

Sybren A. Stüvel noreply at git.blender.org
Fri Jun 21 16:40:18 CEST 2019


Commit: deee74279c29918fab1a2cc234979b2598db7139
Author: Sybren A. Stüvel
Date:   Fri Jun 21 14:18:54 2019 +0200
Branches: sybren-usd
https://developer.blender.org/rBdeee74279c29918fab1a2cc234979b2598db7139

USD: Pass 'selected/visible only' flags to the exporter

This isn't handled properly by the exporter yet.

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

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

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

diff --git a/source/blender/editors/io/io_usd.c b/source/blender/editors/io/io_usd.c
index 21055ef0309..8764e8fef1e 100644
--- a/source/blender/editors/io/io_usd.c
+++ b/source/blender/editors/io/io_usd.c
@@ -42,8 +42,8 @@
 
 static int wm_usd_export_invoke(bContext *C, wmOperator *op, const wmEvent *event)
 {
-  if (!RNA_struct_property_is_set(op->ptr, "_as_background_job")) {
-    RNA_boolean_set(op->ptr, "_as_background_job", true);
+  if (!RNA_struct_property_is_set(op->ptr, "as_background_job")) {
+    RNA_boolean_set(op->ptr, "as_background_job", true);
   }
 
   if (!RNA_struct_property_is_set(op->ptr, "filepath")) {
@@ -78,12 +78,18 @@ static int wm_usd_export_exec(bContext *C, wmOperator *op)
   char filename[FILE_MAX];
   RNA_string_get(op->ptr, "filepath", filename);
 
-  struct USDExportParams params = {};
-
   /* Take some defaults from the scene, if not specified explicitly. */
   Scene *scene = CTX_data_scene(C);
 
-  const bool as_background_job = RNA_boolean_get(op->ptr, "_as_background_job");
+  const bool as_background_job = RNA_boolean_get(op->ptr, "as_background_job");
+  const bool selected_objects_only = RNA_boolean_get(op->ptr, "selected_objects_only");
+  const bool visible_objects_only = RNA_boolean_get(op->ptr, "visible_objects_only");
+
+  struct USDExportParams params = {
+      .selected_objects_only = selected_objects_only,
+      .visible_objects_only = visible_objects_only,
+  };
+
   bool ok = USD_export(scene, C, filename, &params, as_background_job);
 
   return as_background_job || ok ? OPERATOR_FINISHED : OPERATOR_CANCELLED;
@@ -102,9 +108,23 @@ void WM_OT_usd_export(struct wmOperatorType *ot)
   WM_operator_properties_filesel(
       ot, 0, FILE_BLENDER, FILE_SAVE, WM_FILESEL_FILEPATH, FILE_DEFAULTDISPLAY, FILE_SORT_ALPHA);
 
+  RNA_def_boolean(ot->srna,
+                  "selected_objects_only",
+                  false,
+                  "Only export selected objects",
+                  "Only selected objects are exported. Unselected parents of selected objects are "
+                  "exported as empty transform.");
+
+  RNA_def_boolean(ot->srna,
+                  "visible_objects_only",
+                  false,
+                  "Only export visible objects",
+                  "Only visible objects are exported. Invisible parents of visible objects are "
+                  "exported as empty transform.");
+
   RNA_def_boolean(
       ot->srna,
-      "_as_background_job",
+      "as_background_job",
       false,
       "Run as Background Job",
       "Enable this to run the import in the background, disable to block Blender while importing. "
diff --git a/source/blender/usd/intern/usd_capi.cc b/source/blender/usd/intern/usd_capi.cc
index 5249248557f..906b0de8523 100644
--- a/source/blender/usd/intern/usd_capi.cc
+++ b/source/blender/usd/intern/usd_capi.cc
@@ -102,7 +102,7 @@ static void export_startjob(void *customdata, short *stop, short *do_update, flo
     pxr::UsdStageRefPtr usd_stage = pxr::UsdStage::CreateNew(data->filename);
     usd_stage->SetMetadata(pxr::UsdGeomTokens->upAxis, pxr::VtValue(pxr::UsdGeomTokens->z));
 
-    USDHierarchyIterator iter(data->depsgraph, usd_stage);
+    USDHierarchyIterator iter(data->depsgraph, usd_stage, data->params);
 
     // This should be done for every frame, when exporting animation:
     iter.iterate();
diff --git a/source/blender/usd/intern/usd_hierarchy_iterator.cc b/source/blender/usd/intern/usd_hierarchy_iterator.cc
index 4d720db9f29..805265bb269 100644
--- a/source/blender/usd/intern/usd_hierarchy_iterator.cc
+++ b/source/blender/usd/intern/usd_hierarchy_iterator.cc
@@ -1,3 +1,4 @@
+#include "../usd.h"
 #include "usd_hierarchy_iterator.h"
 #include "usd_writer_abstract.h"
 #include "usd_writer_mesh.h"
@@ -19,11 +20,25 @@ extern "C" {
 #include "DNA_object_types.h"
 }
 
-USDHierarchyIterator::USDHierarchyIterator(Depsgraph *depsgraph, pxr::UsdStageRefPtr stage)
-    : AbstractHierarchyIterator(depsgraph), stage(stage)
+USDHierarchyIterator::USDHierarchyIterator(Depsgraph *depsgraph,
+                                           pxr::UsdStageRefPtr stage,
+                                           const USDExportParams &params)
+    : AbstractHierarchyIterator(depsgraph), stage(stage), params(params)
 {
 }
 
+bool USDHierarchyIterator::should_visit_object(const Object *object) const
+{
+  if (params.selected_objects_only && (object->base_flag & BASE_SELECTED) == 0) {
+    return false;
+  }
+  if (params.visible_objects_only && (object->base_flag & BASE_VISIBLE) == 0) {
+    return false;
+  }
+
+  return AbstractHierarchyIterator::should_visit_object(object);
+}
+
 void USDHierarchyIterator::delete_object_writer(AbstractHierarchyWriter *writer)
 {
   delete static_cast<USDAbstractWriter *>(writer);
diff --git a/source/blender/usd/intern/usd_hierarchy_iterator.h b/source/blender/usd/intern/usd_hierarchy_iterator.h
index d81ec6d08e6..7be659c6081 100644
--- a/source/blender/usd/intern/usd_hierarchy_iterator.h
+++ b/source/blender/usd/intern/usd_hierarchy_iterator.h
@@ -16,11 +16,16 @@ struct USDAbstractWriter;
 class USDHierarchyIterator : public AbstractHierarchyIterator {
  private:
   pxr::UsdStageRefPtr stage;
+  const USDExportParams ¶ms;
 
  public:
-  USDHierarchyIterator(Depsgraph *depsgraph, pxr::UsdStageRefPtr stage);
+  USDHierarchyIterator(Depsgraph *depsgraph,
+                       pxr::UsdStageRefPtr stage,
+                       const USDExportParams &params);
 
  protected:
+  virtual bool should_visit_object(const Object *object) const override;
+
   virtual AbstractHierarchyWriter *create_xform_writer(const HierarchyContext &context) override;
   virtual AbstractHierarchyWriter *create_data_writer(const HierarchyContext &context) override;
 
diff --git a/source/blender/usd/usd.h b/source/blender/usd/usd.h
index 46703703940..d5490695b70 100644
--- a/source/blender/usd/usd.h
+++ b/source/blender/usd/usd.h
@@ -29,8 +29,8 @@ struct Scene;
 struct bContext;
 
 struct USDExportParams {
-  bool selected_only;
-  bool visible_layers_only;
+  bool selected_objects_only;
+  bool visible_objects_only;
 };
 
 /* The USD_export takes a as_background_job parameter, and returns a boolean.



More information about the Bf-blender-cvs mailing list