Polyphase Game Engine
Loading...
Searching...
No Matches
GraphNode.h
Go to the documentation of this file.
1#pragma once
2
3#include "Factory.h"
4#include "Object.h"
7#include "Maths.h"
8
9#include <string>
10#include <vector>
11
12class NodeGraph;
13class Stream;
14
16{
17 const char* mName;
18 int32_t mValue;
19};
20
21#define DECLARE_GRAPH_NODE(Class, Parent) \
22 DECLARE_FACTORY(Class, GraphNode); \
23 DECLARE_OBJECT(Class, Parent); \
24 typedef Parent Super;
25
26#define DEFINE_GRAPH_NODE(Class) \
27 DEFINE_FACTORY(Class, GraphNode); \
28 DEFINE_OBJECT(Class);
29
30// Register a custom graph node type with a domain.
31// Place this in your .cpp file after DEFINE_GRAPH_NODE.
32// The node will be added to the specified domain's context menu.
33//
34// Usage:
35// REGISTER_GRAPH_NODE(MyNode, "My Node", "Custom", "Material", glm::vec4(0.8f, 0.4f, 0.1f, 1.0f));
36//
37// Parameters:
38// Class - The node class name (must match DEFINE_GRAPH_NODE)
39// TypeName - Display name shown in the context menu
40// Category - Category grouping in the context menu
41// DomainName - Domain to register with (e.g. "Material"). Created if it doesn't exist.
42// Color - Node header color as glm::vec4
43void RegisterExternalGraphNode(uint32_t typeId, const char* typeName, const char* category, const char* domainName, const glm::vec4& color);
44
45#define REGISTER_GRAPH_NODE(Class, TypeName, Category, DomainName, Color) \
46 namespace { struct AutoRegGraphNode_##Class { AutoRegGraphNode_##Class() { \
47 RegisterExternalGraphNode(OctHashString(#Class), TypeName, Category, DomainName, Color); \
48 }} s_autoRegGraphNode_##Class; }
49
50// Register a custom graph node type with multiple domains at once.
51// Place this in your .cpp file after DEFINE_GRAPH_NODE.
52//
53// Usage:
54// REGISTER_GRAPH_NODE_MULTI(MyNode, "My Node", "Custom", glm::vec4(0.8f, 0.4f, 0.1f, 1.0f), "Material", "Shader");
55//
56// Parameters:
57// Class - The node class name (must match DEFINE_GRAPH_NODE)
58// TypeName - Display name shown in the context menu
59// Category - Category grouping in the context menu
60// Color - Node header color as glm::vec4
61// ... - One or more domain name strings
62void RegisterExternalGraphNodeMulti(uint32_t typeId, const char* typeName, const char* category,
63 const char** domainNames, uint32_t domainCount, const glm::vec4& color);
64
65#define REGISTER_GRAPH_NODE_MULTI(Class, TypeName, Category, Color, ...) \
66 namespace { struct AutoRegGraphNodeMulti_##Class { AutoRegGraphNodeMulti_##Class() { \
67 static const char* sDomains[] = { __VA_ARGS__ }; \
68 RegisterExternalGraphNodeMulti(OctHashString(#Class), TypeName, Category, \
69 sDomains, sizeof(sDomains)/sizeof(sDomains[0]), Color); \
70 }} s_autoRegGraphNodeMulti_##Class; }
71
72class GraphNode : public Object
73{
74public:
75
79
80 GraphNode();
81 virtual ~GraphNode();
82
83 virtual void SetupPins();
84 virtual void Evaluate();
85
86 virtual const char* GetNodeTypeName() const { return "Node"; }
87 virtual const char* GetNodeCategory() const { return "General"; }
88 virtual glm::vec4 GetNodeColor() const;
89
90 virtual bool IsInputNode() const { return false; }
91 virtual bool IsFlowNode() const { return false; }
92 virtual bool IsEventNode() const { return false; }
93 virtual const char* GetEventName() const { return ""; }
94 virtual const std::string& GetInputName() const;
95 virtual void SetInputName(const std::string& name) {}
96
97 // Graph back-pointer
98 void SetGraph(NodeGraph* graph) { mGraph = graph; }
99 NodeGraph* GetGraph() const { return mGraph; }
100
101 // Execution pin helpers
102 void TriggerExecutionPin(uint32_t outputPinIndex);
103 bool WasExecutionTriggered(uint32_t inputPinIndex) const;
104
105 virtual void SaveStream(Stream& stream);
106 virtual void LoadStream(Stream& stream, uint32_t version);
107 virtual void CopyCustomData(const GraphNode* src) {}
108
109 // Override to provide dropdown options for Integer-type input pins.
110 // Return true and fill outOptions to render a combo box instead of a numeric input.
111 virtual bool GetPinEnumOptions(uint32_t pinIndex, std::vector<PinEnumOption>& outOptions) const { return false; }
112
113 // Datum serialization helpers (used by subclasses for custom pin serialization)
114 static void WriteDatumToStream(Stream& stream, const Datum& datum);
115 static Datum ReadDatumFromStream(Stream& stream);
116
117 GraphPin& AddInputPin(const char* name, DatumType type, const Datum& defaultValue = Datum());
118 GraphPin& AddOutputPin(const char* name, DatumType type);
119
120 GraphPinId GetInputPinId(uint32_t index) const;
121 GraphPinId GetOutputPinId(uint32_t index) const;
122 GraphPin* GetInputPin(uint32_t index);
123 GraphPin* GetOutputPin(uint32_t index);
124 const Datum& GetInputValue(uint32_t index) const;
125 void SetOutputValue(uint32_t index, const Datum& value);
126
127 uint32_t GetNumInputPins() const { return (uint32_t)mInputPins.size(); }
128 uint32_t GetNumOutputPins() const { return (uint32_t)mOutputPins.size(); }
129
130 const std::vector<GraphPin>& GetInputPins() const { return mInputPins; }
131 const std::vector<GraphPin>& GetOutputPins() const { return mOutputPins; }
132 std::vector<GraphPin>& GetInputPins() { return mInputPins; }
133 std::vector<GraphPin>& GetOutputPins() { return mOutputPins; }
134
135 GraphNodeId GetId() const { return mId; }
136 void SetId(GraphNodeId id) { mId = id; }
137
138 const glm::vec2& GetEditorPosition() const { return mEditorPosition; }
139 void SetEditorPosition(const glm::vec2& pos) { mEditorPosition = pos; }
140
141protected:
142
143 NodeGraph* mGraph = nullptr;
145 std::vector<GraphPin> mInputPins;
146 std::vector<GraphPin> mOutputPins;
147 glm::vec2 mEditorPosition = glm::vec2(0.0f);
148
150};
DatumType
Definition Datum.h:28
void RegisterExternalGraphNode(uint32_t typeId, const char *typeName, const char *category, const char *domainName, const glm::vec4 &color)
Definition GraphDomainManager.cpp:40
void RegisterExternalGraphNodeMulti(uint32_t typeId, const char *typeName, const char *category, const char **domainNames, uint32_t domainCount, const glm::vec4 &color)
Definition GraphDomainManager.cpp:51
uint32_t GraphPinId
Definition GraphTypes.h:8
constexpr GraphNodeId INVALID_GRAPH_NODE_ID
Definition GraphTypes.h:11
uint32_t GraphNodeId
Definition GraphTypes.h:7
Definition Datum.h:164
Definition GraphNode.h:73
GraphPin & AddOutputPin(const char *name, DatumType type)
Definition GraphNode.cpp:153
std::vector< GraphPin > & GetInputPins()
Definition GraphNode.h:132
virtual const char * GetNodeCategory() const
Definition GraphNode.h:87
GraphPinId GetInputPinId(uint32_t index) const
Definition GraphNode.cpp:225
GraphPinId mNextPinId
Definition GraphNode.h:149
virtual glm::vec4 GetNodeColor() const
Definition GraphNode.cpp:27
GraphPin * GetOutputPin(uint32_t index)
Definition GraphNode.cpp:252
const Datum & GetInputValue(uint32_t index) const
Definition GraphNode.cpp:261
virtual const char * GetEventName() const
Definition GraphNode.h:93
void TriggerExecutionPin(uint32_t outputPinIndex)
Definition GraphNode.cpp:280
DECLARE_OBJECT(GraphNode, Object)
std::vector< GraphPin > & GetOutputPins()
Definition GraphNode.h:133
void SetGraph(NodeGraph *graph)
Definition GraphNode.h:98
void SetId(GraphNodeId id)
Definition GraphNode.h:136
GraphPin * GetInputPin(uint32_t index)
Definition GraphNode.cpp:243
virtual bool GetPinEnumOptions(uint32_t pinIndex, std::vector< PinEnumOption > &outOptions) const
Definition GraphNode.h:111
const std::vector< GraphPin > & GetOutputPins() const
Definition GraphNode.h:131
std::vector< GraphPin > mOutputPins
Definition GraphNode.h:146
virtual ~GraphNode()
Definition GraphNode.cpp:15
virtual void LoadStream(Stream &stream, uint32_t version)
Definition GraphNode.cpp:97
glm::vec2 mEditorPosition
Definition GraphNode.h:147
void SetOutputValue(uint32_t index, const Datum &value)
Definition GraphNode.cpp:272
std::vector< GraphPin > mInputPins
Definition GraphNode.h:145
virtual void SetupPins()
Definition GraphNode.cpp:19
GraphPin & AddInputPin(const char *name, DatumType type, const Datum &defaultValue=Datum())
Definition GraphNode.cpp:138
virtual void SaveStream(Stream &stream)
Definition GraphNode.cpp:76
virtual void Evaluate()
Definition GraphNode.cpp:23
void SetEditorPosition(const glm::vec2 &pos)
Definition GraphNode.h:139
const glm::vec2 & GetEditorPosition() const
Definition GraphNode.h:138
virtual bool IsFlowNode() const
Definition GraphNode.h:91
virtual bool IsEventNode() const
Definition GraphNode.h:92
static void WriteDatumToStream(Stream &stream, const Datum &datum)
Definition GraphNode.cpp:38
GraphNodeId mId
Definition GraphNode.h:144
GraphNodeId GetId() const
Definition GraphNode.h:135
virtual const std::string & GetInputName() const
Definition GraphNode.cpp:32
uint32_t GetNumOutputPins() const
Definition GraphNode.h:128
NodeGraph * GetGraph() const
Definition GraphNode.h:99
virtual const char * GetNodeTypeName() const
Definition GraphNode.h:86
DECLARE_FACTORY_MANAGER(GraphNode)
const std::vector< GraphPin > & GetInputPins() const
Definition GraphNode.h:130
static Datum ReadDatumFromStream(Stream &stream)
Definition GraphNode.cpp:57
uint32_t GetNumInputPins() const
Definition GraphNode.h:127
GraphNode()
Definition GraphNode.cpp:11
DECLARE_FACTORY(GraphNode, GraphNode)
virtual void SetInputName(const std::string &name)
Definition GraphNode.h:95
virtual void CopyCustomData(const GraphNode *src)
Definition GraphNode.h:107
GraphPinId GetOutputPinId(uint32_t index) const
Definition GraphNode.cpp:234
NodeGraph * mGraph
Definition GraphNode.h:143
bool WasExecutionTriggered(uint32_t inputPinIndex) const
Definition GraphNode.cpp:309
virtual bool IsInputNode() const
Definition GraphNode.h:90
Definition NodeGraph.h:17
Definition Object.h:13
Definition Stream.h:21
Definition GraphPin.h:8
Definition GraphNode.h:16
int32_t mValue
Definition GraphNode.h:18
const char * mName
Definition GraphNode.h:17