VR-Vantage 3.1 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) 2023 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  class DtDeSplashScreen;
67  enum class DtModelSetId;
68 
73  {
74  public:
75 
76  friend class DtDeProctor;
77 
79  typedef std::vector<std::pair<DtDeError,bool> > DeErrors;
80 
81  public:
82 
84  enum class RenderingApiType
85  {
86  None, // this is valid and used for VRF sim
87  OpenGL, // opengl currently used by visual applications
88  };
89 
91  DtDe();
92 
95  virtual ~DtDe();
96 
100  bool destructing();
101 
108  bool resetting();
109 
113  virtual void setDeInitializer(const DtDeInitializer& initializer);
114 
119  virtual void setPathConfiguration(const DtDePathConfiguration& pathConfig);
120 
123  {
124  Initialized = 1,
125  UnableToInitialize = 0,
126  UnableToInitializeDueToLicense = -1
127  };
128 
141  virtual InitializationResult initialize( bool abortOnLicenseFailure = true, bool useLicenseErrorDialog = true);
142 
144  bool initialized() const;
145 
149  DtThreadId threadId();
150 
156  virtual void setDeConfiguration(const DtDeConfiguration& deConfig);
157 
166  virtual void tick(double simTime);
167 
171  inline void retick() { tick(simulationTime()); }
172 
176  virtual bool timeToStop() const;
177 
179  virtual void setTimeToStop(bool flag = true);
180 
182  virtual void quit();
183 
185  virtual void reset();
186 
188  virtual void updateScene();
189 
191 
192 
194  virtual const DtDeConfiguration& deConfiguration() const;
195 
198  virtual DtDeCommunicator& igCommunicator();
199 
201  DtMainEventQueue& mainEventQueue();
202 
205  virtual DtDisplay* display();
206 
211  virtual DtScene& scene();
212 
216  virtual DtDataBank& dataBank();
217 
221  virtual DtDriverManager& driverManager();
222 
224  bool driverManagerCreated() const;
225 
227  virtual DtMessageDispatcher& dispatcher();
228 
230  inline DtDebugLog& log() { return *myDebugLog; }
231 
234  DtAgentManager& agentManager();
235 
237  DtBackgroundLoader& backgroundLoader();
238 
240  virtual double simulationTime() const;
241 
244  virtual double syncedTime() const;
245 
249  virtual DtSynchronizedTimeManager* findSynchronizedTimeManager();
250 
252  virtual int displayCount() const;
253 
255  virtual const DtDeInitializer& deInitializer() const;
256 
258  virtual const DtDePathConfiguration& dePathConfiguration() const;
259 
261  virtual bool isInMasterMode() const;
262 
264  virtual bool isInSlaveMode() const;
265 
267  virtual DtDeSharedState& sharedState();
268  virtual const DtDeSharedState& sharedState() const;
269  virtual const DtDeSharedState* const sharedStatePtr() const;
270 
273  virtual const DtSchemaManager* findSchemaManager() const;
274  virtual DtSchemaManager* findSchemaManager();
275 
277  virtual DtFileCache* fileCache();
278 
280  virtual const DeErrors deErrors() const;
281 
283  virtual void clearDeErrors();
284 
286  virtual DtRenderer& renderer() const;
287 
289  bool renderFrameThisTick() const;
290 
294  virtual bool licenseAvailable() const;
295 
297  virtual DtDrawnIntersectorManager* drawnIntersectorManager();
298 
300  virtual const DtDrawnIntersectorManager* drawnIntersectorManager() const;
301 
303 
305 
306 
310  virtual bool addDisplayConfiguration(const DtDisplayConfiguration&);
311 
321  virtual void realizeDisplayConfiguration(const std::string& clientName,
322  const std::string& displayName);
323 
326  virtual void destroyDisplay(DtDisplayProxySP display);
327 
330  virtual void destroyDisplay(const std::string& displayName);
331 
333  virtual void destroyAllDisplays();
334 
336  virtual bool modifyDisplay( const std::string& displayName,
337  const DtDisplayConfiguration& config );
338 
340 
342 
343 
346  virtual void setSimulationTime(double time);
347 
351  virtual double systemTime() const;
352 
354  virtual void setCurrentFrameNumber(unsigned int frameNumber);
355 
357  virtual unsigned int currentFrameNumber() const;
358 
360  virtual bool isPaused() const;
361 
365  virtual void pause();
366 
368  virtual void resume();
369 
374  double pausedTime() const;
375 
377  typedef DtVirtualBaseClass& (*StaticInstanceFunction)(DtDe&);
378 
381  virtual DtVirtualBaseClass* findFastInstance(
382  StaticInstanceFunction classInstanceFunction) const;
383 
387  template <typename Class>
388  DtVirtualBaseClass* findFastInstance(Class& (*staticInstFunc)(DtDe&)) const
389  {
390  return findFastInstance(reinterpret_cast<StaticInstanceFunction>(staticInstFunc));
391  }
392 
395  virtual void registerFastInstance(
396  StaticInstanceFunction classInstanceFunction, DtVirtualBaseClass* inst);
397 
401  template <typename Class>
402  void registerFastInstance(Class& (*staticInstFunc)(DtDe&),DtVirtualBaseClass* inst)
403  {
404  registerFastInstance(reinterpret_cast<StaticInstanceFunction>(staticInstFunc),inst);
405  }
406 
409  virtual DtVirtualBaseClass* findInstance(
410  const std::string& instanceName) const;
411 
421  virtual void registerInstance(const std::string& instanceName,
422  DtVirtualBaseClass* instance);
423 
425  virtual void registerProctor(unsigned short handlerId,DtProctor*);
426 
429  virtual void unregisterProctor(unsigned short handlerId);
430 
432  DtProctor* findProctor(unsigned short handlerId) const;
433 
436  DtDisplayProxySP findDisplay(const std::string& displayName );
437 
439  virtual DtDisplayProxySP findDisplayByIndex(int index);
440 
442  void setRenderFrameThisTick(bool update);
443 
446  virtual bool modelSetActive( DtModelSetId i) const;
447 
450  virtual void determineActiveModelSets();
451 
453  virtual bool isValidDisplayConfiguration( const DtDisplayConfiguration& dec );
454 
456  virtual void createDebugLog(const std::string& fileName, DtDebugLog::PrintLevel level);
457 
462  virtual void startLogFrameTime();
463  virtual void stopLogFrameTime();
464 
466 
467  //
469 
470 
476  boost::signalslib::signal<void ()> signal_initializeDefaultState;
477 
482  boost::signalslib::signal<void ()> signal_postInitialize;
483 
489  boost::signalslib::signal<void (DtDe&)> signal_preTick;
490 
496  boost::signalslib::signal<void ()> signal_postTick;
497 
500  boost::signalslib::signal<void (const std::string&, const std::string&)>
502 
506  boost::signalslib::signal<void (const DtDisplayConfiguration&)> signal_displayConfigurationAdded;
507 
511  boost::signalslib::signal<void (const std::string&)> signal_displayToBeDestroyed;
512 
516  boost::signalslib::signal<void (const std::string&, const DtDisplayConfiguration&)>
518 
522  boost::signalslib::signal<void (const std::string&, const DtWindowConfiguration&)>
524 
529  boost::signalslib::signal<void (const std::string&, const std::string&)>
531 
535  boost::signalslib::signal<void (const std::string&, const std::string&,
537 
541  boost::signalslib::signal<void (const std::string&, const std::string&,
543 
547  boost::signalslib::signal<void (const std::string&, const std::string&,
549 
553  boost::signalslib::signal<void (const std::string&, const std::string&,
554  const std::string&, const DtChannelConfiguration&)>
556 
559  boost::signalslib::signal<void (const DtDeError& error, bool critical)> signal_deError;
560 
563  boost::signalslib::signal<void ()> signal_quit;
564 
566  boost::signalslib::signal<void()> signal_pause;
567 
569  boost::signalslib::signal<void()> signal_resume;
570 
571  boost::signalslib::signal<void()> signal_aboutToAutoStartDrivers;
572 
574 
575  //
577 
578 
580  virtual void onSlaveConnected(const std::string& igName);
581 
583  virtual void emitDeError(const DtDeError& error, bool criticalError);
584 
586 
589  static const char* className();
590 
593  void registerInitFunction(void* address);
594 
596  bool isInitFunctionRegistered(void* address);
597 
600  inline bool shouldSendMesssage()
601  {
602  return isInMasterMode() && myCommunicator && !myCommunicator->masterIgOnly();
603  }
604 
607  virtual void setTargetFrameTime(double frameTimeInMs);
610  virtual double targetFrameTime();
611 
613  virtual void startProfilerNextFrame();
615  virtual void stopProfilerNextFrame();
616 
618  virtual double lastUpdateTime() const;
619 
621  virtual void setShowErrorDialogs(bool show);
622 
624  virtual bool showErrorDialogs() const;
625 
628  virtual void setRenderingApi(DtDe::RenderingApiType type);
629 
631  virtual DtDe::RenderingApiType renderingApi() const;
632 
633  protected:
634 
636 
637 
639  virtual unsigned int countEmbeddedWindows( const DtDisplayConfiguration &dec );
640 
642 
643 
644  virtual void initializeSchemaManager();
645 
646  virtual void initializeLibXmlIfNecessary();
647 
650  virtual bool shouldSkipThisTick( double simulationTime );
651 
653  virtual void postInitialize();
654 
656  virtual void postInitializeMaster();
657 
659  virtual void checkForData();
660 
662 
664  void slaveTick();
665 
667  void masterTick( double simulationTime );
668 
671  void renderTick(double elapsedTime);
672 
674  DtDeProctor* proctor();
675 
677  virtual bool local_realizeDisplayConfiguration(
678  const std::string& clientName, const std::string& displayName);
679 
682  virtual void local_destroyDisplay(const std::string& displayName);
683 
685  virtual bool local_modifyDisplay( const std::string& displayName,
686  const DtDisplayConfiguration& config );
687 
689  void createDisplay(DtDisplayConfiguration&);
690 
692  void createIgCommunicator( DtDriverConfiguration& config);
693 
695  void destroyDisplay();
696 
698  bool local_addDisplayConfiguration( const DtDisplayConfiguration& dec);
699 
701  virtual void intializeStatsManager(void);
702 
704 
705 
706  protected:
707 
709  typedef std::vector<void*> InitFunctionVector;
710 
711  // Normal map here since add/remove order matters for destruction order
712  typedef std::map<std::string,DtVirtualBaseClass*> RootedSingletonMap;
713  typedef std::map<StaticInstanceFunction,DtVirtualBaseClass*> FastRootedSingletonMap;
714 
715  typedef std::map<std::string,DtDisplayProxyWP> DisplayEngineProxyMap;
716 
717  protected:
718 
719  static const char* myClassName;
720 
725  bool myStopFlag;
728  unsigned int myCurrentFrameNumber;
744 
747 
754  std::vector<bool> myActiveModelSets;
755 
757  mutable RootedSingletonMap::const_iterator myLastInstance;
758  mutable tbb::mutex myInternalDataMutex;
759  mutable tbb::recursive_mutex myErrorMutex;
760 
761  DtThreadId myThreadId;
762 
765 
767  {
768  NoLicense = -1,
769  Master3D_License = 0,
770  XR_License = 1,
771  PVD_License = 2
772  };
773 
775 
779 
780  // This is used to provide an advancing time to the observer and observer event processor
781  // when simulation time is paused. Users of this 'pausedTime' must deal with the fact that
782  // the switch from paused time back to simTime will go 'into the past'
784 
787 
790 
791  // used by IMGui Profiler to start before the rest of the events
794 
795  DtDrawnIntersectorManager* myDrawnIntersectorManager = nullptr;
796 
798 
800  };
801 
802 
803  template <typename ManagerClass>
804  void defaultManagerRegisterInstanceFunction(DtDe& de, ManagerClass* mgr);
805 
840  template <typename ManagerClass>
841  ManagerClass& defaultManagerInstanceFunction(DtDe& de, bool allowedInSlave)
842  {
843  ManagerClass* mgr = dynamic_cast<ManagerClass*>
844  (de.findFastInstance(&ManagerClass::instance));
845 
846  if(!mgr)
847  {
848  //Require that manager is created before de is initialized.
849  if(de.initialized())
850  {
851  DtTHROW_NEW(DtCorruptedState,
852  "Manager created after display engine was initialized.");
853  }
854 
855  if(!allowedInSlave && de.isInSlaveMode())
856  {
857  DtTHROW_NEW(DtCorruptedState, "Create unsupported manager in slave.");
858  }
859 
860  //Create and register the manager.
861  mgr = new ManagerClass(de);
863  }
864  return *mgr;
865  }
866 
878  template <typename ManagerClass>
879  void defaultManagerRegisterInstanceFunction(DtDe& de, ManagerClass* mgr)
880  {
881  //Always override before init.
882  if(de.initialized())
883  {
884  DtTHROW_NEW(DtCorruptedState,
885  "Manager created after display engine was initialized.");
886  }
887 
888  de.registerFastInstance(&ManagerClass::instance,mgr);
889 
892  mgr->myConnections.manageConnection(
894  &ManagerClass::loadDefaults,mgr)));
895  }
896 
897 }


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