[Bf-blender-cvs] [1cde99f] depsgraph_refactor: Basic support for modifiers in the new depsgraph.

Lukas Tönne noreply at git.blender.org
Thu Apr 17 14:48:26 CEST 2014


Commit: 1cde99f26784451392c9749e132b314eb9e24788
Author: Lukas Tönne
Date:   Thu Apr 17 14:32:07 2014 +0200
https://developer.blender.org/rB1cde99f26784451392c9749e132b314eb9e24788

Basic support for modifiers in the new depsgraph.

Modifiers are represented as a new geometry operation. Like with the
current modifier stacks, a typeinfo callback can be used to define
additional dependencies of a modifier on scene or object components
(currently implemented only for the shrinkwrap modifier for testing).

When this function is defined for a modifier, it gets an abstract
"DepsNodeHandle" pointer, which can be passed back to the depsgraph API
for creating the actual relations internally with minimal effort for the
modifier type and providing opportunities for internal error handling.

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

M	source/blender/depsgraph/DEG_depsgraph_build.h
M	source/blender/depsgraph/intern/depsgraph_build.cpp
M	source/blender/depsgraph/intern/depsgraph_build.h
M	source/blender/depsgraph/intern/depsgraph_build_nodes.cpp
M	source/blender/depsgraph/intern/depsgraph_build_relations.cpp
M	source/blender/depsgraph/intern/depsgraph_type_defines.cpp
M	source/blender/depsgraph/intern/stubs.h

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

