[Bf-blender-cvs] [f63d46d6d24] sybren-usd-experiments: Abstracted some code for moving towards collection instances

Sybren A. Stüvel noreply at git.blender.org
Thu Jun 13 11:13:05 CEST 2019


Commit: f63d46d6d246d3eabc184c723e70f1a10322fc22
Author: Sybren A. Stüvel
Date:   Thu Jun 13 10:40:33 2019 +0200
Branches: sybren-usd-experiments
https://developer.blender.org/rBf63d46d6d246d3eabc184c723e70f1a10322fc22

Abstracted some code for moving towards collection instances

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

M	source/blender/usd/intern/usd_exporter.cc
M	source/blender/usd/intern/usd_writer_abstract.cc
M	source/blender/usd/intern/usd_writer_abstract.h
M	source/blender/usd/intern/usd_writer_mesh.cc
M	source/blender/usd/intern/usd_writer_mesh.h
M	source/blender/usd/intern/usd_writer_transform.cc
M	source/blender/usd/intern/usd_writer_transform.h

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

diff --git a/source/blender/usd/intern/usd_exporter.cc b/source/blender/usd/intern/usd_exporter.cc
index 5bd38363f0e..36f690e603e 100644
--- a/source/blender/usd/intern/usd_exporter.cc
+++ b/source/blender/usd/intern/usd_exporter.cc
@@ -26,13 +26,10 @@
 #include <pxr/usd/usdGeom/tokens.h>
 
 extern "C" {
-#include "BKE_anim.h"
 #include "BKE_mesh_runtime.h"
 #include "BKE_scene.h"
 
 #include "BLI_iterator.h"
-
-#include "DEG_depsgraph_query.h"
 }
 
 USDExporter::USDExporter(const char *filename, ExportSettings &settings)
@@ -69,28 +66,10 @@ void USDExporter::operator()(float &r_progress, bool &r_was_canceled)
   r_progress = 1.0;
 }
 
-bool USDExporter::export_object(Object *ob_eval, const DEGObjectIterData &data_)
+bool USDExporter::export_object(Object *ob_eval, const DEGObjectIterData &degiter_data)
 {
   const pxr::SdfPath root("/");
-  Mesh *mesh = ob_eval->runtime.mesh_eval;
   pxr::SdfPath parent_path;
-  USDAbstractWriter *parent_writer = NULL;
-
-  if (mesh == NULL) {
-    printf("USD-\033[34mSKIPPING\033[0m object %s  type=%d mesh = %p\n",
-           ob_eval->id.name,
-           ob_eval->type,
-           mesh);
-    return false;
-  }
-  if (data_.dupli_object_current != NULL) {
-    printf("USD-\033[34mSKIPPING\033[0m object %s  instance of %s  type=%d mesh = %p\n",
-           ob_eval->id.name,
-           data_.dupli_object_current->ob->id.name,
-           ob_eval->type,
-           mesh);
-    return false;
-  }
 
   // Compute the parent's SdfPath.
   if (ob_eval->parent == NULL) {
@@ -105,21 +84,40 @@ bool USDExporter::export_object(Object *ob_eval, const DEGObjectIterData &data_)
       return false;
     }
     parent_path = path_it->second;
-    parent_writer = usd_writers[parent_path];
   }
 
-  USDAbstractWriter *xformWriter = new USDTransformWriter(
-      m_stage, parent_path, ob_eval, data_, parent_writer);
-
-  USDAbstractWriter *meshWriter = new USDMeshWriter(
-      m_stage, parent_path, ob_eval, data_, parent_writer);
-
-  usd_object_paths[ob_eval] = xformWriter->usd_path();
-  usd_writers[xformWriter->usd_path()] = xformWriter;
-  usd_writers[meshWriter->usd_path()] = meshWriter;
+  // Write the transform. This is always done, even when we don't write the data, as it makes it
+  // possible to reference collection-instantiating empties.
+  USDAbstractWriter *xform_writer = new USDTransformWriter(
+      m_stage, parent_path, ob_eval, degiter_data);
+  const pxr::SdfPath &xform_usd_path = xform_writer->usd_path();
+  usd_object_paths[ob_eval] = xform_usd_path;
+  usd_writers[xform_usd_path] = xform_writer;
+  xform_writer->write();
+
+  // Write the object data, if we know how.
+  // TODO: let the writer determine whether the data is actually supported.
+  USDAbstractWriter *data_writer = NULL;
+  switch (ob_eval->type) {
+    case OB_MESH:
+      data_writer = new USDMeshWriter(m_stage, xform_usd_path, ob_eval, degiter_data);
+      break;
+    default:
+      printf("USD-\033[34mXFORM-ONLY\033[0m object %s  type=%d (no data writer)\n",
+             ob_eval->id.name,
+             ob_eval->type);
+      return false;
+  }
 
