[Bf-blender-cvs] [92111d32a6d] cycles_procedural_api: cleanup, deduplicate logic to set the new data

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


Commit: 92111d32a6d265f888f09c392b2821d1a3b1886e
Author: Kévin Dietrich
Date:   Fri Dec 4 12:46:39 2020 +0100
Branches: cycles_procedural_api
https://developer.blender.org/rB92111d32a6d265f888f09c392b2821d1a3b1886e

cleanup, deduplicate logic to set the new data

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

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 ff1f9390272..33543936b38 100644
--- a/intern/cycles/render/alembic.cpp
+++ b/intern/cycles/render/alembic.cpp
@@ -38,9 +38,6 @@ CCL_NAMESPACE_BEGIN
  * least a way to tell which frame data to load, so we do not load the entire archive for a few
  * frames. */
 
-/* TODO(@kevindietrich): arrays are emptied when passed to the sockets, so for now we copy the
- * arrays to avoid reloading the data */
-
 static float3 make_float3_from_yup(const V3f &v)
 {
   return make_float3(v.x, -v.z, v.y);
@@ -1040,17 +1037,12 @@ void AlembicProcedural::read_mesh(Scene *scene,
 
   CachedData &cached_data = abc_object->get_cached_data();
 
-  Transform *tfm = cached_data.transforms.data_for_time(frame_time);
-  if (tfm) {
-    Object *object = abc_object->get_object();
-    object->set_tfm(*tfm);
-  }
+  Object *object = abc_object->get_object();
+  cached_data.transforms.copy_to_socket(frame_time, object, object->get_tfm_socket());
 
-  array<float3> *vertices = cached_data.vertices.data_for_time(frame_time);
-  if (vertices) {
-    array<float3> new_vertices = *vertices;
-    mesh->set_verts(new_vertices);
-  }
+  cached_data.vertices.copy_to_socket(frame_time, mesh, mesh->get_verts_socket());
+
+  cached_data.shader.copy_to_socket(frame_time, mesh, mesh->get_shader_socket());
 
   array<int3> *triangle_data = cached_data.triangles.data_for_time(frame_time);
   if (triangle_data) {
@@ -1072,12 +1064,6 @@ void AlembicProcedural::read_mesh(Scene *scene,
     mesh->set_smooth(smooth);
   }
 
-  array<int> *shader = cached_data.shader.data_for_time(frame_time);
-  if (shader) {
-    array<int> new_shader = *shader;
-    mesh->set_shader(new_shader);
-  }
-
   for (CachedData::CachedAttribute &attribute : cached_data.attributes) {
     const array<char> *attr_data = attribute.data.data_for_time(frame_time);
 
@@ -1149,35 +1135,16 @@ void AlembicProcedural::read_curves(Scene *scene,
 
   CachedData &cached_data = abc_object->get_cached_data();
 
-  Transform *tfm = cached_data.transforms.data_for_time(frame_time);
-  if (tfm) {
-    Object *object = abc_object->get_object();
-    object->set_tfm(*tfm);
-  }
+  Object *object = abc_object->get_object();
+  cached_data.transforms.copy_to_socket(frame_time, object, object->get_tfm_socket());
 
-  array<float3> *curve_keys = cached_data.curve_keys.data_for_time(frame_time);
-  if (curve_keys) {
-    array<float3> new_curve_keys = *curve_keys;
-    hair->set_curve_keys(new_curve_keys);
-  }
+  cached_data.curve_keys.copy_to_socket(frame_time, hair, hair->get_curve_keys_socket());
 
-  array<float> *curve_radius = cached_data.curve_radius.data_for_time(frame_time);
-  if (curve_radius) {
-    array<float> new_curve_radius = *curve_radius;
-    hair->set_curve_radius(new_curve_radius);
-  }
+  cached_data.curve_radius.copy_to_socket(frame_time, hair, hair->get_curve_radius_socket());
 
-  array<int> *curve_first_key = cached_data.curve_first_key.data_for_time(frame_time);
-  if (curve_first_key) {
-    array<int> new_curve_first_key = *curve_first_key;
-    hair->set_curve_first_key(new_curve_first_key);
-  }
+  cached_data.curve_shader.copy_to_socket(frame_time, hair, hair->get_curve_shader_socket());
 
-  array<int> *curve_shader = cached_data.curve_shader.data_for_time(frame_time);
-  if (curve_shader) {
-    array<int> new_curve_shader = *curve_shader;
-    hair->set_curve_shader(new_curve_shader);
-  }
+  cached_data.curve_first_key.copy_to_socket(frame_time, hair, hair->get_curve_first_key_socket());
 
   for (CachedData::CachedAttribute &attribute : cached_data.attributes) {
     const array<char> *attr_data = attribute.data.data_for_time(frame_time);
diff --git a/intern/cycles/render/alembic.h b/intern/cycles/render/alembic.h
index e2112e8af10..8aad074579c 100644
--- a/intern/cycles/render/alembic.h
+++ b/intern/cycles/render/alembic.h
@@ -133,6 +133,22 @@ template<typename T> class DataStore {
     last_loaded_time = std::numeric_limits<double>::max();
     data.clear();
   }
+
+  /* Copy the data for the specified time to the node's socket. If there is no
+   * data for this time or it was already loaded, do nothing. */
+  void copy_to_socket(double time, Node *node, const SocketType *socket)
+  {
+    T *data_ = data_for_time(time);
+
+    if (data_ == nullptr) {
+      return;
+    }
+
+    /* TODO(@kevindietrich): arrays are emptied when passed to the sockets, so for now we copy the
+     * arrays to avoid reloading the data */
+    T value = *data_;
+    node->set(*socket, value);
+  }
 };
 
 /* Actual cache for the stored data.



More information about the Bf-blender-cvs mailing list