[Bf-blender-cvs] [4a239bc] object_nodes: Integration of BVM into the effector system for using programmable expressions there.

Lukas Tönne noreply at git.blender.org
Tue Nov 24 09:42:55 CET 2015


Commit: 4a239bc2ff8dee0ed6630517b961d5ad50b22820
Author: Lukas Tönne
Date:   Sat Oct 10 10:48:59 2015 +0200
Branches: object_nodes
https://developer.blender.org/rB4a239bc2ff8dee0ed6630517b961d5ad50b22820

Integration of BVM into the effector system for using programmable expressions there.

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

M	build_files/cmake/macros.cmake
M	source/blender/blenkernel/BKE_effect.h
M	source/blender/blenkernel/CMakeLists.txt
M	source/blender/blenkernel/intern/effect.c
M	source/blender/blenvm/BVM_api.h
M	source/blender/blenvm/CMakeLists.txt
M	source/blender/blenvm/intern/bvm_api.cc
A	source/blender/blenvm/intern/bvm_eval.cc
A	source/blender/blenvm/intern/bvm_eval.h
M	source/blender/blenvm/intern/bvm_module.cc

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

diff --git a/build_files/cmake/macros.cmake b/build_files/cmake/macros.cmake
index 90c4fbd..6ae3f1c 100644
--- a/build_files/cmake/macros.cmake
+++ b/build_files/cmake/macros.cmake
@@ -548,6 +548,7 @@ function(SETUP_BLENDER_SORTED_LIBS)
 		bf_bmesh
 		bf_gpu
 		bf_blenkernel
+		bf_blenvm
 		bf_physics
 		bf_nodes
 		bf_rna
diff --git a/source/blender/blenkernel/BKE_effect.h b/source/blender/blenkernel/BKE_effect.h
index 0b79a89..a57d46c 100644
--- a/source/blender/blenkernel/BKE_effect.h
+++ b/source/blender/blenkernel/BKE_effect.h
@@ -105,6 +105,8 @@ typedef struct EffectorCache {
 	float guide_loc[4], guide_dir[3], guide_radius;
 	float velocity[3];
 
+	struct BVMExpression *expression;
+
 	float frame;
 	int flag;
 } EffectorCache;
