Commit: 667601584af10686eb980b960ff744cf0f624841
Author: Sergey Sharybin
Date:   Mon Jun 6 12:08:06 2016 +0200
Branches: compositor-2016
https://developer.blender.org/rB667601584af10686eb980b960ff744cf0f624841

Depsgraph: Russian electric tape bodge to have multiple proxies work

Makes behavior of proxy_from backlink working similar to the old dependency 
graph.

it's nasty, but needed here in the studio to get proxies fixes ASAP.

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

M       source/blender/blenkernel/BKE_object.h
M       source/blender/blenkernel/intern/object_update.c
M       source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
M       source/blender/depsgraph/intern/builder/deg_builder_relations.cc
M       source/blender/depsgraph/intern/eval/deg_eval_flush.cc

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

diff --git a/source/blender/blenkernel/BKE_object.h 
b/source/blender/blenkernel/BKE_object.h
index 7d60964..c591ec2 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -208,6 +208,8 @@ void BKE_object_eval_uber_data(struct EvaluationContext 
*eval_ctx,
                                struct Scene *scene,
                                struct Object *ob);
 
+void BKE_object_eval_proxy_backlink(struct EvaluationContext *eval_ctx, struct 
Object *ob);
+
 void BKE_object_handle_data_update(struct EvaluationContext *eval_ctx,
                                    struct Scene *scene,
                                    struct Object *ob);
diff --git a/source/blender/blenkernel/intern/object_update.c 
b/source/blender/blenkernel/intern/object_update.c
index 03348ad..e60ff05 100644
--- a/source/blender/blenkernel/intern/object_update.c
+++ b/source/blender/blenkernel/intern/object_update.c
@@ -347,3 +347,10 @@ void BKE_object_eval_uber_data(EvaluationContext *eval_ctx,
 
        ob->recalc &= ~(OB_RECALC_DATA | OB_RECALC_TIME);
 }
+
+void BKE_object_eval_proxy_backlink(EvaluationContext *eval_ctx, Object *ob)
+{
+       if (ob->proxy) {
+               ob->proxy->proxy_from = ob;
+       }
+}
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc 
b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
index 5359cc8..18cfdb3 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
@@ -296,16 +296,15 @@ void DepsgraphNodeBuilder::build_scene(Main *bmain, Scene 
*scene)
        for (Base *base = (Base *)scene->base.first; base; base = base->next) {
                Object *ob = base->object;
 
-               /* object itself */
-               build_object(scene, base, ob);
-
                /* object that this is a proxy for */
                // XXX: the way that proxies work needs to be completely 
reviewed!
                if (ob->proxy) {
                        ob->proxy->proxy_from = ob;
-                       build_object(scene, base, ob->proxy);
                }
 
+               /* object itself */
+               build_object(scene, base, ob);
+
                /* Object dupligroup. */
                if (ob->dup_group) {
                        build_group(scene, base, ob->dup_group);
@@ -486,6 +485,12 @@ void DepsgraphNodeBuilder::build_object(Scene *scene, Base 
*base, Object *ob)
        if (ob->gpd) {
                build_gpencil(ob->gpd);
        }
+
+       if (ob->proxy != NULL) {
+               add_operation_node(&ob->id, DEPSNODE_TYPE_PROXY, 
DEPSOP_TYPE_POST,
+                                  
function_bind(BKE_object_eval_proxy_backlink, _1, ob),
+                                  DEG_OPCODE_PLACEHOLDER, "Parameters Eval");
+       }
 }
 
 void DepsgraphNodeBuilder::build_object_transform(Scene *scene, Object *ob)
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc 
b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
index 10aebb7..874837f 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
@@ -266,6 +266,13 @@ void DepsgraphRelationBuilder::build_scene(Main *bmain, 
Scene *scene)
        for (Base *base = (Base *)scene->base.first; base; base = base->next) {
                Object *ob = base->object;
 
+               /* Object that this is a proxy for.
+                * Just makes sure backlink is correct.
+                */
+               if (ob->proxy) {
+                       ob->proxy->proxy_from = ob;
+               }
+
                /* object itself */
                build_object(bmain, scene, ob);
 
@@ -433,7 +440,6 @@ void DepsgraphRelationBuilder::build_object(Main *bmain, 
Scene *scene, Object *o
                                break;
                        }
 
-
                        case OB_ARMATURE: /* Pose */
                                if (ob->id.lib != NULL && ob->proxy_from != 
NULL) {
                                        build_proxy_rig(ob);
diff --git a/source/blender/depsgraph/intern/eval/deg_eval_flush.cc 
b/source/blender/depsgraph/intern/eval/deg_eval_flush.cc
index af68f5c..30d2438 100644
--- a/source/blender/depsgraph/intern/eval/deg_eval_flush.cc
+++ b/source/blender/depsgraph/intern/eval/deg_eval_flush.cc
@@ -84,6 +84,9 @@ static void flush_init_func(void *data_v, int i)
        id_node->done = 0;
        node->scheduled = false;
        node->owner->flags &= ~DEPSCOMP_FULLY_SCHEDULED;
+       if (node->owner->type == DEPSNODE_TYPE_PROXY) {
+               node->flag |= DEPSOP_FLAG_NEEDS_UPDATE;
+       }
 }
 
 /* Flush updates from tagged nodes outwards until all affected nodes

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to