[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