[Bf-blender-cvs] [17d6b2f] object_nodes: Some basic math operations for 4x4 matrices.

Lukas Tönne noreply at git.blender.org
Mon Dec 7 12:28:00 CET 2015


Commit: 17d6b2f15835ee7667c0084f13dd3d7381851750
Author: Lukas Tönne
Date:   Mon Dec 7 12:16:11 2015 +0100
Branches: object_nodes
https://developer.blender.org/rB17d6b2f15835ee7667c0084f13dd3d7381851750

Some basic math operations for 4x4 matrices.

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

M	source/blender/blenvm/bvm/bvm_eval.cc
M	source/blender/blenvm/bvm/bvm_eval_math.h
M	source/blender/blenvm/bvm/bvm_opcode.h
M	source/blender/blenvm/compile/bvm_nodegraph.cc

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

diff --git a/source/blender/blenvm/bvm/bvm_eval.cc b/source/blender/blenvm/bvm/bvm_eval.cc
index 0611d1d..bd96ebf 100644
--- a/source/blender/blenvm/bvm/bvm_eval.cc
+++ b/source/blender/blenvm/bvm/bvm_eval.cc
@@ -574,6 +574,85 @@ void EvalContext::eval_instructions(const EvalGlobals *globals, const EvalData *
 				eval_op_normalize_float3(stack, offset, offset_vec, offset_val);
 				break;
 			}
