[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