PeriDyno 1.0.0
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
13namespace dyno
14{
16 : Module()
17 {
18 assert(node != nullptr);
19 this->setParentNode(node);
20 }
21
23 {
24 mModuleList.clear();
25 mPersistentModule.clear();
26 mModuleMap.clear();
27 }
28
30 {
31 return (uint)mModuleList.size();
32 }
33
38
39 void Pipeline::pushModule(std::shared_ptr<Module> m)
40 {
41 ObjectId id = m->objectId();
42 if (mModuleMap.find(id) != mModuleMap.end())
43 return;
44
45 mModuleUpdated = true;
46 mModuleMap[id] = m;
47
48 this->getParentNode()->addModule(m);
49 }
50
51 void Pipeline::popModule(std::shared_ptr<Module> m)
52 {
53 ObjectId id = m->objectId();
54
55 mModuleMap.erase(id);
56 this->getParentNode()->deleteModule(m);
57
58 mModuleUpdated = true;
59 }
60
62 {
63 //TODO: fix the memeory leak
64// for (auto const &pair : mModuleMap)
65// {
66// mNode->deleteModule(std::shared_ptr<Module>(pair.second));
67// }
68
69 mModuleList.clear();
70 mPersistentModule.clear();
71 mModuleMap.clear();
72
73 mModuleUpdated = true;
74 }
75
76 void Pipeline::pushPersistentModule(std::shared_ptr<Module> m)
77 {
78 this->getParentNode()->addModule(m);
79 mPersistentModule.push_back(m);
80
81 mModuleUpdated = true;
82 }
83
85 {
86 mUpdateEnabled = true;
87 }
88
90 {
91 mUpdateEnabled = false;
92 }
93
98
100 {
101 mModuleUpdated = true;
102
103 this->update();
104 }
105
107 {
108 if (mModuleUpdated)
109 {
111 }
112 }
113
115 {
116 if (mUpdateEnabled)
117 {
118 CTimer timer;
119 for(auto m : mModuleList)
120 {
121 if (this->printDebugInfo()) {
122 timer.start();
123 }
124
125 //update the module
126 m->update();
127
128 if (this->printDebugInfo()) {
129 timer.stop();
130
131 std::stringstream name;
132 std::stringstream ss;
133 name << std::setw(40) << m->getClassInfo()->getClassName();
134 ss << std::setprecision(10) << timer.getElapsedTime();
135
136 std::string info = "\t Module: " + name.str() + ": \t " + ss.str() + "ms";
138 }
139 }
140 }
141 }
142
144 {
145 return true;
146 }
147
149 {
150 return true;
151 }
152
154 {
155 if (this->getParentNode() != nullptr && base->getFieldType() != FieldTypeEnum::Out)
156 return nullptr;
157
158 this->getParentNode()->addOutputField(base);
159
160 return base;
161 }
162
164 {
165 if (this->getParentNode() != nullptr && base->getFieldType() != FieldTypeEnum::Out)
166 return;
167
168 this->getParentNode()->removeOutputField(base);
169 }
170
172 {
174
175 mModuleList.clear();
176
177 std::queue<Module*> moduleQueue;
178 std::set<ObjectId> moduleSet;
179
180// std::map<ObjectId, bool> visited;
181//
182// visited[baseId] = false;
183// for (auto& mItor : mModuleMap) {
184// visited[mItor.first] = false;
185// }
186
188
189 auto retrieveModules = [&](ObjectId id, std::vector<FBase *>& fields) {
190 for(auto f : fields) {
191 auto& sinks = f->getSinks();
192 for(auto sink : sinks)
193 {
194 Module* module = dynamic_cast<Module*>(sink->parent());
195 if (module != nullptr)
196 {
197 ObjectId oId = module->objectId();
198 graph.addEdge(id, oId);
199
200 if (moduleSet.find(oId) == moduleSet.end() && mModuleMap.count(oId) > 0)
201 {
202 moduleSet.insert(oId);
203 moduleQueue.push(module);
204 }
205 }
206 }
207 }
208 };
209
210 auto& fields = this->getParentNode()->getAllFields();
211 retrieveModules(baseId, fields);
212
213// for each (auto m in mPersistentModule)
214// {
215// moduleQueue.push(m.get());
216// }
217
218 auto flushQueue = [&]()
219 {
220 while (!moduleQueue.empty())
221 {
222 Module* m = moduleQueue.front();
223
224 auto& outFields = m->getOutputFields();
225 retrieveModules(m->objectId(), outFields);
226
227 moduleQueue.pop();
228 }
229 };
230
231 flushQueue();
232
233// while (!moduleQueue.empty())
234// {
235// Module* m = moduleQueue.front();
236//
237// auto& outFields = m->getOutputFields();
238// retrieveModules(m->objectId(), outFields);
239//
240// moduleQueue.pop();
241// }
242
243// while (!moduleQueue.empty())
244// {
245// Module* m = moduleQueue.front();
246//
247// auto& outFields = m->getOutputFields();
248// retrieveModules(m->objectId(), outFields);
249//
250// moduleQueue.pop();
251// }
252
253 for (auto m : mModuleMap) {
254 ObjectId oId = m.second->objectId();
255 if (moduleSet.find(oId) == moduleSet.end())
256 {
257 moduleSet.insert(oId);
258 moduleQueue.push(m.second.get());
259
260 flushQueue();
261 }
262 }
263
264 auto& ids = graph.topologicalSort();
265
266 for(auto id : ids)
267 {
268 if (mModuleMap.count(id) > 0)
269 {
270 mModuleList.push_back(mModuleMap[id]);
271 }
272 }
273
274 moduleSet.clear();
275
276 mModuleUpdated = false;
277 }
278}
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:300
@ 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:193
Node * getParentNode()
Definition Module.cpp:203
void update()
Definition Module.cpp:47
Module(std::string name="default")
Definition Module.cpp:7
bool addModule(std::shared_ptr< Module > module)
Add a module to m_module_list and other special module lists.
Definition Node.cpp:365
bool deleteModule(std::shared_ptr< Module > module)
Definition Node.cpp:373
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:46
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:29
std::map< ObjectId, std::shared_ptr< Module > > mModuleMap
Definition Pipeline.h:111
uint sizeOfPersistentModules()
Definition Pipeline.cpp:34
void pushModule(std::shared_ptr< Module > m)
Definition Pipeline.cpp:39
virtual bool printDebugInfo()
Definition Pipeline.cpp:148
void updateExecutionQueue()
Definition Pipeline.cpp:94
FBase * promoteOutputToNode(FBase *base)
Definition Pipeline.cpp:153
void preprocess() final
Definition Pipeline.cpp:106
void pushPersistentModule(std::shared_ptr< Module > m)
Definition Pipeline.cpp:76
bool mUpdateEnabled
Definition Pipeline.h:109
bool requireUpdate() final
Definition Pipeline.cpp:143
void demoteOutputFromNode(FBase *base)
Definition Pipeline.cpp:163
std::list< std::shared_ptr< Module > > mPersistentModule
Definition Pipeline.h:114
void updateImpl() override
Definition Pipeline.cpp:114
bool mModuleUpdated
Definition Pipeline.h:108
Pipeline(Node *node)
Definition Pipeline.cpp:15
void popModule(std::shared_ptr< Module > m)
Definition Pipeline.cpp:51
void reconstructPipeline()
Definition Pipeline.cpp:171
void forceUpdate()
Definition Pipeline.cpp:99
virtual ~Pipeline()
Definition Pipeline.cpp:22
This is an implementation of AdditiveCCD based on peridyno.
Definition Array.h:25
uint32_t ObjectId
Definition Object.h:110
@ Out
Definition FBase.h:32
unsigned int uint
Definition VkProgram.h:14