+			case OP_ADD_MATRIX44: {
+				StackIndex offset_a = fn->read_stack_index(&instr);
+				StackIndex offset_b = fn->read_stack_index(&instr);
+				StackIndex offset_r = fn->read_stack_index(&instr);
+				eval_op_add_matrix44(stack, offset_a, offset_b, offset_r);
+				break;
+			}
+			case OP_SUB_MATRIX44: {
+				StackIndex offset_a = fn->read_stack_index(&instr);
+				StackIndex offset_b = fn->read_stack_index(&instr);
+				StackIndex offset_r = fn->read_stack_index(&instr);
+				eval_op_sub_matrix44(stack, offset_a, offset_b, offset_r);
+				break;
+			}
+			case OP_MUL_MATRIX44: {
+				StackIndex offset_a = fn->read_stack_index(&instr);
+				StackIndex offset_b = fn->read_stack_index(&instr);
+				StackIndex offset_r = fn->read_stack_index(&instr);
+				eval_op_mul_matrix44(stack, offset_a, offset_b, offset_r);
+				break;
+			}
+			case OP_MUL_MATRIX44_FLOAT: {
+				StackIndex offset_a = fn->read_stack_index(&instr);
+				StackIndex offset_b = fn->read_stack_index(&instr);
+				StackIndex offset_r = fn->read_stack_index(&instr);
+				eval_op_mul_matrix44_float(stack, offset_a, offset_b, offset_r);
+				break;
+			}
+			case OP_DIV_MATRIX44_FLOAT: {
+				StackIndex offset_a = fn->read_stack_index(&instr);
+				StackIndex offset_b = fn->read_stack_index(&instr);
+				StackIndex offset_r = fn->read_stack_index(&instr);
+				eval_op_div_matrix44_float(stack, offset_a, offset_b, offset_r);
+				break;
+			}
+			case OP_NEGATE_MATRIX44: {
+				StackIndex offset = fn->read_stack_index(&instr);
+				StackIndex offset_r = fn->read_stack_index(&instr);
+				eval_op_negate_matrix44(stack, offset, offset_r);
+				break;
+			}
+			case OP_TRANSPOSE_MATRIX44: {
+				StackIndex offset = fn->read_stack_index(&instr);
+				StackIndex offset_r = fn->read_stack_index(&instr);
+				eval_op_transpose_matrix44(stack, offset, offset_r);
+				break;
+			}
+			case OP_INVERT_MATRIX44: {
+				StackIndex offset = fn->read_stack_index(&instr);
+				StackIndex offset_r = fn->read_stack_index(&instr);
+				eval_op_invert_matrix44(stack, offset, offset_r);
+				break;
+			}
+			case OP_ADJOINT_MATRIX44: {
+				StackIndex offset = fn->read_stack_index(&instr);
+				StackIndex offset_r = fn->read_stack_index(&instr);
+				eval_op_adjoint_matrix44(stack, offset, offset_r);
+				break;
+			}
+			case OP_DETERMINANT_MATRIX44: {
+				StackIndex offset = fn->read_stack_index(&instr);
+				StackIndex offset_r = fn->read_stack_index(&instr);
+				eval_op_determinant_matrix44(stack, offset, offset_r);
+				break;
+			}
+			case OP_MUL_MATRIX44_FLOAT3: {
+				StackIndex offset_a = fn->read_stack_index(&instr);
+				StackIndex offset_b = fn->read_stack_index(&instr);
+				StackIndex offset_r = fn->read_stack_index(&instr);
+				eval_op_mul_matrix44_float3(stack, offset_a, offset_b, offset_r);
+				break;
+			}
+			case OP_MUL_MATRIX44_FLOAT4: {
+				StackIndex offset_a = fn->read_stack_index(&instr);
+				StackIndex offset_b = fn->read_stack_index(&instr);
+				StackIndex offset_r = fn->read_stack_index(&instr);
+				eval_op_mul_matrix44_float4(stack, offset_a, offset_b, offset_r);
+				break;
+			}
 			
 			case OP_MIX_RGB: {
 				int mode = fn->read_int(&instr);
diff --git a/source/blender/blenvm/bvm/bvm_eval_math.h b/source/blender/blenvm/bvm/bvm_eval_math.h
index 3ee51cc..d7325d4 100644
--- a/source/blender/blenvm/bvm/bvm_eval_math.h
+++ b/source/blender/blenvm/bvm/bvm_eval_math.h
@@ -268,6 +268,111 @@ static void eval_op_normalize_float3(float *stack, StackIndex offset, StackIndex
 	stack_store_float(stack, offset_val, l);
 }
 
+static void eval_op_add_matrix44(float *stack, StackIndex offset_a, StackIndex offset_b, StackIndex offset_r)
+{
+	matrix44 a = stack_load_matrix44(stack, offset_a);
+	matrix44 b = stack_load_matrix44(stack, offset_b);
+	matrix44 r;
+	add_m4_m4m4(r.data, a.data, b.data);
+	stack_store_matrix44(stack, offset_r, r);
+}
+
+static void eval_op_sub_matrix44(float *stack, StackIndex offset_a, StackIndex offset_b, StackIndex offset_r)
+{
+	matrix44 a = stack_load_matrix44(stack, offset_a);
+	matrix44 b = stack_load_matrix44(stack, offset_b);
+	matrix44 r;
+	sub_m4_m4m4(r.data, a.data, b.data);
+	stack_store_matrix44(stack, offset_r, r);
+}
+
+static void eval_op_mul_matrix44(float *stack, StackIndex offset_a, StackIndex offset_b, StackIndex offset_r)
+{
+	matrix44 a = stack_load_matrix44(stack, offset_a);
+	matrix44 b = stack_load_matrix44(stack, offset_b);
+	matrix44 r;
+	mul_m4_m4m4(r.data, a.data, b.data);
+	stack_store_matrix44(stack, offset_r, r);
+}
+
+static void eval_op_mul_matrix44_float(float *stack, StackIndex offset_a, StackIndex offset_b, StackIndex offset_r)
+{
+	matrix44 a = stack_load_matrix44(stack, offset_a);
+	float b = stack_load_float(stack, offset_b);
+	matrix44 r;
+	copy_m4_m4(r.data, a.data);
+	mul_m4_fl(r.data, b);
+	stack_store_matrix44(stack, offset_r, r);
+}
+
+static void eval_op_div_matrix44_float(float *stack, StackIndex offset_a, StackIndex offset_b, StackIndex offset_r)
+{
+	matrix44 a = stack_load_matrix44(stack, offset_a);
+	float b = stack_load_float(stack, offset_b);
+	matrix44 r;
+	copy_m4_m4(r.data, a.data);
+	mul_m4_fl(r.data, div_safe(1.0, b));
+	stack_store_matrix44(stack, offset_r, r);
+}
+
+static void eval_op_negate_matrix44(float *stack, StackIndex offset, StackIndex offset_r)
+{
+	matrix44 m = stack_load_matrix44(stack, offset);
+	matrix44 r;
+	copy_m4_m4(r.data, m.data);
+	negate_m4(r.data);
+	stack_store_matrix44(stack, offset_r, r);
+}
+
+static void eval_op_transpose_matrix44(float *stack, StackIndex offset, StackIndex offset_r)
+{
+	matrix44 m = stack_load_matrix44(stack, offset);
+	matrix44 r;
+	transpose_m4_m4(r.data, m.data);
+	stack_store_matrix44(stack, offset_r, r);
+}
+
+static void eval_op_invert_matrix44(float *stack, StackIndex offset, StackIndex offset_r)
+{
+	matrix44 m = stack_load_matrix44(stack, offset);
+	matrix44 r;
+	invert_m4_m4_safe(r.data, m.data);
+	stack_store_matrix44(stack, offset_r, r);
+}
+
+static void eval_op_adjoint_matrix44(float *stack, StackIndex offset, StackIndex offset_r)
+{
+	matrix44 m = stack_load_matrix44(stack, offset);
+	matrix44 r;
+	adjoint_m4_m4(r.data, m.data);
+	stack_store_matrix44(stack, offset_r, r);
+}
+
+static void eval_op_determinant_matrix44(float *stack, StackIndex offset, StackIndex offset_r)
+{
+	matrix44 m = stack_load_matrix44(stack, offset);
+	float d = determinant_m4(m.data);
+	stack_store_float(stack, offset_r, d);
+}
+
+static void eval_op_mul_matrix44_float3(float *stack, StackIndex offset_a, StackIndex offset_b, StackIndex offset_r)
+{
+	matrix44 a = stack_load_matrix44(stack, offset_a);
+	float3 b = stack_load_float3(stack, offset_b);
+	float3 r;
+	mul_v3_m4v3(r.data(), a.data, b.data());
+	stack_store_float3(stack, offset_r, r);
+}
+
+static void eval_op_mul_matrix44_float4(float *stack, StackIndex offset_a, StackIndex offset_b, StackIndex offset_r)
+{
+	matrix44 a = stack_load_matrix44(stack, offset_a);
+	float4 b = stack_load_float4(stack, offset_b);
+	float4 r;
+	mul_v4_m4v4(r.data(), a.data, b.data());
+	stack_store_float4(stack, offset_r, r);
+}
+
 } /* namespace bvm */
 
 #endif /* __BVM_EVAL_MATH_H__ */