-  xformWriter->write();
-  meshWriter->write();
+  if (!data_writer->is_supported()) {
+    printf("USD-\033[34mXFORM-ONLY\033[0m object %s  type=%d (data writer rejects the data)\n",
+           ob_eval->id.name,
+           ob_eval->type);
+  }
+  else {
+    usd_writers[data_writer->usd_path()] = data_writer;
+    data_writer->write();
+  }
 
   return true;
 }
diff --git a/source/blender/usd/intern/usd_writer_abstract.cc b/source/blender/usd/intern/usd_writer_abstract.cc
index 02906d649ca..9b1729072f9 100644
--- a/source/blender/usd/intern/usd_writer_abstract.cc
+++ b/source/blender/usd/intern/usd_writer_abstract.cc
@@ -5,16 +5,11 @@
 USDAbstractWriter::USDAbstractWriter(pxr::UsdStageRefPtr stage,
                                      const pxr::SdfPath &parent_path,
                                      Object *ob_eval,
-                                     const DEGObjectIterData &degiter_data,
-                                     USDAbstractWriter *parent)
+                                     const DEGObjectIterData &degiter_data)
     : m_stage(stage), m_parent_path(parent_path), m_object(ob_eval), m_degiter_data(degiter_data)
 {
   std::string usd_name(pxr::TfMakeValidIdentifier(ob_eval->id.name + 2));
   m_path = m_parent_path.AppendPath(pxr::SdfPath(usd_name));
-
-  if (parent) {
-    parent->add_child(this);
-  }
 }
 
 USDAbstractWriter::~USDAbstractWriter()
@@ -26,9 +21,9 @@ const pxr::SdfPath &USDAbstractWriter::usd_path() const
   return m_path;
 }
 
-void USDAbstractWriter::add_child(USDAbstractWriter *child)
+bool USDAbstractWriter::is_supported() const
 {
-  m_children.push_back(child);
+  return true;
 }
 
 void USDAbstractWriter::write()
diff --git a/source/blender/usd/intern/usd_writer_abstract.h b/source/blender/usd/intern/usd_writer_abstract.h
index 344756ca5b2..ae2b51ef22b 100644
--- a/source/blender/usd/intern/usd_writer_abstract.h
+++ b/source/blender/usd/intern/usd_writer_abstract.h
@@ -18,22 +18,22 @@ class USDAbstractWriter {
   Object *m_object;
 
   const DEGObjectIterData &m_degiter_data;
-  std::vector<USDAbstractWriter *> m_children;
   pxr::SdfPath m_path;
 
  public:
   USDAbstractWriter(pxr::UsdStageRefPtr stage,
                     const pxr::SdfPath &parent_path,
                     Object *ob_eval,
-                    const DEGObjectIterData &degiter_data,
-                    USDAbstractWriter *parent = NULL);
+                    const DEGObjectIterData &degiter_data);
   virtual ~USDAbstractWriter();
 
-  void add_child(USDAbstractWriter *child);
   void write();
-
   const pxr::SdfPath &usd_path() const;
 
+  /* Returns true iff the data to be written is actually supported. This would, for example, allow
+   * a hypothetical camera writer accept a perspective camera but reject an orthogonal one. */
+  virtual bool is_supported() const;
+
  protected:
   virtual void do_write() = 0;
 };
