[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