[Bf-blender-cvs] [f030b32e23a] usd-importer-T81257: USD importer: Initial implementation of parenting hierarchy logic.

Michael A. Kowalski noreply at git.blender.org
Fri Oct 9 01:05:03 CEST 2020


Commit: f030b32e23a9ab8c20ad9681a75464f88c6d316c
Author: Michael A. Kowalski
Date:   Thu Oct 8 18:45:23 2020 -0400
Branches: usd-importer-T81257
https://developer.blender.org/rBf030b32e23a9ab8c20ad9681a75464f88c6d316c

USD importer:  Initial implementation of parenting hierarchy logic.

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

M	source/blender/io/usd/CMakeLists.txt
M	source/blender/io/usd/intern/usd_capi.cc
M	source/blender/io/usd/intern/usd_reader_mesh.cc
M	source/blender/io/usd/intern/usd_reader_object.cc
M	source/blender/io/usd/intern/usd_reader_object.h
A	source/blender/io/usd/intern/usd_reader_transform.cc
A	source/blender/io/usd/intern/usd_reader_transform.h
M	source/blender/io/usd/intern/usd_util.cc

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

diff --git a/source/blender/io/usd/CMakeLists.txt b/source/blender/io/usd/CMakeLists.txt
index 70cd8b58b75..423bc9ec905 100644
--- a/source/blender/io/usd/CMakeLists.txt
+++ b/source/blender/io/usd/CMakeLists.txt
@@ -57,6 +57,7 @@ set(SRC
   intern/usd_hierarchy_iterator.cc
   intern/usd_reader_mesh.cc
   intern/usd_reader_object.cc
+  intern/usd_reader_transform.cc
   intern/usd_util.cc
   intern/usd_writer_abstract.cc
   intern/usd_writer_camera.cc
@@ -72,6 +73,7 @@ set(SRC
   intern/usd_importer_context.h
   intern/usd_reader_mesh.h
   intern/usd_reader_object.h
+  intern/usd_reader_transform.h
   intern/usd_util.h
   intern/usd_writer_abstract.h
   intern/usd_writer_camera.h
diff --git a/source/blender/io/usd/intern/usd_capi.cc b/source/blender/io/usd/intern/usd_capi.cc
index 8070473c1dd..27b45f47981 100644
--- a/source/blender/io/usd/intern/usd_capi.cc
+++ b/source/blender/io/usd/intern/usd_capi.cc
@@ -296,7 +296,7 @@ static void import_startjob(void *user_data, short *stop, short *do_update, floa
       max_time = std::max(max_time, reader->maxTime());
     }
     else {
-      std::cerr << "Object " << reader->name() << " in USD file " << data->filename
+      std::cerr << "Object " << reader->prim_path() << " in USD file " << data->filename
                 << " is invalid.\n";
     }
 
@@ -309,7 +309,22 @@ static void import_startjob(void *user_data, short *stop, short *do_update, floa
     }
   }
 
-  // Setup transformations.
+  /* Setup parenthood. */
+  for (iter = data->readers.begin(); iter != data->readers.end(); ++iter) {
+    const UsdObjectReader *reader = *iter;
+
+    Object *ob = reader->object();
+
+    if (!ob) {
+      continue;
+    }
+
+    const UsdObjectReader *parent_reader = reader->parent();
+
+    ob->parent = parent_reader ? parent_reader->object() : nullptr;
+  }
+
+  /* Setup transformations. */
   i = 0;
   for (iter = data->readers.begin(); iter != data->readers.end(); ++iter) {
     UsdObjectReader *reader = *iter;
diff --git a/source/blender/io/usd/intern/usd_reader_mesh.cc b/source/blender/io/usd/intern/usd_reader_mesh.cc
index 5cf30d8b79a..c5780c496fe 100644
--- a/source/blender/io/usd/intern/usd_reader_mesh.cc
+++ b/source/blender/io/usd/intern/usd_reader_mesh.cc
@@ -276,7 +276,7 @@ void UsdMeshReader::readObjectData(Main *bmain, double time)
   }
 
   /* Determine mesh visibility.
-   * TODO: Consider optimizations to avoid this expensive call,
+   * TODO(makowalski): Consider optimizations to avoid this expensive call,
    * for example, by determining visibility during stage traversal. */
   pxr::TfToken vis_tok = this->mesh_.ComputeVisibility();
 
@@ -284,9 +284,11 @@ void UsdMeshReader::readObjectData(Main *bmain, double time)
     return;
   }
 
