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. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs