[Bf-blender-cvs] [95f02d78060] functions: new Driver Variable type that evaluates a function

Jacques Lucke noreply at git.blender.org
Thu Feb 21 17:00:57 CET 2019


Commit: 95f02d7806004e3d908f0793164e6a23e6495b4b
Author: Jacques Lucke
Date:   Thu Feb 21 16:56:00 2019 +0100
Branches: functions
https://developer.blender.org/rB95f02d7806004e3d908f0793164e6a23e6495b4b

new Driver Variable type that evaluates a function

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

M	source/blender/blenkernel/BKE_fcurve.h
M	source/blender/blenkernel/CMakeLists.txt
M	source/blender/blenkernel/intern/fcurve.c
M	source/blender/depsgraph/CMakeLists.txt
M	source/blender/depsgraph/intern/builder/deg_builder_relations.cc
M	source/blender/editors/space_graph/graph_buttons.c
M	source/blender/makesdna/DNA_anim_types.h
M	source/blender/makesrna/intern/rna_fcurve.c

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

diff --git a/source/blender/blenkernel/BKE_fcurve.h b/source/blender/blenkernel/BKE_fcurve.h
index d9435534244..e75f3ad2977 100644
--- a/source/blender/blenkernel/BKE_fcurve.h
+++ b/source/blender/blenkernel/BKE_fcurve.h
@@ -225,6 +225,8 @@ struct FCurve *iter_step_fcurve(struct FCurve *fcu_iter, const char rna_path[]);
 /* high level function to get an fcurve from C without having the rna */
 struct FCurve *id_data_find_fcurve(ID *id, void *data, struct StructRNA *type, const char *prop_name, int index, bool *r_driven);
 
+void *get_driver_variable_function(struct DriverVar *dvar);
+
 /* Get list of LinkData's containing pointers to the F-Curves which control the types of data indicated
  * e.g.  numMatches = list_find_data_fcurves(matches, &act->curves, "pose.bones[", "MyFancyBone");
  */
diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt
index b30acbcae24..87758108c03 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -26,6 +26,7 @@ set(INC
 	../blentranslation
 	../depsgraph
 	../draw
+	../functions
 	../gpu
 	../ikplugin
 	../imbuf
diff --git a/source/blender/blenkernel/intern/fcurve.c b/source/blender/blenkernel/intern/fcurve.c
index 78282ddb2b5..b598697ad1b 100644
--- a/source/blender/blenkernel/intern/fcurve.c
+++ b/source/blender/blenkernel/intern/fcurve.c
@@ -57,6 +57,8 @@
 
 #include "RNA_access.h"
 
+#include "FN_functions.h"
+
 #include "atomic_ops.h"
 
 #include "CLG_log.h"
@@ -1611,6 +1613,38 @@ static float dvar_eval_transChan(ChannelDriver *driver, DriverVar *dvar)
 	}
 }
 
+/* evaluate 'function' driver variable */
+static float dvar_eval_function(ChannelDriver *UNUSED(driver), DriverVar *dvar)
+{
+	FnFunction fn = (FnFunction)get_driver_variable_function(dvar);
+	if (fn == NULL) {
+		return 0.0f;
+	}
+
+	FnTuple fn_in = FN_tuple_for_input(fn);
+	FnTuple fn_out = FN_tuple_for_output(fn);
+	FnCallable callable = FN_function_get_callable(fn);
+
+	FN_function_call(callable, fn_in, fn_out);
+	float result = FN_tuple_get_float(fn_out, 0);
+
+	FN_tuple_free(fn_in);
+	FN_tuple_free(fn_out);
+
+	return result;
+}
+
+struct bNodeTree;
+void *get_driver_variable_function(DriverVar *dvar)
+{
+	FnType float_ty = FN_type_borrow_float();
+	FnType inputs[] = { NULL };
+	FnType outputs[] = { float_ty, NULL };
+
+	struct bNodeTree *tree = (struct bNodeTree *)dvar->targets[0].id;
+	return FN_function_get_with_signature(tree, inputs, outputs);
+}
+
 /* ......... */
 
 /* Table of Driver Varaiable Type Info Data */
@@ -1642,6 +1676,13 @@ static DriverVarTypeInfo dvar_types[MAX_DVAR_TYPES] = {
 		{"Object/Bone"},     /* UI names for targets */
 		{DTAR_FLAG_STRUCT_REF | DTAR_FLAG_ID_OB_ONLY}   /* flags */
 	END_DVAR_TYPEDEF,
+
+	BEGIN_DVAR_TYPEDEF(DVAR_TYPE_FUNCTION)
+		dvar_eval_function,  /* eval callback */
+		1,                   /* number of targets used */
+		{"Function"},        /* UI names for targets */
+		{0},                 /* flags */
+	END_DVAR_TYPEDEF,
 };
 
 /* Get driver variable typeinfo */
@@ -1734,6 +1775,10 @@ void driver_change_variable_type(DriverVar *dvar, int type)
 		/* object ID types only, or idtype not yet initialized */
 		if ((flags & DTAR_FLAG_ID_OB_ONLY) || (dtar->idtype == 0))
 			dtar->idtype = ID_OB;