@@ -112,8 +114,7 @@ typedef struct EffectorCache {
 typedef struct EffectorContext {
 	ListBase effectors;
 	
-	void *eval_func;
-	void *eval_data;
+	struct BVMEvalContext *eval_context;
 } EffectorContext;
 
 void            free_partdeflect(struct PartDeflect *pd);
@@ -123,11 +124,6 @@ void            pdPrecalculateEffectors(struct EffectorContext *effctx);
 void            pdDoEffectors(struct EffectorContext *effctx, struct ListBase *colliders, struct EffectorWeights *weights,
                               struct EffectedPoint *point, float *force, float *impulse);
 
-struct EffectorContext *pdInitJITEffectors(struct Scene *scene, struct Object *ob_src, struct ParticleSystem *psys_src, struct EffectorWeights *weights, bool precalc);
-void            pdEndJITEffectors(struct EffectorContext *effctx);
-void            pdDoJITEffectors(struct EffectorContext *effctx, struct ListBase *colliders, struct EffectorWeights *weights,
-                                 struct EffectedPoint *point, float *force, float *impulse);
-
 void pd_point_from_particle(struct ParticleSimulationData *sim, struct ParticleData *pa, struct ParticleKey *state, struct EffectedPoint *point);
 void pd_point_from_loc(struct Scene *scene, float *loc, float *vel, int index, struct EffectedPoint *point);
 void pd_point_from_soft(struct Scene *scene, float *loc, float *vel, int index, struct EffectedPoint *point);
diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt
index 0865efb..06cfc64 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -29,6 +29,7 @@ set(INC
 	../blenlib
 	../blenloader
 	../blentranslation
+	../blenvm
 	../depsgraph
 	../gpu
 	../ikplugin
diff --git a/source/blender/blenkernel/intern/effect.c b/source/blender/blenkernel/intern/effect.c
index ece29bc..5a28e28 100644
--- a/source/blender/blenkernel/intern/effect.c
+++ b/source/blender/blenkernel/intern/effect.c
@@ -41,6 +41,7 @@
 #include "DNA_group_types.h"
 #include "DNA_listBase.h"
 #include "DNA_meshdata_types.h"
+#include "DNA_node_types.h"
 #include "DNA_object_types.h"
 #include "DNA_object_force.h"
 #include "DNA_particle_types.h"
@@ -65,11 +66,13 @@
 #include "BKE_effect.h"
 #include "BKE_global.h"
 #include "BKE_modifier.h"
+#include "BKE_node.h"
 #include "BKE_object.h"
 #include "BKE_particle.h"
 #include "BKE_scene.h"
 #include "BKE_smoke.h"
 
+#include "BVM_api.h"
 
 #include "RE_render_ext.h"
 #include "RE_shader_ext.h"
@@ -147,7 +150,7 @@ void free_partdeflect(PartDeflect *pd)
 	MEM_freeN(pd);
 }
 
-static EffectorCache *new_effector_cache(Scene *scene, Object *ob, ParticleSystem *psys, PartDeflect *pd)
+static EffectorCache *new_effector_cache(EffectorContext *effctx, Scene *scene, Object *ob, ParticleSystem *psys, PartDeflect *pd)
 {
 	EffectorCache *eff = MEM_callocN(sizeof(EffectorCache), "EffectorCache");
 	eff->scene = scene;
@@ -155,24 +158,23 @@ static EffectorCache *new_effector_cache(Scene *scene, Object *ob, ParticleSyste
 	eff->psys = psys;
 	eff->pd = pd;
 	eff->frame = -1;
+	
+	BLI_addtail(&effctx->effectors, eff);
+	
 	return eff;
 }
 static void add_object_to_effectors(EffectorContext *effctx, Scene *scene, EffectorWeights *weights, Object *ob, Object *ob_src)
 {
-	EffectorCache *eff = NULL;
-
 	if ( ob == ob_src || weights->weight[ob->pd->forcefield] == 0.0f )
 		return;
 
 	if (ob->pd->shape == PFIELD_SHAPE_POINTS && !ob->derivedFinal )
 		return;
 
-	eff = new_effector_cache(scene, ob, NULL, ob->pd);
+	new_effector_cache(effctx, scene, ob, NULL, ob->pd);
 
 	/* make sure imat is up to date */
 	invert_m4_m4(ob->imat, ob->obmat);
-
-	BLI_addtail(&effctx->effectors, eff);
 }
 static void add_particles_to_effectors(EffectorContext *effctx, Scene *scene, EffectorWeights *weights, Object *ob, ParticleSystem *psys, ParticleSystem *psys_src)
 {
@@ -185,11 +187,35 @@ static void add_particles_to_effectors(EffectorContext *effctx, Scene *scene, Ef
 		return;
 
 	if ( part->pd && part->pd->forcefield && weights->weight[part->pd->forcefield] != 0.0f) {
-		BLI_addtail(&effctx->effectors, new_effector_cache(scene, ob, psys, part->pd));
+		new_effector_cache(effctx, scene, ob, psys, part->pd);
 	}
 
 	if (part->pd2 && part->pd2->forcefield && weights->weight[part->pd2->forcefield] != 0.0f) {
-		BLI_addtail(&effctx->effectors, new_effector_cache(scene, ob, psys, part->pd2));
+		new_effector_cache(effctx, scene, ob, psys, part->pd2);
+	}
+}
+static void add_object_nodes_to_effectors(EffectorContext *effctx, Scene *scene, EffectorWeights *UNUSED(weights), Object *ob, Object *ob_src)
+{
+	if (ob == ob_src)
+		return;
+	
+	if (ob->nodetree) {
+		bNode *node;
+		
+		/* XXX TODO This is a placeholder for future component nodes design! */
+		
+		for (node = ob->nodetree->nodes.first; node; node = node->next) {
+			if (STREQ(node->typeinfo->idname, "ForceFieldNode")) {
+				bNodeTree *ff_ntree = (bNodeTree *)node->id;
+				
+				if (ff_ntree) {
+					EffectorCache *eff = new_effector_cache(effctx, scene, ob, NULL, ob->pd);
+					eff->expression = BVM_gen_nodetree_expression(ff_ntree);
+				}
+				
+				break;
+			}
+		}
 	}
 }
 
@@ -209,6 +235,8 @@ EffectorContext *pdInitEffectors(Scene *scene, Object *ob_src, ParticleSystem *p
 				if ( go->ob->pd && go->ob->pd->forcefield )
 					add_object_to_effectors(effctx, scene, weights, go->ob, ob_src);
 
+				add_object_nodes_to_effectors(effctx, scene, weights, go->ob, ob_src);
+
 				if ( go->ob->particlesystem.first ) {
 					ParticleSystem *psys= go->ob->particlesystem.first;
 
@@ -224,6 +252,8 @@ EffectorContext *pdInitEffectors(Scene *scene, Object *ob_src, ParticleSystem *p
 				if ( base->object->pd && base->object->pd->forcefield )
 					add_object_to_effectors(effctx, scene, weights, base->object, ob_src);
 
+				add_object_nodes_to_effectors(effctx, scene, weights, base->object, ob_src);
+
 				if ( base->object->particlesystem.first ) {
 					ParticleSystem *psys= base->object->particlesystem.first;
 
@@ -237,6 +267,8 @@ EffectorContext *pdInitEffectors(Scene *scene, Object *ob_src, ParticleSystem *p
 	if (precalc)
 		pdPrecalculateEffectors(effctx);
 	
+	effctx->eval_context = BVM_context_create();
+	
 	return effctx;
 }
 
@@ -247,10 +279,15 @@ void pdEndEffectors(EffectorContext *effctx)
 		for (; eff; eff = eff->next) {
 			if (eff->guide_data)
 				MEM_freeN(eff->guide_data);
+			if (eff->expression)
+				BVM_expression_free(eff->expression);
 		}
 		
 		BLI_freelistN(&effctx->effectors);
 		
+		if (effctx->eval_context)
+			BVM_context_free(effctx->eval_context);
+		
 		MEM_freeN(effctx);
 	}
 }
@@ -982,7 +1019,10 @@ void pdDoEffectors(struct EffectorContext *effctx, ListBase *colliders, Effector
 		get_effector_tot(eff, &efd, point, &tot, &p, &step);
 
 		for (; p<tot; p+=step) {
-			if (get_effector_data(eff, &efd, point, 0)) {
+			if (eff->expression) {
+				BVM_eval_expression(effctx->eval_context, eff->expression);
+			}
+			else if (get_effector_data(eff, &efd, point, 0)) {
 				efd.falloff= effector_falloff(eff, &efd, point, weights);
 				
 				if (efd.falloff > 0.0f)
diff --git a/source/blender/blenvm/BVM_api.h b/source/blender/blenvm/BVM_api.h
index 6e43f38..d373d7b 100644
--- a/source/blender/blenvm/BVM_api.h
+++ b/source/blender/blenvm/BVM_api.h
@@ -55,7 +55,7 @@ const char *BVM_function_name(const struct BVMFunction *fun);
 
 /* ------------------------------------------------------------------------- */
 
-void BVM_expression_eval(struct BVMExpression *expr, void *result);
+void BVM_expression_free(struct BVMExpression *expr);
 
 /* ------------------------------------------------------------------------- */
 
@@ -66,6 +66,15 @@ struct BVMNodeInstance *BVM_nodegraph_add_node(struct BVMNodeGraph *graph, const
 
 /* ------------------------------------------------------------------------- */
 
+struct BVMEvalContext;
+
+struct BVMEvalContext *BVM_context_create(void);
+void BVM_context_free(struct BVMEvalContext *result);
+
+void BVM_eval_expression(struct BVMEvalContext *context, struct BVMExpression *expr);
+
+/* ------------------------------------------------------------------------- */
+
 struct bNodeTree;
 
 struct BVMExpression *BVM_gen_nodetree_expression(struct bNodeTree *ntree);
diff --git a/source/blender/blenvm/CMakeLists.txt b/source/blender/blenvm/CMakeLists.txt
index 33a20f3..bc36aa0 100644
--- a/source/blender/blenvm/CMakeLists.txt
+++ b/source/blender/blenvm/CMakeLists.txt
@@ -38,12 +38,14 @@ set(INC_SYS
 
 set(SRC
 	intern/bvm_api.cc
+	intern/bvm_eval.cc
 	intern/bvm_expression.cc
 	intern/bvm_function.cc
 	intern/bvm_module.cc
 	intern/bvm_nodegraph.cc
 	intern/bvm_schedule.cc
 
+	intern/bvm_eval.h
 	intern/bvm_expression.h
 	intern/bvm_function.h
 	intern/bvm_module.h
diff --git a/source/blender/blenvm/intern/bvm_api.cc b/source/blender/blenvm/intern/bvm_api.cc
index e968f96..17600fe 100644
--- a/source/blender/blenvm/intern/bvm_api.cc
+++ b/source/blender/blenvm/intern/bvm_api.cc
@@ -41,6 +41,7 @@ extern "C" {
 #include "BVM_api.h"
 }
 
+#include "bvm_eval.h"
 #include "bvm_expression.h"
 #include "bvm_function.h"
 #include "bvm_module.h"
@@ -63,9 +64,16 @@ bool BVM_module_delete_function(BVMModule *mod, const char *name)
 
 /* ------------------------------------------------------------------------- */
 
+BLI_INLINE bvm::Expression *_EXPR(struct BVMExpression *expr)
+{ return (bvm::Expression *)expr; }
+
+void BVM_expression_free(struct BVMExpression *expr)
+{ delete _EXPR(ex

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list