[Bf-blender-cvs] [9f58409] object_nodes: Minimal RNA API of the depsgraph for registering object node dependencies.

Lukas Tönne noreply at git.blender.org
Fri Dec 11 09:19:46 CET 2015


Commit: 9f584095d7e4584280613cdaa0a0c097723c2313
Author: Lukas Tönne
Date:   Fri Dec 11 09:16:34 2015 +0100
Branches: object_nodes
https://developer.blender.org/rB9f584095d7e4584280613cdaa0a0c097723c2313

Minimal RNA API of the depsgraph for registering object node dependencies.

This simply reflects the existing C API for the depsgraph, as already used
by modifiers. The object nodes gain two callbacks, one for depsgraph
relations and one for registering globals. Since both of these should
require the same objects and other ID blocks to be registered, they share
a common `relations_update` function on the pynode level for convenience.

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

M	release/scripts/nodes/common_nodes.py
M	release/scripts/nodes/geometry_nodes.py
M	release/scripts/nodes/group_nodes.py
M	release/scripts/nodes/node_compiler.py
M	source/blender/blenkernel/intern/DerivedMesh.c
M	source/blender/blenkernel/intern/effect.c
M	source/blender/blenvm/BVM_api.h
M	source/blender/blenvm/bvm/bvm_eval.cc
M	source/blender/blenvm/bvm/bvm_eval.h
M	source/blender/blenvm/bvm/bvm_eval_curve.h
M	source/blender/blenvm/bvm/bvm_opcode.h
M	source/blender/blenvm/compile/bvm_nodegraph.cc
M	source/blender/blenvm/intern/bvm_api.cc
M	source/blender/depsgraph/DEG_depsgraph_build.h
M	source/blender/depsgraph/intern/depsgraph_build_relations.cc
M	source/blender/makesrna/intern/rna_blenvm.c
M	source/blender/makesrna/intern/rna_depsgraph.c
M	source/blender/makesrna/intern/rna_nodetree.c

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

diff --git a/release/scripts/nodes/common_nodes.py b/release/scripts/nodes/common_nodes.py
index 75f53f5..71975d0 100644
--- a/release/scripts/nodes/common_nodes.py
+++ b/release/scripts/nodes/common_nodes.py
@@ -20,7 +20,7 @@
 
 import bpy, contextlib
 import nodeitems_utils
-from bpy.types import Operator, ObjectNode
+from bpy.types import Operator, ObjectNode, BVMEvalGlobals
 from bpy.props import *
 from node_compiler import NodeCompiler, NodeWrapper, InputWrapper, OutputWrapper
 
@@ -41,7 +41,38 @@ def enum_property_value_prop(name):
 
 ###############################################################################
 
+# Utility class with the same API as DepsNode, to gather needed ID datablocks
+class GlobalsBuilder():
+    def __init__(self, eval_globals):
+        self.eval_globals = eval_globals
+
+    @staticmethod
+    def get_id_key(id_data):
+        return BVMEvalGlobals.get_id_key(id_data)
+
+    def add_scene_relation(self, scene, component='PARAMETERS', description=""):
+        pass
+
+    def add_object_relation(self, ob, component='PARAMETERS', description=""):
+        self.eval_globals.add_object(self.get_id_key(ob), ob)
+
+    def add_bone_relation(self, ob, bone, component='PARAMETERS', description=""):
+        self.eval_globals.add_object(self.get_id_key(ob), ob)
+
+    def add_texture_relation(self, tex, component='PARAMETERS', description=""):
+        pass
+
+
 class NodeTreeBase():
+    def depsgraph_update(self, depsnode):
+        for node in self.nodes:
+            node.relations_update(depsnode)
+
+    def bvm_globals_update(self, eval_globals):
+        builder = GlobalsBuilder(eval_globals)
+        for node in self.nodes:
+            node.relations_update(builder)
+
     def bvm_compile(self, graph):
         compiler = NodeCompiler(graph)
         self.compile_nodes(compiler)
@@ -81,6 +112,9 @@ class NodeBase():
         finally:
             self.is_updating = False
 
+    def relations_update(self, depsnode):
+        pass
+
 
 ###############################################################################
 # Generic Nodes
diff --git a/release/scripts/nodes/geometry_nodes.py b/release/scripts/nodes/geometry_nodes.py
index 958c0c5..65311a8 100644
--- a/release/scripts/nodes/geometry_nodes.py
+++ b/release/scripts/nodes/geometry_nodes.py
@@ -235,6 +235,11 @@ class CurvePathNode(CurveNodeBase, ObjectNode):
     def draw_buttons(self, context, layout):
         layout.template_ID(self, "id")
 
