PeriDyno 1.0.0
Loading...
Searching...
No Matches
GroupModule.cpp
Go to the documentation of this file.
1#include "GroupModule.h"
2#include "Node.h"
4
5#include <queue>
6#include <set>
7
8namespace dyno
9{
11 : Module()
12 {
13 }
14
18
19 void GroupModule::pushModule(std::shared_ptr<Module> m)
20 {
21 ObjectId id = m->objectId();
22 if (mModuleMap.find(id) != mModuleMap.end())
23 return;
24
25 mModuleMap[id] = m;
26 mModuleUpdated = true;
27 }
28
30 {
31 for (auto m = mModuleMap.begin(); m != mModuleMap.end(); m++) {
32 m->second->setParentNode(node);
33 }
34
35 for (auto m : mPersistentModule)
36 {
37 m->setParentNode(node);
38 }
39
41 }
42
44 {
45 if (mModuleUpdated) {
47 mModuleUpdated = false;
48 }
49 }
50
52 {
53 for(auto m : mModuleList) {
54 m->update();
55 }
56 }
57
59 {
61
62 mModuleList.clear();
63
64 std::queue<Module*> moduleQueue;
65 std::set<ObjectId> moduleSet;
66
68
69 auto retrieveModules = [&](ObjectId id, std::vector<FBase *>& fields) {
70 for(auto f : fields) {
71 auto& sinks = f->getSinks();
72 for(auto sink : sinks)
73 {
74 Module* module = dynamic_cast<Module*>(sink->parent());
75 if (module != nullptr)
76 {
77 ObjectId oId = module->objectId();
78 graph.addEdge(id, oId);
79
80 if (moduleSet.find(oId) == moduleSet.end() && mModuleMap.count(oId) > 0)
81 {
82 moduleSet.insert(oId);
83 moduleQueue.push(module);
84 }
85 }
86 }
87 }
88 };
89
90 auto& fields = this->getInputFields();
91 retrieveModules(baseId, fields);
92
93 for(auto m : mPersistentModule)
94 {
95 moduleQueue.push(m.get());
96 }
97
98// auto retrieveModules = [&](std::vector<FBase *>& fields) {
99// };
100
101 while (!moduleQueue.empty())
102 {
103 Module* m = moduleQueue.front();
104
105 auto& outFields = m->getOutputFields();
106 retrieveModules(m->objectId(), outFields);
107
108 moduleQueue.pop();
109 }
110
111 auto& ids = graph.topologicalSort();
112
113 for(auto id : ids)
114 {
115 if (mModuleMap.count(id) > 0)
116 {
117 mModuleList.push_back(mModuleMap[id].get());
118 }
119 }
120
121 moduleSet.clear();
122 }
123}
Graph class represents a directed graph.
void addEdge(ObjectId v, ObjectId w)
std::vector< ObjectId > & topologicalSort(ObjectId v)
void pushModule(std::shared_ptr< Module > m)
void preprocess() final
std::list< Module * > mModuleList
Definition GroupModule.h:42
std::list< std::shared_ptr< Module > > mPersistentModule
Definition GroupModule.h:44
std::map< ObjectId, std::shared_ptr< Module > > mModuleMap
Definition GroupModule.h:41
void setParentNode(Node *node) override
Set the parent node.
virtual ~GroupModule()
void updateImpl() override
virtual void setParentNode(Node *node)
Set the parent node.
Definition Module.cpp:193
Module(std::string name="default")
Definition Module.cpp:7
std::vector< FBase * > & getOutputFields()
Definition OBase.h:179
std::vector< FBase * > & getInputFields()
Definition OBase.h:171
static ObjectId baseId()
Base Id.
Definition Object.cpp:46
ObjectId objectId()
Definition Object.h:129
ObjectId id
Definition Object.h:131
This is an implementation of AdditiveCCD based on peridyno.
Definition Array.h:25
uint32_t ObjectId
Definition Object.h:110