Commit: b6ba4e7067581e728e7c1c8546333f3d3bfefe5d
Author: Kévin Dietrich
Date:   Mon May 30 19:14:29 2016 +0200
Branches: alembic_basic_io
https://developer.blender.org/rBb6ba4e7067581e728e7c1c8546333f3d3bfefe5d

Partially revert some previous commits:

- Avoid double matrix multiplication.
- Also build transforms with no children as empties.

They wery bringing some regressions.

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

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

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

diff --git a/source/blender/alembic/intern/abc_mesh.cc 
b/source/blender/alembic/intern/abc_mesh.cc
index ffe7482..b4b7b85 100644
--- a/source/blender/alembic/intern/abc_mesh.cc
+++ b/source/blender/alembic/intern/abc_mesh.cc
@@ -1295,7 +1295,7 @@ void AbcMeshReader::readFaceSetsSample(Main *bmain, Mesh 
*mesh, size_t poly_star
 /* ***************************** AbcEmptyReader ***************************** 
*/
 
 AbcEmptyReader::AbcEmptyReader(const Alembic::Abc::IObject &object, 
ImportSettings &settings)
-    : AbcObjectReader(object, settings, false)
+    : AbcObjectReader(object, settings)
 {}
 
 bool AbcEmptyReader::valid() const
diff --git a/source/blender/alembic/intern/abc_object.cc 
b/source/blender/alembic/intern/abc_object.cc
index 8664dcb..14803cf 100644
--- a/source/blender/alembic/intern/abc_object.cc
+++ b/source/blender/alembic/intern/abc_object.cc
@@ -306,7 +306,7 @@ bool AbcObjectWriter::getPropertyValue(ID *id, const 
std::string &name, double &
 
 /* ****************************** object reader ***************************** 
*/
 
-AbcObjectReader::AbcObjectReader(const IObject &object, ImportSettings 
&settings, bool has_data)
+AbcObjectReader::AbcObjectReader(const IObject &object, ImportSettings 
&settings)
     : m_name("")
     , m_object_name("")
     , m_data_name("")
@@ -318,9 +318,7 @@ AbcObjectReader::AbcObjectReader(const IObject &object, 
ImportSettings &settings
        std::vector<std::string> parts;
        split(m_name, '/', parts);
 
-       if (has_data) {
-               assert(parts.size() >= 2);
-
+       if (parts.size() >= 2) {
                m_object_name = parts[parts.size() - 2];
                m_data_name = parts[parts.size() - 1];
        }
diff --git a/source/blender/alembic/intern/abc_object.h 
b/source/blender/alembic/intern/abc_object.h
index 2062a10..4afcee8 100644
--- a/source/blender/alembic/intern/abc_object.h
+++ b/source/blender/alembic/intern/abc_object.h
@@ -92,7 +92,7 @@ protected:
        ImportSettings *m_settings;
 
 public:
-       explicit AbcObjectReader(const Alembic::Abc::IObject &object, 
ImportSettings &settings, bool has_data = true);
+       explicit AbcObjectReader(const Alembic::Abc::IObject &object, 
ImportSettings &settings);
 
        virtual ~AbcObjectReader();
 
diff --git a/source/blender/alembic/intern/abc_util.cc 
b/source/blender/alembic/intern/abc_util.cc
index 00c401b..e60c354 100644
--- a/source/blender/alembic/intern/abc_util.cc
+++ b/source/blender/alembic/intern/abc_util.cc
@@ -207,10 +207,26 @@ void create_transform_matrix(float r_mat[4][4])
 static void get_matrix(const Alembic::AbcGeom::ISampleSelector &sample_sel,
                        const Alembic::AbcGeom::IXform &leaf, Imath::M44d &m)
 {
-       Alembic::AbcGeom::IXformSchema xform_schema = leaf.getSchema();
+       Alembic::AbcGeom::IXformSchema leaf_schema = leaf.getSchema();
     Alembic::AbcGeom::XformSample xs;
-       xform_schema.get(xs, sample_sel);
+       leaf_schema.get(xs, sample_sel);
        m = xs.getMatrix();
+
+       if (!xs.getInheritsXforms()) {
+               return;
+       }
+
+       Alembic::AbcGeom::IObject obj = leaf.getParent();
+
+       if (!obj.valid() || 
!Alembic::AbcGeom::IXform::matches(obj.getHeader())) {
+               return;
+       }
+
+       Alembic::AbcGeom::IXform parent(obj, Alembic::AbcGeom::kWrapExisting);
+       Alembic::AbcGeom::IXformSchema parent_schema = parent.getSchema();
+    Alembic::AbcGeom::XformSample parent_xs;
+       parent_schema.get(parent_xs, sample_sel);
+       m = parent_xs.getMatrix() * m;
 }
 
 void create_input_transform(const Alembic::AbcGeom::ISampleSelector 
&sample_sel,
diff --git a/source/blender/alembic/intern/alembic_capi.cc 
b/source/blender/alembic/intern/alembic_capi.cc
index a14f657..f96be72 100644
--- a/source/blender/alembic/intern/alembic_capi.cc
+++ b/source/blender/alembic/intern/alembic_capi.cc
@@ -451,7 +451,7 @@ static void create_hierarchy(Main *bmain, Scene *scene, 
AbcObjectReader *root)
 
        /* Either object doesn't have any parents, since its path only contain 
its name,
         * and its data name, or is an empty with no parents. */
-       if (parts.size() == 2 || parts.size() == 1) {
+       if (parts.size() <= 2) {
                return;
        }

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

Reply via email to