128 lines
2.9 KiB
C++
128 lines
2.9 KiB
C++
#pragma once
|
|
|
|
#include <td/display/DisplayState.h>
|
|
|
|
#include <imgui_node_editor.h>
|
|
|
|
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<Pin> Inputs;
|
|
std::vector<Pin> 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<Node> m_Nodes;
|
|
std::vector<Link> m_Links;
|
|
ImTextureID m_HeaderBackground = 0;
|
|
ImTextureID m_SaveIcon = 0;
|
|
ImTextureID m_RestoreIcon = 0;
|
|
const float m_TouchTime = 1.0f;
|
|
std::map<ed::NodeId, float, NodeIdLess> 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
|