#pragma once #include #include namespace ed = ax::NodeEditor; namespace td { class NodeEditorState : public DisplayState { public: enum class PinType { Flow, Bool, Int, Float, String, Object, Function, Delegate, }; enum class PinKind { Output, Input }; enum class NodeType { Blueprint, Simple, Tree, Comment, Houdini }; struct Pin; struct Node { ed::NodeId ID; std::string Name; std::vector Inputs; std::vector Outputs; ImColor Color; NodeType Type; ImVec2 Size; std::string State; std::string SavedState; Node(int id, const char* name, ImColor color = ImColor(255, 255, 255)) : ID(id), Name(name), Color(color), Type(NodeType::Blueprint), Size(0, 0) {} }; struct Pin { ed::PinId ID; ::td::NodeEditorState::Node* Node; std::string Name; PinType Type; PinKind Kind; Pin(int id, const char* name, PinType type) : ID(id), Node(nullptr), Name(name), Type(type), Kind(PinKind::Input) {} }; struct Link { ed::LinkId ID; ed::PinId StartPinID; ed::PinId EndPinID; ImColor Color; Link(ed::LinkId id, ed::PinId startPinId, ed::PinId endPinId) : ID(id), StartPinID(startPinId), EndPinID(endPinId), Color(255, 255, 255) {} }; struct NodeIdLess { bool operator()(const ed::NodeId& lhs, const ed::NodeId& rhs) const { return lhs.AsPointer() < rhs.AsPointer(); } }; int m_NextId = 1; const int m_PinIconSize = 24; std::vector m_Nodes; std::vector m_Links; ImTextureID m_HeaderBackground = 0; ImTextureID m_SaveIcon = 0; ImTextureID m_RestoreIcon = 0; const float m_TouchTime = 1.0f; std::map m_NodeTouchTime; bool m_ShowOrdinals = false; public: NodeEditorState(Display& a_Display); ~NodeEditorState(); virtual void Update(float a_Delta) override; private: int GetNextId(); ed::LinkId GetNextLinkId(); void TouchNode(ed::NodeId id); float GetTouchProgress(ed::NodeId id); void UpdateTouch(); Node* FindNode(ed::NodeId id); Link* FindLink(ed::LinkId id); Pin* FindPin(ed::PinId id); bool IsPinLinked(ed::PinId id); bool CanCreateLink(Pin* a, Pin* b); void BuildNode(Node* node); Node* SpawnInputActionNode(); Node* SpawnBranchNode(); Node* SpawnDoNNode(); Node* SpawnOutputActionNode(); Node* SpawnPrintStringNode(); Node* SpawnMessageNode(); Node* SpawnSetTimerNode(); Node* SpawnLessNode(); Node* SpawnWeirdNode(); Node* SpawnTraceByChannelNode(); Node* SpawnTreeSequenceNode(); Node* SpawnTreeTaskNode(); Node* SpawnTreeTask2Node(); Node* SpawnComment(); Node* SpawnHoudiniTransformNode(); Node* SpawnHoudiniGroupNode(); void BuildNodes(); ImColor GetIconColor(PinType type); void DrawPinIcon(const Pin& pin, bool connected, int alpha); void ShowStyleEditor(bool* show = nullptr); void ShowLeftPane(float paneWidth); }; } // namespace td