armory/blender/arm/logicnode/transform/LN_get_object_rotation.py
niacdoial bd67667a6e Added node replacement routines for previous commits
(and fixed a couple bugs along the way)
2021-08-12 20:58:35 +02:00

91 lines
3.8 KiB
Python

from arm.logicnode.arm_nodes import *
class GetRotationNode(ArmLogicTreeNode):
"""Returns the current rotation of the given object."""
bl_idname = 'LNGetRotationNode'
bl_label = 'Get Object Rotation'
arm_section = 'rotation'
arm_version = 2
def init(self, context):
super(GetRotationNode, self).init(context)
self.add_input('ArmNodeSocketObject', 'Object')
self.add_output('ArmNodeSocketRotation', 'Rotation')
def draw_buttons(self, context, layout):
layout.prop(self, 'property0')
property0: EnumProperty(
items = [('Local', 'Local', 'Local'),
('Global', 'Global', 'Global')],
name='', default='Local')
def get_replacement_node(self, node_tree: bpy.types.NodeTree):
if self.arm_version not in (0, 1):
raise LookupError()
# transition from version 1 to version 2: make rotations their own sockets
# this transition is a mess, I know.
newself = self.id_data.nodes.new('LNGetRotationNode')
newself.property0 = 'Local'
newnodes = [newself]
if len(self.outputs[0].links)>0:
# euler (radians) needed
converter = self.id_data.nodes.new('LNSeparateRotationNode')
converter.property0 = "EulerAngles"
converter.property1 = "Rad"
converter.property2 = "XZY"
newnodes.append(converter)
self.id_data.links.new(newself.outputs[0], converter.inputs[0])
for link in self.outputs[0].links:
self.id_data.links.new(converter.outputs[0], link.to_socket)
if len(self.outputs[4].links)>0 or len(self.outputs[5].links)>0:
# quaternion needed
converter = self.id_data.nodes.new('LNSeparateRotationNode')
converter.property0 = "Quaternion"
newnodes.append(converter)
self.id_data.links.new(newself.outputs[0], converter.inputs[0])
for link in self.outputs[4].links:
self.id_data.links.new(converter.outputs[0], link.to_socket)
for link in self.outputs[5].links:
self.id_data.links.new(converter.outputs[1], link.to_socket)
if len(self.outputs[1].links)>0 or len(self.outputs[2].links)>0 or len(self.outputs[3].links)>0:
# axis/angle needed
converter = self.id_data.nodes.new('LNSeparateRotationNode')
converter.property0 = "AxisAngle"
converter.property1 = "Rad"
newnodes.append(converter)
self.id_data.links.new(newself.outputs[0], converter.inputs[0])
for link in self.outputs[1].links:
self.id_data.links.new(converter.outputs[0], link.to_socket)
if len(self.outputs[3].links)==0 and len(self.outputs[2].links)==0:
pass
elif len(self.outputs[3].links)==0:
for link in self.outputs[2].links:
self.id_data.links.new(converter.outputs[1], link.to_socket)
elif len(self.outputs[2].links)==0:
converter.property1 = 'Deg'
for link in self.outputs[3].links:
self.id_data.links.new(converter.outputs[1], link.to_socket)
else:
for link in self.outputs[2].links:
self.id_data.links.new(converter.outputs[1], link.to_socket)
converter = self.id_data.nodes.new('LNSeparateRotationNode')
converter.property0 = "AxisAngle"
converter.property1 = "Deg"
converter.property2 = "XYZ" # bogus
newnodes.append(converter)
self.id_data.links.new(newself.outputs[0], converter.inputs[0])
for link in self.outputs[3].links:
self.id_data.links.new(converter.outputs[1], link.to_socket)
return newnodes