2017-03-21 03:06:38 +01:00
|
|
|
from arm.logicnode.arm_nodes import *
|
|
|
|
|
2020-09-08 21:16:20 +02:00
|
|
|
class MathNode(ArmLogicTreeNode):
|
2020-11-03 07:12:41 +01:00
|
|
|
"""Mathematical operations on values."""
|
2017-04-04 23:11:31 +02:00
|
|
|
bl_idname = 'LNMathNode'
|
2017-03-21 03:06:38 +01:00
|
|
|
bl_label = 'Math'
|
2020-09-13 11:27:58 +02:00
|
|
|
arm_version = 1
|
2018-12-18 23:48:38 +01:00
|
|
|
property0: EnumProperty(
|
2017-03-21 03:06:38 +01:00
|
|
|
items = [('Add', 'Add', 'Add'),
|
|
|
|
('Multiply', 'Multiply', 'Multiply'),
|
2020-11-03 07:12:41 +01:00
|
|
|
('Sine', 'Sine', 'Sine'),
|
2017-04-14 20:38:50 +02:00
|
|
|
('Cosine', 'Cosine', 'Cosine'),
|
2017-10-18 11:28:04 +02:00
|
|
|
('Max', 'Maximum', 'Max'),
|
|
|
|
('Min', 'Minimum', 'Min'),
|
|
|
|
('Abs', 'Absolute', 'Abs'),
|
|
|
|
('Subtract', 'Subtract', 'Subtract'),
|
|
|
|
('Divide', 'Divide', 'Divide'),
|
|
|
|
('Tangent', 'Tangent', 'Tangent'),
|
|
|
|
('Arcsine', 'Arcsine', 'Arcsine'),
|
|
|
|
('Arccosine', 'Arccosine', 'Arccosine'),
|
|
|
|
('Arctangent', 'Arctangent', 'Arctangent'),
|
|
|
|
('Power', 'Power', 'Power'),
|
|
|
|
('Logarithm', 'Logarithm', 'Logarithm'),
|
|
|
|
('Round', 'Round', 'Round'),
|
|
|
|
('Less Than', 'Less Than', 'Less Than'),
|
|
|
|
('Greater Than', 'Greater Than', 'Greater Than'),
|
|
|
|
('Modulo', 'Modulo', 'Modulo'),
|
2018-08-15 19:11:47 +02:00
|
|
|
('Arctan2', 'Arctan2', 'Arctan2'),
|
|
|
|
('Floor', 'Floor', 'Floor'),
|
|
|
|
('Ceil', 'Ceil', 'Ceil'),
|
|
|
|
('Fract', 'Fract', 'Fract'),
|
|
|
|
('Square Root', 'Square Root', 'Square Root'),
|
2020-11-03 07:12:41 +01:00
|
|
|
('Exp', 'Exponent', 'Exponent'),
|
2017-10-18 11:28:04 +02:00
|
|
|
],
|
2017-04-03 22:29:46 +02:00
|
|
|
name='', default='Add')
|
2020-09-08 17:03:24 +02:00
|
|
|
|
2017-10-18 11:28:04 +02:00
|
|
|
@property
|
|
|
|
def property1(self):
|
|
|
|
return 'true' if self.property1_ else 'false'
|
|
|
|
|
2018-12-18 23:48:38 +01:00
|
|
|
property1_: BoolProperty(name='Clamp', default=False)
|
2017-10-18 11:28:04 +02:00
|
|
|
|
2020-11-03 07:12:41 +01:00
|
|
|
def __init__(self):
|
|
|
|
array_nodes[str(id(self))] = self
|
|
|
|
|
2017-03-21 03:06:38 +01:00
|
|
|
def init(self, context):
|
2020-09-13 11:27:58 +02:00
|
|
|
super(MathNode, self).init(context)
|
2020-11-03 07:12:41 +01:00
|
|
|
self.add_input('NodeSocketFloat', 'Value 0', default_value=0.0)
|
|
|
|
self.add_input('NodeSocketFloat', 'Value 1', default_value=0.0)
|
2020-09-20 20:10:01 +02:00
|
|
|
self.add_output('NodeSocketFloat', 'Result')
|
2017-03-21 03:06:38 +01:00
|
|
|
|
|
|
|
def draw_buttons(self, context, layout):
|
2017-10-18 11:28:04 +02:00
|
|
|
layout.prop(self, 'property1_')
|
2017-04-03 22:29:46 +02:00
|
|
|
layout.prop(self, 'property0')
|
2020-11-03 07:12:41 +01:00
|
|
|
# Add, Subtract, Multiply, Divide
|
|
|
|
if (self.property0 == "Add") or (self.property0 == "Subtract") or (self.property0 == "Multiply") or (self.property0 == "Divide"):
|
|
|
|
while (len(self.inputs) < 2):
|
|
|
|
self.add_input('NodeSocketFloat', 'Value ' + str(len(self.inputs)))
|
|
|
|
row = layout.row(align=True)
|
|
|
|
column = row.column(align=True)
|
|
|
|
op = column.operator('arm.node_add_input', text='Add Value', icon='PLUS', emboss=True)
|
|
|
|
op.node_index = str(id(self))
|
|
|
|
op.socket_type = 'NodeSocketFloat'
|
|
|
|
op.name_format = 'Value {0}'
|
|
|
|
column = row.column(align=True)
|
|
|
|
op = column.operator('arm.node_remove_input', text='', icon='X', emboss=True)
|
|
|
|
op.node_index = str(id(self))
|
|
|
|
if len(self.inputs) == 2:
|
|
|
|
column.enabled = False
|
|
|
|
# Max, Min, Power, Arctan2, Modulo, Less Than, Greater Than
|
|
|
|
if (self.property0 == "Max") or (self.property0 == "Min") or (self.property0 == "Power") or (self.property0 == "Arctan2") or (self.property0 == "Modulo") or (self.property0 == "Less Than") or (self.property0 == "Greater Than"):
|
|
|
|
while (len(self.inputs) > 2):
|
|
|
|
self.inputs.remove(self.inputs.values()[-1])
|
|
|
|
while (len(self.inputs) < 2):
|
|
|
|
self.add_input('NodeSocketFloat', 'Value ' + str(len(self.inputs)))
|
|
|
|
# Sine, Cosine, Abs, Tangent, Arcsine, Arccosine, Arctangent, Logarithm, Round, Floor, Ceil, Square Root, Fract, Exponent
|
|
|
|
if (self.property0 == "Sine") or (self.property0 == "Cosine") or (self.property0 == "Abs") or (self.property0 == "Tangent") or (self.property0 == "Arcsine") or (self.property0 == "Arccosine") or (self.property0 == "Arctangent") or (self.property0 == "Logarithm") or (self.property0 == "Round") or (self.property0 == "Floor") or (self.property0 == "Ceil") or (self.property0 == "Square Root") or (self.property0 == "Fract") or (self.property0 == "Exp"):
|
|
|
|
while (len(self.inputs) > 1):
|
|
|
|
self.inputs.remove(self.inputs.values()[-1])
|