[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