[Bf-blender-cvs] [7e50fc0] object_nodes: Added some more opcodes for scalar multiplication and division.

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


Commit: 7e50fc041d18d44089ad757f50d7e55c068819b2
Author: Lukas Tönne
Date:   Wed Nov 4 17:39:20 2015 +0100
Branches: object_nodes
https://developer.blender.org/rB7e50fc041d18d44089ad757f50d7e55c068819b2

Added some more opcodes for scalar multiplication and division.

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

M	source/blender/blenvm/CMakeLists.txt
M	source/blender/blenvm/bvm/bvm_eval.cc
M	source/blender/blenvm/bvm/bvm_opcode.h
M	source/blender/blenvm/compile/bvm_nodegraph.cc
A	source/blender/blenvm/util/bvm_util_math.h

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

diff --git a/source/blender/blenvm/CMakeLists.txt b/source/blender/blenvm/CMakeLists.txt
index c1aba2b..388abee 100644
--- a/source/blender/blenvm/CMakeLists.txt
+++ b/source/blender/blenvm/CMakeLists.txt
@@ -53,6 +53,7 @@ set(SRC
 
 	util/bvm_util_hash.h
 	util/bvm_util_map.h
+	util/bvm_util_math.h
 	util/bvm_util_string.h
 	util/bvm_util_thread.h
 	util/bvm_util_typedesc.h
diff --git a/source/blender/blenvm/bvm/bvm_eval.cc b/source/blender/blenvm/bvm/bvm_eval.cc
index f8a98cb..757afe0 100644
--- a/source/blender/blenvm/bvm/bvm_eval.cc
+++ b/source/blender/blenvm/bvm/bvm_eval.cc
@@ -44,6 +44,8 @@ extern "C" {
 #include "bvm_eval_common.h"
 #include "bvm_eval_texture.h"
 
+#include "bvm_util_math.h"
+
 namespace bvm {
 
 EvalContext::EvalContext()
@@ -201,7 +203,7 @@ static void eval_op_div_float(float *stack, StackIndex offset_a, StackIndex offs
 {
 	float a = stack_load_float(stack, offset_a);
 	float b = stack_load_float(stack, offset_b);
-	stack_store_float(stack, offset_r, b != 0.0f ? a / b : 0.0f);
+	stack_store_float(stack, offset_r, div_safe(a, b));
 }
 
 static void eval_op_sine(float *stack, StackIndex offset, StackIndex offset_r)
@@ -321,6 +323,34 @@ static void eval_op_sub_float3(float *stack, StackIndex offset_a, StackIndex off
 	stack_store_float3(stack, offset_r, float3(a.x - b.x, a.y - b.y, a.z - b.z));
 }
 
+static void eval_op_mul_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_div_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(div_safe(a.x, b.x), div_safe(a.y, b.y), div_safe(a.z, b.z)));
+}
+
+static void eval_op_mul_float3_float(float *stack, StackIndex offset_a, StackIndex offset_b, StackIndex offset_r)
+{
+	float3 a = stack_load_float3(stack, offset_a);
+	float b = stack_load_float(stack, offset_b);
+	stack_store_float3(stack, offset_r, float3(a.x * b, a.y * b, a.z * b));
+}
+
+static void eval_op_div_float3_float(float *stack, StackIndex offset_a, StackIndex offset_b, StackIndex offset_r)
+{
+	float3 a = stack_load_float3(stack, offset_a);
+	float b = stack_load_float(stack, offset_b);
+	stack_store_float3(stack, offset_r, float3(div_safe(a.x, b), div_safe(a.y, b), div_safe(a.z, b)));
+}
+
 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);
@@ -689,6 +719,34 @@ void EvalContext::eval_instructions(const EvalGlobals *globals, const EvalData *
 				eval_op_sub_float3(stack, offset_a, offset_b, offset_r);
 				break;
 			}
+			case OP_MUL_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_mul_float3(stack, offset_a, offset_b, offset_r);
+				break;
+			}
+			case OP_DIV_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_div_float3(stack, offset_a, offset_b, offset_r);
+				break;
+			}
+			case OP_MUL_FLOAT3_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_mul_float3_float(stack, offset_a, offset_b, offset_r);
+				break;
+			}
+			case OP_DIV_FLOAT3_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_div_float3_float(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);
diff --git a/source/blender/blenvm/bvm/bvm_opcode.h b/source/blender/blenvm/bvm/bvm_opcode.h
index a4bacb6..f531774 100644
--- a/source/blender/blenvm/bvm/bvm_opcode.h
+++ b/source/blender/blenvm/bvm/bvm_opcode.h
@@ -81,6 +81,10 @@ enum OpCode {
 	
 	OP_ADD_FLOAT3,
 	OP_SUB_FLOAT3,
+	OP_MUL_FLOAT3,
+	OP_DIV_FLOAT3,
+	OP_MUL_FLOAT3_FLOAT,
+	OP_DIV_FLOAT3_FLOAT,
 	OP_AVERAGE_FLOAT3,
 	OP_DOT_FLOAT3,
 	OP_CROSS_FLOAT3,
diff --git a/source/blender/blenvm/compile/bvm_nodegraph.cc b/source/blender/blenvm/compile/bvm_nodegraph.cc
index 6981c2f..151817f 100644
--- a/source/blender/blenvm/compile/bvm_nodegraph.cc
+++ b/source/blender/blenvm/compile/bvm_nodegraph.cc
@@ -748,6 +748,10 @@ OpCode get_opcode_from_node_type(const string &node)
 	
 	NODETYPE(ADD_FLOAT3);
 	NODETYPE(SUB_FLOAT3);
+	NODETYPE(MUL_FLOAT3);
+	NODETYPE(DIV_FLOAT3);
+	NODETYPE(MUL_FLOAT3_FLOAT);
+	NODETYPE(DIV_FLOAT3_FLOAT);
 	NODETYPE(AVERAGE_FLOAT3);
 	NODETYPE(DOT_FLOAT3);
 	NODETYPE(CROSS_FLOAT3);
@@ -876,6 +880,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("MUL_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("DIV_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("MUL_FLOAT3_FLOAT");
+	nt->add_input("value_a", BVM_FLOAT3, float3(0.0f, 0.0f, 0.0f));
+	nt->add_input("value_b", BVM_FLOAT, 0.0f);
+	nt->add_output("value", BVM_FLOAT3, float3(0.0f, 0.0f, 0.0f));
+	
+	nt = NodeGraph::add_node_type("DIV_FLOAT3_FLOAT");
+	nt->add_input("value_a", BVM_FLOAT3, float3(0.0f, 0.0f, 0.0f));
+	nt->add_input("value_b", BVM_FLOAT, 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));
diff --git a/source/blender/blenvm/util/bvm_util_math.h b/source/blender/blenvm/util/bvm_util_math.h
new file mode 100644
index 0000000..eab2e7c
--- /dev/null
+++ b/source/blender/blenvm/util/bvm_util_math.h
@@ -0,0 +1,47 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Lukas Toenne
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#ifndef __BVM_UTIL_MATH_H__
+#define __BVM_UTIL_MATH_H__
+
+/** \file bvm_util_math.h
+ *  \ingroup bvm
+ */
+
+namespace bvm {
+
+inline static float div_safe(float a, float b)
+{
+	if (b != 0.0f)
+		return a / b;
+	else
+		return 0.0f;
+}
+
+} /* namespace bvm */
+
+#endif /* __BVM_UTIL_MATH_H__ */




More information about the Bf-blender-cvs mailing list