[Bf-blender-cvs] [5cbff013de] temp-sybren-alembic: Alembic: do not presume to predict the parent name

Sybren A. Stüvel noreply at git.blender.org
Fri Feb 24 17:05:47 CET 2017


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);




More information about the Bf-blender-cvs mailing list