diff --git a/Sources/armory/logicnode/TweenFloatNode.hx b/Sources/armory/logicnode/TweenFloatNode.hx new file mode 100644 index 00000000..c28fd331 --- /dev/null +++ b/Sources/armory/logicnode/TweenFloatNode.hx @@ -0,0 +1,114 @@ +package armory.logicnode; + +import iron.system.Tween; + +class TweenFloatNode extends LogicNode { + + public var property0:String; + + public var anim: TAnim; + public var fromValue:Float = 0.0; + public var toValue:Float = 1.0; + public var duration:Float = 1.0; + + public function new(tree:LogicTree) { + super(tree); + } + + override function run(from:Int) { + + if(from == 0){ + + if(anim != null){ + Tween.stop(anim); + } + + fromValue = inputs[2].get(); + toValue = inputs[3].get(); + duration = inputs[4].get(); + var type:Dynamic = Linear; + + switch (property0) { + case "Linear": + type = Linear; + case "SineIn": + type = SineIn; + case "SineOut": + type = SineOut; + case "SineInOut": + type = SineInOut; + case "QuadIn": + type = QuadIn; + case "QuadOut": + type = QuadOut; + case "QuadInOut": + type = QuadInOut; + case "CubicIn": + type = CubicIn; + case "CubicOut": + type = CubicOut; + case "CubicInOut": + type = CubicInOut; + case "QuartIn": + type = QuartIn; + case "QuartOut": + type = QuartOut; + case "QuartInOut": + type = QuartInOut; + case "QuintIn": + type = QuintIn; + case "QuintOut": + type = QuintOut; + case "QuintInOut": + type = QuintInOut; + case "ExpoIn": + type = ExpoIn; + case "ExpoOut": + type = ExpoOut; + case "ExpoInOut": + type = ExpoInOut; + case "CircIn": + type = CircIn; + case "CircOut": + type = CircOut; + case "CircInOut": + type = CircInOut; + case "BackIn": + type = BackIn; + case "BackOut": + type = BackOut; + case "BackInOut": + type = BackInOut; + } + + anim = Tween.to({ + target: this, + props: { fromValue: toValue }, + duration: duration, + ease: type, + tick: update, + done: done + }); + } + else{ + if(anim != null){ + Tween.stop(anim); + } + } + + runOutput(1); + } + + override function get(from: Int): Dynamic { + if(from == 0) return fromValue; + return null; + } + + function update() { + runOutput(2); + } + + function done() { + runOutput(3); + } +} \ No newline at end of file diff --git a/blender/arm/logicnode/math/LN_tween_float.py b/blender/arm/logicnode/math/LN_tween_float.py new file mode 100644 index 00000000..14f3f1f0 --- /dev/null +++ b/blender/arm/logicnode/math/LN_tween_float.py @@ -0,0 +1,54 @@ +from arm.logicnode.arm_nodes import * + +class TweenFloatNode( ArmLogicTreeNode): + '''Tween a float value''' + bl_idname = 'LNTweenFloatNode' + bl_label = 'Tween Float' + arm_version = 1 + + property0: HaxeEnumProperty( + 'property0', + items = [('Linear', 'Linear', 'Linear'), + ('SineIn', 'SineIn', 'SineIn'), + ('SineOut', 'SineOut', 'SineOut'), + ('SineInOut', 'SineInOut', 'SineInOut'), + ('QuadIn', 'QuadIn', 'QuadIn'), + ('QuadOut', 'QuadOut', 'QuadOut'), + ('QuadInOut', 'QuadInOut', 'QuadInOut'), + ('CubicIn', 'CubicIn', 'CubicIn'), + ('CubicOut', 'CubicOut', 'CubicOut'), + ('CubicInOut', 'CubicInOut', 'CubicInOut'), + ('QuartIn', 'QuartIn', 'QuartIn'), + ('QuartOut', 'QuartOut', 'QuartOut'), + ('QuartInOut', 'QuartInOut', 'QuartInOut'), + ('QuintIn', 'QuintIn', 'QuintIn'), + ('QuintOut', 'QuintOut', 'QuintOut'), + ('QuintInOut', 'QuintInOut', 'QuintInOut'), + ('ExpoIn', 'ExpoIn', 'ExpoIn'), + ('ExpoOut', 'ExpoOut', 'ExpoOut'), + ('ExpoInOut', 'ExpoInOut', 'ExpoInOut'), + ('CircIn', 'CircIn', 'CircIn'), + ('CircOut', 'CircOut', 'CircOut'), + ('CircInOut', 'CircInOut', 'CircInOut'), + ('BackIn', 'BackIn', 'BackIn'), + ('BackOut', 'BackOut', 'BackOut'), + ('BackInOut', 'BackInOut', 'BackInOut')], + name='', default='Linear') + + def init(self, context): + self.add_input('ArmNodeSocketAction', 'Start') + self.add_input('ArmNodeSocketAction', 'Stop') + self.add_input('ArmFloatSocket', 'From', default_value = 0.0) + self.add_input('ArmFloatSocket', 'To', default_value = 0.0) + self.add_input('ArmFloatSocket', 'Time', default_value = 1.0) + + self.add_output('ArmFloatSocket', 'Tween') + self.add_output('ArmNodeSocketAction', 'Out') + self.add_output('ArmNodeSocketAction', 'Tick') + self.add_output('ArmNodeSocketAction', 'Done') + + def draw_buttons(self, context, layout): + layout.prop(self, 'property0') + + def draw_label(self) -> str: + return f'{self.bl_label}: {self.property0}' \ No newline at end of file