[Bf-blender-cvs] [fea09b0c7c6] cycles_procedural_api: fix function used to detect arrays

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


Commit: fea09b0c7c6afb809689095f27d2618e602207a5
Author: Kévin Dietrich
Date:   Thu Dec 3 15:22:15 2020 +0100
Branches: cycles_procedural_api
https://developer.blender.org/rBfea09b0c7c6afb809689095f27d2618e602207a5

fix function used to detect arrays

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

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 1f34aeb4b38..1a489d54617 100644
--- a/intern/cycles/render/alembic.cpp
+++ b/intern/cycles/render/alembic.cpp
@@ -655,7 +655,8 @@ void AlembicObject::load_all_data(const ICurvesSchema &schema,
 void AlembicObject::setup_transform_cache()
 {
   if (xform_samples.size() == 0) {
-    cached_data.transforms.add_data(transform_identity(), 0.0);
+    Transform tfm = transform_identity();
+    cached_data.transforms.add_data(tfm, 0.0);
   }
   else {
     /* It is possible for a leaf node of the hierarchy to have multiple samples for its transforms
@@ -671,7 +672,8 @@ void AlembicObject::setup_transform_cache()
     }
 
     if (!has_animation) {
-      cached_data.transforms.add_data(make_transform(first_matrix), 0.0);
+      Transform tfm = make_transform(first_matrix);
+      cached_data.transforms.add_data(tfm, 0.0);
     }
     else {
       for (const std::pair<chrono_t, M44d> pair : xform_samples) {
diff --git a/intern/cycles/render/alembic.h b/intern/cycles/render/alembic.h
index 4014d7322d2..a371d6f53d1 100644
--- a/intern/cycles/render/alembic.h
+++ b/intern/cycles/render/alembic.h
@@ -37,6 +37,13 @@ class Shader;
 
 using MatrixSampleMap = std::map<Alembic::Abc::chrono_t, Alembic::Abc::M44d>;
 
+/* Helpers to detect if some type is a ccl::array. */
+template<typename> struct is_array : public std::false_type {
+};
+
+template<typename T> struct is_array<array<T>> : public std::true_type {
+};
+
 template<typename T> class DataStore {
   struct DataTimePair {
     double time = 0;
@@ -65,16 +72,16 @@ template<typename T> class DataStore {
     return &ptr->data;
   }
 
-  void add_data(T data_, double time)
+  void add_data(T &data_, double time)
   {
-    data.push_back({time, data_});
-  }
+    if constexpr (is_array<T>::value) {
+      data.emplace_back();
+      data.back().data.steal_data(data_);
+      data.back().time = time;
+      return;
+    }
 
-  void add_data(array<T> &data_, double time)
-  {
-    data.emplace_back();
-    data.back().data.steal_data(data_);
-    data.back().time = time;
+    data.push_back({time, data_});
   }
 
   bool is_constant() const



More information about the Bf-blender-cvs mailing list