[Bf-blender-cvs] [3561b4c] object_nodes: Use an object pointer from the evaluation data, rather than storing just indices.

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


Commit: 3561b4ca364c76a12ea3979170ef7a71cff21e2c
Author: Lukas Tönne
Date:   Mon Nov 2 14:23:44 2015 +0100
Branches: object_nodes
https://developer.blender.org/rB3561b4ca364c76a12ea3979170ef7a71cff21e2c

Use an object pointer from the evaluation data, rather than storing just indices.

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

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_eval.h
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 59d55ff..3392d73 100644
--- a/release/scripts/startup/bl_operators/object_nodes.py
+++ b/release/scripts/startup/bl_operators/object_nodes.py
@@ -112,6 +112,9 @@ class NodeCompiler:
             for (to_node, to_socket) in to_set:
                 self.graph.add_link(from_node, from_socket, to_node, to_socket)
 
+    def add_link_internal(self, from_node, from_name, to_node, to_name):
+        self.graph.add_link(from_node, from_name, to_node, to_name)
+
     def set_output(self, name, node, socket):
         self.graph.set_output(name, node, socket)
 
@@ -409,7 +412,13 @@ class ForceClosestPointNode(ForceNodeBase, ObjectNode):
         self.outputs.new('NodeSocketVector', "Tangent")
 
     def compile(self, compiler):
-        pass
+        obnode = compiler.add_node("EFFECTOR_OBJECT", self.name+"O")
+        node = compiler.add_node("EFFECTOR_CLOSEST_POINT", self.name+"N")
+        compiler.add_link_internal(obnode, "object", node, "object")
+        compiler.map_input(0, node, "vector")
+        compiler.map_output(0, node, "position")
+        compiler.map_output(1, node, "normal")
+        compiler.map_output(2, node, "tangent")
 
 ###############################################################################
 
diff --git a/source/blender/blenkernel/intern/effect.c b/source/blender/blenkernel/intern/effect.c
index e360d13..e515af6 100644
--- a/source/blender/blenkernel/intern/effect.c
+++ b/source/blender/blenkernel/intern/effect.c
@@ -212,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(effctx->eval_globals, ob, ff_ntree);
+					eff->expression = BVM_gen_forcefield_expression(effctx->eval_globals, ff_ntree);
 				}
 				
 				break;