diff --git a/source/blender/usd/intern/usd_writer_mesh.cc b/source/blender/usd/intern/usd_writer_mesh.cc
index d16e51ffeb5..bc721f87f04 100644
--- a/source/blender/usd/intern/usd_writer_mesh.cc
+++ b/source/blender/usd/intern/usd_writer_mesh.cc
@@ -3,6 +3,9 @@
 #include <pxr/usd/usdGeom/mesh.h>
 
 extern "C" {
+#include "BLI_utildefines.h"
+
+#include "BKE_anim.h"
 #include "BKE_library.h"
 
 #include "DNA_mesh_types.h"
@@ -12,9 +15,8 @@ extern "C" {
 USDGenericMeshWriter::USDGenericMeshWriter(pxr::UsdStageRefPtr stage,
                                            const pxr::SdfPath &parent_path,
                                            Object *ob_eval,
-                                           const DEGObjectIterData &degiter_data,
-                                           USDAbstractWriter *parent)
-    : USDAbstractWriter(stage, parent_path, ob_eval, degiter_data, parent)
+                                           const DEGObjectIterData &degiter_data)
+    : USDAbstractWriter(stage, parent_path, ob_eval, degiter_data)
 {
 }
 
@@ -45,8 +47,8 @@ void USDGenericMeshWriter::free_evaluated_mesh(struct Mesh *mesh)
 
 void USDGenericMeshWriter::write_mesh(struct Mesh *mesh)
 {
-  printf("USD-\033[32mexporting\033[0m object %s → %s   isinstance=%d type=%d mesh = %p\n",
-         m_object->id.name,
+  printf("USD-\033[32mexporting\033[0m data %s → %s   isinstance=%d type=%d mesh = %p\n",
+         mesh->id.name,
          m_path.GetString().c_str(),
          m_degiter_data.dupli_object_current != NULL,
          m_object->type,
@@ -87,14 +89,21 @@ void USDGenericMeshWriter::write_mesh(struct Mesh *mesh)
 USDMeshWriter::USDMeshWriter(pxr::UsdStageRefPtr stage,
                              const pxr::SdfPath &parent_path,
                              Object *ob_eval,
-                             const DEGObjectIterData &degiter_data,
-                             USDAbstractWriter *parent)
-    : USDGenericMeshWriter(stage, parent_path, ob_eval, degiter_data, parent)
+                             const DEGObjectIterData &degiter_data)
+    : USDGenericMeshWriter(stage, parent_path, ob_eval, degiter_data)
 {
 }
 
-Mesh *USDMeshWriter::get_evaluated_mesh(bool &r_needsfree)
+Mesh *USDMeshWriter::get_evaluated_mesh(bool &UNUSED(r_needsfree))
 {
-  r_needsfree = false;
+  if (m_degiter_data.dupli_object_current != NULL) {
+    printf("USD-\033[34mSKIPPING\033[0m object %s  instance of %s  type=%d mesh = %p\n",
+           m_object->id.name,
+           m_degiter_data.dupli_object_current->ob->id.name,
+           m_object->type,
+           m_object->runtime.mesh_eval);
+    return NULL;
+  }
+
   return m_object->runtime.mesh_eval;
 }
diff --git a/source/blender/usd/intern/usd_writer_mesh.h b/source/blender/usd/intern/usd_writer_mesh.h
index b3885b48af4..0db130f74fd 100644
--- a/source/blender/usd/intern/usd_writer_mesh.h
+++ b/source/blender/usd/intern/usd_writer_mesh.h
@@ -9,11 +9,10 @@ class USDGenericMeshWriter : public USDAbstractWriter {
   USDGenericMeshWriter(pxr::UsdStageRefPtr stage,
                        const pxr::SdfPath &parent_path,
                        Object *ob_eval,
-                       const DEGObjectIterData &degiter_data,
-                       USDAbstractWriter *parent = NULL);
+                       const DEGObjectIterData &degiter_data);
 
  protected:
-  virtual void do_write();
+  virtual void do_write() override;
 
   virtual Mesh *get_evaluated_mesh(bool &r_needsfree) = 0;
   virtual void free_evaluated_mesh(struct Mesh *mesh);
@@ -27,8 +26,7 @@ class USDMeshWriter : public USDGenericMeshWriter {
   USDMeshWriter(pxr::UsdStageRefPtr stage,
                 const pxr::SdfPath &parent_path,
                 Object *ob_eval,
-                const DEGObjectIterData &degiter_data,
-                USDAbstractWriter *parent = NULL);
+                const DEGObjectIterData &degiter_data);
 
  protected:
   virtual Mesh *get_evaluated_mesh(bool &r_needsfree);
diff --git a/source/blender/usd/intern/usd_writer_transform.cc b/source/blender/usd/intern/usd_writer_transform.cc
index de0d71f924d..0e0b0b9ca25 100644
--- a/source/blender/usd/intern/usd_writer_transform.cc
+++ b/source/blender/usd/intern/usd_writer_transform.cc
@@ -

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list