[Bf-blender-cvs] [6a890c5] object_nodes: Some simple math nodes to test node connections.
Lukas Tönne
noreply at git.blender.org
Tue Nov 24 09:43:06 CET 2015
Commit: 6a890c568ed8b4de79e6a167f4bc09a70494f9e6
Author: Lukas Tönne
Date: Mon Oct 19 16:18:05 2015 +0200
Branches: object_nodes
https://developer.blender.org/rB6a890c568ed8b4de79e6a167f4bc09a70494f9e6
Some simple math nodes to test node connections.
===================================================================
M release/scripts/startup/bl_operators/object_nodes.py
M source/blender/blenvm/intern/bvm_api.cc
M source/blender/blenvm/intern/bvm_eval.cc
M source/blender/blenvm/intern/bvm_nodegraph.cc
M source/blender/blenvm/intern/bvm_opcode.h
===================================================================
diff --git a/release/scripts/startup/bl_operators/object_nodes.py b/release/scripts/startup/bl_operators/object_nodes.py
index e5dd897..fae06aa 100644
--- a/release/scripts/startup/bl_operators/object_nodes.py
+++ b/release/scripts/startup/bl_operators/object_nodes.py
@@ -45,6 +45,10 @@ node_categories = [
ForceFieldNodeCategory("FORCE_OUTPUT", "Output", items=[
NodeItem("ForceOutputNode"),
]),
+ ForceFieldNodeCategory("MATH", "Math", items=[
+ NodeItem("ObjectMathNode"),
+ NodeItem("ObjectVectorMathNode"),
+ ]),
]
###############################################################################
@@ -114,6 +118,49 @@ class ForceOutputNode(ForceNodeBase, ObjectNode):
self.inputs.new('NodeSocketVector', "Force")
self.inputs.new('NodeSocketVector', "Impulse")
+
+class MathNode(ForceNodeBase, ObjectNode):
+ '''Math '''
+ bl_idname = 'ObjectMathNode'
+ bl_label = 'Math'
+
+ _mode_items = [
+ ('ADD', 'Add', '', 'NONE', 0),
+ ('SUB', 'Subtract', '', 'NONE', 1),
+ ]
+ mode = EnumProperty(name="Mode",
+ items=_mode_items)
+
+ def draw_buttons(self, context, layout):
+ layout.prop(self, "mode")
+
+ def init(self, context):
+ self.inputs.new('NodeSocketFloat', "Value")
+ self.inputs.new('NodeSocketFloat', "Value")
+ self.outputs.new('NodeSocketFloat', "Value")
+
+
+class VectorMathNode(ForceNodeBase, ObjectNode):
+ '''Vector Math '''
+ bl_idname = 'ObjectVectorMathNode'
+ bl_label = 'Vector Math'
+
+ _mode_items = [
+ ('ADD', 'Add', '', 'NONE', 0),
+ ('SUB', 'Subtract', '', 'NONE', 1),
+ ]
+ mode = EnumProperty(name="Mode",
+ items=_mode_items)
+
+ def draw_buttons(self, context, layout):
+ layout.prop(self, "mode")
+
+ def init(self, context):
+ self.inputs.new('NodeSocketVector', "Vector")
+ self.inputs.new('NodeSocketVector', "Vector")
+ self.outputs.new('NodeSocketVector', "Vector")
+ self.outputs.new('NodeSocketFloat', "Value")
+
###############################################################################
class ObjectNodesNew(Operator):
diff --git a/source/blender/blenvm/intern/bvm_api.cc b/source/blender/blenvm/intern/bvm_api.cc
index e43eebf..f437a8e 100644
--- a/source/blender/blenvm/intern/bvm_api.cc
+++ b/source/blender/blenvm/intern/bvm_api.cc
@@ -40,6 +40,8 @@ extern "C" {
#include "BKE_node.h"
#include "BVM_api.h"
+
+#include "RNA_access.h"
}
#include "bvm_codegen.h"
@@ -112,6 +114,36 @@ void BVM_eval_forcefield(struct BVMEvalContext *ctx, struct BVMExpression *expr,
/* ------------------------------------------------------------------------- */
+static void set_input_value(bNode *bnode, int bindex, bvm::NodeInstance *node, const bvm::string &name)
+{
+ bNodeSocket *binput = (bNodeSocket *)BLI_findlink(&bnode->inputs, bindex);
+
+ switch (binput->type) {
+ case SOCK_FLOAT: {
+ bNodeSocketValueFloat *bvalue = (bNodeSocketValueFloat *)binput->default_value;
+ node->set_input_value(name, bvalue->value);
+ break;
+ }
+ case SOCK_VECTOR: {
+ bNodeSocketValueVector *bvalue = (bNodeSocketValueVector *)binput->default_value;
+ node->set_input_value(name, bvm::float3(bvalue->value[0], bvalue->value[1], bvalue->value[2]));
+ break;
+ }
+ }
+}
+
+static void set_all_input_values(bNode *bnode, bvm::NodeInstance *node)
+{
+ bNodeSocket *bsock;
+ int i;
+
+ for (bsock = (bNodeSocket *)bnode->inputs.first, i = 0; bsock; bsock = bsock->next, ++i) {
+ const bvm::NodeSocket *input = node->type->find_input(i);
+
+ set_input_value(bnode, i, node, input->name);
+ }
+}
+
static void gen_forcefield_nodegraph(bNodeTree *btree, bvm::NodeGraph &graph)
{
{
@@ -122,6 +154,9 @@ static void gen_forcefield_nodegraph(bNodeTree *btree, bvm::NodeGraph &graph)
#if 1
for (bNode *bnode = (bNode*)btree->nodes.first; bnode; bnode = bnode->next) {
+ PointerRNA ptr;
+ RNA_pointer_create((ID *)btree, &RNA_Node, bnode, &ptr);
+
BLI_assert(bnode->typeinfo != NULL);
if (!nodeIsRegistered(bnode))
continue;
@@ -133,24 +168,35 @@ static void gen_forcefield_nodegraph(bNodeTree *btree, bvm::NodeGraph &graph)
if (bvm::string(type) == "ForceOutputNode") {
{
bvm::NodeInstance *node = graph.add_node("PASS_FLOAT3", "RET_FORCE_" + bvm::string(bnode->name));
-
- bNodeSocket *binput = (bNodeSocket *)BLI_findlink(&bnode->inputs, 0);
- bNodeSocketValueVector *bvalue = (bNodeSocketValueVector *)binput->default_value;
- node->set_input_value("value", bvm::float3(bvalue->value[0], bvalue->value[1], bvalue->value[2]));
+ set_input_value(bnode, 0, node, "value");
graph.set_output_link("force", node, "value");
}
{
bvm::NodeInstance *node = graph.add_node("PASS_FLOAT3", "RET_IMPULSE_" + bvm::string(bnode->name));
-
- bNodeSocket *binput = (bNodeSocket *)BLI_findlink(&bnode->inputs, 1);
- bNodeSocketValueVector *bvalue = (bNodeSocketValueVector *)binput->default_value;
- node->set_input_value("value", bvm::float3(bvalue->value[0], bvalue->value[1], bvalue->value[2]));
+ set_input_value(bnode, 1, node, "value");
graph.set_output_link("impulse", node, "value");
}
}
+ else if (bvm::string(type) == "ObjectMathNode") {
+ int mode = RNA_enum_get(&ptr, "mode");
+ switch (mode) {
+ case 0: {
+ bvm::NodeInstance *node = graph.add_node("ADD_FLOAT", bnode->name);
+ set_input_value(bnode, 0, node, "value_a");
+ set_input_value(bnode, 1, node, "value_b");
+ break;
+ }
+ case 1: {
+ bvm::NodeInstance *node = graph.add_node("SUB_FLOAT", bnode->name);
+ set_input_value(bnode, 0, node, "value_a");
+ set_input_value(bnode, 1, node, "value_b");
+ break;
+ }
+ }
+ }
#endif
}
diff --git a/source/blender/blenvm/intern/bvm_eval.cc b/source/blender/blenvm/intern/bvm_eval.cc
index b5c7446..023601b 100644
--- a/source/blender/blenvm/intern/bvm_eval.cc
+++ b/source/blender/blenvm/intern/bvm_eval.cc
@@ -86,6 +86,34 @@ static void eval_op_pass_float3(float *stack, StackIndex offset_from, StackIndex
stack_store_float3(stack, offset_to, f);
}
+static void eval_op_add_float(float *stack, StackIndex offset_a, StackIndex offset_b, StackIndex offset_r)
+{
+ float a = stack_load_float(stack, offset_a);
+ float b = stack_load_float(stack, offset_b);
+ stack_store_float(stack, offset_r, a + b);
+}
+
+static void eval_op_sub_float(float *stack, StackIndex offset_a, StackIndex offset_b, StackIndex offset_r)
+{
+ float a = stack_load_float(stack, offset_a);
+ float b = stack_load_float(stack, offset_b);
+ stack_store_float(stack, offset_r, a - b);
+}
+
+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);
+ float3 b = stack_load_float3(stack, offset_b);
+ stack_store_float3(stack, offset_r, float3(a.x + b.x, a.y + b.y, a.z + b.z));
+}
+
+static void eval_op_sub_float3(float *stack, StackIndex offset_a, StackIndex offset_b, StackIndex offset_r)
+{
+ float3 a = stack_load_float3(stack, offset_a);
+ float3 b = stack_load_float3(stack, offset_b);
+ stack_store_float3(stack, offset_r, float3(a.x - b.x, a.y - b.y, a.z - b.z));
+}
+
void EvalContext::eval_instructions(const Expression &expr, float *stack) const
{
int instr = 0;
@@ -120,6 +148,34 @@ void EvalContext::eval_instructions(const Expression &expr, float *stack) const
eval_op_pass_float3(stack, offset_from, offset_to);
break;
}
+ case OP_ADD_FLOAT: {
+ StackIndex offset_a = expr.read_stack_index(&instr);
+ StackIndex offset_b = expr.read_stack_index(&instr);
+ StackIndex offset_r = expr.read_stack_index(&instr);
+ eval_op_add_float(stack, offset_a, offset_b, offset_r);
+ break;
+ }
+ case OP_SUB_FLOAT: {
+ StackIndex offset_a = expr.read_stack_index(&instr);
+ StackIndex offset_b = expr.read_stack_index(&instr);
+ StackIndex offset_r = expr.read_stack_index(&instr);
+ eval_op_sub_float(stack, offset_a, offset_b, offset_r);
+ break;
+ }
+ case OP_ADD_FLOAT3: {
+ StackIndex offset_a = expr.read_stack_index(&instr);
+ StackIndex offset_b = expr.read_stack_index(&instr);
+ StackIndex offset_r = expr.read_stack_index(&instr);
+ eval_op_add_float3(stack, offset_a, offset_b, offset_r);
+ break;
+ }
+ case OP_SUB_FLOAT3: {
+ StackIndex offset_a = expr.read_stack_index(&instr);
+ StackIndex offset_b = expr.read_stack_index(&instr);
+ StackIndex offset_r = expr.read_stack_index(&instr);
+ eval_op_sub_float3(stack, offset_a, offset_b, offset_r);
+ break;
+ }
case OP_END:
return;
default:
diff --git a/source/blender/blenvm/intern/bvm_nodegraph.cc b/source/blender/blenvm/intern/bvm_nodegraph.cc
index 06a44ca..9165584 100644
--- a/source/blender/blenvm/intern/bvm_nodegraph.cc
+++ b/source/blender/blenvm/intern/bvm_nodegraph.cc
@@ -535,28 +535,20 @@ void NodeGraph::dump(std::ostream &s)
/* ------------------------------------------------------------------------- */
-string get_node_type_from_opcode(OpCode op)
-{
- switch (op) {
- case OP_NOOP:;
- case OP_END:;
- case OP_VALUE_FLOAT:;
- case OP_VALUE_FLOAT3:
- return "";
- case OP_PASS_FLOAT: return "PASS_FLOAT";
- case OP_PASS_FLOAT3: return "PASS_FLOAT3";
- default:
- assert(!"Invalid OpCode");
- return "";
- }
-}
-
OpCode get_opcode_from_node_type(const string &node)
{
if (node == "PASS_FLOAT")
return OP_PASS_FLOAT;
else if (node == "PASS_FLOAT3")
return OP_PASS_FLOAT3;
+ else if (node == "ADD_FLOAT")
+ return OP_ADD_FLOAT;
+ else if (node == "SUB_FLOAT")
+ return OP_SUB_FLOAT;
+ else if (node == "ADD_FLOAT3")
+ return OP_ADD_FLOAT3;
+ else if (node == "SUB_FLOAT3")
+ return OP_SUB_FLOAT3;
else {
assert(!"Invalid node type");
return OP_NOOP;
@@ -574,6 +566,26 @@ void register_opcode_node_types()
nt = NodeGraph::add_node_type("PASS_FLOAT3");
nt->add_input("value", 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("ADD_FLOAT");
+ nt->add_inp
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list