[Bf-blender-cvs] [be12e7a] object_nodes strand_nodes: Added a number of addition matrix manipulation nodes.

Lukas Tönne noreply at git.blender.org
Sun Jul 24 13:16:36 CEST 2016


Commit: be12e7a42e43d532b88387f1091e4b23fa551306
Author: Lukas Tönne
Date:   Sun Jul 24 13:09:35 2016 +0200
Branches: object_nodes strand_nodes
https://developer.blender.org/rBbe12e7a42e43d532b88387f1091e4b23fa551306

Added a number of addition matrix manipulation nodes.

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

M	release/scripts/nodes/common_nodes.py
M	release/scripts/nodes/geometry_nodes.py
M	release/scripts/nodes/texture_nodes.py
M	source/blender/blenvm/bvm/bvm_eval.cc
M	source/blender/blenvm/bvm/bvm_eval_math.h
M	source/blender/blenvm/compile/node_graph.cc
M	source/blender/blenvm/modules/mod_base.h
M	source/blender/blenvm/modules/mod_math.h
M	source/blender/blenvm/util/util_opcode.h

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

diff --git a/release/scripts/nodes/common_nodes.py b/release/scripts/nodes/common_nodes.py
index 9504b64..1907e1b 100644
--- a/release/scripts/nodes/common_nodes.py
+++ b/release/scripts/nodes/common_nodes.py
@@ -445,6 +445,63 @@ class CombineVectorNode(CommonNodeBase, ObjectNode):
         compiler.map_input(2, node.inputs[2])
         compiler.map_output(0, node.outputs[0])
 
+
+class SeparateMatrixNode(CommonNodeBase, ObjectNode):
+    '''Separate matrix into translational, rotational and scaling parts'''
+    bl_idname = 'ObjectSeparateMatrixNode'
+    bl_label = 'Separate Matrix'
+
+    def init(self, context):
+        self.inputs.new('TransformSocket', "Matrix")
+        self.outputs.new('NodeSocketVector', "Translation")
+        self.outputs.new('TransformSocket', "Rotation")
+        self.outputs.new('NodeSocketVector', "Scale")
+
+    def compile(self, compiler):
+        node = compiler.add_node("MATRIX44_TO_LOC")
+        compiler.map_input(0, node.inputs[0])
+        compiler.map_output(0, node.outputs[0])
+        
+        node = compiler.add_node("MATRIX44_TO_ROT")
+        compiler.map_input(0, node.inputs[0])
+        compiler.map_output(1, node.outputs[0])
+        
+        node = compiler.add_node("MATRIX44_TO_SCALE")
+        compiler.map_input(0, node.inputs[0])
+        compiler.map_output(2, node.outputs[0])
+
+
+class CombineMatrixNode(CommonNodeBase, ObjectNode):
+    '''Combine matrix from translation, rotation and scale'''
+    bl_idname = 'ObjectCombineMatrixNode'
+    bl_label = 'Combine Matrix'
+
+    def init(self, context):
+        self.inputs.new('NodeSocketVector', "Translation")
+        self.inputs.new('TransformSocket', "Rotation")
+        self.inputs.new('NodeSocketVector', "Scale")
+        self.outputs.new('TransformSocket', "Matrix")
+
+    def compile(self, compiler):
+        node_loc = compiler.add_node("LOC_TO_MATRIX44")
+        node_scale = compiler.add_node("SCALE_TO_MATRIX44")
+        node_mul1 = compiler.add_node("MUL_MATRIX44")
+        node_mul2 = compiler.add_node("MUL_MATRIX44")
+        
+        compiler.map_input(0, node_loc.inputs[0])
+        compiler.map_input(2, node_scale.inputs[0])
+        
+        # R * S
+        compiler.map_input(1, node_mul1.inputs[0])
+        compiler.link(node_scale.outputs[0], node_mul1.inputs[1])
+        
+        # T * (R * S)
+        compiler.link(node_loc.outputs[0], node_mul2.inputs[0])
+        compiler.link(node_mul1.outputs[0], node_mul2.inputs[1])
+
+        compiler.map_output(0, node_mul2.outputs[0])
+
+
 class TranslationTransformNode(CommonNodeBase, ObjectNode):
     '''Create translation from a vector'''
     bl_idname = 'ObjectTranslationTransformNode'
@@ -613,6 +670,79 @@ class GetScaleNode(CommonNodeBase, ObjectNode):
         compiler.map_output(0, node.outputs[0])
 
 
