PeriDyno 1.0.0
Loading...
Searching...
No Matches
SceneGraph.h
Go to the documentation of this file.
1
16#pragma once
17#include "OBase.h"
18#include "Node.h"
19#include "NodeIterator.h"
20
21#include "Module/InputModule.h"
22
23#include <mutex>
24
25namespace dyno
26{
27 typedef std::list<Node*> NodeList;
28
29 typedef std::map<ObjectId, std::shared_ptr<Node>> NodeMap;
30
31 class SceneGraph : public OBase
32 {
33 public:
35
37
43
44 virtual void advance(float dt);
45 virtual void advanceInAsync(); //Take the simulation asynchronously
46 virtual void takeOneFrame();
47 virtual void updateGraphicsContext();
48 virtual void run();
49
51
52 void reset();
53
54 void reset(std::shared_ptr<Node> node);
55
56 void printNodeInfo(bool enabled);
57 void printSimulationInfo(bool enabled);
58 void printRenderingInfo(bool enabled);
59 void printValidationInfo(bool enabled);
60
65
66 virtual bool load(std::string name);
67
68 virtual void invoke(unsigned char type, unsigned char key, int x, int y) {};
69
70 template<class TNode, class ...Args>
71 std::shared_ptr<TNode> createNewScene(Args&& ... args)
72 {
73 std::shared_ptr<TNode> root = TypeInfo::New<TNode>(std::forward<Args>(args)...);
74 //mRoot = root;
75
76 addNode(root);
77
78 return root;
79 }
80
81 template<class TNode, class ...Args>
82 std::shared_ptr<TNode> addNode(Args&& ... args)
83 {
84 std::shared_ptr<TNode> node = TypeInfo::New<TNode>(std::forward<Args>(args)...);
85
86 return addNode(node);
87 }
88
89 template<class TNode>
90 std::shared_ptr<TNode> addNode(std::shared_ptr<TNode> tNode)
91 {
92 if (tNode == nullptr ||
93 mNodeMap.find(tNode->objectId()) != mNodeMap.end())
94 return nullptr;
95
96 mNodeMap[tNode->objectId()] = tNode;
98
99 tNode->setSceneGraph(this);
100
101 return tNode;
102 }
103
104 void deleteNode(std::shared_ptr<Node> node);
105
106 void propagateNode(std::shared_ptr<Node> node);
107
108 bool isEmpty() {
109 return mNodeMap.size() == 0;
110 }
111
113
114 public:
115 static SceneGraph& getInstance();
116
117 inline void setTotalTime(float t) { mMaxTime = t; }
118 inline float getTotalTime() { return mMaxTime; }
119
120 inline void setFrameRate(float frameRate) { mFrameRate = frameRate; }
121 inline float getFrameRate() { return mFrameRate; }
122 inline float getTimeCostPerFrame() { return mFrameCost; }
123 inline float getFrameInterval() { return 1.0f / mFrameRate; }
124
125 inline int getFrameNumber() { return mFrameNumber; }
126 inline void setFrameNumber(int n) { mFrameNumber = n; }
127
128 bool isIntervalAdaptive();
129 void setAdaptiveInterval(bool adaptive);
130
131 void setAsynchronousSimulation(bool b);
132
133 void setGravity(Vec3f g);
135
138
139 void setLowerBound(Vec3f lowerBound);
140 void setUpperBound(Vec3f upperBound);
141
142 inline Iterator begin() {
143
145
147 }
148
149 inline Iterator end() { return NodeIterator(); }
150
155
156 public:
157 void onMouseEvent(PMouseEvent event);
158
159 void onMouseEvent(PMouseEvent event, std::shared_ptr<Node> node);
160
162
168 void traverseBackward(Action* act);
169
170 template<class Act, class ... Args>
171 void traverseBackward(Args&& ... args) {
172 Act action(std::forward<Args>(args)...);
173 traverseBackward(&action);
174 }
175
181 void traverseForward(Action* act);
182
183 template<class Act, class ... Args>
184 void traverseForward(Args&& ... args) {
185 Act action(std::forward<Args>(args)...);
186 traverseForward(&action);
187 }
188
195 void traverseForward(std::shared_ptr<Node> node, Action* act);
196
197 template<class Act, class ... Args>
198 void traverseForward(std::shared_ptr<Node> node, Args&& ... args) {
199 Act action(std::forward<Args>(args)...);
200 traverseForward(node, &action);
201 }
202
209 void traverseForwardWithAutoSync(std::shared_ptr<Node> node, Action* act);
210
211 template<class Act, class ... Args>
212 void traverseForwardWithAutoSync(std::shared_ptr<Node> node, Args&& ... args) {
213 Act action(std::forward<Args>(args)...);
214 traverseForwardWithAutoSync(node, &action);
215 }
216
217 protected:
218 //void retriveExecutionQueue(std::list<Node*>& nQueue);
219
221
222 public:
224 : mElapsedTime(0)
225 , mMaxTime(0)
226 , mFrameRate(25)
227 , mFrameNumber(0)
228 , mFrameCost(0)
229 , mLowerBound(-10, 0, -10)
230 , mUpperBound(10, 10, 10)
231 {
232 //mRoot = std::make_shared<Node>();
233 mGravity = Vec3f(0.0f, -9.8f, 0.0f);
234 };
235
239 SceneGraph(const SceneGraph&) = delete;
240 SceneGraph& operator=(const SceneGraph&) = delete;
241
242 private:
243 bool mAdvativeInterval = true;
244
246 float mMaxTime;
249
251
253
256
257 private:
258 //std::shared_ptr<Node> mRoot = nullptr;
259
262
264
266
267 bool mNodeTiming = false;
268 bool mSimulationTiming = false;
269 bool mRenderingTiming = false;
270
271 bool mValidationInfo = false;
272
274 };
275
276}
std::shared_ptr< TNode > createNewScene(Args &&... args)
Definition SceneGraph.h:71
void setFrameNumber(int n)
Definition SceneGraph.h:126
bool mAsynchronousSimulation
Definition SceneGraph.h:261
NodeList mNodeQueue
Definition SceneGraph.h:265
bool isSimulationInfoPrintable()
Definition SceneGraph.h:62
void traverseForward(Args &&... args)
Definition SceneGraph.h:184
EWorkMode getWorkMode()
Definition SceneGraph.h:112
float getTimeCostPerFrame()
Definition SceneGraph.h:122
float getFrameRate()
Definition SceneGraph.h:121
void deleteNode(std::shared_ptr< Node > node)
void markQueueUpdateRequired()
An interface to tell SceneGraph to update the execuation queue.
void setLowerBound(Vec3f lowerBound)
virtual void takeOneFrame()
bool isIntervalAdaptive()
SceneGraph & operator=(const SceneGraph &)=delete
void updateExecutionQueue()
NBoundingBox boundingBox()
void onMouseEvent(PMouseEvent event)
void printValidationInfo(bool enabled)
EWorkMode mWorkMode
Definition SceneGraph.h:273
virtual void advanceInAsync()
SceneGraph(const SceneGraph &)=delete
void traverseBackward(Action *act)
Depth-first tree traversal.
void setGravity(Vec3f g)
bool isNodeInfoPrintable()
Definition SceneGraph.h:61
void traverseForward(Action *act)
Breadth-first tree traversal.
void propagateNode(std::shared_ptr< Node > node)
void printNodeInfo(bool enabled)
void setTotalTime(float t)
Definition SceneGraph.h:117
bool isValidationInfoPrintable()
Definition SceneGraph.h:64
void setAsynchronousSimulation(bool b)
float getFrameInterval()
Definition SceneGraph.h:123
void onKeyboardEvent(PKeyboardEvent event)
Iterator end()
Definition SceneGraph.h:149
void setAdaptiveInterval(bool adaptive)
virtual void invoke(unsigned char type, unsigned char key, int x, int y)
Definition SceneGraph.h:68
void traverseForwardWithAutoSync(std::shared_ptr< Node > node, Action *act)
Breadth-first tree traversal starting from a specific node, only those whose mAutoSync turned-on will...
void printRenderingInfo(bool enabled)
virtual void run()
void setUpperBound(Vec3f upperBound)
virtual bool load(std::string name)
void traverseForwardWithAutoSync(std::shared_ptr< Node > node, Args &&... args)
Definition SceneGraph.h:212
void printSimulationInfo(bool enabled)
float getTotalTime()
Definition SceneGraph.h:118
std::shared_ptr< TNode > addNode(std::shared_ptr< TNode > tNode)
Definition SceneGraph.h:90
Iterator begin()
Definition SceneGraph.h:142
virtual void advance(float dt)
void traverseBackward(Args &&... args)
Definition SceneGraph.h:171
virtual void updateGraphicsContext()
void traverseForward(std::shared_ptr< Node > node, Args &&... args)
Definition SceneGraph.h:198
bool isRenderingInfoPrintable()
Definition SceneGraph.h:63
std::shared_ptr< TNode > addNode(Args &&... args)
Definition SceneGraph.h:82
void setFrameRate(float frameRate)
Definition SceneGraph.h:120
NodeIterator Iterator
Definition SceneGraph.h:34
bool mQueueUpdateRequired
Definition SceneGraph.h:260
static SceneGraph & getInstance()
std::shared_ptr< T > New(Args &&... args)
Definition Typedef.inl:283
This is an implementation of AdditiveCCD based on peridyno.
Definition Array.h:25
std::map< ObjectId, std::shared_ptr< Node > > NodeMap
Definition SceneGraph.h:29
std::list< Node * > NodeList
Definition SceneGraph.h:27
Vector< float, 3 > Vec3f
Definition Vector3D.h:93