diff --git a/armorlab/Sources/arm/logic/NodesBrush.hx b/armorlab/Sources/arm/logic/NodesBrush.hx index d4b697a9..fe630063 100644 --- a/armorlab/Sources/arm/logic/NodesBrush.hx +++ b/armorlab/Sources/arm/logic/NodesBrush.hx @@ -5,17 +5,20 @@ import arm.Translator._tr; class NodesBrush { - public static var categories = [_tr("Nodes")]; + public static var categories = [_tr("Input"), _tr("Model")]; public static var list: Array> = [ - [ // Category 0 + [ // Input ImageTextureNode.def, + RGBNode.def, + ], + [ // Model InpaintNode.def, PhotoToPBRNode.def, TextToPhotoNode.def, TilingNode.def, UpscaleNode.def, - VarianceNode.def + VarianceNode.def, ] ]; diff --git a/armorlab/Sources/arm/logic/RGBNode.hx b/armorlab/Sources/arm/logic/RGBNode.hx new file mode 100644 index 00000000..b7ad0c41 --- /dev/null +++ b/armorlab/Sources/arm/logic/RGBNode.hx @@ -0,0 +1,68 @@ +package arm.logic; + +import zui.Nodes; +import iron.math.Vec4; +import arm.logic.LogicNode; +import arm.logic.LogicParser.f32; +import arm.Translator._tr; + +@:keep +class RGBNode extends LogicNode { + + var image: kha.Image = null; + + public function new(tree: LogicTree) { + super(tree); + } + + override function getAsImage(from: Int, done: kha.Image->Void) { + if (image != null) { + App.notifyOnNextFrame(function() { + image.unload(); + }); + } + + var b = haxe.io.Bytes.alloc(16); + var raw = LogicParser.getRawNode(this); + var default_value = raw.outputs[0].default_value; + b.setFloat(0, default_value[0]); + b.setFloat(4, default_value[1]); + b.setFloat(8, default_value[2]); + b.setFloat(12, default_value[3]); + image = kha.Image.fromBytes(b, 1, 1, kha.graphics4.TextureFormat.RGBA128); + done(image); + } + + override public function getCachedImage(): kha.Image { + getAsImage(0, function(img: kha.Image) {}); + return image; + } + + public static var def: TNode = { + id: 0, + name: _tr("RGB"), + type: "RGBNode", + x: 0, + y: 0, + color: 0xffb34f5a, + inputs: [], + outputs: [ + { + id: 0, + node_id: 0, + name: _tr("Color"), + type: "RGBA", + color: 0xffc7c729, + default_value: f32([0.8, 0.8, 0.8, 1.0]) + } + ], + buttons: [ + { + name: _tr("default_value"), + type: "RGBA", + output: 0, + default_value: f32([0.8, 0.8, 0.8, 1.0]) + } + ] + }; +} diff --git a/base/Sources/arm/logic/LogicParser.hx b/base/Sources/arm/logic/LogicParser.hx index 6d48e47d..3e47e7c2 100644 --- a/base/Sources/arm/logic/LogicParser.hx +++ b/base/Sources/arm/logic/LogicParser.hx @@ -13,6 +13,7 @@ class LogicParser { static var parsed_nodes: Array = null; static var parsed_labels: Map = null; static var nodeMap: Map; + static var rawMap: Map; public static var packageName = "arm.logic"; @@ -20,6 +21,10 @@ class LogicParser { return nodeMap.get(node_name(node)); } + public static function getRawNode(node: LogicNode): TNode { + return rawMap.get(node); + } + public static function getNode(id: Int): TNode { for (n in nodes) if (n.id == id) return n; return null; @@ -69,6 +74,7 @@ class LogicParser { parsed_nodes = []; parsed_labels = new Map(); nodeMap = new Map(); + rawMap = new Map(); var root_nodes = get_root_nodes(canvas); tree = new LogicTree(); @@ -96,6 +102,7 @@ class LogicParser { // Create node var v = createClassInstance(node.type, [tree]); nodeMap.set(name, v); + rawMap.set(v, node); // Expose button values in node class for (b in node.buttons) {