[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 °iter_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 °iter_data,
- USDAbstractWriter *parent)
+ const DEGObjectIterData °iter_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 °iter_data,
- USDAbstractWriter *parent = NULL);
+ const DEGObjectIterData °iter_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 °iter_data,
- USDAbstractWriter *parent)
- : USDAbstractWriter(stage, parent_path, ob_eval, degiter_data, parent)
+ const DEGObjectIterData °iter_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 °iter_data,
- USDAbstractWriter *parent)
- : USDGenericMeshWriter(stage, parent_path, ob_eval, degiter_data, parent)
+ const DEGObjectIterData °iter_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 °iter_data,
- USDAbstractWriter *parent = NULL);
+ const DEGObjectIterData °iter_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 °iter_data,
- USDAbstractWriter *parent = NULL);
+ const DEGObjectIterData °iter_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