Commit: b7d2af1e7af43319aa9c68b32436e2efe73a5701
Author: Kévin Dietrich
Date:   Wed Apr 6 12:05:49 2016 +0200
Branches: alembic_basic_io
https://developer.blender.org/rBb7d2af1e7af43319aa9c68b32436e2efe73a5701

Object hierarchy is now restored upon import.

The algorithm isn't very efficient as it loops, for each object, over
all the objects in the scene.

A more straightforward way would be to build a tree from the Alembic
archive and use this for the actual object hierarchy, however every
attempt at this were unsuccessful. This is to be revisited in the
future.

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

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

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

diff --git a/source/blender/alembic/intern/abc_object.cc 
b/source/blender/alembic/intern/abc_object.cc
index cf8c459..958edb2 100644
--- a/source/blender/alembic/intern/abc_object.cc
+++ b/source/blender/alembic/intern/abc_object.cc
@@ -296,18 +296,24 @@ AbcObjectReader::AbcObjectReader(const 
Alembic::Abc::IObject &object, int from_f
        std::vector<std::string> parts;
        split(m_name, "/", parts);
 
-       assert(parts.size() >= 2);
+       /* XXX - used to be an assert, but fails with NullReader */
+       if (parts.size() >= 2) {
+               m_object_name = parts[parts.size() - 2];
+               m_data_name = parts[parts.size() - 1];
 
-       m_object_name = parts[parts.size() - 2];
-       m_data_name = parts[parts.size() - 1];
-
-       if (mat3_from_axis_conversion(from_forward, from_up, 1, 2, 
m_conversion_mat)) {
-               m_do_convert_mat = true;
+               if (mat3_from_axis_conversion(from_forward, from_up, 1, 2, 
m_conversion_mat)) {
+                       m_do_convert_mat = true;
+               }
        }
 }
 
 AbcObjectReader::~AbcObjectReader()
-{}
+{
+       std::vector<AbcObjectReader *>::iterator iter;
+       for (iter = m_children.begin(); iter != m_children.end(); ++iter) {
+               delete *iter;
+       }
+}
 
 std::vector<AbcObjectReader *> AbcObjectReader::children() const
 {
@@ -319,6 +325,11 @@ void AbcObjectReader::addChild(AbcObjectReader *child)
        m_children.push_back(child);
 }
 
+const Alembic::Abc::IObject &AbcObjectReader::iobject() const
+{
+       return m_iobject;
+}
+
 Object *AbcObjectReader::object() const
 {
        return m_object;
diff --git a/source/blender/alembic/intern/abc_object.h 
b/source/blender/alembic/intern/abc_object.h
index 11d649a..9777441 100644
--- a/source/blender/alembic/intern/abc_object.h
+++ b/source/blender/alembic/intern/abc_object.h
@@ -99,6 +99,8 @@ public:
 
        void addChild(AbcObjectReader *child);
 
+       const Alembic::Abc::IObject &iobject() const;
+
        Object *object() const;
 
        virtual bool valid() const = 0;
diff --git a/source/blender/alembic/intern/alembic_capi.cc 
b/source/blender/alembic/intern/alembic_capi.cc
index 1182df5..28a6729 100644
--- a/source/blender/alembic/intern/alembic_capi.cc
+++ b/source/blender/alembic/intern/alembic_capi.cc
@@ -54,6 +54,25 @@ extern "C" {
 #include "BLI_listbase.h"
 #include "BLI_string.h"
 #include "BLI_threads.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+}
+
+static Object *find_object(bContext *C, const std::string &name)
+{
+       Scene *scene = CTX_data_scene(C);
+       Base *base;
+
+       for (base = static_cast<Base *>(scene->base.first); base; base = 
base->next) {
+               Object *ob = base->object;
+
+               if (ob->id.name + 2 == name) {
+                       return ob;
+               }
+       }
+
+       return NULL;
 }
 
 using namespace Alembic::AbcGeom;
@@ -812,99 +831,74 @@ int ABC_export(Scene *sce, const char *filename,
        return BL_ABC_NO_ERR;
 }
 
-#if 0
-static Object *create_hierarchy(bContext *C, IArchive */*archive*/, const 
std::vector<std::string> &parts)
-{
-       Object *parent = NULL;
-       std::string sub_object;
-
-       std::vector<std::string>::const_iterator iter;
-       for (iter = parts.begin(); iter != parts.end(); ++iter) {
-               sub_object = "/" + *iter;
-
-               Object *ob = find_object(CTX_data_scene(C), sub_object, parent);
-
-               if (ob) {
-                       parent = ob;
-               }
-
-               if (sub_object == "/") {
-                       parent = NULL;
-                       continue;
-               }
-
-               Object *empty = BKE_object_add(CTX_data_main(C), 
CTX_data_scene(C), OB_EMPTY, sub_object.c_str());
-               empty->parent = parent;
-
-               DAG_id_tag_update(&empty->id, OB_RECALC_OB);
-       }
-
-       return parent;
-}
-#endif
-
-static void visit_object(const IObject &object, std::vector<AbcObjectReader *> 
&readers,
-                         AbcObjectReader *reader, int from_forward, int 
from_up)
+static void visit_object(const IObject &object,
+                         std::vector<AbcObjectReader *> &readers,
+                         int from_forward, int from_up)
 {
        if (!object.valid()) {
                return;
        }
 
        for (int i = 0; i < object.getNumChildren(); ++i) {
-               IObject child(object, object.getChildHeader(i).getName());
+               IObject child = object.getChild(i);
 
                if (!child.valid()) {
                        continue;
                }
 
+               AbcObjectReader *reader = NULL;
+
                const MetaData &md = child.getMetaData();
 
                if (IPolyMesh::matches(md)) {
-                       if (!reader) {
-                               reader = new AbcMeshReader(child, from_forward, 
from_up);
-                               readers.push_back(reader);
-                       }
-                       else {
-                               reader->addChild(new AbcMeshReader(child, 
from_forward, from_up));
-                       }
+                       reader = new AbcMeshReader(child, from_forward, 
from_up);
                }
                else if (INuPatch::matches(md)) {
-                       if (!reader) {
-                               reader = new AbcNurbsReader(child, 
from_forward, from_up);
-                               readers.push_back(reader);
-                       }
-                       else {
-                               reader->addChild(new AbcNurbsReader(child, 
from_forward, from_up));
-                       }
+                       reader = new AbcNurbsReader(child, from_forward, 
from_up);
                }
                else if (ICameraSchema::matches(md)) {
-                       if (!reader) {
-                               reader = new AbcCameraReader(child, 
from_forward, from_up);
-                               readers.push_back(reader);
-                       }
-                       else {
-                               reader->addChild(new AbcCameraReader(child, 
from_forward, from_up));
-                       }
+                       reader = new AbcCameraReader(child, from_forward, 
from_up);
+               }
+
+               if (reader) {
+                       readers.push_back(reader);
                }
 
-               visit_object(child, readers, reader, from_forward, from_up);
+               visit_object(child, readers, from_forward, from_up);
        }
 }
 
-static void create_readers(IArchive *archive, std::vector<AbcObjectReader *> 
&readers,
+static void create_readers(IArchive *archive,
+                           std::vector<AbcObjectReader *> &readers,
                            int from_forward, int from_up)
 {
-       IObject root = archive->getTop();
+       visit_object(archive->getTop(), readers, from_forward, from_up);
+}
 
-       std::cerr << "Number of object in archive: " << root.getNumChildren() 
<< "\n";
+static void create_hierarchy(bContext *C, AbcObjectReader *root)
+{
+       const IObject &iobjet = root->iobject();
+       const std::string &full_name = iobjet.getFullName();
 
-       for (int i = 0; i < root.getNumChildren(); ++i) {
-               IObject child = IObject(root, root.getChildHeader(i).getName());
+       std::vector<std::string> parts;
+       split(full_name, "/", parts);
 
-               std::cerr << "Object: " << i << ", chlidren: " << 
child.getNumChildren() << "\n";
-       }
+       Object *parent = NULL;
+
+       std::vector<std::string>::iterator iter;
+       for (iter = parts.begin(); iter != parts.end(); ++iter) {
+               parent = find_object(C, *iter);
+
+               if (parent != NULL && root->object() != parent) {
+                       Object *ob = root->object();
+                       ob->parent = parent;
 
-       visit_object(archive->getTop(), readers, NULL, from_forward, from_up);
+                       DAG_id_tag_update(&ob->id, OB_RECALC_OB);
+                       DAG_relations_tag_update(CTX_data_main(C));
+                       WM_main_add_notifier(NC_OBJECT | ND_PARENT, ob);
+                       break;
+               }
+       }
 }
 
 void ABC_import(bContext *C, const char *filename, int from_forward, int 
from_up)
@@ -927,19 +921,10 @@ void ABC_import(bContext *C, const char *filename, int 
from_forward, int from_up
                if (reader->valid()) {
                        reader->readObject(CTX_data_main(C), CTX_data_scene(C), 
0.0f, NULL);
                }
+       }
 
-               std::vector<AbcObjectReader *> children = reader->children();
-               std::vector<AbcObjectReader *>::iterator child_iter;
-
-               std::cerr << "Number of children: " << children.size() << "\n";
-
-               for (child_iter = children.begin(); child_iter != 
children.end(); ++child_iter) {
-                       AbcObjectReader *child_reader = *iter;
-
-                       if (child_reader->valid()) {
-                               child_reader->readObject(CTX_data_main(C), 
CTX_data_scene(C), 0.0f, reader->object());
-                       }
-               }
+       for (iter = readers.begin(); iter != readers.end(); ++iter) {
+               create_hierarchy(C, *iter);
        }
 
        for (iter = readers.begin(); iter != readers.end(); ++iter) {

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

Reply via email to