-  Mesh *mesh = BKE_mesh_add(bmain, data_name_.c_str());
+  Mesh *mesh = BKE_mesh_add(bmain, prim_name_.c_str());
 
-  object_ = BKE_object_add_only_object(bmain, OB_MESH, object_name_.c_str());
+  std::string obj_name = merged_with_parent_ ? prim_parent_name_ : prim_name_;
+
+  object_ = BKE_object_add_only_object(bmain, OB_MESH, obj_name.c_str());
   object_->data = mesh;
 
   Mesh *read_mesh = this->read_mesh(mesh, time, MOD_MESHSEQ_READ_ALL, NULL);
diff --git a/source/blender/io/usd/intern/usd_reader_object.cc b/source/blender/io/usd/intern/usd_reader_object.cc
index 662c5d25e57..e93c2871d62 100644
--- a/source/blender/io/usd/intern/usd_reader_object.cc
+++ b/source/blender/io/usd/intern/usd_reader_object.cc
@@ -43,22 +43,23 @@
 namespace blender::io::usd {
 
 UsdObjectReader::UsdObjectReader(const pxr::UsdPrim &prim, const USDImporterContext &context)
-    : name_(""),
-      object_name_(""),
-      data_name_(""),
-      object_(NULL),
+    : prim_path_(""),
+      prim_parent_name_(""),
+      prim_name_(""),
+      object_(nullptr),
       prim_(prim),
       context_(context),
       min_time_(std::numeric_limits<double>::max()),
       max_time_(std::numeric_limits<double>::min()),
-      refcount_(0)
+      refcount_(0),
+      parent_(nullptr),
+      merged_with_parent_(false)
 {
-  name_ = prim.GetPath().GetString();
-
-  data_name_ = prim.GetName().GetString();
+  prim_path_ = prim.GetPath().GetString();
+  prim_name_ = prim.GetName().GetString();
 
   pxr::UsdPrim parent = prim.GetParent();
-  object_name_ = parent ? parent.GetName().GetString() : data_name_;
+  prim_parent_name_ = parent ? parent.GetName().GetString() : prim_name_;
 }
 
 UsdObjectReader::~UsdObjectReader()
@@ -128,11 +129,24 @@ void UsdObjectReader::read_matrix(float r_mat[4][4] /* local matrix */,
 
   /* TODO(makowalski):  Check for constant transform. */
 
-  pxr::GfMatrix4d usd_local_to_world = xformable.ComputeLocalToWorldTransform(time);
+  pxr::GfMatrix4d usd_local_xf;
+  bool reset_xform_stack;
+  xformable.GetLocalTransformation(&usd_local_xf, &reset_xform_stack, time);
 
-  double double_mat[4][4];
+  if (merged_with_parent_) {
+    /* Take into account the parent's local xform. */
+    pxr::UsdGeomXformable parent_xformable(prim_.GetParent());
 
-  usd_local_to_world.Get(double_mat);
+    if (parent_xformable) {
+      pxr::GfMatrix4d usd_parent_local_xf;
+      parent_xformable.GetLocalTransformation(&usd_parent_local_xf, &reset_xform_stack, time);
+
+      usd_local_xf = usd_parent_local_xf * usd_local_xf;
+    }
+  }
+
+  double double_mat[4][4];
+  usd_local_xf.Get(double_mat);
 
   for (int i = 0; i < 4; ++i) {
     for (int j = 0; j < 4; ++j) {
diff --git a/source/blender/io/usd/intern/usd_reader_object.h b/source/blender/io/usd/intern/usd_reader_object.h
index 8d934f8dcca..649c60f8835 100644
--- a/source/blender/io/usd/intern/usd_reader_object.h
+++ b/source/blender/io/usd/intern/usd_reader_object.h
@@ -33,15 +33,18 @@ struct Object;
 namespace blender::io::usd {
 
 class UsdObjectReader {
+public:
+  typedef std::vector<UsdObjectReader *> ptr_vector;
+
  protected:
   /* The USD prim path. */
-  std::string name_;
+  std::string prim_path_;
 
   /* The USD prim parent name. */
-  std::string object_name_;
+  std::string prim_parent_name_;
 
   /* The USD prim name. */
-  std::string data_name_;
+  std::string prim_name_;
 
   Object *object_;
   pxr::UsdPrim prim_;
@@ -56,8 +59,11 @@ class UsdObjectReader {
    * modifiers and/or constraints. */
   int refcount_;
 
+  UsdObjectReader *parent_;
+
+  bool merged_with_parent_;
+
  public:
-  typedef std::vector<UsdObjectReader *> ptr_vector;
 
   explicit UsdObjectReader(const pxr::UsdPrim &prim, const USDImporterContext &context);
 
@@ -69,17 +75,35 @@ class UsdObjectReader {
 
   void setObject(Object *ob);
 
-  const std::string &name() const
+  UsdObjectReader *parent() const
+  {
+    return parent_;
+  }
+
+  void set_parent(UsdObjectReader *par)
+  {
+    parent_ = par;
+  }
+
+  void set_merged_with_parent(bool flag) {
+    merged_with_parent_ = flag;
+  }
+
+  bool merged_with_parent() const {
+    return merged_with_parent_;
+  }
+
+  const std::string &prim_path() const
   {
-    return name_;
+    return prim_path_;
   }
-  const std::string &object_name() const
+  const std::string &prim_parent_name() const
   {
-    return object_name_;
+    return prim_parent_name_;
   }
-  const std::string &data_name() const
+  const std::string &prim_name() const
   {
-    return data_name_;
+    return prim_name_;
   }
 
   virtual bool valid() const = 0;
diff --git a/source/blender/io/usd/intern/usd_reader_transform.cc b/source/blender/io/usd/intern/usd_reader_transform.cc
new file mode 100644
index 00000000000..d12c9d6ff8c
--- /dev/null
+++ b/source/blender/io/usd/intern/usd_reader_transform.cc
@@ -0,0 +1,58 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2020 Blender Foundation.
+ * All rights reserved.
+ */
+
+#include "usd_reader_transform.h"
+
+#include "BKE_object.h"
+#include "DNA_object_types.h"
+
+
+namespace blender::io::usd {
+
+UsdTransformReader::UsdTransformReader(const pxr::UsdPrim &prim, const USDImporterContext &context)
+  : UsdObjectReader(prim, context), xform_(prim)
+{
+
+}
+
+bool UsdTransformReader::valid() const
+{
+  return static_cast<bool>(xform_);
+}
+
+void UsdTransformReader::readObjectData(Main *bmain, double time)
+{
+  if (!this->valid()) {
+    return;
+  }
+
+  /* Determine prim visibility.
+   * TODO(makowalski): Consider optimizations to avoid this expensive call,
+   * for example, by determining visibility during stage traversal. */
+  pxr::TfToken vis_tok = this->xform_.ComputeVisibility();
+
+  if (vis_tok == pxr::UsdGeomTokens->invisible) {
+    return;
+  }
+
+  this->object_ = BKE_object_add_only_object(bmain, OB_EMPTY, this->prim_name_.c_str());
+  this->object_->data = NULL;
+}
+
+}  // namespace blender::io::usd
diff --git a/source/blender/io/usd/intern/usd_reader_transform.h b/source/blender/io/usd/intern/usd_reader_transform.h
new file mode 100644
index 00000000000..a6c79fbf156
--- /dev/null
+++ b/source/blender/io/usd/intern/usd_reader_transform.h
@@ -0,0 +1,39 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public L

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list