[Bf-blender-cvs] [73de04b] object_nodes: More vector math node modes.

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


Commit: 73de04b202285b843e12a9109282b69e95a25c6f
Author: Lukas Tönne
Date:   Mon Oct 26 12:22:31 2015 +0100
Branches: object_nodes
https://developer.blender.org/rB73de04b202285b843e12a9109282b69e95a25c6f

More vector math node modes.

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

M	release/scripts/startup/bl_operators/object_nodes.py
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 9fc47b4..76a9942 100644
--- a/release/scripts/startup/bl_operators/object_nodes.py
+++ b/release/scripts/startup/bl_operators/object_nodes.py
@@ -223,6 +223,10 @@ class VectorMathNode(ForceNodeBase, ObjectNode):
     _mode_items = [
         ('ADD', 'Add', '', 'NONE', 0),
         ('SUB', 'Subtract', '', 'NONE', 1),
+        ('AVERAGE', 'Average', '', 'NONE', 2),
+        ('DOT', 'Dot Product', '', 'NONE', 3),
+        ('CROSS', 'Cross Product', '', 'NONE', 4),
+        ('NORMALIZE', 'Normalize', '', 'NONE', 5),
     ]
     mode = EnumProperty(name="Mode",
                         items=_mode_items)
diff --git a/source/blender/blenvm/bvm/bvm_eval.cc b/source/blender/blenvm/bvm/bvm_eval.cc
index 9cf982b..4bbdc24 100644
--- a/source/blender/blenvm/bvm/bvm_eval.cc
+++ b/source/blender/blenvm/bvm/bvm_eval.cc
@@ -268,6 +268,51 @@ 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_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));
+}
+
+static void eval_op_average_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(0.5f*(a.x+b.x), 0.5f*(a.y+b.y), 0.5f*(a.z+b.z)));
+}
+
+static void eval_op_dot_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_float(stack, offset_r, a.x * b.x + a.y * b.y + a.z * b.z);
+}
+
+static void eval_op_cross_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.y*b.z - a.z*b.y, a.z*b.x - a.x*b.z, a.x*b.y - a.y*b.x));
+}
+
+static void eval_op_normalize_float3(float *stack, StackIndex offset, StackIndex offset_vec, StackIndex offset_val)
+{
+	float3 v = stack_load_float3(stack, offset);
+	float l = sqrtf(v.x*v.x + v.y*v.y + v.z*v.z);
+	float f = l > 0.0f ? 1.0f/l : 0.0f;
+	float3 vec(v.x * f, v.y * f, v.z * f);
+	stack_store_float3(stack, offset_vec, vec);
+	stack_store_float(stack, offset_val, l);
+}
+
 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)
 {
@@ -303,20 +348,6 @@ static void eval_op_effector_closest_point(const EvalGlobals *globals, float *st
 	}
 }
 
