TDME2  1.9.200
Context.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <memory>
4 #include <string>
5 #include <unordered_map>
6 #include <vector>
7 
8 #include <tdme/tdme.h>
9 #include <tdme/audio/fwd-tdme.h>
10 #include <tdme/engine/fwd-tdme.h>
20 #include <tdme/engine/Transform.h>
21 #include <tdme/math/Vector3.h>
24 #include <tdme/utilities/Console.h>
28 #include <tdme/utilities/Time.h>
29 
30 using std::string;
31 using std::to_string;
32 using std::unique_ptr;
33 using std::vector;
34 
35 using tdme::audio::Audio;
53 
54 /**
55  * Logics context
56  * @author Andreas Drewke
57  */
59 {
60 public:
61  static constexpr bool VERBOSE { false };
62 
63 public:
64  /**
65  * Path finding thread
66  * @author Andreas Drewke
67  */
68  class PathFindingThread: public Thread {
69  public:
70  enum State {
77  };
78 
82  string id;
83  int32_t type;
84  bool enabled;
85  int32_t collisionTypeId;
87  float restitution;
88  float friction;
89  float mass;
91  vector<BoundingVolume*> boundingVolumes;
92  bool hierarchy;
93  };
94 
100  };
101 
102  private:
103  struct FlowMapRequest {
106  int pathIdx;
107  vector<Vector3> path;
108  FlowMap* flowMap { nullptr };
109  };
110 
112  int idx;
113  volatile State state;
115  string logicId;
118  string actorId;
121  vector<Vector3> path;
122  vector<string> cancelActorIds;
127  unordered_map<string, FlowMapRequest> flowMapRequests;
128  unique_ptr<World> world;
129  unique_ptr<tdme::utilities::PathFinding> pathFinding;
132  vector<WorldActionStruct> worldActions;
134 
135  /**
136  * Run
137  */
138  virtual void run();
139 
140  public:
141  /**
142  * Public constructor
143  * @param context context
144  * @param idx index
145  */
147 
148  /**
149  * Public destructor
150  */
151  virtual ~PathFindingThread();
152 
153  /**
154  * @return thread index
155  */
156  inline int getThreadIdx() {
157  return idx;
158  }
159 
160  /**
161  * Add world action
162  * @param action action
163  */
164  void addWorldAction(const WorldActionStruct& action);
165 
166  /**
167  * Find path
168  * @param logicId logic id
169  * @param actorId actor id
170  * @param startPosition start position
171  * @param endPosition end position
172  * @param path path
173  * @param alternativeEndSteps alternative end steps
174  * @param customTest custom test
175  * @param createFlowMap create flow map
176  * @param flowMapEndPositions flow map end positions
177  * @param flowMapWidth flow map width
178  * @param flowMapDepth flow map height
179  * @param flowMap pointer to flowmap variable to store flowmap into
180  */
181  State findPath(
182  const string& logicId,
183  const string& actorId,
184  const Vector3& startPosition,
185  const Vector3& endPosition,
186  vector<Vector3>& path,
187  int alternativeEndSteps = 0,
189  bool createFlowMap = false,
190  const vector<Vector3> flowMapEndPositions = vector<Vector3>(),
191  const float flowMapWidth = 0.0,
192  const float flowMapDepth = 0.0,
193  FlowMap** flowMap = nullptr
194  );
195 
196  /**
197  * Get flow map extension
198  * @param actorId actor id
199  * @param flowMap pointer to flowmap variable to store flowmap into
200  * @return flow map extension state
201  */
203 
204  /**
205  * Reset current path finding
206  */
207  void reset();
208 
209  /**
210  * Cancel
211  * @param actorId actor id
212  */
213  void cancel(const string& actorId);
214 
215  /**
216  * @return current pathfinding actor id
217  */
218  string getActorId();
219  };
220 
221  /**
222  * Path Finding
223  * @author Andreas Drewke
224  */
225  class PathFinding {
226  private:
227  Context* context { nullptr };
229  vector<unique_ptr<PathFindingThread>> threads;
230  unordered_map<string, int> actorThreadMap;
231  int scheduleThreadIdx { 0 };
233  public:
234  /**
235  * Public constructor
236  * @param context context
237  * @param threadCount thread count or 0 for default
238  */
240 
241  /**
242  * Set thread count
243  * @param threadCount thread count
244  */
245  void setThreadCount(int threadCount);
246 
247  /**
248  * Start path finding
249  */
250  void start();
251 
252  /**
253  * Shutdown path finding
254  */
255  void shutdown();
256 
257  /**
258  * Add world action
259  * @param action action
260  */
262 
263  /**
264  * Find path
265  * @param logicId logic id
266  * @param actorId actor id
267  * @param startPosition start position
268  * @param endPosition end position
269  * @param path path
270  * @param alternativeEndSteps alternative end steps
271  * @param customTest custom test
272  * @param createFlowMap create flow map
273  * @param flowMapEndPositions flow map end positions
274  * @param flowMapWidth flow map width
275  * @param flowMapDepth flow map height
276  * @param flowMap pointer to flowmap variable to store flowmap into
277  */
279  const string& logicId,
280  const string& actorId,
281  const Vector3& startPosition,
282  const Vector3& endPosition,
283  vector<Vector3>& path,
284  int alternativeEndSteps = 0,
285  PathFindingCustomTest* customTest = nullptr,
286  bool createFlowMap = false,
287  const vector<Vector3> flowMapEndPositions = vector<Vector3>(),
288  const float flowMapWidth = 0.0,
289  const float flowMapDepth = 0.0,
290  FlowMap** flowMap = nullptr
291  );
292 
293  /**
294  * Get flow map extension
295  * @param actorId actor id
296  * @param flowMap pointer to flowmap variable to store flowmap into
297  * @return if this is the last flow map extensions
298  */
299  bool getFlowMapExtension(const string& actorId, FlowMap** flowMap);
300 
301  /**
302  * Reset current path finding
303  */
304  void reset();
305 
306  /**
307  * Cancel
308  * @param actorId actor id
309  */
310  void cancel(const string& actorId);
311 
312  /**
313  * Notify a cancelled actor path finding
314  * @param actorId actor id
315  */
316  void notifyCancel(const string& actorId);
317  };
318 
319 private:
320 
321  /**
322  * Context physics world listener
323  */
325  friend class Context;
326  private:
327  Context* context { nullptr };
328  public:
329  /**
330  * Constructor
331  * @param context context
332  */
334 
335  // overridden methods
336  void onAddedBody(const string& id, Body::BodyType type, uint16_t collisionTypeId, bool enabled, const Transform& transform, float restitution, float friction, float mass, const Vector3& inertiaTensor, const vector<BoundingVolume*>& boundingVolumes, bool hierarchy = false) override;
337  void onRemovedBody(const string& id, Body::BodyType type, uint16_t collisionTypeId) override;
338  void onAddedSubBody(const string& id, Body::BodyType type, uint16_t collisionTypeId, const string& subBodyParentId, const string& subBodyId, const Transform& transform, const vector<BoundingVolume*>& boundingVolumes) override;
339  void onRemovedSubBody(const string& id, Body::BodyType type, uint16_t collisionTypeId, const string& subBodyParentId, const string& subBodyId) override;
340  };
341 
342  struct PacketState {
343  int64_t timeCreated;
344  uint32_t messageId;
345  };
346 
348 
349  int64_t timeStarted;
350 
351  // path finding which is context bound too
352  uint16_t bodyCollisionTypeIdMask { 1/*Body::TYPEID_STATIC*/ };
354  uint16_t bodyCollisionTypeIdCloneMask { 1/*Body::TYPEID_STATIC*/ };
356 
357  // context main data
358  volatile bool initialized;
359  Mutex* logicsMutex { nullptr };
360  unique_ptr<ContextWorldListener> worldListener;
361  unique_ptr<Scene> scene;
362  unordered_map<string, Logic*> logicsById;
363  vector<Logic*> logics;
364  vector<Logic*> newLogics;
365  unordered_map<string, PacketState> packetStates;
366  int soundPoolSize { 10 };
367 
368 protected:
369  unique_ptr<Engine> guiEngine;
370  unique_ptr<Engine> engine;
371  unique_ptr<World> world;
372  Audio* audio { nullptr };
373  bool server;
374 
375 public:
376  // forbid class copy
378 
379  /**
380  * Public constructor
381  * @param server server
382  */
383  Context(bool server);
384 
385  /**
386  * Destructor
387  */
388  virtual ~Context();
389 
390  /**
391  * @return application root path name
392  */
393  inline const string& getApplicationRootPathName() {
395  }
396 
397  /**
398  * Set application root path name
399  * @param applicationRootPathName application root path name
400  */
402  this->applicationRootPathName = applicationRootPathName;
403  }
404 
405  /**
406  * @return time started
407  */
408  inline int64_t getTimeStarted() {
409  return timeStarted;
410  }
411 
412  /**
413  * @return if initialized
414  */
415  inline bool isInitialized() {
416  return initialized;
417  }
418 
419  /**
420  * @return logics mutex
421  */
422  inline Mutex* getLogicsMutex() {
423  return logicsMutex;
424  }
425 
426  /**
427  * Set logics mutex
428  */
430  this->logicsMutex = logicsMutex;
431  }
432 
433  /**
434  * @return is context is server context
435  */
436  inline bool isServer() {
437  return server;
438  }
439 
440  /**
441  * @return engine
442  */
443  inline Engine* getEngine() {
444  return engine.get();
445  }
446 
447  /**
448  * Set engine
449  * @param engine engine
450  */
451  inline void setEngine(Engine* engine) {
452  this->engine = unique_ptr<Engine>(engine);
453  }
454 
455  /**
456  * Unset engine
457  * @return engine
458  */
459  inline Engine* unsetEngine() {
460  return this->engine.release();
461  }
462 
463  /**
464  * @return GUI engine
465  */
466  inline Engine* getGUIEngine() {
467  return guiEngine.get();
468  }
469 
470  /**
471  * Set GUI engine
472  * @param guiEngine engine
473  */
474  inline void setGUIEngine(Engine* guiEngine) {
475  this->guiEngine = unique_ptr<Engine>(guiEngine);
476  }
477 
478  /**
479  * Unset GUI engine
480  * @return GUI engine
481  */
482  inline Engine* unsetGUIEngine() {
483  return this->guiEngine.release();
484  }
485 
486  /**
487  * @return audio instance
488  */
489  inline Audio* getAudio() {
490  return audio;
491  }
492 
493  /**
494  * Set audio
495  * @param audio audio
496  */
497  inline void setAudio(Audio* audio) {
498  this->audio = audio;
499  }
500 
501  /**
502  * @return physics world
503  */
504  inline World* getWorld() {
505  return world.get();
506  }
507 
508  /**
509  * Set physics world
510  * @param world physics world
511  */
512  inline void setWorld(World* world) {
513  this->world = unique_ptr<World>(world);
514  }
515 
516  /**
517  * @return scene
518  */
519  inline Scene* getScene() {
520  return scene.get();
521  }
522 
523  /**
524  * Set scene
525  * @param scene scene
526  */
527  inline void setScene(Scene* scene) {
528  this->scene = unique_ptr<Scene>(scene);
529  }
530 
531  /**
532  * Unset scene
533  * @return scene
534  */
535  inline Scene* unsetScene() {
536  return this->scene.release();
537  }
538 
539  /**
540  * Initialize logics
541  */
542  virtual void initialize();
543 
544  /**
545  * Shut down logics
546  */
547  virtual void shutdown();
548 
549  /**
550  * Add logic
551  * @param logic logic
552  */
553  void addLogic(Logic* logic);
554 
555  /**
556  * Get logic
557  * @param id id
558  * @return logic or nullptr
559  */
560  inline Logic* getLogic(const string& id) {
561  auto logicIt = logicsById.find(id);
562  return logicIt != logicsById.end()?logicIt->second:nullptr;
563  }
564 
565  /**
566  * Add logics that have been added and tagged as new
567  * @return count of new logics that have been finally added to context
568  */
569  inline int addNewLogics() {
570  int newLogicsCount = newLogics.size();
571  // add new game logics
572  for (auto logic: newLogics) {
573  // add game logic to lists
574  logicsById[logic->getId()] = logic;
575  logics.push_back(logic);
576  }
577  newLogics.clear();
578  return newLogicsCount;
579  }
580 
581  /**
582  * @return logics
583  */
584  inline const vector<Logic*>& getLogics() {
585  return logics;
586  }
587 
588  /**
589  * @return new logics
590  */
591  inline const vector<Logic*>& getNewLogics() {
592  return newLogics;
593  }
594 
595  /**
596  * @return path finding body collision type id mask
597  */
598  inline uint16_t getBodyCollisionTypeIdMask() {
600  }
601 
602  /**
603  * Set path finding body collision type id mask
604  * @param bodyCollisionTypeIdMask body collision type id mask
605  */
607  this->bodyCollisionTypeIdMask = bodyCollisionTypeIdMask;
608  }
609 
610  /**
611  * @return body collision type id mask to skip on in path finding
612  */
615  }
616 
617  /**
618  * Set body collision type id mask to skip on in path finding
619  * @param skipOnBodyCollisionTypeIdMask skip on body collision type id mask
620  */
622  this->skipOnBodyCollisionTypeIdMask = skipOnBodyCollisionTypeIdMask;
623  }
624 
625  /**
626  * @return body collision type id clone mask
627  */
630  }
631 
632  /**
633  * Set body collision type id clone mask, which is used for path finding
634  * @param bodyCollisionTypeIdCloneMask body type id clone mask
635  */
637  this->bodyCollisionTypeIdCloneMask = bodyCollisionTypeIdCloneMask;
638  }
639 
640  /**
641  * @return sound pool size
642  */
643  inline int getSoundPoolSize() {
644  return soundPoolSize;
645  }
646 
647  /**
648  * Set sound pool size
649  * @param soundPoolSize sound pool size
650  */
651  inline void setSoundPoolSize(int soundPoolSize) {
652  this->soundPoolSize = soundPoolSize;
653  }
654 
655  /**
656  * Get path finding thread
657  */
659  return &pathFinding;
660  }
661 
662  /**
663  * Returns if to process packet or not
664  * @param logic logic
665  * @param packet packet
666  * @param key key
667  * @return if to process packet
668  */
669  bool doProcessPacket(NetworkLogic* logic, LogicNetworkPacket& packet, const string& key);
670 
671  /**
672  * Returns if to process packet or not
673  * @param logic logic
674  * @param packet packet
675  * @param line line
676  * @param key key
677  * @return if to process packet
678  */
679  inline bool doProcessPacketAtLine(NetworkLogic* logic, LogicNetworkPacket& packet, uint32_t line, const string& key = string()) {
680  return doProcessPacket(logic, packet, to_string(line) + (key.length() == 0?"":"_" + key));
681  }
682 
683  /**
684  * Unsets if to process packet or not
685  * @param logic logic
686  * @param packet packet
687  * @param key key
688  */
689  void unsetProcessPacket(NetworkLogic* logic, LogicNetworkPacket& packet, const string& key);
690 
691  /**
692  * Unset if to process packet or not
693  * @param logic logic
694  * @param packet packet
695  * @param line line
696  * @param key key
697  */
698  inline void unsetProcessPacketAtLine(NetworkLogic* logic, LogicNetworkPacket& packet, uint32_t line, const string& key = string()) {
699  unsetProcessPacket(logic, packet, to_string(line) + (key.length() == 0?"":"_" + key));
700  }
701 
702  /**
703  * Update engine initialization, which is called once per frame before calling logic updateEngine() methods
704  */
705  virtual void initUpdateEngine();
706 
707  /**
708  * Update engine done, which is called once per frame after calling logic updateEngine() methods
709  */
710  virtual void doneUpdateEngine();
711 
712  /**
713  * Logics initialization, which is called once per logics updates
714  */
715  virtual void initUpdateLogics();
716 
717  /**
718  * Logics finalizations, which is called once per logics updates
719  */
720  virtual void doneUpdateLogics();
721 
722 };
Interface to audio module.
Definition: Audio.h:29
Engine main class.
Definition: Engine.h:131
Transform which contain scale, rotations and translation.
Definition: Transform.h:29
Context physics world listener.
Definition: Context.h:324
void onAddedSubBody(const string &id, Body::BodyType type, uint16_t collisionTypeId, const string &subBodyParentId, const string &subBodyId, const Transform &transform, const vector< BoundingVolume * > &boundingVolumes) override
Definition: Context.cpp:587
void onAddedBody(const string &id, Body::BodyType type, uint16_t collisionTypeId, bool enabled, const Transform &transform, float restitution, float friction, float mass, const Vector3 &inertiaTensor, const vector< BoundingVolume * > &boundingVolumes, bool hierarchy=false) override
Definition: Context.cpp:559
ContextWorldListener(Context *context)
Constructor.
Definition: Context.cpp:556
void onRemovedBody(const string &id, Body::BodyType type, uint16_t collisionTypeId) override
Definition: Context.cpp:577
void onRemovedSubBody(const string &id, Body::BodyType type, uint16_t collisionTypeId, const string &subBodyParentId, const string &subBodyId) override
Definition: Context.cpp:591
unique_ptr< tdme::utilities::PathFinding > pathFinding
Definition: Context.h:129
unordered_map< string, FlowMapRequest > flowMapRequests
Definition: Context.h:127
PathFindingThread(Context *context, int idx)
Public constructor.
Definition: Context.cpp:79
State findPath(const string &logicId, const string &actorId, const Vector3 &startPosition, const Vector3 &endPosition, vector< Vector3 > &path, int alternativeEndSteps=0, PathFindingCustomTest *customTest=nullptr, bool createFlowMap=false, const vector< Vector3 > flowMapEndPositions=vector< Vector3 >(), const float flowMapWidth=0.0, const float flowMapDepth=0.0, FlowMap **flowMap=nullptr)
Find path.
Definition: Context.cpp:122
vector< WorldActionStruct > worldActions
Definition: Context.h:132
FlowMapExtensionState getFlowMapExtension(const string &actorId, FlowMap **flowMap)
Get flow map extension.
Definition: Context.cpp:217
void cancel(const string &actorId)
Cancel.
Definition: Context.cpp:236
void addWorldAction(const WorldActionStruct &action)
Add world action.
Definition: Context.cpp:116
void reset()
Reset current path finding.
virtual ~PathFindingThread()
Public destructor.
Definition: Context.cpp:96
unordered_map< string, int > actorThreadMap
Definition: Context.h:230
void notifyCancel(const string &actorId)
Notify a cancelled actor path finding.
Definition: Context.cpp:550
vector< unique_ptr< PathFindingThread > > threads
Definition: Context.h:229
void setThreadCount(int threadCount)
Set thread count.
Definition: Context.cpp:404
PathFindingThread::State findPath(const string &logicId, const string &actorId, const Vector3 &startPosition, const Vector3 &endPosition, vector< Vector3 > &path, int alternativeEndSteps=0, PathFindingCustomTest *customTest=nullptr, bool createFlowMap=false, const vector< Vector3 > flowMapEndPositions=vector< Vector3 >(), const float flowMapWidth=0.0, const float flowMapDepth=0.0, FlowMap **flowMap=nullptr)
Find path.
Definition: Context.cpp:430
void start()
Start path finding.
Definition: Context.cpp:408
void addWorldAction(const Context::PathFindingThread::WorldActionStruct &action)
Add world action.
Definition: Context.cpp:422
void shutdown()
Shutdown path finding.
Definition: Context.cpp:416
void cancel(const string &actorId)
Cancel.
Definition: Context.cpp:546
bool getFlowMapExtension(const string &actorId, FlowMap **flowMap)
Get flow map extension.
Definition: Context.cpp:532
PathFinding(Context *context, int threadCount=0)
Public constructor.
Definition: Context.cpp:397
void reset()
Reset current path finding.
Definition: Context.cpp:426
Engine * unsetGUIEngine()
Unset GUI engine.
Definition: Context.h:482
uint16_t getBodyCollisionTypeIdMask()
Definition: Context.h:598
void setSkipOnBodyCollisionTypeIdMask(uint16_t skipOnBodyCollisionTypeIdMask)
Set body collision type id mask to skip on in path finding.
Definition: Context.h:621
unordered_map< string, PacketState > packetStates
Definition: Context.h:365
void setAudio(Audio *audio)
Set audio.
Definition: Context.h:497
void setEngine(Engine *engine)
Set engine.
Definition: Context.h:451
unique_ptr< ContextWorldListener > worldListener
Definition: Context.h:360
virtual void initialize()
Initialize logics.
Definition: Context.cpp:604
unique_ptr< Scene > scene
Definition: Context.h:361
bool doProcessPacket(NetworkLogic *logic, LogicNetworkPacket &packet, const string &key)
Returns if to process packet or not.
Definition: Context.cpp:652
unique_ptr< Engine > engine
Definition: Context.h:370
void setWorld(World *world)
Set physics world.
Definition: Context.h:512
void setScene(Scene *scene)
Set scene.
Definition: Context.h:527
void unsetProcessPacket(NetworkLogic *logic, LogicNetworkPacket &packet, const string &key)
Unsets if to process packet or not.
Definition: Context.cpp:695
PathFinding * getPathFinding()
Get path finding thread.
Definition: Context.h:658
volatile bool initialized
Definition: Context.h:358
const vector< Logic * > & getLogics()
Definition: Context.h:584
bool doProcessPacketAtLine(NetworkLogic *logic, LogicNetworkPacket &packet, uint32_t line, const string &key=string())
Returns if to process packet or not.
Definition: Context.h:679
Context(bool server)
Public constructor.
Definition: Context.cpp:595
virtual void doneUpdateLogics()
Logics finalizations, which is called once per logics updates.
Definition: Context.cpp:719
vector< Logic * > newLogics
Definition: Context.h:364
virtual void initUpdateLogics()
Logics initialization, which is called once per logics updates.
Definition: Context.cpp:716
void setGUIEngine(Engine *guiEngine)
Set GUI engine.
Definition: Context.h:474
uint16_t bodyCollisionTypeIdCloneMask
Definition: Context.h:354
virtual void shutdown()
Shut down logics.
Definition: Context.cpp:620
static constexpr bool VERBOSE
Definition: Context.h:61
int addNewLogics()
Add logics that have been added and tagged as new.
Definition: Context.h:569
unordered_map< string, Logic * > logicsById
Definition: Context.h:362
const string & getApplicationRootPathName()
Definition: Context.h:393
Logic * getLogic(const string &id)
Get logic.
Definition: Context.h:560
const vector< Logic * > & getNewLogics()
Definition: Context.h:591
void setApplicationRootPathName(const string &applicationRootPathName)
Set application root path name.
Definition: Context.h:401
void setSoundPoolSize(int soundPoolSize)
Set sound pool size.
Definition: Context.h:651
uint16_t getBodyCollisionTypeIdCloneMask()
Definition: Context.h:628
virtual void doneUpdateEngine()
Update engine done, which is called once per frame after calling logic updateEngine() methods.
Definition: Context.cpp:713
unique_ptr< Engine > guiEngine
Definition: Context.h:369
Engine * unsetEngine()
Unset engine.
Definition: Context.h:459
void setBodyCollisionTypeIdCloneMask(uint16_t bodyCollisionTypeIdCloneMask)
Set body collision type id clone mask, which is used for path finding.
Definition: Context.h:636
virtual ~Context()
Destructor.
Definition: Context.cpp:600
void unsetProcessPacketAtLine(NetworkLogic *logic, LogicNetworkPacket &packet, uint32_t line, const string &key=string())
Unset if to process packet or not.
Definition: Context.h:698
void setLogicsMutex(Mutex *logicsMutex)
Set logics mutex.
Definition: Context.h:429
Scene * unsetScene()
Unset scene.
Definition: Context.h:535
vector< Logic * > logics
Definition: Context.h:363
unique_ptr< World > world
Definition: Context.h:371
uint16_t skipOnBodyCollisionTypeIdMask
Definition: Context.h:353
uint16_t getSkipOnBodyCollisionTypeIdMask()
Definition: Context.h:613
virtual void initUpdateEngine()
Update engine initialization, which is called once per frame before calling logic updateEngine() meth...
Definition: Context.cpp:710
void setBodyCollisionTypeIdMask(uint16_t bodyCollisionTypeIdMask)
Set path finding body collision type id mask.
Definition: Context.h:606
void addLogic(Logic *logic)
Add logic.
Definition: Context.cpp:631
Rigid body class.
Definition: Body.h:41
Dynamic physics world class.
Definition: World.h:38
Scene entity definition.
Definition: SceneEntity.h:23
Scene definition.
Definition: Scene.h:50
Vector3 class representing vector3 mathematical structure and operations with x, y,...
Definition: Vector3.h:20
Mutex implementation.
Definition: Mutex.h:19
Base class for threads.
Definition: Thread.h:20
Console class.
Definition: Console.h:29
String tools class.
Definition: StringTools.h:22
Time utility class.
Definition: Time.h:20
World listener which is about notifying adding or removing bodies.
Definition: WorldListener.h:23
Path finding custom test interface.
#define FORBID_CLASS_COPY(CLASS)
Definition: tdme.h:6