+class TransformVectorNode(CommonNodeBase, ObjectNode):
+    '''Transform a vector'''
+    bl_idname = 'ObjectTransformVectorNode'
+    bl_label = 'Transform Vector'
+
+    def init(self, context):
+        self.inputs.new('TransformSocket', "Transform")
+        self.inputs.new('NodeSocketVector', "Vector")
+        self.outputs.new('NodeSocketVector', "Vector")
+
+    def compile(self, compiler):
+        node = compiler.add_node("MUL_MATRIX44_FLOAT3")
+        compiler.map_input(0, node.inputs[0])
+        compiler.map_input(1, node.inputs[1])
+        compiler.map_output(0, node.outputs[0])
+
+
+class MatrixMathNode(CommonNodeBase, ObjectNode):
+    '''Matrix Math'''
+    bl_idname = 'ObjectMatrixMathNode'
+    bl_label = 'Matrix Math'
+
+    _mode_items = [
+        ('ADD_MATRIX44', 'Add', '', 'NONE', 0),
+        ('SUB_MATRIX44', 'Subtract', '', 'NONE', 1),
+        ('MUL_MATRIX44', 'Multiply', '', 'NONE', 2),
+        ('MUL_MATRIX44_FLOAT', 'Scalar Multiply', '', 'NONE', 3),
+        ('DIV_MATRIX44_FLOAT', 'Scalar Divide', '', 'NONE', 4),
+        ('NEGATE_MATRIX44', 'Negate', '', 'NONE', 5),
+        ('TRANSPOSE_MATRIX44', 'Transpose', '', 'NONE', 6),
+        ('INVERT_MATRIX44', 'Invert', '', 'NONE', 7),
+        ('ADJOINT_MATRIX44', 'Adjoint', 'Adjoint (adjugate) matrix', 'NONE', 8),
+        ('DETERMINANT_MATRIX44', 'Determinant', '', 'NONE', 9),
+    ]
+    mode = EnumProperty(name="Mode",
+                        items=_mode_items)
+
+    def draw_buttons(self, context, layout):
+        layout.prop(self, "mode")
+
+    def init(self, context):
+        self.inputs.new('TransformSocket', "Matrix")
+        self.inputs.new('TransformSocket', "Matrix")
+        self.inputs.new('NodeSocketFloat', "Scalar")
+        self.outputs.new('TransformSocket', "Matrix")
+
+    def compile(self, compiler):
+        node = compiler.add_node(self.mode, self.name+"N")
+
+        is_binary = self.mode in {'ADD_MATRIX44', 'SUB_MATRIX44', 'MUL_MATRIX44'}
+        is_scalar_binary = self.mode in {'MUL_MATRIX44_FLOAT', 'DIV_MATRIX44_FLOAT'}
+
+        if is_binary:
+            # binary node
+            compiler.map_input(0, node.inputs[0])
+            compiler.map_input(1, node.inputs[1])
+        else:
+            # only one matrix input used
+            socket_a = self.inputs[0]
+            socket_b = self.inputs[1]
+            linked_a = (not socket_a.hide) and socket_a.is_linked
+            linked_b = (not socket_a.hide) and socket_a.is_linked
+            if linked_a or (not linked_b):
+                compiler.map_input(0, node.inputs[0])
+            else:
+                compiler.map_input(1, node.inputs[0])
+
+        if is_scalar_binary:
+            compiler.map_input(2, node.inputs[1])
+
+        compiler.map_output(0, node.outputs[0])
+
+
 class RandomNode(CommonNodeBase, ObjectNode):
     '''Produce random values'''
     bl_idname = 'ObjectRandomNode'
