Commit: d92863a77153ecf6138ac42e3856cb975fd19301
Author: Kévin Dietrich
Date:   Mon Jul 4 08:25:22 2016 +0200
Branches: alembic_basic_io
https://developer.blender.org/rBd92863a77153ecf6138ac42e3856cb975fd19301

Fix some hierarchical issues.

This fixes the rare issue found in some Maya and Unity files, where an
object would still be scaled even though it has a parent which was
already scaled.

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

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

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

diff --git a/source/blender/alembic/intern/abc_object.cc 
b/source/blender/alembic/intern/abc_object.cc
index ac80e08..ad275ba 100644
--- a/source/blender/alembic/intern/abc_object.cc
+++ b/source/blender/alembic/intern/abc_object.cc
@@ -131,7 +131,13 @@ AbcObjectReader::AbcObjectReader(const IObject &object, 
ImportSettings &settings
        std::vector<std::string> parts;
        split(m_name, '/', parts);
 
-       m_object_name = m_data_name = parts[parts.size() - 1];
+       if (parts.size() >= 2) {
+               m_object_name = parts[parts.size() - 2];
+               m_data_name = parts[parts.size() - 1];
+       }
+       else {
+               m_object_name = m_data_name = parts[parts.size() - 1];
+       }
 }
 
 AbcObjectReader::~AbcObjectReader()
@@ -150,13 +156,34 @@ Object *AbcObjectReader::object() const
 void AbcObjectReader::readObjectMatrix(const float time)
 {
        IXform ixform;
+       bool has_alembic_parent = false;
 
+       /* Check that we have an empty object (locator, bone head/tail...).  */
        if (IXform::matches(m_iobject.getMetaData())) {
                ixform = IXform(m_iobject, Alembic::AbcGeom::kWrapExisting);
+
+               /* See comment below. */
+               has_alembic_parent = m_iobject.getParent().getParent().valid();
        }
+       /* 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);
+
+               /* This is a bit hackish, but we need to make sure that extra
+                * transformations added to the matrix (rotation/scale) are 
only applied
+                * to root objects. The way objects and their hierarchy are 
created will
+                * need to be revisited at some point but for now this seems to 
do the
+                * trick.
+                *
+                * Explanation of the trick:
+                * The first getParent() will return this object's 
transformation matrix.
+                * The second getParent() will get the parent of the transform, 
but this
+                * might be the archive root ('/') which is valid, so we go 
passed it to
+                * make sure that there is no parent.
+                */
+               has_alembic_parent = 
m_iobject.getParent().getParent().getParent().valid();
        }
+       /* Should not happen. */
        else {
                return;
        }
@@ -171,7 +198,7 @@ void AbcObjectReader::readObjectMatrix(const float time)
        Alembic::AbcGeom::XformSample xs;
        schema.get(xs, sample_sel);
 
-       create_input_transform(sample_sel, ixform, m_object, m_object->obmat, 
m_settings->scale);
+       create_input_transform(sample_sel, ixform, m_object, m_object->obmat, 
m_settings->scale, has_alembic_parent);
 
        invert_m4_m4(m_object->imat, m_object->obmat);
 
diff --git a/source/blender/alembic/intern/abc_util.cc 
b/source/blender/alembic/intern/abc_util.cc
index a9e11f9..89969dd 100644
--- a/source/blender/alembic/intern/abc_util.cc
+++ b/source/blender/alembic/intern/abc_util.cc
@@ -204,7 +204,7 @@ void create_transform_matrix(float r_mat[4][4])
 
 void create_input_transform(const Alembic::AbcGeom::ISampleSelector 
&sample_sel,
                             const Alembic::AbcGeom::IXform &ixform, Object *ob,
-                            float r_mat[4][4], float scale)
+                            float r_mat[4][4], float scale, bool 
has_alembic_parent)
 {
 
        const Alembic::AbcGeom::IXformSchema &ixform_schema = 
ixform.getSchema();
@@ -230,7 +230,8 @@ void create_input_transform(const 
Alembic::AbcGeom::ISampleSelector &sample_sel,
        if (ob->parent) {
                mul_m4_m4m4(r_mat, ob->parent->obmat, r_mat);
        }
-       else {
+       /* TODO(kevin) */
+       else if (!has_alembic_parent) {
                /* Only apply scaling to root objects, parenting will propagate 
it. */
                float scale_mat[4][4];
                scale_m4_fl(scale_mat, scale);
diff --git a/source/blender/alembic/intern/abc_util.h 
b/source/blender/alembic/intern/abc_util.h
index 4cc91b5..b2ab046 100644
--- a/source/blender/alembic/intern/abc_util.h
+++ b/source/blender/alembic/intern/abc_util.h
@@ -52,7 +52,7 @@ bool begins_with(const TContainer &input, const TContainer 
&match)
 
 void create_input_transform(const Alembic::AbcGeom::ISampleSelector 
&sample_sel,
                             const Alembic::AbcGeom::IXform &ixform, Object *ob,
-                            float r_mat[4][4], float scale);
+                            float r_mat[4][4], float scale, bool 
has_alembic_parent = false);
 
 template <typename Schema>
 void get_min_max_time(const Schema &schema, chrono_t &min, chrono_t &max)

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to