[Bf-blender-cvs] [e3ea07a] object_nodes: Effector closest-point node for mesh-based for fields.
Lukas Tönne
noreply at git.blender.org
Tue Nov 24 09:43:27 CET 2015
Commit: e3ea07adc4de09f0aaa241fe8a2839e0f99cf144
Author: Lukas Tönne
Date: Mon Oct 26 11:32:54 2015 +0100
Branches: object_nodes
https://developer.blender.org/rBe3ea07adc4de09f0aaa241fe8a2839e0f99cf144
Effector closest-point node for mesh-based for fields.
===================================================================
M release/scripts/startup/bl_operators/object_nodes.py
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_opcode.h
M source/blender/blenvm/compile/bvm_nodegraph.cc
M source/blender/blenvm/intern/bvm_api.cc
===================================================================
diff --git a/release/scripts/startup/bl_operators/object_nodes.py b/release/scripts/startup/bl_operators/object_nodes.py
index 3470920..9fc47b4 100644
--- a/release/scripts/startup/bl_operators/object_nodes.py
+++ b/release/scripts/startup/bl_operators/object_nodes.py
@@ -56,6 +56,9 @@ node_categories = [
NodeItem("ObjectMathNode"),
NodeItem("ObjectVectorMathNode"),
]),
+ ForceFieldNodeCategory("GEOMETRY", "Geometry", items=[
+ NodeItem("ForceClosestPointNode"),
+ ]),
]
###############################################################################
@@ -199,6 +202,19 @@ class MathNode(ForceNodeBase, ObjectNode):
self.outputs.new('NodeSocketFloat', "Value")
+class ForceClosestPointNode(ForceNodeBase, ObjectNode):
+ '''Closest point on the effector mesh'''
+ bl_idname = 'ForceClosestPointNode'
+ bl_label = 'Closest Point'
+ bl_icon = 'FORCE_FORCE'
+
+ def init(self, context):
+ self.inputs.new('NodeSocketVector', "Vector")
+ self.outputs.new('NodeSocketVector', "Position")
+ self.outputs.new('NodeSocketVector', "Normal")
+ self.outputs.new('NodeSocketVector', "Tangent")
+
+
class VectorMathNode(ForceNodeBase, ObjectNode):
'''Vector Math '''
bl_idname = 'ObjectVectorMathNode'
diff --git a/source/blender/blenkernel/intern/effect.c b/source/blender/blenkernel/intern/effect.c
index 313be89..e360d13 100644
--- a/source/blender/blenkernel/intern/effect.c
+++ b/source/blender/blenkernel/intern/effect.c
@@ -202,6 +202,8 @@ static void add_object_nodes_to_effectors(EffectorContext *effctx, Scene *scene,
if (ob->nodetree) {
bNode *node;
+ BVM_globals_add_object(effctx->eval_globals, ob);
+
/* XXX TODO This is a placeholder for future component nodes design! */
for (node = ob->nodetree->nodes.first; node; node = node->next) {
@@ -210,7 +212,7 @@ static void add_object_nodes_to_effectors(EffectorContext *effctx, Scene *scene,
if (ff_ntree) {
EffectorCache *eff = new_effector_cache(effctx, scene, ob, NULL, ob->pd);
- eff->expression = BVM_gen_forcefield_expression(ff_ntree);
+ eff->expression = BVM_gen_forcefield_expression(effctx->eval_globals, ob, ff_ntree);
}
break;
@@ -227,6 +229,9 @@ EffectorContext *pdInitEffectors(Scene *scene, Object *ob_src, ParticleSystem *p
Base *base;
unsigned int layer= ob_src->lay;
+ effctx->eval_globals = BVM_globals_create();
+ BVM_globals_add_object(effctx->eval_globals, ob_src);
+
if (weights->group) {
GroupObject *go;
@@ -267,8 +272,6 @@ EffectorContext *pdInitEffectors(Scene *scene, Object *ob_src, ParticleSystem *p
if (precalc)
pdPrecalculateEffectors(effctx);
- effctx->eval_globals = BVM_globals_create();
-
return effctx;
}
diff --git a/source/blender/blenvm/BVM_api.h b/source/blender/blenvm/BVM_api.h
index 46b1583..1d16d66 100644
--- a/source/blender/blenvm/BVM_api.h
+++ b/source/blender/blenvm/BVM_api.h
@@ -75,6 +75,8 @@ struct EffectedPoint;
struct BVMEvalGlobals *BVM_globals_create(void);
void BVM_globals_free(struct BVMEvalGlobals *globals);
+void BVM_globals_add_object(struct BVMEvalGlobals *globals, struct Object *ob);
+
struct BVMEvalContext *BVM_context_create(void);
void BVM_context_free(struct BVMEvalContext *context);
@@ -84,8 +86,9 @@ void BVM_eval_forcefield(struct BVMEvalGlobals *globals, struct BVMEvalContext *
/* ------------------------------------------------------------------------- */
struct bNodeTree;
+struct Object;
-struct BVMExpression *BVM_gen_forcefield_expression(struct bNodeTree *ntree);
+struct BVMExpression *BVM_gen_forcefield_expression(const struct BVMEvalGlobals *globals, struct Object *effob, struct bNodeTree *ntree);
#ifdef __cplusplus
}
diff --git a/source/blender/blenvm/bvm/bvm_eval.cc b/source/blender/blenvm/bvm/bvm_eval.cc
index f3dceb1..9cf982b 100644
--- a/source/blender/blenvm/bvm/bvm_eval.cc
+++ b/source/blender/blenvm/bvm/bvm_eval.cc
@@ -33,6 +33,11 @@
extern "C" {
#include "BLI_math.h"
+
+#include "DNA_object_types.h"
+
+#include "BKE_bvhutils.h"
+#include "BKE_DerivedMesh.h"
}
#include "bvm_eval.h"
@@ -263,6 +268,41 @@ static void eval_op_clamp(float *stack, StackIndex offset, StackIndex offset_r)
stack_store_float(stack, offset_r, CLAMPIS(f, 0.0f, 1.0f));
}
+static void eval_op_effector_closest_point(const EvalGlobals *globals, float *stack, int object_index, StackIndex offset_vector,
+ StackIndex offset_position, StackIndex offset_normal, StackIndex offset_tangent)
+{
+ Object *ob = globals->objects[object_index];
+ DerivedMesh *dm = object_get_derived_final(ob, false);
+
+ float world[4][4];
+ SpaceTransform transform;
+ unit_m4(world);
+ BLI_space_transform_from_matrices(&transform, world, ob->obmat);
+
+ float3 vec;
+ vec = stack_load_float3(stack, offset_vector);
+ BLI_space_transform_apply(&transform, &vec.x);
+
+ BVHTreeFromMesh treeData = {NULL};
+ bvhtree_from_mesh_looptri(&treeData, dm, 0.0, 2, 6);
+
+ BVHTreeNearest nearest;
+ nearest.index = -1;
+ nearest.dist_sq = FLT_MAX;
+ BLI_bvhtree_find_nearest(treeData.tree, &vec.x, &nearest, treeData.nearest_callback, &treeData);
+
+ if (nearest.index != -1) {
+ float3 pos, nor;
+ copy_v3_v3(&pos.x, nearest.co);
+ copy_v3_v3(&nor.x, nearest.no);
+ BLI_space_transform_invert(&transform, &pos.x);
+ BLI_space_transform_invert_normal(&transform, &nor.x);
+
+ stack_store_float3(stack, offset_position, pos);
+ stack_store_float3(stack, offset_normal, nor);
+ }
+}
+
static void eval_op_add_float3(float *stack, StackIndex offset_a, StackIndex offset_b, StackIndex offset_r)
{
float3 a = stack_load_float3(stack, offset_a);
@@ -487,6 +527,16 @@ void EvalContext::eval_instructions(const EvalGlobals *globals, const EvalData *
eval_op_sub_float3(stack, offset_a, offset_b, offset_r);
break;
}
+ case OP_EFFECTOR_CLOSEST_POINT: {
+ int object_index = expr->read_int(&instr);
+ StackIndex offset_vector = expr->read_stack_index(&instr);
+ StackIndex offset_position = expr->read_stack_index(&instr);
+ StackIndex offset_normal = expr->read_stack_index(&instr);
+ StackIndex offset_tangent = expr->read_stack_index(&instr);
+ eval_op_effector_closest_point(globals, stack, object_index, offset_vector,
+ offset_position, offset_normal, offset_tangent);
+ break;
+ }
case OP_END:
return;
default:
diff --git a/source/blender/blenvm/bvm/bvm_opcode.h b/source/blender/blenvm/bvm/bvm_opcode.h
index b67bfaf..dab3c90 100644
--- a/source/blender/blenvm/bvm/bvm_opcode.h
+++ b/source/blender/blenvm/bvm/bvm_opcode.h
@@ -70,6 +70,9 @@ enum OpCode {
OP_ADD_FLOAT3,
OP_SUB_FLOAT3,
+
+ OP_EFFECTOR_CLOSEST_POINT,
+
OP_END,
// OP_JUMP,
// OP_JUMP_IF_ZERO,
diff --git a/source/blender/blenvm/compile/bvm_nodegraph.cc b/source/blender/blenvm/compile/bvm_nodegraph.cc
index 1afb99b..695176e 100644
--- a/source/blender/blenvm/compile/bvm_nodegraph.cc
+++ b/source/blender/blenvm/compile/bvm_nodegraph.cc
@@ -586,6 +586,8 @@ OpCode get_opcode_from_node_type(const string &node)
NODETYPE(ADD_FLOAT3);
NODETYPE(SUB_FLOAT3);
+ NODETYPE(EFFECTOR_CLOSEST_POINT);
+
#undef NODETYPE
assert(!"Invalid node type");
@@ -665,6 +667,13 @@ void register_opcode_node_types()
nt->add_input("value_a", BVM_FLOAT3, float3(0.0f, 0.0f, 0.0f));
nt->add_input("value_b", BVM_FLOAT3, float3(0.0f, 0.0f, 0.0f));
nt->add_output("value", BVM_FLOAT3, float3(0.0f, 0.0f, 0.0f));
+
+ nt = NodeGraph::add_node_type("EFFECTOR_CLOSEST_POINT");
+ nt->add_input("object", BVM_INT, 0, true);
+ nt->add_input("vector", BVM_FLOAT3, float3(0.0f, 0.0f, 0.0f));
+ nt->add_output("position", BVM_FLOAT3, float3(0.0f, 0.0f, 0.0f));
+ nt->add_output("normal", BVM_FLOAT3, float3(0.0f, 0.0f, 0.0f));
+ nt->add_output("tangent", BVM_FLOAT3, float3(0.0f, 0.0f, 0.0f));
}
} /* namespace bvm */
diff --git a/source/blender/blenvm/intern/bvm_api.cc b/source/blender/blenvm/intern/bvm_api.cc
index 393cd9d..1fb404e 100644
--- a/source/blender/blenvm/intern/bvm_api.cc
+++ b/source/blender/blenvm/intern/bvm_api.cc
@@ -38,6 +38,7 @@ extern "C" {
#include "BLI_listbase.h"
#include "DNA_node_types.h"
+#include "DNA_object_types.h"
#include "BKE_effect.h"
#include "BKE_node.h"
@@ -102,6 +103,8 @@ struct BVMNodeInstance *BVM_nodegraph_add_node(BVMNodeGraph *graph, const char *
BLI_INLINE bvm::EvalGlobals *_GLOBALS(struct BVMEvalGlobals *globals)
{ return (bvm::EvalGlobals *)globals; }
+BLI_INLINE const bvm::EvalGlobals *_GLOBALS(const struct BVMEvalGlobals *globals)
+{ return (const bvm::EvalGlobals *)globals; }
BLI_INLINE bvm::EvalContext *_CTX(struct BVMEvalContext *ctx)
{ return (bvm::EvalContext *)ctx; }
@@ -111,6 +114,9 @@ struct BVMEvalGlobals *BVM_globals_create(void)
void BVM_globals_free(struct BVMEvalGlobals *globals)
{ delete _GLOBALS(globals); }
+void BVM_globals_add_object(struct BVMEvalGlobals *globals, struct Object *ob)
+{ _GLOBALS(globals)->objects.push_back(ob); }
+
struct BVMEvalContext *BVM_context_create(void)
{ return (BVMEvalContext *)(new bvm::EvalContext()); }
@@ -136,6 +142,8 @@ typedef std::set<SocketPair> SocketSet;
typedef std::map<bSocketPair, SocketSet> InputMap;
typedef std::map<bSocketPair, SocketPair> OutputMap;
+typedef std::map<struct Object *, int> ObjectPtrMap;
+
static void map_input_socket(InputMap &input_map, bNode *bnode, int bindex, bvm::NodeInstance *node, const bvm::string &name)
{
bNodeSocket *binput = (bNodeSocket *)BLI_findlink(&bnode->inputs, bindex);
@@ -204,7 +212,7 @@ static void unary_math_node(bvm::NodeGraph &graph, InputMap &input_map, OutputMa
map_output_socket(output_map, bnode, 0, node, "value");
}
-static void gen_forcefield_nodegraph(bNodeTree *btree, bvm::NodeGraph &graph)
+static void gen_forcefield_nodegraph(Object *effob, bNodeTree *btree, bvm::NodeGraph &graph, const ObjectPtrMap &obmap)
{
{
float zero[3] = {0.0f, 0.0f, 0.0f};
@@ -323,6 +331,19 @@ static void gen_forcefield_nodegraph(bNodeTree *btree, bvm::NodeGraph &graph)
}
}
}
+ else if (type == "ForceClosestPointNode") {
+ bvm::NodeInstance *node = graph.ad
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list