+    def relations_update(self, depsnode):
+        if self.id is not None:
+            depsnode.add_object_relation(self.id, 'TRANSFORM')
+            depsnode.add_object_relation(self.id, 'GEOMETRY')
+
     def init(self, context):
         self.inputs.new('NodeSocketFloat', "Parameter")
         self.outputs.new('NodeSocketVector', "Location")
@@ -243,6 +248,7 @@ class CurvePathNode(CurveNodeBase, ObjectNode):
         self.outputs.new('TransformSocket', "Rotation")
         self.outputs.new('NodeSocketFloat', "Radius")
         self.outputs.new('NodeSocketFloat', "Weight")
+        self.outputs.new('NodeSocketFloat', "Tilt")
 
     def compile(self, compiler):
         if self.id is None:
@@ -261,6 +267,7 @@ class CurvePathNode(CurveNodeBase, ObjectNode):
         compiler.map_output(3, node.outputs[3])
         compiler.map_output(4, node.outputs[4])
         compiler.map_output(5, node.outputs[5])
+        compiler.map_output(6, node.outputs[6])
 
 ###############################################################################
 
diff --git a/release/scripts/nodes/group_nodes.py b/release/scripts/nodes/group_nodes.py
index 4d456e5..0704053 100644
--- a/release/scripts/nodes/group_nodes.py
+++ b/release/scripts/nodes/group_nodes.py
@@ -298,6 +298,11 @@ def make_node_group_types(prefix, treetype, node_base):
         def draw_buttons(self, context, layout):
             layout.template_ID(self, "id", new="object_nodes.geometry_nodes_new")
 
+        def relations_update(self, depsnode):
+            if self.id:
+                for node in self.id.nodes:
+                    node.relations_update(depsnode)
+
         def update(self):
             if self.is_updating:
                 return
diff --git a/release/scripts/nodes/node_compiler.py b/release/scripts/nodes/node_compiler.py
index 927a70b..153b5e3 100644
--- a/release/scripts/nodes/node_compiler.py
+++ b/release/scripts/nodes/node_compiler.py
@@ -18,6 +18,7 @@
 
 # <pep8-80 compliant>
 
+from bpy.types import BVMEvalGlobals
 from collections import OrderedDict
 from socket_types import rna_to_bvm_type, convert_sockets
 
@@ -156,8 +157,9 @@ class NodeCompiler:
             raise KeyError("Output %r not found in node %r" % (key, bnode))
         self.link(socket, bnode_outputs[key].inputs[0])
 
