Commit: 5f23f5b5168e1ec2203791e9e3bea6d2a2cf77cf
Author: Sybren A. Stüvel
Date: Thu Apr 6 15:35:57 2017 +0200
Branches: master
https://developer.blender.org/rB5f23f5b5168e1ec2203791e9e3bea6d2a2cf77cf
Alembic: do not presume to predict the parent name
AbcExporter::createTransformWriter() tries to predict the parent Xform
name, but if it cannot be found has multiple ways of creating it, possibly
under a different name than originally searched for.
===================================================================
M source/blender/alembic/intern/abc_exporter.cc
M source/blender/alembic/intern/abc_exporter.h
===================================================================
diff --git a/source/blender/alembic/intern/abc_exporter.cc
b/source/blender/alembic/intern/abc_exporter.cc
index d98ebbaafd1..64e6e2ef79a 100644
--- a/source/blender/alembic/intern/abc_exporter.cc
+++ b/source/blender/alembic/intern/abc_exporter.cc
@@ -410,7 +410,7 @@ void AbcExporter::exploreTransform(EvaluationContext
*eval_ctx, Object *ob, Obje
free_object_duplilist(lb);
}
-void AbcExporter::createTransformWriter(Object *ob, Object *parent, Object
*dupliObParent)
+AbcTransformWriter * AbcExporter::createTransformWriter(Object *ob, Object
*parent, Object *dupliObParent)
{
const std::string name = get_object_dag_path_name(ob, dupliObParent);
@@ -419,43 +419,47 @@ void AbcExporter::createTransformWriter(Object *ob,
Object *parent, Object *dupl
BLI_assert(ob != dupliObParent);
/* check if we have already created a transform writer for this object
*/
- if (getXForm(name) != NULL) {
- ABC_LOG(m_settings.logger) << "xform " << name << " already
exists!\n";
- return;
+ AbcTransformWriter *my_writer = getXForm(name);
+ if (my_writer != NULL){
+ return my_writer;
}
- AbcTransformWriter *parent_xform = NULL;
+ AbcTransformWriter *parent_writer = NULL;
+ Alembic::Abc::OObject alembic_parent;
if (parent) {
- const std::string parentname = get_object_dag_path_name(parent,
dupliObParent);
- parent_xform = getXForm(parentname);
-
- if (!parent_xform) {
- if (parent->parent) {
- createTransformWriter(parent, parent->parent,
dupliObParent);
- }
- else if (parent == dupliObParent) {
- if (dupliObParent->parent == NULL) {
- createTransformWriter(parent, NULL,
NULL);
- }
- else {
- createTransformWriter(parent,
dupliObParent->parent, dupliObParent->parent);
- }
+ /* Since there are so many different ways to find parents (as
evident
+ * in the number of conditions below), we can't really look up
the
+ * parent by name. We'll just call createTransformWriter(),
which will
+ * return the parent's AbcTransformWriter pointer. */
+ if (parent->parent) {
+ parent_writer = createTransformWriter(parent,
parent->parent, dupliObParent);
+ }
+ else if (parent == dupliObParent) {
+ if (dupliObParent->parent == NULL) {
+ parent_writer = createTransformWriter(parent,
NULL, NULL);
}
else {
- createTransformWriter(parent, dupliObParent,
dupliObParent);
+ parent_writer = createTransformWriter(parent,
dupliObParent->parent, dupliObParent->parent);
}
-
- parent_xform = getXForm(parentname);
}
- }
+ else {
+ parent_writer = createTransformWriter(parent,
dupliObParent, dupliObParent);
+ }
- if (parent_xform) {
- m_xforms[name] = new AbcTransformWriter(ob,
parent_xform->alembicXform(), parent_xform, m_trans_sampling_index, m_settings);
+ BLI_assert(parent_writer);
+ alembic_parent = parent_writer->alembicXform();
}
else {
- m_xforms[name] = new AbcTransformWriter(ob,
m_writer->archive().getTop(), NULL, m_trans_sampling_index, m_settings);
+ /* Parentless objects still have the "top object" as parent
+ * in Alembic. */
+ alembic_parent = m_writer->archive().getTop();
}
+
+ my_writer = new AbcTransformWriter(ob, alembic_parent, parent_writer,
+ m_trans_sampling_index, m_settings);
+ m_xforms[name] = my_writer;
+ return my_writer;
}
void AbcExporter::createShapeWriters(EvaluationContext *eval_ctx)
diff --git a/source/blender/alembic/intern/abc_exporter.h
b/source/blender/alembic/intern/abc_exporter.h
index f9fde99acd4..485d75ef7fe 100644
--- a/source/blender/alembic/intern/abc_exporter.h
+++ b/source/blender/alembic/intern/abc_exporter.h
@@ -107,7 +107,7 @@ private:
void createTransformWritersHierarchy(EvaluationContext *eval_ctx);
void createTransformWritersFlat();
- void createTransformWriter(Object *ob, Object *parent, Object
*dupliObParent);
+ AbcTransformWriter * createTransformWriter(Object *ob, Object *parent,
Object *dupliObParent);
void exploreTransform(EvaluationContext *eval_ctx, Object *ob, Object
*parent, Object *dupliObParent = NULL);
void exploreObject(EvaluationContext *eval_ctx, Object *ob, Object
*dupliObParent);
void createShapeWriters(EvaluationContext *eval_ctx);
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs