Commit: 5cbff013de5188ecbcf45194ed2f253d789133a0
Author: Sybren A. Stüvel
Date:   Wed Feb 15 15:25:16 2017 +0100
Branches: temp-sybren-alembic
https://developer.blender.org/rB5cbff013de5188ecbcf45194ed2f253d789133a0

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 77141a9119..7b099bdf25 100644
--- a/source/blender/alembic/intern/abc_exporter.cc
+++ b/source/blender/alembic/intern/abc_exporter.cc
@@ -409,7 +409,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);
 
@@ -418,43 +418,45 @@ 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){
-               std::cerr << "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;
 
        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);
+               }
+
+               BLI_assert(parent_writer);
        }
 
-       if (parent_xform) {
-               m_xforms[name] = new AbcTransformWriter(ob, 
parent_xform->alembicXform(), parent_xform, m_trans_sampling_index, m_settings);
+       if (parent_writer) {
+               my_writer = new AbcTransformWriter(ob, 
parent_writer->alembicXform(), parent_writer, m_trans_sampling_index, 
m_settings);
        }
        else {
-               m_xforms[name] = new AbcTransformWriter(ob, 
m_writer->archive().getTop(), NULL, m_trans_sampling_index, m_settings);
+               my_writer = new AbcTransformWriter(ob, 
m_writer->archive().getTop(), NULL, 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 b0eb8e185d..6848eda9ad 100644
--- a/source/blender/alembic/intern/abc_exporter.h
+++ b/source/blender/alembic/intern/abc_exporter.h
@@ -104,7 +104,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
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to