VR-Vantage 3.0.3 API Documentation
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
DtDe.h
Go to the documentation of this file.
1 /******************************************************************************
2 ** Copyright (c) 2022 MAK Technologies, Inc.
3 ** All rights reserved.
4 ******************************************************************************/
5 
9 
10 #pragma once
11 
13 #include <vrvCore/DtDisplayProxy.h>
14 
17 #include <vrvUtil/signalslib.h>
18 
19 #include <vlutil/vlThreadSysWrapper.h>
20 
21 #include <vector>
22 
23 #include <boost/bind.hpp>
24 #include <tbb/mutex.h>
25 #include <tbb/recursive_mutex.h>
26 
29 #define DT_DE_INIT_ONCE(de)\
30 if(de.isInitFunctionRegistered((void*)&init))\
31 {\
32  return;\
33 }\
34 else\
35 {\
36  de.registerInitFunction((void*)&init);\
37 }
38 
39 class DtClock;
40 
41 namespace makVrv
42 {
43  class DtAgentManager;
44  class DtBackgroundLoader;
45  class DtDataBank;
46  class DtDeProctor;
47  class DtDeSharedState;
48  class DtDisplay;
49  class DtDriverManager;
50  class DtFileCache;
51  class DtInMemoryProfilerDistributorAgent;
52  class DtMessageDispatcher;
53  class DtProctor;
54  class DtRenderer;
55  class DtScene;
56  class DtVirtualBaseClass;
57  class DtSchemaManager;
58  class DtStatsSet;
59  class DtDeError;
60  class DtDisplayConfiguration;
61  class DtWindowConfiguration;
62  class DtChannelConfiguration;
63  class DtDriverConfiguration;
64  class DtSynchronizedTimeManager;
65  class DtDrawnIntersectorManager;
66 
71  {
72  public:
73 
74  friend class DtDeProctor;
75 
77  typedef std::vector<std::pair<DtDeError,bool> > DeErrors;
78 
79  public:
80 
82  DtDe();
83 
86  virtual ~DtDe();
87 
91  bool destructing();
92 
99  bool resetting();
100 
104  virtual void setDeInitializer(const DtDeInitializer& initializer);
105 
110  virtual void setPathConfiguration(const DtDePathConfiguration& pathConfig);
111 
114  {
115  Initialized = 1,
116  UnableToInitialize = 0,
117  UnableToInitializeDueToLicense = -1
118  };
119 
132  virtual InitializationResult initialize( bool abortOnLicenseFailure = true, bool useLicenseErrorDialog=true );
133 
135  bool initialized() const;
136 
140  DtThreadId threadId();
141 
147  virtual void setDeConfiguration(const DtDeConfiguration& deConfig);
148 
157  virtual void tick(double simTime);
158 
162  inline void retick() { tick(simulationTime()); }
163 
167  virtual bool timeToStop() const;
168 
170  virtual void setTimeToStop(bool flag = true);
171 
173  virtual void quit();
174 
176  virtual void reset();
177 
179  virtual void updateScene();
180 
182 
183 
185  virtual const DtDeConfiguration& deConfiguration() const;
186 
189  virtual DtDeCommunicator& igCommunicator();
190 
192  DtMainEventQueue& mainEventQueue();
193 
196  virtual DtDisplay* display();
197 
202  virtual DtScene& scene();
203 
207  virtual DtDataBank& dataBank();
208 
212  virtual DtDriverManager& driverManager();
213 
215  bool driverManagerCreated() const;
216 
218  virtual DtMessageDispatcher& dispatcher();
219 
221  inline DtDebugLog& log() { return *myDebugLog; }
222 
225  DtAgentManager& agentManager();
226 
228  DtBackgroundLoader& backgroundLoader();
229 
231  virtual double simulationTime() const;
232 
235  virtual double syncedTime() const;
236 
240  virtual DtSynchronizedTimeManager* findSynchronizedTimeManager();
241 
243  virtual int displayCount() const;
244 
246  virtual const DtDeInitializer& deInitializer() const;
247 
249  virtual const DtDePathConfiguration& dePathConfiguration() const;
250 
252  virtual bool isInMasterMode() const;
253 
255  virtual bool isInSlaveMode() const;
256 
258  virtual DtDeSharedState& sharedState();
259  virtual const DtDeSharedState& sharedState() const;
260  virtual const DtDeSharedState* const sharedStatePtr() const;
261 
264  virtual const DtSchemaManager* findSchemaManager() const;
265  virtual DtSchemaManager* findSchemaManager();
266 
268  virtual DtFileCache* fileCache();
269 
271  virtual const DeErrors deErrors() const;
272 
274  virtual void clearDeErrors();
275 
277  virtual DtRenderer& renderer() const;
278 
280  bool renderFrameThisTick() const;
281 
285  virtual bool licenseAvailable() const;
286 
288  virtual DtDrawnIntersectorManager* drawnIntersectorManager();
289 
291  virtual const DtDrawnIntersectorManager* drawnIntersectorManager() const;
292 
294 
296 
297 
301  virtual bool addDisplayConfiguration(const DtDisplayConfiguration&);
302 
312  virtual void realizeDisplayConfiguration(const std::string& clientName,
313  const std::string& displayName);
314 
317  virtual void destroyDisplay(DtDisplayProxySP display);
318 
321  virtual void destroyDisplay(const std::string& displayName);
322 
324  virtual void destroyAllDisplays();
325 
327  virtual bool modifyDisplay( const std::string& displayName,
328  const DtDisplayConfiguration& config );
329 
331 
333 
334 
337  virtual void setSimulationTime(double time);
338 
342  virtual double systemTime() const;
343 
345  virtual void setCurrentFrameNumber(unsigned int frameNumber);
346 
348  virtual unsigned int currentFrameNumber() const;
349 
351  virtual bool isPaused() const;
352 
356  virtual void pause();
357 
359  virtual void resume();
360 
365  double pausedTime() const;
366 
368  typedef DtVirtualBaseClass& (*StaticInstanceFunction)(DtDe&);
369 
372  virtual DtVirtualBaseClass* findFastInstance(
373  StaticInstanceFunction classInstanceFunction) const;
374 
378  template <typename Class>
379  DtVirtualBaseClass* findFastInstance(Class& (*staticInstFunc)(DtDe&)) const
380  {
381  return findFastInstance(reinterpret_cast<StaticInstanceFunction>(staticInstFunc));
382  }
383 
386  virtual void registerFastInstance(
387  StaticInstanceFunction classInstanceFunction, DtVirtualBaseClass* inst);
388 
392  template <typename Class>
393  void registerFastInstance(Class& (*staticInstFunc)(DtDe&),DtVirtualBaseClass* inst)
394  {
395  registerFastInstance(reinterpret_cast<StaticInstanceFunction>(staticInstFunc),inst);
396  }
397 
400  virtual DtVirtualBaseClass* findInstance(
401  const std::string& instanceName) const;
402 
412  virtual void registerInstance(const std::string& instanceName,
413  DtVirtualBaseClass* instance);
414 
416  virtual void registerProctor(unsigned short handlerId,DtProctor*);
417 
420  virtual void unregisterProctor(unsigned short handlerId);
421 
423  DtProctor* findProctor(unsigned short handlerId) const;
424 
427  DtDisplayProxySP findDisplay(const std::string& displayName );
428 
430  virtual DtDisplayProxySP findDisplayByIndex(int index);
431 
433  void setRenderFrameThisTick(bool update);
434 
437  virtual bool modelSetActive(int i) const;
438 
441  virtual void determineActiveModelSets();
442 
444  virtual bool isValidDisplayConfiguration( const DtDisplayConfiguration& dec );
445 
447  virtual void createDebugLog(const std::string& fileName, DtDebugLog::PrintLevel level);
448 
453  virtual void startLogFrameTime();
454  virtual void stopLogFrameTime();
455 
457 
458  //
460 
461 
467  boost::signalslib::signal<void ()> signal_initializeDefaultState;
468 
473  boost::signalslib::signal<void ()> signal_postInitialize;
474 
480  boost::signalslib::signal<void (DtDe&)> signal_preTick;
481 
487  boost::signalslib::signal<void ()> signal_postTick;
488 
491  boost::signalslib::signal<void (const std::string&, const std::string&)>
493 
497  boost::signalslib::signal<void (const DtDisplayConfiguration&)> signal_displayConfigurationAdded;
498 
502  boost::signalslib::signal<void (const std::string&)> signal_displayToBeDestroyed;
503 
507  boost::signalslib::signal<void (const std::string&, const DtDisplayConfiguration&)>
509 
513  boost::signalslib::signal<void (const std::string&, const DtWindowConfiguration&)>
515 
520  boost::signalslib::signal<void (const std::string&, const std::string&)>
522 
526  boost::signalslib::signal<void (const std::string&, const std::string&,
528 
532  boost::signalslib::signal<void (const std::string&, const std::string&,
534 
538  boost::signalslib::signal<void (const std::string&, const std::string&,
540 
544  boost::signalslib::signal<void (const std::string&, const std::string&,
545  const std::string&, const DtChannelConfiguration&)>
547 
550  boost::signalslib::signal<void (const DtDeError& error, bool critical)> signal_deError;
551 
554  boost::signalslib::signal<void ()> signal_quit;
555 
557  boost::signalslib::signal<void()> signal_pause;
558 
560  boost::signalslib::signal<void()> signal_resume;
561 
562  boost::signalslib::signal<void()> signal_aboutToAutoStartDrivers;
563 
565 
566  //
568 
569 
571  virtual void onSlaveConnected(const std::string& igName);
572 
574  virtual void emitDeError(const DtDeError& error, bool criticalError);
575 
577 
580  static const char* className();
581 
584  void registerInitFunction(void* address);
585 
587  bool isInitFunctionRegistered(void* address);
588 
591  inline bool shouldSendMesssage()
592  {
593  return isInMasterMode() && myCommunicator && !myCommunicator->masterIgOnly();
594  }
595 
598  virtual void setTargetFrameTime(double frameTimeInMs);
601  virtual double targetFrameTime();
602 
605  virtual void runSwapBufferWork();
606 
608  virtual void startProfilerNextFrame();
610  virtual void stopProfilerNextFrame();
611 
613  virtual double lastUpdateTime() const;
614 
616  virtual void setShowErrorDialogs(bool show);
617 
619  virtual bool showErrorDialogs() const;
620 
621  protected:
622 
624 
625 
627  virtual unsigned int countEmbeddedWindows( const DtDisplayConfiguration &dec );
628 
630 
631 
632  virtual void initializeSchemaManager();
633 
634  virtual void initializeLibXmlIfNecessary();
635 
638  virtual bool shouldSkipThisTick( double simulationTime );
639 
641  virtual void postInitialize();
642 
644  virtual void postInitializeMaster();
645 
647  virtual void checkForData();
648 
650 
652  void slaveTick();
653 
655  void masterTick( double simulationTime );
656 
659  void renderTick(double elapsedTime);
660 
662  DtDeProctor* proctor();
663 
665  virtual bool local_realizeDisplayConfiguration(
666  const std::string& clientName, const std::string& displayName);
667 
670  virtual void local_destroyDisplay(const std::string& displayName);
671 
673  virtual bool local_modifyDisplay( const std::string& displayName,
674  const DtDisplayConfiguration& config );
675 
677  void createDisplay(DtDisplayConfiguration&);
678 
680  void createIgCommunicator( DtDriverConfiguration& config);
681 
683  void destroyDisplay();
684 
686  bool local_addDisplayConfiguration( const DtDisplayConfiguration& dec);
687 
689  virtual void intializeStatsManager(void);
690 
692 
693 
694  protected:
695 
697  typedef std::vector<void*> InitFunctionVector;
698 
699  // Normal map here since add/remove order matters for destruction order
700  typedef std::map<std::string,DtVirtualBaseClass*> RootedSingletonMap;
701  typedef std::map<StaticInstanceFunction,DtVirtualBaseClass*> FastRootedSingletonMap;
702 
703  typedef std::map<std::string,DtDisplayProxyWP> DisplayEngineProxyMap;
704 
705  protected:
706 
707  static const char* myClassName;
708 
713  bool myStopFlag;
716  unsigned int myCurrentFrameNumber;
732 
735 
742  std::vector<bool> myActiveModelSets;
743 
745  mutable RootedSingletonMap::const_iterator myLastInstance;
746  mutable tbb::mutex myInternalDataMutex;
747  mutable tbb::recursive_mutex myErrorMutex;
748 
749  DtThreadId myThreadId;
750 
753 
755  {
756  NoLicense = -1,
757  Master3D_License = 0,
758  XR_License = 1,
759  PVD_License = 2
760  };
761 
763 
767 
768  // This is used to provide an advancing time to the observer and observer event processor
769  // when simulation time is paused. Users of this 'pausedTime' must deal with the fact that
770  // the switch from paused time back to simTime will go 'into the past'
772 
775 
778 
779  // used by IMGui Profiler to start before the rest of the events
782 
783  DtDrawnIntersectorManager* myDrawnIntersectorManager = nullptr;
784 
786 
787  };
788 
789 
790  template <typename ManagerClass>
791  void defaultManagerRegisterInstanceFunction(DtDe& de, ManagerClass* mgr);
792 
827  template <typename ManagerClass>
828  ManagerClass& defaultManagerInstanceFunction(DtDe& de, bool allowedInSlave)
829  {
830  ManagerClass* mgr = dynamic_cast<ManagerClass*>
831  (de.findFastInstance(&ManagerClass::instance));
832 
833  if(!mgr)
834  {
835  //Require that manager is created before de is initialized.
836  if(de.initialized())
837  {
838  DtTHROW_NEW(DtCorruptedState,
839  "Manager created after display engine was initialized.");
840  }
841 
842  if(!allowedInSlave && de.isInSlaveMode())
843  {
844  DtTHROW_NEW(DtCorruptedState, "Create unsupported manager in slave.");
845  }
846 
847  //Create and register the manager.
848  mgr = new ManagerClass(de);
850  }
851  return *mgr;
852  }
853 
865  template <typename ManagerClass>
866  void defaultManagerRegisterInstanceFunction(DtDe& de, ManagerClass* mgr)
867  {
868  //Always override before init.
869  if(de.initialized())
870  {
871  DtTHROW_NEW(DtCorruptedState,
872  "Manager created after display engine was initialized.");
873  }
874 
875  de.registerFastInstance(&ManagerClass::instance,mgr);
876 
879  mgr->myConnections.manageConnection(
881  &ManagerClass::loadDefaults,mgr)));
882  }
883 
884 }


Copyright © 2005-2023 MAK Technologies. All Rights Reserved (www.mak.com)