PeriDyno 1.0.0
Loading...
Searching...
No Matches
OBase.cpp
Go to the documentation of this file.
1#include "OBase.h"
2#include <algorithm>
3#include "FBase.h"
4#include "Log.h"
5using std::find;
6
7namespace dyno {
8
10 {
11 m_field.clear();
12 m_fieldAlias.clear();
13
14 fields_input.clear();
15 fields_output.clear();
16 fields_param.clear();
17 }
18
19 std::string OBase::caption()
20 {
21 return this->getClassInfo()->getClassName();
22 }
23
25 {
26 return true;
27 }
28
29 std::string OBase::description()
30 {
31 auto cls = this->getClassInfo();
32
33 std::string tip = "Class Name: ";
34 tip += cls->getClassName() + "\n";
35 tip += "Description: none \n";
36
37 return tip;
38 }
39
40 std::string OBase::getName()
41 {
42 return "";
43 }
44
46 {
47 return addField(data->getObjectName(), data);
48 }
49
50 bool OBase::addField(FieldID name, FBase* data)
51 {
52 if (findField(data) == NULL)
53 {
54 m_field.push_back(data);
55 }
56 else
57 {
58 std::cout << "Data field " << name
59 << " already exists in this class !"
60 << std::endl;
61 return false;
62 }
63
64 addFieldAlias(name, data);
65
66 return true;
67 }
68
70 {
71 if (findFieldAlias(name) == NULL)
72 {
73 m_fieldAlias.insert(std::make_pair(name, data));
74 }
75 else
76 {
77 if (data != getField(name))
78 {
79 std::cout << "Field name " << name
80 << " conflicts with existing fields!"
81 << std::endl;
82 return false;
83 }
84
85 }
86 return true;
87 }
88
89 bool OBase::addFieldAlias(FieldID name, FBase* data, FieldMap& fieldAlias)
90 {
91 if (findFieldAlias(name, fieldAlias) == NULL)
92 {
93 fieldAlias.insert(std::make_pair(name, data));
94 }
95 else
96 {
97 if (data != getField(name))
98 {
99 std::cout << "Field name " << name
100 << " conflicts with existing fields!"
101 << std::endl;
102 return false;
103 }
104
105 }
106 return true;
107 }
108
110 {
111 FieldVector::iterator result = find(m_field.begin(), m_field.end(), data);
112 // return false if no field is found!
113 if (result == m_field.end())
114 {
115 return false;
116 }
117 return true;
118 }
119
121 {
122 FieldMap::iterator result = m_fieldAlias.find(name);
123 // return false if no alias is found!
124 if (result == m_fieldAlias.end())
125 {
126 return false;
127 }
128 return true;
129 }
130
131 bool OBase::findFieldAlias(const FieldID name, FieldMap& fieldAlias)
132 {
133 FieldMap::iterator result = fieldAlias.find(name);
134 // return false if no alias is found!
135 if (result == fieldAlias.end())
136 {
137 return false;
138 }
139 return true;
140 }
141
143 {
144 FieldVector::iterator result = find(m_field.begin(), m_field.end(), data);
145 if (result == m_field.end())
146 {
147 return false;
148 }
149
150 m_field.erase(result);
151
152 FieldMap::iterator iter;
153 for (iter = m_fieldAlias.begin(); iter != m_fieldAlias.end();)
154 {
155 if (iter->second == data)
156 {
157 m_fieldAlias.erase(iter++);
158 }
159 else
160 {
161 ++iter;
162 }
163 }
164
165 return true;
166 }
167
169 {
170 return removeFieldAlias(name, m_fieldAlias);
171 }
172
173 bool OBase::removeFieldAlias(const FieldID name, FieldMap& fieldAlias)
174 {
175 FieldMap::iterator iter = fieldAlias.find(name);
176 if (iter != fieldAlias.end())
177 {
178 FBase* data = iter->second;
179
180 fieldAlias.erase(iter);
181
182 if (getFieldAliasCount(data) == 0)
183 {
184 removeField(data);
185 }
186 return true;
187 }
188
189 return false;
190 }
191
193 {
194 FieldMap::iterator iter = m_fieldAlias.find(name);
195 if (iter != m_fieldAlias.end())
196 {
197 return iter->second;
198 }
199 return nullptr;
200 }
201
202 std::vector<FBase*>& OBase::getAllFields()
203 {
204 return m_field;
205 }
206
208 {
209 bool bReady = true;
210 for (int i = 0; i < m_field.size(); i++)
211 {
212 bReady = bReady & !m_field[i]->isEmpty();
213 if (!bReady)
214 {
215 break;
216 }
217 }
218 return bReady;
219 }
220
221
222 std::vector<std::string> OBase::getFieldAlias(FBase* field)
223 {
224 std::vector<FieldID> names;
225 FieldMap::iterator iter;
226 for (iter = m_fieldAlias.begin(); iter != m_fieldAlias.end(); iter++)
227 {
228 if (iter->second == field)
229 {
230 names.push_back(iter->first);
231 }
232 }
233 return names;
234 }
235
237 {
238 int num = 0;
239 FieldMap::iterator iter;
240 for (iter = m_fieldAlias.begin(); iter != m_fieldAlias.end(); iter++)
241 {
242 if (iter->second == data)
243 {
244 num++;
245 }
246 }
247 return num;
248 }
249
250 bool OBase::attachField(FBase* field, std::string name, std::string desc, bool autoDestroy /*= true*/)
251 {
252 field->setParent(this);
253 field->setObjectName(name);
254 field->setDescription(desc);
255 field->setAutoDestroy(autoDestroy);
256 bool ret = addField(field);
257
258 if (!ret)
259 {
260 Log::sendMessage(Log::Error, std::string("The field ") + name + std::string(" already exists!"));
261 }
262 return ret;
263 }
264
266 {
267 auto result = find(fields_input.begin(), fields_input.end(), field);
268 // return false if no field is found!
269 if (result == fields_input.end())
270 {
271 return false;
272 }
273 return true;
274 }
275
277 {
278 if (findInputField(field))
279 {
280 return false;
281 }
282
283 this->addField(field);
284
285 fields_input.push_back(field);
286
287 return true;
288 }
289
291 {
292 if (!findInputField(field))
293 {
294 return false;
295 }
296
297 this->removeField(field);
298
299 auto result = find(fields_input.begin(), fields_input.end(), field);
300 if (result != fields_input.end())
301 {
302 fields_input.erase(result);
303 }
304
305 return true;
306 }
307
309 {
310 auto result = find(fields_output.begin(), fields_output.end(), field);
311 // return false if no field is found!
312 if (result == fields_output.end())
313 {
314 return false;
315 }
316 return true;
317 }
318
320 {
321 if (findOutputField(field))
322 {
323 return false;
324 }
325
326 this->addField(field);
327
328 fields_output.push_back(field);
329
330 return true;
331 }
332
334 {
335 if (findOutputField(field))
336 {
337 return false;
338 }
339
340 fields_output.push_back(field);
341
342 return true;
343 }
344
346 {
347 if (!findOutputField(field))
348 {
349 return false;
350 }
351
352 this->removeField(field);
353
354 auto result = find(fields_output.begin(), fields_output.end(), field);
355 if (result != fields_output.end())
356 {
357 fields_output.erase(result);
358 }
359
360 return true;
361 }
362
364 {
365 if (!findOutputField(field))
366 {
367 return false;
368 }
369
370 auto result = find(fields_output.begin(), fields_output.end(), field);
371 if (result != fields_output.end())
372 {
373 fields_output.erase(result);
374 }
375
376 return true;
377 }
378
380 {
381 auto result = find(fields_param.begin(), fields_param.end(), field);
382 // return false if no field is found!
383 if (result == fields_param.end())
384 {
385 return false;
386 }
387 return true;
388 }
389
391 {
392 if (findParameter(field))
393 {
394 return false;
395 }
396
397 this->addField(field);
398
399 fields_param.push_back(field);
400
401 return true;
402 }
403
405 {
406 if (!findParameter(field))
407 {
408 return false;
409 }
410
411 this->removeField(field);
412
413 auto result = find(fields_param.begin(), fields_param.end(), field);
414 if (result != fields_output.end())
415 {
416 fields_param.erase(result);
417 }
418
419 return true;
420 }
421
422#ifdef VK_BACKEND
423 std::shared_ptr<VkProgram> OBase::addKernel(ProgramID programId, std::shared_ptr<VkProgram> prog)
424 {
425 ProgramMap::iterator result = Kernels.find(programId);
426 assert(result == Kernels.end());
427
428 Kernels[programId] = prog;
429
430 return prog;
431 }
432
433 VkMultiProgram& OBase::createKernelGroup(ProgramID programId)
434 {
435 auto inst = VkSystem::instance();
436 MultiProgramMap::iterator result = MultiKernels.find(programId);
437 if (result != MultiKernels.end())
438 {
439 std::cout << "Warning: Kernel " << programId << " already exists, be sure you want to replace the original with a new one" << std::endl;
440 }
441
442 inst = VkSystem::instance();
443 std::shared_ptr<VkMultiProgram> prog = std::make_shared<VkMultiProgram>();
444 MultiKernels[programId] = prog;
445
446 return *MultiKernels[programId];
447 }
448
449 VkMultiProgram& OBase::kernelGroup(ProgramID programId)
450 {
451 return *MultiKernels[programId];
452 }
453
454 std::shared_ptr<VkProgram> OBase::kernel(ProgramID programId)
455 {
456 return Kernels[programId];
457 }
458#endif
459}
assert(queueCount >=1)
std::string getObjectName()
Definition FBase.h:54
void setParent(OBase *owner)
Definition FBase.cpp:36
void setObjectName(std::string name)
Definition FBase.h:58
void setAutoDestroy(bool autoDestroy)
Definition FBase.cpp:155
void setDescription(std::string description)
Definition FBase.h:59
@ Error
Error information while executing something.
Definition Log.h:50
static void sendMessage(MessageType type, const std::string &text)
Add a new message to log.
Definition Log.cpp:41
std::vector< FieldID > getFieldAlias(FBase *data)
Definition OBase.cpp:222
bool findOutputField(FBase *field)
Definition OBase.cpp:308
bool removeParameter(FBase *field)
Definition OBase.cpp:404
bool removeFieldAlias(const FieldID name)
Remove a field by its name.
Definition OBase.cpp:168
virtual bool attachField(FBase *field, std::string name, std::string desc, bool autoDestroy=true)
Attach a field to Base.
Definition OBase.cpp:250
std::vector< FBase * > & getAllFields()
Definition OBase.cpp:202
bool findFieldAlias(const FieldID name)
Find a field by its name.
Definition OBase.cpp:120
std::vector< FBase * > fields_param
Definition OBase.h:211
virtual bool captionVisible()
Whether to hide the caption in the GUI.
Definition OBase.cpp:24
bool removeInputField(FBase *field)
Definition OBase.cpp:290
bool addField(FBase *data)
Add a field to Base FieldID will be set to the name of Field by default.
Definition OBase.cpp:45
virtual std::string caption()
Return the caption.
Definition OBase.cpp:19
bool addParameter(FBase *field)
Definition OBase.cpp:390
bool addFieldAlias(FieldID name, FBase *data)
Definition OBase.cpp:69
FieldMap m_fieldAlias
Definition OBase.h:206
int getFieldAliasCount(FBase *data)
Definition OBase.cpp:236
bool removeOutputField(FBase *field)
Definition OBase.cpp:345
virtual std::string getName()
Definition OBase.cpp:40
FBase * getField(const FieldID name)
Return a field by its name.
Definition OBase.cpp:192
bool findField(FBase *data)
Find a field by its pointer.
Definition OBase.cpp:109
std::vector< FBase * > fields_output
Definition OBase.h:210
bool findParameter(FBase *field)
Definition OBase.cpp:379
std::map< FieldID, FBase * > FieldMap
Definition OBase.h:42
virtual std::string description()
Return a description for the node or module, override this function to support user-defined descripti...
Definition OBase.cpp:29
std::vector< FBase * > fields_input
Definition OBase.h:209
bool addOutputField(FBase *field)
Definition OBase.cpp:319
bool findInputField(FBase *field)
Definition OBase.cpp:265
~OBase() override
Definition OBase.cpp:9
FieldVector m_field
Definition OBase.h:205
bool removeFromOutput(FBase *field)
Definition OBase.cpp:363
bool addInputField(FBase *field)
Definition OBase.cpp:276
bool isAllFieldsReady()
Check the completeness of all required fields.
Definition OBase.cpp:207
bool removeField(FBase *data)
Remove a field by its pointer.
Definition OBase.cpp:142
bool addToOutput(FBase *field)
Definition OBase.cpp:333
static VkSystem * instance()
Definition VkSystem.cpp:10
This is an implementation of AdditiveCCD based on peridyno.
Definition Array.h:25
std::string ProgramID
Definition OBase.h:36
std::string FieldID
Base class for modules.
Definition OBase.h:35