@@ -1025,7 +1025,7 @@ void pdDoEffectors(struct EffectorContext *effctx, ListBase *colliders, Effector
 
 		for (; p<tot; p+=step) {
 			if (eff->expression) {
-				BVM_eval_forcefield(effctx->eval_globals, eval_context, eff->expression, point, force, impulse);
+				BVM_eval_forcefield(effctx->eval_globals, eval_context, eff->expression, eff->ob, point, force, impulse);
 			}
 			else if (get_effector_data(eff, &efd, point, 0)) {
 				efd.falloff= effector_falloff(eff, &efd, point, weights);
diff --git a/source/blender/blenvm/BVM_api.h b/source/blender/blenvm/BVM_api.h
index 6c55eec..a91a4ae 100644
--- a/source/blender/blenvm/BVM_api.h
+++ b/source/blender/blenvm/BVM_api.h
@@ -104,10 +104,10 @@ struct bNodeTree;
 struct Object;
 struct EffectedPoint;
 
-struct BVMExpression *BVM_gen_forcefield_expression(const struct BVMEvalGlobals *globals, struct Object *effob, struct bNodeTree *btree);
+struct BVMExpression *BVM_gen_forcefield_expression(const struct BVMEvalGlobals *globals, struct bNodeTree *btree);
 
 void BVM_eval_forcefield(struct BVMEvalGlobals *globals, struct BVMEvalContext *context, struct BVMExpression *expr,
-                         const struct EffectedPoint *point, float force[3], float impulse[3]);
+                         struct Object *effob, const struct EffectedPoint *point, float force[3], float impulse[3]);
 
 /* ------------------------------------------------------------------------- */
 
diff --git a/source/blender/blenvm/bvm/bvm_eval.cc b/source/blender/blenvm/bvm/bvm_eval.cc
index 72db2e1..af44688 100644
--- a/source/blender/blenvm/bvm/bvm_eval.cc
+++ b/source/blender/blenvm/bvm/bvm_eval.cc
@@ -345,6 +345,11 @@ static void eval_op_tex_coord(const EvalData *data, float *stack, StackIndex off
 	stack_store_float3(stack, offset, data->texture.co);
 }
 
+static void eval_op_effector_object(const EvalData *data, float *stack, StackIndex offset)
+{
+	stack_store_pointer(stack, offset, data->effector.object);
+}
+
 static void eval_op_effector_transform(const EvalGlobals *globals, float *stack, int object_index, StackIndex offset_tfm)
 {
 	Object *ob = globals->objects[object_index];
@@ -352,10 +357,13 @@ static void eval_op_effector_transform(const EvalGlobals *globals, float *stack,
 	stack_store_matrix44(stack, offset_tfm, m);
 }
 
-static void eval_op_effector_closest_point(const EvalGlobals *globals, float *stack, int object_index, StackIndex offset_vector,
+static void eval_op_effector_closest_point(float *stack, StackIndex offset_object, StackIndex offset_vector,
                                            StackIndex offset_position, StackIndex offset_normal, StackIndex offset_tangent)
 {
-	Object *ob = globals->objects[object_index];
+	PointerRNA ptr = stack_load_pointer(stack, offset_object);
+	if (!ptr.data)
+		return;
+	Object *ob = (Object *)ptr.data;
 	DerivedMesh *dm = object_get_derived_final(ob, false);
 	
 	float world[4][4];
@@ -713,6 +721,11 @@ void EvalContext::eval_instructions(const EvalGlobals *globals, const EvalData *
 				break;
 			}
 			
+			case OP_EFFECTOR_OBJECT: {
+				StackIndex offset = expr->read_stack_index(&instr);
+				eval_op_effector_object(data, stack, offset);
+				break;
+			}
 			case OP_EFFECTOR_TRANSFORM: {
 				int object_index = expr->read_int(&instr);
 				StackIndex offset_tfm = expr->read_stack_index(&instr);
@@ -720,12 +733,12 @@ void EvalContext::eval_instructions(const EvalGlobals *globals, const EvalData *
 				break;
 			}
 			case OP_EFFECTOR_CLOSEST_POINT: {
-				int object_index = expr->read_int(&instr);
+				StackIndex offset_object = expr->read_stack_index(&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,
+				eval_op_effector_closest_point(stack, offset_object, offset_vector,
 				                               offset_position, offset_normal, offset_tangent);
 				break;
 			}
diff --git a/source/blender/blenvm/bvm/bvm_eval.h b/source/blender/blenvm/bvm/bvm_eval.h
index d049a58..395cc9b 100644
--- a/source/blender/blenvm/bvm/bvm_eval.h
+++ b/source/blender/blenvm/bvm/bvm_eval.h
@@ -78,6 +78,10 @@ struct EffectorEvalData {
 	    velocity(0.0f, 0.0f, 0.0f)
 	{}
 	
+	/* context */
+	PointerRNA object;
+	
+	/* point */
 	float3 position;
 	float3 velocity;
 };
diff --git a/source/blender/blenvm/bvm/bvm_opcode.h b/source/blender/blenvm/bvm/bvm_opcode.h
index 53250af..3a200d3 100644
--- a/source/blender/blenvm/bvm/bvm_opcode.h
+++ b/source/blender/blenvm/bvm/bvm_opcode.h
@@ -96,6 +96,7 @@ enum OpCode {
 	OP_TEX_PROC_STUCCI,
 	OP_TEX_PROC_DISTNOISE,
 	
+	OP_EFFECTOR_OBJECT,
 	OP_EFFECTOR_TRANSFORM,
 	OP_EFFECTOR_CLOSEST_POINT,
 	
diff --git a/source/blender/blenvm/compile/bvm_nodegraph.cc b/source/blender/blenvm/compile/bvm_nodegraph.cc
index 5e60f23..3554878 100644
--- a/source/blender/blenvm/compile/bvm_nodegraph.cc
+++ b/source/blender/blenvm/compile/bvm_nodegraph.cc
@@ -597,6 +597,7 @@ OpCode get_opcode_from_node_type(const string &node)
 	NODETYPE(TEX_COORD);
 	NODETYPE(TEX_PROC_VORONOI);
 	
+	NODETYPE(EFFECTOR_OBJECT);
 	NODETYPE(EFFECTOR_TRANSFORM);
 	NODETYPE(EFFECTOR_CLOSEST_POINT);
 	
@@ -735,12 +736,15 @@ void register_opcode_node_types()
 	nt->add_output("color", BVM_FLOAT4, float4(0.0f, 0.0f, 0.0f, 1.0f));
 	nt->add_output("normal", BVM_FLOAT3, float3(0.0f, 0.0f, 0.0f));
 	
+	nt = NodeGraph::add_node_type("EFFECTOR_OBJECT");
+	nt->add_output("object", BVM_POINTER, PointerRNA_NULL);
+	
 	nt = NodeGraph::add_node_type("EFFECTOR_TRANSFORM");
 	nt->add_input("object", BVM_INT, 0, true);
 	nt->add_output("transform", BVM_MATRIX44, matrix44::identity());
 	
 	nt = NodeGraph::add_node_type("EFFECTOR_CLOSEST_POINT");
-	nt->add_input("object", BVM_INT, 0, true);
+	nt->add_input("object", BVM_POINTER, PointerRNA_NULL);
 	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));
diff --git a/source/blender/blenvm/intern/bvm_api.cc b/source/blender/blenvm/intern/bvm_api.cc
index 310093b..110ab64 100644
--- a/source/blender/blenvm/intern/bvm_api.cc
+++ b/source/blender/blenvm/intern/bvm_api.cc
@@ -559,7 +559,7 @@ struct ForceFieldNodeParser : public bNodeParser {
 	}
 };
 
-struct BVMExpression *BVM_gen_forcefield_expression(const struct BVMEvalGlobals *globals, Object *effob, bNodeTree *btree)
+struct BVMExpression *BVM_gen_forcefield_expression(const struct BVMEvalGlobals *globals, bNodeTree *btree)
 {
 	using namespace bvm;
 	
@@ -582,11 +582,12 @@ struct BVMExpression *BVM_gen_forcefield_expression(const struct BVMEvalGlobals
 }
 
 void BVM_eval_forcefield(struct BVMEvalGlobals *globals, struct BVMEvalContext *ctx, struct BVMExpression *expr,
-                         const EffectedPoint *point, float force[3], float impulse[3])
+                         struct Object *effob, const EffectedPoint *point, float force[3], float impulse[3])
 {
 	using namespace bvm;
 	
 	EvalData data;
+	RNA_id_pointer_create((ID *)effob, &data.effector.object);
 	data.effector.position = float3(point->loc[0], point->loc[1], point->loc[2]);
 	data.effector.velocity = float3(point->vel[0], point->vel[1], point->vel[2]);
 	void *results[] = { force, impulse };




More information about the Bf-blender-cvs mailing list