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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to