#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
|