[Bf-blender-cvs] [7ef782f] object_nodes: Use individual node types for constructing transform matrices.

Lukas Tönne noreply at git.blender.org
Mon Dec 7 17:10:16 CET 2015


Commit: 7ef782f1a76e4781953a364aadb3635b9c2449dc
Author: Lukas Tönne
Date:   Mon Dec 7 17:08:36 2015 +0100
Branches: object_nodes
https://developer.blender.org/rB7ef782f1a76e4781953a364aadb3635b9c2449dc

Use individual node types for constructing transform matrices.

Transforms can be created as translations, rotations (euler and axis/angle)
and scale.

The UI nodes include and automatic multiplication node for convenience.

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

M	release/scripts/nodes/common_nodes.py
M	release/scripts/nodes/geometry_nodes.py
M	source/blender/blenvm/bvm/bvm_eval.cc
M	source/blender/blenvm/bvm/bvm_eval_math.h
M	source/blender/blenvm/bvm/bvm_eval_mesh.h
M	source/blender/blenvm/bvm/bvm_opcode.h
M	source/blender/blenvm/compile/bvm_nodegraph.cc
M	source/blender/blenvm/util/bvm_util_math.h

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

diff --git a/release/scripts/nodes/common_nodes.py b/release/scripts/nodes/common_nodes.py
index c27ef39..0570db1 100644
--- a/release/scripts/nodes/common_nodes.py
+++ b/release/scripts/nodes/common_nodes.py
@@ -254,9 +254,9 @@ class CombineVectorNode(CommonNodeBase, ObjectNode):
 
 
 class TranslationTransformNode(CommonNodeBase, ObjectNode):
-    '''Translation'''
+    '''Create translation from a vector'''
     bl_idname = 'ObjectTranslationTransformNode'
-    bl_label = 'Translation'
+    bl_label = 'Translation Transform'
 
     def init(self, context):
         self.inputs.new('TransformSocket', "")
@@ -264,8 +264,8 @@ class TranslationTransformNode(CommonNodeBase, ObjectNode):
         self.outputs.new('TransformSocket', "")
 
     def compile(self, compiler):
-        node = compiler.add_node("LOCROTSCALE_TO_MATRIX44")
-        compiler.map_input(1, node.inputs["loc"])
+        node = compiler.add_node("LOC_TO_MATRIX44")
+        compiler.map_input(1, node.inputs[0])
         
         node_mul = compiler.add_node("MUL_MATRIX44")
         compiler.map_input(0, node_mul.inputs[0])
@@ -273,6 +273,151 @@ class TranslationTransformNode(CommonNodeBase, ObjectNode):
         compiler.map_output(0, node_mul.outputs[0])
 
 
