[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