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

Reply via email to