PeriDyno 1.0.0
Loading...
Searching...
No Matches
NodePort.h
Go to the documentation of this file.
1
16#pragma once
17#include <string>
18#include <vector>
19#include <memory>
20
21namespace dyno {
22
23 class Node;
24 class FCallBackFunc;
25
32
38 {
39 public:
40 NodePort(std::string name, std::string description, Node* parent = nullptr);
41 virtual ~NodePort() { m_nodes.clear(); };
42
43 virtual std::string getPortName() { return m_name; };
44
46
47 void setPortType(NodePortType portType);
48
49 virtual std::vector<Node*>& getNodes() { return m_nodes; }
50
51
52 virtual bool isKindOf(Node* node) = 0;
53
54 virtual bool hasNode(Node* node) = 0;
55
56 inline Node* getParent() { return m_parent; }
57
58 virtual void clear();
59
60 void attach(std::shared_ptr<FCallBackFunc> func);
61
62 protected:
63 virtual bool addNode(Node* node) = 0;
64
65 virtual bool removeNode(Node* node) = 0;
66
67 //To call all callback function if connected
68 virtual void notify();
69
70 std::vector<Node*> m_nodes;
71
72 private:
73
74 Node* m_parent = nullptr;
75
76 std::string m_name;
77 std::string m_description;
79
80 std::vector<std::shared_ptr<FCallBackFunc>> mCallbackFunc;
81
82 friend class Node;
83 };
84
85 void disconnect(Node* node, NodePort* port);
86
87 template<typename T>
88 class SingleNodePort : public NodePort
89 {
90 public:
91 SingleNodePort(std::string name, std::string description, Node* parent = nullptr)
92 : NodePort(name, description, parent)
93 {
95 this->getNodes().resize(1);
96 };
97
98 ~SingleNodePort() override {
99 //Disconnect nodes from node ports here instead of inside the destructor of Node to avoid memory leak
100 if (m_nodes[0] != nullptr) {
101 disconnect(m_nodes[0], this);
102 //m_nodes[0]->disconnect(this);
103 }
104 m_nodes[0] = nullptr;
105 }
106
107 bool isKindOf(Node* node) override
108 {
109 return nullptr != dynamic_cast<T*>(node) && !hasNode(node);
110 }
111
112 bool hasNode(Node* node)
113 {
114 return m_derived_node == dynamic_cast<T*>(node);
115 }
116
117 std::vector<Node*>& getNodes() override
118 {
119 if (m_nodes.size() != 1)
120 m_nodes.resize(1);
121
122 m_nodes[0] = dynamic_cast<Node*>(m_derived_node);
123
124 return m_nodes;
125 }
126
128 {
129 return m_derived_node;
130 }
131
132 bool setDerivedNode(T* d_node) {
133 if (d_node != nullptr)
134 {
135 if (m_derived_node != nullptr) {
136 m_derived_node = nullptr;
137 }
138
139 m_derived_node = d_node;
140 m_nodes[0] = d_node;
141
142 return true;
143 }
144 else
145 {
146 if (m_derived_node != nullptr)
147 {
148 //this->removeNodeFromParent(dynamic_cast<Node*>(m_derived_node));
149 m_derived_node = nullptr;
150 m_nodes[0] = nullptr;
151 }
152 }
153
154 return false;
155 }
156
157 protected:
158 bool addNode(Node* node) override
159 {
160 auto d_node = dynamic_cast<T*>(node);
161 if (d_node != nullptr)
162 {
163 return setDerivedNode(d_node);
164 }
165
166 return false;
167 }
168
169 bool removeNode(Node* node) override
170 {
171 m_nodes[0] = nullptr;
172 m_derived_node = nullptr;
173
174 return true;
175 }
176
177 private:
178 T* m_derived_node = nullptr;
179 };
180
181
182 template<typename T>
184 {
185 public:
186 MultipleNodePort(std::string name, std::string description, Node* parent = nullptr)
187 : NodePort(name, description, parent)
188 {
190 };
191
193 //Disconnect nodes from node ports here instead of inside the destructor of Node to avoid memory leak
194 for(auto node : m_nodes)
195 {
196 disconnect(node, this);
197 //node->disconnect(this);
198 }
199
200 m_derived_nodes.clear();
201 }
202
203 void clear() override
204 {
205 m_derived_nodes.clear();
206
208 }
209
210 bool addDerivedNode(T* d_node) {
211 if (d_node != nullptr)
212 {
213 auto it = find(m_derived_nodes.begin(), m_derived_nodes.end(), d_node);
214
215 if (it == m_derived_nodes.end())
216 {
217 m_derived_nodes.push_back(d_node);
218
219 //this->addNodeToParent(dynamic_cast<Node*>(d_node));
220
221 return true;
222 }
223 }
224
225 return false;
226 }
227
228 bool removeDerivedNode(T* d_node)
229 {
230 if (d_node != nullptr)
231 {
232 auto it = find(m_derived_nodes.begin(), m_derived_nodes.end(), d_node);
233
234 if (it != m_derived_nodes.end())
235 {
236 m_derived_nodes.erase(it);
237 //this->removeNodeFromParent(dynamic_cast<Node*>(d_node));
238
239 return true;
240 }
241 }
242
243 return false;
244 }
245
246 bool isKindOf(Node* node) override
247 {
248 return nullptr != dynamic_cast<T*>(node) && !hasNode(node);
249 }
250
251 bool hasNode(Node* node)
252 {
253 auto derived = dynamic_cast<T*>(node);
254 for (auto n : m_derived_nodes)
255 {
256 if (n == derived)
257 return true;
258 }
259
260 return false;
261 }
262
263 std::vector<Node*>& getNodes() override
264 {
265 m_nodes.clear();
266 m_nodes.resize(m_derived_nodes.size());
267 for (int i = 0; i < m_nodes.size(); i++)
268 {
269 m_nodes[i] = dynamic_cast<Node*>(m_derived_nodes[i]);
270 }
271 return m_nodes;
272 }
273
274 inline std::vector<T*>& getDerivedNodes()
275 {
276 return m_derived_nodes;
277 }
278
279 protected:
280 bool addNode(Node* node) override {
281 auto d_node = dynamic_cast<T*>(node);
282 if (d_node != nullptr)
283 {
284 addDerivedNode(d_node);
285 }
286
287 return false;
288 }
289
290 bool removeNode(Node* node) override
291 {
292 auto d_node = dynamic_cast<T*>(node);
293
294 if (d_node != nullptr)
295 {
296 return removeDerivedNode(d_node);
297 }
298
299 return false;
300 }
301
302 private:
303 std::vector<T*> m_derived_nodes;
304 };
305}
void clear() override
Definition NodePort.h:203
MultipleNodePort(std::string name, std::string description, Node *parent=nullptr)
Definition NodePort.h:186
bool hasNode(Node *node)
Definition NodePort.h:251
std::vector< T * > & getDerivedNodes()
Definition NodePort.h:274
bool addNode(Node *node) override
Definition NodePort.h:280
bool addDerivedNode(T *d_node)
Definition NodePort.h:210
bool isKindOf(Node *node) override
Definition NodePort.h:246
bool removeNode(Node *node) override
Definition NodePort.h:290
bool removeDerivedNode(T *d_node)
Definition NodePort.h:228
std::vector< Node * > & getNodes() override
Definition NodePort.h:263
std::vector< T * > m_derived_nodes
Definition NodePort.h:303
Input ports for Node.
Definition NodePort.h:38
virtual bool removeNode(Node *node)=0
NodePortType getPortType()
Definition NodePort.cpp:16
std::string m_name
Definition NodePort.h:76
Node * getParent()
Definition NodePort.h:56
virtual ~NodePort()
Definition NodePort.h:41
Node * m_parent
Definition NodePort.h:74
virtual bool addNode(Node *node)=0
std::vector< Node * > m_nodes
Definition NodePort.h:70
friend class Node
Definition NodePort.h:82
std::vector< std::shared_ptr< FCallBackFunc > > mCallbackFunc
Definition NodePort.h:80
virtual std::vector< Node * > & getNodes()
Definition NodePort.h:49
NodePort(std::string name, std::string description, Node *parent=nullptr)
Definition NodePort.cpp:7
virtual void clear()
Definition NodePort.cpp:26
void setPortType(NodePortType portType)
Definition NodePort.cpp:21
std::string m_description
Definition NodePort.h:77
virtual bool isKindOf(Node *node)=0
virtual std::string getPortName()
Definition NodePort.h:43
virtual void notify()
Definition NodePort.cpp:36
void attach(std::shared_ptr< FCallBackFunc > func)
Definition NodePort.cpp:31
NodePortType m_portType
Definition NodePort.h:78
virtual bool hasNode(Node *node)=0
bool setDerivedNode(T *d_node)
Definition NodePort.h:132
bool removeNode(Node *node) override
Definition NodePort.h:169
std::vector< Node * > & getNodes() override
Definition NodePort.h:117
SingleNodePort(std::string name, std::string description, Node *parent=nullptr)
Definition NodePort.h:91
bool hasNode(Node *node)
Definition NodePort.h:112
bool addNode(Node *node) override
Definition NodePort.h:158
~SingleNodePort() override
Definition NodePort.h:98
bool isKindOf(Node *node) override
Definition NodePort.h:107
#define T(t)
This is an implementation of AdditiveCCD based on peridyno.
Definition Array.h:25
void disconnect(Node *node, NodePort *port)
Definition NodePort.cpp:44
NodePortType
Definition NodePort.h:27
@ Unknown
Definition NodePort.h:30
@ Multiple
Definition NodePort.h:29
@ Single
Definition NodePort.h:28