+class GetTranslationNode(CommonNodeBase, ObjectNode):
+    '''Get translation vector from a transform'''
+    bl_idname = 'ObjectGetTranslationNode'
+    bl_label = 'Get Translation'
+
+    def init(self, context):
+        self.inputs.new('TransformSocket', "")
+        self.outputs.new('NodeSocketVector', "Vector")
+
+    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])
+
+
+_euler_order_items = [
+    ('XYZ', "XYZ", "", 0, 1),
+    ('XZY', "XZY", "", 0, 2),
+    ('YXZ', "YXZ", "", 0, 3),
+    ('YZX', "YZX", "", 0, 4),
+    ('ZXY', "ZXY", "", 0, 5),
+    ('ZYX', "ZYX", "", 0, 6),
+    ]
+_prop_euler_order = EnumProperty(name="Euler Order", items=_euler_order_items, default='XYZ')
+
+class EulerTransformNode(CommonNodeBase, ObjectNode):
+    '''Create rotation from Euler angles'''
+    bl_idname = 'ObjectEulerTransformNode'
+    bl_label = 'Euler Transform'
+
+    euler_order = _prop_euler_order
+    @property
+    def euler_order_value(self):
+        return self.bl_rna.properties['euler_order'].enum_items[self.euler_order].value
+
+    def init(self, context):
+        self.inputs.new('TransformSocket', "")
+        self.inputs.new('NodeSocketVector', "Euler Angles")
+        self.outputs.new('TransformSocket', "")
+
+    def compile(self, compiler):
+        node = compiler.add_node("EULER_TO_MATRIX44")
+        node.inputs[0].set_value(self.euler_order_value)
+        compiler.map_input(1, node.inputs[1])
+        
+        node_mul = compiler.add_node("MUL_MATRIX44")
+        compiler.map_input(0, node_mul.inputs[0])
+        compiler.link(node.outputs[0], node_mul.inputs[1])
+        compiler.map_output(0, node_mul.outputs[0])
+
+
+class GetEulerNode(CommonNodeBase, ObjectNode):
+    '''Get euler angles from a transform'''
+    bl_idname = 'ObjectGetEulerNode'
+    bl_label = 'Get Euler Angles'
+
+    euler_order = _prop_euler_order
+    @property
+    def euler_order_value(self):
+        return self.bl_rna.properties['euler_order'].enum_items[self.euler_order].value
+
+    def init(self, context):
+        self.inputs.new('TransformSocket', "")
+        self.outputs.new('NodeSocketVector', "Euler Angles")
+
+    def compile(self, compiler):
+        node = compiler.add_node("MATRIX44_TO_EULER")
+        node.inputs[0].set_value(self.euler_order_value)
+        compiler.map_input(0, node.inputs[1])
+        compiler.map_output(0, node.outputs[0])
+
+
+class AxisAngleTransformNode(CommonNodeBase, ObjectNode):
+    '''Create rotation from axis and angle'''
+    bl_idname = 'ObjectAxisAngleTransformNode'
+    bl_label = 'Axis/Angle Transform'
+
+    def init(self, context):
+        self.inputs.new('TransformSocket', "")
+        self.inputs.new('NodeSocketVector', "Axis")
+        self.inputs.new('NodeSocketFloat', "Angle")
+        self.outputs.new('TransformSocket', "")
+
+    def compile(self, compiler):
+        node = compiler.add_node("AXISANGLE_TO_MATRIX44")
+        compiler.map_input(1, node.inputs[0])
+        compiler.map_input(2, node.inputs[1])
+        
+        node_mul = compiler.add_node("MUL_MATRIX44")
+        compiler.map_input(0, node_mul.inputs[0])
+        compiler.link(node.outputs[0], node_mul.inputs[1])
+        compiler.map_output(0, node_mul.outputs[0])
+
+
+class GetAxisAngleNode(CommonNodeBase, ObjectNode):
+    '''Get axis and angle from a transform'''
+    bl_idname = 'ObjectGetAxisAngleNode'
+    bl_label = 'Get Axis/Angle'
+
+    def init(self, context):
+        self.inputs.new('TransformSocket', "")
+        self.outputs.new('NodeSocketVector', "Axis")
+        self.outputs.new('NodeSocketFloat', "Angle")
+
+    def compile(self, compiler):
+        node = compiler.add_node("MATRIX44_TO_AXISANGLE")
+        compiler.map_input(0, node.inputs[0])
+        compiler.map_output(0, node.outputs[0])
+        compiler.map_output(1, node.outputs[1])
+
+
+class ScaleTransformNode(CommonNodeBase, ObjectNode):
+    '''Create transform from a scaling vector'''
+    bl_idname = 'ObjectScaleTransformNode'
+    bl_label = 'Scale Transform'
+
+    def init(self, context):
+        self.inputs.new('TransformSocket', "")
+        self.inputs.new('NodeSocketVector', "Scale")
+        self.outputs.new('TransformSocket', "")
+
+    def compile(self, compiler):
+        node = compiler.add_node("SCALE_TO_MATRIX44")
+        compiler.map_input(1, node.inputs[0])
+        
+        node_mul = compiler.add_node("MUL_MATRIX44")
+        compiler.map_input(0, node_mul.inputs[0])
+        compiler.link(node.outputs[0], node_mul.inputs[1])
+        compiler.map_output(0, node_mul.outputs[0])
+
+
+class GetScaleNode(CommonNodeBase, ObjectNode):
+    '''Get scale from a transform'''
+    bl_idname = 'ObjectGetScaleNode'
+    bl_label = 'Get Scale'
+
+    def init(self, context):
+        self.inputs.new('TransformSocket', "")
+        self.outputs.new('NodeSocketVector', "Scale")
+
+    def compile(self, compiler):
+        node = compiler.add_node("MATRIX44_TO_SCALE")
+        compiler.map_input(0, node.inputs[0])
+        compiler.map_output(0, node.outputs[0])
+
 ###############################################################################
 
 def register():
