[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