[Bf-blender-cvs] [75597c03be] temp-sybren-alembic: Alembic import: separated reading matrix and getting the appropriate Xform object

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


Commit: 75597c03be7270c507eca3de765b4b706f8d1ff1
Author: Sybren A. Stüvel
Date:   Thu Feb 23 15:58:36 2017 +0100
Branches: temp-sybren-alembic
https://developer.blender.org/rB75597c03be7270c507eca3de765b4b706f8d1ff1

Alembic import: separated reading matrix and getting the appropriate Xform object

Also added a bit better error reporting, instead of silently ignoring
invalid Alembic data.

===================================================================

M	source/blender/alembic/intern/abc_object.cc
M	source/blender/alembic/intern/abc_object.h

===================================================================

diff --git a/source/blender/alembic/intern/abc_object.cc b/source/blender/alembic/intern/abc_object.cc
index 3a3b076dbf..7250ebb4c0 100644
--- a/source/blender/alembic/intern/abc_object.cc
+++ b/source/blender/alembic/intern/abc_object.cc
@@ -236,37 +236,50 @@ void AbcObjectReader::readObjectMatrix(const float time)
 	}
 }
 
-void AbcObjectReader::read_matrix(float mat[4][4], const float time, const float scale, bool &is_constant)
-{
-	IXform ixform;
-	IObject ixform_parent;
 
+Alembic::AbcGeom::IXform AbcObjectReader::xform()
+{
 	/* Check that we have an empty object (locator, bone head/tail...).  */
 	if (IXform::matches(m_iobject.getMetaData())) {
-		ixform = IXform(m_iobject, Alembic::AbcGeom::kWrapExisting);
-		ixform_parent = m_iobject.getParent();
+		return IXform(m_iobject, Alembic::AbcGeom::kWrapExisting);
 	}
-	/* Check that we have an object with actual data. */
-	else if (IXform::matches(m_iobject.getParent().getMetaData())) {
-		ixform = IXform(m_iobject.getParent(), Alembic::AbcGeom::kWrapExisting);
-		ixform_parent = m_iobject.getParent().getParent();
+
+	/* Check that we have an object with actual data, in which case the
+	 * parent Alembic object should contain the transform. */
+	IObject abc_parent = m_iobject.getParent();
+
+	/* The archive's top object can be recognised by not having a parent. */
+	if (abc_parent.getParent()
+	        && IXform::matches(abc_parent.getMetaData())) {
+		return IXform(abc_parent, Alembic::AbcGeom::kWrapExisting);
 	}
+
 	/* Should not happen. */
-	else {
-		std::cerr << "AbcObjectReader::read_matrix: "
-		          << "unable to find IXform for Alembic object '"
-		          << m_iobject.getFullName() << "'\n";
-		BLI_assert(false);
+	std::cerr << "AbcObjectReader::xform(): "
+	          << "unable to find IXform for Alembic object '"
+	          << m_iobject.getFullName() << "'\n";
+	BLI_assert(false);
+
+	return IXform();
+}
+
+
+void AbcObjectReader::read_matrix(float mat[4][4], const float time, const float scale, bool &is_constant)
+{
+	IXform ixform = xform();
+	if (!ixform) {
 		return;
 	}
 
-	const IXformSchema &schema(ixform.getSchema());
-
+	const IXformSchema & schema(ixform.getSchema());
 	if (!schema.valid()) {
+		std::cerr << "Alembic object " << ixform.getFullName()
+		          << " has an invalid schema." << std::endl;
 		return;
 	}
 
 	bool has_alembic_parent;
+	IObject ixform_parent = ixform.getParent();
 	if (!ixform_parent.getParent()) {
 		/* The archive top object certainly is not a transform itself, so handle
 		 * it as "no parent". */
diff --git a/source/blender/alembic/intern/abc_object.h b/source/blender/alembic/intern/abc_object.h
index 7d400f17a2..6d97c0359b 100644
--- a/source/blender/alembic/intern/abc_object.h
+++ b/source/blender/alembic/intern/abc_object.h
@@ -158,6 +158,12 @@ public:
 
 	const Alembic::Abc::IObject &iobject() const;
 
+	/**
+	 * Returns the transform of this object. This can be the Alembic object
+	 * itself (in case of an Empty) or it can be the parent Alembic object.
+	 */
+	virtual Alembic::AbcGeom::IXform xform();
+
 	Object *object() const;
 	void object(Object *ob);




More information about the Bf-blender-cvs mailing list