[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