#include "nodes.h" #include "app.h" namespace NodeSpawner { // Helper macro to create and add node to container #define SPAWN_NODE_IMPL(NAME, CONSTRUCTOR_ARGS, ...) \ Node* NAME(App* app) \ { \ int nodeId = app->GetNextId(); \ Node newNode CONSTRUCTOR_ARGS; \ __VA_ARGS__ \ app->BuildNode(&newNode); \ auto* rootContainer = app->GetActiveRootContainer(); \ if (rootContainer) \ return rootContainer->AddNode(newNode); \ return nullptr; \ } SPAWN_NODE_IMPL(SpawnInputActionNode, (nodeId, "InputAction Fire", ImColor(255, 128, 128)), newNode.Outputs.emplace_back(app->GetNextId(), "", PinType::Delegate); newNode.Outputs.emplace_back(app->GetNextId(), "Pressed", PinType::Flow); newNode.Outputs.emplace_back(app->GetNextId(), "Released", PinType::Flow); ) SPAWN_NODE_IMPL(SpawnBranchNode, (nodeId, "Branch"), newNode.Inputs.emplace_back(app->GetNextId(), "", PinType::Flow); newNode.Inputs.emplace_back(app->GetNextId(), "Condition", PinType::Bool); newNode.Outputs.emplace_back(app->GetNextId(), "True", PinType::Flow); newNode.Outputs.emplace_back(app->GetNextId(), "False", PinType::Flow); ) SPAWN_NODE_IMPL(SpawnDoNNode, (nodeId, "Do N"), newNode.Inputs.emplace_back(app->GetNextId(), "Enter", PinType::Flow); newNode.Inputs.emplace_back(app->GetNextId(), "N", PinType::Int); newNode.Inputs.emplace_back(app->GetNextId(), "Reset", PinType::Flow); newNode.Outputs.emplace_back(app->GetNextId(), "Exit", PinType::Flow); newNode.Outputs.emplace_back(app->GetNextId(), "Counter", PinType::Int); ) SPAWN_NODE_IMPL(SpawnOutputActionNode, (nodeId, "OutputAction"), newNode.Inputs.emplace_back(app->GetNextId(), "Sample", PinType::Float); newNode.Outputs.emplace_back(app->GetNextId(), "Condition", PinType::Bool); newNode.Inputs.emplace_back(app->GetNextId(), "Event", PinType::Delegate); ) SPAWN_NODE_IMPL(SpawnPrintStringNode, (nodeId, "Print String"), newNode.Inputs.emplace_back(app->GetNextId(), "", PinType::Flow); newNode.Inputs.emplace_back(app->GetNextId(), "In String", PinType::String); newNode.Outputs.emplace_back(app->GetNextId(), "", PinType::Flow); ) SPAWN_NODE_IMPL(SpawnMessageNode, (nodeId, "", ImColor(128, 195, 248)), newNode.Type = NodeType::Simple; newNode.Outputs.emplace_back(app->GetNextId(), "Message", PinType::String); ) SPAWN_NODE_IMPL(SpawnSetTimerNode, (nodeId, "Set Timer", ImColor(128, 195, 248)), newNode.Inputs.emplace_back(app->GetNextId(), "", PinType::Flow); newNode.Inputs.emplace_back(app->GetNextId(), "Object", PinType::Object); newNode.Inputs.emplace_back(app->GetNextId(), "Function Name", PinType::Function); newNode.Inputs.emplace_back(app->GetNextId(), "Time", PinType::Float); newNode.Inputs.emplace_back(app->GetNextId(), "Looping", PinType::Bool); newNode.Outputs.emplace_back(app->GetNextId(), "", PinType::Flow); ) SPAWN_NODE_IMPL(SpawnLessNode, (nodeId, "<", ImColor(128, 195, 248)), newNode.Type = NodeType::Simple; newNode.Inputs.emplace_back(app->GetNextId(), "", PinType::Float); newNode.Inputs.emplace_back(app->GetNextId(), "", PinType::Float); newNode.Outputs.emplace_back(app->GetNextId(), "", PinType::Float); ) SPAWN_NODE_IMPL(SpawnWeirdNode, (nodeId, "o.O", ImColor(128, 195, 248)), newNode.Type = NodeType::Simple; newNode.Inputs.emplace_back(app->GetNextId(), "", PinType::Float); newNode.Outputs.emplace_back(app->GetNextId(), "", PinType::Float); newNode.Outputs.emplace_back(app->GetNextId(), "", PinType::Float); ) SPAWN_NODE_IMPL(SpawnTraceByChannelNode, (nodeId, "Single Line Trace by Channel", ImColor(255, 128, 64)), newNode.Inputs.emplace_back(app->GetNextId(), "", PinType::Flow); newNode.Inputs.emplace_back(app->GetNextId(), "Start", PinType::Flow); newNode.Inputs.emplace_back(app->GetNextId(), "End", PinType::Int); newNode.Inputs.emplace_back(app->GetNextId(), "Trace Channel", PinType::Float); newNode.Inputs.emplace_back(app->GetNextId(), "Trace Complex", PinType::Bool); newNode.Inputs.emplace_back(app->GetNextId(), "Actors to Ignore", PinType::Int); newNode.Inputs.emplace_back(app->GetNextId(), "Draw Debug Type", PinType::Bool); newNode.Inputs.emplace_back(app->GetNextId(), "Ignore Self", PinType::Bool); newNode.Outputs.emplace_back(app->GetNextId(), "", PinType::Flow); newNode.Outputs.emplace_back(app->GetNextId(), "Out Hit", PinType::Float); newNode.Outputs.emplace_back(app->GetNextId(), "Return Value", PinType::Bool); ) SPAWN_NODE_IMPL(SpawnTreeSequenceNode, (nodeId, "Sequence"), newNode.Type = NodeType::Tree; newNode.Inputs.emplace_back(app->GetNextId(), "", PinType::Flow); newNode.Outputs.emplace_back(app->GetNextId(), "", PinType::Flow); ) SPAWN_NODE_IMPL(SpawnTreeTaskNode, (nodeId, "Move To"), newNode.Type = NodeType::Tree; newNode.Inputs.emplace_back(app->GetNextId(), "", PinType::Flow); ) SPAWN_NODE_IMPL(SpawnTreeTask2Node, (nodeId, "Random Wait"), newNode.Type = NodeType::Tree; newNode.Inputs.emplace_back(app->GetNextId(), "", PinType::Flow); ) SPAWN_NODE_IMPL(SpawnComment, (nodeId, "Test Comment"), newNode.Type = NodeType::Comment; newNode.Size = ImVec2(300, 200); ) SPAWN_NODE_IMPL(SpawnHoudiniTransformNode, (nodeId, "Transform"), newNode.Type = NodeType::Houdini; newNode.Inputs.emplace_back(app->GetNextId(), "Out", PinType::Flow); newNode.Outputs.emplace_back(app->GetNextId(), "", PinType::Flow); ) SPAWN_NODE_IMPL(SpawnHoudiniGroupNode, (nodeId, "Group"), newNode.Type = NodeType::Houdini; newNode.Inputs.emplace_back(app->GetNextId(), "", PinType::Flow); newNode.Inputs.emplace_back(app->GetNextId(), "", PinType::Flow); newNode.Outputs.emplace_back(app->GetNextId(), "", PinType::Flow); ) #undef SPAWN_NODE_IMPL } // namespace NodeSpawner