[Bf-blender-cvs] [bbd713c9c02] cycles_procedural_api: cache the alembic objects, instead of retraversing the archive each frame

Kévin Dietrich noreply at git.blender.org
Tue Sep 22 17:29:46 CEST 2020


Commit: bbd713c9c0234bc4c2671b0e947961c33d397ace
Author: Kévin Dietrich
Date:   Tue Sep 22 17:24:51 2020 +0200
Branches: cycles_procedural_api
https://developer.blender.org/rBbbd713c9c0234bc4c2671b0e947961c33d397ace

cache the alembic objects, instead of retraversing the archive each
frame

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

M	intern/cycles/render/alembic.cpp
M	intern/cycles/render/alembic.h

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

diff --git a/intern/cycles/render/alembic.cpp b/intern/cycles/render/alembic.cpp
index 4d57ca35e57..70e0053cdd8 100644
--- a/intern/cycles/render/alembic.cpp
+++ b/intern/cycles/render/alembic.cpp
@@ -263,12 +263,37 @@ void AlembicProcedural::generate(Scene *scene)
     }
   }
 
+  if (!objects_loaded) {
+    load_objects();
+    objects_loaded = true;
+  }
+
+  auto frame_time = (Abc::chrono_t)(frame / frame_rate);
+
+  for (size_t i = 0; i < objects.size(); ++i) {
+    AlembicObject *object = objects[i];
+
+    if (IPolyMesh::matches(object->iobject.getHeader())) {
+      IPolyMesh mesh(object->iobject, Alembic::Abc::kWrapExisting);
+      read_mesh(scene, object, object->xform, mesh, frame_time);
+    }
+    else if (ICurves::matches(object->iobject.getHeader())) {
+      ICurves curves(object->iobject, Alembic::Abc::kWrapExisting);
+      read_curves(scene, object, object->xform, curves, frame_time);
+    }
+  }
+
+  clear_modified();
+}
+
+void AlembicProcedural::load_objects()
+{
   auto frame_time = (Abc::chrono_t)(frame / frame_rate);
 
   /* Traverse Alembic file hierarchy, avoiding recursion by
    * using an explicit stack
    *
-   * TODO : cache this traversal
+   * TODO : cache the transformations
    */
   std::stack<std::pair<IObject, Transform>> objstack;
   objstack.push(std::pair<IObject, Transform>(archive.getTop(), transform_identity()));
@@ -296,18 +321,18 @@ void AlembicProcedural::generate(Scene *scene)
     }
     else if (IPolyMesh::matches(obj.first.getHeader()) && object) {
       IPolyMesh mesh(obj.first, Alembic::Abc::kWrapExisting);
-      read_mesh(scene, object, currmatrix, mesh, frame_time);
+      object->iobject = obj.first;
+      object->xform = currmatrix;
     }
     else if (ICurves::matches(obj.first.getHeader()) && object) {
       ICurves curves(obj.first, Alembic::Abc::kWrapExisting);
-      read_curves(scene, object, currmatrix, curves, frame_time);
+      object->iobject = obj.first;
+      object->xform = currmatrix;
     }
 
     for (int i = 0; i < obj.first.getNumChildren(); i++)
       objstack.push(std::pair<IObject, Transform>(obj.first.getChild(i), currmatrix));
   }
-
-  clear_modified();
 }
 
 void AlembicProcedural::read_mesh(Scene *scene,
diff --git a/intern/cycles/render/alembic.h b/intern/cycles/render/alembic.h
index 55679a04edf..52cd2dc59cf 100644
--- a/intern/cycles/render/alembic.h
+++ b/intern/cycles/render/alembic.h
@@ -18,6 +18,7 @@
 
 #include "graph/node.h"
 #include "render/procedural.h"
+#include "util/util_transform.h"
 #include "util/util_vector.h"
 
 //#ifdef WITH_ALEMBIC
@@ -60,6 +61,9 @@ class AlembicObject : public Node {
 
   DataCache &get_frame_data(int index);
 
+  IObject iobject;
+  Transform xform;
+
  private:
   Object *object = nullptr;
   Geometry *geometry = nullptr;
@@ -87,6 +91,9 @@ class AlembicProcedural : public Procedural {
 
  private:
   IArchive archive;
+  bool objects_loaded = false;
+
+  void load_objects();
 
   void read_mesh(Scene *scene,
                  AlembicObject *abc_object,



More information about the Bf-blender-cvs mailing list