[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