+
+		if (type == DVAR_TYPE_FUNCTION) {
+			dtar->idtype = ID_NT;
+		}
 	}
 	DRIVER_TARGETS_LOOPER_END;
 }
diff --git a/source/blender/depsgraph/CMakeLists.txt b/source/blender/depsgraph/CMakeLists.txt
index 9a619ef560d..18674a85654 100644
--- a/source/blender/depsgraph/CMakeLists.txt
+++ b/source/blender/depsgraph/CMakeLists.txt
@@ -24,6 +24,7 @@ set(INC
 	../blenlib
 	../bmesh
 	../draw
+	../functions
 	../makesdna
 	../makesrna
 	../modifiers
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
index dfd940a176f..c77b192c42c 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
@@ -111,6 +111,8 @@ extern "C" {
 
 #include "intern/depsgraph_type.h"
 
+#include "FN_functions.hpp"
+
 namespace DEG {
 
 /* ***************** */
@@ -1551,6 +1553,17 @@ void DepsgraphRelationBuilder::build_driver_variables(ID *id, FCurve *fcu)
 				continue;
 			}
 			build_id(dtar->id);
+
+			if (dvar->type == DVAR_TYPE_FUNCTION) {
+				auto fn = (BLI::RefCounted<FN::Function> *)get_driver_variable_function(dvar);
+				if (fn != NULL) {
+					FN::Dependencies dependencies;
+					fn->ptr()->body<FN::TupleCallBody>()->dependencies(dependencies);
+					dependencies.add_relations(*this, driver_key);
+					fn->decref();
+				}
+			}
+
 			/* Initialize relations coming to proxy_from. */
 			Object *proxy_from = NULL;
 			if ((GS(dtar->id->name) == ID_OB) &&
diff --git a/source/blender/editors/space_graph/graph_buttons.c b/source/blender/editors/space_graph/graph_buttons.c
index a4d7b5e9fc9..754ead46e18 100644
--- a/source/blender/editors/space_graph/graph_buttons.c
+++ b/source/blender/editors/space_graph/graph_buttons.c
@@ -731,6 +731,16 @@ static void graph_panel_driverVar__transChan(uiLayout *layout, ID *id, DriverVar
 	uiItemR(sub, &dtar_ptr, "transform_space", 0, IFACE_("Space"), ICON_NONE);
 }
 
+/* settings for 'function' driver variable type */
+static void graph_panel_driverVar_function(uiLayout *layout, ID *id, DriverVar *dvar)
+{
+	DriverTarget *dtar = &dvar->targets[0];
+	PointerRNA dtar_ptr;
+	RNA_pointer_create(id, &RNA_DriverTarget, dtar, &dtar_ptr);
+
+	uiItemR(layout, &dtar_ptr, "id", 0, IFACE_("Function"), ICON_NONE);
+}
+
 /* ----------------------------------------------------------------- */
 
 
@@ -970,6 +980,9 @@ static void graph_draw_driver_settings_panel(uiLayout *layout, ID *id, FCurve *f
 			case DVAR_TYPE_TRANSFORM_CHAN:     /* transform channel */
 				graph_panel_driverVar__transChan(box, id, dvar);
 				break;
+			case DVAR_TYPE_FUNCTION:     /* function */
+				graph_panel_driverVar_function(box, id, dvar);
+				break;
 		}
 
 		/* 3) value of variable */
diff --git a/source/blender/makesdna/DNA_anim_types.h b/source/blender/makesdna/DNA_anim_types.h
index a05b52d0f49..391308ebb51 100644
--- a/source/blender/makesdna/DNA_anim_types.h
+++ b/source/blender/makesdna/DNA_anim_types.h
@@ -411,6 +411,8 @@ typedef enum eDriverVar_Types {
 	DVAR_TYPE_LOC_DIFF,
 		/* 'final' transform for object/bones */
 	DVAR_TYPE_TRANSFORM_CHAN,
+		/* evaluate function */
+	DVAR_TYPE_FUNCTION,
 
 	/* maximum number of variable types
 	 * NOTE: this must always be th last item in this list,
diff --git a/source/blender/makesrna/intern/rna_fcurve.c b/source/blender/makesrna/intern/rna_fcurve.c
index 6c36f133d0f..3dfcaf25773 100644
--- a/source/blender/makesrna/intern/rna_fcurve.c
+++ b/source/blender/makesrna/intern/rna_fcurve.c
@@ -1556,6 +1556,7 @@ static void rna_def_drivervar(BlenderRNA *brna)
 		                           "Final transformation value of object or bone"},
 		{DVAR_TYPE_ROT_DIFF, "ROTATION_DIFF", ICON_DRIVER_ROTATIONAL_DIFFERENCE, "Rotational Difference", "Use the angle between two bones"},
 		{DVAR_TYPE_LOC_DIFF, "LOC_DIFF", ICON_DRIVER_DISTANCE, "Distance", "Distance between two bones or objects"},
+		{DVAR_TYPE_FUNCTION, "FUNCTION", ICON_NONE, "Function", "Evaluate Function"},
 		{0, NULL, 0, NULL, NULL},
 	};



More information about the Bf-blender-cvs mailing list