-    def get_id_key(self, id_data):
-        return self.graph.get_id_key(id_data)
+    @staticmethod
+    def get_id_key(id_data):
+        return BVMEvalGlobals.get_id_key(id_data)
 
 ###############################################################################
 
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index 5620d3e..fef13c1 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -1712,9 +1712,12 @@ static DerivedMesh *mesh_calc_modifier_nodes(Scene *UNUSED(scene), Object *ob, b
 	
 	{
 		struct BVMEvalGlobals *globals = BVM_globals_create();
+		BVM_globals_add_nodetree_relations(globals, ntree);
+		
 		struct BVMEvalContext *context = BVM_context_create();
 		dm = BVM_eval_modifier(globals, context, fn, me);
 		BVM_context_free(context);
+		
 		BVM_globals_free(globals);
 	}
 	
diff --git a/source/blender/blenkernel/intern/effect.c b/source/blender/blenkernel/intern/effect.c
index 4083d60..4ca4054 100644
--- a/source/blender/blenkernel/intern/effect.c
+++ b/source/blender/blenkernel/intern/effect.c
@@ -203,7 +203,7 @@ static void add_object_nodes_to_effectors(EffectorContext *effctx, Scene *scene,
 	if (ob->nodetree) {
 		bNode *node;
 		
-		BVM_globals_add_object(effctx->eval_globals, ob);
+		BVM_globals_add_object(effctx->eval_globals, BVM_get_id_key((ID *)ob), ob);
 		
 		/* XXX TODO This is a placeholder for future component nodes design! */
 		
@@ -212,6 +212,8 @@ static void add_object_nodes_to_effectors(EffectorContext *effctx, Scene *scene,
 				bNodeTree *ff_ntree = (bNodeTree *)node->id;
 				
 				if (ff_ntree) {
+					BVM_globals_add_nodetree_relations(effctx->eval_globals, ff_ntree);
+					
 					EffectorCache *eff = new_effector_cache(effctx, scene, ob, NULL, ob->pd);
 					eff->function = BVM_gen_forcefield_function(ff_ntree, NULL);
 				}
@@ -231,7 +233,7 @@ EffectorContext *pdInitEffectors(Scene *scene, Object *ob_src, ParticleSystem *p
 	unsigned int layer= ob_src->lay;
 	
 	effctx->eval_globals = BVM_globals_create();
-	BVM_globals_add_object(effctx->eval_globals, ob_src);
+	BVM_globals_add_object(effctx->eval_globals, BVM_get_id_key((ID *)ob_src), ob_src);
 	
 	if (weights->group) {
 		GroupObject *go;
diff --git a/source/blender/blenvm/BVM_api.h b/source/blender/blenvm/BVM_api.h
index 58a3d08..1c63819 100644
--- a/source/blender/blenvm/BVM_api.h
+++ b/source/blender/blenvm/BVM_api.h
@@ -95,10 +95,13 @@ BVMType BVM_typedesc_base_type(struct BVMTypeDesc *typedesc);
 struct BVMEvalGlobals;
 struct BVMEvalContext;
 
+struct bNodeTree;
+
 struct BVMEvalGlobals *BVM_globals_create(void);
 void BVM_globals_free(struct BVMEvalGlobals *globals);
 
-void BVM_globals_add_object(struct BVMEvalGlobals *globals, struct Object *ob);
+void BVM_globals_add_object(struct BVMEvalGlobals *globals, int key, struct Object *ob);
+void BVM_globals_add_nodetree_relations(struct BVMEvalGlobals *globals, struct bNodeTree *ntree);
 
 int BVM_get_id_key(struct ID *id);
 
@@ -107,7 +110,6 @@ void BVM_context_free(struct BVMEvalContext *context);
 
 /* ------------------------------------------------------------------------- */
 
-struct bNodeTree;
 struct Object;
 struct EffectedPoint;
 
diff --git a/source/blender/blenvm/bvm/bvm_eval.cc b/source/blender/blenvm/bvm/bvm_eval.cc
index 6eb34df..81491bb 100644
--- a/source/blender/blenvm/bvm/bvm_eval.cc
+++ b/source/blender/blenvm/bvm/bvm_eval.cc
@@ -64,9 +64,8 @@ int EvalGlobals::get_id_key(ID *id)
 	return hash;
 }
 
-void EvalGlobals::add_object(Object *ob)
+void EvalGlobals::add_object(int key, Object *ob)
 {
-	int key = get_id_key((ID *)ob);
 	m_objects[key] = ob;
 }
 
@@ -767,7 +766,7 @@ void EvalContext::eval_instructions(const EvalGlobals *globals, const Function *
 				break;
 			}
 			
-			case OB_OBJECT_LOOKUP: {
+			case OP_OBJECT_LOOKUP: {
 				int key = fn->read_int(&instr);
 				StackIndex offset_object = fn->read_stack_index(&instr);
 				eval_op_object_lookup(globals, stack, key, offset_object);
@@ -837,9 +836,11 @@ void EvalContext::eval_instructions(const EvalGlobals *globals, const Function *
 				StackIndex offset_rot = fn->read_stack_index(&instr);
 				StackIndex offset_radius = fn->read_stack_index(&instr);
 				StackIndex offset_weight = fn->read_stack_index(&instr);
+				StackIndex offset_tilt = fn->read_stack_index(&instr);
 				eval_op_curve_path(stack, offset_object, offset_param,
 				                   offset_loc, offset_dir, offset_nor,
-				                   offset_rot, offset_radius, offset_weight);
+				                   offset_rot, offset_radius, offset_weight,
+				                   offset_tilt);
 				break;
 			}
 			
diff --git a/source/blender/blenvm/bvm/bvm_eval.h b/source/blender/blenvm/bvm/bvm_eval.h
index ce3f217..ae828b3 100644
--- a/source/blender/blenvm/bvm/bvm_eval.h
+++ b/source/blender/blenvm/bvm/bvm_eval.h
@@ -54,7 +54,7 @@ struct EvalGlobals {
 	
 	static int get_id_key(ID *id);
 	
-	void add_object(Object *ob);
+	void add_object(int key, Object *ob);
 	PointerRNA lookup_object(int key) const;
 	
 private:
diff --git a/source/blender/blenvm/bvm/bvm_eval_curve.h b/source/blender/blenvm/bvm/bvm_eval_curve.h
index 6c74ec1..c7d8410 100644
--- a/source/blender/blenvm/bvm/bvm_eval_curve.h
+++ b/source/blender/blenvm/bvm/bvm_eval_curve.h
@@ -46,21 +46,27 @@ namespace bvm {
 
 static void eval_op_curve_path(float *stack, StackIndex offset_object, StackIn

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list