[Bf-blender-cvs] [59392d1e3f8] cycles_procedural_api: AlembicProcedural: add a socket for the objects

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


Commit: 59392d1e3f815c6e85c1a718e0c399e6ec17dbcf
Author: Kévin Dietrich
Date:   Wed Dec 2 17:46:32 2020 +0100
Branches: cycles_procedural_api
https://developer.blender.org/rB59392d1e3f815c6e85c1a718e0c399e6ec17dbcf

AlembicProcedural: add a socket for the objects

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

M	intern/cycles/blender/blender_object.cpp
M	intern/cycles/render/alembic.cpp
M	intern/cycles/render/alembic.h
M	intern/cycles/render/shader.cpp

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

diff --git a/intern/cycles/blender/blender_object.cpp b/intern/cycles/blender/blender_object.cpp
index 3fd617ce26f..bb1e5107176 100644
--- a/intern/cycles/blender/blender_object.cpp
+++ b/intern/cycles/blender/blender_object.cpp
@@ -539,7 +539,7 @@ void BlenderSync::sync_procedural(BL::Object &b_ob,
   abc_object->set_path(ustring(b_mesh_cache.object_path()));
   abc_object->set_used_shaders(used_shaders);
 
-  p->objects.push_back_slow(abc_object);
+  p->add_object(abc_object);
 #else
   (void)b_ob;
   (void)b_mesh_cache;
diff --git a/intern/cycles/render/alembic.cpp b/intern/cycles/render/alembic.cpp
index 6c0c16f76ed..a7eb1b39048 100644
--- a/intern/cycles/render/alembic.cpp
+++ b/intern/cycles/render/alembic.cpp
@@ -885,14 +885,16 @@ void AlembicProcedural::generate(Scene *scene, Progress &progress)
     }
   }
 
-  if (!objects_loaded) {
+  if (!objects_loaded || objects_is_modified()) {
     load_objects(progress);
     objects_loaded = true;
   }
 
   const chrono_t frame_time = (chrono_t)(frame / frame_rate);
 
-  foreach (AlembicObject *object, objects) {
+  foreach (Node *node, objects) {
+    AlembicObject *object = static_cast<AlembicObject *>(node);
+
     if (progress.get_cancel()) {
       return;
     }
@@ -913,6 +915,12 @@ void AlembicProcedural::generate(Scene *scene, Progress &progress)
   clear_modified();
 }
 
+void AlembicProcedural::add_object(AlembicObject *object)
+{
+  objects.push_back_slow(object);
+  tag_objects_modified();
+}
+
 void AlembicProcedural::tag_update(Scene *scene)
 {
   if (is_modified()) {
@@ -924,8 +932,13 @@ void AlembicProcedural::load_objects(Progress &progress)
 {
   unordered_map<string, AlembicObject *> object_map;
 
-  foreach (AlembicObject *object, objects) {
-    object_map.insert({object->get_path().c_str(), object});
+  foreach (Node *node, objects) {
+    AlembicObject *object = static_cast<AlembicObject *>(node);
+
+    /* only consider newly added objects */
+    if (object->get_object() != nullptr) {
+      object_map.insert({object->get_path().c_str(), object});
+    }
   }
 
   IObject root = archive.getTop();
diff --git a/intern/cycles/render/alembic.h b/intern/cycles/render/alembic.h
index f043c7753bd..ba4eb7707af 100644
--- a/intern/cycles/render/alembic.h
+++ b/intern/cycles/render/alembic.h
@@ -247,8 +247,9 @@ class AlembicProcedural : public Procedural {
   NODE_SOCKET_API(ustring, filepath)
   NODE_SOCKET_API(float, frame)
   NODE_SOCKET_API(float, frame_rate)
+  NODE_SOCKET_API_ARRAY(array<Node *>, objects)
 
-  array<AlembicObject *> objects;  // todo : Node::set
+  void add_object(AlembicObject *object);
 
   void tag_update(Scene *scene);
 
diff --git a/intern/cycles/render/shader.cpp b/intern/cycles/render/shader.cpp
index 69d1dc6f2a9..69b342f80e9 100644
--- a/intern/cycles/render/shader.cpp
+++ b/intern/cycles/render/shader.cpp
@@ -510,7 +510,9 @@ void ShaderManager::update_shaders_used(Scene *scene)
   foreach (Procedural *procedural, scene->procedurals) {
     AlembicProcedural *abc_proc = static_cast<AlembicProcedural *>(procedural);
 
-    foreach (AlembicObject *abc_object, abc_proc->objects) {
+    foreach (Node *abc_node, abc_proc->get_objects()) {
+      AlembicObject *abc_object = static_cast<AlembicObject *>(abc_node);
+
       foreach (Node *node, abc_object->get_used_shaders()) {
         Shader *shader = static_cast<Shader *>(node);
         shader->used = true;



More information about the Bf-blender-cvs mailing list