diff --git a/Sources/armory/logicnode/AddPhysicsConstraintNode.hx b/Sources/armory/logicnode/AddPhysicsConstraintNode.hx index 4f04e2b0..3013f775 100644 --- a/Sources/armory/logicnode/AddPhysicsConstraintNode.hx +++ b/Sources/armory/logicnode/AddPhysicsConstraintNode.hx @@ -1,13 +1,11 @@ package armory.logicnode; -import armory.trait.physics.PhysicsConstraint; -#if arm_physics -import armory.trait.physics.bullet.PhysicsConstraint.ConstraintType; -import armory.trait.physics.bullet.PhysicsConstraint.ConstraintAxis; -#end import iron.object.Object; -import armory.trait.physics.RigidBody; -import armory.logicnode.PhysicsConstraintNode; + +#if arm_physics +import armory.trait.physics.PhysicsConstraint; +import armory.trait.physics.bullet.PhysicsConstraint.ConstraintType; +#end class AddPhysicsConstraintNode extends LogicNode { @@ -21,115 +19,96 @@ class AddPhysicsConstraintNode extends LogicNode { } override function run(from: Int) { - var pivotObject:Object = inputs[1].get(); + var pivotObject: Object = inputs[1].get(); rb1 = inputs[2].get(); rb2 = inputs[3].get(); - var disableCollisions: Bool = inputs[4].get(); - var breakable: Bool = inputs[5].get(); - var breakingThreshold: Float = inputs[6].get(); - var type: ConstraintType = 0; if (pivotObject == null || rb1 == null || rb2 == null) return; #if arm_physics + var disableCollisions: Bool = inputs[4].get(); + var breakable: Bool = inputs[5].get(); + var breakingThreshold: Float = inputs[6].get(); + var type: ConstraintType = 0; + var con: PhysicsConstraint = pivotObject.getTrait(PhysicsConstraint); - if(con == null) - { - switch(property0) - { - case 'Fixed': - type = Fixed; - case 'Point': - type = Point; - case 'Hinge': - type = Hinge; - case 'Slider': - type = Slider; - case 'Piston': - type = Piston; - case 'Generic Spring': - type = Generic; + if (con == null) { + switch (property0) { + case "Fixed": type = Fixed; + case "Point": type = Point; + case "Hinge": type = Hinge; + case "Slider": type = Slider; + case "Piston": type = Piston; + case "Generic Spring": type = Generic; } - if(! breakable) breakingThreshold = 0.0; + if (!breakable) breakingThreshold = 0.0; + + if (type != Generic) { - if(type != Generic) { - con = new PhysicsConstraint(rb1, rb2, type, disableCollisions, breakingThreshold); - switch (type) - { + switch (type) { case Hinge: - var setLimit:Bool = inputs[7].get(); - var low:Float = inputs[8].get(); - var up:Float = inputs[9].get(); + var setLimit: Bool = inputs[7].get(); + var low: Float = inputs[8].get(); + var up: Float = inputs[9].get(); con.setHingeConstraintLimits(setLimit, low, up); case Slider: - var setLimit:Bool = inputs[7].get(); - var low:Float = inputs[8].get(); - var up:Float = inputs[9].get(); + var setLimit: Bool = inputs[7].get(); + var low: Float = inputs[8].get(); + var up: Float = inputs[9].get(); con.setSliderConstraintLimits(setLimit, low, up); case Piston: - var setLinLimit:Bool = inputs[7].get(); - var linLow:Float = inputs[8].get(); - var linUp:Float = inputs[9].get(); - var setAngLimit:Bool = inputs[10].get(); - var angLow:Float = inputs[11].get(); - var angUp:Float = inputs[12].get(); + var setLinLimit: Bool = inputs[7].get(); + var linLow: Float = inputs[8].get(); + var linUp: Float = inputs[9].get(); + var setAngLimit: Bool = inputs[10].get(); + var angLow: Float = inputs[11].get(); + var angUp: Float = inputs[12].get(); con.setPistonConstraintLimits(setLinLimit, linLow, linUp, setAngLimit, angLow, angUp); - default: + default: } } - else - { + else { var spring: Bool = false; var prop: PhysicsConstraintNode; - for(inp in 7...inputs.length) - { + + for (inp in 7...inputs.length) { prop = inputs[inp].get(); - if(prop == null) continue; - if(prop.isSpring) - { + if (prop == null) continue; + if (prop.isSpring) { spring = true; break; } } - if(spring) { + if (spring) { con = new PhysicsConstraint(rb1, rb2, GenericSpring, disableCollisions, breakingThreshold); - } + } else { con = new PhysicsConstraint(rb1, rb2, Generic, disableCollisions, breakingThreshold); } - for(inp in 7...inputs.length) - { + for (inp in 7...inputs.length) { prop = inputs[inp].get(); - if(prop == null) continue; - (inp + ': '); + if (prop == null) continue; - if(prop.isSpring) - { + if (prop.isSpring) { con.setSpringParams(prop.isSpring, prop.value1, prop.value2, prop.axis, prop.isAngular); } - else - { + else { con.setGenericConstraintLimits(true, prop.value1, prop.value2, prop.axis, prop.isAngular); } } - - } - pivotObject.addTrait(con); - } #end - runOutput(0); } } diff --git a/Sources/armory/logicnode/AddRigidBodyNode.hx b/Sources/armory/logicnode/AddRigidBodyNode.hx index a599e568..601eb97d 100644 --- a/Sources/armory/logicnode/AddRigidBodyNode.hx +++ b/Sources/armory/logicnode/AddRigidBodyNode.hx @@ -1,15 +1,17 @@ package armory.logicnode; +import iron.object.Object; + #if arm_physics +import armory.trait.physics.RigidBody; import armory.trait.physics.bullet.RigidBody.Shape; #end -import iron.object.Object; -import armory.trait.physics.RigidBody; + class AddRigidBodyNode extends LogicNode { - public var property0: String;//Shape - public var property1: String;//Advanced + public var property0: String; //Shape + public var property1: Bool; //Advanced public var object: Object; public function new(tree: LogicTree) { @@ -18,6 +20,10 @@ class AddRigidBodyNode extends LogicNode { override function run(from: Int) { object = inputs[1].get(); + if (object == null) return; + +#if arm_physics + var mass: Float = inputs[2].get(); var active: Bool = inputs[3].get(); var animated: Bool = inputs[4].get(); @@ -38,8 +44,7 @@ class AddRigidBodyNode extends LogicNode { var shape: Shape = 1; - if(property1 == 'true') - { + if (property1) { margin = inputs[9].get(); marginLen = inputs[10].get(); linDamp = inputs[11].get(); @@ -49,50 +54,34 @@ class AddRigidBodyNode extends LogicNode { angVelThreshold = inputs[15].get(); group = inputs[16].get(); mask = inputs[17].get(); - } - - if (object == null) return; - -#if arm_physics var rb: RigidBody = object.getTrait(RigidBody); - if((group < 0) || (group > 32)) group = 1; //Limiting max groups to 32 - if((mask < 0) || (mask > 32)) mask = 1; //Limiting max masks to 32 - if(rb == null) - { - - switch (property0){ - - case 'Box': - shape = Box; - case 'Sphere': - shape = Sphere; - case 'Capsule': - shape = Capsule; - case 'Cone': - shape = Cone; - case 'Cylinder': - shape = Cylinder; - case 'Convex Hull': - shape = ConvexHull; - case 'Mesh': - shape = Mesh; + if ((group < 0) || (group > 32)) group = 1; //Limiting max groups to 32 + if ((mask < 0) || (mask > 32)) mask = 1; //Limiting max masks to 32 + if (rb == null) { + switch (property0) { + case "Box": shape = Box; + case "Sphere": shape = Sphere; + case "Capsule": shape = Capsule; + case "Cone": shape = Cone; + case "Cylinder": shape = Cylinder; + case "Convex Hull": shape = ConvexHull; + case "Mesh": shape = Mesh; } rb = new RigidBody(shape, mass, friction, bounciness, group, mask); rb.animated = animated; - rb.staticObj = ! active; + rb.staticObj = !active; rb.isTriggerObject(trigger); - if(property1 == 'true') - { + + if (property1) { rb.linearDamping = linDamp; rb.angularDamping = angDamp; - if(margin) rb.collisionMargin = marginLen; - if(useDeactiv) { + if (margin) rb.collisionMargin = marginLen; + if (useDeactiv) { rb.setUpDeactivation(true, linearVelThreshold, angVelThreshold, 0.0); } - } object.addTrait(rb); diff --git a/Sources/armory/logicnode/LogicNode.hx b/Sources/armory/logicnode/LogicNode.hx index b7b78b1d..6c48fde3 100644 --- a/Sources/armory/logicnode/LogicNode.hx +++ b/Sources/armory/logicnode/LogicNode.hx @@ -1,31 +1,136 @@ package armory.logicnode; +#if arm_patch @:keep @:keepSub #end class LogicNode { var tree: LogicTree; - var inputs: Array = []; - var outputs: Array> = []; + var inputs: Array = []; + var outputs: Array> = []; - #if arm_debug + #if (arm_debug || arm_patch) public var name = ""; - public function watch(b: Bool) { // Watch in debug console - var nodes = armory.trait.internal.DebugConsole.watchNodes; - b ? nodes.push(this) : nodes.remove(this); - } + + #if (arm_debug) + public function watch(b: Bool) { // Watch in debug console + var nodes = armory.trait.internal.DebugConsole.watchNodes; + b ? nodes.push(this) : nodes.remove(this); + } + #end #end public function new(tree: LogicTree) { this.tree = tree; } - public function addInput(node: LogicNode, from: Int) { - inputs.push(new LogicNodeInput(node, from)); + /** + Resize the inputs array to a given size to minimize dynamic + reallocation and over-allocation later. + **/ + inline function preallocInputs(amount: Int) { + this.inputs.resize(amount); } - public function addOutputs(nodes: Array) { - outputs.push(nodes); + /** + Resize the outputs array to a given size to minimize dynamic + reallocation and over-allocation later. + **/ + inline function preallocOutputs(amount: Int) { + this.outputs.resize(amount); + for (i in 0...outputs.length) { + outputs[i] = []; + } } + /** + Add a link between to nodes to the tree. + **/ + public static function addLink(fromNode: LogicNode, toNode: LogicNode, fromIndex: Int, toIndex: Int): LogicNodeLink { + var link = new LogicNodeLink(fromNode, toNode, fromIndex, toIndex); + + if (toNode.inputs.length <= toIndex) { + toNode.inputs.resize(toIndex + 1); + } + toNode.inputs[toIndex] = link; + + var fromNodeOuts = fromNode.outputs; + var outLen = fromNodeOuts.length; + if (outLen <= fromIndex) { + fromNodeOuts.resize(fromIndex + 1); + + // Initialize with empty arrays + for (i in outLen...fromIndex + 1) { + fromNodeOuts[i] = []; + } + } + fromNodeOuts[fromIndex].push(link); + + return link; + } + + #if arm_patch + /** + Removes a link from the tree. + **/ + static function removeLink(link: LogicNodeLink) { + link.fromNode.outputs[link.fromIndex].remove(link); + + // Reuse the same link and connect a default input node to it. + // That's why this function is only available in arm_patch mode, we need + // access to the link's type and value. + link.fromNode = LogicNode.createSocketDefaultNode(link.toNode.tree, link.toType, link.toValue); + link.fromIndex = 0; + } + + /** + Removes all inputs and their links from this node. + Warning: this function changes the amount of node inputs to 0! + **/ + function clearInputs() { + for (link in inputs) { + link.fromNode.outputs[link.fromIndex].remove(link); + } + inputs.resize(0); + } + + /** + Removes all outputs and their links from this node. + Warning: this function changes the amount of node inputs to 0! + **/ + function clearOutputs() { + for (links in outputs) { + for (link in links) { + var defaultNode = LogicNode.createSocketDefaultNode(tree, link.toType, link.toValue); + link.fromNode = defaultNode; + link.fromIndex = 0; + defaultNode.outputs[0] = [link]; + } + } + outputs.resize(0); + } + + /** + Creates a default node for a socket so that get() and set() can be + used without null checks. + Loosely equivalent to `make_logic.build_default_node()` in Python. + **/ + static inline function createSocketDefaultNode(tree: LogicTree, socketType: String, value: Dynamic): LogicNode { + // Make sure to not add these nodes to the LogicTree.nodes array as they + // won't be garbage collected then if unlinked later. + return switch (socketType) { + case "VECTOR": new armory.logicnode.VectorNode(tree, value[0], value[1], value[2]); + case "RGBA": new armory.logicnode.ColorNode(tree, value[0], value[1], value[2], value[3]); + case "RGB": new armory.logicnode.ColorNode(tree, value[0], value[1], value[2]); + case "VALUE": new armory.logicnode.FloatNode(tree, value); + case "INT": new armory.logicnode.IntegerNode(tree, value); + case "BOOLEAN": new armory.logicnode.BooleanNode(tree, value); + case "STRING": new armory.logicnode.StringNode(tree, value); + case "NONE": new armory.logicnode.NullNode(tree); + case "OBJECT": new armory.logicnode.ObjectNode(tree, value); + default: new armory.logicnode.DynamicNode(tree, value); + } + } + #end + /** Called when this node is activated. @param from impulse index @@ -38,47 +143,45 @@ class LogicNode { **/ function runOutput(i: Int) { if (i >= outputs.length) return; - for (output in outputs[i]) { - // Check which input activated the node - for (j in 0...output.inputs.length) { - // Check if the node is connected to the current node - if (output.inputs[j].node == this) { - // Check if the input socekt is linked to current output socket - if (output.inputs[j].from == i) { - output.run(j); - break; - } - } - } + for (outLink in outputs[i]) { + outLink.toNode.run(outLink.toIndex); } } - @:allow(armory.logicnode.LogicNodeInput) + @:allow(armory.logicnode.LogicNodeLink) function get(from: Int): Dynamic { return this; } - @:allow(armory.logicnode.LogicNodeInput) + @:allow(armory.logicnode.LogicNodeLink) function set(value: Dynamic) {} } -class LogicNodeInput { +@:allow(armory.logicnode.LogicNode) +@:allow(armory.logicnode.LogicTree) +class LogicNodeLink { - @:allow(armory.logicnode.LogicNode) - var node: LogicNode; - @:allow(armory.logicnode.LogicNode) - var from: Int; // Socket index + var fromNode: LogicNode; + var toNode: LogicNode; + var fromIndex: Int; + var toIndex: Int; - public function new(node: LogicNode, from: Int) { - this.node = node; - this.from = from; + #if arm_patch + var fromType: String; + var toType: String; + var toValue: Dynamic; + #end + + inline function new(fromNode: LogicNode, toNode: LogicNode, fromIndex: Int, toIndex: Int) { + this.fromNode = fromNode; + this.toNode = toNode; + this.fromIndex = fromIndex; + this.toIndex = toIndex; } - @:allow(armory.logicnode.LogicNode) - function get(): Dynamic { - return node.get(from); + inline function get(): Dynamic { + return fromNode.get(fromIndex); } - @:allow(armory.logicnode.LogicNode) - function set(value: Dynamic) { - node.set(value); + inline function set(value: Dynamic) { + fromNode.set(value); } } diff --git a/Sources/armory/logicnode/LogicTree.hx b/Sources/armory/logicnode/LogicTree.hx index ce2b26e4..ed06b08e 100644 --- a/Sources/armory/logicnode/LogicTree.hx +++ b/Sources/armory/logicnode/LogicTree.hx @@ -2,10 +2,26 @@ package armory.logicnode; class LogicTree extends iron.Trait { + #if arm_patch + /** + Stores all trait instances of the tree via its name. + **/ + public static var nodeTrees = new Map>(); + + /** + [node name => logic node] for later node replacement for live patching. + **/ + public var nodes: Map; + #end + public var loopBreak = false; // Trigger break from loop nodes public function new() { super(); + + #if arm_patch + nodes = new Map(); + #end } public function add() {} diff --git a/Sources/armory/logicnode/MathNode.hx b/Sources/armory/logicnode/MathNode.hx index 4905c47e..5adc477d 100644 --- a/Sources/armory/logicnode/MathNode.hx +++ b/Sources/armory/logicnode/MathNode.hx @@ -3,7 +3,7 @@ package armory.logicnode; class MathNode extends LogicNode { public var property0: String; // Operation - public var property1: String; // Clamp + public var property1: Bool; // Clamp public function new(tree: LogicTree) { super(tree); @@ -80,8 +80,8 @@ class MathNode extends LogicNode { } } // Clamp - if (property1 == "true") r = r < 0.0 ? 0.0 : (r > 1.0 ? 1.0 : r); + if (property1) r = r < 0.0 ? 0.0 : (r > 1.0 ? 1.0 : r); return r; } -} \ No newline at end of file +} diff --git a/Sources/armory/logicnode/MixNode.hx b/Sources/armory/logicnode/MixNode.hx index 90f51bea..4f75884d 100644 --- a/Sources/armory/logicnode/MixNode.hx +++ b/Sources/armory/logicnode/MixNode.hx @@ -6,7 +6,7 @@ class MixNode extends LogicNode { public var property0: String; // Type public var property1: String; // Ease - public var property2: String; // Clamp + public var property2: Bool; // Clamp var ease: Float->Float = null; @@ -50,7 +50,9 @@ class MixNode extends LogicNode { var v2: Float = inputs[2].get(); var f = v1 + (v2 - v1) * ease(k); - if (property2 == "true") f = f < 0 ? 0 : f > 1 ? 1 : f; + // Clamp + if (property2) f = f < 0 ? 0 : f > 1 ? 1 : f; + return f; } } diff --git a/Sources/armory/logicnode/ObjectNode.hx b/Sources/armory/logicnode/ObjectNode.hx index 1506fdd2..bd3e8494 100644 --- a/Sources/armory/logicnode/ObjectNode.hx +++ b/Sources/armory/logicnode/ObjectNode.hx @@ -21,7 +21,7 @@ class ObjectNode extends LogicNode { override function set(value: Dynamic) { if (inputs.length > 0) inputs[0].set(value); else { - objectName = value.name; + objectName = value != null ? value.name : ""; this.value = value; } } diff --git a/Sources/armory/logicnode/PhysicsConstraintNode.hx b/Sources/armory/logicnode/PhysicsConstraintNode.hx index 5446788b..a06eaa51 100644 --- a/Sources/armory/logicnode/PhysicsConstraintNode.hx +++ b/Sources/armory/logicnode/PhysicsConstraintNode.hx @@ -3,50 +3,39 @@ package armory.logicnode; #if arm_physics import armory.trait.physics.bullet.PhysicsConstraint.ConstraintAxis; #end -import iron.object.Object; class PhysicsConstraintNode extends LogicNode { - public var property0: String;//Linear or Angular - public var property1: String;//Axis - public var property2: String;//Is a spring - public var value1: Float;//Lower limit or Spring Stiffness - public var value2: Float;//Upper limit or Spring Damping + public var property0: String; //Linear or Angular + public var property1: String; //Axis + public var property2: Bool; //Is a spring + +#if arm_physics + public var value1: Float; //Lower limit or Spring Stiffness + public var value2: Float; //Upper limit or Spring Damping public var isAngular: Bool; public var axis: ConstraintAxis; public var isSpring: Bool; +#end public function new(tree: LogicTree) { super(tree); } override function get(from: Int): PhysicsConstraintNode { +#if arm_physics value1 = inputs[0].get(); value2 = inputs[1].get(); - if(property0 == 'Linear') { - isAngular = false; - } - else{ - isAngular = true; - } + isAngular = property0 != "Linear"; + isSpring = property2; - if(property2 == 'true'){ - isSpring = true; + switch (property1) { + case "X": axis = X; + case "Y": axis = Y; + case "Z": axis = Z; } - else { - isSpring = false; - } - - switch (property1){ - case 'X': - axis = X; - case 'Y': - axis = Y; - case 'Z': - axis = Z; - } - +#end return this; } } diff --git a/Sources/armory/logicnode/QuaternionNode.hx b/Sources/armory/logicnode/QuaternionNode.hx index 95880f4f..bf83f4de 100644 --- a/Sources/armory/logicnode/QuaternionNode.hx +++ b/Sources/armory/logicnode/QuaternionNode.hx @@ -11,10 +11,10 @@ class QuaternionNode extends LogicNode { super(tree); if (x != null) { - addInput(new FloatNode(tree, x), 0); - addInput(new FloatNode(tree, y), 0); - addInput(new FloatNode(tree, z), 0); - addInput(new FloatNode(tree, w), 0); + LogicNode.addLink(new FloatNode(tree, x), this, 0, 0); + LogicNode.addLink(new FloatNode(tree, y), this, 0, 1); + LogicNode.addLink(new FloatNode(tree, z), this, 0, 2); + LogicNode.addLink(new FloatNode(tree, w), this, 0, 3); } } @@ -27,15 +27,15 @@ class QuaternionNode extends LogicNode { switch (from){ case 0: return value; - case 1: - var value1 = new Vec4(); + case 1: + var value1 = new Vec4(); value1.x = value.x; value1.y = value.y; value1.z = value.z; value1.w = 0; // use 0 to avoid this vector being translated. return value1; case 2: - return value.w; + return value.w; default: return null; } diff --git a/Sources/armory/logicnode/SetParentNode.hx b/Sources/armory/logicnode/SetParentNode.hx index 81045a1e..4ad179df 100644 --- a/Sources/armory/logicnode/SetParentNode.hx +++ b/Sources/armory/logicnode/SetParentNode.hx @@ -14,8 +14,9 @@ class SetParentNode extends LogicNode { var parent: Object; var isUnparent = false; - if (Std.isOfType(inputs[2].node, ObjectNode)) { - var parentNode = cast(inputs[2].node, ObjectNode); + + if (Std.isOfType(inputs[2].fromNode, ObjectNode)) { + var parentNode = cast(inputs[2].fromNode, ObjectNode); isUnparent = parentNode.objectName == ""; } if (isUnparent) parent = iron.Scene.active.root; @@ -24,7 +25,7 @@ class SetParentNode extends LogicNode { if (object == null || parent == null || object.parent == parent) return; object.parent.removeChild(object, isUnparent); // keepTransform - + #if arm_physics var rigidBody = object.getTrait(RigidBody); if (rigidBody != null) rigidBody.setActivationState(0); diff --git a/Sources/armory/logicnode/VectorMixNode.hx b/Sources/armory/logicnode/VectorMixNode.hx index 47286ac7..ae2b7938 100644 --- a/Sources/armory/logicnode/VectorMixNode.hx +++ b/Sources/armory/logicnode/VectorMixNode.hx @@ -7,7 +7,7 @@ class VectorMixNode extends LogicNode { public var property0: String; // Type public var property1: String; // Ease - public var property2: String; // Clamp + public var property2: Bool; // Clamp var v = new Vec4(); @@ -57,7 +57,7 @@ class VectorMixNode extends LogicNode { v.y = v1.y + (v2.y - v1.y) * f; v.z = v1.z + (v2.z - v1.z) * f; - if (property2 == "true") v.clamp(0, 1); + if (property2) v.clamp(0, 1); return v; } } diff --git a/Sources/armory/logicnode/VectorNode.hx b/Sources/armory/logicnode/VectorNode.hx index 2c186907..09cb0204 100644 --- a/Sources/armory/logicnode/VectorNode.hx +++ b/Sources/armory/logicnode/VectorNode.hx @@ -10,9 +10,9 @@ class VectorNode extends LogicNode { super(tree); if (x != null) { - addInput(new FloatNode(tree, x), 0); - addInput(new FloatNode(tree, y), 0); - addInput(new FloatNode(tree, z), 0); + LogicNode.addLink(new FloatNode(tree, x), this, 0, 0); + LogicNode.addLink(new FloatNode(tree, y), this, 0, 1); + LogicNode.addLink(new FloatNode(tree, z), this, 0, 2); } } diff --git a/Sources/armory/trait/internal/Bridge.hx b/Sources/armory/trait/internal/Bridge.hx index 1ce35562..632fad8f 100644 --- a/Sources/armory/trait/internal/Bridge.hx +++ b/Sources/armory/trait/internal/Bridge.hx @@ -11,6 +11,7 @@ class Bridge { public static var Input = iron.system.Input; public static var Object = iron.object.Object; public static var Data = iron.data.Data; + public static var Vec4 = iron.math.Vec4; public static function log(s: String) { trace(s); }; } diff --git a/Sources/armory/trait/internal/LivePatch.hx b/Sources/armory/trait/internal/LivePatch.hx index 220d42ba..743f66be 100644 --- a/Sources/armory/trait/internal/LivePatch.hx +++ b/Sources/armory/trait/internal/LivePatch.hx @@ -1,8 +1,17 @@ package armory.trait.internal; +import armory.logicnode.LogicNode; +import armory.logicnode.LogicTree; + + +#if arm_patch @:expose("LivePatch") #end +@:access(armory.logicnode.LogicNode) +@:access(armory.logicnode.LogicNodeLink) class LivePatch extends iron.Trait { -#if arm_patch +#if !arm_patch + public function new() { super(); } +#else static var patchId = 0; @@ -23,9 +32,164 @@ class LivePatch extends iron.Trait { }); } -#else + public static function patchCreateNodeLink(treeName: String, fromNodeName: String, toNodeName: String, fromIndex: Int, toIndex: Int) { + if (!LogicTree.nodeTrees.exists(treeName)) return; + var trees = LogicTree.nodeTrees[treeName]; - public function new() { super(); } + for (tree in trees) { + var fromNode = tree.nodes[fromNodeName]; + var toNode = tree.nodes[toNodeName]; + if (fromNode == null || toNode == null) return; + + LogicNode.addLink(fromNode, toNode, fromIndex, toIndex); + } + } + + public static function patchSetNodeLinks(treeName: String, nodeName: String, inputDatas: Array, outputDatas: Array>) { + if (!LogicTree.nodeTrees.exists(treeName)) return; + var trees = LogicTree.nodeTrees[treeName]; + + for (tree in trees) { + var node = tree.nodes[nodeName]; + if (node == null) return; + + node.clearInputs(); + node.clearOutputs(); + + for (inputData in inputDatas) { + var fromNode: LogicNode; + var fromIndex: Int; + + if (inputData.isLinked) { + fromNode = tree.nodes[inputData.fromNode]; + if (fromNode == null) continue; + fromIndex = inputData.fromIndex; + } + else { + fromNode = LogicNode.createSocketDefaultNode(node.tree, inputData.socketType, inputData.socketValue); + fromIndex = 0; + } + + LogicNode.addLink(fromNode, node, fromIndex, inputData.toIndex); + } + + for (outputData in outputDatas) { + for (linkData in outputData) { + var toNode: LogicNode; + var toIndex: Int; + + if (linkData.isLinked) { + toNode = tree.nodes[linkData.toNode]; + if (toNode == null) continue; + toIndex = linkData.toIndex; + } + else { + toNode = LogicNode.createSocketDefaultNode(node.tree, linkData.socketType, linkData.socketValue); + toIndex = 0; + } + + LogicNode.addLink(node, toNode, linkData.fromIndex, toIndex); + } + } + } + } + + public static function patchUpdateNodeProp(treeName: String, nodeName: String, propName: String, value: Dynamic) { + if (!LogicTree.nodeTrees.exists(treeName)) return; + var trees = LogicTree.nodeTrees[treeName]; + + for (tree in trees) { + var node = tree.nodes[nodeName]; + if (node == null) return; + + Reflect.setField(node, propName, value); + } + } + + public static function patchUpdateNodeInputVal(treeName: String, nodeName: String, socketIndex: Int, value: Dynamic) { + if (!LogicTree.nodeTrees.exists(treeName)) return; + var trees = LogicTree.nodeTrees[treeName]; + + for (tree in trees) { + var node = tree.nodes[nodeName]; + if (node == null) return; + + node.inputs[socketIndex].set(value); + } + } + + public static function patchNodeDelete(treeName: String, nodeName: String) { + if (!LogicTree.nodeTrees.exists(treeName)) return; + var trees = LogicTree.nodeTrees[treeName]; + + for (tree in trees) { + var node = tree.nodes[nodeName]; + if (node == null) return; + + node.clearOutputs(); + node.clearInputs(); + tree.nodes.remove(nodeName); + } + } + + public static function patchNodeCreate(treeName: String, nodeName: String, nodeType: String, propDatas: Array>, inputDatas: Array>, outputDatas: Array>) { + if (!LogicTree.nodeTrees.exists(treeName)) return; + var trees = LogicTree.nodeTrees[treeName]; + + for (tree in trees) { + // No further constructor parameters required here, all variable nodes + // use optional further parameters and all values are set later in this + // function. + var newNode: LogicNode = Type.createInstance(Type.resolveClass(nodeType), [tree]); + newNode.name = nodeName; + tree.nodes[nodeName] = newNode; + + for (propData in propDatas) { + Reflect.setField(newNode, propData[0], propData[1]); + } + + var i = 0; + for (inputData in inputDatas) { + LogicNode.addLink(LogicNode.createSocketDefaultNode(newNode.tree, inputData[0], inputData[1]), newNode, 0, i++); + } + + i = 0; + for (outputData in outputDatas) { + LogicNode.addLink(newNode, LogicNode.createSocketDefaultNode(newNode.tree, outputData[0], outputData[1]), i++, 0); + } + } + } + + public static function patchNodeCopy(treeName: String, nodeName: String, newNodeName: String, copyProps: Array, inputDatas: Array>, outputDatas: Array>) { + if (!LogicTree.nodeTrees.exists(treeName)) return; + var trees = LogicTree.nodeTrees[treeName]; + + for (tree in trees) { + var node = tree.nodes[nodeName]; + if (node == null) return; + + // No further constructor parameters required here, all variable nodes + // use optional further parameters and all values are set later in this + // function. + var newNode: LogicNode = Type.createInstance(Type.getClass(node), [tree]); + newNode.name = newNodeName; + tree.nodes[newNodeName] = newNode; + + for (propName in copyProps) { + Reflect.setField(newNode, propName, Reflect.field(node, propName)); + } + + var i = 0; + for (inputData in inputDatas) { + LogicNode.addLink(LogicNode.createSocketDefaultNode(newNode.tree, inputData[0], inputData[1]), newNode, 0, i++); + } + + i = 0; + for (outputData in outputDatas) { + LogicNode.addLink(newNode, LogicNode.createSocketDefaultNode(newNode.tree, outputData[0], outputData[1]), i++, 0); + } + } + } #end } diff --git a/blender/arm/exporter.py b/blender/arm/exporter.py index 6a2507bf..10d23e13 100755 --- a/blender/arm/exporter.py +++ b/blender/arm/exporter.py @@ -1531,24 +1531,18 @@ Make sure the mesh only has tris/quads.""") # Less bias for bigger maps out_light['shadows_bias'] *= 1 / (out_light['shadowmap_size'] / 1024) elif objtype == 'POINT': - out_light['strength'] *= 2.6 - if bpy.app.version >= (2, 80, 72): - out_light['strength'] *= 0.01 + out_light['strength'] *= 0.01 out_light['fov'] = 1.5708 # pi/2 out_light['shadowmap_cube'] = True if light_ref.shadow_soft_size > 0.1: out_light['light_size'] = light_ref.shadow_soft_size * 10 elif objtype == 'SPOT': - out_light['strength'] *= 2.6 - if bpy.app.version >= (2, 80, 72): - out_light['strength'] *= 0.01 + out_light['strength'] *= 0.01 out_light['spot_size'] = math.cos(light_ref.spot_size / 2) # Cycles defaults to 0.15 out_light['spot_blend'] = light_ref.spot_blend / 10 elif objtype == 'AREA': - out_light['strength'] *= 80.0 / (light_ref.size * light_ref.size_y) - if bpy.app.version >= (2, 80, 72): - out_light['strength'] *= 0.01 + out_light['strength'] *= 0.01 out_light['size'] = light_ref.size out_light['size_y'] = light_ref.size_y @@ -2460,7 +2454,7 @@ Make sure the mesh only has tris/quads.""") else: self.material_to_object_dict[mat] = [bobject] self.material_to_arm_object_dict[mat] = [o] - + # Add UniformsManager trait if type is NodeType.MESH: uniformManager = {} @@ -2678,7 +2672,7 @@ Make sure the mesh only has tris/quads.""") } self.output['traits'].append(out_trait) - if wrd.arm_live_patch: + if arm.utils.is_livepatch_enabled(): if 'traits' not in self.output: self.output['traits'] = [] out_trait = {'type': 'Script', 'class_name': 'armory.trait.internal.LivePatch'} diff --git a/blender/arm/handlers.py b/blender/arm/handlers.py index b5020e53..f3d03f42 100644 --- a/blender/arm/handlers.py +++ b/blender/arm/handlers.py @@ -7,6 +7,7 @@ import bpy from bpy.app.handlers import persistent import arm.api +import arm.live_patch as live_patch import arm.logicnode.arm_nodes as arm_nodes import arm.nodes_logic import arm.make as make @@ -14,6 +15,7 @@ import arm.make_state as state import arm.props as props import arm.utils + @persistent def on_depsgraph_update_post(self): if state.proc_build != None: @@ -41,12 +43,10 @@ def on_depsgraph_update_post(self): # Send last operator to Krom wrd = bpy.data.worlds['Arm'] - if state.proc_play != None and \ - state.target == 'krom' and \ - wrd.arm_live_patch: + if state.proc_play is not None and state.target == 'krom' and wrd.arm_live_patch: ops = bpy.context.window_manager.operators - if len(ops) > 0 and ops[-1] != None: - send_operator(ops[-1]) + if len(ops) > 0 and ops[-1] is not None: + live_patch.on_operator(ops[-1].bl_idname) # Hacky solution to update armory props after operator executions last_operator = bpy.context.active_operator @@ -125,6 +125,7 @@ def poll_threads() -> float: appended_py_paths = [] context_screen = None + @persistent def on_load_post(context): global appended_py_paths diff --git a/blender/arm/live_patch.py b/blender/arm/live_patch.py new file mode 100644 index 00000000..b2bf81a8 --- /dev/null +++ b/blender/arm/live_patch.py @@ -0,0 +1,376 @@ +import os +import shutil +from typing import Any, Type + +import bpy + +import arm.assets +import arm.node_utils +from arm.exporter import ArmoryExporter +import arm.log as log +from arm.logicnode.arm_nodes import ArmLogicTreeNode +import arm.make as make +import arm.make_state as state +import arm.utils + +# Current patch id +patch_id = 0 + +# Any object can act as a message bus owner +msgbus_owner = object() + +# Whether live patch is currently active +__running = False + + +def start(): + """Start the live patch session.""" + log.debug("Live patch session started") + + listen(bpy.types.Object, "location", "obj_location") + listen(bpy.types.Object, "rotation_euler", "obj_rotation") + listen(bpy.types.Object, "scale", "obj_scale") + + # 'energy' is defined in sub classes only, also workaround for + # https://developer.blender.org/T88408 + for light_type in (bpy.types.AreaLight, bpy.types.PointLight, bpy.types.SpotLight, bpy.types.SunLight): + listen(light_type, "color", "light_color") + listen(light_type, "energy", "light_energy") + + global __running + __running = True + + +def stop(): + """Stop the live patch session.""" + global __running + if __running: + __running = False + + log.debug("Live patch session stopped") + bpy.msgbus.clear_by_owner(msgbus_owner) + + +def patch_export(): + """Re-export the current scene and update the game accordingly.""" + if not __running or state.proc_build is not None: + return + + arm.assets.invalidate_enabled = False + + with arm.utils.WorkingDir(arm.utils.get_fp()): + asset_path = arm.utils.get_fp_build() + '/compiled/Assets/' + arm.utils.safestr(bpy.context.scene.name) + '.arm' + ArmoryExporter.export_scene(bpy.context, asset_path, scene=bpy.context.scene) + + dir_std_shaders_dst = os.path.join(arm.utils.build_dir(), 'compiled', 'Shaders', 'std') + if not os.path.isdir(dir_std_shaders_dst): + dir_std_shaders_src = os.path.join(arm.utils.get_sdk_path(), 'armory', 'Shaders', 'std') + shutil.copytree(dir_std_shaders_src, dir_std_shaders_dst) + + node_path = arm.utils.get_node_path() + khamake_path = arm.utils.get_khamake_path() + cmd = [ + node_path, khamake_path, 'krom', + '--shaderversion', '330', + '--parallelAssetConversion', '4', + '--to', arm.utils.build_dir() + '/debug', + '--nohaxe', + '--noproject' + ] + + arm.assets.invalidate_enabled = True + state.proc_build = make.run_proc(cmd, patch_done) + + +def patch_done(): + """Signal Iron to reload the running scene after a re-export.""" + js = 'iron.Scene.patch();' + write_patch(js) + state.proc_build = None + + +def write_patch(js: str): + """Write the given javascript code to 'krom.patch'.""" + global patch_id + with open(arm.utils.get_fp_build() + '/debug/krom/krom.patch', 'w') as f: + patch_id += 1 + f.write(str(patch_id) + '\n') + f.write(js) + + +def listen(rna_type: Type[bpy.types.bpy_struct], prop: str, event_id: str): + """Subscribe to '.'. The event_id can be choosen + freely but must match with the id used in send_event(). + """ + bpy.msgbus.subscribe_rna( + key=(rna_type, prop), + owner=msgbus_owner, + args=(event_id, ), + notify=send_event + # options={"PERSISTENT"} + ) + + +def send_event(event_id: str, opt_data: Any = None): + """Send the result of the given event to Krom.""" + if not __running: + return + + if hasattr(bpy.context, 'object') and bpy.context.object is not None: + obj = bpy.context.object.name + + if bpy.context.object.mode == "OBJECT": + if event_id == "obj_location": + vec = bpy.context.object.location + js = f'var o = iron.Scene.active.getChild("{obj}"); o.transform.loc.set({vec[0]}, {vec[1]}, {vec[2]}); o.transform.dirty = true;' + write_patch(js) + + elif event_id == 'obj_scale': + vec = bpy.context.object.scale + js = f'var o = iron.Scene.active.getChild("{obj}"); o.transform.scale.set({vec[0]}, {vec[1]}, {vec[2]}); o.transform.dirty = true;' + write_patch(js) + + elif event_id == 'obj_rotation': + vec = bpy.context.object.rotation_euler.to_quaternion() + js = f'var o = iron.Scene.active.getChild("{obj}"); o.transform.rot.set({vec[1]}, {vec[2]}, {vec[3]}, {vec[0]}); o.transform.dirty = true;' + write_patch(js) + + elif event_id == 'light_color': + light: bpy.types.Light = bpy.context.object.data + vec = light.color + js = f'var lRaw = iron.Scene.active.getLight("{light.name}").data.raw; lRaw.color[0]={vec[0]}; lRaw.color[1]={vec[1]}; lRaw.color[2]={vec[2]};' + write_patch(js) + + elif event_id == 'light_energy': + light: bpy.types.Light = bpy.context.object.data + + # Align strength to Armory, see exporter.export_light() + # TODO: Use exporter.export_light() and simply reload all raw light data in Iron? + strength_fac = 1.0 + if light.type == 'SUN': + strength_fac = 0.325 + elif light.type in ('POINT', 'SPOT', 'AREA'): + strength_fac = 0.01 + + js = f'var lRaw = iron.Scene.active.getLight("{light.name}").data.raw; lRaw.strength={light.energy * strength_fac};' + write_patch(js) + + else: + patch_export() + + if event_id == 'ln_insert_link': + node: ArmLogicTreeNode + link: bpy.types.NodeLink + node, link = opt_data + + # This event is called twice for a connection but we only need + # send it once + if node == link.from_node: + tree_name = arm.node_utils.get_export_tree_name(node.get_tree()) + + # [1:] is used here because make_logic already uses that for + # node names if arm_debug is used + from_node_name = arm.node_utils.get_export_node_name(node)[1:] + to_node_name = arm.node_utils.get_export_node_name(link.to_node)[1:] + + from_index = arm.node_utils.get_socket_index(node.outputs, link.from_socket) + to_index = arm.node_utils.get_socket_index(link.to_node.inputs, link.to_socket) + + js = f'LivePatch.patchCreateNodeLink("{tree_name}", "{from_node_name}", "{to_node_name}", "{from_index}", "{to_index}");' + write_patch(js) + + elif event_id == 'ln_update_prop': + node: ArmLogicTreeNode + prop_name: str + node, prop_name = opt_data + + tree_name = arm.node_utils.get_export_tree_name(node.get_tree()) + node_name = arm.node_utils.get_export_node_name(node)[1:] + + value = arm.node_utils.haxe_format_prop_value(node, prop_name) + + if prop_name.endswith('_get'): + # Hack because some nodes use a different Python property + # name than they use in Haxe + prop_name = prop_name[:-4] + + js = f'LivePatch.patchUpdateNodeProp("{tree_name}", "{node_name}", "{prop_name}", {value});' + write_patch(js) + + elif event_id == 'ln_socket_val': + node: ArmLogicTreeNode + socket: bpy.types.NodeSocket + node, socket = opt_data + + socket_index = arm.node_utils.get_socket_index(node.inputs, socket) + + if socket_index != -1: + tree_name = arm.node_utils.get_export_tree_name(node.get_tree()) + node_name = arm.node_utils.get_export_node_name(node)[1:] + + value = socket.get_default_value() + inp_type = socket.arm_socket_type + + if inp_type in ('VECTOR', 'RGB'): + value = f'new iron.Vec4({arm.node_utils.haxe_format_socket_val(value, array_outer_brackets=False)}, 1.0)' + elif inp_type == 'RGBA': + value = f'new iron.Vec4({arm.node_utils.haxe_format_socket_val(value, array_outer_brackets=False)})' + elif inp_type == 'OBJECT': + value = f'iron.Scene.active.getChild("{value}")' if value != '' else 'null' + else: + value = arm.node_utils.haxe_format_socket_val(value) + + js = f'LivePatch.patchUpdateNodeInputVal("{tree_name}", "{node_name}", {socket_index}, {value});' + write_patch(js) + + elif event_id == 'ln_create': + node: ArmLogicTreeNode = opt_data + + tree_name = arm.node_utils.get_export_tree_name(node.get_tree()) + node_name = arm.node_utils.get_export_node_name(node)[1:] + node_type = 'armory.logicnode.' + node.bl_idname[2:] + + prop_names = list(arm.node_utils.get_haxe_property_names(node)) + prop_py_names, prop_hx_names = zip(*prop_names) if len(prop_names) > 0 else ([], []) + prop_values = (getattr(node, prop_name) for prop_name in prop_py_names) + prop_datas = arm.node_utils.haxe_format_socket_val(list(zip(prop_hx_names, prop_values))) + + inp_data = [(inp.arm_socket_type, inp.get_default_value()) for inp in node.inputs] + inp_data = arm.node_utils.haxe_format_socket_val(inp_data) + out_data = [(out.arm_socket_type, out.get_default_value()) for out in node.outputs] + out_data = arm.node_utils.haxe_format_socket_val(out_data) + + js = f'LivePatch.patchNodeCreate("{tree_name}", "{node_name}", "{node_type}", {prop_datas}, {inp_data}, {out_data});' + write_patch(js) + + elif event_id == 'ln_delete': + node: ArmLogicTreeNode = opt_data + + tree_name = arm.node_utils.get_export_tree_name(node.get_tree()) + node_name = arm.node_utils.get_export_node_name(node)[1:] + + js = f'LivePatch.patchNodeDelete("{tree_name}", "{node_name}");' + write_patch(js) + + elif event_id == 'ln_copy': + newnode: ArmLogicTreeNode + node: ArmLogicTreeNode + newnode, node = opt_data + + # Use newnode to get the tree, node has no id_data at this moment + tree_name = arm.node_utils.get_export_tree_name(newnode.get_tree()) + + newnode_name = arm.node_utils.get_export_node_name(newnode)[1:] + node_name = arm.node_utils.get_export_node_name(node)[1:] + + props_list = '[' + ','.join(f'"{p}"' for _, p in arm.node_utils.get_haxe_property_names(node)) + ']' + + inp_data = [(inp.arm_socket_type, inp.get_default_value()) for inp in newnode.inputs] + inp_data = arm.node_utils.haxe_format_socket_val(inp_data) + out_data = [(out.arm_socket_type, out.get_default_value()) for out in newnode.outputs] + out_data = arm.node_utils.haxe_format_socket_val(out_data) + + js = f'LivePatch.patchNodeCopy("{tree_name}", "{node_name}", "{newnode_name}", {props_list}, {inp_data}, {out_data});' + write_patch(js) + + elif event_id == 'ln_update_sockets': + node: ArmLogicTreeNode = opt_data + + tree_name = arm.node_utils.get_export_tree_name(node.get_tree()) + node_name = arm.node_utils.get_export_node_name(node)[1:] + + inp_data = '[' + for idx, inp in enumerate(node.inputs): + inp_data += '{' + # is_linked can be true even if there are no links if the + # user starts dragging a connection away before releasing + # the mouse + if inp.is_linked and len(inp.links) > 0: + inp_data += 'isLinked: true,' + inp_data += f'fromNode: "{arm.node_utils.get_export_node_name(inp.links[0].from_node)[1:]}",' + inp_data += f'fromIndex: {arm.node_utils.get_socket_index(inp.links[0].from_node.outputs, inp.links[0].from_socket)},' + else: + inp_data += 'isLinked: false,' + inp_data += f'socketType: "{inp.arm_socket_type}",' + inp_data += f'socketValue: {arm.node_utils.haxe_format_socket_val(inp.get_default_value())},' + + inp_data += f'toIndex: {idx}' + inp_data += '},' + inp_data += ']' + + out_data = '[' + for idx, out in enumerate(node.outputs): + out_data += '[' + for link in out.links: + out_data += '{' + if out.is_linked: + out_data += 'isLinked: true,' + out_data += f'toNode: "{arm.node_utils.get_export_node_name(link.to_node)[1:]}",' + out_data += f'toIndex: {arm.node_utils.get_socket_index(link.to_node.inputs, link.to_socket)},' + else: + out_data += 'isLinked: false,' + out_data += f'socketType: "{out.arm_socket_type}",' + out_data += f'socketValue: {arm.node_utils.haxe_format_socket_val(out.get_default_value())},' + + out_data += f'fromIndex: {idx}' + out_data += '},' + out_data += '],' + out_data += ']' + + js = f'LivePatch.patchSetNodeLinks("{tree_name}", "{node_name}", {inp_data}, {out_data});' + write_patch(js) + + +def on_operator(operator_id: str): + """As long as bpy.msgbus doesn't listen to changes made by + operators (*), additionally notify the callback manually. + + (*) https://developer.blender.org/T72109 + """ + if not __running: + return + + if operator_id in IGNORE_OPERATORS: + return + + if operator_id == 'TRANSFORM_OT_translate': + send_event('obj_location') + elif operator_id in ('TRANSFORM_OT_rotate', 'TRANSFORM_OT_trackball'): + send_event('obj_rotation') + elif operator_id == 'TRANSFORM_OT_resize': + send_event('obj_scale') + + # Rebuild + else: + patch_export() + + +# Don't re-export the scene for the following operators +IGNORE_OPERATORS = ( + 'ARM_OT_node_add_input', + 'ARM_OT_node_add_input_output', + 'ARM_OT_node_add_input_value', + 'ARM_OT_node_add_output', + 'ARM_OT_node_call_func', + 'ARM_OT_node_remove_input', + 'ARM_OT_node_remove_input_output', + 'ARM_OT_node_remove_input_value', + 'ARM_OT_node_remove_output', + 'ARM_OT_node_search', + + 'NODE_OT_delete', + 'NODE_OT_duplicate_move', + 'NODE_OT_hide_toggle', + 'NODE_OT_link', + 'NODE_OT_move_detach_links', + 'NODE_OT_select', + 'NODE_OT_translate_attach', + 'NODE_OT_translate_attach_remove_on_cancel', + + 'OBJECT_OT_editmode_toggle', + 'OUTLINER_OT_item_activate', + 'UI_OT_button_string_clear', + 'UI_OT_eyedropper_id', + 'VIEW3D_OT_select', + 'VIEW3D_OT_select_box', +) diff --git a/blender/arm/logicnode/animation/LN_action.py b/blender/arm/logicnode/animation/LN_action.py index d156819b..e7913910 100644 --- a/blender/arm/logicnode/animation/LN_action.py +++ b/blender/arm/logicnode/animation/LN_action.py @@ -6,8 +6,7 @@ class AnimActionNode(ArmLogicTreeNode): bl_label = 'Action' arm_version = 1 - def init(self, context): - super(AnimActionNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAnimAction', 'Action') self.add_output('ArmNodeSocketAnimAction', 'Action', is_var=True) diff --git a/blender/arm/logicnode/animation/LN_blend_action.py b/blender/arm/logicnode/animation/LN_blend_action.py index 087301e2..0214e28d 100644 --- a/blender/arm/logicnode/animation/LN_blend_action.py +++ b/blender/arm/logicnode/animation/LN_blend_action.py @@ -6,12 +6,11 @@ class BlendActionNode(ArmLogicTreeNode): bl_label = 'Blend Action' arm_version = 1 - def init(self, context): - super(BlendActionNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Object') self.add_input('ArmNodeSocketAnimAction', 'Action 1') self.add_input('ArmNodeSocketAnimAction', 'Action 2') - self.add_input('NodeSocketFloat', 'Factor', default_value = 0.5) + self.add_input('ArmFloatSocket', 'Factor', default_value = 0.5) self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/animation/LN_bone_fk.py b/blender/arm/logicnode/animation/LN_bone_fk.py index e5aceff7..d994584d 100644 --- a/blender/arm/logicnode/animation/LN_bone_fk.py +++ b/blender/arm/logicnode/animation/LN_bone_fk.py @@ -7,11 +7,10 @@ class BoneFKNode(ArmLogicTreeNode): arm_version = 1 arm_section = 'armature' - def init(self, context): - super(BoneFKNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Object') - self.add_input('NodeSocketString', 'Bone') - self.add_input('NodeSocketShader', 'Transform') + self.add_input('ArmStringSocket', 'Bone') + self.add_input('ArmDynamicSocket', 'Transform') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/animation/LN_bone_ik.py b/blender/arm/logicnode/animation/LN_bone_ik.py index 83a55fc9..66e4d32d 100644 --- a/blender/arm/logicnode/animation/LN_bone_ik.py +++ b/blender/arm/logicnode/animation/LN_bone_ik.py @@ -26,19 +26,17 @@ class BoneIKNode(ArmLogicTreeNode): arm_version = 2 arm_section = 'armature' - def init(self, context): - super(BoneIKNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Object') - self.add_input('NodeSocketString', 'Bone') - self.add_input('NodeSocketVector', 'Goal Position') - self.add_input('NodeSocketBool', 'Enable Pole') - self.add_input('NodeSocketVector', 'Pole Position') - self.add_input('NodeSocketInt', 'Chain Length') - self.add_input('NodeSocketInt', 'Max Iterations', 10) - self.add_input('NodeSocketFloat', 'Precision', 0.01) - self.add_input('NodeSocketFloat', 'Roll Angle') - + self.add_input('ArmStringSocket', 'Bone') + self.add_input('ArmVectorSocket', 'Goal Position') + self.add_input('ArmBoolSocket', 'Enable Pole') + self.add_input('ArmVectorSocket', 'Pole Position') + self.add_input('ArmIntSocket', 'Chain Length') + self.add_input('ArmIntSocket', 'Max Iterations', 10) + self.add_input('ArmFloatSocket', 'Precision', 0.01) + self.add_input('ArmFloatSocket', 'Roll Angle') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/animation/LN_get_action_state.py b/blender/arm/logicnode/animation/LN_get_action_state.py index d2c9f804..1b506613 100644 --- a/blender/arm/logicnode/animation/LN_get_action_state.py +++ b/blender/arm/logicnode/animation/LN_get_action_state.py @@ -6,10 +6,9 @@ class AnimationStateNode(ArmLogicTreeNode): bl_label = 'Get Action State' arm_version = 1 - def init(self, context): - super(AnimationStateNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketObject', 'Object') - self.add_output('NodeSocketString', 'Action') - self.add_output('NodeSocketInt', 'Frame') - self.add_output('NodeSocketBool', 'Is Paused') + self.add_output('ArmStringSocket', 'Action') + self.add_output('ArmIntSocket', 'Frame') + self.add_output('ArmBoolSocket', 'Is Paused') diff --git a/blender/arm/logicnode/animation/LN_get_bone_fk_ik_only.py b/blender/arm/logicnode/animation/LN_get_bone_fk_ik_only.py index 165b946d..21afb1ee 100644 --- a/blender/arm/logicnode/animation/LN_get_bone_fk_ik_only.py +++ b/blender/arm/logicnode/animation/LN_get_bone_fk_ik_only.py @@ -7,8 +7,7 @@ class GetBoneFkIkOnlyNode(ArmLogicTreeNode): arm_version = 1 arm_section = 'armature' - def init(self, context): - super(GetBoneFkIkOnlyNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketObject', 'Object') - self.add_input('NodeSocketString', 'Bone') - self.add_output('NodeSocketBool', 'FK or IK only') \ No newline at end of file + self.add_input('ArmStringSocket', 'Bone') + self.add_output('ArmBoolSocket', 'FK or IK only') diff --git a/blender/arm/logicnode/animation/LN_get_bone_transform.py b/blender/arm/logicnode/animation/LN_get_bone_transform.py index 0d21ea23..1ce69e7a 100644 --- a/blender/arm/logicnode/animation/LN_get_bone_transform.py +++ b/blender/arm/logicnode/animation/LN_get_bone_transform.py @@ -7,8 +7,7 @@ class GetBoneTransformNode(ArmLogicTreeNode): arm_version = 1 arm_section = 'armature' - def init(self, context): - super(GetBoneTransformNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketObject', 'Object') - self.add_input('NodeSocketString', 'Bone') - self.add_output('NodeSocketShader', 'Transform') \ No newline at end of file + self.add_input('ArmStringSocket', 'Bone') + self.add_output('ArmDynamicSocket', 'Transform') diff --git a/blender/arm/logicnode/animation/LN_get_tilesheet_state.py b/blender/arm/logicnode/animation/LN_get_tilesheet_state.py index b32e7d25..09adee81 100644 --- a/blender/arm/logicnode/animation/LN_get_tilesheet_state.py +++ b/blender/arm/logicnode/animation/LN_get_tilesheet_state.py @@ -7,10 +7,9 @@ class GetTilesheetStateNode(ArmLogicTreeNode): arm_version = 1 arm_section = 'tilesheet' - def init(self, context): - super(GetTilesheetStateNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketObject', 'Object') - self.add_output('NodeSocketString', 'Name') - self.add_output('NodeSocketInt', 'Frame') - self.add_output('NodeSocketBool', 'Is Paused') + self.add_output('ArmStringSocket', 'Name') + self.add_output('ArmIntSocket', 'Frame') + self.add_output('ArmBoolSocket', 'Is Paused') diff --git a/blender/arm/logicnode/animation/LN_on_action_marker.py b/blender/arm/logicnode/animation/LN_on_action_marker.py index a935015b..07c4e690 100644 --- a/blender/arm/logicnode/animation/LN_on_action_marker.py +++ b/blender/arm/logicnode/animation/LN_on_action_marker.py @@ -6,9 +6,8 @@ class OnActionMarkerNode(ArmLogicTreeNode): bl_label = 'On Action Marker' arm_version = 1 - def init(self, context): - super(OnActionMarkerNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketObject', 'Object') - self.add_input('NodeSocketString', 'Marker') + self.add_input('ArmStringSocket', 'Marker') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/animation/LN_play_action_from.py b/blender/arm/logicnode/animation/LN_play_action_from.py index b28221c1..31a218ea 100644 --- a/blender/arm/logicnode/animation/LN_play_action_from.py +++ b/blender/arm/logicnode/animation/LN_play_action_from.py @@ -6,15 +6,14 @@ class PlayActionFromNode(ArmLogicTreeNode): bl_label = 'Play Action From' arm_version = 2 - def init(self, context): - super(PlayActionFromNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Object') self.add_input('ArmNodeSocketAnimAction', 'Action') - self.add_input('NodeSocketInt', 'Start Frame') - self.add_input('NodeSocketFloat', 'Blend', default_value = 0.25) - self.add_input('NodeSocketFloat', 'Speed', default_value = 1.0) - self.add_input('NodeSocketBool', 'Loop', default_value = False) + self.add_input('ArmIntSocket', 'Start Frame') + self.add_input('ArmFloatSocket', 'Blend', default_value = 0.25) + self.add_input('ArmFloatSocket', 'Speed', default_value = 1.0) + self.add_input('ArmBoolSocket', 'Loop', default_value = False) self.add_output('ArmNodeSocketAction', 'Out') self.add_output('ArmNodeSocketAction', 'Done') @@ -22,7 +21,7 @@ class PlayActionFromNode(ArmLogicTreeNode): def get_replacement_node(self, node_tree: bpy.types.NodeTree): if self.arm_version not in (0, 1): raise LookupError() - + return NodeReplacement( 'LNPlayActionFromNode', self.arm_version, 'LNPlayActionFromNode', 2, in_socket_mapping={0:0, 1:1, 2:2, 3:3, 4:4}, out_socket_mapping={0:0, 1:1} diff --git a/blender/arm/logicnode/animation/LN_play_tilesheet.py b/blender/arm/logicnode/animation/LN_play_tilesheet.py index 533231d8..6e008f9e 100644 --- a/blender/arm/logicnode/animation/LN_play_tilesheet.py +++ b/blender/arm/logicnode/animation/LN_play_tilesheet.py @@ -7,11 +7,10 @@ class PlayTilesheetNode(ArmLogicTreeNode): arm_version = 1 arm_section = 'tilesheet' - def init(self, context): - super(PlayTilesheetNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Object') - self.add_input('NodeSocketString', 'Name') + self.add_input('ArmStringSocket', 'Name') self.add_output('ArmNodeSocketAction', 'Out') self.add_output('ArmNodeSocketAction', 'Done') diff --git a/blender/arm/logicnode/animation/LN_set_action_paused.py b/blender/arm/logicnode/animation/LN_set_action_paused.py index 6bdb5535..6c994959 100644 --- a/blender/arm/logicnode/animation/LN_set_action_paused.py +++ b/blender/arm/logicnode/animation/LN_set_action_paused.py @@ -6,10 +6,9 @@ class SetActionPausedNode(ArmLogicTreeNode): bl_label = 'Set Action Paused' arm_version = 1 - def init(self, context): - super(SetActionPausedNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Object') - self.add_input('NodeSocketBool', 'Paused') + self.add_input('ArmBoolSocket', 'Paused') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/animation/LN_set_action_speed.py b/blender/arm/logicnode/animation/LN_set_action_speed.py index c01fdd00..e90cec67 100644 --- a/blender/arm/logicnode/animation/LN_set_action_speed.py +++ b/blender/arm/logicnode/animation/LN_set_action_speed.py @@ -6,10 +6,9 @@ class SetActionSpeedNode(ArmLogicTreeNode): bl_label = 'Set Action Speed' arm_version = 1 - def init(self, context): - super(SetActionSpeedNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Object') - self.add_input('NodeSocketFloat', 'Speed', default_value=1.0) + self.add_input('ArmFloatSocket', 'Speed', default_value=1.0) self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/animation/LN_set_bone_fk_ik_only.py b/blender/arm/logicnode/animation/LN_set_bone_fk_ik_only.py index 2594183a..8ed6ce45 100644 --- a/blender/arm/logicnode/animation/LN_set_bone_fk_ik_only.py +++ b/blender/arm/logicnode/animation/LN_set_bone_fk_ik_only.py @@ -7,11 +7,10 @@ class SetBoneFkIkOnlyNode(ArmLogicTreeNode): arm_version = 1 arm_section = 'armature' - def init(self, context): - super(SetBoneFkIkOnlyNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Object') - self.add_input('NodeSocketString', 'Bone') - self.add_input('NodeSocketBool', 'FK or IK only') + self.add_input('ArmStringSocket', 'Bone') + self.add_input('ArmBoolSocket', 'FK or IK only') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/animation/LN_set_parent_bone.py b/blender/arm/logicnode/animation/LN_set_parent_bone.py index fb954610..5aa686e3 100644 --- a/blender/arm/logicnode/animation/LN_set_parent_bone.py +++ b/blender/arm/logicnode/animation/LN_set_parent_bone.py @@ -7,11 +7,10 @@ class SetParentBoneNode(ArmLogicTreeNode): arm_version = 1 arm_section = 'armature' - def init(self, context): - super(SetParentBoneNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Object') self.add_input('ArmNodeSocketObject', 'Parent', default_value='Parent') - self.add_input('NodeSocketString', 'Bone', default_value='Bone') + self.add_input('ArmStringSocket', 'Bone', default_value='Bone') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/animation/LN_set_particle_speed.py b/blender/arm/logicnode/animation/LN_set_particle_speed.py index 272a11f3..2fe92ee4 100644 --- a/blender/arm/logicnode/animation/LN_set_particle_speed.py +++ b/blender/arm/logicnode/animation/LN_set_particle_speed.py @@ -6,10 +6,9 @@ class SetParticleSpeedNode(ArmLogicTreeNode): bl_label = 'Set Particle Speed' arm_version = 1 - def init(self, context): - super(SetParticleSpeedNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Object') - self.add_input('NodeSocketFloat', 'Speed', default_value=1.0) + self.add_input('ArmFloatSocket', 'Speed', default_value=1.0) self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/animation/LN_set_tilesheet_paused.py b/blender/arm/logicnode/animation/LN_set_tilesheet_paused.py index 06322ad7..393a259f 100644 --- a/blender/arm/logicnode/animation/LN_set_tilesheet_paused.py +++ b/blender/arm/logicnode/animation/LN_set_tilesheet_paused.py @@ -7,10 +7,9 @@ class SetTilesheetPausedNode(ArmLogicTreeNode): arm_section = 'tilesheet' arm_version = 1 - def init(self, context): - super(SetTilesheetPausedNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Object') - self.add_input('NodeSocketBool', 'Paused') + self.add_input('ArmBoolSocket', 'Paused') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/arm_nodes.py b/blender/arm/logicnode/arm_nodes.py index 7582f966..85ae3730 100644 --- a/blender/arm/logicnode/arm_nodes.py +++ b/blender/arm/logicnode/arm_nodes.py @@ -1,13 +1,16 @@ import itertools from collections import OrderedDict -from typing import Any, Generator, List, Optional, Type, Dict +from typing import Any, Generator, List, Optional, Type from typing import OrderedDict as ODict # Prevent naming conflicts import bpy.types from bpy.props import * from nodeitems_utils import NodeItem -# Pass NodeReplacment forward to individual node modules that import arm_nodes +import arm # we cannot import arm.livepatch here or we have a circular import +# Pass custom property types and NodeReplacement forward to individual +# node modules that import arm_nodes +from arm.logicnode.arm_props import * from arm.logicnode.replacement import NodeReplacement import arm.node_utils @@ -21,6 +24,10 @@ category_items: ODict[str, List['ArmNodeCategory']] = OrderedDict() array_nodes = dict() +# See ArmLogicTreeNode.update() +# format: [tree pointer => (num inputs, num input links, num outputs, num output links)] +last_node_state: dict[int, tuple[int, int, int, int]] = {} + class ArmLogicTreeNode(bpy.types.Node): arm_category = PKG_AS_CATEGORY @@ -34,6 +41,14 @@ class ArmLogicTreeNode(bpy.types.Node): else: self.arm_version = 1 + if not hasattr(self, 'arm_init'): + # Show warning for older node packages + arm.log.warn(f'Node {self.bl_idname} has no arm_init function and might not work correctly!') + else: + self.arm_init(context) + + arm.live_patch.send_event('ln_create', self) + @classmethod def poll(cls, ntree): return ntree.bl_idname == 'ArmLogicTreeType' @@ -48,6 +63,68 @@ class ArmLogicTreeNode(bpy.types.Node): def on_unregister(cls): pass + def get_tree(self): + return self.id_data + + def update(self): + """Called if the node was updated in some way, for example + if socket connections change. This callback is not called if + socket values were changed. + """ + def num_connected(sockets): + return sum([socket.is_linked for socket in sockets]) + + # If a link between sockets is removed, there is currently no + # _reliable_ way in the Blender API to check which connection + # was removed (*). + # + # So instead we just check _if_ the number of links or sockets + # has changed (the update function is called before and after + # each link removal). Because we listen for those updates in + # general, we automatically also listen to link creation events, + # which is more stable than using the dedicated callback for + # that (`insert_link()`), because adding links can remove other + # links and we would need to react to that as well. + # + # (*) https://devtalk.blender.org/t/how-to-detect-which-link-was-deleted-by-user-in-node-editor + + self_id = self.as_pointer() + + current_state = (len(self.inputs), num_connected(self.inputs), len(self.outputs), num_connected(self.outputs)) + if self_id not in last_node_state: + # Lazily initialize the last_node_state dict to also store + # state for nodes that already exist in the tree + last_node_state[self_id] = current_state + + if last_node_state[self_id] != current_state: + arm.live_patch.send_event('ln_update_sockets', self) + last_node_state[self_id] = current_state + + def free(self): + """Called before the node is deleted.""" + arm.live_patch.send_event('ln_delete', self) + + def copy(self, node): + """Called if the node was copied. `self` holds the copied node, + `node` the original one. + """ + arm.live_patch.send_event('ln_copy', (self, node)) + + def on_prop_update(self, context: bpy.types.Context, prop_name: str): + """Called if a property created with a function from the + arm_props module is changed. If the property has a custom update + function, it is called before `on_prop_update()`. + """ + arm.live_patch.send_event('ln_update_prop', (self, prop_name)) + + def on_socket_val_update(self, context: bpy.types.Context, socket: bpy.types.NodeSocket): + arm.live_patch.send_event('ln_socket_val', (self, socket)) + + def insert_link(self, link: bpy.types.NodeLink): + """Called on *both* nodes when a link between two nodes is created.""" + # arm.live_patch.send_event('ln_insert_link', (self, link)) + pass + def get_replacement_node(self, node_tree: bpy.types.NodeTree): # needs to be overridden by individual node classes with arm_version>1 """(only called if the node's version is inferior to the node class's version) @@ -115,7 +192,7 @@ class ArmNodeAddInputButton(bpy.types.Operator): bl_options = {'UNDO', 'INTERNAL'} node_index: StringProperty(name='Node Index', default='') - socket_type: StringProperty(name='Socket Type', default='NodeSocketShader') + socket_type: StringProperty(name='Socket Type', default='ArmDynamicSocket') name_format: StringProperty(name='Name Format', default='Input {0}') index_name_offset: IntProperty(name='Index Name Offset', default=0) @@ -126,7 +203,7 @@ class ArmNodeAddInputButton(bpy.types.Operator): # Reset to default again for subsequent calls of this operator self.node_index = '' - self.socket_type = 'NodeSocketShader' + self.socket_type = 'ArmDynamicSocket' self.name_format = 'Input {0}' self.index_name_offset = 0 @@ -138,7 +215,7 @@ class ArmNodeAddInputValueButton(bpy.types.Operator): bl_label = 'Add Input' bl_options = {'UNDO', 'INTERNAL'} node_index: StringProperty(name='Node Index', default='') - socket_type: StringProperty(name='Socket Type', default='NodeSocketShader') + socket_type: StringProperty(name='Socket Type', default='ArmDynamicSocket') def execute(self, context): global array_nodes @@ -185,7 +262,7 @@ class ArmNodeAddOutputButton(bpy.types.Operator): bl_options = {'UNDO', 'INTERNAL'} node_index: StringProperty(name='Node Index', default='') - socket_type: StringProperty(name='Socket Type', default='NodeSocketShader') + socket_type: StringProperty(name='Socket Type', default='ArmDynamicSocket') name_format: StringProperty(name='Name Format', default='Output {0}') index_name_offset: IntProperty(name='Index Name Offset', default=0) @@ -196,7 +273,7 @@ class ArmNodeAddOutputButton(bpy.types.Operator): # Reset to default again for subsequent calls of this operator self.node_index = '' - self.socket_type = 'NodeSocketShader' + self.socket_type = 'ArmDynamicSocket' self.name_format = 'Output {0}' self.index_name_offset = 0 @@ -225,8 +302,8 @@ class ArmNodeAddInputOutputButton(bpy.types.Operator): bl_options = {'UNDO', 'INTERNAL'} node_index: StringProperty(name='Node Index', default='') - in_socket_type: StringProperty(name='In Socket Type', default='NodeSocketShader') - out_socket_type: StringProperty(name='Out Socket Type', default='NodeSocketShader') + in_socket_type: StringProperty(name='In Socket Type', default='ArmDynamicSocket') + out_socket_type: StringProperty(name='Out Socket Type', default='ArmDynamicSocket') in_name_format: StringProperty(name='In Name Format', default='Input {0}') out_name_format: StringProperty(name='Out Name Format', default='Output {0}') in_index_name_offset: IntProperty(name='Index Name Offset', default=0) @@ -241,8 +318,8 @@ class ArmNodeAddInputOutputButton(bpy.types.Operator): # Reset to default again for subsequent calls of this operator self.node_index = '' - self.in_socket_type = 'NodeSocketShader' - self.out_socket_type = 'NodeSocketShader' + self.in_socket_type = 'ArmDynamicSocket' + self.out_socket_type = 'ArmDynamicSocket' self.in_name_format = 'Input {0}' self.out_name_format = 'Output {0}' self.in_index_name_offset = 0 diff --git a/blender/arm/logicnode/arm_props.py b/blender/arm/logicnode/arm_props.py new file mode 100644 index 00000000..1a32cb28 --- /dev/null +++ b/blender/arm/logicnode/arm_props.py @@ -0,0 +1,267 @@ +"""Custom bpy property creators for logic nodes. Please be aware that +the code in this file is usually run once at registration and not for +each individual node instance when it is created. + +The functions for creating typed properties wrap the private __haxe_prop +function to allow for IDE autocompletion. + +Some default parameters in the signature of functions in this module are +mutable (common Python pitfall, be aware of this!), but because they +don't get accessed later it doesn't matter here and we keep it this way +for parity with the Blender API. +""" +from typing import Any, Callable, Sequence, Union + +import bpy +from bpy.props import * + + +def __haxe_prop(prop_type: Callable, prop_name: str, *args, **kwargs) -> Any: + """Declares a logic node property as a property that will be + used ingame for a logic node.""" + update_callback: Callable = kwargs.get('update', None) + if update_callback is None: + def wrapper(self: bpy.types.Node, context: bpy.types.Context): + self.on_prop_update(context, prop_name) + kwargs['update'] = wrapper + else: + def wrapper(self: bpy.types.Node, context: bpy.types.Context): + update_callback(self, context) + self.on_prop_update(context, prop_name) + kwargs['update'] = wrapper + + # Tags are not allowed on classes other than bpy.types.ID or + # bpy.types.Bone, remove them here to prevent registration errors + if 'tags' in kwargs: + del kwargs['tags'] + + return prop_type(*args, **kwargs) + + +def HaxeBoolProperty( + prop_name: str, + *, # force passing further arguments as keywords, see PEP 3102 + name: str = "", + description: str = "", + default=False, + options: set = {'ANIMATABLE'}, + override: set = set(), + tags: set = set(), + subtype: str = 'NONE', + update=None, + get=None, + set=None +) -> 'bpy.types.BoolProperty': + """Declares a new BoolProperty that has a Haxe counterpart with the + given prop_name (Python and Haxe names must be identical for now). + """ + return __haxe_prop(BoolProperty, **locals()) + + +def HaxeBoolVectorProperty( + prop_name: str, + *, + name: str = "", + description: str = "", + default: list = (False, False, False), + options: set = {'ANIMATABLE'}, + override: set = set(), + tags: set = set(), + subtype: str = 'NONE', + size: int = 3, + update=None, + get=None, + set=None +) -> list['bpy.types.BoolProperty']: + """Declares a new BoolVectorProperty that has a Haxe counterpart + with the given prop_name (Python and Haxe names must be identical + for now). + """ + return __haxe_prop(BoolVectorProperty, **locals()) + + +def HaxeCollectionProperty( + prop_name: str, + *, + type=None, + name: str = "", + description: str = "", + options: set = {'ANIMATABLE'}, + override: set = set(), + tags: set = set() +) -> 'bpy.types.CollectionProperty': + """Declares a new CollectionProperty that has a Haxe counterpart + with the given prop_name (Python and Haxe names must be identical + for now). + """ + return __haxe_prop(CollectionProperty, **locals()) + + +def HaxeEnumProperty( + prop_name: str, + *, + items: Sequence, + name: str = "", + description: str = "", + default: Union[str, set[str]] = None, + options: set = {'ANIMATABLE'}, + override: set = set(), + tags: set = set(), + update=None, + get=None, + set=None +) -> 'bpy.types.EnumProperty': + """Declares a new EnumProperty that has a Haxe counterpart with the + given prop_name (Python and Haxe names must be identical for now). + """ + return __haxe_prop(EnumProperty, **locals()) + + +def HaxeFloatProperty( + prop_name: str, + *, + name: str = "", + description: str = "", + default=0.0, + min: float = -3.402823e+38, + max: float = 3.402823e+38, + soft_min: float = -3.402823e+38, + soft_max: float = 3.402823e+38, + step: int = 3, + precision: int = 2, + options: set = {'ANIMATABLE'}, + override: set = set(), + tags: set = set(), + subtype: str = 'NONE', + unit: str = 'NONE', + update=None, + get=None, + set=None +) -> 'bpy.types.FloatProperty': + """Declares a new FloatProperty that has a Haxe counterpart with the + given prop_name (Python and Haxe names must be identical for now). + """ + return __haxe_prop(FloatProperty, **locals()) + + +def HaxeFloatVectorProperty( + prop_name: str, + *, + name: str = "", + description: str = "", + default: list = (0.0, 0.0, 0.0), + min: float = 'sys.float_info.min', + max: float = 'sys.float_info.max', + soft_min: float = 'sys.float_info.min', + soft_max: float = 'sys.float_info.max', + step: int = 3, + precision: int = 2, + options: set = {'ANIMATABLE'}, + override: set = set(), + tags: set = set(), + subtype: str = 'NONE', + unit: str = 'NONE', + size: int = 3, + update=None, + get=None, + set=None +) -> list['bpy.types.FloatProperty']: + """Declares a new FloatVectorProperty that has a Haxe counterpart + with the given prop_name (Python and Haxe names must be identical + for now). + """ + return __haxe_prop(FloatVectorProperty, **locals()) + + +def HaxeIntProperty( + prop_name: str, + *, + name: str = "", + description: str = "", + default=0, + min: int = -2**31, + max: int = 2**31 - 1, + soft_min: int = -2**31, + soft_max: int = 2**31 - 1, + step: int = 1, + options: set = {'ANIMATABLE'}, + override: set = set(), + tags: set = set(), + subtype: str = 'NONE', + update=None, + get=None, + set=None +) -> 'bpy.types.IntProperty': + """Declares a new IntProperty that has a Haxe counterpart with the + given prop_name (Python and Haxe names must be identical for now). + """ + return __haxe_prop(IntProperty, **locals()) + + +def HaxeIntVectorProperty( + prop_name: str, + *, + name: str = "", + description: str = "", + default: list = (0, 0, 0), + min: int = -2**31, + max: int = 2**31 - 1, + soft_min: int = -2**31, + soft_max: int = 2**31 - 1, + step: int = 1, + options: set = {'ANIMATABLE'}, + override: set = set(), + tags: set = set(), + subtype: str = 'NONE', + size: int = 3, + update=None, + get=None, + set=None +) -> list['bpy.types.IntProperty']: + """Declares a new IntVectorProperty that has a Haxe counterpart with + the given prop_name (Python and Haxe names must be identical for now). + """ + return __haxe_prop(IntVectorProperty, **locals()) + + +def HaxePointerProperty( + prop_name: str, + *, + type=None, + name: str = "", + description: str = "", + options: set = {'ANIMATABLE'}, + override: set = set(), + tags: set = set(), + poll=None, + update=None +) -> 'bpy.types.PointerProperty': + """Declares a new PointerProperty that has a Haxe counterpart with + the given prop_name (Python and Haxe names must be identical for now). + """ + return __haxe_prop(PointerProperty, **locals()) + + +def RemoveHaxeProperty(cls, attr: str): + RemoveProperty(cls, attr) + + +def HaxeStringProperty( + prop_name: str, + *, + name: str = "", + description: str = "", + default: str = "", + maxlen: int = 0, + options: set = {'ANIMATABLE'}, + override: set = set(), + tags: set = set(), + subtype: str = 'NONE', + update=None, + get=None, + set=None +) -> 'bpy.types.StringProperty': + """Declares a new StringProperty that has a Haxe counterpart with + the given prop_name (Python and Haxe names must be identical for now). + """ + return __haxe_prop(StringProperty, **locals()) diff --git a/blender/arm/logicnode/arm_sockets.py b/blender/arm/logicnode/arm_sockets.py index 91f98476..58f2ea70 100644 --- a/blender/arm/logicnode/arm_sockets.py +++ b/blender/arm/logicnode/arm_sockets.py @@ -1,10 +1,14 @@ import bpy -from bpy.props import PointerProperty +from bpy.props import * from bpy.types import NodeSocket import arm.utils +def _on_update_socket(self, context): + self.node.on_socket_val_update(context, self) + + class ArmCustomSocket(NodeSocket): """ A custom socket that can be used to define more socket types for @@ -41,7 +45,7 @@ class ArmAnimActionSocket(ArmCustomSocket): arm_socket_type = 'STRING' default_value_get: PointerProperty(name='Action', type=bpy.types.Action) # legacy version of the line after this one - default_value_raw: PointerProperty(name='Action', type=bpy.types.Action) + default_value_raw: PointerProperty(name='Action', type=bpy.types.Action, update=_on_update_socket) def __init__(self): super().__init__() @@ -81,13 +85,114 @@ class ArmArraySocket(ArmCustomSocket): return 0.8, 0.4, 0.0, 1 +class ArmBoolSocket(ArmCustomSocket): + bl_idname = 'ArmBoolSocket' + bl_label = 'Boolean Socket' + arm_socket_type = 'BOOLEAN' + + default_value_raw: BoolProperty( + name='Value', + description='Input value used for unconnected socket', + update=_on_update_socket + ) + + def draw(self, context, layout, node, text): + draw_socket_layout(self, layout) + + def draw_color(self, context, node): + return 0.8, 0.651, 0.839, 1 + + def get_default_value(self): + return self.default_value_raw + + +class ArmColorSocket(ArmCustomSocket): + bl_idname = 'ArmColorSocket' + bl_label = 'Color Socket' + arm_socket_type = 'RGBA' + + default_value_raw: FloatVectorProperty( + name='Value', + size=4, + subtype='COLOR', + min=0.0, + max=1.0, + description='Input value used for unconnected socket', + update=_on_update_socket + ) + + def draw(self, context, layout, node, text): + draw_socket_layout(self, layout) + + def draw_color(self, context, node): + return 0.78, 0.78, 0.161, 1 + + def get_default_value(self): + return self.default_value_raw + + +class ArmDynamicSocket(ArmCustomSocket): + bl_idname = 'ArmDynamicSocket' + bl_label = 'Dynamic Socket' + arm_socket_type = 'NONE' + + def draw(self, context, layout, node, text): + layout.label(text=self.name) + + def draw_color(self, context, node): + return 0.388, 0.78, 0.388, 1 + + +class ArmFloatSocket(ArmCustomSocket): + bl_idname = 'ArmFloatSocket' + bl_label = 'Float Socket' + arm_socket_type = 'VALUE' + + default_value_raw: FloatProperty( + name='Value', + description='Input value used for unconnected socket', + precision=3, + update=_on_update_socket + ) + + def draw(self, context, layout, node, text): + draw_socket_layout(self, layout) + + def draw_color(self, context, node): + return 0.631, 0.631, 0.631, 1 + + def get_default_value(self): + return self.default_value_raw + + +class ArmIntSocket(ArmCustomSocket): + bl_idname = 'ArmIntSocket' + bl_label = 'Integer Socket' + arm_socket_type = 'INT' + + default_value_raw: IntProperty( + name='Value', + description='Input value used for unconnected socket', + update=_on_update_socket + ) + + def draw(self, context, layout, node, text): + draw_socket_layout(self, layout) + + def draw_color(self, context, node): + return 0.059, 0.522, 0.149, 1 + + def get_default_value(self): + return self.default_value_raw + + class ArmObjectSocket(ArmCustomSocket): bl_idname = 'ArmNodeSocketObject' bl_label = 'Object Socket' arm_socket_type = 'OBJECT' default_value_get: PointerProperty(name='Object', type=bpy.types.Object) # legacy version of the line after this one - default_value_raw: PointerProperty(name='Object', type=bpy.types.Object) + default_value_raw: PointerProperty(name='Object', type=bpy.types.Object, update=_on_update_socket) def __init__(self): super().__init__() @@ -115,15 +220,82 @@ class ArmObjectSocket(ArmCustomSocket): return 0.15, 0.55, 0.75, 1 -def register(): - bpy.utils.register_class(ArmActionSocket) - bpy.utils.register_class(ArmAnimActionSocket) - bpy.utils.register_class(ArmArraySocket) - bpy.utils.register_class(ArmObjectSocket) +class ArmStringSocket(ArmCustomSocket): + bl_idname = 'ArmStringSocket' + bl_label = 'String Socket' + arm_socket_type = 'STRING' + + default_value_raw: StringProperty( + name='Value', + description='Input value used for unconnected socket', + update=_on_update_socket + ) + + def draw(self, context, layout, node, text): + draw_socket_layout_split(self, layout) + + def draw_color(self, context, node): + return 0.439, 0.698, 1, 1 + + def get_default_value(self): + return self.default_value_raw -def unregister(): - bpy.utils.unregister_class(ArmObjectSocket) - bpy.utils.unregister_class(ArmArraySocket) - bpy.utils.unregister_class(ArmAnimActionSocket) - bpy.utils.unregister_class(ArmActionSocket) +class ArmVectorSocket(ArmCustomSocket): + bl_idname = 'ArmVectorSocket' + bl_label = 'Vector Socket' + arm_socket_type = 'VECTOR' + + default_value_raw: FloatVectorProperty( + name='Value', + size=3, + description='Input value used for unconnected socket', + update=_on_update_socket + ) + + def draw(self, context, layout, node, text): + if not self.is_output and not self.is_linked: + col = layout.column(align=True) + col.prop(self, 'default_value_raw', text='') + else: + layout.label(text=self.name) + + def draw_color(self, context, node): + return 0.388, 0.388, 0.78, 1 + + def get_default_value(self): + return self.default_value_raw + + +def draw_socket_layout(socket: bpy.types.NodeSocket, layout: bpy.types.UILayout, prop_name='default_value_raw'): + if not socket.is_output and not socket.is_linked: + layout.prop(socket, prop_name, text=socket.name) + else: + layout.label(text=socket.name) + + +def draw_socket_layout_split(socket: bpy.types.NodeSocket, layout: bpy.types.UILayout, prop_name='default_value_raw'): + if not socket.is_output and not socket.is_linked: + # Blender layouts use 0.4 splits + layout = layout.split(factor=0.4, align=True) + + layout.label(text=socket.name) + + if not socket.is_output and not socket.is_linked: + layout.prop(socket, prop_name, text='') + + +REG_CLASSES = ( + ArmActionSocket, + ArmAnimActionSocket, + ArmArraySocket, + ArmBoolSocket, + ArmColorSocket, + ArmDynamicSocket, + ArmFloatSocket, + ArmIntSocket, + ArmObjectSocket, + ArmStringSocket, + ArmVectorSocket, +) +register, unregister = bpy.utils.register_classes_factory(REG_CLASSES) diff --git a/blender/arm/logicnode/array/LN_array.py b/blender/arm/logicnode/array/LN_array.py index cb5cb451..65473756 100644 --- a/blender/arm/logicnode/array/LN_array.py +++ b/blender/arm/logicnode/array/LN_array.py @@ -10,17 +10,16 @@ class ArrayNode(ArmLogicTreeNode): def __init__(self): array_nodes[str(id(self))] = self - def init(self, context): - super(ArrayNode, self).init(context) + def arm_init(self, context): self.add_output('ArmNodeSocketArray', 'Array', is_var=True) - self.add_output('NodeSocketInt', 'Length') + self.add_output('ArmIntSocket', 'Length') def draw_buttons(self, context, layout): row = layout.row(align=True) op = row.operator('arm.node_add_input', text='New', icon='PLUS', emboss=True) op.node_index = str(id(self)) - op.socket_type = 'NodeSocketShader' + op.socket_type = 'ArmDynamicSocket' op2 = row.operator('arm.node_remove_input', text='', icon='X', emboss=True) op2.node_index = str(id(self)) diff --git a/blender/arm/logicnode/array/LN_array_add.py b/blender/arm/logicnode/array/LN_array_add.py index 3bd708ea..0fc31a6d 100644 --- a/blender/arm/logicnode/array/LN_array_add.py +++ b/blender/arm/logicnode/array/LN_array_add.py @@ -15,13 +15,12 @@ class ArrayAddNode(ArmLogicTreeNode): super(ArrayAddNode, self).__init__() array_nodes[str(id(self))] = self - def init(self, context): - super(ArrayAddNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketArray', 'Array') - self.add_input('NodeSocketBool', 'Modify Original', default_value=True) - self.add_input('NodeSocketBool', 'Unique Values') - self.add_input('NodeSocketShader', 'Value') + self.add_input('ArmBoolSocket', 'Modify Original', default_value=True) + self.add_input('ArmBoolSocket', 'Unique Values') + self.add_input('ArmDynamicSocket', 'Value') self.add_output('ArmNodeSocketAction', 'Out') self.add_output('ArmNodeSocketArray', 'Array') @@ -31,6 +30,6 @@ class ArrayAddNode(ArmLogicTreeNode): op = row.operator('arm.node_add_input_value', text='Add Input', icon='PLUS', emboss=True) op.node_index = str(id(self)) - op.socket_type = 'NodeSocketShader' + op.socket_type = 'ArmDynamicSocket' op2 = row.operator('arm.node_remove_input_value', text='', icon='X', emboss=True) op2.node_index = str(id(self)) diff --git a/blender/arm/logicnode/array/LN_array_boolean.py b/blender/arm/logicnode/array/LN_array_boolean.py index 6794a57e..7c0b333d 100644 --- a/blender/arm/logicnode/array/LN_array_boolean.py +++ b/blender/arm/logicnode/array/LN_array_boolean.py @@ -11,17 +11,16 @@ class BooleanArrayNode(ArmLogicTreeNode): super(BooleanArrayNode, self).__init__() array_nodes[str(id(self))] = self - def init(self, context): - super(BooleanArrayNode, self).init(context) + def arm_init(self, context): self.add_output('ArmNodeSocketArray', 'Array', is_var=True) - self.add_output('NodeSocketInt', 'Length') + self.add_output('ArmIntSocket', 'Length') def draw_buttons(self, context, layout): row = layout.row(align=True) op = row.operator('arm.node_add_input', text='New', icon='PLUS', emboss=True) op.node_index = str(id(self)) - op.socket_type = 'NodeSocketBool' + op.socket_type = 'ArmBoolSocket' op2 = row.operator('arm.node_remove_input', text='', icon='X', emboss=True) op2.node_index = str(id(self)) diff --git a/blender/arm/logicnode/array/LN_array_color.py b/blender/arm/logicnode/array/LN_array_color.py index f2066440..148fd2da 100644 --- a/blender/arm/logicnode/array/LN_array_color.py +++ b/blender/arm/logicnode/array/LN_array_color.py @@ -11,17 +11,16 @@ class ColorArrayNode(ArmLogicTreeNode): super(ColorArrayNode, self).__init__() array_nodes[str(id(self))] = self - def init(self, context): - super(ColorArrayNode, self).init(context) + def arm_init(self, context): self.add_output('ArmNodeSocketArray', 'Array', is_var=True) - self.add_output('NodeSocketInt', 'Length') + self.add_output('ArmIntSocket', 'Length') def draw_buttons(self, context, layout): row = layout.row(align=True) op = row.operator('arm.node_add_input', text='New', icon='PLUS', emboss=True) op.node_index = str(id(self)) - op.socket_type = 'NodeSocketColor' + op.socket_type = 'ArmColorSocket' op2 = row.operator('arm.node_remove_input', text='', icon='X', emboss=True) op2.node_index = str(id(self)) diff --git a/blender/arm/logicnode/array/LN_array_contains.py b/blender/arm/logicnode/array/LN_array_contains.py index a9a3e463..c81ec46a 100644 --- a/blender/arm/logicnode/array/LN_array_contains.py +++ b/blender/arm/logicnode/array/LN_array_contains.py @@ -6,9 +6,8 @@ class ArrayContainsNode(ArmLogicTreeNode): bl_label = 'Array Contains' arm_version = 1 - def init(self, context): - super(ArrayContainsNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketArray', 'Array') - self.add_input('NodeSocketShader', 'Value') + self.add_input('ArmDynamicSocket', 'Value') - self.add_output('NodeSocketBool', 'Contains') + self.add_output('ArmBoolSocket', 'Contains') diff --git a/blender/arm/logicnode/array/LN_array_float.py b/blender/arm/logicnode/array/LN_array_float.py index 1eeaf132..2c3ec3d8 100644 --- a/blender/arm/logicnode/array/LN_array_float.py +++ b/blender/arm/logicnode/array/LN_array_float.py @@ -11,17 +11,16 @@ class FloatArrayNode(ArmLogicTreeNode): super(FloatArrayNode, self).__init__() array_nodes[str(id(self))] = self - def init(self, context): - super(FloatArrayNode, self).init(context) + def arm_init(self, context): self.add_output('ArmNodeSocketArray', 'Array', is_var=True) - self.add_output('NodeSocketInt', 'Length') + self.add_output('ArmIntSocket', 'Length') def draw_buttons(self, context, layout): row = layout.row(align=True) op = row.operator('arm.node_add_input', text='New', icon='PLUS', emboss=True) op.node_index = str(id(self)) - op.socket_type = 'NodeSocketFloat' + op.socket_type = 'ArmFloatSocket' op2 = row.operator('arm.node_remove_input', text='', icon='X', emboss=True) op2.node_index = str(id(self)) diff --git a/blender/arm/logicnode/array/LN_array_get.py b/blender/arm/logicnode/array/LN_array_get.py index 2ccfe176..598a60f5 100644 --- a/blender/arm/logicnode/array/LN_array_get.py +++ b/blender/arm/logicnode/array/LN_array_get.py @@ -6,9 +6,8 @@ class ArrayGetNode(ArmLogicTreeNode): bl_label = 'Array Get' arm_version = 1 - def init(self, context): - super(ArrayGetNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketArray', 'Array') - self.add_input('NodeSocketInt', 'Index') + self.add_input('ArmIntSocket', 'Index') - self.add_output('NodeSocketShader', 'Value') + self.add_output('ArmDynamicSocket', 'Value') diff --git a/blender/arm/logicnode/array/LN_array_integer.py b/blender/arm/logicnode/array/LN_array_integer.py index 5e6cb2f1..1b01e721 100644 --- a/blender/arm/logicnode/array/LN_array_integer.py +++ b/blender/arm/logicnode/array/LN_array_integer.py @@ -11,17 +11,16 @@ class IntegerArrayNode(ArmLogicTreeNode): super(IntegerArrayNode, self).__init__() array_nodes[str(id(self))] = self - def init(self, context): - super(IntegerArrayNode, self).init(context) + def arm_init(self, context): self.add_output('ArmNodeSocketArray', 'Array') - self.add_output('NodeSocketInt', 'Length') + self.add_output('ArmIntSocket', 'Length') def draw_buttons(self, context, layout): row = layout.row(align=True) op = row.operator('arm.node_add_input', text='New', icon='PLUS', emboss=True) op.node_index = str(id(self)) - op.socket_type = 'NodeSocketInt' + op.socket_type = 'ArmIntSocket' op2 = row.operator('arm.node_remove_input', text='', icon='X', emboss=True) op2.node_index = str(id(self)) diff --git a/blender/arm/logicnode/array/LN_array_length.py b/blender/arm/logicnode/array/LN_array_length.py index b6666533..3ef4e9f1 100644 --- a/blender/arm/logicnode/array/LN_array_length.py +++ b/blender/arm/logicnode/array/LN_array_length.py @@ -6,8 +6,7 @@ class ArrayLengthNode(ArmLogicTreeNode): bl_label = 'Array Length' arm_version = 1 - def init(self, context): - super(ArrayLengthNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketArray', 'Array') - self.add_output('NodeSocketInt', 'Length') + self.add_output('ArmIntSocket', 'Length') diff --git a/blender/arm/logicnode/array/LN_array_loop_node.py b/blender/arm/logicnode/array/LN_array_loop_node.py index 1e791989..aefd7331 100644 --- a/blender/arm/logicnode/array/LN_array_loop_node.py +++ b/blender/arm/logicnode/array/LN_array_loop_node.py @@ -7,12 +7,11 @@ class ArrayLoopNode(ArmLogicTreeNode): bl_label = 'Array Loop' arm_version = 1 - def init(self, context): - super(ArrayLoopNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketArray', 'Array') self.add_output('ArmNodeSocketAction', 'Loop') - self.add_output('NodeSocketShader', 'Value') - self.add_output('NodeSocketInt', 'Index') + self.add_output('ArmDynamicSocket', 'Value') + self.add_output('ArmIntSocket', 'Index') self.add_output('ArmNodeSocketAction', 'Done') diff --git a/blender/arm/logicnode/array/LN_array_object.py b/blender/arm/logicnode/array/LN_array_object.py index 8328ebc7..513e211c 100644 --- a/blender/arm/logicnode/array/LN_array_object.py +++ b/blender/arm/logicnode/array/LN_array_object.py @@ -11,10 +11,9 @@ class ObjectArrayNode(ArmLogicTreeNode): super(ObjectArrayNode, self).__init__() array_nodes[str(id(self))] = self - def init(self, context): - super(ObjectArrayNode, self).init(context) + def arm_init(self, context): self.add_output('ArmNodeSocketArray', 'Array', is_var=True) - self.add_output('NodeSocketInt', 'Length') + self.add_output('ArmIntSocket', 'Length') def draw_buttons(self, context, layout): row = layout.row(align=True) diff --git a/blender/arm/logicnode/array/LN_array_pop.py b/blender/arm/logicnode/array/LN_array_pop.py index 8bd93a8d..37b9ad5c 100644 --- a/blender/arm/logicnode/array/LN_array_pop.py +++ b/blender/arm/logicnode/array/LN_array_pop.py @@ -8,8 +8,7 @@ class ArrayPopNode(ArmLogicTreeNode): bl_label = 'Array Pop' arm_version = 1 - def init(self, context): - super(ArrayPopNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketArray', 'Array') - self.add_output('NodeSocketShader', 'Value') + self.add_output('ArmDynamicSocket', 'Value') diff --git a/blender/arm/logicnode/array/LN_array_remove_by_index.py b/blender/arm/logicnode/array/LN_array_remove_by_index.py index 9a81760b..efc69b43 100644 --- a/blender/arm/logicnode/array/LN_array_remove_by_index.py +++ b/blender/arm/logicnode/array/LN_array_remove_by_index.py @@ -8,11 +8,10 @@ class ArrayRemoveIndexNode(ArmLogicTreeNode): bl_label = 'Array Remove by Index' arm_version = 1 - def init(self, context): - super(ArrayRemoveIndexNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketArray', 'Array') - self.add_input('NodeSocketInt', 'Index') + self.add_input('ArmIntSocket', 'Index') self.add_output('ArmNodeSocketAction', 'Out') - self.add_output('NodeSocketShader', 'Value') + self.add_output('ArmDynamicSocket', 'Value') diff --git a/blender/arm/logicnode/array/LN_array_remove_by_value.py b/blender/arm/logicnode/array/LN_array_remove_by_value.py index f7634ea7..5314b714 100644 --- a/blender/arm/logicnode/array/LN_array_remove_by_value.py +++ b/blender/arm/logicnode/array/LN_array_remove_by_value.py @@ -11,20 +11,19 @@ class ArrayRemoveValueNode(ArmLogicTreeNode): # def __init__(self): # array_nodes[str(id(self))] = self - def init(self, context): - super(ArrayRemoveValueNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketArray', 'Array') - self.add_input('NodeSocketShader', 'Value') + self.add_input('ArmDynamicSocket', 'Value') self.add_output('ArmNodeSocketAction', 'Out') - self.add_output('NodeSocketShader', 'Value') + self.add_output('ArmDynamicSocket', 'Value') # def draw_buttons(self, context, layout): # row = layout.row(align=True) # op = row.operator('arm.node_add_input_value', text='New', icon='PLUS', emboss=True) # op.node_index = str(id(self)) - # op.socket_type = 'NodeSocketShader' + # op.socket_type = 'ArmDynamicSocket' # op2 = row.operator('arm.node_remove_input_value', text='', icon='X', emboss=True) # op2.node_index = str(id(self)) diff --git a/blender/arm/logicnode/array/LN_array_set.py b/blender/arm/logicnode/array/LN_array_set.py index 7c1f0197..e1eac977 100644 --- a/blender/arm/logicnode/array/LN_array_set.py +++ b/blender/arm/logicnode/array/LN_array_set.py @@ -6,11 +6,10 @@ class ArraySetNode(ArmLogicTreeNode): bl_label = 'Array Set' arm_version = 1 - def init(self, context): - super(ArraySetNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketArray', 'Array') - self.add_input('NodeSocketInt', 'Index') - self.add_input('NodeSocketShader', 'Value') + self.add_input('ArmIntSocket', 'Index') + self.add_input('ArmDynamicSocket', 'Value') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/array/LN_array_shift.py b/blender/arm/logicnode/array/LN_array_shift.py index 6a40faf2..15ee7b78 100644 --- a/blender/arm/logicnode/array/LN_array_shift.py +++ b/blender/arm/logicnode/array/LN_array_shift.py @@ -8,8 +8,7 @@ class ArrayShiftNode(ArmLogicTreeNode): bl_label = 'Array Shift' arm_version = 1 - def init(self, context): - super(ArrayShiftNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketArray', 'Array') - self.add_output('NodeSocketShader', 'Value') + self.add_output('ArmDynamicSocket', 'Value') diff --git a/blender/arm/logicnode/array/LN_array_slice.py b/blender/arm/logicnode/array/LN_array_slice.py index 29ca2533..be2b1bd4 100644 --- a/blender/arm/logicnode/array/LN_array_slice.py +++ b/blender/arm/logicnode/array/LN_array_slice.py @@ -8,10 +8,9 @@ class ArraySliceNode(ArmLogicTreeNode): bl_label = 'Array Slice' arm_version = 1 - def init(self, context): - super(ArraySliceNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketArray', 'Array') - self.add_input('NodeSocketInt', 'Index') - self.add_input('NodeSocketInt', 'End') + self.add_input('ArmIntSocket', 'Index') + self.add_input('ArmIntSocket', 'End') self.add_output('ArmNodeSocketArray', 'Array') diff --git a/blender/arm/logicnode/array/LN_array_splice.py b/blender/arm/logicnode/array/LN_array_splice.py index 06aa7481..1f367cc5 100644 --- a/blender/arm/logicnode/array/LN_array_splice.py +++ b/blender/arm/logicnode/array/LN_array_splice.py @@ -8,11 +8,10 @@ class ArraySpliceNode(ArmLogicTreeNode): bl_label = 'Array Splice' arm_version = 1 - def init(self, context): - super(ArraySpliceNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketArray', 'Array') - self.add_input('NodeSocketInt', 'Index') - self.add_input('NodeSocketInt', 'Length') + self.add_input('ArmIntSocket', 'Index') + self.add_input('ArmIntSocket', 'Length') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/array/LN_array_string.py b/blender/arm/logicnode/array/LN_array_string.py index d1a82bb4..0bf6ed27 100644 --- a/blender/arm/logicnode/array/LN_array_string.py +++ b/blender/arm/logicnode/array/LN_array_string.py @@ -11,17 +11,16 @@ class StringArrayNode(ArmLogicTreeNode): super(StringArrayNode, self).__init__() array_nodes[str(id(self))] = self - def init(self, context): - super(StringArrayNode, self).init(context) + def arm_init(self, context): self.add_output('ArmNodeSocketArray', 'Array', is_var=True) - self.add_output('NodeSocketInt', 'Length') + self.add_output('ArmIntSocket', 'Length') def draw_buttons(self, context, layout): row = layout.row(align=True) op = row.operator('arm.node_add_input', text='New', icon='PLUS', emboss=True) op.node_index = str(id(self)) - op.socket_type = 'NodeSocketString' + op.socket_type = 'ArmStringSocket' op2 = row.operator('arm.node_remove_input', text='', icon='X', emboss=True) op2.node_index = str(id(self)) diff --git a/blender/arm/logicnode/array/LN_array_vector.py b/blender/arm/logicnode/array/LN_array_vector.py index 94ac05e0..bf1715d7 100644 --- a/blender/arm/logicnode/array/LN_array_vector.py +++ b/blender/arm/logicnode/array/LN_array_vector.py @@ -11,17 +11,16 @@ class VectorArrayNode(ArmLogicTreeNode): super(VectorArrayNode, self).__init__() array_nodes[str(id(self))] = self - def init(self, context): - super(VectorArrayNode, self).init(context) + def arm_init(self, context): self.add_output('ArmNodeSocketArray', 'Array', is_var=True) - self.add_output('NodeSocketInt', 'Length') + self.add_output('ArmIntSocket', 'Length') def draw_buttons(self, context, layout): row = layout.row(align=True) op = row.operator('arm.node_add_input', text='New', icon='PLUS', emboss=True) op.node_index = str(id(self)) - op.socket_type = 'NodeSocketVector' + op.socket_type = 'ArmVectorSocket' op2 = row.operator('arm.node_remove_input', text='', icon='X', emboss=True) op2.node_index = str(id(self)) diff --git a/blender/arm/logicnode/camera/LN_get_camera_active.py b/blender/arm/logicnode/camera/LN_get_camera_active.py index 54c3fe7a..9956d45e 100644 --- a/blender/arm/logicnode/camera/LN_get_camera_active.py +++ b/blender/arm/logicnode/camera/LN_get_camera_active.py @@ -8,6 +8,5 @@ class ActiveCameraNode(ArmLogicTreeNode): bl_label = 'Get Camera Active' arm_version = 1 - def init(self, context): - super(ActiveCameraNode, self).init(context) + def arm_init(self, context): self.add_output('ArmNodeSocketObject', 'Camera') diff --git a/blender/arm/logicnode/camera/LN_get_camera_fov.py b/blender/arm/logicnode/camera/LN_get_camera_fov.py index d35c3181..b5e70466 100644 --- a/blender/arm/logicnode/camera/LN_get_camera_fov.py +++ b/blender/arm/logicnode/camera/LN_get_camera_fov.py @@ -8,8 +8,7 @@ class GetCameraFovNode(ArmLogicTreeNode): bl_label = 'Get Camera FOV' arm_version = 1 - def init(self, context): - super(GetCameraFovNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketObject', 'Object') - self.add_output('NodeSocketFloat', 'FOV') + self.add_output('ArmFloatSocket', 'FOV') diff --git a/blender/arm/logicnode/camera/LN_set_camera_active.py b/blender/arm/logicnode/camera/LN_set_camera_active.py index dd05a919..fa078d10 100644 --- a/blender/arm/logicnode/camera/LN_set_camera_active.py +++ b/blender/arm/logicnode/camera/LN_set_camera_active.py @@ -8,8 +8,7 @@ class SetCameraNode(ArmLogicTreeNode): bl_label = 'Set Camera Active' arm_version = 1 - def init(self, context): - super(SetCameraNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Camera') diff --git a/blender/arm/logicnode/camera/LN_set_camera_fov.py b/blender/arm/logicnode/camera/LN_set_camera_fov.py index 4785c18c..1974c0d0 100644 --- a/blender/arm/logicnode/camera/LN_set_camera_fov.py +++ b/blender/arm/logicnode/camera/LN_set_camera_fov.py @@ -8,10 +8,9 @@ class SetCameraFovNode(ArmLogicTreeNode): bl_label = 'Set Camera FOV' arm_version = 1 - def init(self, context): - super(SetCameraFovNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Camera') - self.add_input('NodeSocketFloat', 'FOV', default_value=0.9) + self.add_input('ArmFloatSocket', 'FOV', default_value=0.9) self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/canvas/LN_get_canvas_checkbox.py b/blender/arm/logicnode/canvas/LN_get_canvas_checkbox.py index 027b2015..de3cee1d 100644 --- a/blender/arm/logicnode/canvas/LN_get_canvas_checkbox.py +++ b/blender/arm/logicnode/canvas/LN_get_canvas_checkbox.py @@ -6,8 +6,7 @@ class CanvasGetCheckboxNode(ArmLogicTreeNode): bl_label = 'Get Canvas Checkbox' arm_version = 1 - def init(self, context): - super(CanvasGetCheckboxNode, self).init(context) - self.add_input('NodeSocketString', 'Element') + def arm_init(self, context): + self.add_input('ArmStringSocket', 'Element') - self.add_output('NodeSocketBool', 'Is Checked') + self.add_output('ArmBoolSocket', 'Is Checked') diff --git a/blender/arm/logicnode/canvas/LN_get_canvas_input_text.py b/blender/arm/logicnode/canvas/LN_get_canvas_input_text.py index 09e10e71..e8d1a7d3 100644 --- a/blender/arm/logicnode/canvas/LN_get_canvas_input_text.py +++ b/blender/arm/logicnode/canvas/LN_get_canvas_input_text.py @@ -6,8 +6,7 @@ class CanvasGetInputTextNode(ArmLogicTreeNode): bl_label = 'Get Canvas Input Text' arm_version = 1 - def init(self, context): - super(CanvasGetInputTextNode, self).init(context) - self.add_input('NodeSocketString', 'Element') + def arm_init(self, context): + self.add_input('ArmStringSocket', 'Element') - self.add_output('NodeSocketString', 'Text') + self.add_output('ArmStringSocket', 'Text') diff --git a/blender/arm/logicnode/canvas/LN_get_canvas_location.py b/blender/arm/logicnode/canvas/LN_get_canvas_location.py index 3ea3c2d8..71e9491f 100644 --- a/blender/arm/logicnode/canvas/LN_get_canvas_location.py +++ b/blender/arm/logicnode/canvas/LN_get_canvas_location.py @@ -6,11 +6,10 @@ class CanvasGetLocationNode(ArmLogicTreeNode): bl_label = 'Get Canvas Location' arm_version = 1 - def init(self, context): - super(CanvasGetLocationNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketString', 'Element') + self.add_input('ArmStringSocket', 'Element') self.add_output('ArmNodeSocketAction', 'Out') - self.add_output('NodeSocketInt', 'X') - self.add_output('NodeSocketInt', 'Y') + self.add_output('ArmIntSocket', 'X') + self.add_output('ArmIntSocket', 'Y') diff --git a/blender/arm/logicnode/canvas/LN_get_canvas_position.py b/blender/arm/logicnode/canvas/LN_get_canvas_position.py index d7704fd6..47efa750 100644 --- a/blender/arm/logicnode/canvas/LN_get_canvas_position.py +++ b/blender/arm/logicnode/canvas/LN_get_canvas_position.py @@ -6,8 +6,7 @@ class CanvasGetPositionNode(ArmLogicTreeNode): bl_label = 'Get Canvas Position' arm_version = 1 - def init(self, context): - super(CanvasGetPositionNode, self).init(context) - self.add_input('NodeSocketString', 'Element') + def arm_init(self, context): + self.add_input('ArmStringSocket', 'Element') - self.add_output('NodeSocketInt', 'Position') + self.add_output('ArmIntSocket', 'Position') diff --git a/blender/arm/logicnode/canvas/LN_get_canvas_progress_bar.py b/blender/arm/logicnode/canvas/LN_get_canvas_progress_bar.py index b7aa0795..5e9435ca 100644 --- a/blender/arm/logicnode/canvas/LN_get_canvas_progress_bar.py +++ b/blender/arm/logicnode/canvas/LN_get_canvas_progress_bar.py @@ -6,11 +6,10 @@ class CanvasGetPBNode(ArmLogicTreeNode): bl_label = 'Get Canvas Progress Bar' arm_version = 1 - def init(self, context): - super(CanvasGetPBNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketString', 'Element') + self.add_input('ArmStringSocket', 'Element') self.add_output('ArmNodeSocketAction', 'Out') - self.add_output('NodeSocketInt', 'At') - self.add_output('NodeSocketInt', 'Max') + self.add_output('ArmIntSocket', 'At') + self.add_output('ArmIntSocket', 'Max') diff --git a/blender/arm/logicnode/canvas/LN_get_canvas_rotation.py b/blender/arm/logicnode/canvas/LN_get_canvas_rotation.py index 342c9288..3b7ffa9e 100644 --- a/blender/arm/logicnode/canvas/LN_get_canvas_rotation.py +++ b/blender/arm/logicnode/canvas/LN_get_canvas_rotation.py @@ -6,10 +6,9 @@ class CanvasGetRotationNode(ArmLogicTreeNode): bl_label = 'Get Canvas Rotation' arm_version = 1 - def init(self, context): - super(CanvasGetRotationNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketString', 'Element') + self.add_input('ArmStringSocket', 'Element') self.add_output('ArmNodeSocketAction', 'Out') - self.add_output('NodeSocketFloat', 'Rad') + self.add_output('ArmFloatSocket', 'Rad') diff --git a/blender/arm/logicnode/canvas/LN_get_canvas_scale.py b/blender/arm/logicnode/canvas/LN_get_canvas_scale.py index 631a7185..9e65ea39 100644 --- a/blender/arm/logicnode/canvas/LN_get_canvas_scale.py +++ b/blender/arm/logicnode/canvas/LN_get_canvas_scale.py @@ -6,11 +6,10 @@ class CanvasGetScaleNode(ArmLogicTreeNode): bl_label = 'Get Canvas Scale' arm_version = 1 - def init(self, context): - super(CanvasGetScaleNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketString', 'Element') + self.add_input('ArmStringSocket', 'Element') self.add_output('ArmNodeSocketAction', 'Out') - self.add_output('NodeSocketInt', 'Height') - self.add_output('NodeSocketInt', 'Width') + self.add_output('ArmIntSocket', 'Height') + self.add_output('ArmIntSocket', 'Width') diff --git a/blender/arm/logicnode/canvas/LN_get_canvas_slider.py b/blender/arm/logicnode/canvas/LN_get_canvas_slider.py index 70ccbac3..c0d09cc4 100644 --- a/blender/arm/logicnode/canvas/LN_get_canvas_slider.py +++ b/blender/arm/logicnode/canvas/LN_get_canvas_slider.py @@ -6,8 +6,7 @@ class CanvasGetSliderNode(ArmLogicTreeNode): bl_label = 'Get Canvas Slider' arm_version = 1 - def init(self, context): - super(CanvasGetSliderNode, self).init(context) - self.add_input('NodeSocketString', 'Element') + def arm_init(self, context): + self.add_input('ArmStringSocket', 'Element') - self.add_output('NodeSocketFloat', 'Float') + self.add_output('ArmFloatSocket', 'Float') diff --git a/blender/arm/logicnode/canvas/LN_get_canvas_visible.py b/blender/arm/logicnode/canvas/LN_get_canvas_visible.py index 6c983e62..3fb4ae1b 100644 --- a/blender/arm/logicnode/canvas/LN_get_canvas_visible.py +++ b/blender/arm/logicnode/canvas/LN_get_canvas_visible.py @@ -9,8 +9,7 @@ class CanvasGetVisibleNode(ArmLogicTreeNode): bl_label = 'Get Canvas Visible' arm_version = 1 - def init(self, context): - super(CanvasGetVisibleNode, self).init(context) - self.inputs.new('NodeSocketString', 'Element') + def arm_init(self, context): + self.inputs.new('ArmStringSocket', 'Element') - self.outputs.new('NodeSocketBool', 'Is Visible') + self.outputs.new('ArmBoolSocket', 'Is Visible') diff --git a/blender/arm/logicnode/canvas/LN_on_canvas_element.py b/blender/arm/logicnode/canvas/LN_on_canvas_element.py index 4eab0872..fe65ad0c 100644 --- a/blender/arm/logicnode/canvas/LN_on_canvas_element.py +++ b/blender/arm/logicnode/canvas/LN_on_canvas_element.py @@ -6,24 +6,26 @@ class OnCanvasElementNode(ArmLogicTreeNode): bl_label = 'On Canvas Element' arm_version = 1 - property0: EnumProperty( + property0: HaxeEnumProperty( + 'property0', items=[('click', 'Click', 'Listen to mouse clicks'), ('hover', 'Hover', 'Listen to mouse hover')], name='Listen to', default='click') - property1: EnumProperty( + property1: HaxeEnumProperty( + 'property1', items=[('started', 'Started', 'Started'), ('down', 'Down', 'Down'), ('released', 'Released', 'Released')], name='Status', default='started') - property2: EnumProperty( + property2: HaxeEnumProperty( + 'property2', items=[('left', 'Left', 'Left mouse button'), ('middle', 'Middle', 'Middle mouse button'), ('right', 'Right', 'Right mouse button')], name='Mouse Button', default='left') - def init(self, context): - super(OnCanvasElementNode, self).init(context) - self.add_input('NodeSocketString', 'Element') + def arm_init(self, context): + self.add_input('ArmStringSocket', 'Element') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/canvas/LN_set_canvas_asset.py b/blender/arm/logicnode/canvas/LN_set_canvas_asset.py index 174b4b01..bf734e70 100644 --- a/blender/arm/logicnode/canvas/LN_set_canvas_asset.py +++ b/blender/arm/logicnode/canvas/LN_set_canvas_asset.py @@ -6,10 +6,9 @@ class CanvasSetAssetNode(ArmLogicTreeNode): bl_label = 'Set Canvas Asset' arm_version = 1 - def init(self, context): - super(CanvasSetAssetNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketString', 'Element') - self.add_input('NodeSocketString', 'Asset') + self.add_input('ArmStringSocket', 'Element') + self.add_input('ArmStringSocket', 'Asset') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/canvas/LN_set_canvas_checkbox.py b/blender/arm/logicnode/canvas/LN_set_canvas_checkbox.py index a3759a68..ad41a7ae 100644 --- a/blender/arm/logicnode/canvas/LN_set_canvas_checkbox.py +++ b/blender/arm/logicnode/canvas/LN_set_canvas_checkbox.py @@ -6,10 +6,9 @@ class CanvasSetCheckBoxNode(ArmLogicTreeNode): bl_label = 'Set Canvas Checkbox' arm_version = 1 - def init(self, context): - super(CanvasSetCheckBoxNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketString', 'Element') - self.add_input('NodeSocketBool', 'Check') + self.add_input('ArmStringSocket', 'Element') + self.add_input('ArmBoolSocket', 'Check') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/canvas/LN_set_canvas_location.py b/blender/arm/logicnode/canvas/LN_set_canvas_location.py index 12886e37..03402117 100644 --- a/blender/arm/logicnode/canvas/LN_set_canvas_location.py +++ b/blender/arm/logicnode/canvas/LN_set_canvas_location.py @@ -6,11 +6,10 @@ class CanvasSetLocationNode(ArmLogicTreeNode): bl_label = 'Set Canvas Location' arm_version = 1 - def init(self, context): - super(CanvasSetLocationNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketString', 'Element') - self.add_input('NodeSocketFloat', 'X') - self.add_input('NodeSocketFloat', 'Y') + self.add_input('ArmStringSocket', 'Element') + self.add_input('ArmFloatSocket', 'X') + self.add_input('ArmFloatSocket', 'Y') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/canvas/LN_set_canvas_progress_bar.py b/blender/arm/logicnode/canvas/LN_set_canvas_progress_bar.py index bd39bd1d..b5d59085 100644 --- a/blender/arm/logicnode/canvas/LN_set_canvas_progress_bar.py +++ b/blender/arm/logicnode/canvas/LN_set_canvas_progress_bar.py @@ -6,11 +6,10 @@ class CanvasSetPBNode(ArmLogicTreeNode): bl_label = 'Set Canvas Progress Bar' arm_version = 1 - def init(self, context): - super(CanvasSetPBNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketString', 'Element') - self.add_input('NodeSocketInt', 'At') - self.add_input('NodeSocketInt', 'Max') + self.add_input('ArmStringSocket', 'Element') + self.add_input('ArmIntSocket', 'At') + self.add_input('ArmIntSocket', 'Max') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/canvas/LN_set_canvas_rotation.py b/blender/arm/logicnode/canvas/LN_set_canvas_rotation.py index 4379f61a..ee9f6502 100644 --- a/blender/arm/logicnode/canvas/LN_set_canvas_rotation.py +++ b/blender/arm/logicnode/canvas/LN_set_canvas_rotation.py @@ -6,10 +6,9 @@ class CanvasSetRotationNode(ArmLogicTreeNode): bl_label = 'Set Canvas Rotation' arm_version = 1 - def init(self, context): - super(CanvasSetRotationNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketString', 'Element') - self.add_input('NodeSocketFloat', 'Rad') + self.add_input('ArmStringSocket', 'Element') + self.add_input('ArmFloatSocket', 'Rad') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/canvas/LN_set_canvas_scale.py b/blender/arm/logicnode/canvas/LN_set_canvas_scale.py index 1718c9ad..7afbf7ab 100644 --- a/blender/arm/logicnode/canvas/LN_set_canvas_scale.py +++ b/blender/arm/logicnode/canvas/LN_set_canvas_scale.py @@ -6,11 +6,10 @@ class CanvasSetScaleNode(ArmLogicTreeNode): bl_label = 'Set Canvas Scale' arm_version = 1 - def init(self, context): - super(CanvasSetScaleNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketString', 'Element') - self.add_input('NodeSocketInt', 'Height') - self.add_input('NodeSocketInt', 'Width') + self.add_input('ArmStringSocket', 'Element') + self.add_input('ArmIntSocket', 'Height') + self.add_input('ArmIntSocket', 'Width') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/canvas/LN_set_canvas_slider.py b/blender/arm/logicnode/canvas/LN_set_canvas_slider.py index 7c7cadda..9988266b 100644 --- a/blender/arm/logicnode/canvas/LN_set_canvas_slider.py +++ b/blender/arm/logicnode/canvas/LN_set_canvas_slider.py @@ -6,10 +6,9 @@ class CanvasSetSliderNode(ArmLogicTreeNode): bl_label = 'Set Canvas Slider' arm_version = 1 - def init(self, context): - super(CanvasSetSliderNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketString', 'Element') - self.add_input('NodeSocketFloat', 'Float') + self.add_input('ArmStringSocket', 'Element') + self.add_input('ArmFloatSocket', 'Float') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/canvas/LN_set_canvas_text.py b/blender/arm/logicnode/canvas/LN_set_canvas_text.py index 598a4794..462b7ba2 100644 --- a/blender/arm/logicnode/canvas/LN_set_canvas_text.py +++ b/blender/arm/logicnode/canvas/LN_set_canvas_text.py @@ -6,10 +6,9 @@ class CanvasSetTextNode(ArmLogicTreeNode): bl_label = 'Set Canvas Text' arm_version = 1 - def init(self, context): - super(CanvasSetTextNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketString', 'Element') - self.add_input('NodeSocketString', 'Text') + self.add_input('ArmStringSocket', 'Element') + self.add_input('ArmStringSocket', 'Text') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/canvas/LN_set_canvas_text_color.py b/blender/arm/logicnode/canvas/LN_set_canvas_text_color.py index 2ac59b27..5863510f 100644 --- a/blender/arm/logicnode/canvas/LN_set_canvas_text_color.py +++ b/blender/arm/logicnode/canvas/LN_set_canvas_text_color.py @@ -6,13 +6,12 @@ class CanvasSetTextColorNode(ArmLogicTreeNode): bl_label = 'Set Canvas Text Color' arm_version = 1 - def init(self, context): - super(CanvasSetTextColorNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketString', 'Element') - self.add_input('NodeSocketFloat', 'R') - self.add_input('NodeSocketFloat', 'G') - self.add_input('NodeSocketFloat', 'B') - self.add_input('NodeSocketFloat', 'A') + self.add_input('ArmStringSocket', 'Element') + self.add_input('ArmFloatSocket', 'R') + self.add_input('ArmFloatSocket', 'G') + self.add_input('ArmFloatSocket', 'B') + self.add_input('ArmFloatSocket', 'A') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/canvas/LN_set_canvas_visible.py b/blender/arm/logicnode/canvas/LN_set_canvas_visible.py index 8e8444f4..dbe88b26 100644 --- a/blender/arm/logicnode/canvas/LN_set_canvas_visible.py +++ b/blender/arm/logicnode/canvas/LN_set_canvas_visible.py @@ -6,10 +6,9 @@ class CanvasSetVisibleNode(ArmLogicTreeNode): bl_label = 'Set Canvas Visible' arm_version = 1 - def init(self, context): - super(CanvasSetVisibleNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketString', 'Element') - self.add_input('NodeSocketBool', 'Visible') + self.add_input('ArmStringSocket', 'Element') + self.add_input('ArmBoolSocket', 'Visible') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/deprecated/LN_get_mouse_lock.py b/blender/arm/logicnode/deprecated/LN_get_mouse_lock.py index 6bf63494..83cea8fa 100644 --- a/blender/arm/logicnode/deprecated/LN_get_mouse_lock.py +++ b/blender/arm/logicnode/deprecated/LN_get_mouse_lock.py @@ -14,9 +14,8 @@ class GetMouseLockNode(ArmLogicTreeNode): arm_category = 'Input' arm_section = 'mouse' - def init(self, context): - super(GetMouseLockNode, self).init(context) - self.outputs.new('NodeSocketBool', 'Is Locked') + def arm_init(self, context): + self.outputs.new('ArmBoolSocket', 'Is Locked') def get_replacement_node(self, node_tree: bpy.types.NodeTree): if self.arm_version not in (0, 1): diff --git a/blender/arm/logicnode/deprecated/LN_get_mouse_visible.py b/blender/arm/logicnode/deprecated/LN_get_mouse_visible.py index 0884b8eb..95c5d0f1 100644 --- a/blender/arm/logicnode/deprecated/LN_get_mouse_visible.py +++ b/blender/arm/logicnode/deprecated/LN_get_mouse_visible.py @@ -14,9 +14,8 @@ class GetMouseVisibleNode(ArmLogicTreeNode): arm_section = 'mouse' arm_version = 2 - def init(self, context): - super(GetMouseVisibleNode, self).init(context) - self.outputs.new('NodeSocketBool', 'Is Visible') + def arm_init(self, context): + self.outputs.new('ArmBoolSocket', 'Is Visible') def get_replacement_node(self, node_tree: bpy.types.NodeTree): if self.arm_version not in (0, 1): diff --git a/blender/arm/logicnode/deprecated/LN_mouse_coords.py b/blender/arm/logicnode/deprecated/LN_mouse_coords.py index df0ced8a..60b58cdd 100644 --- a/blender/arm/logicnode/deprecated/LN_mouse_coords.py +++ b/blender/arm/logicnode/deprecated/LN_mouse_coords.py @@ -11,11 +11,10 @@ class MouseCoordsNode(ArmLogicTreeNode): arm_section = 'mouse' arm_version = 2 - def init(self, context): - super(MouseCoordsNode, self).init(context) - self.add_output('NodeSocketVector', 'Coords') - self.add_output('NodeSocketVector', 'Movement') - self.add_output('NodeSocketInt', 'Wheel') + def arm_init(self, context): + self.add_output('ArmVectorSocket', 'Coords') + self.add_output('ArmVectorSocket', 'Movement') + self.add_output('ArmIntSocket', 'Wheel') def get_replacement_node(self, node_tree: bpy.types.NodeTree): if self.arm_version not in (0, 1): diff --git a/blender/arm/logicnode/deprecated/LN_on_gamepad.py b/blender/arm/logicnode/deprecated/LN_on_gamepad.py index e2867026..3de6a284 100644 --- a/blender/arm/logicnode/deprecated/LN_on_gamepad.py +++ b/blender/arm/logicnode/deprecated/LN_on_gamepad.py @@ -11,7 +11,8 @@ class OnGamepadNode(ArmLogicTreeNode): arm_section = 'gamepad' arm_version = 2 - property0: EnumProperty( + property0: HaxeEnumProperty( + 'property0', items = [('Down', 'Down', 'Down'), ('Started', 'Started', 'Started'), ('Released', 'Released', 'Released')], @@ -19,7 +20,8 @@ class OnGamepadNode(ArmLogicTreeNode): # ('Moved Right', 'Moved Right', 'Moved Right'),], name='', default='Started') - property1: EnumProperty( + property1: HaxeEnumProperty( + 'property1', items = [('cross', 'cross / a', 'cross / a'), ('circle', 'circle / b', 'circle / b'), ('square', 'square / x', 'square / x'), @@ -40,10 +42,9 @@ class OnGamepadNode(ArmLogicTreeNode): ('touchpad', 'touchpad', 'touchpad'),], name='', default='cross') - def init(self, context): - super(OnGamepadNode, self).init(context) + def arm_init(self, context): self.add_output('ArmNodeSocketAction', 'Out') - self.add_input('NodeSocketInt', 'Gamepad') + self.add_input('ArmIntSocket', 'Gamepad') def draw_buttons(self, context, layout): layout.prop(self, 'property0') diff --git a/blender/arm/logicnode/deprecated/LN_on_keyboard.py b/blender/arm/logicnode/deprecated/LN_on_keyboard.py index 29d6d2a3..77699451 100644 --- a/blender/arm/logicnode/deprecated/LN_on_keyboard.py +++ b/blender/arm/logicnode/deprecated/LN_on_keyboard.py @@ -11,13 +11,15 @@ class OnKeyboardNode(ArmLogicTreeNode): arm_section = 'keyboard' arm_version = 2 - property0: EnumProperty( + property0: HaxeEnumProperty( + 'property0', items = [('Down', 'Down', 'Down'), ('Started', 'Started', 'Started'), ('Released', 'Released', 'Released')], name='', default='Started') - property1: EnumProperty( + property1: HaxeEnumProperty( + 'property1', items = [('a', 'a', 'a'), ('b', 'b', 'b'), ('c', 'c', 'c'), @@ -72,8 +74,7 @@ class OnKeyboardNode(ArmLogicTreeNode): ('down', 'down', 'down'),], name='', default='space') - def init(self, context): - super(OnKeyboardNode, self).init(context) + def arm_init(self, context): self.add_output('ArmNodeSocketAction', 'Out') def draw_buttons(self, context, layout): diff --git a/blender/arm/logicnode/deprecated/LN_on_mouse.py b/blender/arm/logicnode/deprecated/LN_on_mouse.py index c4ac60b9..087ef551 100644 --- a/blender/arm/logicnode/deprecated/LN_on_mouse.py +++ b/blender/arm/logicnode/deprecated/LN_on_mouse.py @@ -11,20 +11,21 @@ class OnMouseNode(ArmLogicTreeNode): arm_section = 'mouse' arm_version = 2 - property0: EnumProperty( + property0: HaxeEnumProperty( + 'property0', items = [('Down', 'Down', 'Down'), ('Started', 'Started', 'Started'), ('Released', 'Released', 'Released'), ('Moved', 'Moved', 'Moved')], name='', default='Down') - property1: EnumProperty( + property1: HaxeEnumProperty( + 'property1', items = [('left', 'left', 'left'), ('right', 'right', 'right'), ('middle', 'middle', 'middle')], name='', default='left') - def init(self, context): - super(OnMouseNode, self).init(context) + def arm_init(self, context): self.add_output('ArmNodeSocketAction', 'Out') def draw_buttons(self, context, layout): diff --git a/blender/arm/logicnode/deprecated/LN_on_surface.py b/blender/arm/logicnode/deprecated/LN_on_surface.py index 066eb4a6..706c45c6 100644 --- a/blender/arm/logicnode/deprecated/LN_on_surface.py +++ b/blender/arm/logicnode/deprecated/LN_on_surface.py @@ -11,15 +11,15 @@ class OnSurfaceNode(ArmLogicTreeNode): arm_section = 'surface' arm_version = 2 - property0: EnumProperty( + property0: HaxeEnumProperty( + 'property0', items = [('Touched', 'Touched', 'Touched'), ('Started', 'Started', 'Started'), ('Released', 'Released', 'Released'), ('Moved', 'Moved', 'Moved')], name='', default='Touched') - def init(self, context): - super(OnSurfaceNode, self).init(context) + def arm_init(self, context): self.add_output('ArmNodeSocketAction', 'Out') def draw_buttons(self, context, layout): diff --git a/blender/arm/logicnode/deprecated/LN_on_virtual_button.py b/blender/arm/logicnode/deprecated/LN_on_virtual_button.py index 21ba0382..e2377d0b 100644 --- a/blender/arm/logicnode/deprecated/LN_on_virtual_button.py +++ b/blender/arm/logicnode/deprecated/LN_on_virtual_button.py @@ -11,15 +11,15 @@ class OnVirtualButtonNode(ArmLogicTreeNode): arm_section = 'virtual' arm_version = 2 - property0: EnumProperty( + property0: HaxeEnumProperty( + 'property0', items = [('Down', 'Down', 'Down'), ('Started', 'Started', 'Started'), ('Released', 'Released', 'Released')], name='', default='Started') - property1: StringProperty(name='', default='button') + property1: HaxeStringProperty('property1', name='', default='button') - def init(self, context): - super(OnVirtualButtonNode, self).init(context) + def arm_init(self, context): self.add_output('ArmNodeSocketAction', 'Out') def draw_buttons(self, context, layout): diff --git a/blender/arm/logicnode/deprecated/LN_pause_action.py b/blender/arm/logicnode/deprecated/LN_pause_action.py index 2def9733..b515ec0d 100644 --- a/blender/arm/logicnode/deprecated/LN_pause_action.py +++ b/blender/arm/logicnode/deprecated/LN_pause_action.py @@ -10,8 +10,7 @@ class PauseActionNode(ArmLogicTreeNode): arm_category = 'Animation' arm_version = 2 - def init(self, context): - super(PauseActionNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Object') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/deprecated/LN_pause_tilesheet.py b/blender/arm/logicnode/deprecated/LN_pause_tilesheet.py index 87185558..38313026 100644 --- a/blender/arm/logicnode/deprecated/LN_pause_tilesheet.py +++ b/blender/arm/logicnode/deprecated/LN_pause_tilesheet.py @@ -11,8 +11,7 @@ class PauseTilesheetNode(ArmLogicTreeNode): arm_section = 'tilesheet' arm_version = 2 - def init(self, context): - super(PauseTilesheetNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Object') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/deprecated/LN_pause_trait.py b/blender/arm/logicnode/deprecated/LN_pause_trait.py index f5e921a7..b3aecd2c 100644 --- a/blender/arm/logicnode/deprecated/LN_pause_trait.py +++ b/blender/arm/logicnode/deprecated/LN_pause_trait.py @@ -10,8 +10,7 @@ class PauseTraitNode(ArmLogicTreeNode): arm_category = 'Trait' arm_version = 2 - def init(self, context): - super(PauseTraitNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketShader', 'Trait') + self.add_input('ArmDynamicSocket', 'Trait') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/deprecated/LN_play_action.py b/blender/arm/logicnode/deprecated/LN_play_action.py index c914a0b0..5ac411c9 100644 --- a/blender/arm/logicnode/deprecated/LN_play_action.py +++ b/blender/arm/logicnode/deprecated/LN_play_action.py @@ -10,11 +10,10 @@ class PlayActionNode(ArmLogicTreeNode): arm_category = 'Animation' arm_version = 2 - def init(self, context): - super(PlayActionNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Object') self.add_input('ArmNodeSocketAnimAction', 'Action') - self.add_input('NodeSocketFloat', 'Blend', default_value=0.2) + self.add_input('ArmFloatSocket', 'Blend', default_value=0.2) self.add_output('ArmNodeSocketAction', 'Out') self.add_output('ArmNodeSocketAction', 'Done') diff --git a/blender/arm/logicnode/deprecated/LN_resume_action.py b/blender/arm/logicnode/deprecated/LN_resume_action.py index 4df1d8dc..9af44ae0 100644 --- a/blender/arm/logicnode/deprecated/LN_resume_action.py +++ b/blender/arm/logicnode/deprecated/LN_resume_action.py @@ -10,8 +10,7 @@ class ResumeActionNode(ArmLogicTreeNode): arm_category = 'Animation' arm_version = 2 - def init(self, context): - super(ResumeActionNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Object') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/deprecated/LN_resume_tilesheet.py b/blender/arm/logicnode/deprecated/LN_resume_tilesheet.py index 68ad6da2..b807dcc9 100644 --- a/blender/arm/logicnode/deprecated/LN_resume_tilesheet.py +++ b/blender/arm/logicnode/deprecated/LN_resume_tilesheet.py @@ -10,8 +10,7 @@ class ResumeTilesheetNode(ArmLogicTreeNode): arm_category = 'Animation' arm_version = 2 - def init(self, context): - super(ResumeTilesheetNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Object') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/deprecated/LN_resume_trait.py b/blender/arm/logicnode/deprecated/LN_resume_trait.py index 0ea926e9..89c15bdf 100644 --- a/blender/arm/logicnode/deprecated/LN_resume_trait.py +++ b/blender/arm/logicnode/deprecated/LN_resume_trait.py @@ -10,8 +10,7 @@ class ResumeTraitNode(ArmLogicTreeNode): arm_category = 'Trait' arm_version = 2 - def init(self, context): - super(ResumeTraitNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketShader', 'Trait') + self.add_input('ArmDynamicSocket', 'Trait') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/deprecated/LN_rotate_object_around_axis.py b/blender/arm/logicnode/deprecated/LN_rotate_object_around_axis.py index a1b2b5c4..104f774b 100644 --- a/blender/arm/logicnode/deprecated/LN_rotate_object_around_axis.py +++ b/blender/arm/logicnode/deprecated/LN_rotate_object_around_axis.py @@ -11,12 +11,11 @@ class RotateObjectAroundAxisNode(ArmLogicTreeNode): arm_section = 'rotation' arm_version = 2 - def init(self, context): - super(RotateObjectAroundAxisNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Object') - self.add_input('NodeSocketVector', 'Axis', default_value=[0, 0, 1]) - self.add_input('NodeSocketFloat', 'Angle') + self.add_input('ArmVectorSocket', 'Axis', default_value=[0, 0, 1]) + self.add_input('ArmFloatSocket', 'Angle') self.add_output('ArmNodeSocketAction', 'Out') def get_replacement_node(self, node_tree: bpy.types.NodeTree): diff --git a/blender/arm/logicnode/deprecated/LN_scale_object.py b/blender/arm/logicnode/deprecated/LN_scale_object.py index 4b3bb898..29d5ae3d 100644 --- a/blender/arm/logicnode/deprecated/LN_scale_object.py +++ b/blender/arm/logicnode/deprecated/LN_scale_object.py @@ -11,9 +11,8 @@ class ScaleObjectNode(ArmLogicTreeNode): arm_section = 'scale' arm_version = 2 - def init(self, context): - super(ScaleObjectNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Object') - self.add_input('NodeSocketVector', 'Scale') + self.add_input('ArmVectorSocket', 'Scale') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/deprecated/LN_set_mouse_lock.py b/blender/arm/logicnode/deprecated/LN_set_mouse_lock.py index 5612e87e..a27f42c3 100644 --- a/blender/arm/logicnode/deprecated/LN_set_mouse_lock.py +++ b/blender/arm/logicnode/deprecated/LN_set_mouse_lock.py @@ -11,10 +11,9 @@ class SetMouseLockNode(ArmLogicTreeNode): arm_section = 'mouse' arm_version = 2 - def init(self, context): - super(SetMouseLockNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketBool', 'Lock') + self.add_input('ArmBoolSocket', 'Lock') self.add_output('ArmNodeSocketAction', 'Out') def get_replacement_node(self, node_tree: bpy.types.NodeTree): diff --git a/blender/arm/logicnode/deprecated/LN_set_mouse_visible.py b/blender/arm/logicnode/deprecated/LN_set_mouse_visible.py index c85738e6..73e40a5b 100644 --- a/blender/arm/logicnode/deprecated/LN_set_mouse_visible.py +++ b/blender/arm/logicnode/deprecated/LN_set_mouse_visible.py @@ -11,10 +11,9 @@ class ShowMouseNode(ArmLogicTreeNode): arm_section = 'mouse' arm_version = 2 - def init(self, context): - super(ShowMouseNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketBool', 'Show') + self.add_input('ArmBoolSocket', 'Show') self.add_output('ArmNodeSocketAction', 'Out') def get_replacement_node(self, node_tree: bpy.types.NodeTree): diff --git a/blender/arm/logicnode/deprecated/LN_set_object_material.py b/blender/arm/logicnode/deprecated/LN_set_object_material.py index 25dc3f24..5d01c135 100644 --- a/blender/arm/logicnode/deprecated/LN_set_object_material.py +++ b/blender/arm/logicnode/deprecated/LN_set_object_material.py @@ -10,9 +10,8 @@ class SetMaterialNode(ArmLogicTreeNode): arm_category = 'Material' arm_version = 2 - def init(self, context): - super(SetMaterialNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Object') - self.add_input('NodeSocketShader', 'Material') + self.add_input('ArmDynamicSocket', 'Material') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/deprecated/LN_surface_coords.py b/blender/arm/logicnode/deprecated/LN_surface_coords.py index dff2b872..3fc6d1ee 100644 --- a/blender/arm/logicnode/deprecated/LN_surface_coords.py +++ b/blender/arm/logicnode/deprecated/LN_surface_coords.py @@ -12,7 +12,6 @@ class SurfaceCoordsNode(ArmLogicTreeNode): arm_is_obsolete = 'is_obsolete' arm_version = 2 - def init(self, context): - super(SurfaceCoordsNode, self).init(context) - self.add_output('NodeSocketVector', 'Coords') - self.add_output('NodeSocketVector', 'Movement') + def arm_init(self, context): + self.add_output('ArmVectorSocket', 'Coords') + self.add_output('ArmVectorSocket', 'Movement') diff --git a/blender/arm/logicnode/event/LN_on_application_state.py b/blender/arm/logicnode/event/LN_on_application_state.py index e624e77d..d38f8255 100644 --- a/blender/arm/logicnode/event/LN_on_application_state.py +++ b/blender/arm/logicnode/event/LN_on_application_state.py @@ -6,8 +6,7 @@ class OnApplicationStateNode(ArmLogicTreeNode): bl_label = 'On Application State' arm_version = 1 - def init(self, context): - super().init(context) + def arm_init(self, context): self.add_output('ArmNodeSocketAction', 'On Foreground') self.add_output('ArmNodeSocketAction', 'On Background') self.add_output('ArmNodeSocketAction', 'On Shutdown') diff --git a/blender/arm/logicnode/event/LN_on_event.py b/blender/arm/logicnode/event/LN_on_event.py index 0d3df334..4cb7c28b 100644 --- a/blender/arm/logicnode/event/LN_on_event.py +++ b/blender/arm/logicnode/event/LN_on_event.py @@ -10,10 +10,9 @@ class OnEventNode(ArmLogicTreeNode): arm_version = 1 arm_section = 'custom' - property0: StringProperty(name='', default='') + property0: HaxeStringProperty('property0', name='', default='') - def init(self, context): - super(OnEventNode, self).init(context) + def arm_init(self, context): self.add_output('ArmNodeSocketAction', 'Out') def draw_buttons(self, context, layout): diff --git a/blender/arm/logicnode/event/LN_on_init.py b/blender/arm/logicnode/event/LN_on_init.py index 3c75947c..b7246258 100644 --- a/blender/arm/logicnode/event/LN_on_init.py +++ b/blender/arm/logicnode/event/LN_on_init.py @@ -6,6 +6,5 @@ class OnInitNode(ArmLogicTreeNode): bl_label = 'On Init' arm_version = 1 - def init(self, context): - super(OnInitNode, self).init(context) + def arm_init(self, context): self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/event/LN_on_timer.py b/blender/arm/logicnode/event/LN_on_timer.py index 209c0bc8..f5c98e3e 100644 --- a/blender/arm/logicnode/event/LN_on_timer.py +++ b/blender/arm/logicnode/event/LN_on_timer.py @@ -9,9 +9,8 @@ class OnTimerNode(ArmLogicTreeNode): bl_label = 'On Timer' arm_version = 1 - def init(self, context): - super(OnTimerNode, self).init(context) - self.add_input('NodeSocketFloat', 'Duration') - self.add_input('NodeSocketBool', 'Repeat') + def arm_init(self, context): + self.add_input('ArmFloatSocket', 'Duration') + self.add_input('ArmBoolSocket', 'Repeat') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/event/LN_on_update.py b/blender/arm/logicnode/event/LN_on_update.py index df185213..c73ac019 100644 --- a/blender/arm/logicnode/event/LN_on_update.py +++ b/blender/arm/logicnode/event/LN_on_update.py @@ -10,14 +10,14 @@ class OnUpdateNode(ArmLogicTreeNode): bl_idname = 'LNOnUpdateNode' bl_label = 'On Update' arm_version = 1 - property0: EnumProperty( + property0: HaxeEnumProperty( + 'property0', items = [('Update', 'Update', 'Update'), ('Late Update', 'Late Update', 'Late Update'), ('Physics Pre-Update', 'Physics Pre-Update', 'Physics Pre-Update')], name='On', default='Update') - def init(self, context): - super(OnUpdateNode, self).init(context) + def arm_init(self, context): self.add_output('ArmNodeSocketAction', 'Out') def draw_buttons(self, context, layout): diff --git a/blender/arm/logicnode/event/LN_send_event_to_object.py b/blender/arm/logicnode/event/LN_send_event_to_object.py index e9ebce12..8470a704 100644 --- a/blender/arm/logicnode/event/LN_send_event_to_object.py +++ b/blender/arm/logicnode/event/LN_send_event_to_object.py @@ -13,10 +13,9 @@ class SendEventNode(ArmLogicTreeNode): arm_section = 'custom' arm_version = 1 - def init(self, context): - super(SendEventNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketString', 'Event') + self.add_input('ArmStringSocket', 'Event') self.add_input('ArmNodeSocketObject', 'Object') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/event/LN_send_global_event.py b/blender/arm/logicnode/event/LN_send_global_event.py index a85b0b6d..aba0ac0e 100644 --- a/blender/arm/logicnode/event/LN_send_global_event.py +++ b/blender/arm/logicnode/event/LN_send_global_event.py @@ -12,9 +12,8 @@ class SendGlobalEventNode(ArmLogicTreeNode): arm_version = 1 arm_section = 'custom' - def init(self, context): - super(SendGlobalEventNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketString', 'Event') + self.add_input('ArmStringSocket', 'Event') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/input/LN_gamepad.py b/blender/arm/logicnode/input/LN_gamepad.py index b27e705b..83e31ac1 100644 --- a/blender/arm/logicnode/input/LN_gamepad.py +++ b/blender/arm/logicnode/input/LN_gamepad.py @@ -15,7 +15,8 @@ class GamepadNode(ArmLogicTreeNode): arm_version = 1 arm_section = 'gamepad' - property0: EnumProperty( + property0: HaxeEnumProperty( + 'property0', items = [('started', 'Started', 'The gamepad button starts to be pressed'), ('down', 'Down', 'The gamepad button is pressed'), ('released', 'Released', 'The gamepad button stops being pressed')], @@ -23,7 +24,8 @@ class GamepadNode(ArmLogicTreeNode): # ('Moved Right', 'Moved Right', 'Moved Right'),], name='', default='down') - property1: EnumProperty( + property1: HaxeEnumProperty( + 'property1', items = [('cross', 'cross / a', 'cross / a'), ('circle', 'circle / b', 'circle / b'), ('square', 'square / x', 'square / x'), @@ -44,12 +46,11 @@ class GamepadNode(ArmLogicTreeNode): ('touchpad', 'touchpad', 'touchpad'),], name='', default='cross') - def init(self, context): - super(GamepadNode, self).init(context) + def arm_init(self, context): self.add_output('ArmNodeSocketAction', 'Out') - self.add_output('NodeSocketBool', 'State') + self.add_output('ArmBoolSocket', 'State') - self.add_input('NodeSocketInt', 'Gamepad') + self.add_input('ArmIntSocket', 'Gamepad') def draw_buttons(self, context, layout): layout.prop(self, 'property0') diff --git a/blender/arm/logicnode/input/LN_gamepad_coords.py b/blender/arm/logicnode/input/LN_gamepad_coords.py index 959db1e8..2648479a 100644 --- a/blender/arm/logicnode/input/LN_gamepad_coords.py +++ b/blender/arm/logicnode/input/LN_gamepad_coords.py @@ -11,13 +11,12 @@ class GamepadCoordsNode(ArmLogicTreeNode): arm_version = 1 arm_section = 'gamepad' - def init(self, context): - super(GamepadCoordsNode, self).init(context) - self.add_output('NodeSocketVector', 'Left Stick') - self.add_output('NodeSocketVector', 'Right Stick') - self.add_output('NodeSocketVector', 'Left Movement') - self.add_output('NodeSocketVector', 'Right Movement') - self.add_output('NodeSocketFloat', 'Left Trigger') - self.add_output('NodeSocketFloat', 'Right Trigger') + def arm_init(self, context): + self.add_output('ArmVectorSocket', 'Left Stick') + self.add_output('ArmVectorSocket', 'Right Stick') + self.add_output('ArmVectorSocket', 'Left Movement') + self.add_output('ArmVectorSocket', 'Right Movement') + self.add_output('ArmFloatSocket', 'Left Trigger') + self.add_output('ArmFloatSocket', 'Right Trigger') - self.add_input('NodeSocketInt', 'Gamepad') + self.add_input('ArmIntSocket', 'Gamepad') diff --git a/blender/arm/logicnode/input/LN_get_cursor_location.py b/blender/arm/logicnode/input/LN_get_cursor_location.py index bc740be7..6e6eedac 100644 --- a/blender/arm/logicnode/input/LN_get_cursor_location.py +++ b/blender/arm/logicnode/input/LN_get_cursor_location.py @@ -7,9 +7,8 @@ class GetCursorLocationNode(ArmLogicTreeNode): arm_section = 'mouse' arm_version = 1 - def init(self, context): - super(GetCursorLocationNode, self).init(context) - self.add_output('NodeSocketInt', 'X') - self.add_output('NodeSocketInt', 'Y') - self.add_output('NodeSocketInt', 'Inverted X') - self.add_output('NodeSocketInt', 'Inverted Y') + def arm_init(self, context): + self.add_output('ArmIntSocket', 'X') + self.add_output('ArmIntSocket', 'Y') + self.add_output('ArmIntSocket', 'Inverted X') + self.add_output('ArmIntSocket', 'Inverted Y') diff --git a/blender/arm/logicnode/input/LN_get_cursor_state.py b/blender/arm/logicnode/input/LN_get_cursor_state.py index 221bf550..0d1c7c8f 100644 --- a/blender/arm/logicnode/input/LN_get_cursor_state.py +++ b/blender/arm/logicnode/input/LN_get_cursor_state.py @@ -16,8 +16,7 @@ class GetCursorStateNode(ArmLogicTreeNode): arm_section = 'mouse' arm_version = 1 - def init(self, context): - super(GetCursorStateNode, self).init(context) - self.outputs.new('NodeSocketBool', 'Is Hidden Locked') - self.outputs.new('NodeSocketBool', 'Is Hidden') - self.outputs.new('NodeSocketBool', 'Is Locked') + def arm_init(self, context): + self.outputs.new('ArmBoolSocket', 'Is Hidden Locked') + self.outputs.new('ArmBoolSocket', 'Is Hidden') + self.outputs.new('ArmBoolSocket', 'Is Locked') diff --git a/blender/arm/logicnode/input/LN_get_gamepad_started.py b/blender/arm/logicnode/input/LN_get_gamepad_started.py index edfbc040..08fd5fd0 100644 --- a/blender/arm/logicnode/input/LN_get_gamepad_started.py +++ b/blender/arm/logicnode/input/LN_get_gamepad_started.py @@ -6,10 +6,9 @@ class GetGamepadStartedNode(ArmLogicTreeNode): bl_label = 'Get Gamepad Started' arm_version = 1 - def init(self, context): - super(GetGamepadStartedNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketInt', 'Index') + self.add_input('ArmIntSocket', 'Index') self.add_output('ArmNodeSocketAction', 'Out') - self.add_output('NodeSocketString', 'Button') + self.add_output('ArmStringSocket', 'Button') diff --git a/blender/arm/logicnode/input/LN_get_input_map_key.py b/blender/arm/logicnode/input/LN_get_input_map_key.py index 12d98935..5368a9d3 100644 --- a/blender/arm/logicnode/input/LN_get_input_map_key.py +++ b/blender/arm/logicnode/input/LN_get_input_map_key.py @@ -6,10 +6,9 @@ class GetInputMapKeyNode(ArmLogicTreeNode): bl_label = 'Get Input Map Key' arm_version = 1 - def init(self, context): - super(GetInputMapKeyNode, self).init(context) - self.add_input('NodeSocketString', 'Input Map') - self.add_input('NodeSocketString', 'Key') + def arm_init(self, context): + self.add_input('ArmStringSocket', 'Input Map') + self.add_input('ArmStringSocket', 'Key') - self.add_output('NodeSocketFloat', 'Scale', default_value = 1.0) - self.add_output('NodeSocketFloat', 'Deadzone') \ No newline at end of file + self.add_output('ArmFloatSocket', 'Scale', default_value = 1.0) + self.add_output('ArmFloatSocket', 'Deadzone') diff --git a/blender/arm/logicnode/input/LN_get_keyboard_started.py b/blender/arm/logicnode/input/LN_get_keyboard_started.py index 0f655b04..1810c6e0 100644 --- a/blender/arm/logicnode/input/LN_get_keyboard_started.py +++ b/blender/arm/logicnode/input/LN_get_keyboard_started.py @@ -6,9 +6,8 @@ class GetKeyboardStartedNode(ArmLogicTreeNode): bl_label = 'Get Keyboard Started' arm_version = 1 - def init(self, context): - super(GetKeyboardStartedNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_output('ArmNodeSocketAction', 'Out') - self.add_output('NodeSocketString', 'Key') + self.add_output('ArmStringSocket', 'Key') diff --git a/blender/arm/logicnode/input/LN_get_mouse_movement.py b/blender/arm/logicnode/input/LN_get_mouse_movement.py index ee217b5c..fbef5311 100644 --- a/blender/arm/logicnode/input/LN_get_mouse_movement.py +++ b/blender/arm/logicnode/input/LN_get_mouse_movement.py @@ -9,16 +9,15 @@ class GetMouseMovementNode(ArmLogicTreeNode): arm_section = 'mouse' arm_version = 1 - def init(self, context): - super(GetMouseMovementNode, self).init(context) + def arm_init(self, context): - self.add_input('NodeSocketFloat', 'X Multiplier', default_value=-1.0) - self.add_input('NodeSocketFloat', 'Y Multiplier', default_value=-1.0) - self.add_input('NodeSocketFloat', 'Wheel Delta Multiplier', default_value=-1.0) + self.add_input('ArmFloatSocket', 'X Multiplier', default_value=-1.0) + self.add_input('ArmFloatSocket', 'Y Multiplier', default_value=-1.0) + self.add_input('ArmFloatSocket', 'Wheel Delta Multiplier', default_value=-1.0) - self.add_output('NodeSocketFloat', 'X') - self.add_output('NodeSocketFloat', 'Y') - self.add_output('NodeSocketFloat', 'Multiplied X') - self.add_output('NodeSocketFloat', 'Multiplied Y') - self.add_output('NodeSocketInt', 'Wheel Delta') - self.add_output('NodeSocketFloat', 'Multiplied Wheel Delta') + self.add_output('ArmFloatSocket', 'X') + self.add_output('ArmFloatSocket', 'Y') + self.add_output('ArmFloatSocket', 'Multiplied X') + self.add_output('ArmFloatSocket', 'Multiplied Y') + self.add_output('ArmIntSocket', 'Wheel Delta') + self.add_output('ArmFloatSocket', 'Multiplied Wheel Delta') diff --git a/blender/arm/logicnode/input/LN_get_mouse_started.py b/blender/arm/logicnode/input/LN_get_mouse_started.py index 368aa433..9a6fce1f 100644 --- a/blender/arm/logicnode/input/LN_get_mouse_started.py +++ b/blender/arm/logicnode/input/LN_get_mouse_started.py @@ -6,9 +6,8 @@ class GetMouseStartedNode(ArmLogicTreeNode): bl_label = 'Get Mouse Started' arm_version = 1 - def init(self, context): - super(GetMouseStartedNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_output('ArmNodeSocketAction', 'Out') - self.add_output('NodeSocketString', 'Button') + self.add_output('ArmStringSocket', 'Button') diff --git a/blender/arm/logicnode/input/LN_get_touch_location.py b/blender/arm/logicnode/input/LN_get_touch_location.py index 88d6f6df..3aea57b6 100644 --- a/blender/arm/logicnode/input/LN_get_touch_location.py +++ b/blender/arm/logicnode/input/LN_get_touch_location.py @@ -7,9 +7,8 @@ class GetTouchLocationNode(ArmLogicTreeNode): arm_section = 'surface' arm_version = 1 - def init(self, context): - super(GetTouchLocationNode, self).init(context) - self.add_output('NodeSocketInt', 'X') - self.add_output('NodeSocketInt', 'Y') - self.add_output('NodeSocketInt', 'Inverted X') - self.add_output('NodeSocketInt', 'Inverted Y') + def arm_init(self, context): + self.add_output('ArmIntSocket', 'X') + self.add_output('ArmIntSocket', 'Y') + self.add_output('ArmIntSocket', 'Inverted X') + self.add_output('ArmIntSocket', 'Inverted Y') diff --git a/blender/arm/logicnode/input/LN_get_touch_movement.py b/blender/arm/logicnode/input/LN_get_touch_movement.py index 80f918f0..8c37c844 100644 --- a/blender/arm/logicnode/input/LN_get_touch_movement.py +++ b/blender/arm/logicnode/input/LN_get_touch_movement.py @@ -7,12 +7,11 @@ class GetTouchMovementNode(ArmLogicTreeNode): arm_section = 'surface' arm_version = 1 - def init(self, context): - super(GetTouchMovementNode, self).init(context) - self.add_input('NodeSocketFloat', 'X Multiplier', default_value=-1.0) - self.add_input('NodeSocketFloat', 'Y Multiplier', default_value=-1.0) + def arm_init(self, context): + self.add_input('ArmFloatSocket', 'X Multiplier', default_value=-1.0) + self.add_input('ArmFloatSocket', 'Y Multiplier', default_value=-1.0) - self.add_output('NodeSocketFloat', 'X') - self.add_output('NodeSocketFloat', 'Y') - self.add_output('NodeSocketFloat', 'Multiplied X') - self.add_output('NodeSocketFloat', 'Multiplied Y') + self.add_output('ArmFloatSocket', 'X') + self.add_output('ArmFloatSocket', 'Y') + self.add_output('ArmFloatSocket', 'Multiplied X') + self.add_output('ArmFloatSocket', 'Multiplied Y') diff --git a/blender/arm/logicnode/input/LN_keyboard.py b/blender/arm/logicnode/input/LN_keyboard.py index 8e04c8df..7a78e651 100644 --- a/blender/arm/logicnode/input/LN_keyboard.py +++ b/blender/arm/logicnode/input/LN_keyboard.py @@ -7,13 +7,15 @@ class KeyboardNode(ArmLogicTreeNode): arm_section = 'keyboard' arm_version = 1 - property0: EnumProperty( + property0: HaxeEnumProperty( + 'property0', items = [('started', 'Started', 'The keyboard button starts to be pressed'), ('down', 'Down', 'The keyboard button is pressed'), ('released', 'Released', 'The keyboard button stops being pressed')], name='', default='down') - property1: EnumProperty( + property1: HaxeEnumProperty( + 'property1', items = [('a', 'a', 'a'), ('b', 'b', 'b'), ('c', 'c', 'c'), @@ -68,10 +70,9 @@ class KeyboardNode(ArmLogicTreeNode): ('down', 'down', 'down'),], name='', default='space') - def init(self, context): - super(KeyboardNode, self).init(context) + def arm_init(self, context): self.add_output('ArmNodeSocketAction', 'Out') - self.add_output('NodeSocketBool', 'State') + self.add_output('ArmBoolSocket', 'State') def draw_buttons(self, context, layout): layout.prop(self, 'property0') diff --git a/blender/arm/logicnode/input/LN_mouse.py b/blender/arm/logicnode/input/LN_mouse.py index cfdb052c..03624cd7 100644 --- a/blender/arm/logicnode/input/LN_mouse.py +++ b/blender/arm/logicnode/input/LN_mouse.py @@ -7,22 +7,23 @@ class MouseNode(ArmLogicTreeNode): arm_section = 'mouse' arm_version = 1 - property0: EnumProperty( + property0: HaxeEnumProperty( + 'property0', items = [('started', 'Started', 'The mouse button startes to be pressed'), ('down', 'Down', 'The mouse button is pressed'), ('released', 'Released', 'The mouse button stops being pressed'), ('moved', 'Moved', 'Moved')], name='', default='down') - property1: EnumProperty( + property1: HaxeEnumProperty( + 'property1', items = [('left', 'Left', 'Left mouse button'), ('middle', 'Middle', 'Middle mouse button'), ('right', 'Right', 'Right mouse button')], name='', default='left') - def init(self, context): - super(MouseNode, self).init(context) + def arm_init(self, context): self.add_output('ArmNodeSocketAction', 'Out') - self.add_output('NodeSocketBool', 'State') + self.add_output('ArmBoolSocket', 'State') def draw_buttons(self, context, layout): layout.prop(self, 'property0') diff --git a/blender/arm/logicnode/input/LN_on_input_map.py b/blender/arm/logicnode/input/LN_on_input_map.py index 0cc540f5..c851eefe 100644 --- a/blender/arm/logicnode/input/LN_on_input_map.py +++ b/blender/arm/logicnode/input/LN_on_input_map.py @@ -6,11 +6,10 @@ class OnInputMapNode(ArmLogicTreeNode): bl_label = 'On Input Map' arm_version = 1 - def init(self, context): - super(OnInputMapNode, self).init(context) - self.add_input('NodeSocketString', 'Input Map') + def arm_init(self, context): + self.add_input('ArmStringSocket', 'Input Map') self.add_output('ArmNodeSocketAction', 'Started') self.add_output('ArmNodeSocketAction', 'Released') - self.add_output('NodeSocketFloat', 'Value') - self.add_output('NodeSocketString', 'Key Pressed') \ No newline at end of file + self.add_output('ArmFloatSocket', 'Value') + self.add_output('ArmStringSocket', 'Key Pressed') diff --git a/blender/arm/logicnode/input/LN_on_swipe.py b/blender/arm/logicnode/input/LN_on_swipe.py index ed104a41..8bd6226e 100644 --- a/blender/arm/logicnode/input/LN_on_swipe.py +++ b/blender/arm/logicnode/input/LN_on_swipe.py @@ -7,7 +7,7 @@ class NodeAddOutputButton(bpy.types.Operator): bl_label = 'Add 4 States' bl_options = {'UNDO', 'INTERNAL'} node_index: StringProperty(name='Node Index', default='') - socket_type: StringProperty(name='Socket Type', default='NodeSocketShader') + socket_type: StringProperty(name='Socket Type', default='ArmDynamicSocket') name_format: StringProperty(name='Name Format', default='Output {0}') index_name_offset: IntProperty(name='Index Name Offset', default=0) @@ -21,10 +21,10 @@ class NodeAddOutputButton(bpy.types.Operator): global array_nodes node = array_nodes[self.node_index] outs = node.outputs - outs.new('NodeSocketBool', self.get_name_state(len(outs), node.min_outputs)) - outs.new('NodeSocketBool', self.get_name_state(len(outs), node.min_outputs)) - outs.new('NodeSocketBool', self.get_name_state(len(outs), node.min_outputs)) - outs.new('NodeSocketBool', self.get_name_state(len(outs), node.min_outputs)) + outs.new('ArmBoolSocket', self.get_name_state(len(outs), node.min_outputs)) + outs.new('ArmBoolSocket', self.get_name_state(len(outs), node.min_outputs)) + outs.new('ArmBoolSocket', self.get_name_state(len(outs), node.min_outputs)) + outs.new('ArmBoolSocket', self.get_name_state(len(outs), node.min_outputs)) return{'FINISHED'} # Custom class for remove output parameters (in 4 directions) @@ -59,16 +59,15 @@ class OnSwipeNode(ArmLogicTreeNode): super(OnSwipeNode, self).__init__() array_nodes[str(id(self))] = self - def init(self, context): - super(OnSwipeNode, self).init(context) - self.inputs.new('NodeSocketFloat', 'Time') + def arm_init(self, context): + self.inputs.new('ArmFloatSocket', 'Time') self.inputs[-1].default_value = 0.15 - self.inputs.new('NodeSocketInt', 'Min Length (px)') + self.inputs.new('ArmIntSocket', 'Min Length (px)') self.inputs[-1].default_value = 100 self.outputs.new('ArmNodeSocketAction', 'Out') - self.outputs.new('NodeSocketVector', 'Direction') - self.outputs.new('NodeSocketInt', 'Length (px)') - self.outputs.new('NodeSocketInt', 'Angle (0-360)') + self.outputs.new('ArmVectorSocket', 'Direction') + self.outputs.new('ArmIntSocket', 'Length (px)') + self.outputs.new('ArmIntSocket', 'Angle (0-360)') # Draw node buttons def draw_buttons(self, context, layout): diff --git a/blender/arm/logicnode/input/LN_on_tap_screen.py b/blender/arm/logicnode/input/LN_on_tap_screen.py index 9d27e05c..61c4a0fa 100644 --- a/blender/arm/logicnode/input/LN_on_tap_screen.py +++ b/blender/arm/logicnode/input/LN_on_tap_screen.py @@ -18,17 +18,16 @@ class OnTapScreen(ArmLogicTreeNode): arm_section = 'Input' arm_version = 1 - def init(self, context): - super(OnTapScreen, self).init(context) - self.add_input('NodeSocketFloat', 'Duration') + def arm_init(self, context): + self.add_input('ArmFloatSocket', 'Duration') self.inputs[-1].default_value = 0.3 - self.add_input('NodeSocketFloat', 'Interval') + self.add_input('ArmFloatSocket', 'Interval') self.inputs[-1].default_value = 0.0 - self.add_input('NodeSocketInt', 'Repeat') + self.add_input('ArmIntSocket', 'Repeat') self.inputs[-1].default_value = 2 self.add_output('ArmNodeSocketAction', 'Done') self.add_output('ArmNodeSocketAction', 'Fail') self.add_output('ArmNodeSocketAction', 'Tap') - self.add_output('NodeSocketInt', 'Tap Number') - self.add_output('NodeSocketVector', 'Coords') + self.add_output('ArmIntSocket', 'Tap Number') + self.add_output('ArmVectorSocket', 'Coords') diff --git a/blender/arm/logicnode/input/LN_remove_input_map_key.py b/blender/arm/logicnode/input/LN_remove_input_map_key.py index 8821ef05..8da8562b 100644 --- a/blender/arm/logicnode/input/LN_remove_input_map_key.py +++ b/blender/arm/logicnode/input/LN_remove_input_map_key.py @@ -6,10 +6,9 @@ class RemoveInputMapKeyNode(ArmLogicTreeNode): bl_label = 'Remove Input Map Key' arm_version = 1 - def init(self, context): - super(RemoveInputMapKeyNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketString', 'Input Map') - self.add_input('NodeSocketString', 'Key') + self.add_input('ArmStringSocket', 'Input Map') + self.add_input('ArmStringSocket', 'Key') - self.add_output('ArmNodeSocketAction', 'Out') \ No newline at end of file + self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/input/LN_sensor_coords.py b/blender/arm/logicnode/input/LN_sensor_coords.py index 9687630e..a92f38f0 100644 --- a/blender/arm/logicnode/input/LN_sensor_coords.py +++ b/blender/arm/logicnode/input/LN_sensor_coords.py @@ -7,6 +7,5 @@ class SensorCoordsNode(ArmLogicTreeNode): arm_section = 'sensor' arm_version = 1 - def init(self, context): - super(SensorCoordsNode, self).init(context) - self.add_output('NodeSocketVector', 'Coords') + def arm_init(self, context): + self.add_output('ArmVectorSocket', 'Coords') diff --git a/blender/arm/logicnode/input/LN_set_cursor_state.py b/blender/arm/logicnode/input/LN_set_cursor_state.py index ac83802c..0c8c2d6e 100644 --- a/blender/arm/logicnode/input/LN_set_cursor_state.py +++ b/blender/arm/logicnode/input/LN_set_cursor_state.py @@ -14,17 +14,17 @@ class SetCursorStateNode(ArmLogicTreeNode): arm_section = 'mouse' arm_version = 1 - property0: EnumProperty( + property0: HaxeEnumProperty( + 'property0', items = [('hide locked', 'Hide Locked', 'The mouse cursor is hidden and locked'), ('hide', 'Hide', 'The mouse cursor is hidden'), ('lock', 'Lock', 'The mouse cursor is locked'), ], name='', default='hide locked') - def init(self, context): - super(SetCursorStateNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketBool', 'State') + self.add_input('ArmBoolSocket', 'State') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/input/LN_set_input_map_key.py b/blender/arm/logicnode/input/LN_set_input_map_key.py index a2157745..75997d7d 100644 --- a/blender/arm/logicnode/input/LN_set_input_map_key.py +++ b/blender/arm/logicnode/input/LN_set_input_map_key.py @@ -6,23 +6,22 @@ class SetInputMapKeyNode(ArmLogicTreeNode): bl_label = 'Set Input Map Key' arm_version = 1 - property0: EnumProperty( + property0: HaxeEnumProperty( + 'property0', items = [('keyboard', 'Keyboard', 'Keyboard input'), ('mouse', 'Mouse', 'Mouse input'), ('gamepad', 'Gamepad', 'Gamepad input')], name='', default='keyboard') - def init(self, context): - super(SetInputMapKeyNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketString', 'Input Map') - self.add_input('NodeSocketString', 'Key') - self.add_input('NodeSocketFloat', 'Scale', default_value=1.0) - self.add_input('NodeSocketFloat', 'Deadzone') - self.add_input('NodeSocketInt', 'Index') + self.add_input('ArmStringSocket', 'Input Map') + self.add_input('ArmStringSocket', 'Key') + self.add_input('ArmFloatSocket', 'Scale', default_value=1.0) + self.add_input('ArmFloatSocket', 'Deadzone') + self.add_input('ArmIntSocket', 'Index') self.add_output('ArmNodeSocketAction', 'Out') - def draw_buttons(self, context, layout): - layout.prop(self, 'property0') \ No newline at end of file + layout.prop(self, 'property0') diff --git a/blender/arm/logicnode/input/LN_touch.py b/blender/arm/logicnode/input/LN_touch.py index a5774ea5..f6ff0593 100644 --- a/blender/arm/logicnode/input/LN_touch.py +++ b/blender/arm/logicnode/input/LN_touch.py @@ -7,17 +7,17 @@ class SurfaceNode(ArmLogicTreeNode): arm_section = 'surface' arm_version = 1 - property0: EnumProperty( + property0: HaxeEnumProperty( + 'property0', items = [('started', 'Started', 'The screen surface starts to be touched'), ('down', 'Down', 'The screen surface is touched'), ('released', 'Released', 'The screen surface stops being touched'), ('moved', 'Moved', 'Moved')], name='', default='down') - def init(self, context): - super(SurfaceNode, self).init(context) + def arm_init(self, context): self.add_output('ArmNodeSocketAction', 'Out') - self.add_output('NodeSocketBool', 'State') + self.add_output('ArmBoolSocket', 'State') def draw_buttons(self, context, layout): layout.prop(self, 'property0') diff --git a/blender/arm/logicnode/input/LN_virtual_button.py b/blender/arm/logicnode/input/LN_virtual_button.py index d2bce52f..3850a26e 100644 --- a/blender/arm/logicnode/input/LN_virtual_button.py +++ b/blender/arm/logicnode/input/LN_virtual_button.py @@ -7,17 +7,17 @@ class VirtualButtonNode(ArmLogicTreeNode): arm_section = 'virtual' arm_version = 1 - property0: EnumProperty( + property0: HaxeEnumProperty( + 'property0', items = [('started', 'Started', 'The virtual button starts to be pressed'), ('down', 'Down', 'The virtual button is pressed'), ('released', 'Released', 'The virtual button stops being pressed')], name='', default='down') - property1: StringProperty(name='', default='button') + property1: HaxeStringProperty('property1', name='', default='button') - def init(self, context): - super(VirtualButtonNode, self).init(context) + def arm_init(self, context): self.add_output('ArmNodeSocketAction', 'Out') - self.add_output('NodeSocketBool', 'State') + self.add_output('ArmBoolSocket', 'State') def draw_buttons(self, context, layout): layout.prop(self, 'property0') diff --git a/blender/arm/logicnode/light/LN_set_light_color.py b/blender/arm/logicnode/light/LN_set_light_color.py index a62d8366..5af7cde7 100644 --- a/blender/arm/logicnode/light/LN_set_light_color.py +++ b/blender/arm/logicnode/light/LN_set_light_color.py @@ -6,10 +6,9 @@ class SetLightColorNode(ArmLogicTreeNode): bl_label = 'Set Light Color' arm_version = 1 - def init(self, context): - super(SetLightColorNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Light') - self.add_input('NodeSocketColor', 'Color', default_value=[1.0, 1.0, 1.0, 1.0]) + self.add_input('ArmColorSocket', 'Color', default_value=[1.0, 1.0, 1.0, 1.0]) self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/light/LN_set_light_strength.py b/blender/arm/logicnode/light/LN_set_light_strength.py index cd04b753..bc9fd67e 100644 --- a/blender/arm/logicnode/light/LN_set_light_strength.py +++ b/blender/arm/logicnode/light/LN_set_light_strength.py @@ -6,10 +6,9 @@ class SetLightStrengthNode(ArmLogicTreeNode): bl_label = 'Set Light Strength' arm_version = 1 - def init(self, context): - super(SetLightStrengthNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Light') - self.add_input('NodeSocketFloat', 'Strength', default_value=250) + self.add_input('ArmFloatSocket', 'Strength', default_value=250) self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/logic/LN_alternate_output.py b/blender/arm/logicnode/logic/LN_alternate_output.py index 839c75bd..8f0a81e6 100644 --- a/blender/arm/logicnode/logic/LN_alternate_output.py +++ b/blender/arm/logicnode/logic/LN_alternate_output.py @@ -8,8 +8,7 @@ class AlternateNode(ArmLogicTreeNode): arm_section = 'flow' arm_version = 1 - def init(self, context): - super(AlternateNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_output('ArmNodeSocketAction', '0') diff --git a/blender/arm/logicnode/logic/LN_branch.py b/blender/arm/logicnode/logic/LN_branch.py index 45037e1d..5693f882 100644 --- a/blender/arm/logicnode/logic/LN_branch.py +++ b/blender/arm/logicnode/logic/LN_branch.py @@ -8,10 +8,9 @@ class BranchNode(ArmLogicTreeNode): bl_label = 'Branch' arm_version = 1 - def init(self, context): - super(BranchNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketBool', 'Bool') + self.add_input('ArmBoolSocket', 'Bool') self.add_output('ArmNodeSocketAction', 'True') self.add_output('ArmNodeSocketAction', 'False') diff --git a/blender/arm/logicnode/logic/LN_call_function.py b/blender/arm/logicnode/logic/LN_call_function.py index 0dce0371..819407ad 100644 --- a/blender/arm/logicnode/logic/LN_call_function.py +++ b/blender/arm/logicnode/logic/LN_call_function.py @@ -13,20 +13,19 @@ class CallFunctionNode(ArmLogicTreeNode): super(CallFunctionNode, self).__init__() array_nodes[str(id(self))] = self - def init(self, context): - super(CallFunctionNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketShader', 'Trait/Any') - self.add_input('NodeSocketString', 'Function') + self.add_input('ArmDynamicSocket', 'Trait/Any') + self.add_input('ArmStringSocket', 'Function') self.add_output('ArmNodeSocketAction', 'Out') - self.add_output('NodeSocketShader', 'Result') + self.add_output('ArmDynamicSocket', 'Result') def draw_buttons(self, context, layout): row = layout.row(align=True) op = row.operator('arm.node_add_input', text='Add Arg', icon='PLUS', emboss=True) op.node_index = str(id(self)) - op.socket_type = 'NodeSocketShader' + op.socket_type = 'ArmDynamicSocket' op.name_format = "Arg {0}" op.index_name_offset = -2 op2 = row.operator('arm.node_remove_input', text='', icon='X', emboss=True) diff --git a/blender/arm/logicnode/logic/LN_function.py b/blender/arm/logicnode/logic/LN_function.py index ee2ecc7d..2d3fe0dd 100644 --- a/blender/arm/logicnode/logic/LN_function.py +++ b/blender/arm/logicnode/logic/LN_function.py @@ -15,8 +15,7 @@ class FunctionNode(ArmLogicTreeNode): super(FunctionNode, self).__init__() array_nodes[str(id(self))] = self - def init(self, context): - super(FunctionNode, self).init(context) + def arm_init(self, context): self.add_output('ArmNodeSocketAction', 'Out') function_name: StringProperty(name="Name") @@ -27,7 +26,7 @@ class FunctionNode(ArmLogicTreeNode): row = layout.row(align=True) op = row.operator('arm.node_add_output', text='Add Arg', icon='PLUS', emboss=True) op.node_index = str(id(self)) - op.socket_type = 'NodeSocketShader' + op.socket_type = 'ArmDynamicSocket' op.name_format = "Arg {0}" op.index_name_offset = 0 op2 = row.operator('arm.node_remove_output', text='', icon='X', emboss=True) diff --git a/blender/arm/logicnode/logic/LN_function_output.py b/blender/arm/logicnode/logic/LN_function_output.py index 6ac65e7c..073b364f 100644 --- a/blender/arm/logicnode/logic/LN_function_output.py +++ b/blender/arm/logicnode/logic/LN_function_output.py @@ -10,10 +10,9 @@ class FunctionOutputNode(ArmLogicTreeNode): arm_section = 'function' arm_version = 1 - def init(self, context): - super(FunctionOutputNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketShader', 'Value') + self.add_input('ArmDynamicSocket', 'Value') function_name: StringProperty(name="Name") diff --git a/blender/arm/logicnode/logic/LN_gate.py b/blender/arm/logicnode/logic/LN_gate.py index 5fbc6818..e67b9f23 100644 --- a/blender/arm/logicnode/logic/LN_gate.py +++ b/blender/arm/logicnode/logic/LN_gate.py @@ -20,7 +20,8 @@ class GateNode(ArmLogicTreeNode): arm_version = 1 min_inputs = 3 - property0: EnumProperty( + property0: HaxeEnumProperty( + 'property0', items = [('Equal', 'Equal', 'Equal'), ('Almost Equal', 'Almost Equal', 'Almost Equal'), ('Greater', 'Greater', 'Greater'), @@ -31,17 +32,16 @@ class GateNode(ArmLogicTreeNode): ('And', 'And', 'And')], name='', default='Equal', update=remove_extra_inputs) - property1: FloatProperty(name='Tolerance', description='Precision for float compare', default=0.0001) + property1: HaxeFloatProperty('property1', name='Tolerance', description='Precision for float compare', default=0.0001) def __init__(self): super(GateNode, self).__init__() array_nodes[str(id(self))] = self - def init(self, context): - super(GateNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketShader', 'Input 1') - self.add_input('NodeSocketShader', 'Input 2') + self.add_input('ArmDynamicSocket', 'Input 1') + self.add_input('ArmDynamicSocket', 'Input 2') self.add_output('ArmNodeSocketAction', 'True') self.add_output('ArmNodeSocketAction', 'False') @@ -56,6 +56,6 @@ class GateNode(ArmLogicTreeNode): row = layout.row(align=True) op = row.operator('arm.node_add_input', text='New', icon='PLUS', emboss=True) op.node_index = str(id(self)) - op.socket_type = 'NodeSocketShader' + op.socket_type = 'ArmDynamicSocket' op2 = row.operator('arm.node_remove_input', text='', icon='X', emboss=True) op2.node_index = str(id(self)) diff --git a/blender/arm/logicnode/logic/LN_invert_boolean.py b/blender/arm/logicnode/logic/LN_invert_boolean.py index 924ab58e..c981c7cc 100644 --- a/blender/arm/logicnode/logic/LN_invert_boolean.py +++ b/blender/arm/logicnode/logic/LN_invert_boolean.py @@ -6,8 +6,7 @@ class NotNode(ArmLogicTreeNode): bl_label = 'Invert Boolean' arm_version = 1 - def init(self, context): - super(NotNode, self).init(context) - self.add_input('NodeSocketBool', 'Bool In') + def arm_init(self, context): + self.add_input('ArmBoolSocket', 'Bool In') - self.add_output('NodeSocketBool', 'Bool Out') + self.add_output('ArmBoolSocket', 'Bool Out') diff --git a/blender/arm/logicnode/logic/LN_invert_output.py b/blender/arm/logicnode/logic/LN_invert_output.py index 04c7d596..7a30dbb8 100644 --- a/blender/arm/logicnode/logic/LN_invert_output.py +++ b/blender/arm/logicnode/logic/LN_invert_output.py @@ -8,8 +8,7 @@ class InverseNode(ArmLogicTreeNode): arm_section = 'flow' arm_version = 1 - def init(self, context): - super(InverseNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/logic/LN_is_false.py b/blender/arm/logicnode/logic/LN_is_false.py index 8eb86772..304c025d 100644 --- a/blender/arm/logicnode/logic/LN_is_false.py +++ b/blender/arm/logicnode/logic/LN_is_false.py @@ -10,9 +10,8 @@ class IsFalseNode(ArmLogicTreeNode): bl_label = 'Is False' arm_version = 1 - def init(self, context): - super(IsFalseNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketBool', 'Bool') + self.add_input('ArmBoolSocket', 'Bool') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/logic/LN_is_not_null.py b/blender/arm/logicnode/logic/LN_is_not_null.py index 4e7e0cb4..e18ee5a4 100644 --- a/blender/arm/logicnode/logic/LN_is_not_null.py +++ b/blender/arm/logicnode/logic/LN_is_not_null.py @@ -9,9 +9,8 @@ class IsNotNoneNode(ArmLogicTreeNode): bl_label = 'Is Not Null' arm_version = 1 - def init(self, context): - super(IsNotNoneNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketShader', 'Value') + self.add_input('ArmDynamicSocket', 'Value') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/logic/LN_is_null.py b/blender/arm/logicnode/logic/LN_is_null.py index b8f77a80..da2e120c 100644 --- a/blender/arm/logicnode/logic/LN_is_null.py +++ b/blender/arm/logicnode/logic/LN_is_null.py @@ -10,9 +10,8 @@ class IsNoneNode(ArmLogicTreeNode): bl_label = 'Is Null' arm_version = 1 - def init(self, context): - super(IsNoneNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketShader', 'Value') + self.add_input('ArmDynamicSocket', 'Value') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/logic/LN_is_true.py b/blender/arm/logicnode/logic/LN_is_true.py index 21f255d0..17f0b47b 100644 --- a/blender/arm/logicnode/logic/LN_is_true.py +++ b/blender/arm/logicnode/logic/LN_is_true.py @@ -9,9 +9,8 @@ class IsTrueNode(ArmLogicTreeNode): bl_label = 'Is True' arm_version = 1 - def init(self, context): - super(IsTrueNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketBool', 'Bool') + self.add_input('ArmBoolSocket', 'Bool') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/logic/LN_loop.py b/blender/arm/logicnode/logic/LN_loop.py index 9d69085e..212c514d 100644 --- a/blender/arm/logicnode/logic/LN_loop.py +++ b/blender/arm/logicnode/logic/LN_loop.py @@ -20,14 +20,13 @@ class LoopNode(ArmLogicTreeNode): arm_section = 'flow' arm_version = 1 - def init(self, context): - super(LoopNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketInt', 'From') - self.add_input('NodeSocketInt', 'To') + self.add_input('ArmIntSocket', 'From') + self.add_input('ArmIntSocket', 'To') self.add_output('ArmNodeSocketAction', 'Loop') - self.add_output('NodeSocketInt', 'Index') + self.add_output('ArmIntSocket', 'Index') self.add_output('ArmNodeSocketAction', 'Done') def draw_label(self) -> str: diff --git a/blender/arm/logicnode/logic/LN_loop_break.py b/blender/arm/logicnode/logic/LN_loop_break.py index 3c0d8a2c..326d15b8 100644 --- a/blender/arm/logicnode/logic/LN_loop_break.py +++ b/blender/arm/logicnode/logic/LN_loop_break.py @@ -12,6 +12,5 @@ class LoopBreakNode(ArmLogicTreeNode): arm_section = 'flow' arm_version = 1 - def init(self, context): - super(LoopBreakNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') diff --git a/blender/arm/logicnode/logic/LN_merge.py b/blender/arm/logicnode/logic/LN_merge.py index ce42ac80..a209c690 100644 --- a/blender/arm/logicnode/logic/LN_merge.py +++ b/blender/arm/logicnode/logic/LN_merge.py @@ -29,7 +29,8 @@ class MergeNode(ArmLogicTreeNode): def update_exec_mode(self, context): self.outputs['Active Input Index'].hide = self.property0 == 'once_per_frame' - property0: EnumProperty( + property0: HaxeEnumProperty( + 'property0', name='Execution Mode', description='The node\'s behaviour if multiple inputs are active on the same frame', items=[('once_per_input', 'Once Per Input', @@ -45,10 +46,9 @@ class MergeNode(ArmLogicTreeNode): super(MergeNode, self).__init__() array_nodes[str(id(self))] = self - def init(self, context): - super(MergeNode, self).init(context) + def arm_init(self, context): self.add_output('ArmNodeSocketAction', 'Out') - self.add_output('NodeSocketInt', 'Active Input Index') + self.add_output('ArmIntSocket', 'Active Input Index') def draw_buttons(self, context, layout): layout.prop(self, 'property0', text='') diff --git a/blender/arm/logicnode/logic/LN_null.py b/blender/arm/logicnode/logic/LN_null.py index 610328a1..ed0d9601 100644 --- a/blender/arm/logicnode/logic/LN_null.py +++ b/blender/arm/logicnode/logic/LN_null.py @@ -6,6 +6,5 @@ class NoneNode(ArmLogicTreeNode): bl_label = 'Null' arm_version = 1 - def init(self, context): - super(NoneNode, self).init(context) - self.add_output('NodeSocketShader', 'Null') + def arm_init(self, context): + self.add_output('ArmDynamicSocket', 'Null') diff --git a/blender/arm/logicnode/logic/LN_once_per_frame.py b/blender/arm/logicnode/logic/LN_once_per_frame.py index b7dba2f1..56c82fc5 100644 --- a/blender/arm/logicnode/logic/LN_once_per_frame.py +++ b/blender/arm/logicnode/logic/LN_once_per_frame.py @@ -9,8 +9,7 @@ class OncePerFrameNode(ArmLogicTreeNode): arm_section = 'flow' arm_version = 1 - def init(self, context): - super(OncePerFrameNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/logic/LN_output_sequence.py b/blender/arm/logicnode/logic/LN_output_sequence.py index 3d973cdd..f6166a69 100644 --- a/blender/arm/logicnode/logic/LN_output_sequence.py +++ b/blender/arm/logicnode/logic/LN_output_sequence.py @@ -11,8 +11,7 @@ class SequenceNode(ArmLogicTreeNode): super(SequenceNode, self).__init__() array_nodes[str(id(self))] = self - def init(self, context): - super(SequenceNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') def draw_buttons(self, context, layout): diff --git a/blender/arm/logicnode/logic/LN_output_to_boolean.py b/blender/arm/logicnode/logic/LN_output_to_boolean.py index f7ed282c..d03c79cf 100644 --- a/blender/arm/logicnode/logic/LN_output_to_boolean.py +++ b/blender/arm/logicnode/logic/LN_output_to_boolean.py @@ -7,8 +7,7 @@ class ToBoolNode(ArmLogicTreeNode): bl_label = 'Output to Boolean' arm_version = 1 - def init(self, context): - super(ToBoolNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_output('NodeSocketBool', 'Bool') + self.add_output('ArmBoolSocket', 'Bool') diff --git a/blender/arm/logicnode/logic/LN_select.py b/blender/arm/logicnode/logic/LN_select.py index 4ea3762a..55f39a83 100644 --- a/blender/arm/logicnode/logic/LN_select.py +++ b/blender/arm/logicnode/logic/LN_select.py @@ -37,7 +37,8 @@ class SelectNode(ArmLogicTreeNode): def update_exec_mode(self, context): self.set_mode() - property0: EnumProperty( + property0: HaxeEnumProperty( + 'property0', name='Execution Mode', description="The node's behaviour.", items=[ @@ -55,9 +56,7 @@ class SelectNode(ArmLogicTreeNode): super().__init__() array_nodes[str(id(self))] = self - def init(self, context): - super().init(context) - + def arm_init(self, context): self.set_mode() def set_mode(self): @@ -65,8 +64,8 @@ class SelectNode(ArmLogicTreeNode): self.outputs.clear() if self.property0 == 'from_index': - self.add_input('NodeSocketInt', 'Index') - self.add_input('NodeSocketShader', 'Default') + self.add_input('ArmIntSocket', 'Index') + self.add_input('ArmDynamicSocket', 'Default') self.num_choices = 0 # from_input @@ -75,12 +74,12 @@ class SelectNode(ArmLogicTreeNode): # 0 for the "from_index" mode and it makes the code simpler # if we stick to the same convention for both exec modes self.add_input('ArmNodeSocketAction', 'Input 0') - self.add_input('NodeSocketShader', 'Value 0') + self.add_input('ArmDynamicSocket', 'Value 0') self.num_choices = 1 self.add_output('ArmNodeSocketAction', 'Out') - self.add_output('NodeSocketShader', 'Value') + self.add_output('ArmDynamicSocket', 'Value') def draw_buttons(self, context, layout): layout.prop(self, 'property0', text='') @@ -102,7 +101,7 @@ class SelectNode(ArmLogicTreeNode): # Move new action input up to the end of all other action inputs self.inputs.move(from_index=len(self.inputs) - 1, to_index=self.num_choices) - self.add_input('NodeSocketShader', f'Value {self.num_choices}') + self.add_input('ArmDynamicSocket', f'Value {self.num_choices}') self.num_choices += 1 diff --git a/blender/arm/logicnode/logic/LN_switch_output.py b/blender/arm/logicnode/logic/LN_switch_output.py index 95a9ddba..688245e2 100644 --- a/blender/arm/logicnode/logic/LN_switch_output.py +++ b/blender/arm/logicnode/logic/LN_switch_output.py @@ -15,10 +15,9 @@ class SwitchNode(ArmLogicTreeNode): super(SwitchNode, self).__init__() array_nodes[str(id(self))] = self - def init(self, context): - super(SwitchNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketShader', 'Value') + self.add_input('ArmDynamicSocket', 'Value') self.add_output('ArmNodeSocketAction', 'Default') @@ -26,7 +25,7 @@ class SwitchNode(ArmLogicTreeNode): row = layout.row(align=True) op = row.operator('arm.node_add_input_output', text='New', icon='PLUS', emboss=True) op.node_index = str(id(self)) - op.in_socket_type = 'NodeSocketShader' + op.in_socket_type = 'ArmDynamicSocket' op.out_socket_type = 'ArmNodeSocketAction' op.in_name_format = 'Case {0}' op.out_name_format = 'Case {0}' diff --git a/blender/arm/logicnode/logic/LN_value_changed.py b/blender/arm/logicnode/logic/LN_value_changed.py index 42b9ae0a..82af3d5c 100644 --- a/blender/arm/logicnode/logic/LN_value_changed.py +++ b/blender/arm/logicnode/logic/LN_value_changed.py @@ -6,10 +6,9 @@ class ValueChangedNode(ArmLogicTreeNode): bl_label = 'Value Changed' arm_version = 1 - def init(self, context): - super(ValueChangedNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketShader', 'Value') + self.add_input('ArmDynamicSocket', 'Value') self.add_output('ArmNodeSocketAction', 'Changed') self.add_output('ArmNodeSocketAction', 'Unchanged') diff --git a/blender/arm/logicnode/logic/LN_while_true.py b/blender/arm/logicnode/logic/LN_while_true.py index ba99b9ad..b2a7b670 100644 --- a/blender/arm/logicnode/logic/LN_while_true.py +++ b/blender/arm/logicnode/logic/LN_while_true.py @@ -15,10 +15,9 @@ class WhileNode(ArmLogicTreeNode): arm_section = 'flow' arm_version = 1 - def init(self, context): - super(WhileNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketBool', 'Condition') + self.add_input('ArmBoolSocket', 'Condition') self.add_output('ArmNodeSocketAction', 'Loop') self.add_output('ArmNodeSocketAction', 'Done') diff --git a/blender/arm/logicnode/material/LN_get_object_material.py b/blender/arm/logicnode/material/LN_get_object_material.py index 864c48ee..8e64630d 100644 --- a/blender/arm/logicnode/material/LN_get_object_material.py +++ b/blender/arm/logicnode/material/LN_get_object_material.py @@ -6,9 +6,8 @@ class GetMaterialNode(ArmLogicTreeNode): bl_label = 'Get Object Material' arm_version = 1 - def init(self, context): - super(GetMaterialNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketObject', 'Object') - self.add_input('NodeSocketInt', 'Slot') + self.add_input('ArmIntSocket', 'Slot') - self.add_output('NodeSocketShader', 'Material') + self.add_output('ArmDynamicSocket', 'Material') diff --git a/blender/arm/logicnode/material/LN_material.py b/blender/arm/logicnode/material/LN_material.py index 03e923b6..082f2a80 100644 --- a/blender/arm/logicnode/material/LN_material.py +++ b/blender/arm/logicnode/material/LN_material.py @@ -18,11 +18,10 @@ class MaterialNode(ArmLogicTreeNode): return self.property0.name return arm.utils.asset_name(bpy.data.materials[self.property0.name]) - property0: PointerProperty(name='', type=bpy.types.Material) + property0: HaxePointerProperty('property0', name='', type=bpy.types.Material) - def init(self, context): - super(MaterialNode, self).init(context) - self.add_output('NodeSocketShader', 'Material', is_var=True) + def arm_init(self, context): + self.add_output('ArmDynamicSocket', 'Material', is_var=True) def draw_buttons(self, context, layout): layout.prop_search(self, 'property0', bpy.data, 'materials', icon='NONE', text='') diff --git a/blender/arm/logicnode/material/LN_set_material_image_param.py b/blender/arm/logicnode/material/LN_set_material_image_param.py index 1002e94e..686562c1 100644 --- a/blender/arm/logicnode/material/LN_set_material_image_param.py +++ b/blender/arm/logicnode/material/LN_set_material_image_param.py @@ -22,14 +22,13 @@ class SetMaterialImageParamNode(ArmLogicTreeNode): arm_section = 'params' arm_version = 2 - def init(self, context): - super(SetMaterialImageParamNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Object') - self.add_input('NodeSocketBool', 'Per Object') - self.add_input('NodeSocketShader', 'Material') - self.add_input('NodeSocketString', 'Node') - self.add_input('NodeSocketString', 'Image') + self.add_input('ArmBoolSocket', 'Per Object') + self.add_input('ArmDynamicSocket', 'Material') + self.add_input('ArmStringSocket', 'Node') + self.add_input('ArmStringSocket', 'Image') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/material/LN_set_material_rgb_param.py b/blender/arm/logicnode/material/LN_set_material_rgb_param.py index f99c7ff7..607c0ed2 100644 --- a/blender/arm/logicnode/material/LN_set_material_rgb_param.py +++ b/blender/arm/logicnode/material/LN_set_material_rgb_param.py @@ -22,14 +22,13 @@ class SetMaterialRgbParamNode(ArmLogicTreeNode): arm_section = 'params' arm_version = 2 - def init(self, context): - super(SetMaterialRgbParamNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Object') - self.add_input('NodeSocketBool', 'Per Object') - self.add_input('NodeSocketShader', 'Material') - self.add_input('NodeSocketString', 'Node') - self.add_input('NodeSocketColor', 'Color') + self.add_input('ArmBoolSocket', 'Per Object') + self.add_input('ArmDynamicSocket', 'Material') + self.add_input('ArmStringSocket', 'Node') + self.add_input('ArmColorSocket', 'Color') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/material/LN_set_material_value_param.py b/blender/arm/logicnode/material/LN_set_material_value_param.py index 439f54aa..e3f2164c 100644 --- a/blender/arm/logicnode/material/LN_set_material_value_param.py +++ b/blender/arm/logicnode/material/LN_set_material_value_param.py @@ -22,14 +22,13 @@ class SetMaterialValueParamNode(ArmLogicTreeNode): arm_section = 'params' arm_version = 2 - def init(self, context): - super(SetMaterialValueParamNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Object') - self.add_input('NodeSocketBool', 'Per Object') - self.add_input('NodeSocketShader', 'Material') - self.add_input('NodeSocketString', 'Node') - self.add_input('NodeSocketFloat', 'Float') + self.add_input('ArmBoolSocket', 'Per Object') + self.add_input('ArmDynamicSocket', 'Material') + self.add_input('ArmStringSocket', 'Node') + self.add_input('ArmFloatSocket', 'Float') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/material/LN_set_object_material_slot.py b/blender/arm/logicnode/material/LN_set_object_material_slot.py index 3806c898..ccfab366 100644 --- a/blender/arm/logicnode/material/LN_set_object_material_slot.py +++ b/blender/arm/logicnode/material/LN_set_object_material_slot.py @@ -6,11 +6,10 @@ class SetMaterialSlotNode(ArmLogicTreeNode): bl_label = 'Set Object Material Slot' arm_version = 1 - def init(self, context): - super(SetMaterialSlotNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Object') - self.add_input('NodeSocketShader', 'Material') - self.add_input('NodeSocketInt', 'Slot') + self.add_input('ArmDynamicSocket', 'Material') + self.add_input('ArmIntSocket', 'Slot') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/math/LN_clamp.py b/blender/arm/logicnode/math/LN_clamp.py index 9205d4d9..257c3802 100644 --- a/blender/arm/logicnode/math/LN_clamp.py +++ b/blender/arm/logicnode/math/LN_clamp.py @@ -9,10 +9,9 @@ class ClampNode(ArmLogicTreeNode): bl_label = 'Clamp' arm_version = 1 - def init(self, context): - super(ClampNode, self).init(context) - self.add_input('NodeSocketFloat', 'Value') - self.add_input('NodeSocketFloat', 'Min') - self.add_input('NodeSocketFloat', 'Max') + def arm_init(self, context): + self.add_input('ArmFloatSocket', 'Value') + self.add_input('ArmFloatSocket', 'Min') + self.add_input('ArmFloatSocket', 'Max') - self.add_output('NodeSocketFloat', 'Result') + self.add_output('ArmFloatSocket', 'Result') diff --git a/blender/arm/logicnode/math/LN_compare.py b/blender/arm/logicnode/math/LN_compare.py index 7b1a59ef..c3b86472 100644 --- a/blender/arm/logicnode/math/LN_compare.py +++ b/blender/arm/logicnode/math/LN_compare.py @@ -10,7 +10,8 @@ class CompareNode(ArmLogicTreeNode): bl_idname = 'LNCompareNode' bl_label = 'Compare' arm_version = 1 - property0: EnumProperty( + property0: HaxeEnumProperty( + 'property0', items = [('Equal', 'Equal', 'Equal'), ('Almost Equal', 'Almost Equal', 'Almost Equal'), ('Greater', 'Greater', 'Greater'), @@ -22,18 +23,17 @@ class CompareNode(ArmLogicTreeNode): name='', default='Equal', update=remove_extra_inputs) min_inputs = 2 - property1: FloatProperty(name='Tolerance', description='Precision for float compare', default=0.0001) + property1: HaxeFloatProperty('property1', name='Tolerance', description='Precision for float compare', default=0.0001) def __init__(self): super(CompareNode, self).__init__() array_nodes[str(id(self))] = self - def init(self, context): - super(CompareNode, self).init(context) - self.add_input('NodeSocketShader', 'Value') - self.add_input('NodeSocketShader', 'Value') + def arm_init(self, context): + self.add_input('ArmDynamicSocket', 'Value') + self.add_input('ArmDynamicSocket', 'Value') - self.add_output('NodeSocketBool', 'Bool') + self.add_output('ArmBoolSocket', 'Bool') def draw_buttons(self, context, layout): layout.prop(self, 'property0') @@ -45,6 +45,6 @@ class CompareNode(ArmLogicTreeNode): row = layout.row(align=True) op = row.operator('arm.node_add_input', text='New', icon='PLUS', emboss=True) op.node_index = str(id(self)) - op.socket_type = 'NodeSocketShader' + op.socket_type = 'ArmDynamicSocket' op2 = row.operator('arm.node_remove_input', text='', icon='X', emboss=True) op2.node_index = str(id(self)) diff --git a/blender/arm/logicnode/math/LN_deg_to_rad.py b/blender/arm/logicnode/math/LN_deg_to_rad.py index 64e63a61..6ee81e61 100644 --- a/blender/arm/logicnode/math/LN_deg_to_rad.py +++ b/blender/arm/logicnode/math/LN_deg_to_rad.py @@ -7,8 +7,7 @@ class DegToRadNode(ArmLogicTreeNode): arm_version = 1 arm_section = 'angle' - def init(self, context): - super(DegToRadNode, self).init(context) - self.add_input('NodeSocketFloat', 'Degrees') + def arm_init(self, context): + self.add_input('ArmFloatSocket', 'Degrees') - self.add_output('NodeSocketFloat', 'Radians') + self.add_output('ArmFloatSocket', 'Radians') diff --git a/blender/arm/logicnode/math/LN_map_range.py b/blender/arm/logicnode/math/LN_map_range.py index d1d370b8..0008ce88 100644 --- a/blender/arm/logicnode/math/LN_map_range.py +++ b/blender/arm/logicnode/math/LN_map_range.py @@ -9,12 +9,11 @@ class MapRangeNode(ArmLogicTreeNode): bl_label = 'Map Range' arm_version = 1 - def init(self, context): - super(MapRangeNode, self).init(context) - self.add_input('NodeSocketFloat', 'Value', default_value=1.0) - self.add_input('NodeSocketFloat', 'From Min') - self.add_input('NodeSocketFloat', 'From Max', default_value=1.0) - self.add_input('NodeSocketFloat', 'To Min') - self.add_input('NodeSocketFloat', 'To Max', default_value=1.0) + def arm_init(self, context): + self.add_input('ArmFloatSocket', 'Value', default_value=1.0) + self.add_input('ArmFloatSocket', 'From Min') + self.add_input('ArmFloatSocket', 'From Max', default_value=1.0) + self.add_input('ArmFloatSocket', 'To Min') + self.add_input('ArmFloatSocket', 'To Max', default_value=1.0) - self.add_output('NodeSocketFloat', 'Result') + self.add_output('ArmFloatSocket', 'Result') diff --git a/blender/arm/logicnode/math/LN_math.py b/blender/arm/logicnode/math/LN_math.py index 3d8c4796..2271c2dc 100644 --- a/blender/arm/logicnode/math/LN_math.py +++ b/blender/arm/logicnode/math/LN_math.py @@ -51,20 +51,21 @@ class MathNode(ArmLogicTreeNode): # Many arguments: Add, Subtract, Multiply, Divide if (self.get_count_in(select_current) == 0): while (len(self.inputs) < 2): - self.add_input('NodeSocketFloat', 'Value ' + str(len(self.inputs))) + self.add_input('ArmFloatSocket', 'Value ' + str(len(self.inputs))) # 2 arguments: Max, Min, Power, Arctan2, Modulo, Less Than, Greater Than if (self.get_count_in(select_current) == 2): 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))) + self.add_input('ArmFloatSocket', 'Value ' + str(len(self.inputs))) # 1 argument: Sine, Cosine, Abs, Tangent, Arcsine, Arccosine, Arctangent, Logarithm, Round, Floor, Ceil, Square Root, Fract, Exponent if (self.get_count_in(select_current) == 1): while (len(self.inputs) > 1): self.inputs.remove(self.inputs.values()[-1]) self['property0'] = value - property0: EnumProperty( + property0: HaxeEnumProperty( + 'property0', items = [('Add', 'Add', 'Add'), ('Multiply', 'Multiply', 'Multiply'), ('Sine', 'Sine', 'Sine'), @@ -92,24 +93,19 @@ class MathNode(ArmLogicTreeNode): ('Exponent', 'Exponent', 'Exponent')], name='', default='Add', set=set_enum, get=get_enum) - @property - def property1(self): - return 'true' if self.property1_ else 'false' - - property1_: BoolProperty(name='Clamp', default=False) + property1: HaxeBoolProperty('property1', name='Clamp', default=False) def __init__(self): array_nodes[str(id(self))] = self - def init(self, context): - super(MathNode, self).init(context) - self.add_input('NodeSocketFloat', 'Value 0', default_value=0.0) - self.add_input('NodeSocketFloat', 'Value 1', default_value=0.0) + def arm_init(self, context): + self.add_input('ArmFloatSocket', 'Value 0', default_value=0.0) + self.add_input('ArmFloatSocket', 'Value 1', default_value=0.0) - self.add_output('NodeSocketFloat', 'Result') + self.add_output('ArmFloatSocket', 'Result') def draw_buttons(self, context, layout): - layout.prop(self, 'property1_') + layout.prop(self, 'property1') layout.prop(self, 'property0') # Many arguments: Add, Subtract, Multiply, Divide if (self.get_count_in(self.property0) == 0): @@ -117,7 +113,7 @@ class MathNode(ArmLogicTreeNode): 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.socket_type = 'ArmFloatSocket' op.name_format = 'Value {0}' column = row.column(align=True) op = column.operator('arm.node_remove_input', text='', icon='X', emboss=True) diff --git a/blender/arm/logicnode/math/LN_math_expression.py b/blender/arm/logicnode/math/LN_math_expression.py index b2fd3392..0795d6a8 100644 --- a/blender/arm/logicnode/math/LN_math_expression.py +++ b/blender/arm/logicnode/math/LN_math_expression.py @@ -8,15 +8,15 @@ class MathExpressionNode(ArmLogicTreeNode): arm_version = 1 min_inputs = 2 max_inputs = 10 - + @staticmethod def get_variable_name(index): return { - 0: 'a', - 1: 'b', - 2: 'c', - 3: 'd', - 4: 'e', + 0: 'a', + 1: 'b', + 2: 'c', + 3: 'd', + 4: 'e', 5: 'x', 6: 'y', 7: 'h', @@ -27,7 +27,7 @@ class MathExpressionNode(ArmLogicTreeNode): @staticmethod def get_clear_exp(value): return re.sub(r'[\-\+\*\/\(\)\^\%abcdexyhik0123456789. ]', '', value).strip() - + @staticmethod def get_invalid_characters(value): value = value.replace(' ', '') @@ -70,7 +70,7 @@ class MathExpressionNode(ArmLogicTreeNode): return False return True - @staticmethod + @staticmethod def matches(line, opendelim='(', closedelim=')'): stack = [] for m in re.finditer(r'[{}{}]'.format(opendelim, closedelim), line): @@ -92,7 +92,7 @@ class MathExpressionNode(ArmLogicTreeNode): if len(stack) > 0: for pos in stack: yield (False, 0, 0, 0) - + @staticmethod def isPartCorrect(s): if len(s.replace('p', '').replace(' ', '').split()) == 0: @@ -151,21 +151,20 @@ class MathExpressionNode(ArmLogicTreeNode): elif not self.isCorrect(self, value.replace(' ', '')): val_error = True self.set_exp_error(val_error) - + def get_exp(self): return self.get('property0', 'a + b') - property0: StringProperty(name='', description='Expression (operation: +, -, *, /, ^, (, ), %)', set=set_exp, get=get_exp) - property1: BoolProperty(name='Clamp', default=False) + property0: HaxeStringProperty('property0', name='', description='Expression (operation: +, -, *, /, ^, (, ), %)', set=set_exp, get=get_exp) + property1: HaxeBoolProperty('property1', name='Clamp', default=False) def __init__(self): array_nodes[str(id(self))] = self - def init(self, context): - super(MathExpressionNode, self).init(context) - self.add_input('NodeSocketFloat', self.get_variable_name(0), default_value=0.0) - self.add_input('NodeSocketFloat', self.get_variable_name(1), default_value=0.0) - self.add_output('NodeSocketFloat', 'Result') + def arm_init(self, context): + self.add_input('ArmFloatSocket', self.get_variable_name(0), default_value=0.0) + self.add_input('ArmFloatSocket', self.get_variable_name(1), default_value=0.0) + self.add_output('ArmFloatSocket', 'Result') def draw_buttons(self, context, layout): layout.prop(self, 'property1') @@ -181,10 +180,10 @@ class MathExpressionNode(ArmLogicTreeNode): if len(self.inputs) == 10: column.enabled = False op.node_index = str(id(self)) - op.socket_type = 'NodeSocketFloat' + op.socket_type = 'ArmFloatSocket' op.name_format = self.get_variable_name(len(self.inputs)) 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 \ No newline at end of file + column.enabled = False diff --git a/blender/arm/logicnode/math/LN_matrix_math.py b/blender/arm/logicnode/math/LN_matrix_math.py index 3a2fc6f4..6a4d200e 100644 --- a/blender/arm/logicnode/math/LN_matrix_math.py +++ b/blender/arm/logicnode/math/LN_matrix_math.py @@ -7,16 +7,16 @@ class MatrixMathNode(ArmLogicTreeNode): arm_section = 'matrix' arm_version = 1 - property0: EnumProperty( + property0: HaxeEnumProperty( + 'property0', items = [('Multiply', 'Multiply', 'Multiply')], name='', default='Multiply') - def init(self, context): - super(MatrixMathNode, self).init(context) - self.add_input('NodeSocketShader', 'Matrix 1') - self.add_input('NodeSocketShader', 'Matrix 2') + def arm_init(self, context): + self.add_input('ArmDynamicSocket', 'Matrix 1') + self.add_input('ArmDynamicSocket', 'Matrix 2') - self.add_output('NodeSocketShader', 'Result') + self.add_output('ArmDynamicSocket', 'Result') def draw_buttons(self, context, layout): layout.prop(self, 'property0') diff --git a/blender/arm/logicnode/math/LN_mix.py b/blender/arm/logicnode/math/LN_mix.py index 7924c9c3..7ae648a4 100644 --- a/blender/arm/logicnode/math/LN_mix.py +++ b/blender/arm/logicnode/math/LN_mix.py @@ -5,7 +5,8 @@ class MixNode(ArmLogicTreeNode): bl_idname = 'LNMixNode' bl_label = 'Mix' arm_version = 1 - property0: EnumProperty( + property0: HaxeEnumProperty( + 'property0', items = [('Linear', 'Linear', 'Linear'), ('Sine', 'Sine', 'Sine'), ('Quad', 'Quad', 'Quad'), @@ -19,28 +20,24 @@ class MixNode(ArmLogicTreeNode): ('Elastic', 'Elastic', 'Elastic'), ], name='', default='Linear') - property1: EnumProperty( + property1: HaxeEnumProperty( + 'property1', items = [('In', 'In', 'In'), ('Out', 'Out', 'Out'), ('InOut', 'InOut', 'InOut'), ], name='', default='Out') - @property - def property2(self): - return 'true' if self.property2_ else 'false' + property2: HaxeBoolProperty('property2', name='Clamp', default=False) - property2_: BoolProperty(name='Clamp', default=False) + def arm_init(self, context): + self.add_input('ArmFloatSocket', 'Factor', default_value=0.0) + self.add_input('ArmFloatSocket', 'Value 1', default_value=0.0) + self.add_input('ArmFloatSocket', 'Value 2', default_value=1.0) - def init(self, context): - super(MixNode, self).init(context) - self.add_input('NodeSocketFloat', 'Factor', default_value=0.0) - self.add_input('NodeSocketFloat', 'Value 1', default_value=0.0) - self.add_input('NodeSocketFloat', 'Value 2', default_value=1.0) - - self.add_output('NodeSocketFloat', 'Result') + self.add_output('ArmFloatSocket', 'Result') def draw_buttons(self, context, layout): - layout.prop(self, 'property2_') + layout.prop(self, 'property2') layout.prop(self, 'property0') layout.prop(self, 'property1') diff --git a/blender/arm/logicnode/math/LN_mix_vector.py b/blender/arm/logicnode/math/LN_mix_vector.py index 31c7f587..4349de86 100644 --- a/blender/arm/logicnode/math/LN_mix_vector.py +++ b/blender/arm/logicnode/math/LN_mix_vector.py @@ -7,7 +7,8 @@ class VectorMixNode(ArmLogicTreeNode): arm_section = 'vector' arm_version = 1 - property0: EnumProperty( + property0: HaxeEnumProperty( + 'property0', items = [('Linear', 'Linear', 'Linear'), ('Sine', 'Sine', 'Sine'), ('Quad', 'Quad', 'Quad'), @@ -21,29 +22,25 @@ class VectorMixNode(ArmLogicTreeNode): ('Elastic', 'Elastic', 'Elastic'), ], name='', default='Linear') - property1: EnumProperty( + property1: HaxeEnumProperty( + 'property1', items = [('In', 'In', 'In'), ('Out', 'Out', 'Out'), ('InOut', 'InOut', 'InOut'), ], name='', default='Out') - @property - def property2(self): - return 'true' if self.property2_ else 'false' + property2: HaxeBoolProperty('property2', name='Clamp', default=False) - property2_: BoolProperty(name='Clamp', default=False) + def arm_init(self, context): + self.add_input('ArmFloatSocket', 'Factor', default_value=0.0) + self.add_input('ArmVectorSocket', 'Vector 1', default_value=[0.0, 0.0, 0.0]) + self.add_input('ArmVectorSocket', 'Vector 2', default_value=[1.0, 1.0, 1.0]) - def init(self, context): - super(VectorMixNode, self).init(context) - self.add_input('NodeSocketFloat', 'Factor', default_value=0.0) - self.add_input('NodeSocketVector', 'Vector 1', default_value=[0.0, 0.0, 0.0]) - self.add_input('NodeSocketVector', 'Vector 2', default_value=[1.0, 1.0, 1.0]) - - self.add_output('NodeSocketVector', 'Result') + self.add_output('ArmVectorSocket', 'Result') def draw_buttons(self, context, layout): - layout.prop(self, 'property2_') + layout.prop(self, 'property2') layout.prop(self, 'property0') if self.property0 != 'Linear': layout.prop(self, 'property1') diff --git a/blender/arm/logicnode/math/LN_quaternion_math.py b/blender/arm/logicnode/math/LN_quaternion_math.py index d1f91abc..dfdece72 100644 --- a/blender/arm/logicnode/math/LN_quaternion_math.py +++ b/blender/arm/logicnode/math/LN_quaternion_math.py @@ -15,16 +15,16 @@ class QuaternionMathNode(ArmLogicTreeNode): if value: if ((self.property0 == 'Module') or (self.property0 == 'DotProduct') or (self.property0 == 'ToAxisAngle')) and (len(self.outputs) > 1): self.outputs.remove(self.outputs.values()[-1]) # Module/DotProduct/ToAxisAngle - self.add_output('NodeSocketFloat', 'X') # Result X - self.add_output('NodeSocketFloat', 'Y') # Result Y - self.add_output('NodeSocketFloat', 'Z') # Result Z - self.add_output('NodeSocketFloat', 'W') # Result W + self.add_output('ArmFloatSocket', 'X') # Result X + self.add_output('ArmFloatSocket', 'Y') # Result Y + self.add_output('ArmFloatSocket', 'Z') # Result Z + self.add_output('ArmFloatSocket', 'W') # Result W if (self.property0 == 'Module'): - self.add_output('NodeSocketFloat', 'Module') # Module + self.add_output('ArmFloatSocket', 'Module') # Module if (self.property0 == 'DotProduct'): - self.add_output('NodeSocketFloat', 'Scalar') # DotProduct + self.add_output('ArmFloatSocket', 'Scalar') # DotProduct if (self.property0 == 'ToAxisAngle'): - self.add_output('NodeSocketFloat', 'To Axis Angle') # ToAxisAngle + self.add_output('ArmFloatSocket', 'To Axis Angle') # ToAxisAngle else: if ((self.property0 == 'Module') or (self.property0 == 'DotProduct') or (self.property0 == 'ToAxisAngle')) and (len(self.outputs) > 1): self.outputs.remove(self.outputs.values()[-1]) # Module/DotProduct/ToAxisAngle @@ -35,13 +35,13 @@ class QuaternionMathNode(ArmLogicTreeNode): else: break if (self.property0 == 'Module'): - self.add_output('NodeSocketFloat', 'Module') # Module + self.add_output('ArmFloatSocket', 'Module') # Module if (self.property0 == 'DotProduct'): - self.add_output('NodeSocketFloat', 'Scalar') # DotProduct + self.add_output('ArmFloatSocket', 'Scalar') # DotProduct if (self.property0 == 'ToAxisAngle'): - self.add_output('NodeSocketFloat', 'To Axis Angle') # ToAxisAngle + self.add_output('ArmFloatSocket', 'To Axis Angle') # ToAxisAngle - property1: BoolProperty(name='Separator Out', default=False, set=set_bool, get=get_bool) + property1: HaxeBoolProperty('property1', name='Separator Out', default=False, set=set_bool, get=get_bool) @staticmethod def get_enum_id_value(obj, prop_name, value): @@ -84,55 +84,56 @@ class QuaternionMathNode(ArmLogicTreeNode): self.inputs.remove(self.inputs.values()[-1]) if (select_prev == 'DotProduct') or (select_prev == 'ToAxisAngle') or (select_prev == 'Module'): self.outputs.remove(self.outputs.values()[-1]) - + # Many arguments: Add, Subtract, DotProduct, Multiply, MultiplyFloat if (self.get_count_in(select_current) == 0): if (select_current == "MultiplyFloats"): - self.add_input('NodeSocketVector', 'Quaternion ' + str(len(self.inputs))) - self.add_input('NodeSocketFloat', 'Value ' + str(len(self.inputs))) + self.add_input('ArmVectorSocket', 'Quaternion ' + str(len(self.inputs))) + self.add_input('ArmFloatSocket', 'Value ' + str(len(self.inputs))) else: while (len(self.inputs) < 2): - self.add_input('NodeSocketVector', 'Quaternion ' + str(len(self.inputs))) + self.add_input('ArmVectorSocket', 'Quaternion ' + str(len(self.inputs))) if (select_current == 'DotProduct'): - self.add_output('NodeSocketFloat', 'Scalar') - + self.add_output('ArmFloatSocket', 'Scalar') + # 3 arguments: Lerp, Slerp, FromAxisAngle, FromEuler if (self.get_count_in(select_current) == 3): if (select_current == 'Lerp') or (select_current == 'Slerp'): while (len(self.inputs) < 3): - self.add_input('NodeSocketVector', 'From') - self.add_input('NodeSocketVector', 'To') - self.add_input('NodeSocketFloat', 'T') + self.add_input('ArmVectorSocket', 'From') + self.add_input('ArmVectorSocket', 'To') + self.add_input('ArmFloatSocket', 'T') if (select_current == 'FromAxisAngle'): - self.add_input('NodeSocketVector', 'Quaternion') - self.add_input('NodeSocketVector', 'Axis') - self.add_input('NodeSocketFloat', 'Angle') + self.add_input('ArmVectorSocket', 'Quaternion') + self.add_input('ArmVectorSocket', 'Axis') + self.add_input('ArmFloatSocket', 'Angle') if (select_current == 'FromEuler'): - self.add_input('NodeSocketFloat', 'X') - self.add_input('NodeSocketFloat', 'Y') - self.add_input('NodeSocketFloat', 'Z') - + self.add_input('ArmFloatSocket', 'X') + self.add_input('ArmFloatSocket', 'Y') + self.add_input('ArmFloatSocket', 'Z') + # 2 arguments: FromTo, FromMat, FromRotationMat, ToAxisAngle if (self.get_count_in(select_current) == 2): if (select_current == 'FromTo'): - self.add_input('NodeSocketVector', 'Vector ' + str(len(self.inputs))) - self.add_input('NodeSocketVector', 'Vector ' + str(len(self.inputs))) + self.add_input('ArmVectorSocket', 'Vector ' + str(len(self.inputs))) + self.add_input('ArmVectorSocket', 'Vector ' + str(len(self.inputs))) if (select_current == 'FromMat') or (select_current == 'FromRotationMat'): - self.add_input('NodeSocketVector', 'Quaternion') - self.add_input('NodeSocketShader', 'Matrix') + self.add_input('ArmVectorSocket', 'Quaternion') + self.add_input('ArmDynamicSocket', 'Matrix') if (select_current == 'ToAxisAngle'): - self.add_input('NodeSocketVector', 'Quaternion') - self.add_input('NodeSocketVector', 'Axis') - self.add_output('NodeSocketFloat', 'Angle') + self.add_input('ArmVectorSocket', 'Quaternion') + self.add_input('ArmVectorSocket', 'Axis') + self.add_output('ArmFloatSocket', 'Angle') # 1 argument: Module, Normalize, GetEuler if (self.get_count_in(select_current) == 1): - self.add_input('NodeSocketVector', 'Quaternion') + self.add_input('ArmVectorSocket', 'Quaternion') if (select_current == 'Module'): - self.add_output('NodeSocketFloat', 'Module') + self.add_output('ArmFloatSocket', 'Module') self['property0'] = value - property0: EnumProperty( + property0: HaxeEnumProperty( + 'property0', items = [('Add', 'Add', 'Add'), ('Subtract', 'Subtract', 'Subtract'), ('DotProduct', 'Dot Product', 'Dot Product'), @@ -154,11 +155,10 @@ class QuaternionMathNode(ArmLogicTreeNode): def __init__(self): array_nodes[str(id(self))] = self - def init(self, context): - super(QuaternionMathNode, self).init(context) - self.add_input('NodeSocketVector', 'Quaternion 0', default_value=[0.0, 0.0, 0.0]) - self.add_input('NodeSocketVector', 'Quaternion 1', default_value=[0.0, 0.0, 0.0]) - self.add_output('NodeSocketVector', 'Result') + def arm_init(self, context): + self.add_input('ArmVectorSocket', 'Quaternion 0', default_value=[0.0, 0.0, 0.0]) + self.add_input('ArmVectorSocket', 'Quaternion 1', default_value=[0.0, 0.0, 0.0]) + self.add_output('ArmVectorSocket', 'Result') def draw_buttons(self, context, layout): layout.prop(self, 'property1') # Separator Out @@ -174,9 +174,9 @@ class QuaternionMathNode(ArmLogicTreeNode): else: op.name_format = 'Value {0}' if (self.property0 == "MultiplyFloats"): - op.socket_type = 'NodeSocketFloat' + op.socket_type = 'ArmFloatSocket' else: - op.socket_type = 'NodeSocketVector' + op.socket_type = 'ArmVectorSocket' column = row.column(align=True) op = column.operator('arm.node_remove_input', text='', icon='X', emboss=True) op.node_index = str(id(self)) diff --git a/blender/arm/logicnode/math/LN_rad_to_deg.py b/blender/arm/logicnode/math/LN_rad_to_deg.py index 2e13666b..c144ae98 100644 --- a/blender/arm/logicnode/math/LN_rad_to_deg.py +++ b/blender/arm/logicnode/math/LN_rad_to_deg.py @@ -7,8 +7,7 @@ class RadToDegNode(ArmLogicTreeNode): arm_version = 1 arm_section = 'angle' - def init(self, context): - super(RadToDegNode, self).init(context) - self.add_input('NodeSocketFloat', 'Radians') + def arm_init(self, context): + self.add_input('ArmFloatSocket', 'Radians') - self.add_output('NodeSocketFloat', 'Degrees') + self.add_output('ArmFloatSocket', 'Degrees') diff --git a/blender/arm/logicnode/math/LN_screen_to_world_space.py b/blender/arm/logicnode/math/LN_screen_to_world_space.py index 52b6fa36..ef1864cb 100644 --- a/blender/arm/logicnode/math/LN_screen_to_world_space.py +++ b/blender/arm/logicnode/math/LN_screen_to_world_space.py @@ -10,33 +10,27 @@ class ScreenToWorldSpaceNode(ArmLogicTreeNode): min_outputs = 2 max_outputs = 8 - # Separator - @property - def property0(self): - return True if self.property0_ else False + property0: HaxeBoolProperty('property0', name='Separator Out', default=False) - property0_: BoolProperty(name='Separator Out', default=False) + def arm_init(self, context): + self.add_input('ArmIntSocket', 'Screen X') + self.add_input('ArmIntSocket', 'Screen Y') - def init(self, context): - super(ScreenToWorldSpaceNode, self).init(context) - self.add_input('NodeSocketInt', 'Screen X') - self.add_input('NodeSocketInt', 'Screen Y') - - self.add_output('NodeSocketVector', 'World') - self.add_output('NodeSocketVector', 'Direction') + self.add_output('ArmVectorSocket', 'World') + self.add_output('ArmVectorSocket', 'Direction') def draw_buttons(self, context, layout): - layout.prop(self, 'property0_') # Separator Out - if self.property0_: + layout.prop(self, 'property0') # Separator Out + if self.property0: if len(self.outputs) < self.max_outputs: self.outputs.remove(self.outputs.values()[-1]) # Direction vector - self.add_output('NodeSocketFloat', 'X') # World X - self.add_output('NodeSocketFloat', 'Y') # World Y - self.add_output('NodeSocketFloat', 'Z') # World Z - self.add_output('NodeSocketVector', 'Direction') # Vector - self.add_output('NodeSocketFloat', 'X') # Direction X - self.add_output('NodeSocketFloat', 'Y') # Direction Y - self.add_output('NodeSocketFloat', 'Z') # Direction Z + self.add_output('ArmFloatSocket', 'X') # World X + self.add_output('ArmFloatSocket', 'Y') # World Y + self.add_output('ArmFloatSocket', 'Z') # World Z + self.add_output('ArmVectorSocket', 'Direction') # Vector + self.add_output('ArmFloatSocket', 'X') # Direction X + self.add_output('ArmFloatSocket', 'Y') # Direction Y + self.add_output('ArmFloatSocket', 'Z') # Direction Z else: if len(self.outputs) == self.max_outputs: self.outputs.remove(self.outputs.values()[-1]) # Z @@ -46,4 +40,4 @@ class ScreenToWorldSpaceNode(ArmLogicTreeNode): self.outputs.remove(self.outputs.values()[-1]) # Z self.outputs.remove(self.outputs.values()[-1]) # Y self.outputs.remove(self.outputs.values()[-1]) # X - self.add_output('NodeSocketVector', 'Direction') + self.add_output('ArmVectorSocket', 'Direction') diff --git a/blender/arm/logicnode/math/LN_separate_quaternion.py b/blender/arm/logicnode/math/LN_separate_quaternion.py index fcd9abf6..d8b6f0cf 100644 --- a/blender/arm/logicnode/math/LN_separate_quaternion.py +++ b/blender/arm/logicnode/math/LN_separate_quaternion.py @@ -7,11 +7,10 @@ class SeparateQuaternionNode(ArmLogicTreeNode): arm_section = 'quaternions' arm_version = 1 - def init(self, context): - super(SeparateQuaternionNode, self).init(context) - self.add_input('NodeSocketVector', 'Quaternion') + def arm_init(self, context): + self.add_input('ArmVectorSocket', 'Quaternion') - self.add_output('NodeSocketFloat', 'X') - self.add_output('NodeSocketFloat', 'Y') - self.add_output('NodeSocketFloat', 'Z') - self.add_output('NodeSocketFloat', 'W') + self.add_output('ArmFloatSocket', 'X') + self.add_output('ArmFloatSocket', 'Y') + self.add_output('ArmFloatSocket', 'Z') + self.add_output('ArmFloatSocket', 'W') diff --git a/blender/arm/logicnode/math/LN_separate_rgb.py b/blender/arm/logicnode/math/LN_separate_rgb.py index b95c3e32..e2098989 100644 --- a/blender/arm/logicnode/math/LN_separate_rgb.py +++ b/blender/arm/logicnode/math/LN_separate_rgb.py @@ -7,10 +7,9 @@ class SeparateColorNode(ArmLogicTreeNode): arm_section = 'color' arm_version = 1 - def init(self, context): - super(SeparateColorNode, self).init(context) - self.add_input('NodeSocketColor', 'Color', default_value=[1.0, 1.0, 1.0, 1.0]) + def arm_init(self, context): + self.add_input('ArmColorSocket', 'Color', default_value=[1.0, 1.0, 1.0, 1.0]) - self.add_output('NodeSocketFloat', 'R') - self.add_output('NodeSocketFloat', 'G') - self.add_output('NodeSocketFloat', 'B') + self.add_output('ArmFloatSocket', 'R') + self.add_output('ArmFloatSocket', 'G') + self.add_output('ArmFloatSocket', 'B') diff --git a/blender/arm/logicnode/math/LN_separate_xyz.py b/blender/arm/logicnode/math/LN_separate_xyz.py index d1cc1316..4f7ac735 100644 --- a/blender/arm/logicnode/math/LN_separate_xyz.py +++ b/blender/arm/logicnode/math/LN_separate_xyz.py @@ -7,10 +7,9 @@ class SeparateVectorNode(ArmLogicTreeNode): arm_section = 'vector' arm_version = 1 - def init(self, context): - super(SeparateVectorNode, self).init(context) - self.add_input('NodeSocketVector', 'Vector') + def arm_init(self, context): + self.add_input('ArmVectorSocket', 'Vector') - self.add_output('NodeSocketFloat', 'X') - self.add_output('NodeSocketFloat', 'Y') - self.add_output('NodeSocketFloat', 'Z') + self.add_output('ArmFloatSocket', 'X') + self.add_output('ArmFloatSocket', 'Y') + self.add_output('ArmFloatSocket', 'Z') diff --git a/blender/arm/logicnode/math/LN_vector_clamp.py b/blender/arm/logicnode/math/LN_vector_clamp.py index 3a47c025..a61e677d 100644 --- a/blender/arm/logicnode/math/LN_vector_clamp.py +++ b/blender/arm/logicnode/math/LN_vector_clamp.py @@ -7,10 +7,9 @@ class VectorClampToSizeNode(ArmLogicTreeNode): arm_section = 'vector' arm_version = 1 - def init(self, context): - super(VectorClampToSizeNode, self).init(context) - self.add_input('NodeSocketVector', 'Vector In', default_value=[0.0, 0.0, 0.0]) - self.add_input('NodeSocketFloat', 'Min') - self.add_input('NodeSocketFloat', 'Max') + def arm_init(self, context): + self.add_input('ArmVectorSocket', 'Vector In', default_value=[0.0, 0.0, 0.0]) + self.add_input('ArmFloatSocket', 'Min') + self.add_input('ArmFloatSocket', 'Max') - self.add_output('NodeSocketVector', 'Vector Out') + self.add_output('ArmVectorSocket', 'Vector Out') diff --git a/blender/arm/logicnode/math/LN_vector_math.py b/blender/arm/logicnode/math/LN_vector_math.py index 22f9eaa4..4e9e82a5 100644 --- a/blender/arm/logicnode/math/LN_vector_math.py +++ b/blender/arm/logicnode/math/LN_vector_math.py @@ -17,15 +17,15 @@ class VectorMathNode(ArmLogicTreeNode): if value: if (self.property0 == 'Length') or (self.property0 == 'Distance') or (self.property0 == 'Dot Product'): self.outputs.remove(self.outputs.values()[-1]) # Distance/Length/Scalar - self.add_output('NodeSocketFloat', 'X') # Result X - self.add_output('NodeSocketFloat', 'Y') # Result Y - self.add_output('NodeSocketFloat', 'Z') # Result Z + self.add_output('ArmFloatSocket', 'X') # Result X + self.add_output('ArmFloatSocket', 'Y') # Result Y + self.add_output('ArmFloatSocket', 'Z') # Result Z if (self.property0 == 'Length'): - self.add_output('NodeSocketFloat', 'Length') # Length + self.add_output('ArmFloatSocket', 'Length') # Length if (self.property0 == 'Distance'): - self.add_output('NodeSocketFloat', 'Distance') # Distance + self.add_output('ArmFloatSocket', 'Distance') # Distance if (self.property0 == 'Dot Product'): - self.add_output('NodeSocketFloat', 'Scalar') # Scalar + self.add_output('ArmFloatSocket', 'Scalar') # Scalar else: if ((self.property0 == 'Length') or (self.property0 == 'Distance') or (self.property0 == 'Dot Product')) and (len(self.outputs) > 1): self.outputs.remove(self.outputs.values()[-1]) # Distance/Length/Scalar @@ -36,13 +36,13 @@ class VectorMathNode(ArmLogicTreeNode): else: break if (self.property0 == 'Length'): - self.add_output('NodeSocketFloat', 'Length') # Length + self.add_output('ArmFloatSocket', 'Length') # Length if (self.property0 == 'Distance'): - self.add_output('NodeSocketFloat', 'Distance') # Distance + self.add_output('ArmFloatSocket', 'Distance') # Distance if (self.property0 == 'Dot Product'): - self.add_output('NodeSocketFloat', 'Scalar') # Scalar + self.add_output('ArmFloatSocket', 'Scalar') # Scalar - property1: BoolProperty(name='Separator Out', default=False, set=set_bool, get=get_bool) + property1: HaxeBoolProperty('property1', name='Separator Out', default=False, set=set_bool, get=get_bool) @staticmethod def get_enum_id_value(obj, prop_name, value): @@ -80,12 +80,12 @@ class VectorMathNode(ArmLogicTreeNode): while (len(self.inputs) > 1): self.inputs.remove(self.inputs.values()[-1]) if (select_current == "MultiplyFloats"): - self.add_input('NodeSocketFloat', 'Value ' + str(len(self.inputs))) + self.add_input('ArmFloatSocket', 'Value ' + str(len(self.inputs))) else: while (len(self.inputs) < 2): - self.add_input('NodeSocketVector', 'Value ' + str(len(self.inputs))) + self.add_input('ArmVectorSocket', 'Value ' + str(len(self.inputs))) if (select_current == 'Dot Product'): - self.add_output('NodeSocketFloat', 'Scalar') + self.add_output('ArmFloatSocket', 'Scalar') # 2 arguments: Distance, Reflect if (self.get_count_in(select_current) == 2): count = 2 @@ -94,18 +94,19 @@ class VectorMathNode(ArmLogicTreeNode): while (len(self.inputs) > count): self.inputs.remove(self.inputs.values()[-1]) while (len(self.inputs) < 2): - self.add_input('NodeSocketVector', 'Value ' + str(len(self.inputs))) + self.add_input('ArmVectorSocket', 'Value ' + str(len(self.inputs))) if (select_current == 'Distance'): - self.add_output('NodeSocketFloat', 'Distance') + self.add_output('ArmFloatSocket', 'Distance') # 1 argument: Normalize, Length if (self.get_count_in(select_current) == 1): while (len(self.inputs) > 1): self.inputs.remove(self.inputs.values()[-1]) if (select_current == 'Length'): - self.add_output('NodeSocketFloat', 'Length') + self.add_output('ArmFloatSocket', 'Length') self['property0'] = value - property0: EnumProperty( + property0: HaxeEnumProperty( + 'property0', items = [('Add', 'Add', 'Add'), ('Dot Product', 'Dot Product', 'Dot Product'), ('Multiply', 'Multiply', 'Multiply'), @@ -122,12 +123,11 @@ class VectorMathNode(ArmLogicTreeNode): def __init__(self): array_nodes[str(id(self))] = self - def init(self, context): - super(VectorMathNode, self).init(context) - self.add_input('NodeSocketVector', 'Value 0', default_value=[0.0, 0.0, 0.0]) - self.add_input('NodeSocketVector', 'Value 1', default_value=[0.0, 0.0, 0.0]) + def arm_init(self, context): + self.add_input('ArmVectorSocket', 'Value 0', default_value=[0.0, 0.0, 0.0]) + self.add_input('ArmVectorSocket', 'Value 1', default_value=[0.0, 0.0, 0.0]) - self.add_output('NodeSocketVector', 'Result') + self.add_output('ArmVectorSocket', 'Result') def draw_buttons(self, context, layout): layout.prop(self, 'property1') # Separator Out @@ -140,9 +140,9 @@ class VectorMathNode(ArmLogicTreeNode): op.node_index = str(id(self)) op.name_format = 'Value {0}' if (self.property0 == "MultiplyFloats"): - op.socket_type = 'NodeSocketFloat' + op.socket_type = 'ArmFloatSocket' else: - op.socket_type = 'NodeSocketVector' + op.socket_type = 'ArmVectorSocket' column = row.column(align=True) op = column.operator('arm.node_remove_input', text='', icon='X', emboss=True) op.node_index = str(id(self)) diff --git a/blender/arm/logicnode/math/LN_world_to_screen_space.py b/blender/arm/logicnode/math/LN_world_to_screen_space.py index 53b91b54..b3f16b6a 100644 --- a/blender/arm/logicnode/math/LN_world_to_screen_space.py +++ b/blender/arm/logicnode/math/LN_world_to_screen_space.py @@ -7,8 +7,7 @@ class WorldToScreenSpaceNode(ArmLogicTreeNode): arm_section = 'matrix' arm_version = 1 - def init(self, context): - super(WorldToScreenSpaceNode, self).init(context) - self.add_input('NodeSocketVector', 'World') + def arm_init(self, context): + self.add_input('ArmVectorSocket', 'World') - self.add_output('NodeSocketVector', 'Screen') + self.add_output('ArmVectorSocket', 'Screen') diff --git a/blender/arm/logicnode/miscellaneous/LN_boolean_to_vector.py b/blender/arm/logicnode/miscellaneous/LN_boolean_to_vector.py index acac1ad3..5bcb5002 100644 --- a/blender/arm/logicnode/miscellaneous/LN_boolean_to_vector.py +++ b/blender/arm/logicnode/miscellaneous/LN_boolean_to_vector.py @@ -6,13 +6,12 @@ class VectorFromBooleanNode(ArmLogicTreeNode): bl_label = 'Boolean to Vector' arm_version = 1 - def init(self, context): - super(VectorFromBooleanNode, self).init(context) - self.inputs.new('NodeSocketBool', 'X') - self.inputs.new('NodeSocketBool', '-X') - self.inputs.new('NodeSocketBool', 'Y') - self.inputs.new('NodeSocketBool', '-Y') - self.inputs.new('NodeSocketBool', 'Z') - self.inputs.new('NodeSocketBool', '-Z') + def arm_init(self, context): + self.inputs.new('ArmBoolSocket', 'X') + self.inputs.new('ArmBoolSocket', '-X') + self.inputs.new('ArmBoolSocket', 'Y') + self.inputs.new('ArmBoolSocket', '-Y') + self.inputs.new('ArmBoolSocket', 'Z') + self.inputs.new('ArmBoolSocket', '-Z') - self.outputs.new('NodeSocketVector', 'Vector') + self.outputs.new('ArmVectorSocket', 'Vector') diff --git a/blender/arm/logicnode/miscellaneous/LN_call_group.py b/blender/arm/logicnode/miscellaneous/LN_call_group.py index bf483e0d..87e13ec1 100644 --- a/blender/arm/logicnode/miscellaneous/LN_call_group.py +++ b/blender/arm/logicnode/miscellaneous/LN_call_group.py @@ -15,10 +15,9 @@ class CallGroupNode(ArmLogicTreeNode): def property0(self): return arm.utils.safesrc(bpy.data.worlds['Arm'].arm_project_package) + '.node.' + arm.utils.safesrc(self.property0_.name) - property0_: PointerProperty(name='Group', type=bpy.types.NodeTree) + property0_: HaxePointerProperty('property0', name='Group', type=bpy.types.NodeTree) - def init(self, context): - super(CallGroupNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/miscellaneous/LN_default_if_null.py b/blender/arm/logicnode/miscellaneous/LN_default_if_null.py index 2437c3a2..e1e5f2db 100644 --- a/blender/arm/logicnode/miscellaneous/LN_default_if_null.py +++ b/blender/arm/logicnode/miscellaneous/LN_default_if_null.py @@ -10,9 +10,8 @@ class DefaultIfNullNode(ArmLogicTreeNode): bl_label = 'Default if Null' arm_version = 1 - def init(self, context): - super(DefaultIfNullNode, self).init(context) - self.inputs.new('NodeSocketShader', 'Value In') - self.inputs.new('NodeSocketShader', 'Default') + def arm_init(self, context): + self.inputs.new('ArmDynamicSocket', 'Value In') + self.inputs.new('ArmDynamicSocket', 'Default') - self.outputs.new('NodeSocketShader', 'Value Out') + self.outputs.new('ArmDynamicSocket', 'Value Out') diff --git a/blender/arm/logicnode/miscellaneous/LN_get_application_time.py b/blender/arm/logicnode/miscellaneous/LN_get_application_time.py index 602d9856..ae2ba85a 100644 --- a/blender/arm/logicnode/miscellaneous/LN_get_application_time.py +++ b/blender/arm/logicnode/miscellaneous/LN_get_application_time.py @@ -6,7 +6,6 @@ class TimeNode(ArmLogicTreeNode): bl_label = 'Get Application Time' arm_version = 1 - def init(self, context): - super(TimeNode, self).init(context) - self.add_output('NodeSocketFloat', 'Time') - self.add_output('NodeSocketFloat', 'Delta') + def arm_init(self, context): + self.add_output('ArmFloatSocket', 'Time') + self.add_output('ArmFloatSocket', 'Delta') diff --git a/blender/arm/logicnode/miscellaneous/LN_get_debug_console_settings.py b/blender/arm/logicnode/miscellaneous/LN_get_debug_console_settings.py index 2ea657b0..e6e04394 100644 --- a/blender/arm/logicnode/miscellaneous/LN_get_debug_console_settings.py +++ b/blender/arm/logicnode/miscellaneous/LN_get_debug_console_settings.py @@ -6,8 +6,7 @@ class GetDebugConsoleSettings(ArmLogicTreeNode): bl_label = 'Get Debug Console Settings' arm_version = 1 - def init(self, context): - super(GetDebugConsoleSettings, self).init(context) - self.add_output('NodeSocketBool', 'Visible') - self.add_output('NodeSocketFloat', 'Scale') - self.add_output('NodeSocketString', 'Position') + def arm_init(self, context): + self.add_output('ArmBoolSocket', 'Visible') + self.add_output('ArmFloatSocket', 'Scale') + self.add_output('ArmStringSocket', 'Position') diff --git a/blender/arm/logicnode/miscellaneous/LN_get_display_resolution.py b/blender/arm/logicnode/miscellaneous/LN_get_display_resolution.py index 560d053f..411e298c 100644 --- a/blender/arm/logicnode/miscellaneous/LN_get_display_resolution.py +++ b/blender/arm/logicnode/miscellaneous/LN_get_display_resolution.py @@ -10,7 +10,6 @@ class DisplayInfoNode(ArmLogicTreeNode): arm_section = 'screen' arm_version = 1 - def init(self, context): - super(DisplayInfoNode, self).init(context) - self.add_output('NodeSocketInt', 'Width') - self.add_output('NodeSocketInt', 'Height') + def arm_init(self, context): + self.add_output('ArmIntSocket', 'Width') + self.add_output('ArmIntSocket', 'Height') diff --git a/blender/arm/logicnode/miscellaneous/LN_get_fps.py b/blender/arm/logicnode/miscellaneous/LN_get_fps.py index bd2b76ae..4bc298d9 100644 --- a/blender/arm/logicnode/miscellaneous/LN_get_fps.py +++ b/blender/arm/logicnode/miscellaneous/LN_get_fps.py @@ -6,6 +6,5 @@ class GetFPSNode(ArmLogicTreeNode): bl_label = 'Get Frames Per Second' arm_version = 1 - def init(self, context): - super(GetFPSNode, self).init(context) - self.add_output('NodeSocketInt', 'Count') + def arm_init(self, context): + self.add_output('ArmIntSocket', 'Count') diff --git a/blender/arm/logicnode/miscellaneous/LN_get_window_resolution.py b/blender/arm/logicnode/miscellaneous/LN_get_window_resolution.py index 8fd5b504..d2fe52b6 100644 --- a/blender/arm/logicnode/miscellaneous/LN_get_window_resolution.py +++ b/blender/arm/logicnode/miscellaneous/LN_get_window_resolution.py @@ -10,7 +10,6 @@ class WindowInfoNode(ArmLogicTreeNode): arm_section = 'screen' arm_version = 1 - def init(self, context): - super(WindowInfoNode, self).init(context) - self.add_output('NodeSocketInt', 'Width') - self.add_output('NodeSocketInt', 'Height') + def arm_init(self, context): + self.add_output('ArmIntSocket', 'Width') + self.add_output('ArmIntSocket', 'Height') diff --git a/blender/arm/logicnode/miscellaneous/LN_group_nodes.py b/blender/arm/logicnode/miscellaneous/LN_group_nodes.py index c8d8cdc9..8b08343b 100644 --- a/blender/arm/logicnode/miscellaneous/LN_group_nodes.py +++ b/blender/arm/logicnode/miscellaneous/LN_group_nodes.py @@ -7,6 +7,5 @@ class GroupOutputNode(ArmLogicTreeNode): arm_section = 'group' arm_version = 1 - def init(self, context): - super(GroupOutputNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') diff --git a/blender/arm/logicnode/miscellaneous/LN_set_debug_console_settings.py b/blender/arm/logicnode/miscellaneous/LN_set_debug_console_settings.py index a40602e8..4bbd4d12 100644 --- a/blender/arm/logicnode/miscellaneous/LN_set_debug_console_settings.py +++ b/blender/arm/logicnode/miscellaneous/LN_set_debug_console_settings.py @@ -6,17 +6,17 @@ class SetDebugConsoleSettings(ArmLogicTreeNode): bl_label = 'Set Debug Console Settings' arm_version = 1 - property0: EnumProperty( + property0: HaxeEnumProperty( + 'property0', items = [('left', 'Anchor Left', 'Anchor debug console in the top left'), ('center', 'Anchor Center', 'Anchor debug console in the top center'), ('right', 'Anchor Right', 'Anchor the debug console in the top right')], name='', default='right') - def init(self, context): - super(SetDebugConsoleSettings, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketBool', 'Visible') - self.add_input('NodeSocketFloat', 'Scale') + self.add_input('ArmBoolSocket', 'Visible') + self.add_input('ArmFloatSocket', 'Scale') self.inputs[-1].default_value = 1.0 self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/miscellaneous/LN_set_time_scale.py b/blender/arm/logicnode/miscellaneous/LN_set_time_scale.py index aff8c194..77bc3f59 100644 --- a/blender/arm/logicnode/miscellaneous/LN_set_time_scale.py +++ b/blender/arm/logicnode/miscellaneous/LN_set_time_scale.py @@ -6,9 +6,8 @@ class SetTimeScaleNode(ArmLogicTreeNode): bl_label = 'Set Time Scale' arm_version = 1 - def init(self, context): - super(SetTimeScaleNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketFloat', 'Scale', default_value=1.0) + self.add_input('ArmFloatSocket', 'Scale', default_value=1.0) self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/miscellaneous/LN_sleep.py b/blender/arm/logicnode/miscellaneous/LN_sleep.py index 0d2e4c82..884720e7 100644 --- a/blender/arm/logicnode/miscellaneous/LN_sleep.py +++ b/blender/arm/logicnode/miscellaneous/LN_sleep.py @@ -7,9 +7,8 @@ class SleepNode(ArmLogicTreeNode): bl_label = 'Sleep' arm_version = 1 - def init(self, context): - super(SleepNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketFloat', 'Time') + self.add_input('ArmFloatSocket', 'Time') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/miscellaneous/LN_timer.py b/blender/arm/logicnode/miscellaneous/LN_timer.py index d74d7197..e19a36b8 100644 --- a/blender/arm/logicnode/miscellaneous/LN_timer.py +++ b/blender/arm/logicnode/miscellaneous/LN_timer.py @@ -6,21 +6,20 @@ class TimerNode(ArmLogicTreeNode): bl_label = 'Timer' arm_version = 1 - def init(self, context): - super(TimerNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'Start') self.add_input('ArmNodeSocketAction', 'Pause') self.add_input('ArmNodeSocketAction', 'Stop') - self.add_input('NodeSocketFloat', 'Duration', default_value=1.0) - self.add_input('NodeSocketInt', 'Repeat') + self.add_input('ArmFloatSocket', 'Duration', default_value=1.0) + self.add_input('ArmIntSocket', 'Repeat') self.add_output('ArmNodeSocketAction', 'Out') self.add_output('ArmNodeSocketAction', 'Done') - self.add_output('NodeSocketBool', 'Running') - self.add_output('NodeSocketInt', 'Time Passed') - self.add_output('NodeSocketInt', 'Time Left') - self.add_output('NodeSocketFloat', 'Progress') - self.add_output('NodeSocketFloat', 'Repetitions') + self.add_output('ArmBoolSocket', 'Running') + self.add_output('ArmIntSocket', 'Time Passed') + self.add_output('ArmIntSocket', 'Time Left') + self.add_output('ArmFloatSocket', 'Progress') + self.add_output('ArmFloatSocket', 'Repetitions') def draw_label(self) -> str: inp_duration = self.inputs['Duration'] diff --git a/blender/arm/logicnode/native/LN_call_haxe_static.py b/blender/arm/logicnode/native/LN_call_haxe_static.py index eb288074..fd7e2c91 100644 --- a/blender/arm/logicnode/native/LN_call_haxe_static.py +++ b/blender/arm/logicnode/native/LN_call_haxe_static.py @@ -10,10 +10,9 @@ class CallHaxeStaticNode(ArmLogicTreeNode): arm_section = 'haxe' arm_version = 1 - def init(self, context): - super(CallHaxeStaticNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketString', 'Function') + self.add_input('ArmStringSocket', 'Function') self.add_output('ArmNodeSocketAction', 'Out') - self.add_output('NodeSocketShader', 'Result') + self.add_output('ArmDynamicSocket', 'Result') diff --git a/blender/arm/logicnode/native/LN_detect_mobile_browser.py b/blender/arm/logicnode/native/LN_detect_mobile_browser.py index d49f62cf..4268ab0d 100644 --- a/blender/arm/logicnode/native/LN_detect_mobile_browser.py +++ b/blender/arm/logicnode/native/LN_detect_mobile_browser.py @@ -6,6 +6,5 @@ class DetectMobileBrowserNode(ArmLogicTreeNode): bl_label = 'Detect Mobile Browser' arm_version = 1 - def init(self, context): - super(DetectMobileBrowserNode, self).init(context) - self.add_output('NodeSocketBool', 'Mobile') \ No newline at end of file + def arm_init(self, context): + self.add_output('ArmBoolSocket', 'Mobile') diff --git a/blender/arm/logicnode/native/LN_expression.py b/blender/arm/logicnode/native/LN_expression.py index e216e5b2..843869fd 100644 --- a/blender/arm/logicnode/native/LN_expression.py +++ b/blender/arm/logicnode/native/LN_expression.py @@ -9,14 +9,13 @@ class ExpressionNode(ArmLogicTreeNode): arm_version = 1 arm_section = 'haxe' - property0: StringProperty(name='', default='') + property0: HaxeStringProperty('property0', name='', default='') - def init(self, context): - super(ExpressionNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_output('ArmNodeSocketAction', 'Out') - self.add_output('NodeSocketShader', 'Result') + self.add_output('ArmDynamicSocket', 'Result') def draw_buttons(self, context, layout): layout.prop(self, 'property0') diff --git a/blender/arm/logicnode/native/LN_get_haxe_property.py b/blender/arm/logicnode/native/LN_get_haxe_property.py index 20721fc7..2748a873 100644 --- a/blender/arm/logicnode/native/LN_get_haxe_property.py +++ b/blender/arm/logicnode/native/LN_get_haxe_property.py @@ -9,9 +9,8 @@ class GetHaxePropertyNode(ArmLogicTreeNode): arm_version = 1 arm_section = 'haxe' - def init(self, context): - super(GetHaxePropertyNode, self).init(context) - self.add_input('NodeSocketShader', 'Dynamic') - self.add_input('NodeSocketString', 'Property') + def arm_init(self, context): + self.add_input('ArmDynamicSocket', 'Dynamic') + self.add_input('ArmStringSocket', 'Property') - self.add_output('NodeSocketShader', 'Value') + self.add_output('ArmDynamicSocket', 'Value') diff --git a/blender/arm/logicnode/native/LN_get_system_language.py b/blender/arm/logicnode/native/LN_get_system_language.py index 6989f361..4dcb6cc5 100644 --- a/blender/arm/logicnode/native/LN_get_system_language.py +++ b/blender/arm/logicnode/native/LN_get_system_language.py @@ -7,6 +7,5 @@ class GetSystemLanguage(ArmLogicTreeNode): arm_section = 'Native' arm_version = 1 - def init(self, context): - super(GetSystemLanguage, self).init(context) - self.add_output('NodeSocketString', 'Language') + def arm_init(self, context): + self.add_output('ArmStringSocket', 'Language') diff --git a/blender/arm/logicnode/native/LN_get_system_name.py b/blender/arm/logicnode/native/LN_get_system_name.py index 2f7bf8dc..6e08ac3e 100644 --- a/blender/arm/logicnode/native/LN_get_system_name.py +++ b/blender/arm/logicnode/native/LN_get_system_name.py @@ -8,11 +8,10 @@ class GetSystemName(ArmLogicTreeNode): arm_section = 'Native' arm_version = 1 - def init(self, context): - super(GetSystemName, self).init(context) - self.add_output('NodeSocketString', 'System Name') - self.add_output('NodeSocketBool', 'Windows') - self.add_output('NodeSocketBool', 'Linux') - self.add_output('NodeSocketBool', 'Mac') - self.add_output('NodeSocketBool', 'HTML5') - self.add_output('NodeSocketBool', 'Android') + def arm_init(self, context): + self.add_output('ArmStringSocket', 'System Name') + self.add_output('ArmBoolSocket', 'Windows') + self.add_output('ArmBoolSocket', 'Linux') + self.add_output('ArmBoolSocket', 'Mac') + self.add_output('ArmBoolSocket', 'HTML5') + self.add_output('ArmBoolSocket', 'Android') diff --git a/blender/arm/logicnode/native/LN_loadUrl.py b/blender/arm/logicnode/native/LN_loadUrl.py index c180f456..fbbed12b 100644 --- a/blender/arm/logicnode/native/LN_loadUrl.py +++ b/blender/arm/logicnode/native/LN_loadUrl.py @@ -6,7 +6,6 @@ class LoadUrlNode(ArmLogicTreeNode): bl_label = 'Load URL' arm_version = 1 - def init(self, context): - super(LoadUrlNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketString', 'URL') + self.add_input('ArmStringSocket', 'URL') diff --git a/blender/arm/logicnode/native/LN_print.py b/blender/arm/logicnode/native/LN_print.py index b04ea907..8ba303d7 100644 --- a/blender/arm/logicnode/native/LN_print.py +++ b/blender/arm/logicnode/native/LN_print.py @@ -6,9 +6,8 @@ class PrintNode(ArmLogicTreeNode): bl_label = 'Print' arm_version = 1 - def init(self, context): - super(PrintNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketString', 'String') + self.add_input('ArmStringSocket', 'String') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/native/LN_read_file.py b/blender/arm/logicnode/native/LN_read_file.py index e87d152a..dae4805b 100644 --- a/blender/arm/logicnode/native/LN_read_file.py +++ b/blender/arm/logicnode/native/LN_read_file.py @@ -9,11 +9,10 @@ class ReadFileNode(ArmLogicTreeNode): arm_section = 'file' arm_version = 1 - def init(self, context): - super(ReadFileNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketString', 'File') - self.add_input('NodeSocketBool', 'Use cache', default_value=1) + self.add_input('ArmStringSocket', 'File') + self.add_input('ArmBoolSocket', 'Use cache', default_value=1) self.add_output('ArmNodeSocketAction', 'Loaded') - self.add_output('NodeSocketString', 'String') + self.add_output('ArmStringSocket', 'String') diff --git a/blender/arm/logicnode/native/LN_read_json.py b/blender/arm/logicnode/native/LN_read_json.py index 24192ce8..a48081fd 100644 --- a/blender/arm/logicnode/native/LN_read_json.py +++ b/blender/arm/logicnode/native/LN_read_json.py @@ -9,11 +9,10 @@ class ReadJsonNode(ArmLogicTreeNode): arm_section = 'file' arm_version = 1 - def init(self, context): - super(ReadJsonNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketString', 'File') - self.add_input('NodeSocketBool', 'Use cache', default_value=1) + self.add_input('ArmStringSocket', 'File') + self.add_input('ArmBoolSocket', 'Use cache', default_value=1) self.add_output('ArmNodeSocketAction', 'Loaded') - self.add_output('NodeSocketShader', 'Dynamic') + self.add_output('ArmDynamicSocket', 'Dynamic') diff --git a/blender/arm/logicnode/native/LN_read_storage.py b/blender/arm/logicnode/native/LN_read_storage.py index af9fd7c9..d8bd8bd8 100644 --- a/blender/arm/logicnode/native/LN_read_storage.py +++ b/blender/arm/logicnode/native/LN_read_storage.py @@ -9,9 +9,8 @@ class ReadStorageNode(ArmLogicTreeNode): arm_section = 'file' arm_version = 1 - def init(self, context): - super(ReadStorageNode, self).init(context) - self.add_input('NodeSocketString', 'Key') - self.add_input('NodeSocketString', 'Default') + def arm_init(self, context): + self.add_input('ArmStringSocket', 'Key') + self.add_input('ArmStringSocket', 'Default') - self.add_output('NodeSocketShader', 'Value') + self.add_output('ArmDynamicSocket', 'Value') diff --git a/blender/arm/logicnode/native/LN_script.py b/blender/arm/logicnode/native/LN_script.py index d9cf4550..da0fb05d 100644 --- a/blender/arm/logicnode/native/LN_script.py +++ b/blender/arm/logicnode/native/LN_script.py @@ -15,15 +15,14 @@ class ScriptNode(ArmLogicTreeNode): return bpy.data.texts[self.property0_].as_string() if self.property0_ in bpy.data.texts else '' - property0_: StringProperty(name='Text', default='') + property0_: HaxeStringProperty('property0', name='Text', default='') - def init(self, context): - super(ScriptNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketArray', 'Array') self.add_output('ArmNodeSocketAction', 'Out') - self.add_output('NodeSocketShader', 'Result') + self.add_output('ArmDynamicSocket', 'Result') def draw_buttons(self, context, layout): layout.prop_search(self, 'property0_', bpy.data, 'texts', icon='NONE', text='') diff --git a/blender/arm/logicnode/native/LN_set_haxe_property.py b/blender/arm/logicnode/native/LN_set_haxe_property.py index 443123ff..bba925b3 100644 --- a/blender/arm/logicnode/native/LN_set_haxe_property.py +++ b/blender/arm/logicnode/native/LN_set_haxe_property.py @@ -9,11 +9,10 @@ class SetHaxePropertyNode(ArmLogicTreeNode): arm_section = 'haxe' arm_version = 1 - def init(self, context): - super(SetHaxePropertyNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketShader', 'Dynamic') - self.add_input('NodeSocketString', 'Property') - self.add_input('NodeSocketShader', 'Value') + self.add_input('ArmDynamicSocket', 'Dynamic') + self.add_input('ArmStringSocket', 'Property') + self.add_input('ArmDynamicSocket', 'Value') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/native/LN_set_vibrate.py b/blender/arm/logicnode/native/LN_set_vibrate.py index 6136a47e..17ba464c 100644 --- a/blender/arm/logicnode/native/LN_set_vibrate.py +++ b/blender/arm/logicnode/native/LN_set_vibrate.py @@ -8,10 +8,9 @@ class SetVibrateNode(ArmLogicTreeNode): arm_section = 'Native' arm_version = 1 - def init(self, context): - super(SetVibrateNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketInt', 'Milliseconds') + self.add_input('ArmIntSocket', 'Milliseconds') self.inputs[-1].default_value = 100 self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/native/LN_shutdown.py b/blender/arm/logicnode/native/LN_shutdown.py index 48b8587f..6292eafa 100644 --- a/blender/arm/logicnode/native/LN_shutdown.py +++ b/blender/arm/logicnode/native/LN_shutdown.py @@ -6,8 +6,7 @@ class ShutdownNode(ArmLogicTreeNode): bl_label = 'Shutdown' arm_version = 1 - def init(self, context): - super(ShutdownNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/native/LN_write_file.py b/blender/arm/logicnode/native/LN_write_file.py index 6b04d57d..2f5c4996 100644 --- a/blender/arm/logicnode/native/LN_write_file.py +++ b/blender/arm/logicnode/native/LN_write_file.py @@ -9,8 +9,7 @@ class WriteFileNode(ArmLogicTreeNode): arm_section = 'file' arm_version = 1 - def init(self, context): - super(WriteFileNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketString', 'File') - self.add_input('NodeSocketString', 'String') + self.add_input('ArmStringSocket', 'File') + self.add_input('ArmStringSocket', 'String') diff --git a/blender/arm/logicnode/native/LN_write_json.py b/blender/arm/logicnode/native/LN_write_json.py index 366fc008..3feff3fa 100644 --- a/blender/arm/logicnode/native/LN_write_json.py +++ b/blender/arm/logicnode/native/LN_write_json.py @@ -9,8 +9,7 @@ class WriteJsonNode(ArmLogicTreeNode): arm_section = 'file' arm_version = 1 - def init(self, context): - super(WriteJsonNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketString', 'File') - self.add_input('NodeSocketShader', 'Dynamic') + self.add_input('ArmStringSocket', 'File') + self.add_input('ArmDynamicSocket', 'Dynamic') diff --git a/blender/arm/logicnode/native/LN_write_storage.py b/blender/arm/logicnode/native/LN_write_storage.py index b829a2bb..727cbca9 100644 --- a/blender/arm/logicnode/native/LN_write_storage.py +++ b/blender/arm/logicnode/native/LN_write_storage.py @@ -9,10 +9,9 @@ class WriteStorageNode(ArmLogicTreeNode): arm_section = 'file' arm_version = 1 - def init(self, context): - super(WriteStorageNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketString', 'Key') - self.add_input('NodeSocketShader', 'Value') + self.add_input('ArmStringSocket', 'Key') + self.add_input('ArmDynamicSocket', 'Value') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/navmesh/LN_go_to_location.py b/blender/arm/logicnode/navmesh/LN_go_to_location.py index 7f7d6e9d..e60e743f 100644 --- a/blender/arm/logicnode/navmesh/LN_go_to_location.py +++ b/blender/arm/logicnode/navmesh/LN_go_to_location.py @@ -6,11 +6,10 @@ class GoToLocationNode(ArmLogicTreeNode): bl_label = 'Go to Location' arm_version = 1 - def init(self, context): - super(GoToLocationNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Object') - self.add_input('NodeSocketVector', 'Location') + self.add_input('ArmVectorSocket', 'Location') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/navmesh/LN_navigable_location.py b/blender/arm/logicnode/navmesh/LN_navigable_location.py index 5d25dc36..3e8b8f8b 100644 --- a/blender/arm/logicnode/navmesh/LN_navigable_location.py +++ b/blender/arm/logicnode/navmesh/LN_navigable_location.py @@ -6,6 +6,5 @@ class NavigableLocationNode(ArmLogicTreeNode): bl_label = 'Navigable Location' arm_version = 1 - def init(self, context): - super(NavigableLocationNode, self).init(context) - self.add_output('NodeSocketShader', 'Location') + def arm_init(self, context): + self.add_output('ArmDynamicSocket', 'Location') diff --git a/blender/arm/logicnode/navmesh/LN_pick_navmesh_location.py b/blender/arm/logicnode/navmesh/LN_pick_navmesh_location.py index c70dfba8..2ae40119 100644 --- a/blender/arm/logicnode/navmesh/LN_pick_navmesh_location.py +++ b/blender/arm/logicnode/navmesh/LN_pick_navmesh_location.py @@ -6,9 +6,8 @@ class PickLocationNode(ArmLogicTreeNode): bl_label = 'Pick NavMesh Location' arm_version = 1 - def init(self, context): - super(PickLocationNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketObject', 'NavMesh') - self.add_input('NodeSocketVector', 'Screen Coords') + self.add_input('ArmVectorSocket', 'Screen Coords') - self.add_output('NodeSocketVector', 'Location') + self.add_output('ArmVectorSocket', 'Location') diff --git a/blender/arm/logicnode/navmesh/LN_stop_agent.py b/blender/arm/logicnode/navmesh/LN_stop_agent.py index d7740fcf..ff49fc9f 100644 --- a/blender/arm/logicnode/navmesh/LN_stop_agent.py +++ b/blender/arm/logicnode/navmesh/LN_stop_agent.py @@ -6,8 +6,7 @@ class StopAgentNode(ArmLogicTreeNode): bl_label = 'Stop Agent' arm_version = 1 - def init(self, context): - super(StopAgentNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Object') diff --git a/blender/arm/logicnode/object/LN_get_distance.py b/blender/arm/logicnode/object/LN_get_distance.py index 0d4b5a3a..5885e890 100644 --- a/blender/arm/logicnode/object/LN_get_distance.py +++ b/blender/arm/logicnode/object/LN_get_distance.py @@ -9,9 +9,8 @@ class GetDistanceNode(ArmLogicTreeNode): bl_label = 'Get Distance' arm_version = 1 - def init(self, context): - super(GetDistanceNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketObject', 'Object') self.add_input('ArmNodeSocketObject', 'Object') - self.add_output('NodeSocketFloat', 'Distance') + self.add_output('ArmFloatSocket', 'Distance') diff --git a/blender/arm/logicnode/object/LN_get_object_by_name.py b/blender/arm/logicnode/object/LN_get_object_by_name.py index ae39b4e1..a19bdf06 100644 --- a/blender/arm/logicnode/object/LN_get_object_by_name.py +++ b/blender/arm/logicnode/object/LN_get_object_by_name.py @@ -5,13 +5,12 @@ from arm.logicnode.arm_nodes import * class GetObjectNode(ArmLogicTreeNode): """Searches for a object that uses the given name in the current active scene and returns it.""" - + bl_idname = 'LNGetObjectNode' bl_label = 'Get Object by Name' arm_version = 1 - def init(self, context): - super(GetObjectNode, self).init(context) - self.add_input('NodeSocketString', 'Name') + def arm_init(self, context): + self.add_input('ArmStringSocket', 'Name') self.add_output('ArmNodeSocketObject', 'Object') diff --git a/blender/arm/logicnode/object/LN_get_object_child.py b/blender/arm/logicnode/object/LN_get_object_child.py index 40fcf310..76409006 100644 --- a/blender/arm/logicnode/object/LN_get_object_child.py +++ b/blender/arm/logicnode/object/LN_get_object_child.py @@ -7,7 +7,8 @@ class GetChildNode(ArmLogicTreeNode): arm_section = 'relations' arm_version = 1 - property0: EnumProperty( + property0: HaxeEnumProperty( + 'property0', items = [('By Name', 'By Name', 'By Name'), ('Contains', 'Contains', 'Contains'), ('Starts With', 'Starts With', 'Starts With'), @@ -15,10 +16,9 @@ class GetChildNode(ArmLogicTreeNode): ], name='', default='By Name') - def init(self, context): - super(GetChildNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketObject', 'Parent') - self.add_input('NodeSocketString', 'Child Name') + self.add_input('ArmStringSocket', 'Child Name') self.add_output('ArmNodeSocketObject', 'Child') diff --git a/blender/arm/logicnode/object/LN_get_object_children.py b/blender/arm/logicnode/object/LN_get_object_children.py index 2ccbcecb..a23bf33f 100644 --- a/blender/arm/logicnode/object/LN_get_object_children.py +++ b/blender/arm/logicnode/object/LN_get_object_children.py @@ -7,8 +7,7 @@ class GetChildrenNode(ArmLogicTreeNode): arm_section = 'relations' arm_version = 1 - def init(self, context): - super(GetChildrenNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketObject', 'Parent') self.add_output('ArmNodeSocketArray', 'Children') diff --git a/blender/arm/logicnode/object/LN_get_object_mesh.py b/blender/arm/logicnode/object/LN_get_object_mesh.py index ff9cf047..9339134e 100644 --- a/blender/arm/logicnode/object/LN_get_object_mesh.py +++ b/blender/arm/logicnode/object/LN_get_object_mesh.py @@ -7,8 +7,7 @@ class GetMeshNode(ArmLogicTreeNode): arm_section = 'props' arm_version = 1 - def init(self, context): - super(GetMeshNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketObject', 'Object') - self.add_output('NodeSocketShader', 'Mesh') + self.add_output('ArmDynamicSocket', 'Mesh') diff --git a/blender/arm/logicnode/object/LN_get_object_name.py b/blender/arm/logicnode/object/LN_get_object_name.py index 8cd79d98..bb242d32 100644 --- a/blender/arm/logicnode/object/LN_get_object_name.py +++ b/blender/arm/logicnode/object/LN_get_object_name.py @@ -7,8 +7,7 @@ class GetNameNode(ArmLogicTreeNode): arm_section = 'props' arm_version = 1 - def init(self, context): - super(GetNameNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketObject', 'Object') - self.add_output('NodeSocketString', 'Name') + self.add_output('ArmStringSocket', 'Name') diff --git a/blender/arm/logicnode/object/LN_get_object_offscreen.py b/blender/arm/logicnode/object/LN_get_object_offscreen.py index 602ce2d0..6bd85f8b 100644 --- a/blender/arm/logicnode/object/LN_get_object_offscreen.py +++ b/blender/arm/logicnode/object/LN_get_object_offscreen.py @@ -7,10 +7,9 @@ class GetObjectOffscreenNode(ArmLogicTreeNode): arm_section = 'props' arm_version = 1 - def init(self, context): - super(GetObjectOffscreenNode, self).init(context) + def arm_init(self, context): self.inputs.new('ArmNodeSocketObject', 'Object') - self.outputs.new('NodeSocketBool', 'Is Object Offscreen') - self.outputs.new('NodeSocketBool', 'Is Mesh Offscreen') - self.outputs.new('NodeSocketBool', 'Is Shadow Offscreen') + self.outputs.new('ArmBoolSocket', 'Is Object Offscreen') + self.outputs.new('ArmBoolSocket', 'Is Mesh Offscreen') + self.outputs.new('ArmBoolSocket', 'Is Shadow Offscreen') diff --git a/blender/arm/logicnode/object/LN_get_object_parent.py b/blender/arm/logicnode/object/LN_get_object_parent.py index d856d008..5ca239a6 100644 --- a/blender/arm/logicnode/object/LN_get_object_parent.py +++ b/blender/arm/logicnode/object/LN_get_object_parent.py @@ -9,8 +9,7 @@ class GetParentNode(ArmLogicTreeNode): arm_section = 'relations' arm_version = 1 - def init(self, context): - super(GetParentNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketObject', 'Child') self.add_output('ArmNodeSocketObject', 'Parent') diff --git a/blender/arm/logicnode/object/LN_get_object_property.py b/blender/arm/logicnode/object/LN_get_object_property.py index 6c2792cf..3332677b 100644 --- a/blender/arm/logicnode/object/LN_get_object_property.py +++ b/blender/arm/logicnode/object/LN_get_object_property.py @@ -9,10 +9,9 @@ class GetPropertyNode(ArmLogicTreeNode): arm_version = 1 arm_section = 'props' - def init(self, context): - super(GetPropertyNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketObject', 'Object') - self.add_input('NodeSocketString', 'Property') + self.add_input('ArmStringSocket', 'Property') - self.add_output('NodeSocketShader', 'Value') - self.add_output('NodeSocketString', 'Property') + self.add_output('ArmDynamicSocket', 'Value') + self.add_output('ArmStringSocket', 'Property') diff --git a/blender/arm/logicnode/object/LN_get_object_visible.py b/blender/arm/logicnode/object/LN_get_object_visible.py index b04eb1b7..e01cbf57 100644 --- a/blender/arm/logicnode/object/LN_get_object_visible.py +++ b/blender/arm/logicnode/object/LN_get_object_visible.py @@ -10,10 +10,9 @@ class GetVisibleNode(ArmLogicTreeNode): arm_section = 'props' arm_version = 1 - def init(self, context): - super(GetVisibleNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketObject', 'Object') - self.add_output('NodeSocketBool', 'Is Object Visible') - self.add_output('NodeSocketBool', 'Is Mesh Visible') - self.add_output('NodeSocketBool', 'Is Shadow Visible') + self.add_output('ArmBoolSocket', 'Is Object Visible') + self.add_output('ArmBoolSocket', 'Is Mesh Visible') + self.add_output('ArmBoolSocket', 'Is Shadow Visible') diff --git a/blender/arm/logicnode/object/LN_mesh.py b/blender/arm/logicnode/object/LN_mesh.py index 0d4b1f00..3f05dda2 100644 --- a/blender/arm/logicnode/object/LN_mesh.py +++ b/blender/arm/logicnode/object/LN_mesh.py @@ -9,11 +9,10 @@ class MeshNode(ArmLogicTreeNode): bl_label = 'Mesh' arm_version = 1 - property0_get: PointerProperty(name='', type=bpy.types.Mesh) + property0_get: HaxePointerProperty('property0_get', name='', type=bpy.types.Mesh) - def init(self, context): - super(MeshNode, self).init(context) - self.add_output('NodeSocketShader', 'Mesh', is_var=True) + def arm_init(self, context): + self.add_output('ArmDynamicSocket', 'Mesh', is_var=True) def draw_buttons(self, context, layout): layout.prop_search(self, 'property0_get', bpy.data, 'meshes', icon='NONE', text='') diff --git a/blender/arm/logicnode/object/LN_object.py b/blender/arm/logicnode/object/LN_object.py index 3992bb40..8b9b0636 100644 --- a/blender/arm/logicnode/object/LN_object.py +++ b/blender/arm/logicnode/object/LN_object.py @@ -6,8 +6,7 @@ class ObjectNode(ArmLogicTreeNode): bl_label = 'Object' arm_version = 1 - def init(self, context): - super(ObjectNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketObject', 'Object In') self.add_output('ArmNodeSocketObject', 'Object Out', is_var=True) diff --git a/blender/arm/logicnode/object/LN_remove_object.py b/blender/arm/logicnode/object/LN_remove_object.py index 7783da82..78d0f956 100644 --- a/blender/arm/logicnode/object/LN_remove_object.py +++ b/blender/arm/logicnode/object/LN_remove_object.py @@ -6,8 +6,7 @@ class RemoveObjectNode(ArmLogicTreeNode): bl_label = 'Remove Object' arm_version = 1 - def init(self, context): - super(RemoveObjectNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Object') diff --git a/blender/arm/logicnode/object/LN_remove_object_parent.py b/blender/arm/logicnode/object/LN_remove_object_parent.py index ffe60c13..80439051 100644 --- a/blender/arm/logicnode/object/LN_remove_object_parent.py +++ b/blender/arm/logicnode/object/LN_remove_object_parent.py @@ -7,10 +7,9 @@ class ClearParentNode(ArmLogicTreeNode): arm_section = 'relations' arm_version = 1 - def init(self, context): - super(ClearParentNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Object') - self.add_input('NodeSocketBool', 'Keep Transform', default_value=True) + self.add_input('ArmBoolSocket', 'Keep Transform', default_value=True) self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/object/LN_self_object.py b/blender/arm/logicnode/object/LN_self_object.py index aa4021ca..0dcbd0d0 100644 --- a/blender/arm/logicnode/object/LN_self_object.py +++ b/blender/arm/logicnode/object/LN_self_object.py @@ -6,6 +6,5 @@ class SelfObjectNode(ArmLogicTreeNode): bl_label = 'Self Object' arm_version = 1 - def init(self, context): - super(SelfObjectNode, self).init(context) + def arm_init(self, context): self.add_output('ArmNodeSocketObject', 'Object') diff --git a/blender/arm/logicnode/object/LN_set_object_mesh.py b/blender/arm/logicnode/object/LN_set_object_mesh.py index 803b25e1..114e0078 100644 --- a/blender/arm/logicnode/object/LN_set_object_mesh.py +++ b/blender/arm/logicnode/object/LN_set_object_mesh.py @@ -7,10 +7,9 @@ class SetMeshNode(ArmLogicTreeNode): arm_section = 'props' arm_version = 1 - def init(self, context): - super(SetMeshNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Object') - self.add_input('NodeSocketShader', 'Mesh') + self.add_input('ArmDynamicSocket', 'Mesh') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/object/LN_set_object_name.py b/blender/arm/logicnode/object/LN_set_object_name.py index 921675b9..236e25b6 100644 --- a/blender/arm/logicnode/object/LN_set_object_name.py +++ b/blender/arm/logicnode/object/LN_set_object_name.py @@ -7,10 +7,9 @@ class SetNameNode(ArmLogicTreeNode): arm_section = 'props' arm_version = 1 - def init(self, context): - super(SetNameNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Object') - self.add_input('NodeSocketString', 'Name') + self.add_input('ArmStringSocket', 'Name') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/object/LN_set_object_parent.py b/blender/arm/logicnode/object/LN_set_object_parent.py index 30b50d1a..c5e425ee 100644 --- a/blender/arm/logicnode/object/LN_set_object_parent.py +++ b/blender/arm/logicnode/object/LN_set_object_parent.py @@ -9,8 +9,7 @@ class SetParentNode(ArmLogicTreeNode): arm_section = 'relations' arm_version = 1 - def init(self, context): - super(SetParentNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Object') self.add_input('ArmNodeSocketObject', 'Parent', default_value='Parent') diff --git a/blender/arm/logicnode/object/LN_set_object_property.py b/blender/arm/logicnode/object/LN_set_object_property.py index f5f17e3f..326beb2f 100644 --- a/blender/arm/logicnode/object/LN_set_object_property.py +++ b/blender/arm/logicnode/object/LN_set_object_property.py @@ -14,11 +14,10 @@ class SetPropertyNode(ArmLogicTreeNode): arm_section = 'props' arm_version = 1 - def init(self, context): - super(SetPropertyNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Object') - self.add_input('NodeSocketString', 'Property') - self.add_input('NodeSocketShader', 'Value') + self.add_input('ArmStringSocket', 'Property') + self.add_input('ArmDynamicSocket', 'Value') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/object/LN_set_object_visible.py b/blender/arm/logicnode/object/LN_set_object_visible.py index 6fa99efb..09107e9e 100644 --- a/blender/arm/logicnode/object/LN_set_object_visible.py +++ b/blender/arm/logicnode/object/LN_set_object_visible.py @@ -9,19 +9,19 @@ class SetVisibleNode(ArmLogicTreeNode): arm_section = 'props' arm_version = 1 - property0: EnumProperty( + property0: HaxeEnumProperty( + 'property0', items = [('object', 'Object', 'All object componenets visibility'), ('mesh', 'Mesh', 'Mesh visibility only'), ('shadow', 'Shadow', 'Shadow visibility only'), ], name='', default='object') - def init(self, context): - super(SetVisibleNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Object') - self.add_input('NodeSocketBool', 'Visible') - self.add_input('NodeSocketBool', 'Children', default_value=True) + self.add_input('ArmBoolSocket', 'Visible') + self.add_input('ArmBoolSocket', 'Children', default_value=True) self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/object/LN_spawn_object.py b/blender/arm/logicnode/object/LN_spawn_object.py index e4e3722a..de4ff22f 100644 --- a/blender/arm/logicnode/object/LN_spawn_object.py +++ b/blender/arm/logicnode/object/LN_spawn_object.py @@ -2,17 +2,16 @@ from arm.logicnode.arm_nodes import * class SpawnObjectNode(ArmLogicTreeNode): """Spawns the given object if present in the current active scene. The spawned object has the same name of its instance, but they are treated as different objects.""" - + bl_idname = 'LNSpawnObjectNode' bl_label = 'Spawn Object' arm_version = 1 - def init(self, context): - super(SpawnObjectNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Object') - self.add_input('NodeSocketShader', 'Transform') - self.add_input('NodeSocketBool', 'Children', default_value=True) + self.add_input('ArmDynamicSocket', 'Transform') + self.add_input('ArmBoolSocket', 'Children', default_value=True) self.add_output('ArmNodeSocketAction', 'Out') self.add_output('ArmNodeSocketObject', 'Object') diff --git a/blender/arm/logicnode/object/LN_spawn_object_by_name.py b/blender/arm/logicnode/object/LN_spawn_object_by_name.py index 92faa105..3fed2d76 100644 --- a/blender/arm/logicnode/object/LN_spawn_object_by_name.py +++ b/blender/arm/logicnode/object/LN_spawn_object_by_name.py @@ -6,16 +6,16 @@ class SpawnObjectByNameNode(ArmLogicTreeNode): bl_label = 'Spawn Object By Name' arm_version = 1 - property0: PointerProperty( + property0: HaxePointerProperty( + 'property0', type=bpy.types.Scene, name='Scene', description='The scene from which to take the object') - def init(self, context): - super(SpawnObjectByNameNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketString', 'Name') - self.add_input('NodeSocketShader', 'Transform') - self.add_input('NodeSocketBool', 'Children', default_value=True) + self.add_input('ArmStringSocket', 'Name') + self.add_input('ArmDynamicSocket', 'Transform') + self.add_input('ArmBoolSocket', 'Children', default_value=True) self.add_output('ArmNodeSocketAction', 'Out') self.add_output('ArmNodeSocketObject', 'Object') diff --git a/blender/arm/logicnode/physics/LN_Add_rigid_body.py b/blender/arm/logicnode/physics/LN_Add_rigid_body.py index 27deaa24..97fa8e80 100644 --- a/blender/arm/logicnode/physics/LN_Add_rigid_body.py +++ b/blender/arm/logicnode/physics/LN_Add_rigid_body.py @@ -1,12 +1,12 @@ from arm.logicnode.arm_nodes import * class AddRigidBodyNode(ArmLogicTreeNode): - """Adds a rigid body to an object if not already present. + """Adds a rigid body to an object if not already present. @option Advanced: Shows optional advanced options for rigid body. @option Shape: Shape of the rigid body including Box, Sphere, Capsule, Cone, Cylinder, Convex Hull and Mesh - + @input Object: Object to which rigid body is added. @input Mass: Mass of the rigid body. Must be > 0. @@ -14,9 +14,9 @@ class AddRigidBodyNode(ArmLogicTreeNode): @input Active: Rigid body actively participates in the physics world and will be affected by collisions @input Animated: Rigid body follows animation and will affect other active non-animated rigid bodies. - - @input Trigger: Rigid body behaves as a trigger and detects collision. However, rigd body does not contribute to or receive collissions. - + + @input Trigger: Rigid body behaves as a trigger and detects collision. However, rigd body does not contribute to or receive collissions. + @input Friction: Surface friction of the rigid body. Minimum value = 0, Preferred max value = 1. @input Bounciness: How elastic is the surface of the rigid body. Minimum value = 0, Preferred max value = 1. @@ -34,7 +34,7 @@ class AddRigidBodyNode(ArmLogicTreeNode): @input Use Deactivation: Deactive this rigid body when below the Linear and Angular velocity threshold. Enable to improve performance. @input Linear Velocity Threshold: Velocity below which decativation occurs if enabled. - + @input Angular Velocity Threshold: Velocity below which decativation occurs if enabled. @input Collision Group: A set of rigid bodies that can interact with each other @@ -43,9 +43,9 @@ class AddRigidBodyNode(ArmLogicTreeNode): @output Rigid body: Object to which rigid body was added. - @output Out: activated after rigid body is added. + @output Out: activated after rigid body is added. """ - + bl_idname = 'LNAddRigidBodyNode' bl_label = 'Add Rigid Body' arm_version = 1 @@ -59,18 +59,16 @@ class AddRigidBodyNode(ArmLogicTreeNode): further down.""" self.update_sockets(context) - @property - def property1(self): - return 'true' if self.property1_ else 'false' - - property1_: BoolProperty( + property1: HaxeBoolProperty( + 'property1', name="Advanced", description="Show advanced options", default=False, update=update_advanced ) - property0: EnumProperty( + property0: HaxeEnumProperty( + 'property0', items = [('Box', 'Box', 'Box'), ('Sphere', 'Sphere', 'Sphere'), ('Capsule', 'Capsule', 'Capsule'), @@ -80,18 +78,17 @@ class AddRigidBodyNode(ArmLogicTreeNode): ('Mesh', 'Mesh', 'Mesh')], name='Shape', default='Box') - def init(self, context): - super(AddRigidBodyNode, self).init(context) - + def arm_init(self, context): + self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Object') - self.add_input('NodeSocketFloat', 'Mass', 1.0) - self.add_input('NodeSocketBool', 'Active', True) - self.add_input('NodeSocketBool', 'Animated', False) - self.add_input('NodeSocketBool', 'Trigger', False) - self.add_input('NodeSocketFloat', 'Friction', 0.5) - self.add_input('NodeSocketFloat', 'Bounciness', 0.0) - self.add_input('NodeSocketBool', 'Continuous Collision Detection', False) + self.add_input('ArmFloatSocket', 'Mass', 1.0) + self.add_input('ArmBoolSocket', 'Active', True) + self.add_input('ArmBoolSocket', 'Animated', False) + self.add_input('ArmBoolSocket', 'Trigger', False) + self.add_input('ArmFloatSocket', 'Friction', 0.5) + self.add_input('ArmFloatSocket', 'Bounciness', 0.0) + self.add_input('ArmBoolSocket', 'Continuous Collision Detection', False) self.add_output('ArmNodeSocketAction', 'Out') self.add_output('ArmNodeSocketObject', 'Rigid body') @@ -110,17 +107,17 @@ class AddRigidBodyNode(ArmLogicTreeNode): # Add dynamic input sockets if self.property1_: - self.add_input('NodeSocketBool', 'Collision Margin', False) - self.add_input('NodeSocketFloat', 'Margin', 0.04) - self.add_input('NodeSocketFloat', 'Linear Damping', 0.04) - self.add_input('NodeSocketFloat', 'Angular Damping', 0.1) - self.add_input('NodeSocketBool', 'Use Deacivation') - self.add_input('NodeSocketFloat', 'Linear Velocity Threshold', 0.4) - self.add_input('NodeSocketFloat', 'Angular Velocity Threshold', 0.5) - self.add_input('NodeSocketInt', 'Collision Group', 1) - self.add_input('NodeSocketInt', 'Collision Mask', 1) + self.add_input('ArmBoolSocket', 'Collision Margin', False) + self.add_input('ArmFloatSocket', 'Margin', 0.04) + self.add_input('ArmFloatSocket', 'Linear Damping', 0.04) + self.add_input('ArmFloatSocket', 'Angular Damping', 0.1) + self.add_input('ArmBoolSocket', 'Use Deacivation') + self.add_input('ArmFloatSocket', 'Linear Velocity Threshold', 0.4) + self.add_input('ArmFloatSocket', 'Angular Velocity Threshold', 0.5) + self.add_input('ArmIntSocket', 'Collision Group', 1) + self.add_input('ArmIntSocket', 'Collision Mask', 1) def draw_buttons(self, context, layout): - layout.prop(self, "property1_") - layout.prop(self, 'property0') \ No newline at end of file + layout.prop(self, "property1") + layout.prop(self, 'property0') diff --git a/blender/arm/logicnode/physics/LN_add_physics_constraint.py b/blender/arm/logicnode/physics/LN_add_physics_constraint.py index 039a536f..192fd804 100644 --- a/blender/arm/logicnode/physics/LN_add_physics_constraint.py +++ b/blender/arm/logicnode/physics/LN_add_physics_constraint.py @@ -3,11 +3,11 @@ from arm.logicnode.arm_nodes import * class AddPhysicsConstraintNode(ArmLogicTreeNode): """ Add a physics constraint to constrain two rigid bodies if not already present. - + @option Fixed: No fredom of movement. Relative positions and rotations of rigid bodies are fixed @option Point: Both rigid bodies are constrained at the pivot object. - + @option Hinge: Constrained objects can move only along angular Z axis of the pivot object. @option Slider: Constrained objects can move only along linear X axis of the pivot object. @@ -57,15 +57,15 @@ class AddPhysicsConstraintNode(ArmLogicTreeNode): @staticmethod def get_count_in(type_name): return { - 'Fixed': 0, - 'Point': 1, - 'Hinge': 2, + 'Fixed': 0, + 'Point': 1, + 'Hinge': 2, 'Slider': 3, - 'Piston': 4, + 'Piston': 4, 'Generic Spring': 5 }.get(type_name, 0) - def get_enum(self): + def get_enum(self): return self.get('property0', 0) def set_enum(self, value): @@ -91,31 +91,31 @@ class AddPhysicsConstraintNode(ArmLogicTreeNode): while (len(self.inputs) > 7): self.inputs.remove(self.inputs.values()[-1]) #Z ang limits - self.add_input('NodeSocketBool', 'Z angle') - self.add_input('NodeSocketFloat', 'Z ang lower', -45.0) - self.add_input('NodeSocketFloat', 'Z ang upper', 45.0) + self.add_input('ArmBoolSocket', 'Z angle') + self.add_input('ArmFloatSocket', 'Z ang lower', -45.0) + self.add_input('ArmFloatSocket', 'Z ang upper', 45.0) #Arguements for type Slider if (self.get_count_in(select_current) == 3): while (len(self.inputs) > 7): self.inputs.remove(self.inputs.values()[-1]) #X lin limits - self.add_input('NodeSocketBool', 'X linear') - self.add_input('NodeSocketFloat', 'X lin lower') - self.add_input('NodeSocketFloat', 'X lin upper') + self.add_input('ArmBoolSocket', 'X linear') + self.add_input('ArmFloatSocket', 'X lin lower') + self.add_input('ArmFloatSocket', 'X lin upper') #Arguements for type Piston if (self.get_count_in(select_current) == 4): while (len(self.inputs) > 7): self.inputs.remove(self.inputs.values()[-1]) #X lin limits - self.add_input('NodeSocketBool', 'X linear') - self.add_input('NodeSocketFloat', 'X lin lower') - self.add_input('NodeSocketFloat', 'X lin upper') + self.add_input('ArmBoolSocket', 'X linear') + self.add_input('ArmFloatSocket', 'X lin lower') + self.add_input('ArmFloatSocket', 'X lin upper') #X ang limits - self.add_input('NodeSocketBool', 'X angle') - self.add_input('NodeSocketFloat', 'X ang lower', -45.0) - self.add_input('NodeSocketFloat', 'X ang upper', 45.0) + self.add_input('ArmBoolSocket', 'X angle') + self.add_input('ArmFloatSocket', 'X ang lower', -45.0) + self.add_input('ArmFloatSocket', 'X ang upper', 45.0) #Arguements for type GenericSpring if (self.get_count_in(select_current) == 5): @@ -124,7 +124,8 @@ class AddPhysicsConstraintNode(ArmLogicTreeNode): self['property0'] = value - property0: EnumProperty( + property0: HaxeEnumProperty( + 'property0', items = [('Fixed', 'Fixed', 'Fixed'), ('Point', 'Point', 'Point'), ('Hinge', 'Hinge', 'Hinge'), @@ -132,24 +133,23 @@ class AddPhysicsConstraintNode(ArmLogicTreeNode): ('Piston', 'Piston', 'Piston'), ('Generic Spring', 'Generic Spring', 'Generic Spring')], name='Type', default='Fixed', set=set_enum, get=get_enum) - + def __init__(self): array_nodes[str(id(self))] = self - def init(self, context): - super(AddPhysicsConstraintNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Pivot Object') self.add_input('ArmNodeSocketObject', 'RB 1') self.add_input('ArmNodeSocketObject', 'RB 2') - self.add_input('NodeSocketBool', 'Disable Collissions') - self.add_input('NodeSocketBool', 'Breakable') - self.add_input('NodeSocketFloat', 'Breaking Threshold') + self.add_input('ArmBoolSocket', 'Disable Collissions') + self.add_input('ArmBoolSocket', 'Breakable') + self.add_input('ArmFloatSocket', 'Breaking Threshold') self.add_output('ArmNodeSocketAction', 'Out') def draw_buttons(self, context, layout): layout.prop(self, 'property0') - + #GenericSpring: if (self.get_count_in(self.property0) == 5): grid0 = layout.grid_flow(row_major=True, columns=1, align=True) @@ -162,7 +162,7 @@ class AddPhysicsConstraintNode(ArmLogicTreeNode): column = row.column(align=True) op = column.operator('arm.node_add_input', text='Add Constraint', icon='PLUS', emboss=True) op.node_index = str(id(self)) - op.socket_type = 'NodeSocketShader' + op.socket_type = 'ArmDynamicSocket' op.name_format = 'Constraint {0}'.format(len(self.inputs) - 6) column1 = row.column(align=True) op = column1.operator('arm.node_remove_input', text='', icon='X', emboss=True) diff --git a/blender/arm/logicnode/physics/LN_apply_force.py b/blender/arm/logicnode/physics/LN_apply_force.py index 57c4a9fa..20aba1b1 100644 --- a/blender/arm/logicnode/physics/LN_apply_force.py +++ b/blender/arm/logicnode/physics/LN_apply_force.py @@ -16,11 +16,10 @@ class ApplyForceNode(ArmLogicTreeNode): arm_section = 'force' arm_version = 1 - def init(self, context): - super(ApplyForceNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'RB') - self.add_input('NodeSocketVector', 'Force') - self.add_input('NodeSocketBool', 'On Local Axis') + self.add_input('ArmVectorSocket', 'Force') + self.add_input('ArmBoolSocket', 'On Local Axis') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/physics/LN_apply_force_at_location.py b/blender/arm/logicnode/physics/LN_apply_force_at_location.py index 8d83efba..145627f4 100644 --- a/blender/arm/logicnode/physics/LN_apply_force_at_location.py +++ b/blender/arm/logicnode/physics/LN_apply_force_at_location.py @@ -19,13 +19,12 @@ class ApplyForceAtLocationNode(ArmLogicTreeNode): arm_section = 'force' arm_version = 1 - def init(self, context): - super(ApplyForceAtLocationNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'RB') - self.add_input('NodeSocketVector', 'Force') - self.add_input('NodeSocketBool', 'Force On Local Axis') - self.add_input('NodeSocketVector', 'Location') - self.add_input('NodeSocketBool', 'Location On Local Axis') + self.add_input('ArmVectorSocket', 'Force') + self.add_input('ArmBoolSocket', 'Force On Local Axis') + self.add_input('ArmVectorSocket', 'Location') + self.add_input('ArmBoolSocket', 'Location On Local Axis') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/physics/LN_apply_impulse.py b/blender/arm/logicnode/physics/LN_apply_impulse.py index c3ecec3b..68c2006d 100644 --- a/blender/arm/logicnode/physics/LN_apply_impulse.py +++ b/blender/arm/logicnode/physics/LN_apply_impulse.py @@ -16,11 +16,10 @@ class ApplyImpulseNode(ArmLogicTreeNode): arm_section = 'force' arm_version = 1 - def init(self, context): - super(ApplyImpulseNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'RB') - self.add_input('NodeSocketVector', 'Impulse') - self.add_input('NodeSocketBool', 'On Local Axis') + self.add_input('ArmVectorSocket', 'Impulse') + self.add_input('ArmBoolSocket', 'On Local Axis') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/physics/LN_apply_impulse_at_location.py b/blender/arm/logicnode/physics/LN_apply_impulse_at_location.py index fbd0c53c..24d55a6d 100644 --- a/blender/arm/logicnode/physics/LN_apply_impulse_at_location.py +++ b/blender/arm/logicnode/physics/LN_apply_impulse_at_location.py @@ -19,13 +19,12 @@ class ApplyImpulseAtLocationNode(ArmLogicTreeNode): arm_section = 'force' arm_version = 1 - def init(self, context): - super(ApplyImpulseAtLocationNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'RB') - self.add_input('NodeSocketVector', 'Impulse') - self.add_input('NodeSocketBool', 'Impulse On Local Axis') - self.add_input('NodeSocketVector', 'Location') - self.add_input('NodeSocketBool', 'Location On Local Axis') + self.add_input('ArmVectorSocket', 'Impulse') + self.add_input('ArmBoolSocket', 'Impulse On Local Axis') + self.add_input('ArmVectorSocket', 'Location') + self.add_input('ArmBoolSocket', 'Location On Local Axis') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/physics/LN_apply_torque.py b/blender/arm/logicnode/physics/LN_apply_torque.py index 88ca157e..70d2633e 100644 --- a/blender/arm/logicnode/physics/LN_apply_torque.py +++ b/blender/arm/logicnode/physics/LN_apply_torque.py @@ -7,11 +7,10 @@ class ApplyTorqueNode(ArmLogicTreeNode): arm_section = 'force' arm_version = 1 - def init(self, context): - super(ApplyTorqueNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'RB') - self.add_input('NodeSocketVector', 'Torque') - self.add_input('NodeSocketBool', 'On Local Axis') + self.add_input('ArmVectorSocket', 'Torque') + self.add_input('ArmBoolSocket', 'On Local Axis') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/physics/LN_apply_torque_impulse.py b/blender/arm/logicnode/physics/LN_apply_torque_impulse.py index f067cf7f..2bf208c2 100644 --- a/blender/arm/logicnode/physics/LN_apply_torque_impulse.py +++ b/blender/arm/logicnode/physics/LN_apply_torque_impulse.py @@ -7,11 +7,10 @@ class ApplyTorqueImpulseNode(ArmLogicTreeNode): arm_section = 'force' arm_version = 1 - def init(self, context): - super(ApplyTorqueImpulseNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'RB') - self.add_input('NodeSocketVector', 'Torque') - self.add_input('NodeSocketBool', 'On Local Axis') + self.add_input('ArmVectorSocket', 'Torque') + self.add_input('ArmBoolSocket', 'On Local Axis') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/physics/LN_get_rb_contacts.py b/blender/arm/logicnode/physics/LN_get_rb_contacts.py index fd1cf788..9f63fae5 100644 --- a/blender/arm/logicnode/physics/LN_get_rb_contacts.py +++ b/blender/arm/logicnode/physics/LN_get_rb_contacts.py @@ -11,8 +11,7 @@ class GetContactsNode(ArmLogicTreeNode): arm_section = 'contact' arm_version = 1 - def init(self, context): - super(GetContactsNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketObject', 'RB') self.add_output('ArmNodeSocketArray', 'Contacts') diff --git a/blender/arm/logicnode/physics/LN_get_rb_data.py b/blender/arm/logicnode/physics/LN_get_rb_data.py index 90637ff5..76ecb2e2 100644 --- a/blender/arm/logicnode/physics/LN_get_rb_data.py +++ b/blender/arm/logicnode/physics/LN_get_rb_data.py @@ -7,20 +7,20 @@ class GetRigidBodyDataNode(ArmLogicTreeNode): arm_section = 'props' arm_version = 1 - def init(self, context): + def arm_init(self, context): self.inputs.new('ArmNodeSocketObject', 'Object') - self.outputs.new('NodeSocketBool', 'Is RB') - self.outputs.new('NodeSocketInt', 'Collision Group') - self.outputs.new('NodeSocketInt', 'Collision Mask') - self.outputs.new('NodeSocketBool', 'Is Animated') - self.outputs.new('NodeSocketBool', 'Is Static') - self.outputs.new('NodeSocketFloat', 'Angular Damping') - self.outputs.new('NodeSocketFloat', 'Linear Damping') - self.outputs.new('NodeSocketFloat', 'Friction') - self.outputs.new('NodeSocketFloat', 'Mass') - #self.outputs.new('NodeSocketString', 'Collision Shape') - #self.outputs.new('NodeSocketInt', 'Activation State') - #self.outputs.new('NodeSocketBool', 'Is Gravity Enabled') - #self.outputs.new(NodeSocketVector', Angular Factor') - #self.outputs.new('NodeSocketVector', Linear Factor') + self.outputs.new('ArmBoolSocket', 'Is RB') + self.outputs.new('ArmIntSocket', 'Collision Group') + self.outputs.new('ArmIntSocket', 'Collision Mask') + self.outputs.new('ArmBoolSocket', 'Is Animated') + self.outputs.new('ArmBoolSocket', 'Is Static') + self.outputs.new('ArmFloatSocket', 'Angular Damping') + self.outputs.new('ArmFloatSocket', 'Linear Damping') + self.outputs.new('ArmFloatSocket', 'Friction') + self.outputs.new('ArmFloatSocket', 'Mass') + #self.outputs.new('ArmStringSocket', 'Collision Shape') + #self.outputs.new('ArmIntSocket', 'Activation State') + #self.outputs.new('ArmBoolSocket', 'Is Gravity Enabled') + #self.outputs.new(ArmVectorSocket', Angular Factor') + #self.outputs.new('ArmVectorSocket', Linear Factor') diff --git a/blender/arm/logicnode/physics/LN_get_rb_first_contact.py b/blender/arm/logicnode/physics/LN_get_rb_first_contact.py index 9781c184..ea8ea7af 100644 --- a/blender/arm/logicnode/physics/LN_get_rb_first_contact.py +++ b/blender/arm/logicnode/physics/LN_get_rb_first_contact.py @@ -10,8 +10,7 @@ class GetFirstContactNode(ArmLogicTreeNode): arm_section = 'contact' arm_version = 1 - def init(self, context): - super(GetFirstContactNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketObject', 'RB') self.add_output('ArmNodeSocketObject', 'First Contact') diff --git a/blender/arm/logicnode/physics/LN_get_rb_velocity.py b/blender/arm/logicnode/physics/LN_get_rb_velocity.py index e4b889f9..18dcadeb 100644 --- a/blender/arm/logicnode/physics/LN_get_rb_velocity.py +++ b/blender/arm/logicnode/physics/LN_get_rb_velocity.py @@ -6,11 +6,10 @@ class GetVelocityNode(ArmLogicTreeNode): bl_label = 'Get RB Velocity' arm_version = 1 - def init(self, context): - super(GetVelocityNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketObject', 'RB') - self.add_input('NodeSocketBool', 'Linear On Local Axis') - self.add_input('NodeSocketBool', 'Angular On Local Axis') + self.add_input('ArmBoolSocket', 'Linear On Local Axis') + self.add_input('ArmBoolSocket', 'Angular On Local Axis') - self.add_output('NodeSocketVector', 'Linear') - self.add_output('NodeSocketVector', 'Angular') + self.add_output('ArmVectorSocket', 'Linear') + self.add_output('ArmVectorSocket', 'Angular') diff --git a/blender/arm/logicnode/physics/LN_get_world_gravity.py b/blender/arm/logicnode/physics/LN_get_world_gravity.py index e91555f5..0fb4aec8 100644 --- a/blender/arm/logicnode/physics/LN_get_world_gravity.py +++ b/blender/arm/logicnode/physics/LN_get_world_gravity.py @@ -9,6 +9,5 @@ class GetGravityNode(ArmLogicTreeNode): bl_label = 'Get World Gravity' arm_version = 1 - def init(self, context): - super(GetGravityNode, self).init(context) - self.add_output('NodeSocketVector', 'World Gravity') + def arm_init(self, context): + self.add_output('ArmVectorSocket', 'World Gravity') diff --git a/blender/arm/logicnode/physics/LN_has_contact.py b/blender/arm/logicnode/physics/LN_has_contact.py index 9a1eb8da..627180e3 100644 --- a/blender/arm/logicnode/physics/LN_has_contact.py +++ b/blender/arm/logicnode/physics/LN_has_contact.py @@ -7,9 +7,8 @@ class HasContactNode(ArmLogicTreeNode): arm_section = 'contact' arm_version = 1 - def init(self, context): - super(HasContactNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketObject', 'RB 1') self.add_input('ArmNodeSocketObject', 'RB 2') - self.add_output('NodeSocketBool', 'Has Contact') + self.add_output('ArmBoolSocket', 'Has Contact') diff --git a/blender/arm/logicnode/physics/LN_has_contact_array.py b/blender/arm/logicnode/physics/LN_has_contact_array.py index 7fafd3e9..a7a6b759 100644 --- a/blender/arm/logicnode/physics/LN_has_contact_array.py +++ b/blender/arm/logicnode/physics/LN_has_contact_array.py @@ -7,9 +7,8 @@ class HasContactArrayNode(ArmLogicTreeNode): arm_section = 'contact' arm_version = 1 - def init(self, context): - super(HasContactArrayNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketObject', 'RB') self.add_input('ArmNodeSocketArray', 'RBs') - self.add_output('NodeSocketBool', 'Has Contact') + self.add_output('ArmBoolSocket', 'Has Contact') diff --git a/blender/arm/logicnode/physics/LN_on_contact.py b/blender/arm/logicnode/physics/LN_on_contact.py index 7daa4e86..8ca26aab 100644 --- a/blender/arm/logicnode/physics/LN_on_contact.py +++ b/blender/arm/logicnode/physics/LN_on_contact.py @@ -16,14 +16,14 @@ class OnContactNode(ArmLogicTreeNode): arm_section = 'contact' arm_version = 1 - property0: EnumProperty( + property0: HaxeEnumProperty( + 'property0', items = [('begin', 'Begin', 'The contact between the rigid bodies begins'), ('overlap', 'Overlap', 'The contact between the rigid bodies is happening'), ('end', 'End', 'The contact between the rigid bodies ends')], name='', default='begin') - def init(self, context): - super(OnContactNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketObject', 'RB 1') self.add_input('ArmNodeSocketObject', 'RB 2') diff --git a/blender/arm/logicnode/physics/LN_on_contact_array.py b/blender/arm/logicnode/physics/LN_on_contact_array.py index 1a300c2d..c39a6ad2 100644 --- a/blender/arm/logicnode/physics/LN_on_contact_array.py +++ b/blender/arm/logicnode/physics/LN_on_contact_array.py @@ -7,14 +7,14 @@ class OnContactArrayNode(ArmLogicTreeNode): arm_section = 'contact' arm_version = 1 - property0: EnumProperty( + property0: HaxeEnumProperty( + 'property0', items = [('begin', 'Begin', 'The contact between the rigid bodies begins'), ('overlap', 'Overlap', 'The contact between the rigid bodies is happening'), ('end', 'End', 'The contact between the rigid bodies ends')], name='', default='begin') - def init(self, context): - super(OnContactArrayNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketObject', 'RB') self.add_input('ArmNodeSocketArray', 'RBs') diff --git a/blender/arm/logicnode/physics/LN_on_volume_trigger.py b/blender/arm/logicnode/physics/LN_on_volume_trigger.py index 225aa301..0c4cf2d5 100644 --- a/blender/arm/logicnode/physics/LN_on_volume_trigger.py +++ b/blender/arm/logicnode/physics/LN_on_volume_trigger.py @@ -10,14 +10,14 @@ class OnVolumeTriggerNode(ArmLogicTreeNode): bl_label = 'On Volume Trigger' arm_version = 1 - property0: EnumProperty( + property0: HaxeEnumProperty( + 'property0', items = [('begin', 'Begin', 'The contact between the rigid bodies begins'), ('overlap', 'Overlap', 'The contact between the rigid bodies is happening'), ('end', 'End', 'The contact between the rigid bodies ends')], name='', default='begin') - def init(self, context): - super(OnVolumeTriggerNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketObject', 'Object 1') self.add_input('ArmNodeSocketObject', 'Object 2') diff --git a/blender/arm/logicnode/physics/LN_physics_constraint.py b/blender/arm/logicnode/physics/LN_physics_constraint.py index 457f24ca..f8aafce9 100644 --- a/blender/arm/logicnode/physics/LN_physics_constraint.py +++ b/blender/arm/logicnode/physics/LN_physics_constraint.py @@ -1,5 +1,6 @@ from arm.logicnode.arm_nodes import * + class PhysicsConstraintNode(ArmLogicTreeNode): """ Custom physics constraint to add to `Add Physics Constarint` node. @@ -26,62 +27,48 @@ class PhysicsConstraintNode(ArmLogicTreeNode): def update_spring(self, context): self.update_sockets(context) - property0: EnumProperty( - items = [('Linear', 'Linear', 'Linear'), - ('Angular', 'Angular', 'Angular')], + property0: HaxeEnumProperty( + 'property0', + items=[('Linear', 'Linear', 'Linear'), + ('Angular', 'Angular', 'Angular')], name='Type', default='Linear') - - @property - def property1(self): - if(self.property1_ == 'X'): - return 'X' - if(self.property1_ == 'Y'): - return 'Y' - if(self.property1_ == 'Z'): - return 'Z' - property1_: EnumProperty( - items = [('X', 'X', 'X'), - ('Y', 'Y', 'Y'), - ('Z', 'Z', 'Z')], + property1: HaxeEnumProperty( + 'property1', + items=[('X', 'X', 'X'), + ('Y', 'Y', 'Y'), + ('Z', 'Z', 'Z')], name='Axis', default='X') - @property - def property2(self): - if(self.property2_): - return 'true' if self.property2_ else 'false' - - property2_: BoolProperty( + property2: HaxeBoolProperty( + 'property2', name="Spring", description="Is a spring constraint", default=False, update=update_spring ) - + def __init__(self): array_nodes[str(id(self))] = self - def init(self, context): - super(PhysicsConstraintNode, self).init(context) - self.add_input('NodeSocketFloat', 'Lower limit') - self.add_input('NodeSocketFloat', 'Upper limit') - self.add_output('NodeSocketShader', 'Constraint') - - def update_sockets(self, context): + def arm_init(self, context): + self.add_input('ArmFloatSocket', 'Lower limit') + self.add_input('ArmFloatSocket', 'Upper limit') + self.add_output('ArmDynamicSocket', 'Constraint') - while (len(self.inputs) > 0): + def update_sockets(self, context): + while len(self.inputs) > 0: self.inputs.remove(self.inputs.values()[-1]) # Add dynamic input sockets - if self.property2_: - self.add_input('NodeSocketFloat', 'Stiffness', 10.0) - self.add_input('NodeSocketFloat', 'Damping', 0.5) + if self.property2: + self.add_input('ArmFloatSocket', 'Stiffness', 10.0) + self.add_input('ArmFloatSocket', 'Damping', 0.5) else: - self.add_input('NodeSocketFloat', 'Lower limit') - self.add_input('NodeSocketFloat', 'Upper limit') + self.add_input('ArmFloatSocket', 'Lower limit') + self.add_input('ArmFloatSocket', 'Upper limit') def draw_buttons(self, context, layout): layout.prop(self, 'property0') - layout.prop(self, 'property1_') - layout.prop(self, 'property2_') - + layout.prop(self, 'property1') + layout.prop(self, 'property2') diff --git a/blender/arm/logicnode/physics/LN_pick_rb.py b/blender/arm/logicnode/physics/LN_pick_rb.py index 8497e1f9..25d926b0 100644 --- a/blender/arm/logicnode/physics/LN_pick_rb.py +++ b/blender/arm/logicnode/physics/LN_pick_rb.py @@ -3,14 +3,14 @@ from arm.logicnode.arm_nodes import * class PickObjectNode(ArmLogicTreeNode): """Picks the rigid body in the given location using the screen coordinates (2D). - + @seeNode Mask - - @input Screen Coords: the location at which to pick, in screen + + @input Screen Coords: the location at which to pick, in screen coordinates @input Mask: a bit mask value to specify which objects are considered - + @output RB: the object that was hit @output Hit: the hit position in world coordinates """ @@ -19,10 +19,9 @@ class PickObjectNode(ArmLogicTreeNode): arm_section = 'ray' arm_version = 1 - def init(self, context): - super(PickObjectNode, self).init(context) - self.add_input('NodeSocketVector', 'Screen Coords') - self.add_input('NodeSocketInt', 'Mask', default_value=1) + def arm_init(self, context): + self.add_input('ArmVectorSocket', 'Screen Coords') + self.add_input('ArmIntSocket', 'Mask', default_value=1) self.add_output('ArmNodeSocketObject', 'RB') - self.add_output('NodeSocketVector', 'Hit') + self.add_output('ArmVectorSocket', 'Hit') diff --git a/blender/arm/logicnode/physics/LN_ray_cast.py b/blender/arm/logicnode/physics/LN_ray_cast.py index 6792bdb5..1fa4401a 100644 --- a/blender/arm/logicnode/physics/LN_ray_cast.py +++ b/blender/arm/logicnode/physics/LN_ray_cast.py @@ -22,12 +22,11 @@ class RayCastNode(ArmLogicTreeNode): arm_section = 'ray' arm_version = 1 - def init(self, context): - super(RayCastNode, self).init(context) - self.add_input('NodeSocketVector', 'From') - self.add_input('NodeSocketVector', 'To') - self.add_input('NodeSocketInt', 'Mask', default_value=1) + def arm_init(self, context): + self.add_input('ArmVectorSocket', 'From') + self.add_input('ArmVectorSocket', 'To') + self.add_input('ArmIntSocket', 'Mask', default_value=1) self.add_output('ArmNodeSocketObject', 'RB') - self.add_output('NodeSocketVector', 'Hit') - self.add_output('NodeSocketVector', 'Normal') + self.add_output('ArmVectorSocket', 'Hit') + self.add_output('ArmVectorSocket', 'Normal') diff --git a/blender/arm/logicnode/physics/LN_remove_rb.py b/blender/arm/logicnode/physics/LN_remove_rb.py index 158493ae..7c05c68e 100644 --- a/blender/arm/logicnode/physics/LN_remove_rb.py +++ b/blender/arm/logicnode/physics/LN_remove_rb.py @@ -6,8 +6,7 @@ class RemovePhysicsNode (ArmLogicTreeNode): bl_label = 'Remove RB' arm_version = 1 - def init(self, context): - super(RemovePhysicsNode, self).init(context) + def arm_init(self, context): self.inputs.new('ArmNodeSocketAction', 'In') self.inputs.new('ArmNodeSocketObject', 'RB') diff --git a/blender/arm/logicnode/physics/LN_set_rb_activation_state.py b/blender/arm/logicnode/physics/LN_set_rb_activation_state.py index 0d193707..63eaec4c 100644 --- a/blender/arm/logicnode/physics/LN_set_rb_activation_state.py +++ b/blender/arm/logicnode/physics/LN_set_rb_activation_state.py @@ -7,7 +7,8 @@ class SetActivationStateNode(ArmLogicTreeNode): bl_icon = 'NONE' arm_version = 1 - property0: EnumProperty( + property0: HaxeEnumProperty( + 'property0', items = [('inactive', 'Inactive', 'The rigid body simulation is deactivated'), ('active', 'Active', 'The rigid body simulation is activated'), ('always active', 'Always Active', 'The rigid body simulation is never deactivated'), @@ -15,8 +16,7 @@ class SetActivationStateNode(ArmLogicTreeNode): ], name='', default='inactive') - def init(self, context): - super(SetActivationStateNode, self).init(context) + def arm_init(self, context): self.inputs.new('ArmNodeSocketAction', 'In') self.inputs.new('ArmNodeSocketObject', 'RB') diff --git a/blender/arm/logicnode/physics/LN_set_rb_friction.py b/blender/arm/logicnode/physics/LN_set_rb_friction.py index d2c4e929..7efdcd79 100644 --- a/blender/arm/logicnode/physics/LN_set_rb_friction.py +++ b/blender/arm/logicnode/physics/LN_set_rb_friction.py @@ -7,10 +7,9 @@ class SetFrictionNode (ArmLogicTreeNode): bl_icon = 'NONE' arm_version = 1 - def init(self, context): - super(SetFrictionNode, self).init(context) + def arm_init(self, context): self.inputs.new('ArmNodeSocketAction', 'In') self.inputs.new('ArmNodeSocketObject', 'RB') - self.inputs.new('NodeSocketFloat', 'Friction') + self.inputs.new('ArmFloatSocket', 'Friction') self.outputs.new('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/physics/LN_set_rb_gravity_enabled.py b/blender/arm/logicnode/physics/LN_set_rb_gravity_enabled.py index a7109160..27a576a1 100644 --- a/blender/arm/logicnode/physics/LN_set_rb_gravity_enabled.py +++ b/blender/arm/logicnode/physics/LN_set_rb_gravity_enabled.py @@ -6,10 +6,9 @@ class SetGravityEnabledNode(ArmLogicTreeNode): bl_label = 'Set RB Gravity Enabled' arm_version = 1 - def init(self, context): - super(SetGravityEnabledNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'RB') - self.add_input('NodeSocketBool', 'Enabled') + self.add_input('ArmBoolSocket', 'Enabled') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/physics/LN_set_rb_velocity.py b/blender/arm/logicnode/physics/LN_set_rb_velocity.py index 024e980c..21980ae8 100644 --- a/blender/arm/logicnode/physics/LN_set_rb_velocity.py +++ b/blender/arm/logicnode/physics/LN_set_rb_velocity.py @@ -6,13 +6,12 @@ class SetVelocityNode(ArmLogicTreeNode): bl_label = 'Set RB Velocity' arm_version = 1 - def init(self, context): - super(SetVelocityNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'RB') - self.add_input('NodeSocketVector', 'Linear') - self.add_input('NodeSocketVector', 'Linear Factor', default_value=[1.0, 1.0, 1.0]) - self.add_input('NodeSocketVector', 'Angular') - self.add_input('NodeSocketVector', 'Angular Factor', default_value=[1.0, 1.0, 1.0]) + self.add_input('ArmVectorSocket', 'Linear') + self.add_input('ArmVectorSocket', 'Linear Factor', default_value=[1.0, 1.0, 1.0]) + self.add_input('ArmVectorSocket', 'Angular') + self.add_input('ArmVectorSocket', 'Angular Factor', default_value=[1.0, 1.0, 1.0]) self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/physics/LN_set_world_gravity.py b/blender/arm/logicnode/physics/LN_set_world_gravity.py index c04fc6c4..f8923b29 100644 --- a/blender/arm/logicnode/physics/LN_set_world_gravity.py +++ b/blender/arm/logicnode/physics/LN_set_world_gravity.py @@ -9,9 +9,8 @@ class SetGravityNode(ArmLogicTreeNode): bl_label = 'Set World Gravity' arm_version = 1 - def init(self, context): - super(SetGravityNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketVector', 'Gravity') + self.add_input('ArmVectorSocket', 'Gravity') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/physics/LN_volume_trigger.py b/blender/arm/logicnode/physics/LN_volume_trigger.py index e9ba5bb1..af438c32 100644 --- a/blender/arm/logicnode/physics/LN_volume_trigger.py +++ b/blender/arm/logicnode/physics/LN_volume_trigger.py @@ -12,18 +12,18 @@ class VolumeTriggerNode(ArmLogicTreeNode): arm_section = 'misc' arm_version = 1 - property0: EnumProperty( + property0: HaxeEnumProperty( + 'property0', items = [('begin', 'Begin', 'The contact between the rigid bodies begins'), ('overlap', 'Overlap', 'The contact between the rigid bodies is happening'), ('end', 'End', 'The contact between the rigid bodies ends')], name='', default='begin') - def init(self, context): - super(VolumeTriggerNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketObject', 'Object 1') self.add_input('ArmNodeSocketObject', 'Object 2') - self.add_output('NodeSocketBool', 'Bool') + self.add_output('ArmBoolSocket', 'Bool') def draw_buttons(self, context, layout): layout.prop(self, 'property0') diff --git a/blender/arm/logicnode/postprocess/LN_colorgrading_get_global_node.py b/blender/arm/logicnode/postprocess/LN_colorgrading_get_global_node.py index bf1d7faf..f5f61d73 100644 --- a/blender/arm/logicnode/postprocess/LN_colorgrading_get_global_node.py +++ b/blender/arm/logicnode/postprocess/LN_colorgrading_get_global_node.py @@ -7,12 +7,11 @@ class ColorgradingGetGlobalNode(ArmLogicTreeNode): arm_section = 'colorgrading' arm_version = 1 - def init(self, context): - super(ColorgradingGetGlobalNode, self).init(context) - self.add_output('NodeSocketFloat', 'Whitebalance') - self.add_output('NodeSocketVector', 'Tint') - self.add_output('NodeSocketVector', 'Saturation') - self.add_output('NodeSocketVector', 'Contrast') - self.add_output('NodeSocketVector', 'Gamma') - self.add_output('NodeSocketVector', 'Gain') - self.add_output('NodeSocketVector', 'Offset') + def arm_init(self, context): + self.add_output('ArmFloatSocket', 'Whitebalance') + self.add_output('ArmVectorSocket', 'Tint') + self.add_output('ArmVectorSocket', 'Saturation') + self.add_output('ArmVectorSocket', 'Contrast') + self.add_output('ArmVectorSocket', 'Gamma') + self.add_output('ArmVectorSocket', 'Gain') + self.add_output('ArmVectorSocket', 'Offset') diff --git a/blender/arm/logicnode/postprocess/LN_colorgrading_get_highlight_node.py b/blender/arm/logicnode/postprocess/LN_colorgrading_get_highlight_node.py index 598aba4f..c4f16f9f 100644 --- a/blender/arm/logicnode/postprocess/LN_colorgrading_get_highlight_node.py +++ b/blender/arm/logicnode/postprocess/LN_colorgrading_get_highlight_node.py @@ -7,11 +7,10 @@ class ColorgradingGetHighlightNode(ArmLogicTreeNode): arm_section = 'colorgrading' arm_version = 1 - def init(self, context): - super(ColorgradingGetHighlightNode, self).init(context) - self.add_output('NodeSocketFloat', 'HightlightMin') - self.add_output('NodeSocketVector', 'Saturation') - self.add_output('NodeSocketVector', 'Contrast') - self.add_output('NodeSocketVector', 'Gamma') - self.add_output('NodeSocketVector', 'Gain') - self.add_output('NodeSocketVector', 'Offset') + def arm_init(self, context): + self.add_output('ArmFloatSocket', 'HightlightMin') + self.add_output('ArmVectorSocket', 'Saturation') + self.add_output('ArmVectorSocket', 'Contrast') + self.add_output('ArmVectorSocket', 'Gamma') + self.add_output('ArmVectorSocket', 'Gain') + self.add_output('ArmVectorSocket', 'Offset') diff --git a/blender/arm/logicnode/postprocess/LN_colorgrading_get_midtone_node.py b/blender/arm/logicnode/postprocess/LN_colorgrading_get_midtone_node.py index fde32c60..29bab2c2 100644 --- a/blender/arm/logicnode/postprocess/LN_colorgrading_get_midtone_node.py +++ b/blender/arm/logicnode/postprocess/LN_colorgrading_get_midtone_node.py @@ -7,10 +7,9 @@ class ColorgradingGetMidtoneNode(ArmLogicTreeNode): arm_section = 'colorgrading' arm_version = 1 - def init(self, context): - super(ColorgradingGetMidtoneNode, self).init(context) - self.add_output('NodeSocketVector', 'Saturation') - self.add_output('NodeSocketVector', 'Contrast') - self.add_output('NodeSocketVector', 'Gamma') - self.add_output('NodeSocketVector', 'Gain') - self.add_output('NodeSocketVector', 'Offset') + def arm_init(self, context): + self.add_output('ArmVectorSocket', 'Saturation') + self.add_output('ArmVectorSocket', 'Contrast') + self.add_output('ArmVectorSocket', 'Gamma') + self.add_output('ArmVectorSocket', 'Gain') + self.add_output('ArmVectorSocket', 'Offset') diff --git a/blender/arm/logicnode/postprocess/LN_colorgrading_get_shadow_node.py b/blender/arm/logicnode/postprocess/LN_colorgrading_get_shadow_node.py index c4662185..06130071 100644 --- a/blender/arm/logicnode/postprocess/LN_colorgrading_get_shadow_node.py +++ b/blender/arm/logicnode/postprocess/LN_colorgrading_get_shadow_node.py @@ -7,11 +7,10 @@ class ColorgradingGetShadowNode(ArmLogicTreeNode): arm_section = 'colorgrading' arm_version = 1 - def init(self, context): - super(ColorgradingGetShadowNode, self).init(context) - self.add_output('NodeSocketFloat', 'ShadowMax') - self.add_output('NodeSocketVector', 'Saturation') - self.add_output('NodeSocketVector', 'Contrast') - self.add_output('NodeSocketVector', 'Gamma') - self.add_output('NodeSocketVector', 'Gain') - self.add_output('NodeSocketVector', 'Offset') + def arm_init(self, context): + self.add_output('ArmFloatSocket', 'ShadowMax') + self.add_output('ArmVectorSocket', 'Saturation') + self.add_output('ArmVectorSocket', 'Contrast') + self.add_output('ArmVectorSocket', 'Gamma') + self.add_output('ArmVectorSocket', 'Gain') + self.add_output('ArmVectorSocket', 'Offset') diff --git a/blender/arm/logicnode/postprocess/LN_colorgrading_set_global_node.py b/blender/arm/logicnode/postprocess/LN_colorgrading_set_global_node.py index 14f4e895..a72ac52a 100644 --- a/blender/arm/logicnode/postprocess/LN_colorgrading_set_global_node.py +++ b/blender/arm/logicnode/postprocess/LN_colorgrading_set_global_node.py @@ -32,37 +32,37 @@ class ColorgradingSetGlobalNode(ArmLogicTreeNode): arm_version = 1 # TODO: RRESET FILE OPTION FOR THE BELOW - property0 : EnumProperty( + property0 : HaxeEnumProperty( + 'property0', items = [('RGB', 'RGB', 'RGB'), ('Uniform', 'Uniform', 'Uniform')], name='Mode', default='Uniform', update=update_node) - property1 : StringProperty(name="Loaded Data", description="Loaded data - Just ignore", default="") + property1 : HaxeStringProperty('property1', name="Loaded Data", description="Loaded data - Just ignore", default="") filepath : StringProperty(name="Preset File", description="Postprocess colorgrading preset file", default="", subtype="FILE_PATH", update=set_data) def draw_nodes_uniform(self, context): - self.add_input('NodeSocketFloat', 'Whitebalance', default_value=6500.0) - self.add_input('NodeSocketColor', 'Tint', default_value=[1.0, 1.0, 1.0, 1.0]) - self.add_input('NodeSocketFloat', 'Saturation', default_value=1) - self.add_input('NodeSocketFloat', 'Contrast', default_value=1) - self.add_input('NodeSocketFloat', 'Gamma', default_value=1) - self.add_input('NodeSocketFloat', 'Gain', default_value=1) - self.add_input('NodeSocketFloat', 'Offset', default_value=1) + self.add_input('ArmFloatSocket', 'Whitebalance', default_value=6500.0) + self.add_input('ArmColorSocket', 'Tint', default_value=[1.0, 1.0, 1.0, 1.0]) + self.add_input('ArmFloatSocket', 'Saturation', default_value=1) + self.add_input('ArmFloatSocket', 'Contrast', default_value=1) + self.add_input('ArmFloatSocket', 'Gamma', default_value=1) + self.add_input('ArmFloatSocket', 'Gain', default_value=1) + self.add_input('ArmFloatSocket', 'Offset', default_value=1) def draw_nodes_rgb(self, context): - self.add_input('NodeSocketFloat', 'Whitebalance', default_value=6500.0) - self.add_input('NodeSocketVector', 'Tint', default_value=[1,1,1]) - self.add_input('NodeSocketVector', 'Saturation', default_value=[1,1,1]) - self.add_input('NodeSocketVector', 'Contrast', default_value=[1,1,1]) - self.add_input('NodeSocketVector', 'Gamma', default_value=[1,1,1]) - self.add_input('NodeSocketVector', 'Gain', default_value=[1,1,1]) - self.add_input('NodeSocketVector', 'Offset', default_value=[1,1,1]) + self.add_input('ArmFloatSocket', 'Whitebalance', default_value=6500.0) + self.add_input('ArmVectorSocket', 'Tint', default_value=[1,1,1]) + self.add_input('ArmVectorSocket', 'Saturation', default_value=[1,1,1]) + self.add_input('ArmVectorSocket', 'Contrast', default_value=[1,1,1]) + self.add_input('ArmVectorSocket', 'Gamma', default_value=[1,1,1]) + self.add_input('ArmVectorSocket', 'Gain', default_value=[1,1,1]) + self.add_input('ArmVectorSocket', 'Offset', default_value=[1,1,1]) def draw_nodes_colorwheel(self, context): pass - def init(self, context): - super(ColorgradingSetGlobalNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_output('ArmNodeSocketAction', 'Out') self.draw_nodes_uniform(context) diff --git a/blender/arm/logicnode/postprocess/LN_colorgrading_set_highlight_node.py b/blender/arm/logicnode/postprocess/LN_colorgrading_set_highlight_node.py index 2f34d316..01b23cd1 100644 --- a/blender/arm/logicnode/postprocess/LN_colorgrading_set_highlight_node.py +++ b/blender/arm/logicnode/postprocess/LN_colorgrading_set_highlight_node.py @@ -32,35 +32,35 @@ class ColorgradingSetHighlightNode(ArmLogicTreeNode): arm_version = 1 # TODO: RRESET FILE OPTION FOR THE BELOW - property0 : EnumProperty( + property0: HaxeEnumProperty( + 'property0', items = [('RGB', 'RGB', 'RGB'), ('Uniform', 'Uniform', 'Uniform')], name='Mode', default='Uniform', update=update_node) - property1 : StringProperty(name="Loaded Data", description="Loaded data - Just ignore", default="") + property1 : HaxeStringProperty('property1', name="Loaded Data", description="Loaded data - Just ignore", default="") filepath : StringProperty(name="Preset File", description="Postprocess colorgrading preset file", default="", subtype="FILE_PATH", update=set_data) def draw_nodes_uniform(self, context): - self.add_input('NodeSocketFloat', 'HighlightMin', default_value=0) - self.add_input('NodeSocketFloat', 'Saturation', default_value=1) - self.add_input('NodeSocketFloat', 'Contrast', default_value=1) - self.add_input('NodeSocketFloat', 'Gamma', default_value=1) - self.add_input('NodeSocketFloat', 'Gain', default_value=1) - self.add_input('NodeSocketFloat', 'Offset', default_value=1) + self.add_input('ArmFloatSocket', 'HighlightMin', default_value=0) + self.add_input('ArmFloatSocket', 'Saturation', default_value=1) + self.add_input('ArmFloatSocket', 'Contrast', default_value=1) + self.add_input('ArmFloatSocket', 'Gamma', default_value=1) + self.add_input('ArmFloatSocket', 'Gain', default_value=1) + self.add_input('ArmFloatSocket', 'Offset', default_value=1) def draw_nodes_rgb(self, context): - self.add_input('NodeSocketFloat', 'HighlightMin', default_value=0) - self.add_input('NodeSocketVector', 'Saturation', default_value=[1,1,1]) - self.add_input('NodeSocketVector', 'Contrast', default_value=[1,1,1]) - self.add_input('NodeSocketVector', 'Gamma', default_value=[1,1,1]) - self.add_input('NodeSocketVector', 'Gain', default_value=[1,1,1]) - self.add_input('NodeSocketVector', 'Offset', default_value=[1,1,1]) + self.add_input('ArmFloatSocket', 'HighlightMin', default_value=0) + self.add_input('ArmVectorSocket', 'Saturation', default_value=[1,1,1]) + self.add_input('ArmVectorSocket', 'Contrast', default_value=[1,1,1]) + self.add_input('ArmVectorSocket', 'Gamma', default_value=[1,1,1]) + self.add_input('ArmVectorSocket', 'Gain', default_value=[1,1,1]) + self.add_input('ArmVectorSocket', 'Offset', default_value=[1,1,1]) def draw_nodes_colorwheel(self, context): pass - def init(self, context): - super(ColorgradingSetHighlightNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_output('ArmNodeSocketAction', 'Out') self.draw_nodes_uniform(context) diff --git a/blender/arm/logicnode/postprocess/LN_colorgrading_set_midtone_node.py b/blender/arm/logicnode/postprocess/LN_colorgrading_set_midtone_node.py index 5b1c31e6..8a5bd19c 100644 --- a/blender/arm/logicnode/postprocess/LN_colorgrading_set_midtone_node.py +++ b/blender/arm/logicnode/postprocess/LN_colorgrading_set_midtone_node.py @@ -32,34 +32,34 @@ class ColorgradingSetMidtoneNode(ArmLogicTreeNode): arm_version = 1 # TODO: RRESET FILE OPTION FOR THE BELOW - property0 : EnumProperty( + property0: HaxeEnumProperty( + 'property0', items = [('RGB', 'RGB', 'RGB'), ('Uniform', 'Uniform', 'Uniform')], name='Mode', default='Uniform', update=update_node) - property1 : StringProperty(name="Loaded Data", description="Loaded data - Just ignore", default="") + property1 : HaxeStringProperty('property1', name="Loaded Data", description="Loaded data - Just ignore", default="") filepath : StringProperty(name="Preset File", description="Postprocess colorgrading preset file", default="", subtype="FILE_PATH", update=set_data) def draw_nodes_uniform(self, context): - self.add_input('NodeSocketFloat', 'Saturation', default_value=1) - self.add_input('NodeSocketFloat', 'Contrast', default_value=1) - self.add_input('NodeSocketFloat', 'Gamma', default_value=1) - self.add_input('NodeSocketFloat', 'Gain', default_value=1) - self.add_input('NodeSocketFloat', 'Offset', default_value=1) + self.add_input('ArmFloatSocket', 'Saturation', default_value=1) + self.add_input('ArmFloatSocket', 'Contrast', default_value=1) + self.add_input('ArmFloatSocket', 'Gamma', default_value=1) + self.add_input('ArmFloatSocket', 'Gain', default_value=1) + self.add_input('ArmFloatSocket', 'Offset', default_value=1) def draw_nodes_rgb(self, context): - self.add_input('NodeSocketVector', 'Tint', default_value=[1,1,1]) - self.add_input('NodeSocketVector', 'Saturation', default_value=[1,1,1]) - self.add_input('NodeSocketVector', 'Contrast', default_value=[1,1,1]) - self.add_input('NodeSocketVector', 'Gamma', default_value=[1,1,1]) - self.add_input('NodeSocketVector', 'Gain', default_value=[1,1,1]) - self.add_input('NodeSocketVector', 'Offset', default_value=[1,1,1]) + self.add_input('ArmVectorSocket', 'Tint', default_value=[1,1,1]) + self.add_input('ArmVectorSocket', 'Saturation', default_value=[1,1,1]) + self.add_input('ArmVectorSocket', 'Contrast', default_value=[1,1,1]) + self.add_input('ArmVectorSocket', 'Gamma', default_value=[1,1,1]) + self.add_input('ArmVectorSocket', 'Gain', default_value=[1,1,1]) + self.add_input('ArmVectorSocket', 'Offset', default_value=[1,1,1]) def draw_nodes_colorwheel(self, context): pass - def init(self, context): - super(ColorgradingSetMidtoneNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_output('ArmNodeSocketAction', 'Out') self.draw_nodes_uniform(context) diff --git a/blender/arm/logicnode/postprocess/LN_colorgrading_set_shadow_node.py b/blender/arm/logicnode/postprocess/LN_colorgrading_set_shadow_node.py index b014cff4..bc05651d 100644 --- a/blender/arm/logicnode/postprocess/LN_colorgrading_set_shadow_node.py +++ b/blender/arm/logicnode/postprocess/LN_colorgrading_set_shadow_node.py @@ -32,35 +32,35 @@ class ColorgradingSetShadowNode(ArmLogicTreeNode): arm_version = 1 # TODO: RRESET FILE OPTION FOR THE BELOW - property0 : EnumProperty( + property0: HaxeEnumProperty( + 'property0', items = [('RGB', 'RGB', 'RGB'), ('Uniform', 'Uniform', 'Uniform')], name='Mode', default='Uniform', update=update_node) - property1 : StringProperty(name="Loaded Data", description="Loaded data - Just ignore", default="") + property1 : HaxeStringProperty('property1', name="Loaded Data", description="Loaded data - Just ignore", default="") filepath : StringProperty(name="Preset File", description="Postprocess colorgrading preset file", default="", subtype="FILE_PATH", update=set_data) def draw_nodes_uniform(self, context): - self.add_input('NodeSocketFloat', 'ShadowMax', default_value=1) - self.add_input('NodeSocketFloat', 'Saturation', default_value=1) - self.add_input('NodeSocketFloat', 'Contrast', default_value=1) - self.add_input('NodeSocketFloat', 'Gamma', default_value=1) - self.add_input('NodeSocketFloat', 'Gain', default_value=1) - self.add_input('NodeSocketFloat', 'Offset', default_value=1) + self.add_input('ArmFloatSocket', 'ShadowMax', default_value=1) + self.add_input('ArmFloatSocket', 'Saturation', default_value=1) + self.add_input('ArmFloatSocket', 'Contrast', default_value=1) + self.add_input('ArmFloatSocket', 'Gamma', default_value=1) + self.add_input('ArmFloatSocket', 'Gain', default_value=1) + self.add_input('ArmFloatSocket', 'Offset', default_value=1) def draw_nodes_rgb(self, context): - self.add_input('NodeSocketFloat', 'ShadowMax', default_value=1) - self.add_input('NodeSocketVector', 'Saturation', default_value=[1,1,1]) - self.add_input('NodeSocketVector', 'Contrast', default_value=[1,1,1]) - self.add_input('NodeSocketVector', 'Gamma', default_value=[1,1,1]) - self.add_input('NodeSocketVector', 'Gain', default_value=[1,1,1]) - self.add_input('NodeSocketVector', 'Offset', default_value=[1,1,1]) + self.add_input('ArmFloatSocket', 'ShadowMax', default_value=1) + self.add_input('ArmVectorSocket', 'Saturation', default_value=[1,1,1]) + self.add_input('ArmVectorSocket', 'Contrast', default_value=[1,1,1]) + self.add_input('ArmVectorSocket', 'Gamma', default_value=[1,1,1]) + self.add_input('ArmVectorSocket', 'Gain', default_value=[1,1,1]) + self.add_input('ArmVectorSocket', 'Offset', default_value=[1,1,1]) def draw_nodes_colorwheel(self, context): pass - def init(self, context): - super(ColorgradingSetShadowNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_output('ArmNodeSocketAction', 'Out') self.draw_nodes_uniform(context) diff --git a/blender/arm/logicnode/postprocess/LN_get_bloom_settings.py b/blender/arm/logicnode/postprocess/LN_get_bloom_settings.py index e1774cdb..4dd36c42 100644 --- a/blender/arm/logicnode/postprocess/LN_get_bloom_settings.py +++ b/blender/arm/logicnode/postprocess/LN_get_bloom_settings.py @@ -6,8 +6,7 @@ class BloomGetNode(ArmLogicTreeNode): bl_label = 'Get Bloom Settings' arm_version = 1 - def init(self, context): - super(BloomGetNode, self).init(context) - self.add_output('NodeSocketFloat', 'Threshold') - self.add_output('NodeSocketFloat', 'Strength') - self.add_output('NodeSocketFloat', 'Radius') + def arm_init(self, context): + self.add_output('ArmFloatSocket', 'Threshold') + self.add_output('ArmFloatSocket', 'Strength') + self.add_output('ArmFloatSocket', 'Radius') diff --git a/blender/arm/logicnode/postprocess/LN_get_ca_settings.py b/blender/arm/logicnode/postprocess/LN_get_ca_settings.py index 60a9a429..f4064fb4 100644 --- a/blender/arm/logicnode/postprocess/LN_get_ca_settings.py +++ b/blender/arm/logicnode/postprocess/LN_get_ca_settings.py @@ -6,7 +6,6 @@ class ChromaticAberrationGetNode(ArmLogicTreeNode): bl_label = 'Get CA Settings' arm_version = 1 - def init(self, context): - super(ChromaticAberrationGetNode, self).init(context) - self.add_output('NodeSocketFloat', 'Strength') - self.add_output('NodeSocketFloat', 'Samples') + def arm_init(self, context): + self.add_output('ArmFloatSocket', 'Strength') + self.add_output('ArmFloatSocket', 'Samples') diff --git a/blender/arm/logicnode/postprocess/LN_get_camera_post_process.py b/blender/arm/logicnode/postprocess/LN_get_camera_post_process.py index 33599052..786cee06 100644 --- a/blender/arm/logicnode/postprocess/LN_get_camera_post_process.py +++ b/blender/arm/logicnode/postprocess/LN_get_camera_post_process.py @@ -6,15 +6,14 @@ class CameraGetNode(ArmLogicTreeNode): bl_label = 'Get Camera Post Process' arm_version = 1 - def init(self, context): - super(CameraGetNode, self).init(context) - self.add_output('NodeSocketFloat', 'F-Stop') - self.add_output('NodeSocketFloat', 'Shutter Time') - self.add_output('NodeSocketFloat', 'ISO') - self.add_output('NodeSocketFloat', 'Exposure Compensation') - self.add_output('NodeSocketFloat', 'Fisheye Distortion') - self.add_output('NodeSocketBool', 'Auto Focus') - self.add_output('NodeSocketFloat', 'DOF Distance') - self.add_output('NodeSocketFloat', 'DOF Length') - self.add_output('NodeSocketFloat', 'DOF F-Stop') - self.add_output('NodeSocketFloat', 'Film Grain') + def arm_init(self, context): + self.add_output('ArmFloatSocket', 'F-Stop') + self.add_output('ArmFloatSocket', 'Shutter Time') + self.add_output('ArmFloatSocket', 'ISO') + self.add_output('ArmFloatSocket', 'Exposure Compensation') + self.add_output('ArmFloatSocket', 'Fisheye Distortion') + self.add_output('ArmBoolSocket', 'Auto Focus') + self.add_output('ArmFloatSocket', 'DOF Distance') + self.add_output('ArmFloatSocket', 'DOF Length') + self.add_output('ArmFloatSocket', 'DOF F-Stop') + self.add_output('ArmFloatSocket', 'Film Grain') diff --git a/blender/arm/logicnode/postprocess/LN_get_lenstexture_settings.py b/blender/arm/logicnode/postprocess/LN_get_lenstexture_settings.py index 6f8aa6a3..8ffa9a3d 100644 --- a/blender/arm/logicnode/postprocess/LN_get_lenstexture_settings.py +++ b/blender/arm/logicnode/postprocess/LN_get_lenstexture_settings.py @@ -6,10 +6,9 @@ class LenstextureGetNode(ArmLogicTreeNode): bl_label = 'Get Lenstexture Settings' arm_version = 1 - def init(self, context): - super(LenstextureGetNode, self).init(context) - self.add_output('NodeSocketFloat', 'Center Min Clip') - self.add_output('NodeSocketFloat', 'Center Max Clip') - self.add_output('NodeSocketFloat', 'Luminance Min') - self.add_output('NodeSocketFloat', 'Luminance Max') - self.add_output('NodeSocketFloat', 'Brightness Exponent') + def arm_init(self, context): + self.add_output('ArmFloatSocket', 'Center Min Clip') + self.add_output('ArmFloatSocket', 'Center Max Clip') + self.add_output('ArmFloatSocket', 'Luminance Min') + self.add_output('ArmFloatSocket', 'Luminance Max') + self.add_output('ArmFloatSocket', 'Brightness Exponent') diff --git a/blender/arm/logicnode/postprocess/LN_get_ssao_settings.py b/blender/arm/logicnode/postprocess/LN_get_ssao_settings.py index 3aecab2c..d263ae60 100644 --- a/blender/arm/logicnode/postprocess/LN_get_ssao_settings.py +++ b/blender/arm/logicnode/postprocess/LN_get_ssao_settings.py @@ -6,8 +6,7 @@ class SSAOGetNode(ArmLogicTreeNode): bl_label = 'Get SSAO Settings' arm_version = 1 - def init(self, context): - super(SSAOGetNode, self).init(context) - self.add_output('NodeSocketFloat', 'Radius') - self.add_output('NodeSocketFloat', 'Strength') - self.add_output('NodeSocketFloat', 'Max Steps') + def arm_init(self, context): + self.add_output('ArmFloatSocket', 'Radius') + self.add_output('ArmFloatSocket', 'Strength') + self.add_output('ArmFloatSocket', 'Max Steps') diff --git a/blender/arm/logicnode/postprocess/LN_get_ssr_settings.py b/blender/arm/logicnode/postprocess/LN_get_ssr_settings.py index 782ce30f..684685c9 100644 --- a/blender/arm/logicnode/postprocess/LN_get_ssr_settings.py +++ b/blender/arm/logicnode/postprocess/LN_get_ssr_settings.py @@ -6,10 +6,9 @@ class SSRGetNode(ArmLogicTreeNode): bl_label = 'Get SSR Settings' arm_version = 1 - def init(self, context): - super(SSRGetNode, self).init(context) - self.add_output('NodeSocketFloat', 'SSR Step') - self.add_output('NodeSocketFloat', 'SSR Step Min') - self.add_output('NodeSocketFloat', 'SSR Search') - self.add_output('NodeSocketFloat', 'SSR Falloff') - self.add_output('NodeSocketFloat', 'SSR Jitter') + def arm_init(self, context): + self.add_output('ArmFloatSocket', 'SSR Step') + self.add_output('ArmFloatSocket', 'SSR Step Min') + self.add_output('ArmFloatSocket', 'SSR Search') + self.add_output('ArmFloatSocket', 'SSR Falloff') + self.add_output('ArmFloatSocket', 'SSR Jitter') diff --git a/blender/arm/logicnode/postprocess/LN_lenstexture_set.py b/blender/arm/logicnode/postprocess/LN_lenstexture_set.py index 2fe8a79d..53698ccd 100644 --- a/blender/arm/logicnode/postprocess/LN_lenstexture_set.py +++ b/blender/arm/logicnode/postprocess/LN_lenstexture_set.py @@ -6,13 +6,12 @@ class LenstextureSetNode(ArmLogicTreeNode): bl_label = 'Set Lenstexture' arm_version = 1 - def init(self, context): - super(LenstextureSetNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketFloat', 'Center Min Clip', default_value=0.1) - self.add_input('NodeSocketFloat', 'Center Max Clip', default_value=0.5) - self.add_input('NodeSocketFloat', 'Luminance Min', default_value=0.10) - self.add_input('NodeSocketFloat', 'Luminance Max', default_value=2.50) - self.add_input('NodeSocketFloat', 'Brightness Exponent', default_value=2.0) + self.add_input('ArmFloatSocket', 'Center Min Clip', default_value=0.1) + self.add_input('ArmFloatSocket', 'Center Max Clip', default_value=0.5) + self.add_input('ArmFloatSocket', 'Luminance Min', default_value=0.10) + self.add_input('ArmFloatSocket', 'Luminance Max', default_value=2.50) + self.add_input('ArmFloatSocket', 'Brightness Exponent', default_value=2.0) self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/postprocess/LN_set_bloom_settings.py b/blender/arm/logicnode/postprocess/LN_set_bloom_settings.py index ffa85450..7c463480 100644 --- a/blender/arm/logicnode/postprocess/LN_set_bloom_settings.py +++ b/blender/arm/logicnode/postprocess/LN_set_bloom_settings.py @@ -6,11 +6,10 @@ class BloomSetNode(ArmLogicTreeNode): bl_label = 'Set Bloom Settings' arm_version = 1 - def init(self, context): - super(BloomSetNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketFloat', 'Threshold', default_value=1.00) - self.add_input('NodeSocketFloat', 'Strength', default_value=3.50) - self.add_input('NodeSocketFloat', 'Radius', default_value=3.0) + self.add_input('ArmFloatSocket', 'Threshold', default_value=1.00) + self.add_input('ArmFloatSocket', 'Strength', default_value=3.50) + self.add_input('ArmFloatSocket', 'Radius', default_value=3.0) self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/postprocess/LN_set_ca_settings.py b/blender/arm/logicnode/postprocess/LN_set_ca_settings.py index 18b6f0a1..5031cd0a 100644 --- a/blender/arm/logicnode/postprocess/LN_set_ca_settings.py +++ b/blender/arm/logicnode/postprocess/LN_set_ca_settings.py @@ -6,10 +6,9 @@ class ChromaticAberrationSetNode(ArmLogicTreeNode): bl_label = 'Set CA Settings' arm_version = 1 - def init(self, context): - super(ChromaticAberrationSetNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketFloat', 'Strength', default_value=2.0) - self.add_input('NodeSocketInt', 'Samples', default_value=32) + self.add_input('ArmFloatSocket', 'Strength', default_value=2.0) + self.add_input('ArmIntSocket', 'Samples', default_value=32) self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/postprocess/LN_set_camera_post_process.py b/blender/arm/logicnode/postprocess/LN_set_camera_post_process.py index a21d8ddc..e6a59bc4 100644 --- a/blender/arm/logicnode/postprocess/LN_set_camera_post_process.py +++ b/blender/arm/logicnode/postprocess/LN_set_camera_post_process.py @@ -6,19 +6,18 @@ class CameraSetNode(ArmLogicTreeNode): bl_label = 'Set Camera Post Process' arm_version = 1 - def init(self, context): - super(CameraSetNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketFloat', 'F-stop', default_value=2.0) - self.add_input('NodeSocketFloat', 'Shutter Time', default_value=1.0) - self.add_input('NodeSocketFloat', 'ISO', default_value=100.0) - self.add_input('NodeSocketFloat', 'Exposure Compensation', default_value=0.0) - self.add_input('NodeSocketFloat', 'Fisheye Distortion', default_value=0.01) - self.add_input('NodeSocketBool', 'Auto Focus', default_value=True) - self.add_input('NodeSocketFloat', 'DoF Distance', default_value=10.0) - self.add_input('NodeSocketFloat', 'DoF Length', default_value=160.0) - self.add_input('NodeSocketFloat', 'DoF F-Stop', default_value=128.0) - self.add_input('NodeSocketInt', 'Tonemapper', default_value=0.0) - self.add_input('NodeSocketFloat', 'Film Grain', default_value=2.0) + self.add_input('ArmFloatSocket', 'F-stop', default_value=2.0) + self.add_input('ArmFloatSocket', 'Shutter Time', default_value=1.0) + self.add_input('ArmFloatSocket', 'ISO', default_value=100.0) + self.add_input('ArmFloatSocket', 'Exposure Compensation', default_value=0.0) + self.add_input('ArmFloatSocket', 'Fisheye Distortion', default_value=0.01) + self.add_input('ArmBoolSocket', 'Auto Focus', default_value=True) + self.add_input('ArmFloatSocket', 'DoF Distance', default_value=10.0) + self.add_input('ArmFloatSocket', 'DoF Length', default_value=160.0) + self.add_input('ArmFloatSocket', 'DoF F-Stop', default_value=128.0) + self.add_input('ArmIntSocket', 'Tonemapper', default_value=0.0) + self.add_input('ArmFloatSocket', 'Film Grain', default_value=2.0) self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/postprocess/LN_set_ssao_settings.py b/blender/arm/logicnode/postprocess/LN_set_ssao_settings.py index 199d5d6c..e401b955 100644 --- a/blender/arm/logicnode/postprocess/LN_set_ssao_settings.py +++ b/blender/arm/logicnode/postprocess/LN_set_ssao_settings.py @@ -6,11 +6,10 @@ class SSAOSetNode(ArmLogicTreeNode): bl_label = 'Set SSAO Settings' arm_version = 1 - def init(self, context): - super(SSAOSetNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketFloat', 'Radius', default_value=1.0) - self.add_input('NodeSocketFloat', 'Strength', default_value=5.0) - self.add_input('NodeSocketInt', 'Max Steps', default_value=8) + self.add_input('ArmFloatSocket', 'Radius', default_value=1.0) + self.add_input('ArmFloatSocket', 'Strength', default_value=5.0) + self.add_input('ArmIntSocket', 'Max Steps', default_value=8) self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/postprocess/LN_set_ssr_settings.py b/blender/arm/logicnode/postprocess/LN_set_ssr_settings.py index 40995378..9e3da739 100644 --- a/blender/arm/logicnode/postprocess/LN_set_ssr_settings.py +++ b/blender/arm/logicnode/postprocess/LN_set_ssr_settings.py @@ -6,13 +6,12 @@ class SSRSetNode(ArmLogicTreeNode): bl_label = 'Set SSR Settings' arm_version = 1 - def init(self, context): - super(SSRSetNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketFloat', 'SSR Step', default_value=0.04) - self.add_input('NodeSocketFloat', 'SSR Step Min', default_value=0.05) - self.add_input('NodeSocketFloat', 'SSR Search', default_value=5.0) - self.add_input('NodeSocketFloat', 'SSR Falloff', default_value=5.0) - self.add_input('NodeSocketFloat', 'SSR Jitter', default_value=0.6) + self.add_input('ArmFloatSocket', 'SSR Step', default_value=0.04) + self.add_input('ArmFloatSocket', 'SSR Step Min', default_value=0.05) + self.add_input('ArmFloatSocket', 'SSR Search', default_value=5.0) + self.add_input('ArmFloatSocket', 'SSR Falloff', default_value=5.0) + self.add_input('ArmFloatSocket', 'SSR Jitter', default_value=0.6) self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/random/LN_random_boolean.py b/blender/arm/logicnode/random/LN_random_boolean.py index 8fef83ae..1a2f46b3 100644 --- a/blender/arm/logicnode/random/LN_random_boolean.py +++ b/blender/arm/logicnode/random/LN_random_boolean.py @@ -7,6 +7,5 @@ class RandomBooleanNode(ArmLogicTreeNode): bl_label = 'Random Boolean' arm_version = 1 - def init(self, context): - super(RandomBooleanNode, self).init(context) - self.add_output('NodeSocketBool', 'Bool') + def arm_init(self, context): + self.add_output('ArmBoolSocket', 'Bool') diff --git a/blender/arm/logicnode/random/LN_random_choice.py b/blender/arm/logicnode/random/LN_random_choice.py index ad6b4f7e..7ba4749a 100644 --- a/blender/arm/logicnode/random/LN_random_choice.py +++ b/blender/arm/logicnode/random/LN_random_choice.py @@ -7,8 +7,7 @@ class RandomChoiceNode(ArmLogicTreeNode): bl_label = 'Random Choice' arm_version = 1 - def init(self, context): - super().init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketArray', 'Array') - self.add_output('NodeSocketShader', 'Value') + self.add_output('ArmDynamicSocket', 'Value') diff --git a/blender/arm/logicnode/random/LN_random_color.py b/blender/arm/logicnode/random/LN_random_color.py index 82ef9bf8..9d142b15 100644 --- a/blender/arm/logicnode/random/LN_random_color.py +++ b/blender/arm/logicnode/random/LN_random_color.py @@ -7,6 +7,5 @@ class RandomColorNode(ArmLogicTreeNode): bl_label = 'Random Color' arm_version = 1 - def init(self, context): - super(RandomColorNode, self).init(context) - self.add_output('NodeSocketColor', 'Color') + def arm_init(self, context): + self.add_output('ArmColorSocket', 'Color') diff --git a/blender/arm/logicnode/random/LN_random_float.py b/blender/arm/logicnode/random/LN_random_float.py index 6303d5e0..7bb08dde 100644 --- a/blender/arm/logicnode/random/LN_random_float.py +++ b/blender/arm/logicnode/random/LN_random_float.py @@ -7,9 +7,8 @@ class RandomFloatNode(ArmLogicTreeNode): bl_label = 'Random Float' arm_version = 1 - def init(self, context): - super(RandomFloatNode, self).init(context) - self.add_input('NodeSocketFloat', 'Min') - self.add_input('NodeSocketFloat', 'Max', default_value=1.0) - # self.add_input('NodeSocketInt', 'Seed') - self.add_output('NodeSocketFloat', 'Float') + def arm_init(self, context): + self.add_input('ArmFloatSocket', 'Min') + self.add_input('ArmFloatSocket', 'Max', default_value=1.0) + # self.add_input('ArmIntSocket', 'Seed') + self.add_output('ArmFloatSocket', 'Float') diff --git a/blender/arm/logicnode/random/LN_random_integer.py b/blender/arm/logicnode/random/LN_random_integer.py index dfb3442f..166a2f0a 100644 --- a/blender/arm/logicnode/random/LN_random_integer.py +++ b/blender/arm/logicnode/random/LN_random_integer.py @@ -7,8 +7,7 @@ class RandomIntegerNode(ArmLogicTreeNode): bl_label = 'Random Integer' arm_version = 1 - def init(self, context): - super(RandomIntegerNode, self).init(context) - self.add_input('NodeSocketInt', 'Min') - self.add_input('NodeSocketInt', 'Max', default_value=2) - self.add_output('NodeSocketInt', 'Int') + def arm_init(self, context): + self.add_input('ArmIntSocket', 'Min') + self.add_input('ArmIntSocket', 'Max', default_value=2) + self.add_output('ArmIntSocket', 'Int') diff --git a/blender/arm/logicnode/random/LN_random_output.py b/blender/arm/logicnode/random/LN_random_output.py index fc41b35d..72f249f3 100644 --- a/blender/arm/logicnode/random/LN_random_output.py +++ b/blender/arm/logicnode/random/LN_random_output.py @@ -11,8 +11,7 @@ class RandomOutputNode(ArmLogicTreeNode): def __init__(self): array_nodes[str(id(self))] = self - def init(self, context): - super().init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') diff --git a/blender/arm/logicnode/random/LN_random_vector.py b/blender/arm/logicnode/random/LN_random_vector.py index 6986a8a0..b49beabe 100644 --- a/blender/arm/logicnode/random/LN_random_vector.py +++ b/blender/arm/logicnode/random/LN_random_vector.py @@ -7,8 +7,7 @@ class RandomVectorNode(ArmLogicTreeNode): bl_label = 'Random Vector' arm_version = 1 - def init(self, context): - super(RandomVectorNode, self).init(context) - self.add_input('NodeSocketVector', 'Min', default_value=[-1.0, -1.0, -1.0]) - self.add_input('NodeSocketVector', 'Max', default_value=[1.0, 1.0, 1.0]) - self.add_output('NodeSocketVector', 'Vector') + def arm_init(self, context): + self.add_input('ArmVectorSocket', 'Min', default_value=[-1.0, -1.0, -1.0]) + self.add_input('ArmVectorSocket', 'Max', default_value=[1.0, 1.0, 1.0]) + self.add_output('ArmVectorSocket', 'Vector') diff --git a/blender/arm/logicnode/renderpath/LN_set_msaa_quality.py b/blender/arm/logicnode/renderpath/LN_set_msaa_quality.py index 52022aa4..81511a03 100644 --- a/blender/arm/logicnode/renderpath/LN_set_msaa_quality.py +++ b/blender/arm/logicnode/renderpath/LN_set_msaa_quality.py @@ -5,7 +5,8 @@ class RpMSAANode(ArmLogicTreeNode): bl_idname = 'LNRpMSAANode' bl_label = 'Set MSAA Quality' arm_version = 1 - property0: EnumProperty( + property0: HaxeEnumProperty( + 'property0', items = [('1', '1', '1'), ('2', '2', '2'), ('4', '4', '4'), @@ -14,8 +15,7 @@ class RpMSAANode(ArmLogicTreeNode): ], name='', default='1') - def init(self, context): - super(RpMSAANode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/renderpath/LN_set_post_process_quality.py b/blender/arm/logicnode/renderpath/LN_set_post_process_quality.py index a93d3f9e..faa883bb 100644 --- a/blender/arm/logicnode/renderpath/LN_set_post_process_quality.py +++ b/blender/arm/logicnode/renderpath/LN_set_post_process_quality.py @@ -5,7 +5,8 @@ class RpConfigNode(ArmLogicTreeNode): bl_idname = 'LNRpConfigNode' bl_label = 'Set Post Process Quality' arm_version = 1 - property0: EnumProperty( + property0: HaxeEnumProperty( + 'property0', items = [('SSGI', 'SSGI', 'SSGI'), ('SSR', 'SSR', 'SSR'), ('Bloom', 'Bloom', 'Bloom'), @@ -14,10 +15,9 @@ class RpConfigNode(ArmLogicTreeNode): ], name='', default='SSGI') - def init(self, context): - super(RpConfigNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketBool', 'Enable') + self.add_input('ArmBoolSocket', 'Enable') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/renderpath/LN_set_shader_uniform.py b/blender/arm/logicnode/renderpath/LN_set_shader_uniform.py index 676e6994..8afbcd75 100644 --- a/blender/arm/logicnode/renderpath/LN_set_shader_uniform.py +++ b/blender/arm/logicnode/renderpath/LN_set_shader_uniform.py @@ -15,13 +15,14 @@ class SetShaderUniformNode(ArmLogicTreeNode): self.inputs.remove(self.inputs[2]) if self.property0 == 'int': - self.add_input('NodeSocketInt', 'Int') + self.add_input('ArmIntSocket', 'Int') elif self.property0 == 'float': - self.add_input('NodeSocketFloat', 'Float') + self.add_input('ArmFloatSocket', 'Float') elif self.property0 in ('vec2', 'vec3', 'vec4'): - self.add_input('NodeSocketVector', 'Vector') + self.add_input('ArmVectorSocket', 'Vector') - property0: EnumProperty( + property0: HaxeEnumProperty( + 'property0', items = [('int', 'int', 'int'), ('float', 'float', 'float'), ('vec2', 'vec2', 'vec2'), @@ -32,11 +33,10 @@ class SetShaderUniformNode(ArmLogicTreeNode): description="The type of the uniform", update=on_update_uniform_type) - def init(self, context): - super().init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketString', 'Uniform Name') - self.add_input('NodeSocketFloat', 'Float') + self.add_input('ArmStringSocket', 'Uniform Name') + self.add_input('ArmFloatSocket', 'Float') self.add_output('ArmNodeSocketAction', 'Out') def draw_buttons(self, context, layout): diff --git a/blender/arm/logicnode/renderpath/LN_set_shadows_quality.py b/blender/arm/logicnode/renderpath/LN_set_shadows_quality.py index ba42ac3a..be16096e 100644 --- a/blender/arm/logicnode/renderpath/LN_set_shadows_quality.py +++ b/blender/arm/logicnode/renderpath/LN_set_shadows_quality.py @@ -5,15 +5,15 @@ class RpShadowQualityNode(ArmLogicTreeNode): bl_idname = 'LNRpShadowQualityNode' bl_label = 'Set Shadows Quality' arm_version = 1 - property0: EnumProperty( + property0: HaxeEnumProperty( + 'property0', items = [('High', 'High', 'High'), ('Medium', 'Medium', 'Medium'), ('Low', 'Low', 'Low') ], name='', default='Medium') - def init(self, context): - super(RpShadowQualityNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/renderpath/LN_set_ssaa_quality.py b/blender/arm/logicnode/renderpath/LN_set_ssaa_quality.py index f102f21c..7608749a 100644 --- a/blender/arm/logicnode/renderpath/LN_set_ssaa_quality.py +++ b/blender/arm/logicnode/renderpath/LN_set_ssaa_quality.py @@ -5,7 +5,8 @@ class RpSuperSampleNode(ArmLogicTreeNode): bl_idname = 'LNRpSuperSampleNode' bl_label = 'Set SSAA Quality' arm_version = 1 - property0: EnumProperty( + property0: HaxeEnumProperty( + 'property0', items = [('1', '1', '1'), ('1.5', '1.5', '1.5'), ('2', '2', '2'), @@ -13,8 +14,7 @@ class RpSuperSampleNode(ArmLogicTreeNode): ], name='', default='1') - def init(self, context): - super(RpSuperSampleNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/replacement.py b/blender/arm/logicnode/replacement.py index abd016e5..b703d83b 100644 --- a/blender/arm/logicnode/replacement.py +++ b/blender/arm/logicnode/replacement.py @@ -10,6 +10,7 @@ Original author: @niacdoial import os.path import time import traceback +import typing from typing import Dict, List, Optional, Tuple import bpy.props @@ -17,6 +18,7 @@ import bpy.props import arm.log as log import arm.logicnode.arm_nodes as arm_nodes import arm.logicnode.arm_sockets +import arm.node_utils as node_utils # List of errors that occurred during the replacement # Format: (error identifier, node.bl_idname (or None), tree name, exception traceback (optional)) @@ -61,28 +63,27 @@ class NodeReplacement: """ in_socks = {i: i for i in range(len(node.inputs))} out_socks = {i: i for i in range(len(node.outputs))} - props = {} - i = 0 - # finding all the properties fo a node is not possible in a clean way for now. - # so, I'll assume their names start with "property", and list all the node's attributes that fulfill that condition. - # next, to check that those are indeed properties (in the blender sense), we need to check the class's type annotations. - # those annotations are not even instances of bpy.types.Property, but tuples, with the first element being a function accessible at bpy.props.XXXProperty - property_types = [] - for possible_prop_type in dir(bpy.props): - if possible_prop_type.endswith('Property'): - property_types.append(getattr(bpy.props, possible_prop_type)) + # Find all properties for this node + props = {} possible_properties = [] for attrname in dir(node): + # We assume that property names start with 'property' if attrname.startswith('property'): possible_properties.append(attrname) + for attrname in possible_properties: + # Search in type annotations if attrname not in node.__annotations__: continue - if not isinstance(node.__annotations__[attrname], tuple): + + # Properties must be annotated with '_PropertyDeferred', see + # https://developer.blender.org/rB37e6a1995ac7eeabd5b6a56621ad5a850dae4149 + # and https://developer.blender.org/rBc44c611c6d8c6ae071b48efb5fc07168f18cd17e + if not isinstance(node.__annotations__[attrname], bpy.props._PropertyDeferred): continue - if node.__annotations__[attrname][0] in property_types: - props[attrname] = attrname + + props[attrname] = attrname return NodeReplacement( node.bl_idname, node.arm_version, node.bl_idname, type(node).arm_version, @@ -128,15 +129,11 @@ def replace(tree: bpy.types.NodeTree, node: 'ArmLogicTreeNode'): if isinstance(response, arm_nodes.ArmLogicTreeNode): newnode = response # some misc. properties - newnode.parent = node.parent - newnode.location = node.location - newnode.select = node.select + copy_basic_node_props(from_node=node, to_node=newnode) elif isinstance(response, list): # a list of nodes: for newnode in response: - newnode.parent = node.parent - newnode.location = node.location - newnode.select = node.select + copy_basic_node_props(from_node=node, to_node=newnode) elif isinstance(response, NodeReplacement): replacement = response @@ -151,9 +148,7 @@ def replace(tree: bpy.types.NodeTree, node: 'ArmLogicTreeNode'): raise LookupError("The provided NodeReplacement doesn't seem to correspond to the node needing replacement") # some misc. properties - newnode.parent = node.parent - newnode.location = node.location - newnode.select = node.select + copy_basic_node_props(from_node=node, to_node=newnode) # now, use the `replacement` to hook up the new node correctly # start by applying defaults @@ -274,3 +269,87 @@ def replace_all(): log.error(f'There were errors in the node update procedure, a detailed report has been written to {reportfile}') bpy.ops.arm.show_node_update_errors() + + +def copy_basic_node_props(from_node: bpy.types.Node, to_node: bpy.types.Node): + to_node.parent = from_node.parent + to_node.location = from_node.location + to_node.select = from_node.select + + to_node.arm_logic_id = from_node.arm_logic_id + to_node.arm_watch = from_node.arm_watch + + +def node_compat_sdk2108(): + """SDK 21.08 broke compatibility with older nodes as nodes now use + custom sockets even for Blender's default data types and custom + property "constructors". This allows to listen for events for the + live patch system. + + In order to update older nodes this routine is used. It creates a + full copy of the nodes and replaces all properties and sockets with + their new equivalents. + """ + for tree in bpy.data.node_groups: + if tree.bl_idname == "ArmLogicTreeType": + for node in list(tree.nodes): + # Don't raise exceptions for invalid unregistered nodes, this + # function didn't cause the registration problem if there is one + if not node.__class__.is_registered_node_type(): + continue + + if node.type in ('FRAME', 'REROUTE'): + continue + + newnode = tree.nodes.new(node.__class__.bl_idname) + copy_basic_node_props(from_node=node, to_node=newnode) + + # Also copy the node's version number to _not_ prevent actual node + # replacement after this step + newnode.arm_version = node.arm_version + + # First replace all properties + for prop_name, prop in typing.get_type_hints(node.__class__, {}, {}).items(): + if isinstance(prop, bpy.props._PropertyDeferred): + if hasattr(node, prop_name) and hasattr(newnode, prop_name): + setattr(newnode, prop_name, getattr(node, prop_name)) + + # Replace sockets with new socket types + socket_replacements = { + 'NodeSocketBool': 'ArmBoolSocket', + 'NodeSocketColor': 'ArmColorSocket', + 'NodeSocketFloat': 'ArmFloatSocket', + 'NodeSocketInt': 'ArmIntSocket', + 'NodeSocketShader': 'ArmDynamicSocket', + 'NodeSocketString': 'ArmStringSocket', + 'NodeSocketVector': 'ArmVectorSocket' + } + + # Recreate all sockets + newnode.inputs.clear() + for inp in node.inputs: + inp_idname = inp.bl_idname + inp_idname = socket_replacements.get(inp_idname, inp_idname) + + newinp = newnode.inputs.new(inp_idname, inp.name, identifier=inp.identifier) + + if inp.is_linked: + for link in inp.links: + tree.links.new(link.from_socket, newinp) + else: + node_utils.set_socket_default(newinp, node_utils.get_socket_default(inp)) + + newnode.outputs.clear() + for out in node.outputs: + out_idname = out.bl_idname + out_idname = socket_replacements.get(out_idname, out_idname) + + newout = newnode.outputs.new(out_idname, out.name, identifier=out.identifier) + + if out.is_linked: + for link in out.links: + tree.links.new(newout, link.to_socket) + else: + node_utils.set_socket_default(newout, node_utils.get_socket_default(out)) + + tree.nodes.remove(node) diff --git a/blender/arm/logicnode/scene/LN_collection.py b/blender/arm/logicnode/scene/LN_collection.py index 54442f2f..95d9c5ad 100644 --- a/blender/arm/logicnode/scene/LN_collection.py +++ b/blender/arm/logicnode/scene/LN_collection.py @@ -12,10 +12,9 @@ class GroupNode(ArmLogicTreeNode): arm_section = 'collection' arm_version = 1 - property0: PointerProperty(name='', type=bpy.types.Collection) + property0: HaxePointerProperty('property0', name='', type=bpy.types.Collection) - def init(self, context): - super(GroupNode, self).init(context) + def arm_init(self, context): self.add_output('ArmNodeSocketArray', 'Array') def draw_buttons(self, context, layout): diff --git a/blender/arm/logicnode/scene/LN_create_collection.py b/blender/arm/logicnode/scene/LN_create_collection.py index 9c728c21..94e98a01 100644 --- a/blender/arm/logicnode/scene/LN_create_collection.py +++ b/blender/arm/logicnode/scene/LN_create_collection.py @@ -7,9 +7,8 @@ class CreateCollectionNode(ArmLogicTreeNode): arm_section = 'collection' arm_version = 1 - def init(self, context): - super(CreateCollectionNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketString', 'Collection') + self.add_input('ArmStringSocket', 'Collection') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/scene/LN_get_collection.py b/blender/arm/logicnode/scene/LN_get_collection.py index 14fb5d7a..74a0f05d 100644 --- a/blender/arm/logicnode/scene/LN_get_collection.py +++ b/blender/arm/logicnode/scene/LN_get_collection.py @@ -10,8 +10,7 @@ class GetGroupNode(ArmLogicTreeNode): arm_section = 'collection' arm_version = 1 - def init(self, context): - super(GetGroupNode, self).init(context) - self.add_input('NodeSocketString', 'Name') + def arm_init(self, context): + self.add_input('ArmStringSocket', 'Name') self.add_output('ArmNodeSocketArray', 'Objects') diff --git a/blender/arm/logicnode/scene/LN_get_scene_active.py b/blender/arm/logicnode/scene/LN_get_scene_active.py index a263b428..f99c72c0 100644 --- a/blender/arm/logicnode/scene/LN_get_scene_active.py +++ b/blender/arm/logicnode/scene/LN_get_scene_active.py @@ -6,6 +6,5 @@ class ActiveSceneNode(ArmLogicTreeNode): bl_label = 'Get Scene Active' arm_version = 1 - def init(self, context): - super(ActiveSceneNode, self).init(context) - self.add_output('NodeSocketShader', 'Scene') + def arm_init(self, context): + self.add_output('ArmDynamicSocket', 'Scene') diff --git a/blender/arm/logicnode/scene/LN_get_scene_root.py b/blender/arm/logicnode/scene/LN_get_scene_root.py index 658cbfa2..2dc4e428 100644 --- a/blender/arm/logicnode/scene/LN_get_scene_root.py +++ b/blender/arm/logicnode/scene/LN_get_scene_root.py @@ -6,6 +6,5 @@ class SceneRootNode(ArmLogicTreeNode): bl_label = 'Get Scene Root' arm_version = 1 - def init(self, context): - super(SceneRootNode, self).init(context) + def arm_init(self, context): self.add_output('ArmNodeSocketObject', 'Object') diff --git a/blender/arm/logicnode/scene/LN_global_object.py b/blender/arm/logicnode/scene/LN_global_object.py index 015da8ca..ca001743 100644 --- a/blender/arm/logicnode/scene/LN_global_object.py +++ b/blender/arm/logicnode/scene/LN_global_object.py @@ -7,6 +7,5 @@ class GlobalObjectNode(ArmLogicTreeNode): bl_label = 'Global Object' arm_version = 1 - def init(self, context): - super(GlobalObjectNode, self).init(context) + def arm_init(self, context): self.add_output('ArmNodeSocketObject', 'Object') diff --git a/blender/arm/logicnode/scene/LN_remove_collection.py b/blender/arm/logicnode/scene/LN_remove_collection.py index b7a40ce9..813c13d6 100644 --- a/blender/arm/logicnode/scene/LN_remove_collection.py +++ b/blender/arm/logicnode/scene/LN_remove_collection.py @@ -7,9 +7,8 @@ class RemoveGroupNode(ArmLogicTreeNode): arm_section = 'collection' arm_version = 1 - def init(self, context): - super(RemoveGroupNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketString', 'Collection') + self.add_input('ArmStringSocket', 'Collection') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/scene/LN_remove_scene_active.py b/blender/arm/logicnode/scene/LN_remove_scene_active.py index 815b941a..4fd2ac66 100644 --- a/blender/arm/logicnode/scene/LN_remove_scene_active.py +++ b/blender/arm/logicnode/scene/LN_remove_scene_active.py @@ -6,8 +6,7 @@ class RemoveActiveSceneNode(ArmLogicTreeNode): bl_label = 'Remove Scene Active' arm_version = 1 - def init(self, context): - super(RemoveActiveSceneNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/scene/LN_scene.py b/blender/arm/logicnode/scene/LN_scene.py index 29f68205..c4849838 100644 --- a/blender/arm/logicnode/scene/LN_scene.py +++ b/blender/arm/logicnode/scene/LN_scene.py @@ -9,11 +9,10 @@ class SceneNode(ArmLogicTreeNode): bl_label = 'Scene' arm_version = 1 - property0_get: PointerProperty(name='', type=bpy.types.Scene) + property0_get: HaxePointerProperty('property0_get', name='', type=bpy.types.Scene) - def init(self, context): - super(SceneNode, self).init(context) - self.add_output('NodeSocketShader', 'Scene') + def arm_init(self, context): + self.add_output('ArmDynamicSocket', 'Scene') def draw_buttons(self, context, layout): layout.prop_search(self, 'property0_get', bpy.data, 'scenes', icon='NONE', text='') diff --git a/blender/arm/logicnode/scene/LN_set_scene_active.py b/blender/arm/logicnode/scene/LN_set_scene_active.py index 4a231d83..95138c85 100644 --- a/blender/arm/logicnode/scene/LN_set_scene_active.py +++ b/blender/arm/logicnode/scene/LN_set_scene_active.py @@ -6,10 +6,9 @@ class SetSceneNode(ArmLogicTreeNode): bl_label = 'Set Scene Active' arm_version = 1 - def init(self, context): - super(SetSceneNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketShader', 'Scene') + self.add_input('ArmDynamicSocket', 'Scene') self.add_output('ArmNodeSocketAction', 'Out') self.add_output('ArmNodeSocketObject', 'Root') diff --git a/blender/arm/logicnode/scene/LN_spawn_collection.py b/blender/arm/logicnode/scene/LN_spawn_collection.py index b8d6caaf..c03ed012 100644 --- a/blender/arm/logicnode/scene/LN_spawn_collection.py +++ b/blender/arm/logicnode/scene/LN_spawn_collection.py @@ -28,12 +28,11 @@ class SpawnCollectionNode(ArmLogicTreeNode): arm_section = 'collection' arm_version = 1 - property0: PointerProperty(name='Collection', type=bpy.types.Collection) + property0: HaxePointerProperty('property0', name='Collection', type=bpy.types.Collection) - def init(self, context): - super(SpawnCollectionNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketShader', 'Transform') + self.add_input('ArmDynamicSocket', 'Transform') self.add_output('ArmNodeSocketAction', 'Out') self.add_output('ArmNodeSocketArray', 'Top-Level Objects') diff --git a/blender/arm/logicnode/scene/LN_spawn_scene.py b/blender/arm/logicnode/scene/LN_spawn_scene.py index d9d42a2b..e3df2adb 100644 --- a/blender/arm/logicnode/scene/LN_spawn_scene.py +++ b/blender/arm/logicnode/scene/LN_spawn_scene.py @@ -6,11 +6,10 @@ class SpawnSceneNode(ArmLogicTreeNode): bl_label = 'Spawn Scene' arm_version = 1 - def init(self, context): - super(SpawnSceneNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketShader', 'Scene') - self.add_input('NodeSocketShader', 'Transform') + self.add_input('ArmDynamicSocket', 'Scene') + self.add_input('ArmDynamicSocket', 'Transform') self.add_output('ArmNodeSocketAction', 'Out') self.add_output('ArmNodeSocketObject', 'Root') diff --git a/blender/arm/logicnode/sound/LN_pause_speaker.py b/blender/arm/logicnode/sound/LN_pause_speaker.py index b211a62c..14fb5852 100644 --- a/blender/arm/logicnode/sound/LN_pause_speaker.py +++ b/blender/arm/logicnode/sound/LN_pause_speaker.py @@ -11,8 +11,7 @@ class PauseSpeakerNode(ArmLogicTreeNode): bl_label = 'Pause Speaker' arm_version = 1 - def init(self, context): - super(PauseSpeakerNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Speaker') diff --git a/blender/arm/logicnode/sound/LN_play_sound.py b/blender/arm/logicnode/sound/LN_play_sound.py index f87838ea..47e622d4 100644 --- a/blender/arm/logicnode/sound/LN_play_sound.py +++ b/blender/arm/logicnode/sound/LN_play_sound.py @@ -31,32 +31,36 @@ class PlaySoundNode(ArmLogicTreeNode): bl_width_default = 200 arm_version = 1 - property0: PointerProperty(name='', type=bpy.types.Sound) - property1: BoolProperty( + property0: HaxePointerProperty('property0', name='', type=bpy.types.Sound) + property1: HaxeBoolProperty( + 'property1', name='Loop', description='Play the sound in a loop', default=False) - property2: BoolProperty( + property2: HaxeBoolProperty( + 'property2', name='Retrigger', description='Play the sound from the beginning every time', default=False) - property3: BoolProperty( + property3: HaxeBoolProperty( + 'property3', name='Use Custom Sample Rate', description='If enabled, override the default sample rate', default=False) - property4: IntProperty( + property4: HaxeIntProperty( + 'property4', name='Sample Rate', description='Set the sample rate used to play this sound', default=44100, min=0) - property5: BoolProperty( + property5: HaxeBoolProperty( + 'property5', name='Stream', description='Stream the sound from disk', default=False ) - def init(self, context): - super(PlaySoundNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'Play') self.add_input('ArmNodeSocketAction', 'Pause') self.add_input('ArmNodeSocketAction', 'Stop') diff --git a/blender/arm/logicnode/sound/LN_play_speaker.py b/blender/arm/logicnode/sound/LN_play_speaker.py index b91446b9..d4fdeb84 100644 --- a/blender/arm/logicnode/sound/LN_play_speaker.py +++ b/blender/arm/logicnode/sound/LN_play_speaker.py @@ -11,8 +11,7 @@ class PlaySpeakerNode(ArmLogicTreeNode): bl_label = 'Play Speaker' arm_version = 1 - def init(self, context): - super(PlaySpeakerNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Speaker') diff --git a/blender/arm/logicnode/sound/LN_stop_speaker.py b/blender/arm/logicnode/sound/LN_stop_speaker.py index 9b5ba8bc..4940133d 100644 --- a/blender/arm/logicnode/sound/LN_stop_speaker.py +++ b/blender/arm/logicnode/sound/LN_stop_speaker.py @@ -11,8 +11,7 @@ class StopSpeakerNode(ArmLogicTreeNode): bl_label = 'Stop Speaker' arm_version = 1 - def init(self, context): - super(StopSpeakerNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Speaker') diff --git a/blender/arm/logicnode/string/LN_concatenate_string.py b/blender/arm/logicnode/string/LN_concatenate_string.py index 381957c0..3467ddee 100644 --- a/blender/arm/logicnode/string/LN_concatenate_string.py +++ b/blender/arm/logicnode/string/LN_concatenate_string.py @@ -10,16 +10,15 @@ class ConcatenateStringNode(ArmLogicTreeNode): super(ConcatenateStringNode, self).__init__() array_nodes[str(id(self))] = self - def init(self, context): - super(ConcatenateStringNode, self).init(context) - self.add_input('NodeSocketString', 'Input 0') + def arm_init(self, context): + self.add_input('ArmStringSocket', 'Input 0') - self.add_output('NodeSocketString', 'String') + self.add_output('ArmStringSocket', 'String') def draw_buttons(self, context, layout): row = layout.row(align=True) op = row.operator('arm.node_add_input', text='New', icon='PLUS', emboss=True) op.node_index = str(id(self)) - op.socket_type = 'NodeSocketString' + op.socket_type = 'ArmStringSocket' op = row.operator('arm.node_remove_input', text='', icon='X', emboss=True) op.node_index = str(id(self)) diff --git a/blender/arm/logicnode/string/LN_parse_float.py b/blender/arm/logicnode/string/LN_parse_float.py index 2cb6b8cb..5d14bc34 100644 --- a/blender/arm/logicnode/string/LN_parse_float.py +++ b/blender/arm/logicnode/string/LN_parse_float.py @@ -7,8 +7,7 @@ class ParseFloatNode(ArmLogicTreeNode): arm_section = 'parse' arm_version = 1 - def init(self, context): - super(ParseFloatNode, self).init(context) - self.add_output('NodeSocketFloat', 'Float') + def arm_init(self, context): + self.add_output('ArmFloatSocket', 'Float') - self.add_input('NodeSocketString', 'String') + self.add_input('ArmStringSocket', 'String') diff --git a/blender/arm/logicnode/string/LN_split_string.py b/blender/arm/logicnode/string/LN_split_string.py index 793716eb..3b7478aa 100644 --- a/blender/arm/logicnode/string/LN_split_string.py +++ b/blender/arm/logicnode/string/LN_split_string.py @@ -6,9 +6,8 @@ class SplitStringNode(ArmLogicTreeNode): bl_label = 'Split String' arm_version = 1 - def init(self, context): - super(SplitStringNode, self).init(context) + def arm_init(self, context): self.add_output('ArmNodeSocketArray', 'Array') - self.add_input('NodeSocketString', 'String') - self.add_input('NodeSocketString', 'Split') + self.add_input('ArmStringSocket', 'String') + self.add_input('ArmStringSocket', 'Split') diff --git a/blender/arm/logicnode/string/LN_string.py b/blender/arm/logicnode/string/LN_string.py index bc37a715..d7f4d6c1 100644 --- a/blender/arm/logicnode/string/LN_string.py +++ b/blender/arm/logicnode/string/LN_string.py @@ -6,8 +6,7 @@ class StringNode(ArmLogicTreeNode): bl_label = 'String' arm_version = 1 - def init(self, context): - super(StringNode, self).init(context) - self.add_input('NodeSocketString', 'String In') + def arm_init(self, context): + self.add_input('ArmStringSocket', 'String In') - self.add_output('NodeSocketString', 'String Out', is_var=True) + self.add_output('ArmStringSocket', 'String Out', is_var=True) diff --git a/blender/arm/logicnode/string/LN_string_case.py b/blender/arm/logicnode/string/LN_string_case.py index 30f8f276..22619e41 100644 --- a/blender/arm/logicnode/string/LN_string_case.py +++ b/blender/arm/logicnode/string/LN_string_case.py @@ -5,17 +5,17 @@ class CaseStringNode(ArmLogicTreeNode): bl_idname = 'LNCaseStringNode' bl_label = 'String Case' arm_version = 1 - property0: EnumProperty( + property0: HaxeEnumProperty( + 'property0', items = [('Upper Case', 'Upper Case', 'Upper Case'), ('Lower Case', 'Lower Case', 'Lower Case'), ], name='', default='Upper Case') - def init(self, context): - super(CaseStringNode, self).init(context) - self.add_input('NodeSocketString', 'String In') + def arm_init(self, context): + self.add_input('ArmStringSocket', 'String In') - self.add_output('NodeSocketString', 'String Out') + self.add_output('ArmStringSocket', 'String Out') def draw_buttons(self, context, layout): layout.prop(self, 'property0') diff --git a/blender/arm/logicnode/string/LN_string_contains.py b/blender/arm/logicnode/string/LN_string_contains.py index 1f99961a..f9811baf 100644 --- a/blender/arm/logicnode/string/LN_string_contains.py +++ b/blender/arm/logicnode/string/LN_string_contains.py @@ -5,19 +5,19 @@ class ContainsStringNode(ArmLogicTreeNode): bl_idname = 'LNContainsStringNode' bl_label = 'String Contains' arm_version = 1 - property0: EnumProperty( + property0: HaxeEnumProperty( + 'property0', items = [('Contains', 'Contains', 'Contains'), ('Starts With', 'Starts With', 'Starts With'), ('Ends With', 'Ends With', 'Ends With'), ], name='', default='Contains') - def init(self, context): - super(ContainsStringNode, self).init(context) - self.add_input('NodeSocketString', 'String') - self.add_input('NodeSocketString', 'Find') + def arm_init(self, context): + self.add_input('ArmStringSocket', 'String') + self.add_input('ArmStringSocket', 'Find') - self.add_output('NodeSocketBool', 'Contains') + self.add_output('ArmBoolSocket', 'Contains') def draw_buttons(self, context, layout): layout.prop(self, 'property0') diff --git a/blender/arm/logicnode/string/LN_string_length.py b/blender/arm/logicnode/string/LN_string_length.py index 2e4f249d..5edf39cb 100644 --- a/blender/arm/logicnode/string/LN_string_length.py +++ b/blender/arm/logicnode/string/LN_string_length.py @@ -6,8 +6,7 @@ class LengthStringNode(ArmLogicTreeNode): bl_label = 'String Length' arm_version = 1 - def init(self, context): - super(LengthStringNode, self).init(context) - self.add_output('NodeSocketInt', 'Length') + def arm_init(self, context): + self.add_output('ArmIntSocket', 'Length') - self.add_input('NodeSocketString', 'String') + self.add_input('ArmStringSocket', 'String') diff --git a/blender/arm/logicnode/string/LN_sub_string.py b/blender/arm/logicnode/string/LN_sub_string.py index 60c65213..647d0e64 100644 --- a/blender/arm/logicnode/string/LN_sub_string.py +++ b/blender/arm/logicnode/string/LN_sub_string.py @@ -6,10 +6,9 @@ class SubStringNode(ArmLogicTreeNode): bl_label = 'Sub String' arm_version = 1 - def init(self, context): - super(SubStringNode, self).init(context) - self.add_input('NodeSocketString', 'String In') - self.add_input('NodeSocketInt', 'Start') - self.add_input('NodeSocketInt', 'End') + def arm_init(self, context): + self.add_input('ArmStringSocket', 'String In') + self.add_input('ArmIntSocket', 'Start') + self.add_input('ArmIntSocket', 'End') - self.add_output('NodeSocketString', 'String Out') + self.add_output('ArmStringSocket', 'String Out') diff --git a/blender/arm/logicnode/trait/LN_add_trait_to_object.py b/blender/arm/logicnode/trait/LN_add_trait_to_object.py index 04a22b31..aac4a5f3 100644 --- a/blender/arm/logicnode/trait/LN_add_trait_to_object.py +++ b/blender/arm/logicnode/trait/LN_add_trait_to_object.py @@ -6,10 +6,9 @@ class AddTraitNode(ArmLogicTreeNode): bl_label = 'Add Trait to Object' arm_version = 1 - def init(self, context): - super(AddTraitNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Object') - self.add_input('NodeSocketShader', 'Trait') + self.add_input('ArmDynamicSocket', 'Trait') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/trait/LN_get_object_trait.py b/blender/arm/logicnode/trait/LN_get_object_trait.py index 86c9dd15..b0890ab2 100644 --- a/blender/arm/logicnode/trait/LN_get_object_trait.py +++ b/blender/arm/logicnode/trait/LN_get_object_trait.py @@ -7,9 +7,8 @@ class GetTraitNode(ArmLogicTreeNode): bl_label = 'Get Object Trait' arm_version = 1 - def init(self, context): - super(GetTraitNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketObject', 'Object') - self.add_input('NodeSocketString', 'Name') + self.add_input('ArmStringSocket', 'Name') - self.add_output('NodeSocketShader', 'Trait') + self.add_output('ArmDynamicSocket', 'Trait') diff --git a/blender/arm/logicnode/trait/LN_get_object_traits.py b/blender/arm/logicnode/trait/LN_get_object_traits.py index ab80f3ce..7fd1dfae 100644 --- a/blender/arm/logicnode/trait/LN_get_object_traits.py +++ b/blender/arm/logicnode/trait/LN_get_object_traits.py @@ -6,8 +6,7 @@ class GetObjectTraitsNode(ArmLogicTreeNode): bl_label = 'Get Object Traits' arm_version = 1 - def init(self, context): - super(GetObjectTraitsNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketObject', 'Object') self.add_output('ArmNodeSocketArray', 'Traits') diff --git a/blender/arm/logicnode/trait/LN_get_trait_name.py b/blender/arm/logicnode/trait/LN_get_trait_name.py index 49143b6b..9a34fd70 100644 --- a/blender/arm/logicnode/trait/LN_get_trait_name.py +++ b/blender/arm/logicnode/trait/LN_get_trait_name.py @@ -6,9 +6,8 @@ class GetTraitNameNode(ArmLogicTreeNode): bl_label = 'Get Trait Name' arm_version = 1 - def init(self, context): - super(GetTraitNameNode, self).init(context) - self.add_input('NodeSocketShader', 'Trait') + def arm_init(self, context): + self.add_input('ArmDynamicSocket', 'Trait') - self.add_output('NodeSocketString', 'Name') - self.add_output('NodeSocketString', 'Class Type') + self.add_output('ArmStringSocket', 'Name') + self.add_output('ArmStringSocket', 'Class Type') diff --git a/blender/arm/logicnode/trait/LN_get_trait_paused.py b/blender/arm/logicnode/trait/LN_get_trait_paused.py index 2150523d..12f1ac0d 100644 --- a/blender/arm/logicnode/trait/LN_get_trait_paused.py +++ b/blender/arm/logicnode/trait/LN_get_trait_paused.py @@ -6,8 +6,7 @@ class GetTraitPausedNode(ArmLogicTreeNode): bl_label = 'Get Trait Paused' arm_version = 1 - def init(self, context): - super(GetTraitPausedNode, self).init(context) - self.add_input('NodeSocketShader', 'Trait') + def arm_init(self, context): + self.add_input('ArmDynamicSocket', 'Trait') - self.add_output('NodeSocketBool', 'Is Paused') + self.add_output('ArmBoolSocket', 'Is Paused') diff --git a/blender/arm/logicnode/trait/LN_remove_trait.py b/blender/arm/logicnode/trait/LN_remove_trait.py index 07a41f16..7e81f12c 100644 --- a/blender/arm/logicnode/trait/LN_remove_trait.py +++ b/blender/arm/logicnode/trait/LN_remove_trait.py @@ -6,9 +6,8 @@ class RemoveTraitNode(ArmLogicTreeNode): bl_label = 'Remove Trait' arm_version = 1 - def init(self, context): - super(RemoveTraitNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketShader', 'Trait') + self.add_input('ArmDynamicSocket', 'Trait') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/trait/LN_self_trait.py b/blender/arm/logicnode/trait/LN_self_trait.py index dc06e0c4..41b09676 100644 --- a/blender/arm/logicnode/trait/LN_self_trait.py +++ b/blender/arm/logicnode/trait/LN_self_trait.py @@ -6,6 +6,5 @@ class SelfTraitNode(ArmLogicTreeNode): bl_label = 'Self Trait' arm_version = 1 - def init(self, context): - super(SelfTraitNode, self).init(context) - self.add_output('NodeSocketShader', 'Trait') + def arm_init(self, context): + self.add_output('ArmDynamicSocket', 'Trait') diff --git a/blender/arm/logicnode/trait/LN_set_trait_paused.py b/blender/arm/logicnode/trait/LN_set_trait_paused.py index 81ada9c4..739692dd 100644 --- a/blender/arm/logicnode/trait/LN_set_trait_paused.py +++ b/blender/arm/logicnode/trait/LN_set_trait_paused.py @@ -6,10 +6,9 @@ class SetTraitPausedNode(ArmLogicTreeNode): bl_label = 'Set Trait Paused' arm_version = 1 - def init(self, context): - super(SetTraitPausedNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketShader', 'Trait') - self.add_input('NodeSocketBool', 'Paused') + self.add_input('ArmDynamicSocket', 'Trait') + self.add_input('ArmBoolSocket', 'Paused') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/trait/LN_trait.py b/blender/arm/logicnode/trait/LN_trait.py index bcec41c0..bc1b85ef 100644 --- a/blender/arm/logicnode/trait/LN_trait.py +++ b/blender/arm/logicnode/trait/LN_trait.py @@ -8,11 +8,10 @@ class TraitNode(ArmLogicTreeNode): bl_label = 'Trait' arm_version = 1 - property0: StringProperty(name='', default='') + property0: HaxeStringProperty('property0', name='', default='') - def init(self, context): - super(TraitNode, self).init(context) - self.add_output('NodeSocketShader', 'Trait', is_var=True) + def arm_init(self, context): + self.add_output('ArmDynamicSocket', 'Trait', is_var=True) def draw_buttons(self, context, layout): layout.prop(self, 'property0') diff --git a/blender/arm/logicnode/transform/LN_append_transform.py b/blender/arm/logicnode/transform/LN_append_transform.py index a0def018..3a85088e 100644 --- a/blender/arm/logicnode/transform/LN_append_transform.py +++ b/blender/arm/logicnode/transform/LN_append_transform.py @@ -6,10 +6,9 @@ class AppendTransformNode(ArmLogicTreeNode): bl_label = 'Append Transform' arm_version = 1 - def init(self, context): - super(AppendTransformNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Object') - self.add_input('NodeSocketShader', 'Transform') + self.add_input('ArmDynamicSocket', 'Transform') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/transform/LN_get_object_location.py b/blender/arm/logicnode/transform/LN_get_object_location.py index 76458b5b..d4af86b4 100644 --- a/blender/arm/logicnode/transform/LN_get_object_location.py +++ b/blender/arm/logicnode/transform/LN_get_object_location.py @@ -2,7 +2,7 @@ from arm.logicnode.arm_nodes import * class GetLocationNode(ArmLogicTreeNode): """Get the location of the given object in world coordinates. - + @input Parent Relative: If enabled, transforms the world coordinates into object parent local coordinates @seeNode Set Object Location @@ -14,14 +14,13 @@ class GetLocationNode(ArmLogicTreeNode): arm_section = 'location' arm_version = 2 - def init(self, context): - super(GetLocationNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketObject', 'Object') - self.add_input('NodeSocketBool', 'Parent Relative') + self.add_input('ArmBoolSocket', 'Parent Relative') - self.add_output('NodeSocketVector', 'Location') + self.add_output('ArmVectorSocket', 'Location') def get_replacement_node(self, node_tree: bpy.types.NodeTree): if self.arm_version not in (0, 1): raise LookupError() - return NodeReplacement.Identity(self) \ No newline at end of file + return NodeReplacement.Identity(self) diff --git a/blender/arm/logicnode/transform/LN_get_object_rotation.py b/blender/arm/logicnode/transform/LN_get_object_rotation.py index ab14b0d0..af3ba965 100644 --- a/blender/arm/logicnode/transform/LN_get_object_rotation.py +++ b/blender/arm/logicnode/transform/LN_get_object_rotation.py @@ -7,13 +7,12 @@ class GetRotationNode(ArmLogicTreeNode): arm_section = 'rotation' arm_version = 1 - def init(self, context): - super(GetRotationNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketObject', 'Object') - self.add_output('NodeSocketVector', 'Euler Angles') - self.add_output('NodeSocketVector', 'Vector') - self.add_output('NodeSocketFloat', 'Angle (Radians)') - self.add_output('NodeSocketFloat', 'Angle (Degrees)') - self.add_output('NodeSocketVector', 'Quaternion XYZ') - self.add_output('NodeSocketFloat', 'Quaternion W') + self.add_output('ArmVectorSocket', 'Euler Angles') + self.add_output('ArmVectorSocket', 'Vector') + self.add_output('ArmFloatSocket', 'Angle (Radians)') + self.add_output('ArmFloatSocket', 'Angle (Degrees)') + self.add_output('ArmVectorSocket', 'Quaternion XYZ') + self.add_output('ArmFloatSocket', 'Quaternion W') diff --git a/blender/arm/logicnode/transform/LN_get_object_scale.py b/blender/arm/logicnode/transform/LN_get_object_scale.py index 60f21e65..67d5d5df 100644 --- a/blender/arm/logicnode/transform/LN_get_object_scale.py +++ b/blender/arm/logicnode/transform/LN_get_object_scale.py @@ -7,8 +7,7 @@ class GetScaleNode(ArmLogicTreeNode): arm_section = 'scale' arm_version = 1 - def init(self, context): - super(GetScaleNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketObject', 'Object') - self.add_output('NodeSocketVector', 'Scale') + self.add_output('ArmVectorSocket', 'Scale') diff --git a/blender/arm/logicnode/transform/LN_get_object_transform.py b/blender/arm/logicnode/transform/LN_get_object_transform.py index 1477d899..347dc81b 100644 --- a/blender/arm/logicnode/transform/LN_get_object_transform.py +++ b/blender/arm/logicnode/transform/LN_get_object_transform.py @@ -8,8 +8,7 @@ class GetTransformNode(ArmLogicTreeNode): bl_label = 'Get Object Transform' arm_version = 1 - def init(self, context): - super(GetTransformNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketObject', 'Object') - self.add_output('NodeSocketShader', 'Transform') + self.add_output('ArmDynamicSocket', 'Transform') diff --git a/blender/arm/logicnode/transform/LN_get_world_orientation.py b/blender/arm/logicnode/transform/LN_get_world_orientation.py index 3ba71b5b..9e9b7de4 100644 --- a/blender/arm/logicnode/transform/LN_get_world_orientation.py +++ b/blender/arm/logicnode/transform/LN_get_world_orientation.py @@ -7,17 +7,17 @@ class GetWorldNode(ArmLogicTreeNode): arm_section = 'rotation' arm_version = 1 - property0: EnumProperty( + property0: HaxeEnumProperty( + 'property0', items = [('Right', 'Right', 'The object right (X) direction'), ('Look', 'Look', 'The object look (Y) direction'), ('Up', 'Up', 'The object up (Z) direction')], name='', default='Look') - def init(self, context): - super(GetWorldNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketObject', 'Object') - self.add_output('NodeSocketVector', 'Vector') + self.add_output('ArmVectorSocket', 'Vector') def draw_buttons(self, context, layout): layout.prop(self, 'property0') diff --git a/blender/arm/logicnode/transform/LN_look_at.py b/blender/arm/logicnode/transform/LN_look_at.py index b1bdc31a..f2bc1bde 100644 --- a/blender/arm/logicnode/transform/LN_look_at.py +++ b/blender/arm/logicnode/transform/LN_look_at.py @@ -7,7 +7,8 @@ class LookAtNode(ArmLogicTreeNode): arm_section = 'rotation' arm_version = 1 - property0: EnumProperty( + property0: HaxeEnumProperty( + 'property0', items = [('X', ' X', 'X'), ('-X', '-X', '-X'), ('Y', ' Y', 'Y'), @@ -16,12 +17,11 @@ class LookAtNode(ArmLogicTreeNode): ('-Z', '-Z', '-Z')], name='With', default='Z') - def init(self, context): - super(LookAtNode, self).init(context) - self.add_input('NodeSocketVector', 'From Location') - self.add_input('NodeSocketVector', 'To Location') + def arm_init(self, context): + self.add_input('ArmVectorSocket', 'From Location') + self.add_input('ArmVectorSocket', 'To Location') - self.add_output('NodeSocketVector', 'Rotation') + self.add_output('ArmVectorSocket', 'Rotation') def draw_buttons(self, context, layout): layout.prop(self, 'property0') diff --git a/blender/arm/logicnode/transform/LN_rotate_object.py b/blender/arm/logicnode/transform/LN_rotate_object.py index 7b21abb4..0e22ede6 100644 --- a/blender/arm/logicnode/transform/LN_rotate_object.py +++ b/blender/arm/logicnode/transform/LN_rotate_object.py @@ -7,12 +7,11 @@ class RotateObjectNode(ArmLogicTreeNode): arm_section = 'rotation' arm_version = 1 - def init(self, context): - super().init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Object') - self.add_input('NodeSocketVector', 'Euler Angles') - self.add_input('NodeSocketFloat', 'Angle / W') + self.add_input('ArmVectorSocket', 'Euler Angles') + self.add_input('ArmFloatSocket', 'Angle / W') self.add_output('ArmNodeSocketAction', 'Out') @@ -28,7 +27,7 @@ class RotateObjectNode(ArmLogicTreeNode): self.inputs[2].name = "Axis" self.inputs[3].name = "Angle" else: - raise ValueError('No nodesocket labels for current input mode: check self-consistancy of action_set_rotation.py') + raise ValueError('No nodesocket labels for current input mode: check self-consistancy of LN_rotate_object.py') def draw_buttons(self, context, layout): # this block is here to ensure backwards compatibility and warn the user. @@ -40,10 +39,11 @@ class RotateObjectNode(ArmLogicTreeNode): else: layout.prop(self, 'property0') - property0: EnumProperty( - items = [('Euler Angles', 'Euler Angles', 'Euler Angles'), - ('Angle Axies (Radians)', 'Angle Axies (Radians)', 'Angle Axies (Radians)'), - ('Angle Axies (Degrees)', 'Angle Axies (Degrees)', 'Angle Axies (Degrees)'), - ('Quaternion', 'Quaternion', 'Quaternion')], + property0: HaxeEnumProperty( + 'property0', + items=[('Euler Angles', 'Euler Angles', 'Euler Angles'), + ('Angle Axies (Radians)', 'Angle Axies (Radians)', 'Angle Axies (Radians)'), + ('Angle Axies (Degrees)', 'Angle Axies (Degrees)', 'Angle Axies (Degrees)'), + ('Quaternion', 'Quaternion', 'Quaternion')], name='', default='Euler Angles', - update = on_property_update) + update=on_property_update) diff --git a/blender/arm/logicnode/transform/LN_separate_transform.py b/blender/arm/logicnode/transform/LN_separate_transform.py index 5c834992..66cb1e7f 100644 --- a/blender/arm/logicnode/transform/LN_separate_transform.py +++ b/blender/arm/logicnode/transform/LN_separate_transform.py @@ -6,10 +6,9 @@ class SeparateTransformNode(ArmLogicTreeNode): bl_label = 'Separate Transform' arm_version = 1 - def init(self, context): - super(SeparateTransformNode, self).init(context) - self.add_input('NodeSocketShader', 'Transform') + def arm_init(self, context): + self.add_input('ArmDynamicSocket', 'Transform') - self.add_output('NodeSocketVector', 'Location') - self.add_output('NodeSocketVector', 'Rotation') - self.add_output('NodeSocketVector', 'Scale') + self.add_output('ArmVectorSocket', 'Location') + self.add_output('ArmVectorSocket', 'Rotation') + self.add_output('ArmVectorSocket', 'Scale') diff --git a/blender/arm/logicnode/transform/LN_set_object_location.py b/blender/arm/logicnode/transform/LN_set_object_location.py index 5a2b9824..5c9e4ac9 100644 --- a/blender/arm/logicnode/transform/LN_set_object_location.py +++ b/blender/arm/logicnode/transform/LN_set_object_location.py @@ -14,16 +14,15 @@ class SetLocationNode(ArmLogicTreeNode): arm_section = 'location' arm_version = 2 - def init(self, context): - super(SetLocationNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Object') - self.add_input('NodeSocketVector', 'Location') - self.add_input('NodeSocketBool', 'Parent Relative') + self.add_input('ArmVectorSocket', 'Location') + self.add_input('ArmBoolSocket', 'Parent Relative') self.add_output('ArmNodeSocketAction', 'Out') def get_replacement_node(self, node_tree: bpy.types.NodeTree): if self.arm_version not in (0, 1): raise LookupError() - return NodeReplacement.Identity(self) \ No newline at end of file + return NodeReplacement.Identity(self) diff --git a/blender/arm/logicnode/transform/LN_set_object_rotation.py b/blender/arm/logicnode/transform/LN_set_object_rotation.py index 4a59e161..6b7efbd9 100644 --- a/blender/arm/logicnode/transform/LN_set_object_rotation.py +++ b/blender/arm/logicnode/transform/LN_set_object_rotation.py @@ -7,12 +7,11 @@ class SetRotationNode(ArmLogicTreeNode): arm_section = 'rotation' arm_version = 1 - def init(self, context): - super(SetRotationNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Object') - self.add_input('NodeSocketVector', 'Euler Angles / Vector XYZ') - self.add_input('NodeSocketFloat', 'Angle / W') + self.add_input('ArmVectorSocket', 'Euler Angles / Vector XYZ') + self.add_input('ArmFloatSocket', 'Angle / W') self.add_output('ArmNodeSocketAction', 'Out') @@ -33,7 +32,8 @@ class SetRotationNode(ArmLogicTreeNode): def draw_buttons(self, context, layout): layout.prop(self, 'property0') - property0: EnumProperty( + property0: HaxeEnumProperty( + 'property0', items = [('Euler Angles', 'Euler Angles', 'Euler Angles'), ('Angle Axies (Radians)', 'Angle Axies (Radians)', 'Angle Axies (Radians)'), ('Angle Axies (Degrees)', 'Angle Axies (Degrees)', 'Angle Axies (Degrees)'), diff --git a/blender/arm/logicnode/transform/LN_set_object_scale.py b/blender/arm/logicnode/transform/LN_set_object_scale.py index e9580801..7f7221d9 100644 --- a/blender/arm/logicnode/transform/LN_set_object_scale.py +++ b/blender/arm/logicnode/transform/LN_set_object_scale.py @@ -7,10 +7,9 @@ class SetScaleNode(ArmLogicTreeNode): arm_section = 'scale' arm_version = 1 - def init(self, context): - super(SetScaleNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Object') - self.add_input('NodeSocketVector', 'Scale', default_value=[1.0, 1.0, 1.0]) + self.add_input('ArmVectorSocket', 'Scale', default_value=[1.0, 1.0, 1.0]) self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/transform/LN_set_object_transform.py b/blender/arm/logicnode/transform/LN_set_object_transform.py index 8d965d3e..1a139551 100644 --- a/blender/arm/logicnode/transform/LN_set_object_transform.py +++ b/blender/arm/logicnode/transform/LN_set_object_transform.py @@ -6,10 +6,9 @@ class SetTransformNode(ArmLogicTreeNode): bl_label = 'Set Object Transform' arm_version = 1 - def init(self, context): - super(SetTransformNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Object') - self.add_input('NodeSocketShader', 'Transform') + self.add_input('ArmDynamicSocket', 'Transform') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/transform/LN_transform.py b/blender/arm/logicnode/transform/LN_transform.py index 002502a8..7e7edd42 100644 --- a/blender/arm/logicnode/transform/LN_transform.py +++ b/blender/arm/logicnode/transform/LN_transform.py @@ -6,10 +6,9 @@ class TransformNode(ArmLogicTreeNode): bl_label = 'Transform' arm_version = 1 - def init(self, context): - super(TransformNode, self).init(context) - self.add_input('NodeSocketVector', 'Location') - self.add_input('NodeSocketVector', 'Rotation') - self.add_input('NodeSocketVector', 'Scale', default_value=[1.0, 1.0, 1.0]) + def arm_init(self, context): + self.add_input('ArmVectorSocket', 'Location') + self.add_input('ArmVectorSocket', 'Rotation') + self.add_input('ArmVectorSocket', 'Scale', default_value=[1.0, 1.0, 1.0]) - self.add_output('NodeSocketShader', 'Transform') + self.add_output('ArmDynamicSocket', 'Transform') diff --git a/blender/arm/logicnode/transform/LN_transform_math.py b/blender/arm/logicnode/transform/LN_transform_math.py index 282a9439..bc5a90a2 100644 --- a/blender/arm/logicnode/transform/LN_transform_math.py +++ b/blender/arm/logicnode/transform/LN_transform_math.py @@ -6,9 +6,8 @@ class TransformMathNode(ArmLogicTreeNode): bl_label = 'Transform Math' arm_version = 1 - def init(self, context): - super(TransformMathNode, self).init(context) - self.add_input('NodeSocketShader', 'Transform 1') - self.add_input('NodeSocketShader', 'Transform 2') + def arm_init(self, context): + self.add_input('ArmDynamicSocket', 'Transform 1') + self.add_input('ArmDynamicSocket', 'Transform 2') - self.add_output('NodeSocketShader', 'Result') + self.add_output('ArmDynamicSocket', 'Result') diff --git a/blender/arm/logicnode/transform/LN_transform_to_vector.py b/blender/arm/logicnode/transform/LN_transform_to_vector.py index bb70185c..222f8abb 100644 --- a/blender/arm/logicnode/transform/LN_transform_to_vector.py +++ b/blender/arm/logicnode/transform/LN_transform_to_vector.py @@ -6,13 +6,12 @@ class VectorFromTransformNode(ArmLogicTreeNode): bl_label = 'Transform to Vector' arm_version = 1 - def init(self, context): - super(VectorFromTransformNode, self).init(context) - self.add_input('NodeSocketShader', 'Transform') + def arm_init(self, context): + self.add_input('ArmDynamicSocket', 'Transform') - self.add_output('NodeSocketVector', 'Vector') - self.add_output('NodeSocketVector', 'Quaternion XYZ') - self.add_output('NodeSocketFloat', 'Quaternion W') + self.add_output('ArmVectorSocket', 'Vector') + self.add_output('ArmVectorSocket', 'Quaternion XYZ') + self.add_output('ArmFloatSocket', 'Quaternion W') def on_property_update(self, context): """called by the EnumProperty, used to update the node socket labels""" @@ -31,7 +30,8 @@ class VectorFromTransformNode(ArmLogicTreeNode): def draw_buttons(self, context, layout): layout.prop(self, 'property0') - property0: EnumProperty( + property0: HaxeEnumProperty( + 'property0', items = [('Right', 'Right', 'The transform right (X) direction'), ('Look', 'Look', 'The transform look (Y) direction'), ('Up', 'Up', 'The transform up (Z) direction'), diff --git a/blender/arm/logicnode/transform/LN_translate_object.py b/blender/arm/logicnode/transform/LN_translate_object.py index 048043be..d5964666 100644 --- a/blender/arm/logicnode/transform/LN_translate_object.py +++ b/blender/arm/logicnode/transform/LN_translate_object.py @@ -7,11 +7,10 @@ class TranslateObjectNode(ArmLogicTreeNode): arm_section = 'location' arm_version = 1 - def init(self, context): - super(TranslateObjectNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Object') - self.add_input('NodeSocketVector', 'Vector') - self.add_input('NodeSocketBool', 'On Local Axis') + self.add_input('ArmVectorSocket', 'Vector') + self.add_input('ArmBoolSocket', 'On Local Axis') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/transform/LN_translate_on_local_axis.py b/blender/arm/logicnode/transform/LN_translate_on_local_axis.py index 41c1af5c..08192fe6 100644 --- a/blender/arm/logicnode/transform/LN_translate_on_local_axis.py +++ b/blender/arm/logicnode/transform/LN_translate_on_local_axis.py @@ -8,12 +8,11 @@ class TranslateOnLocalAxisNode(ArmLogicTreeNode): arm_section = 'location' arm_version = 1 - def init(self, context): - super(TranslateOnLocalAxisNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') self.add_input('ArmNodeSocketObject', 'Object') - self.add_input('NodeSocketFloat', 'Speed') - self.add_input('NodeSocketInt', 'Forward/Up/Right') - self.add_input('NodeSocketBool', 'Inverse') + self.add_input('ArmFloatSocket', 'Speed') + self.add_input('ArmIntSocket', 'Forward/Up/Right') + self.add_input('ArmBoolSocket', 'Inverse') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/transform/LN_vector_to_object_orientation.py b/blender/arm/logicnode/transform/LN_vector_to_object_orientation.py index 7c4bbcb0..80e5794d 100644 --- a/blender/arm/logicnode/transform/LN_vector_to_object_orientation.py +++ b/blender/arm/logicnode/transform/LN_vector_to_object_orientation.py @@ -12,9 +12,8 @@ class VectorToObjectOrientationNode(ArmLogicTreeNode): arm_section = 'location' arm_version = 1 - def init(self, context): - super(VectorToObjectOrientationNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketObject', 'Object') - self.add_input('NodeSocketVector', 'World') + self.add_input('ArmVectorSocket', 'World') - self.add_output('NodeSocketVector', 'Oriented') + self.add_output('ArmVectorSocket', 'Oriented') diff --git a/blender/arm/logicnode/transform/LN_world_vector_to_local_space.py b/blender/arm/logicnode/transform/LN_world_vector_to_local_space.py index 7d011fad..5bc8442c 100644 --- a/blender/arm/logicnode/transform/LN_world_vector_to_local_space.py +++ b/blender/arm/logicnode/transform/LN_world_vector_to_local_space.py @@ -12,9 +12,8 @@ class WorldVectorToLocalSpaceNode(ArmLogicTreeNode): arm_section = 'location' arm_version = 1 - def init(self, context): - super(WorldVectorToLocalSpaceNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketObject', 'Object') - self.add_input('NodeSocketVector', 'World') + self.add_input('ArmVectorSocket', 'World') - self.add_output('NodeSocketVector', 'Local') + self.add_output('ArmVectorSocket', 'Local') diff --git a/blender/arm/logicnode/variable/LN_boolean.py b/blender/arm/logicnode/variable/LN_boolean.py index 08d597d1..f1769d8f 100644 --- a/blender/arm/logicnode/variable/LN_boolean.py +++ b/blender/arm/logicnode/variable/LN_boolean.py @@ -7,8 +7,7 @@ class BooleanNode(ArmLogicTreeNode): bl_label = 'Boolean' arm_version = 1 - def init(self, context): - super(BooleanNode, self).init(context) - self.add_input('NodeSocketBool', 'Bool In') + def arm_init(self, context): + self.add_input('ArmBoolSocket', 'Bool In') - self.add_output('NodeSocketBool', 'Bool Out', is_var=True) + self.add_output('ArmBoolSocket', 'Bool Out', is_var=True) diff --git a/blender/arm/logicnode/variable/LN_color.py b/blender/arm/logicnode/variable/LN_color.py index 1723f052..92ff7140 100644 --- a/blender/arm/logicnode/variable/LN_color.py +++ b/blender/arm/logicnode/variable/LN_color.py @@ -6,8 +6,7 @@ class ColorNode(ArmLogicTreeNode): bl_label = 'Color' arm_version = 1 - def init(self, context): - super(ColorNode, self).init(context) - self.add_input('NodeSocketColor', 'Color In', default_value=[1.0, 1.0, 1.0, 1.0]) + def arm_init(self, context): + self.add_input('ArmColorSocket', 'Color In', default_value=[1.0, 1.0, 1.0, 1.0]) - self.add_output('NodeSocketColor', 'Color Out', is_var=True) + self.add_output('ArmColorSocket', 'Color Out', is_var=True) diff --git a/blender/arm/logicnode/variable/LN_dynamic.py b/blender/arm/logicnode/variable/LN_dynamic.py index 495d23da..e1465c99 100644 --- a/blender/arm/logicnode/variable/LN_dynamic.py +++ b/blender/arm/logicnode/variable/LN_dynamic.py @@ -6,6 +6,5 @@ class DynamicNode(ArmLogicTreeNode): bl_label = 'Dynamic' arm_version = 1 - def init(self, context): - super(DynamicNode, self).init(context) - self.add_output('NodeSocketShader', 'Dynamic', is_var=True) + def arm_init(self, context): + self.add_output('ArmDynamicSocket', 'Dynamic', is_var=True) diff --git a/blender/arm/logicnode/variable/LN_float.py b/blender/arm/logicnode/variable/LN_float.py index a5c0f290..abd2caae 100644 --- a/blender/arm/logicnode/variable/LN_float.py +++ b/blender/arm/logicnode/variable/LN_float.py @@ -9,7 +9,6 @@ class FloatNode(ArmLogicTreeNode): bl_label = 'Float' arm_version = 1 - def init(self, context): - super(FloatNode, self).init(context) - self.add_input('NodeSocketFloat', 'Float In') - self.add_output('NodeSocketFloat', 'Float Out', is_var=True) + def arm_init(self, context): + self.add_input('ArmFloatSocket', 'Float In') + self.add_output('ArmFloatSocket', 'Float Out', is_var=True) diff --git a/blender/arm/logicnode/variable/LN_integer.py b/blender/arm/logicnode/variable/LN_integer.py index f4f022f4..89dd5d54 100644 --- a/blender/arm/logicnode/variable/LN_integer.py +++ b/blender/arm/logicnode/variable/LN_integer.py @@ -6,7 +6,6 @@ class IntegerNode(ArmLogicTreeNode): bl_label = 'Integer' arm_version = 1 - def init(self, context): - super(IntegerNode, self).init(context) - self.add_input('NodeSocketInt', 'Int In') - self.add_output('NodeSocketInt', 'Int Out', is_var=True) + def arm_init(self, context): + self.add_input('ArmIntSocket', 'Int In') + self.add_output('ArmIntSocket', 'Int Out', is_var=True) diff --git a/blender/arm/logicnode/variable/LN_mask.py b/blender/arm/logicnode/variable/LN_mask.py index 002c2472..4be96e2a 100644 --- a/blender/arm/logicnode/variable/LN_mask.py +++ b/blender/arm/logicnode/variable/LN_mask.py @@ -6,10 +6,9 @@ class MaskNode(ArmLogicTreeNode): bl_label = 'Mask' arm_version = 1 - def init(self, context): - super(MaskNode, self).init(context) + def arm_init(self, context): for i in range(1, 21): label = 'Group {:02d}'.format(i) - self.inputs.new('NodeSocketBool', label) + self.inputs.new('ArmBoolSocket', label) - self.add_output('NodeSocketInt', 'Mask', is_var=True) + self.add_output('ArmIntSocket', 'Mask', is_var=True) diff --git a/blender/arm/logicnode/variable/LN_quaternion.py b/blender/arm/logicnode/variable/LN_quaternion.py index 8f91465d..7316dbab 100644 --- a/blender/arm/logicnode/variable/LN_quaternion.py +++ b/blender/arm/logicnode/variable/LN_quaternion.py @@ -7,13 +7,12 @@ class QuaternionNode(ArmLogicTreeNode): arm_section = 'quaternions' arm_version = 1 - def init(self, context): - super(QuaternionNode, self).init(context) - self.add_input('NodeSocketFloat', 'X') - self.add_input('NodeSocketFloat', 'Y') - self.add_input('NodeSocketFloat', 'Z') - self.add_input('NodeSocketFloat', 'W', default_value=1.0) + def arm_init(self, context): + self.add_input('ArmFloatSocket', 'X') + self.add_input('ArmFloatSocket', 'Y') + self.add_input('ArmFloatSocket', 'Z') + self.add_input('ArmFloatSocket', 'W', default_value=1.0) - self.add_output('NodeSocketVector', 'Quaternion') - self.add_output('NodeSocketVector', 'XYZ') - self.add_output('NodeSocketFloat', 'W') + self.add_output('ArmVectorSocket', 'Quaternion') + self.add_output('ArmVectorSocket', 'XYZ') + self.add_output('ArmFloatSocket', 'W') diff --git a/blender/arm/logicnode/variable/LN_set_variable.py b/blender/arm/logicnode/variable/LN_set_variable.py index d9ed2985..411aca6a 100644 --- a/blender/arm/logicnode/variable/LN_set_variable.py +++ b/blender/arm/logicnode/variable/LN_set_variable.py @@ -13,10 +13,9 @@ class SetVariableNode(ArmLogicTreeNode): arm_section = 'set' arm_version = 1 - def init(self, context): - super(SetVariableNode, self).init(context) + def arm_init(self, context): self.add_input('ArmNodeSocketAction', 'In') - self.add_input('NodeSocketShader', 'Variable', is_var=True) - self.add_input('NodeSocketShader', 'Value') + self.add_input('ArmDynamicSocket', 'Variable', is_var=True) + self.add_input('ArmDynamicSocket', 'Value') self.add_output('ArmNodeSocketAction', 'Out') diff --git a/blender/arm/logicnode/variable/LN_vector.py b/blender/arm/logicnode/variable/LN_vector.py index 630f2a9f..19cf02e7 100644 --- a/blender/arm/logicnode/variable/LN_vector.py +++ b/blender/arm/logicnode/variable/LN_vector.py @@ -6,10 +6,9 @@ class VectorNode(ArmLogicTreeNode): bl_label = 'Vector' arm_version = 1 - def init(self, context): - super(VectorNode, self).init(context) - self.add_input('NodeSocketFloat', 'X') - self.add_input('NodeSocketFloat', 'Y') - self.add_input('NodeSocketFloat', 'Z') + def arm_init(self, context): + self.add_input('ArmFloatSocket', 'X') + self.add_input('ArmFloatSocket', 'Y') + self.add_input('ArmFloatSocket', 'Z') - self.add_output('NodeSocketVector', 'Vector', is_var=True) + self.add_output('ArmVectorSocket', 'Vector', is_var=True) diff --git a/blender/arm/make.py b/blender/arm/make.py index 0ac315b8..a4da2dbf 100755 --- a/blender/arm/make.py +++ b/blender/arm/make.py @@ -18,6 +18,7 @@ import arm.assets as assets from arm.exporter import ArmoryExporter import arm.lib.make_datas import arm.lib.server +import arm.live_patch as live_patch import arm.log as log import arm.make_logic as make_logic import arm.make_renderpath as make_renderpath @@ -246,8 +247,7 @@ def export_data(fp, sdk_path): # Write khafile.js enable_dce = state.is_publish and wrd.arm_dce - import_logic = not state.is_publish and arm.utils.logic_editor_space() != None - write_data.write_khafilejs(state.is_play, export_physics, export_navigation, export_ui, state.is_publish, enable_dce, ArmoryExporter.import_traits, import_logic) + write_data.write_khafilejs(state.is_play, export_physics, export_navigation, export_ui, state.is_publish, enable_dce, ArmoryExporter.import_traits) # Write Main.hx - depends on write_khafilejs for writing number of assets scene_name = arm.utils.get_project_scene_name() @@ -425,9 +425,11 @@ def build(target, is_play=False, is_publish=False, is_export=False): shutil.copy(fn, arm.utils.build_dir() + dest + os.path.basename(fn)) def play_done(): + """Called if the player was stopped/terminated.""" state.proc_play = None state.redraw_ui = True log.clear() + live_patch.stop() def assets_done(): if state.proc_build == None: @@ -473,40 +475,6 @@ def build_done(): else: log.error('Build failed, check console') -def patch(): - if state.proc_build != None: - return - assets.invalidate_enabled = False - fp = arm.utils.get_fp() - os.chdir(fp) - asset_path = arm.utils.get_fp_build() + '/compiled/Assets/' + arm.utils.safestr(bpy.context.scene.name) + '.arm' - ArmoryExporter.export_scene(bpy.context, asset_path, scene=bpy.context.scene) - if not os.path.isdir(arm.utils.build_dir() + '/compiled/Shaders/std'): - raw_shaders_path = arm.utils.get_sdk_path() + '/armory/Shaders/' - shutil.copytree(raw_shaders_path + 'std', arm.utils.build_dir() + '/compiled/Shaders/std') - node_path = arm.utils.get_node_path() - khamake_path = arm.utils.get_khamake_path() - - cmd = [node_path, khamake_path, 'krom'] - cmd.extend(('--shaderversion', '330', '--parallelAssetConversion', '4', - '--to', arm.utils.build_dir() + '/debug', '--nohaxe', '--noproject')) - - assets.invalidate_enabled = True - state.proc_build = run_proc(cmd, patch_done) - -def patch_done(): - js = 'iron.Scene.patch();' - write_patch(js) - state.proc_build = None - -patch_id = 0 - -def write_patch(js): - global patch_id - with open(arm.utils.get_fp_build() + '/debug/krom/krom.patch', 'w') as f: - patch_id += 1 - f.write(str(patch_id) + '\n') - f.write(js) def runtime_to_target(): wrd = bpy.data.worlds['Arm'] @@ -573,6 +541,7 @@ def build_success(): webbrowser.open(html5_app_path) elif wrd.arm_runtime == 'Krom': if wrd.arm_live_patch: + live_patch.start() open(arm.utils.get_fp_build() + '/debug/krom/krom.patch', 'w').close() krom_location, krom_path = arm.utils.krom_paths() os.chdir(krom_location) diff --git a/blender/arm/make_logic.py b/blender/arm/make_logic.py index 6ee7aac8..5ecf42a1 100755 --- a/blender/arm/make_logic.py +++ b/blender/arm/make_logic.py @@ -5,6 +5,7 @@ import bpy from arm.exporter import ArmoryExporter import arm.log +import arm.node_utils import arm.utils parsed_nodes = [] @@ -13,14 +14,16 @@ function_nodes = dict() function_node_outputs = dict() group_name = '' -def get_logic_trees(): + +def get_logic_trees() -> list['arm.nodes_logic.ArmLogicTree']: ar = [] for node_group in bpy.data.node_groups: if node_group.bl_idname == 'ArmLogicTreeType': - node_group.use_fake_user = True # Keep fake references for now + node_group.use_fake_user = True # Keep fake references for now ar.append(node_group) return ar + # Generating node sources def build(): os.chdir(arm.utils.get_fp()) @@ -34,7 +37,7 @@ def build(): for tree in trees: build_node_tree(tree) -def build_node_tree(node_group): +def build_node_tree(node_group: 'arm.nodes_logic.ArmLogicTree'): global parsed_nodes global parsed_ids global function_nodes @@ -48,12 +51,8 @@ def build_node_tree(node_group): pack_path = arm.utils.safestr(bpy.data.worlds['Arm'].arm_project_package) path = 'Sources/' + pack_path.replace('.', '/') + '/node/' - group_name = arm.utils.safesrc(node_group.name[0].upper() + node_group.name[1:]) - - if group_name != node_group.name: - arm.log.warn('Logic node tree and generated trait names differ! Node' - f' tree: "{node_group.name}", trait: "{group_name}"') + group_name = arm.node_utils.get_export_tree_name(node_group, do_warn=True) file = path + group_name + '.hx' # Import referenced node group @@ -65,17 +64,29 @@ def build_node_tree(node_group): if node_group.arm_cached and os.path.isfile(file): return + wrd = bpy.data.worlds['Arm'] + with open(file, 'w', encoding="utf-8") as f: f.write('package ' + pack_path + '.node;\n\n') + f.write('@:access(armory.logicnode.LogicNode)') f.write('@:keep class ' + group_name + ' extends armory.logicnode.LogicTree {\n\n') f.write('\tvar functionNodes:Map;\n\n') f.write('\tvar functionOutputNodes:Map;\n\n') f.write('\tpublic function new() {\n') f.write('\t\tsuper();\n') - if bpy.data.worlds['Arm'].arm_debug_console: + if wrd.arm_debug_console: f.write('\t\tname = "' + group_name + '";\n') f.write('\t\tthis.functionNodes = new Map();\n') f.write('\t\tthis.functionOutputNodes = new Map();\n') + if arm.utils.is_livepatch_enabled(): + # Store a reference to this trait instance in Logictree.nodeTrees + f.write('\t\tvar nodeTrees = armory.logicnode.LogicTree.nodeTrees;\n') + f.write(f'\t\tif (nodeTrees.exists("{group_name}")) ' + '{\n') + f.write(f'\t\t\tnodeTrees["{group_name}"].push(this);\n') + f.write('\t\t} else {\n') + f.write(f'\t\t\tnodeTrees["{group_name}"] = cast [this];\n') + f.write('\t\t}\n') + f.write('\t\tnotifyOnRemove(() -> { nodeTrees.remove("' + group_name + '"); });\n') f.write('\t\tnotifyOnAdd(add);\n') f.write('\t}\n\n') f.write('\toverride public function add() {\n') @@ -109,6 +120,8 @@ def build_node(node: bpy.types.Node, f: TextIO) -> Optional[str]: global parsed_nodes global parsed_ids + use_live_patch = arm.utils.is_livepatch_enabled() + if node.type == 'REROUTE': if len(node.inputs) > 0 and len(node.inputs[0].links) > 0: return build_node(node.inputs[0].links[0].from_node, f) @@ -116,7 +129,7 @@ def build_node(node: bpy.types.Node, f: TextIO) -> Optional[str]: return None # Get node name - name = '_' + arm.utils.safesrc(node.name) + name = arm.node_utils.get_export_node_name(node) # Link nodes using IDs if node.arm_logic_id != '': @@ -143,35 +156,28 @@ def build_node(node: bpy.types.Node, f: TextIO) -> Optional[str]: # Index function output name by corresponding function name function_node_outputs[node.function_name] = name + wrd = bpy.data.worlds['Arm'] + # Watch in debug console - if node.arm_watch and bpy.data.worlds['Arm'].arm_debug_console: + if node.arm_watch and wrd.arm_debug_console: f.write('\t\t' + name + '.name = "' + name[1:] + '";\n') f.write('\t\t' + name + '.watch(true);\n') + elif use_live_patch: + f.write('\t\t' + name + '.name = "' + name[1:] + '";\n') + f.write(f'\t\tthis.nodes["{name[1:]}"] = {name};\n') + # Properties - for i in range(0, 10): - prop_name = 'property' + str(i) + '_get' - prop_found = hasattr(node, prop_name) - if not prop_found: - prop_name = 'property' + str(i) - prop_found = hasattr(node, prop_name) - if prop_found: - prop = getattr(node, prop_name) - if isinstance(prop, str): - prop = '"' + str(prop) + '"' - elif isinstance(prop, bool): - prop = str(prop).lower() - elif hasattr(prop, 'name'): # PointerProperty - prop = '"' + str(prop.name) + '"' - else: - if prop is None: - prop = 'null' - else: - prop = str(prop) - f.write('\t\t' + name + '.property' + str(i) + ' = ' + prop + ';\n') + for prop_py_name, prop_hx_name in arm.node_utils.get_haxe_property_names(node): + prop = arm.node_utils.haxe_format_prop_value(node, prop_py_name) + f.write('\t\t' + name + '.' + prop_hx_name + ' = ' + prop + ';\n') + + # Avoid unnecessary input/output array resizes + f.write(f'\t\t{name}.preallocInputs({len(node.inputs)});\n') + f.write(f'\t\t{name}.preallocOutputs({len(node.outputs)});\n') # Create inputs - for inp in node.inputs: + for idx, inp in enumerate(node.inputs): # True if the input is connected to a unlinked reroute # somewhere down the reroute line unconnected = False @@ -199,34 +205,40 @@ def build_node(node: bpy.types.Node, f: TextIO) -> Optional[str]: for i in range(0, len(n.outputs)): if n.outputs[i] == socket: inp_from = i + from_type = socket.arm_socket_type break # Not linked -> create node with default values else: inp_name = build_default_node(inp) inp_from = 0 + from_type = inp.arm_socket_type # The input is linked to a reroute, but the reroute is unlinked if unconnected: inp_name = build_default_node(inp) inp_from = 0 + from_type = inp.arm_socket_type # Add input - f.write('\t\t' + name + '.addInput(' + inp_name + ', ' + str(inp_from) + ');\n') + f.write(f'\t\t{"var __link = " if use_live_patch else ""}armory.logicnode.LogicNode.addLink({inp_name}, {name}, {inp_from}, {idx});\n') + if use_live_patch: + to_type = inp.arm_socket_type + f.write(f'\t\t__link.fromType = "{from_type}";\n') + f.write(f'\t\t__link.toType = "{to_type}";\n') + f.write(f'\t\t__link.toValue = {arm.node_utils.haxe_format_socket_val(inp.get_default_value())};\n') # Create outputs - for out in node.outputs: - if out.is_linked: - out_name = '' - for node in collect_nodes_from_output(out, f): - out_name += '[' if len(out_name) == 0 else ', ' - out_name += node - out_name += ']' - # Not linked - create node with default values - else: - out_name = '[' + build_default_node(out) + ']' - # Add outputs - f.write('\t\t' + name + '.addOutputs(' + out_name + ');\n') + for idx, out in enumerate(node.outputs): + # Linked outputs are already handled after iterating over inputs + # above, so only unconnected outputs are handled here + if not out.is_linked: + f.write(f'\t\t{"var __link = " if use_live_patch else ""}armory.logicnode.LogicNode.addLink({name}, {build_default_node(out)}, {idx}, 0);\n') + if use_live_patch: + out_type = out.arm_socket_type + f.write(f'\t\t__link.fromType = "{out_type}";\n') + f.write(f'\t\t__link.toType = "{out_type}";\n') + f.write(f'\t\t__link.toValue = {arm.node_utils.haxe_format_socket_val(out.get_default_value())};\n') return name @@ -270,40 +282,31 @@ def get_root_nodes(node_group): def build_default_node(inp: bpy.types.NodeSocket): """Creates a new node to give a not connected input socket a value""" - is_custom_socket = isinstance(inp, arm.logicnode.arm_sockets.ArmCustomSocket) if is_custom_socket: # ArmCustomSockets need to implement get_default_value() default_value = inp.get_default_value() - if isinstance(default_value, str): - default_value = '"{:s}"'.format(default_value.replace('"', '\\"') ) inp_type = inp.arm_socket_type # any custom socket's `type` is "VALUE". might as well have valuable type information for custom nodes as well. else: if hasattr(inp, 'default_value'): default_value = inp.default_value else: default_value = None - if isinstance(default_value, str): - default_value = '"{:s}"'.format(default_value.replace('"', '\\"') ) inp_type = inp.type - # Don't write 'None' into the Haxe code - if default_value is None: - default_value = 'null' + default_value = arm.node_utils.haxe_format_socket_val(default_value, array_outer_brackets=False) if inp_type == 'VECTOR': - return f'new armory.logicnode.VectorNode(this, {default_value[0]}, {default_value[1]}, {default_value[2]})' - elif inp_type == 'RGBA': - return f'new armory.logicnode.ColorNode(this, {default_value[0]}, {default_value[1]}, {default_value[2]}, {default_value[3]})' - elif inp_type == 'RGB': - return f'new armory.logicnode.ColorNode(this, {default_value[0]}, {default_value[1]}, {default_value[2]})' + return f'new armory.logicnode.VectorNode(this, {default_value})' + elif inp_type in ('RGB', 'RGBA'): + return f'new armory.logicnode.ColorNode(this, {default_value})' elif inp_type == 'VALUE': return f'new armory.logicnode.FloatNode(this, {default_value})' elif inp_type == 'INT': return f'new armory.logicnode.IntegerNode(this, {default_value})' elif inp_type == 'BOOLEAN': - return f'new armory.logicnode.BooleanNode(this, {str(default_value).lower()})' + return f'new armory.logicnode.BooleanNode(this, {default_value})' elif inp_type == 'STRING': return f'new armory.logicnode.StringNode(this, {default_value})' elif inp_type == 'NONE': diff --git a/blender/arm/node_utils.py b/blender/arm/node_utils.py index e8808f49..ef465b32 100755 --- a/blender/arm/node_utils.py +++ b/blender/arm/node_utils.py @@ -1,8 +1,15 @@ -from typing import Type +import collections +from typing import Any, Generator, Type, Union import bpy +import mathutils +from bpy.types import NodeSocket, NodeInputs, NodeOutputs from nodeitems_utils import NodeItem +import arm.log +import arm.logicnode.arm_sockets +import arm.utils + def find_node_by_link(node_group, to_node, inp): for link in node_group.links: @@ -46,6 +53,125 @@ def get_output_node(node_group, from_node, output_index): return link.to_node +def get_socket_index(sockets: Union[NodeInputs, NodeOutputs], socket: NodeSocket) -> int: + """Find the socket index in the given node input or output + collection, return -1 if not found. + """ + for i in range(0, len(sockets)): + if sockets[i] == socket: + return i + return -1 + + +def get_socket_default(socket: NodeSocket) -> Any: + """Get the socket's default value, or `None` if it doesn't exist.""" + if isinstance(socket, arm.logicnode.arm_sockets.ArmCustomSocket): + if socket.arm_socket_type != 'NONE': + return socket.default_value_raw + + # Shader-type sockets don't have a default value + elif socket.type != 'SHADER': + return socket.default_value + + return None + + +def set_socket_default(socket: NodeSocket, value: Any): + """Set the socket's default value if it exists.""" + if isinstance(socket, arm.logicnode.arm_sockets.ArmCustomSocket): + if socket.arm_socket_type != 'NONE': + socket.default_value_raw = value + + # Shader-type sockets don't have a default value + elif socket.type != 'SHADER': + socket.default_value = value + + +def get_export_tree_name(tree: bpy.types.NodeTree, do_warn=False) -> str: + """Return the name of the given node tree that's used in the + exported Haxe code. + + If `do_warn` is true, a warning is displayed if the export name + differs from the actual tree name. + """ + export_name = arm.utils.safesrc(tree.name[0].upper() + tree.name[1:]) + + if export_name != tree.name: + arm.log.warn('Logic node tree and generated trait names differ! Node' + f' tree: "{tree.name}", trait: "{export_name}"') + + return export_name + + +def get_export_node_name(node: bpy.types.Node) -> str: + """Return the name of the given node that's used in the exported + Haxe code. + """ + return '_' + arm.utils.safesrc(node.name) + + +def get_haxe_property_names(node: bpy.types.Node) -> Generator[tuple[str, str], None, None]: + """Generator that yields the names of all node properties that have + a counterpart in the node's Haxe class. + """ + for i in range(0, 10): + prop_name = f'property{i}_get' + prop_found = hasattr(node, prop_name) + if not prop_found: + prop_name = f'property{i}' + prop_found = hasattr(node, prop_name) + if prop_found: + # Haxe properties are called property0 - property9 even if + # their Python equivalent can end with '_get', so yield + # both names + yield prop_name, f'property{i}' + + +def haxe_format_socket_val(socket_val: Any, array_outer_brackets=True) -> str: + """Formats a socket value to be valid Haxe syntax. + + If `array_outer_brackets` is false, no square brackets are put + around array values. + + Make sure that elements of sequence types are not yet in Haxe + syntax, otherwise they are strings and get additional quotes! + """ + if isinstance(socket_val, bool): + socket_val = str(socket_val).lower() + + elif isinstance(socket_val, str): + socket_val = '"{:s}"'.format(socket_val.replace('"', '\\"')) + + elif isinstance(socket_val, (collections.Sequence, bpy.types.bpy_prop_array, mathutils.Color, mathutils.Euler, mathutils.Vector)): + socket_val = ','.join(haxe_format_socket_val(v, array_outer_brackets=True) for v in socket_val) + if array_outer_brackets: + socket_val = f'[{socket_val}]' + + elif socket_val is None: + # Don't write 'None' into the Haxe code + socket_val = 'null' + + return str(socket_val) + + +def haxe_format_prop_value(node: bpy.types.Node, prop_name: str) -> str: + """Formats a property value to be valid Haxe syntax.""" + prop_value = getattr(node, prop_name) + if isinstance(prop_value, str): + prop_value = '"' + str(prop_value) + '"' + elif isinstance(prop_value, bool): + prop_value = str(prop_value).lower() + elif hasattr(prop_value, 'name'): # PointerProperty + prop_value = '"' + str(prop_value.name) + '"' + else: + if prop_value is None: + prop_value = 'null' + else: + prop_value = str(prop_value) + + return prop_value + + def nodetype_to_nodeitem(node_type: Type[bpy.types.Node]) -> NodeItem: """Create a NodeItem from a given node class.""" # Internal node types seem to have no bl_idname attribute diff --git a/blender/arm/props.py b/blender/arm/props.py index 5533755f..8f3d9af2 100755 --- a/blender/arm/props.py +++ b/blender/arm/props.py @@ -493,18 +493,25 @@ def init_properties_on_load(): def update_armory_world(): global arm_version wrd = bpy.data.worlds['Arm'] + # Outdated project - if bpy.data.filepath != '' and (wrd.arm_version != arm_version or wrd.arm_commit != arm_commit): # Call on project load only - # This allows for seamless migration from ealier versions of Armory - for rp in wrd.arm_rplist: # TODO: deprecated + file_version = tuple(map(int, wrd.arm_version.split('.'))) + sdk_version = tuple(map(int, arm_version.split('.'))) + if bpy.data.filepath != '' and (file_version < sdk_version or wrd.arm_commit != arm_commit): + # This allows for seamless migration from earlier versions of Armory + for rp in wrd.arm_rplist: # TODO: deprecated if rp.rp_gi != 'Off': rp.rp_gi = 'Off' rp.rp_voxelao = True - # Replace deprecated nodes + if file_version < (2021, 8): + # There were breaking changes in SDK 2021.08, use a special + # update routine first before regularly replacing nodes + arm.logicnode.replacement.node_compat_sdk2108() + arm.logicnode.replacement.replace_all() - print('Project updated to sdk v' + arm_version + ' (' + arm_commit + ')') + print(f'Project updated to SDK v{arm_version}({arm_commit})') wrd.arm_version = arm_version wrd.arm_commit = arm_commit arm.make.clean() diff --git a/blender/arm/utils.py b/blender/arm/utils.py index f790036c..dc468a8d 100755 --- a/blender/arm/utils.py +++ b/blender/arm/utils.py @@ -78,6 +78,15 @@ def convert_image(image, path, file_format='JPEG'): ren.image_settings.file_format = orig_file_format ren.image_settings.color_mode = orig_color_mode + +def is_livepatch_enabled(): + """Returns whether live patch is enabled and can be used.""" + wrd = bpy.data.worlds['Arm'] + # If the game is published, the target is krom-[OS] and not krom, + # so there is no live patch when publishing + return wrd.arm_live_patch and state.target == 'krom' + + def blend_name(): return bpy.path.basename(bpy.context.blend_data.filepath).rsplit('.', 1)[0] @@ -948,6 +957,10 @@ def get_link_web_server(): def compare_version_blender_arm(): return not (bpy.app.version[0] != 2 or bpy.app.version[1] != 93) +def get_file_arm_version_tuple() -> tuple[int]: + wrd = bpy.data.worlds['Arm'] + return tuple(map(int, wrd.arm_version.split('.'))) + def type_name_to_type(name: str) -> bpy.types.bpy_struct: """Return the Blender type given by its name, if registered.""" return bpy.types.bpy_struct.bl_rna_get_subclass_py(name) @@ -977,11 +990,11 @@ def get_visual_studio_from_version(version: str) -> str: def get_list_installed_vs(get_version: bool, get_name: bool, get_path: bool) -> []: err = '' items = [] - path_file = os.path.join(get_sdk_path(), 'Kha', 'Kinc', 'Tools', 'kincmake', 'Data', 'windows', 'vswhere.exe') + path_file = os.path.join(get_sdk_path(), 'Kha', 'Kinc', 'Tools', 'kincmake', 'Data', 'windows', 'vswhere.exe') if not os.path.isfile(path_file): err = 'File "'+ path_file +'" not found.' return items, err - + if (not get_version) and (not get_name) and (not get_path): return items, err @@ -1007,8 +1020,8 @@ def get_list_installed_vs(get_version: bool, get_name: bool, get_path: bool) -> return items, err for i in range(count_items): - v = items_ver[i][0] if len(items_ver) > i else '' - v_full = items_ver[i][1] if len(items_ver) > i else '' + v = items_ver[i][0] if len(items_ver) > i else '' + v_full = items_ver[i][1] if len(items_ver) > i else '' n = items_name[i] if len(items_name) > i else '' p = items_path[i] if len(items_path) > i else '' items.append((v, n, p, v_full)) diff --git a/blender/arm/write_data.py b/blender/arm/write_data.py index 4d2aadda..0eb56dc9 100755 --- a/blender/arm/write_data.py +++ b/blender/arm/write_data.py @@ -54,7 +54,7 @@ def remove_readonly(func, path, excinfo): def write_khafilejs(is_play, export_physics: bool, export_navigation: bool, export_ui: bool, is_publish: bool, - enable_dce: bool, import_traits: List[str], import_logicnodes) -> None: + enable_dce: bool, import_traits: List[str]) -> None: wrd = bpy.data.worlds['Arm'] sdk_path = arm.utils.get_sdk_path() @@ -160,20 +160,20 @@ project.addSources('Sources'); # if export_navigation: # khafile.write("""project.addParameter("--macro include('armory.trait.navigation')");\n""") - # if import_logicnodes: # Live patching for logic nodes - # khafile.write("""project.addParameter("--macro include('armory.logicnode')");\n""") - if not wrd.arm_compiler_inline: khafile.write("project.addParameter('--no-inline');\n") if enable_dce: khafile.write("project.addParameter('-dce full');\n") - live_patch = wrd.arm_live_patch and state.target == 'krom' - if wrd.arm_debug_console or live_patch: + use_live_patch = arm.utils.is_livepatch_enabled() + if wrd.arm_debug_console or use_live_patch: import_traits.append('armory.trait.internal.Bridge') - if live_patch: + if use_live_patch: assets.add_khafile_def('arm_patch') + # Include all logic node classes so that they can later + # get instantiated + khafile.write("""project.addParameter("--macro include('armory.logicnode')");\n""") import_traits = list(set(import_traits)) for i in range(0, len(import_traits)):