[Bf-blender-cvs] [47d0d9c] master: Depsgraph: Russian electric tape bodge to have multiple proxies work

Sergey Sharybin noreply at git.blender.org
Mon Jun 6 12:08:46 CEST 2016


Commit: 47d0d9cca4d0c3ccbdc368e97fc24652379fd368
Author: Sergey Sharybin
Date:   Mon Jun 6 12:08:06 2016 +0200
Branches: master
https://developer.blender.org/rB47d0d9cca4d0c3ccbdc368e97fc24652379fd368

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




More information about the Bf-blender-cvs mailing list