-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 EvalGlobals *globals, const EvalData *data, const Expression *expr, float *stack) const
 {
 	int instr = 0;
@@ -527,6 +558,34 @@ void EvalContext::eval_instructions(const EvalGlobals *globals, const EvalData *
 				eval_op_sub_float3(stack, offset_a, offset_b, offset_r);
 				break;
 			}
+			case OP_AVERAGE_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_average_float3(stack, offset_a, offset_b, offset_r);
+				break;
+			}
+			case OP_DOT_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_dot_float3(stack, offset_a, offset_b, offset_r);
+				break;
+			}
+			case OP_CROSS_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_cross_float3(stack, offset_a, offset_b, offset_r);
+				break;
+			}
+			case OP_NORMALIZE_FLOAT3: {
+				StackIndex offset = expr->read_stack_index(&instr);
+				StackIndex offset_vec = expr->read_stack_index(&instr);
+				StackIndex offset_val = expr->read_stack_index(&instr);
+				eval_op_normalize_float3(stack, offset, offset_vec, offset_val);
+				break;
+			}
 			case OP_EFFECTOR_CLOSEST_POINT: {
 				int object_index = expr->read_int(&instr);
 				StackIndex offset_vector = expr->read_stack_index(&instr);
diff --git a/source/blender/blenvm/bvm/bvm_opcode.h b/source/blender/blenvm/bvm/bvm_opcode.h
index dab3c90..8396f84 100644
--- a/source/blender/blenvm/bvm/bvm_opcode.h
+++ b/source/blender/blenvm/bvm/bvm_opcode.h
@@ -70,6 +70,10 @@ enum OpCode {
 	
 	OP_ADD_FLOAT3,
 	OP_SUB_FLOAT3,
+	OP_AVERAGE_FLOAT3,
+	OP_DOT_FLOAT3,
+	OP_CROSS_FLOAT3,
+	OP_NORMALIZE_FLOAT3,
 	
 	OP_EFFECTOR_CLOSEST_POINT,
 	
diff --git a/source/blender/blenvm/compile/bvm_nodegraph.cc b/source/blender/blenvm/compile/bvm_nodegraph.cc
index 695176e..4a06e63 100644
--- a/source/blender/blenvm/compile/bvm_nodegraph.cc
+++ b/source/blender/blenvm/compile/bvm_nodegraph.cc
@@ -585,6 +585,10 @@ OpCode get_opcode_from_node_type(const string &node)
 	
 	NODETYPE(ADD_FLOAT3);
 	NODETYPE(SUB_FLOAT3);
+	NODETYPE(AVERAGE_FLOAT3);
+	NODETYPE(DOT_FLOAT3);
+	NODETYPE(CROSS_FLOAT3);
+	NODETYPE(NORMALIZE_FLOAT3);
 	
 	NODETYPE(EFFECTOR_CLOSEST_POINT);
 	
@@ -668,6 +672,26 @@ void register_opcode_node_types()
 	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("AVERAGE_FLOAT3");
+	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("DOT_FLOAT3");
+	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_FLOAT, 0.0f);
+	
+	nt = NodeGraph::add_node_type("CROSS_FLOAT3");
+	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("NORMALIZE_FLOAT3");
+	nt->add_input("value", BVM_FLOAT3, float3(0.0f, 0.0f, 0.0f));
+	nt->add_output("vector", BVM_FLOAT3, float3(0.0f, 0.0f, 0.0f));
+	nt->add_output("value", BVM_FLOAT, 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));
diff --git a/source/blender/blenvm/intern/bvm_api.cc b/source/blender/blenvm/intern/bvm_api.cc
index 1fb404e..368c53b 100644
--- a/source/blender/blenvm/intern/bvm_api.cc
+++ b/source/blender/blenvm/intern/bvm_api.cc
@@ -329,6 +329,41 @@ static void gen_forcefield_nodegraph(Object *effob, bNodeTree *btree, bvm::NodeG
 					map_output_socket(output_map, bnode, 0, node, "value");
 					break;
 				}
+				case 2: {
+					bvm::NodeInstance *node = graph.add_node("AVERAGE_FLOAT3", bnode->name);
+					map_input_socket(input_map, bnode, 0, node, "value_a");
+					map_input_socket(input_map, bnode, 1, node, "value_b");
+					map_output_socket(output_map, bnode, 0, node, "value");
+					break;
+				}
+				case 3: {
+					bvm::NodeInstance *node = graph.add_node("DOT_FLOAT3", bnode->name);
+					map_input_socket(input_map, bnode, 0, node, "value_a");
+					map_input_socket(input_map, bnode, 1, node, "value_b");
+					map_output_socket(output_map, bnode, 1, node, "value");
+					break;
+				}
+				case 4: {
+					bvm::NodeInstance *node = graph.add_node("CROSS_FLOAT3", bnode->name);
+					map_input_socket(input_map, bnode, 0, node, "value_a");
+					map_input_socket(input_map, bnode, 1, node, "value_b");
+					map_output_socket(output_map, bnode, 0, node, "value");
+					break;
+				}
+				case 5: {
+					bvm::NodeInstance *node = graph.add_node("NORMALIZE_FLOAT3", bnode->name);
+					bNodeSocket *sock0 = (bNodeSocket *)BLI_findlink(&bnode->inputs, 0);
+					bNodeSocket *sock1 = (bNodeSocket *)BLI_findlink(&bnode->inputs, 1);
+					bool sock0_linked = !nodeSocketIsHidden(sock0) && (sock0->flag & SOCK_IN_USE);
+					bool sock1_linked = !nodeSocketIsHidden(sock1) && (sock1->flag & SOCK_IN_USE);
+					if (sock0_linked || !sock1_linked)
+						map_input_socket(input_map, bnode, 0, node, "value");
+					else
+						map_input_socket(input_map, bnode, 1, node, "value");
+					map_output_socket(output_map, bnode, 0, node, "vector");
+					map_output_socket(output_map, bnode, 1, node, "value");
+					break;
+				}
 			}
 		}
 		else if (type == "ForceClosestPointNode") {




More information about the Bf-blender-cvs mailing list