diff --git a/release/scripts/nodes/geometry_nodes.py b/release/scripts/nodes/geometry_nodes.py
index aa93f1b..f5c32d4 100644
--- a/release/scripts/nodes/geometry_nodes.py
+++ b/release/scripts/nodes/geometry_nodes.py
@@ -452,11 +452,15 @@ def register():
         GeometryNodeCategory("GEO_CONVERTER", "Converter", items=[
             NodeItem("ObjectSeparateVectorNode"),
             NodeItem("ObjectCombineVectorNode"),
+            NodeItem("ObjectSeparateMatrixNode"),
+            NodeItem("ObjectCombineMatrixNode"),
             NodeItem("GeometryMeshCombineNode"),
             ]),
         GeometryNodeCategory("GEO_MATH", "Math", items=[
             NodeItem("ObjectMathNode"),
             NodeItem("ObjectVectorMathNode"),
+            NodeItem("ObjectMatrixMathNode"),
+            NodeItem("ObjectTransformVectorNode"),
             NodeItem("ObjectTranslationTransformNode"),
             NodeItem("ObjectEulerTransformNode"),
             NodeItem("ObjectAxisAngleTransformNode"),
diff --git a/release/scripts/nodes/texture_nodes.py b/release/scripts/nodes/texture_nodes.py
index dc83d3a..339297b 100644
--- a/release/scripts/nodes/texture_nodes.py
+++ b/release/scripts/nodes/texture_nodes.py
@@ -199,11 +199,15 @@ def register():
         TextureNodeCategory("TEX_CONVERTER", "Converter", items=[
             NodeItem("ObjectSeparateVectorNode"),
             NodeItem("ObjectCombineVectorNode"),
+            NodeItem("ObjectSeparateMatrixNode"),
+            NodeItem("ObjectCombineMatrixNode"),
             NodeItem("TextureGetDerivativeNode"),
             ]),
         TextureNodeCategory("TEX_MATH", "Math", items=[
             NodeItem("ObjectMathNode"),
             NodeItem("ObjectVectorMathNode"),
+            NodeItem("ObjectMatrixMathNode"),
+            NodeItem("ObjectTransformVectorNode"),
             NodeItem("ObjectTranslationTransformNode"),
             NodeItem("ObjectEulerTransformNode"),
             NodeItem("ObjectAxisAngleTransformNode"),
diff --git a/source/blender/blenvm/bvm/bvm_eval.cc b/source/blender/blenvm/bvm/bvm_eval.cc
index 1d68235..731f86c 100644
--- a/source/blender/blenvm/bvm/bvm_eval.cc
+++ b/source/blender/blenvm/bvm/bvm_eval.cc
@@ -169,6 +169,33 @@ static void eval_op_set_float4(EvalStack *stack, StackIndex offset_x, StackIndex
 	stack_store_float4(stack, offset_to, float4(x, y, z, w));
 }
 
+static void eval_op_set_matrix44(EvalStack *stack,
+                                 StackIndex offset_v00, StackIndex offset_v01, StackIndex offset_v02, StackIndex offset_v03,
+                                 StackIndex offset_v10, StackIndex offset_v11, StackIndex offset_v12, StackIndex offset_v13,
+                                 StackIndex offset_v20, StackIndex offset_v21, StackIndex offset_v22, StackIndex offset_v23,
+                                 StackIndex offset_v30, StackIndex offset_v31, StackIndex offset_v32, StackIndex offset_v33,
+                                 StackIndex offset_to)
+{
+	matrix44 m;
+	m.data[0][0] = stack_load_float(stack, offset_v00);
+	m.data[0][1] = stack_load_float(stack, offset_v01);
+	m.data[0][2] = stack_load_float(stack, offset_v02);
+	m.data[0][3] = stack_load_float(stack, offset_v03);
+	m.data[1][0] = stack_load_float(stack, offset_v10);
+	m.data[1][1] = stack_load_float(stack, offset_v11);
+	m.data[1][2] = stack_load_float(stack, offset_v12);
+	m.data[1][3] = stack_load_float(stack, offset_v13);
+	m.data[2][0] = stack_load_float(stack, offset_v20);
+	m.data[2][1] = stack_load_float(stack, offset_v21);
+	m.data[2][2] = stack_load_float(stack, offset_v22);
+	m.data[2][3] = stack_load_float(stack, offset_v23);
+	m.data[3][0] = stack_load_float(stack, offset_v30);
+	m.data[3][1] = stack_load_float(stack, offset_v31);
+	m.data[3][2] = stack_load_float(stack, offset_v32);
+	m.data[3][3] = stack_load_float(stack, offset_v33);
+	stack_store_matrix44(stack, offset_to, m);
+}
+
 static void eval_op_get_elem_float3(EvalStack *stack, int index, StackIndex offset_from, StackIndex offset_to)
 {
 	assert(index >= 0 && index < 3);
@@ -183,6 +210,14 @@ static void eval_op_get_elem_float4(EvalStack *stack, int index, StackIndex offs
 	stack_store_float(stack, offset_to, f[index]);
 }
 
+static void eval_op_get_elem_matrix44(EvalStack *stack, int column, int row, StackIndex offset_from, StackIndex offset_to)
+{
+	assert(column >= 0 && column < 4);
+	assert(row >= 0 && row < 4);
+	matrix44 m = stack_load_matrix44(stack, offset_from);
+	stack_store_fl

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list