diff --git a/release/scripts/nodes/geometry_nodes.py b/release/scripts/nodes/geometry_nodes.py
index c24b870..b7291bf 100644
--- a/release/scripts/nodes/geometry_nodes.py
+++ b/release/scripts/nodes/geometry_nodes.py
@@ -227,6 +227,13 @@ def register():
             NodeItem("ObjectMathNode"),
             NodeItem("ObjectVectorMathNode"),
             NodeItem("ObjectTranslationTransformNode"),
+            NodeItem("ObjectEulerTransformNode"),
+            NodeItem("ObjectAxisAngleTransformNode"),
+            NodeItem("ObjectScaleTransformNode"),
+            NodeItem("ObjectGetTranslationNode"),
+            NodeItem("ObjectGetEulerNode"),
+            NodeItem("ObjectGetAxisAngleNode"),
+            NodeItem("ObjectGetScaleNode"),
             ]),
         GeometryNodeCategory("GEO_GROUP", "Group", items=[
             NodeItem(gnode.bl_idname),
diff --git a/source/blender/blenvm/bvm/bvm_eval.cc b/source/blender/blenvm/bvm/bvm_eval.cc
index bd96ebf..b01c566 100644
--- a/source/blender/blenvm/bvm/bvm_eval.cc
+++ b/source/blender/blenvm/bvm/bvm_eval.cc
@@ -336,22 +336,6 @@ void EvalContext::eval_instructions(const EvalGlobals *globals, const EvalData *
 				eval_op_get_elem_float4(stack, index, offset_from, offset_to);
 				break;
 			}
-			case OP_MATRIX44_TO_LOCROTSCALE: {
-				StackIndex offset_from = fn->read_stack_index(&instr);
-				StackIndex offset_loc = fn->read_stack_index(&instr);
-				StackIndex offset_rot = fn->read_stack_index(&instr);
-				StackIndex offset_scale = fn->read_stack_index(&instr);
-				eval_op_matrix44_to_locrotscale(stack, offset_from, offset_loc, offset_rot, offset_scale);
-				break;
-			}
-			case OP_LOCROTSCALE_TO_MATRIX44: {
-				StackIndex offset_loc = fn->read_stack_index(&instr);
-				StackIndex offset_rot = fn->read_stack_index(&instr);
-				StackIndex offset_scale = fn->read_stack_index(&instr);
-				StackIndex offset_to = fn->read_stack_index(&instr);
-				eval_op_locrotscale_to_matrix44(stack, offset_loc, offset_rot, offset_scale, offset_to);
-				break;
-			}
 			case OP_INIT_MESH_PTR: {
 				StackIndex offset = fn->read_stack_index(&instr);
 				int use_count = fn->read_int(&instr);
@@ -653,6 +637,58 @@ void EvalContext::eval_instructions(const EvalGlobals *globals, const EvalData *
 				eval_op_mul_matrix44_float4(stack, offset_a, offset_b, offset_r);
 				break;
 			}
+			case OP_MATRIX44_TO_LOC: {
+				StackIndex offset_mat = fn->read_stack_index(&instr);
+				StackIndex offset_loc = fn->read_stack_index(&instr);
+				eval_op_matrix44_to_loc(stack, offset_mat, offset_loc);
+				break;
+			}
+			case OP_MATRIX44_TO_EULER: {
+				int order = fn->read_int(&instr);
+				StackIndex offset_mat = fn->read_stack_index(&instr);
+				StackIndex offset_euler = fn->read_stack_index(&instr);
+				eval_op_matrix44_to_euler(stack, order, offset_mat, offset_euler);
+				break;
+			}
+			case OP_MATRIX44_TO_AXISANGLE: {
+				StackIndex offset_mat = fn->read_stack_index(&instr);
+				StackIndex offset_axis = fn->read_stack_index(&instr);
+				StackIndex offset_angle = fn->read_stack_index(&instr);
+				eval_op_matrix44_to_axisangle(stack, offset_mat, offset_axis, offset_angle);
+				break;
+			}
+			case OP_MATRIX44_TO_SCALE: {
+				StackIndex offset_mat = fn->read_stack_index(&instr);
+				StackIndex offset_scale = fn->read_stack_index(&instr);
+				eval_op_matrix44_to_scale(stack, offset_mat, offset_scale);
+				break;
+			}
+			case OP_LOC_TO_MATRIX44: {
+				StackIndex offset_loc = fn->read_stack_index(&instr);
+				StackIndex offset_mat = fn->read_stack_index(&instr);
+				eval_op_loc_to_matrix44(stack, offset_loc, offset_mat);
+				break;
+			}
+			case OP_EULER_TO_MATRIX44: {
+				int orde

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list