PeriDyno 1.2.1
Loading...
Searching...
No Matches
Pipeline.cpp
Go to the documentation of this file.
1#include "Pipeline.h"
2#include "Node.h"
3#include "SceneGraph.h"
5
6#include "Timer.h"
7
8#include <sstream>
9#include <iomanip>
10#include <queue>
11#include <set>
12
13//#define PYTHON
14
15namespace dyno
16{
18 : Module()
19 {
20 assert(node != nullptr);
21 this->setParentNode(node);
22 }
23
25 {
26 mModuleList.clear();
27 mPersistentModule.clear();
28 mModuleMap.clear();
29 }
30
32 {
33 return (uint)mModuleList.size();
34 }
35
40
41 void Pipeline::pushModule(std::shared_ptr<Module> m)
42 {
43 ObjectId id = m->objectId();
44 if (mModuleMap.find(id) != mModuleMap.end())
45 return;
46
47 mModuleUpdated = true;
48 mModuleMap[id] = m;
49
50 this->getParentNode()->addModule(m);
51 }
52
53 void Pipeline::popModule(std::shared_ptr<Module> m)
54 {
55 ObjectId id = m->objectId();
56
57 mModuleMap.erase(id);
58 this->getParentNode()->deleteModule(m);
59
60 mModuleUpdated = true;
61 }
62
64 {
65 //TODO: fix the memeory leak
66// for (auto const &pair : mModuleMap)
67// {
68// mNode->deleteModule(std::shared_ptr<Module>(pair.second));
69// }
70
71 mModuleList.clear();
72 mPersistentModule.clear();
73 mModuleMap.clear();
74
75 mModuleUpdated = true;
76 }
77
78 void Pipeline::pushPersistentModule(std::shared_ptr<Module> m)
79 {
80 this->getParentNode()->addModule(m);
81 mPersistentModule.push_back(m);
82
83 mModuleUpdated = true;
84 }
85
87 {
88 mUpdateEnabled = true;
89 }
90
92 {
93 mUpdateEnabled = false;
94 }
95
100
102 {
103 mModuleUpdated = true;
104
105 this->update();
106 }
107
109 {
110 if (mModuleUpdated)
111 {
113 }
114 }
115
117 {
118#ifdef PYTHON
119 std::cout << "Pipeline::updateImpl" << std::endl;
120#endif
121 if (mUpdateEnabled)
122 {
123 CTimer timer;
124 for (auto m : mModuleList)
125 {
126 if (this->printDebugInfo()) {
127 timer.start();
128 }
129
130 //update the module
131 m->update();
132
133 if (this->printDebugInfo()) {
134 timer.stop();
135
136 std::stringstream name;
137 std::stringstream ss;
138 name << std::setw(40) << m->getClassInfo()->getClassName();
139 ss << std::setprecision(10) << timer.getElapsedTime();
140
141 std::string info = "\t Module: " + name.str() + ": \t " + ss.str() + "ms";
143 }
144 }
145 }
146 }
147
149 {
150 return true;
151 }
152
154 {
155 return true;
156 }
157
159 {
160 if (this->getParentNode() != nullptr && base->getFieldType() != FieldTypeEnum::Out)
161 return nullptr;
162
163 this->getParentNode()->addOutputField(base);
164
165 return base;
166 }
167
169 {
170 if (this->getParentNode() != nullptr && base->getFieldType() != FieldTypeEnum::Out)
171 return;
172
173 this->getParentNode()->removeOutputField(base);
174 }
175
177 {
179
180 mModuleList.clear();
181
182 std::queue<Module*> moduleQueue;
183 std::set<ObjectId> moduleSet;
184
186
187 auto retrieveModules = [&](ObjectId id, std::vector<FBase*>& fields) {
188 for (auto f : fields) {
189 auto& sinks = f->getSinks();
190 for (auto sink : sinks)
191 {
192 Module* module = dynamic_cast<Module*>(sink->parent());
193 if (module != nullptr)
194 {
195 ObjectId oId = module->objectId();
196 graph.addEdge(id, oId);
197
198 if (moduleSet.find(oId) == moduleSet.end() && mModuleMap.count(oId) > 0)
199 {
200 moduleSet.insert(oId);
201 moduleQueue.push(module);
202 }
203 }
204 }
205 }
206 };
207
208 auto& fields = this->getParentNode()->getAllFields();
209 retrieveModules(baseId, fields);
210
211 auto flushQueue = [&]()
212 {
213 while (!moduleQueue.empty())
214 {
215 Module* m = moduleQueue.front();
216
217 auto& outFields = m->getOutputFields();
218 retrieveModules(m->objectId(), outFields);
219
220 moduleQueue.pop();
221 }
222 };
223
224 flushQueue();
225
226 for (auto m : mModuleMap) {
227 ObjectId oId = m.second->objectId();
228
229 //Create connection between fields
230 if (moduleSet.find(oId) == moduleSet.end())
231 {
232 moduleSet.insert(oId);
233 moduleQueue.push(m.second.get());
234
235 flushQueue();
236 }
237
238 //Create connection between modules
239 auto exports = m.second->getExportModules();
240 for (auto exp : exports)
241 {
242 auto eId = exp->getParent()->objectId();
243 if (mModuleMap.count(eId) > 0)
244 {
245 graph.addEdge(oId, eId);
246 }
247 }
248 }
249
250 auto& ids = graph.topologicalSort();
251
252 for (auto id : ids)
253 {
254 if (mModuleMap.count(id) > 0)
255 {
256 mModuleList.push_back(mModuleMap[id]);
257 }
258 }
259
260 moduleSet.clear();
261
262 mModuleUpdated = false;
263 }
264}
assert(queueCount >=1)
double getElapsedTime()
return the elapsed time in (ms)
Definition Timer.cpp:41
void start()
Definition Timer.cpp:17
void stop()
Definition Timer.cpp:29
Graph class represents a directed graph.
void addEdge(ObjectId v, ObjectId w)
std::vector< ObjectId > & topologicalSort(ObjectId v)
FieldTypeEnum getFieldType()
Definition FBase.cpp:388
@ Info
Information to user.
Definition Log.h:48
static void sendMessage(MessageType type, const std::string &text)
Add a new message to log.
Definition Log.cpp:41
virtual void setParentNode(Node *node)
Set the parent node.
Definition Module.cpp:236
Node * getParentNode()
Definition Module.cpp:246
void update()
Definition Module.cpp:34
Module(std::string name="default")
Definition Module.cpp:9
bool addModule(std::shared_ptr< Module > module)
Add a module to m_module_list and other special module lists.
Definition Node.cpp:356
bool deleteModule(std::shared_ptr< Module > module)
Definition Node.cpp:364
std::vector< FBase * > & getAllFields()
Definition OBase.cpp:202
std::vector< FBase * > & getOutputFields()
Definition OBase.h:179
bool removeOutputField(FBase *field)
Definition OBase.cpp:345
bool addOutputField(FBase *field)
Definition OBase.cpp:319
static ObjectId baseId()
Base Id.
Definition Object.cpp:47
ObjectId objectId()
Definition Object.h:129
ObjectId id
Definition Object.h:131
std::list< std::shared_ptr< Module > > mModuleList
Definition Pipeline.h:112
uint sizeOfDynamicModules()
Definition Pipeline.cpp:31
std::map< ObjectId, std::shared_ptr< Module > > mModuleMap
Definition Pipeline.h:111
uint sizeOfPersistentModules()
Definition Pipeline.cpp:36
void pushModule(std::shared_ptr< Module > m)
Definition Pipeline.cpp:41
virtual bool printDebugInfo()
Definition Pipeline.cpp:153
void updateExecutionQueue()
Definition Pipeline.cpp:96
FBase * promoteOutputToNode(FBase *base)
Definition Pipeline.cpp:158
void preprocess() final
Definition Pipeline.cpp:108
void pushPersistentModule(std::shared_ptr< Module > m)
Definition Pipeline.cpp:78
bool mUpdateEnabled
Definition Pipeline.h:109
bool requireUpdate() final
Definition Pipeline.cpp:148
void demoteOutputFromNode(FBase *base)
Definition Pipeline.cpp:168
std::list< std::shared_ptr< Module > > mPersistentModule
Definition Pipeline.h:114
void updateImpl() override
Definition Pipeline.cpp:116
bool mModuleUpdated
Definition Pipeline.h:108
Pipeline(Node *node)
Definition Pipeline.cpp:17
void popModule(std::shared_ptr< Module > m)
Definition Pipeline.cpp:53
void reconstructPipeline()
Definition Pipeline.cpp:176
void forceUpdate()
Definition Pipeline.cpp:101
virtual ~Pipeline()
Definition Pipeline.cpp:24
This is an implementation of AdditiveCCD based on peridyno.
Definition Array.h:25
uint32_t ObjectId
Definition Object.h:110
DYN_FUNC Complex< Real > exp(const Complex< Real > &)
Definition Complex.inl:338
@ Out
Definition FBase.h:32
unsigned int uint
Definition VkProgram.h:14