[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