diff --git a/source/blender/depsgraph/DEG_depsgraph_build.h b/source/blender/depsgraph/DEG_depsgraph_build.h
index b140a2a..df7c907 100644
--- a/source/blender/depsgraph/DEG_depsgraph_build.h
+++ b/source/blender/depsgraph/DEG_depsgraph_build.h
@@ -63,10 +63,10 @@ void DEG_graph_build_from_scene(struct Depsgraph *graph, struct Main *bmain, str
 
 /* Handle for components to define their dependencies from callbacks.
  * This is generated by the depsgraph and passed to dependency callbacks
- * as a symbolic reference to the current Depsgraph and DepsNode.
- * All relations will be defined in reference to that handle.
+ * as a symbolic reference to the current DepsNode.
+ * All relations will be defined in reference to that node.
  */
-typedef struct DepsNodeHandle DepsNodeHandle;
+struct DepsNodeHandle;
 
 struct Object;
 
@@ -90,8 +90,8 @@ typedef enum eDepsObjectComponentType {
 	DEG_OB_COMP_EVAL_PARTICLES,    /* Particle Systems Component */
 } eDepsObjectComponentType;
 
-void DEG_add_scene_relation(DepsNodeHandle *node, struct Scene *scene, eDepsSceneComponentType component, const char *description);
-void DEG_add_object_relation(DepsNodeHandle *node, struct Object *ob, eDepsObjectComponentType component, const char *description);
+void DEG_add_scene_relation(struct DepsNodeHandle *node, struct Scene *scene, eDepsSceneComponentType component, const char *description);
+void DEG_add_object_relation(struct DepsNodeHandle *node, struct Object *ob, eDepsObjectComponentType component, const char *description);
 
 /* ************************************************ */
 
diff --git a/source/blender/depsgraph/intern/depsgraph_build.cpp b/source/blender/depsgraph/intern/depsgraph_build.cpp
index 4f2f9c5..2fb0032 100644
--- a/source/blender/depsgraph/intern/depsgraph_build.cpp
+++ b/source/blender/depsgraph/intern/depsgraph_build.cpp
@@ -105,12 +105,6 @@ extern "C" {
 /* ************************************************* */
 /* External Build API */
 
-struct DepsNodeHandle {
-	Depsgraph *graph;
-	DepsNode *node;
-	const string &default_name;
-};
-
 static eDepsNode_Type deg_build_scene_component_type(eDepsSceneComponentType component)
 {
 	switch (component) {
@@ -136,24 +130,16 @@ static eDepsNode_Type deg_build_object_component_type(eDepsObjectComponentType c
 
 void DEG_add_scene_relation(DepsNodeHandle *handle, struct Scene *scene, eDepsSceneComponentType component, const char *description)
 {
-	Depsgraph *graph = handle->graph;
-	DepsNode *node = handle->node;
-	
 	eDepsNode_Type type = deg_build_scene_component_type(component);
-	DepsNode *comp_node = graph->find_node((ID *)scene, "", type, "");
-	if (comp_node)
-		graph->add_new_relation(comp_node, node, DEPSREL_TYPE_STANDARD, string(description));
+	ComponentKey comp_key(scene, type);
+	handle->builder->add_node_handle_relation(comp_key, handle, DEPSREL_TYPE_GEOMETRY_EVAL, string(description));
 }
 
 void DEG_add_object_relation(DepsNodeHandle *handle, struct Object *ob, eDepsObjectComponentType component, const char *description)
 {
-	Depsgraph *graph = handle->graph;
-	DepsNode *node = handle->node;
-	
 	eDepsNode_Type type = deg_build_object_component_type(component);
-	DepsNode *comp_node = graph->find_node((ID *)ob, "", type, "");
-	if (comp_node)
-		graph->add_new_relation(comp_node, node, DEPSREL_TYPE_STANDARD, string(description));
+	ComponentKey comp_key(ob, type);
+	handle->builder->add_node_handle_relation(comp_key, handle, DEPSREL_TYPE_GEOMETRY_EVAL, string(description));
 }
 
 /* ************************************************* */
diff --git a/source/blender/depsgraph/intern/depsgraph_build.h b/source/blender/depsgraph/intern/depsgraph_build.h
index 92cd387..68e87a4 100644
--- a/source/blender/depsgraph/intern/depsgraph_build.h
+++ b/source/blender/depsgraph/intern/depsgraph_build.h
@@ -156,6 +156,10 @@ struct DepsgraphRelationBuilder {
 	void add_relation(const KeyFrom &key_from, const KeyTo &key_to,
 	                  eDepsRelation_Type type, const string &description);
 	
+	template <typename KeyType>
+	void add_node_handle_relation(const KeyType &key_from, const DepsNodeHandle *handle,
+	                              eDepsRelation_Type type, const string &description);
+	
 	void build_scene(Scene *scene);
 	void build_object(Scene *scene, Object *ob);
 	void build_object_parent(Object *ob);
@@ -189,10 +193,27 @@ protected:
 	void add_node_relation(DepsNode *node_from, DepsNode *node_to,
 	                  eDepsRelation_Type type, const string &description);
 	
+	template <typename KeyType>
+	DepsNodeHandle create_node_handle(const KeyType &key, const string &default_name = "");
+	
 private:
 	Depsgraph *m_graph;
 };
 
+struct DepsNodeHandle {
+	DepsNodeHandle(DepsgraphRelationBuilder *builder, DepsNode *node, const string &default_name = "") :
+	    builder(builder),
+	    node(node),
+	    default_name(default_name)
+	{}
+	
+	DepsgraphRelationBuilder *builder;
+	DepsNode *node;
+	const string &default_name;
+};
+
+/* Inline Function Templates -------------------------------------------------- */
+
 template <typename KeyFrom, typename KeyTo>
 void DepsgraphRelationBuilder::add_relation(const KeyFrom &key_from, const KeyTo &key_to,
                                             eDepsRelation_Type type, const string &description)
@@ -212,5 +233,30 @@ void DepsgraphRelationBuilder::add_relation(const KeyFrom &key_from, const KeyTo
 	}
 }
 
+template <typename KeyType>
+void DepsgraphRelationBuilder::add_node_handle_relation(const KeyType &key_from, const DepsNodeHandle *handle,
+                                                        eDepsRelation_Type type, const string &description)
+{
+	DepsNode *node_from = find_node(key_from);
+	DepsNode *node_to = handle->node;
+	if (node_from && node_to) {
+		add_node_relation(node_from, node_to, type, description);
+	}
+	else {
+		if (!node_from) {
+			/* XXX TODO handle as error or report if needed */
+		}
+		if (!node_to) {
+			/* XXX TODO handle as error or report if needed */
+		}
+	}
+}
+
+template <typename KeyType>
+DepsNodeHandle DepsgraphRelationBuilder::create_node_handle(const KeyType &key, const string &default_name)
+{
+	return DepsNodeHandle(this, find_node(key), default_name);
+}
+
 
 #endif // __DEPSGRAPH_BUILD_H__
diff --git a/source/blender/depsgraph/intern/depsgraph_build_nodes.cpp b/source/blender/depsgraph/intern/depsgraph_build_nodes.cpp
index d0d1a76..a078b9d 100644
--- a/source/blender/depsgraph/intern/depsgraph_build_nodes.cpp
+++ b/source/blender/depsgraph/intern/depsgraph_build_nodes.cpp
@@ -724,12 +724,11 @@ void DepsgraphNodeBuilder::build_obdata_geom(IDDepsNode *ob_node, IDDepsNode *ob
 		ModifierData *md;
 		
 		for (md = (ModifierData *)ob->modifiers.first; md; md = md->next) {
-			ModifierTypeInfo *mti = modifierType_getInfo((ModifierType)md->type);
+//			ModifierTypeInfo *mti = modifierType_getInfo((ModifierType)md->type);
 			
-			if (mti->updateDepgraph) {
-				#pragma message("ModifierTypeInfo->updateDepsgraph()")
-				//mti->updateDepgraph(md, graph, scene, ob);
-			}
+			add_operation_node(ob_node, DEPSNODE_TYPE_OP_GEOMETRY,
+			                   DEPSOP_TYPE_EXEC, BKE_object_eval_modifier,
+			                   string_format("Modifier %s", md->name), make_rna_pointer(ob, &RNA_Modifier, md));
 		}
 	}
 	
diff --git a/source/blender/depsgraph/intern/depsgraph_build_relations.cpp b/source/blender/depsgraph/intern/depsgraph_build_relations.cpp
index d577830..d437de3 100644
--- a/source/blender/depsgraph/intern/depsgraph_build_relations.cpp
+++ b/source/blender/depsgraph/intern/depsgraph_build_relations.cpp
@@ -848,9 +848,9 @@ void DepsgraphRelationBuilder::build_obdata_geom(Scene *scene, Object *ob)
 		for (md = (ModifierData *)ob->modifiers.first; md; md = md->next) {
 			ModifierTypeInfo *mti = modifierType_getInfo((ModifierType)md->type);
 			
-			if (mti->updateDepgraph) {
-				#pragma message("ModifierTypeInfo->updateDepsgraph()")
-				//mti->updateDepgraph(md, graph, scene, ob);
+			if (mti->updateDepsgraph) {
+				DepsNodeHandle handle = create_node_handle(OperationKey(ob, DEPSNODE_TYPE_OP_GEOMETRY, md->name));
+				mti->updateDepsgraph(md, scene, ob, &handle);
 			}
 		}
 	}
diff --git a/source/blender/depsgraph/intern/depsgraph_type_defines.cpp b/source/blender/depsgraph/intern/depsgraph_type_defines.cpp
index 664d410..3d89a54 100644
--- a/source/blender/depsgraph/intern/depsgraph_type_defines.cpp
+++ b/source/blender/depsgraph/intern/depsgraph_type_defines.cpp
@@ -79,6 +79,7 @@ void BKE_rigidbody_object_sync_transforms(void *context, void *item) {}
 
 void BKE_object_eval_local_transform(void *context, void *item) {}
 void BKE_object_eval_parent(void *context, void *item) {}
+void BKE_object_eval_modifier(void *context, void *item) {}
 
 void BKE_mesh_eval_geometry(void *context, void *item) {}
 void BKE_mball_eval_geometry(void *context, void *item) {}
diff --git a/source/blender/depsgraph/intern/stubs.h b/source/blender/depsgraph/intern/stubs.h
index 66dff17..555055c 100644
--- a/source/blender/depsgraph/intern/stubs.h
+++ b/source/blender/depsgraph/intern/stubs.h
@@ -29,6 +29,7 @@ void BKE_rigidbody_object_sync_transforms(void *context, void *item); // BKE_rig
 
 void BKE_object_eval_local_transform(void *context, void *item);
 void BKE_object_eval_parent(void *context, void *item);
+void BKE_object_eval_modifier(void *context, void *item);
 
 void BKE_mesh_eval_geometry(void *context, void *item);  // wrapper around makeDerivedMesh() - which gets BMesh, etc. data...
 void BKE_mball_eval_geometry(void *context, void *item); // BKE_displist_make_mball




More information about the Bf-blender-cvs mailing list