[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