diff --git a/source/blender/blenvm/bvm/bvm_opcode.h b/source/blender/blenvm/bvm/bvm_opcode.h
index 6d76762..5bfa404 100644
--- a/source/blender/blenvm/bvm/bvm_opcode.h
+++ b/source/blender/blenvm/bvm/bvm_opcode.h
@@ -90,6 +90,20 @@ enum OpCode {
 	OP_CROSS_FLOAT3,
 	OP_NORMALIZE_FLOAT3,
 	
+	OP_ADD_MATRIX44,
+	OP_SUB_MATRIX44,
+	OP_MUL_MATRIX44,
+	OP_MUL_MATRIX44_FLOAT,
+	OP_DIV_MATRIX44_FLOAT,
+	OP_NEGATE_MATRIX44,
+	OP_TRANSPOSE_MATRIX44,
+	OP_INVERT_MATRIX44,
+	OP_ADJOINT_MATRIX44,
+	OP_DETERMINANT_MATRIX44,
+	
+	OP_MUL_MATRIX44_FLOAT3,
+	OP_MUL_MATRIX44_FLOAT4,
+	
 	OP_MIX_RGB,
 	
 	OP_ITERATION,
diff --git a/source/blender/blenvm/compile/bvm_nodegraph.cc b/source/blender/blenvm/compile/bvm_nodegraph.cc
index cdbf0b0..8d6f9a5 100644
--- a/source/blender/blenvm/compile/bvm_nodegraph.cc
+++ b/source/blender/blenvm/compile/bvm_nodegraph.cc
@@ -1078,6 +1078,20 @@ OpCode get_opcode_from_node_type(const string &node)
 	NODETYPE(CROSS_FLOAT3);
 	NODETYPE(NORMALIZE_FLOAT3);
 	
+	NODETYPE(ADD_MATRIX44);
+	NODETYPE(SUB_MATRIX44);
+	NODETYPE(MUL_MATRIX44);
+	NODETYPE(MUL_MATRIX44_FLOAT);
+	NODETYPE(DIV_MATRIX44_FLOAT);
+	NODETYPE(NEGATE_MATRIX44);
+	NODETYPE(TRANSPOSE_MATRIX44);
+	NODETYPE(INVERT_MATRIX44);
+	NODETYPE(ADJOINT_MATRIX44);
+	NODETYPE(DETERMINANT_MATRIX44);
+	
+	NODETYPE(MUL_MATRIX44_FLOAT3);
+	NODETYPE(MUL_MATRIX44_FLOAT4);
+	
 	NODETYPE(MIX_RGB);
 	
 	NODETYPE(ITERATION);
@@ -1362,6 +1376,61 @@ static void register_opcode_node_types()
 	nt->add_input("count", BVM_INT, 1);
 	nt->add_input("transform", BVM_MATRIX44, matrix44::identity(), VALUE_FUNCTION);
 	nt->add_output("mesh_out", BVM_MESH, __empty_mesh__);
+	
+	nt = NodeGraph::add_function_node_type("ADD_MATRIX44");
+	nt->add_input("value_a", BVM_MATRIX44, matrix44::identity());
+	nt->add_input("value_b", BVM_MATRIX44, matrix44::identity());
+	nt->add_output("value", BVM_MATRIX44, matrix44::identity());
+	
+	nt = NodeGraph::add_function_node_type("SUB_MATRIX44");
+	nt->add_input("value_a", BVM_MATRIX44, matrix44::identity());
+	nt->add_input("value_b", BVM_MATRIX44, matrix44::identity());
+	nt->add_output("value", BVM_MATRIX44, matrix44::identity());
+	
+	nt = NodeGraph::add_function_node_type("MUL_MATRIX44");
+	nt->add_input("value_a", BVM_MATRIX44, matrix44::identity());
+	nt->add_input("value_b", BVM_MATRIX44, matrix44::identity());
+	nt->add_output("value", BVM_MATRIX44, matrix44::identity());
+	
+	nt = NodeGraph::add_function_node_type("MUL_MATRIX44_FLOAT");
+	nt->add_input("value_a", BVM_MATRIX44, matrix44::identity());
+	nt->add_input("value_b", BVM_FLOAT, 0.0f);
+	nt->add_output("value", BVM_MATRIX44, matrix44::identity());
+	
+	nt = NodeGraph::add_function_node_type("DIV_MATRIX4

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list