[Bf-blender-cvs] [aba0cc48a66] cycles_procedural_api: avoid reloading data that was already loaded

Kévin Dietrich noreply at git.blender.org
Sun Dec 6 06:26:28 CET 2020


Commit: aba0cc48a669e6cdc0c305dccf3b9390c488c8a9
Author: Kévin Dietrich
Date:   Thu Dec 3 15:50:18 2020 +0100
Branches: cycles_procedural_api
https://developer.blender.org/rBaba0cc48a669e6cdc0c305dccf3b9390c488c8a9

avoid reloading data that was already loaded

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

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 6825d0660b4..bb87a56a909 100644
--- a/intern/cycles/render/alembic.cpp
+++ b/intern/cycles/render/alembic.cpp
@@ -224,8 +224,9 @@ static void read_default_uvs(const IV2fGeomParam &uvs, CachedData &cached_data)
           continue;
         }
 
-        const array<int3> *triangles = cached_data.triangles.data_for_time(time);
-        const array<int3> *triangles_loops = cached_data.triangles_loops.data_for_time(time);
+        const array<int3> *triangles = cached_data.triangles.data_for_time_no_check(time);
+        const array<int3> *triangles_loops = cached_data.triangles_loops.data_for_time_no_check(
+            time);
 
         if (!triangles || !triangles_loops) {
           continue;
@@ -282,7 +283,7 @@ static void add_normals(const Int32ArraySamplePtr face_indices,
       CachedData::CachedAttribute &attr = cached_data.add_attribute(ustring(normals.getName()));
       attr.std = ATTR_STD_VERTEX_NORMAL;
 
-      const array<float3> *vertices = cached_data.vertices.data_for_time(time);
+      const array<float3> *vertices = cached_data.vertices.data_for_time_no_check(time);
 
       if (!vertices) {
         return;
@@ -321,7 +322,7 @@ static void add_normals(const Int32ArraySamplePtr face_indices,
       CachedData::CachedAttribute &attr = cached_data.add_attribute(ustring(normals.getName()));
       attr.std = ATTR_STD_VERTEX_NORMAL;
 
-      const array<float3> *vertices = cached_data.vertices.data_for_time(time);
+      const array<float3> *vertices = cached_data.vertices.data_for_time_no_check(time);
 
       if (!vertices) {
         return;
@@ -739,8 +740,9 @@ void AlembicObject::read_attribute(const ICompoundProperty &arb_geom_params,
         attribute.element = ATTR_ELEMENT_CORNER;
         attribute.type_desc = TypeFloat2;
 
-        const array<int3> *triangles = cached_data.triangles.data_for_time(time);
-        const array<int3> *triangles_loops = cached_data.triangles_loops.data_for_time(time);
+        const array<int3> *triangles = cached_data.triangles.data_for_time_no_check(time);
+        const array<int3> *triangles_loops = cached_data.triangles_loops.data_for_time_no_check(
+            time);
 
         if (!triangles || !triangles_loops) {
           continue;
@@ -782,7 +784,7 @@ void AlembicObject::read_attribute(const ICompoundProperty &arb_geom_params,
         attribute.element = ATTR_ELEMENT_CORNER_BYTE;
         attribute.type_desc = TypeRGBA;
 
-        const array<int3> *triangles = cached_data.triangles.data_for_time(time);
+        const array<int3> *triangles = cached_data.triangles.data_for_time_no_check(time);
 
         if (!triangles) {
           continue;
@@ -827,7 +829,7 @@ void AlembicObject::read_attribute(const ICompoundProperty &arb_geom_params,
         attribute.element = ATTR_ELEMENT_CORNER_BYTE;
         attribute.type_desc = TypeRGBA;
 
-        const array<int3> *triangles = cached_data.triangles.data_for_time(time);
+        const array<int3> *triangles = cached_data.triangles.data_for_time_no_check(time);
 
         if (!triangles) {
           continue;
diff --git a/intern/cycles/render/alembic.h b/intern/cycles/render/alembic.h
index fcb98caea07..4112c28d27f 100644
--- a/intern/cycles/render/alembic.h
+++ b/intern/cycles/render/alembic.h
@@ -53,6 +53,8 @@ template<typename T> class DataStore {
   vector<DataTimePair> data{};
   Alembic::AbcCoreAbstract::TimeSampling time_sampling{};
 
+  double last_loaded_time = std::numeric_limits<double>::max();
+
  public:
   void set_time_sampling(Alembic::AbcCoreAbstract::TimeSampling time_sampling_)
   {
@@ -64,16 +66,39 @@ template<typename T> class DataStore {
     return time_sampling;
   }
 
+  /* Get the data for the specified time.
+   * Return nullptr if there is no data or if the data for this time was already loaded. */
   T *data_for_time(double time)
   {
     if (size() == 0) {
       return nullptr;
     }
 
-    auto index_pair = time_sampling.getNearIndex(time, data.size());
-    auto ptr = &data[index_pair.first];
+    std::pair<size_t, Alembic::Abc::chrono_t> index_pair;
+    index_pair = time_sampling.getNearIndex(time, data.size());
+    DataTimePair &data_pair = data[index_pair.first];
+
+    if (last_loaded_time == data_pair.time) {
+      return nullptr;
+    }
+
+    last_loaded_time = data_pair.time;
+
+    return &data_pair.data;
+  }
+
+  /* get the data for the specified time, but do not check if the data was already loaded for this
+   * time return nullptr if there is no data */
+  T *data_for_time_no_check(double time)
+  {
+    if (size() == 0) {
+      return nullptr;
+    }
 
-    return &ptr->data;
+    std::pair<size_t, Alembic::Abc::chrono_t> index_pair;
+    index_pair = time_sampling.getNearIndex(time, data.size());
+    DataTimePair &data_pair = data[index_pair.first];
+    return &data_pair.data;
   }
 
   void add_data(T &data_, double time)
@@ -100,6 +125,7 @@ template<typename T> class DataStore {
 
   void clear()
   {
+    last_loaded_time = std::numeric_limits<double>::max();
     data.clear();
   }
 };



More information about the Bf-blender-cvs mailing list