[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