VR-Vantage 3.2 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) 2025 MAK Technologies, Inc.
3 ** All rights reserved.
4 ******************************************************************************/
5 
9 
10 #pragma once
11 
12 #include <vrvCore/DtDisplayProxy.h>
13 
16 #include <vrvUtil/signalslib.h>
17 
18 #include <vlutil/vlThreadSysWrapper.h>
19 
20 #include <vector>
21 
22 #include <boost/bind/bind.hpp>
23 
24 #include <atomic>
25 
26 #include <shared_mutex>
27 
30 #define DT_DE_INIT_ONCE(de)\
31 if(de.isInitFunctionRegistered((void*)&init))\
32 {\
33  return;\
34 }\
35 else\
36 {\
37  de.registerInitFunction((void*)&init);\
38 }
39 
40 class DtClock;
41 
42 namespace makVrv
43 {
44  class DtAgentManager;
45  class DtBackgroundLoader;
46  class DtDataBank;
47  class DtDeProctor;
48  class DtDeSharedState;
49  class DtDisplay;
50  class DtDriverManager;
51  class DtFileCache;
52  class DtInMemoryProfilerDistributorAgent;
53  class DtMessageDispatcher;
54  class DtProctor;
55  class DtRenderer;
56  class DtScene;
57  class DtVirtualBaseClass;
58  class DtSchemaManager;
59  class DtStatsSet;
60  class DtDeError;
61  class DtDisplayConfiguration;
62  class DtWindowConfiguration;
63  class DtChannelConfiguration;
64  class DtDriverConfiguration;
65  class DtSynchronizedTimeManager;
66  class DtDrawnIntersectorManager;
67  class DtDeSplashScreen;
68  class DtDeCommunicator;
69  class DtDeRecord;
70  class DtEnvironmentVariables;
71  enum class DtModelSetId;
72 
77  {
78  public:
79 
80  friend class DtDeProctor;
81 
83  typedef std::vector<std::pair<DtDeError,bool> > DeErrors;
84 
85  public:
86 
88  enum class RenderingApiType
89  {
90  None, // this is valid and used for VRF sim
91  OpenGL, // opengl currently used by visual applications
92  };
93 
95  DtDe();
96 
99  virtual ~DtDe();
100 
104  bool destructing();
105 
112  bool resetting();
113 
117  virtual void setDeInitializer(const DtDeInitializer& initializer);
118 
123  virtual void setPathConfiguration(const DtDePathConfiguration& pathConfig);
124 
127  {
128  Initialized = 1,
129  UnableToInitialize = 0,
130  UnableToInitializeDueToLicense = -1
131  };
132 
145  virtual InitializationResult initialize( bool abortOnLicenseFailure = true, bool useLicenseErrorDialog = true);
146 
148  bool initialized() const;
149 
153  DtThreadId threadId();
154 
160  virtual void setDeConfiguration(const DtDeConfiguration& deConfig);
161 
170  virtual void tick(double simTime);
171 
175  inline void retick() { tick(simulationTime()); }
176 
180  virtual bool timeToStop() const;
181 
183  virtual void setTimeToStop(bool flag = true);
184 
185  virtual DtEnvironmentVariables& environmentVariables();
186 
188  virtual void quit();
189 
191  virtual void reset();
192 
194  virtual void updateScene();
195 
197 
198 
200  virtual const DtDeConfiguration& deConfiguration() const;
201 
204  virtual DtDeCommunicator& igCommunicator();
205 
207  DtMainEventQueue& mainEventQueue();
208 
211  virtual DtDisplay* display();
212 
217  virtual DtScene& scene();
218 
222  virtual DtDataBank& dataBank();
223 
227  virtual DtDriverManager& driverManager();
228 
230  bool driverManagerCreated() const;
231 
233  virtual DtMessageDispatcher& dispatcher();
234 
236  inline DtDebugLog& log() { return *myDebugLog; }
237 
240  DtAgentManager& agentManager();
241 
243  DtBackgroundLoader& backgroundLoader();
244 
246  virtual double simulationTime() const;
247 
250  virtual double syncedTime() const;
251 
255  virtual DtSynchronizedTimeManager* findSynchronizedTimeManager();
256 
258  virtual int displayCount() const;
259 
261  virtual const DtDeInitializer& deInitializer() const;
262 
264  virtual const DtDePathConfiguration& dePathConfiguration() const;
265 
267  virtual bool isInMasterMode() const;
268 
270  virtual bool isInSlaveMode() const;
271 
273  virtual DtDeSharedState& sharedState();
274  virtual const DtDeSharedState& sharedState() const;
275  virtual const DtDeSharedState* const sharedStatePtr() const;
276 
279  virtual const DtSchemaManager* findSchemaManager() const;
280  virtual DtSchemaManager* findSchemaManager();
281 
283  virtual DtFileCache* fileCache();
284 
286  virtual const DeErrors deErrors() const;
287 
289  virtual void clearDeErrors();
290 
292  virtual DtRenderer& renderer() const;
293 
295  bool renderFrameThisTick() const;
296 
300  virtual bool licenseAvailable() const;
301 
303  virtual DtDrawnIntersectorManager* drawnIntersectorManager();
304 
306  virtual const DtDrawnIntersectorManager* drawnIntersectorManager() const;
307 
309 
311 
312 
316  virtual bool addDisplayConfiguration(const DtDisplayConfiguration&);
317 
327  virtual void realizeDisplayConfiguration(const std::string& clientName,
328  const std::string& displayName);
329 
332  virtual void destroyDisplay(DtDisplayProxySP display);
333 
336  virtual void destroyDisplay(const std::string& displayName);
337 
339  virtual void destroyAllDisplays();
340 
342  virtual bool modifyDisplay( const std::string& displayName,
343  const DtDisplayConfiguration& config );
344 
346 
348 
349 
352  virtual void setSimulationTime(double time);
353 
357  virtual double systemTime() const;
358 
360  virtual void setCurrentFrameNumber(unsigned int frameNumber);
361 
363  virtual unsigned int currentFrameNumber() const;
364 
366  virtual bool isPaused() const;
367 
371  virtual void pause();
372 
374  virtual void resume();
375 
380  double pausedTime() const;
381 
383  typedef DtVirtualBaseClass& (*StaticInstanceFunction)(DtDe&);
384 
387  virtual DtVirtualBaseClass* findFastInstance(
388  StaticInstanceFunction classInstanceFunction) const;
389 
393  template <typename Class>
394  DtVirtualBaseClass* findFastInstance(Class& (*staticInstFunc)(DtDe&)) const
395  {
396  return findFastInstance(reinterpret_cast<StaticInstanceFunction>(staticInstFunc));
397  }
398 
401  virtual void registerFastInstance(
402  StaticInstanceFunction classInstanceFunction, DtVirtualBaseClass* inst);
403 
407  template <typename Class>
408  void registerFastInstance(Class& (*staticInstFunc)(DtDe&),DtVirtualBaseClass* inst)
409  {
410  registerFastInstance(reinterpret_cast<StaticInstanceFunction>(staticInstFunc),inst);
411  }
412 
415  virtual DtVirtualBaseClass* findInstance(
416  const std::string& instanceName) const;
417 
427  virtual void registerInstance(const std::string& instanceName,
428  DtVirtualBaseClass* instance);
429 
431  virtual void registerProctor(unsigned short handlerId,DtProctor*);
432 
435  virtual void unregisterProctor(unsigned short handlerId);
436 
438  DtProctor* findProctor(unsigned short handlerId) const;
439 
442  DtDisplayProxySP findDisplay(const std::string& displayName );
443 
445  virtual DtDisplayProxySP findDisplayByIndex(int index);
446 
448  void setRenderFrameThisTick(bool update);
449 
452  virtual bool modelSetActive( DtModelSetId i) const;
453 
456  virtual void determineActiveModelSets();
457 
459  virtual bool isValidDisplayConfiguration( const DtDisplayConfiguration& dec );
460 
462  virtual void createDebugLog(const std::string& fileName, DtDebugLog::PrintLevel level);
463 
468  virtual void startLogFrameTime();
469  virtual void stopLogFrameTime();
470 
472 
473  //
475 
476 
482  boost::signalslib::signal<void ()> signal_initializeDefaultState;
483 
488  boost::signalslib::signal<void ()> signal_postInitialize;
489 
495  boost::signalslib::signal<void (DtDe&)> signal_preTick;
496 
502  boost::signalslib::signal<void ()> signal_postTick;
503 
506  boost::signalslib::signal<void (const std::string&, const std::string&)>
508 
512  boost::signalslib::signal<void (const DtDisplayConfiguration&)> signal_displayConfigurationAdded;
513 
517  boost::signalslib::signal<void (const std::string&)> signal_displayToBeDestroyed;
518 
522  boost::signalslib::signal<void (const std::string&, const DtDisplayConfiguration&)>
524 
528  boost::signalslib::signal<void (const std::string&, const DtWindowConfiguration&)>
530 
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&)> signal_channelToBeDestroyed;
555 
559  boost::signalslib::signal<void (const std::string&, const std::string&,
560  const std::string&, const DtChannelConfiguration&)>
562 
564  boost::signalslib::signal<void( )> signal_postMainWindowInitialize;
565 
568  boost::signalslib::signal<void (const DtDeError& error, bool critical)> signal_deError;
569 
572  boost::signalslib::signal<void ()> signal_quit;
573 
575  boost::signalslib::signal<void()> signal_pause;
576 
578  boost::signalslib::signal<void()> signal_resume;
579 
580  boost::signalslib::signal<void()> signal_aboutToAutoStartDrivers;
581 
583 
584  //
586 
587 
589  virtual void onSlaveConnected(const std::string& igName);
590 
592  virtual void emitDeError(const DtDeError& error, bool criticalError);
593 
595 
598  static const char* className();
599 
602  void registerInitFunction(void* address);
603 
605  bool isInitFunctionRegistered(void* address);
606 
609  bool shouldSendMesssage();
610 
613  virtual void setTargetFrameTime(double frameTimeInMs);
616  virtual double targetFrameTime();
617 
619  virtual void startProfilerNextFrame();
621  virtual void stopProfilerNextFrame();
622 
624  virtual double lastUpdateTime() const;
625 
627  virtual void setShowErrorDialogs(bool show);
628 
630  virtual bool showErrorDialogs() const;
631 
634  virtual void setRenderingApi(DtDe::RenderingApiType type);
635 
637  virtual DtDe::RenderingApiType renderingApi() const;
638 
639  protected:
640 
642 
643 
645  virtual unsigned int countEmbeddedWindows( const DtDisplayConfiguration &dec );
646 
648 
649 
650  virtual void initializeSchemaManager();
651 
652  virtual void initializeLibXmlIfNecessary();
653 
656  virtual bool shouldSkipThisTick( double simulationTime );
657 
659  virtual void postInitialize();
660 
662  virtual void postInitializeMaster();
663 
665  virtual void checkForData();
666 
668 
670  void slaveTick();
671 
673  void masterTick( double simulationTime );
674 
677  virtual void renderTick(double elapsedTime);
678 
680  DtDeProctor* proctor();
681 
683  virtual bool local_realizeDisplayConfiguration(
684  const std::string& clientName, const std::string& displayName);
685 
688  virtual void local_destroyDisplay(const std::string& displayName);
689 
691  virtual bool local_modifyDisplay( const std::string& displayName,
692  const DtDisplayConfiguration& config );
693 
695  void createDisplay(DtDisplayConfiguration&);
696 
698  void createIgCommunicator( DtDriverConfiguration& config);
699 
701  void destroyDisplay();
702 
704  bool local_addDisplayConfiguration( const DtDisplayConfiguration& dec);
705 
707  virtual void intializeStatsManager(void);
708 
710 
711 
712  protected:
713 
715  typedef std::vector<void*> InitFunctionVector;
716 
717  // Normal map here since add/remove order matters for destruction order
718  typedef std::map<std::string,DtVirtualBaseClass*> RootedSingletonMap;
719  typedef std::map<StaticInstanceFunction,DtVirtualBaseClass*> FastRootedSingletonMap;
720 
721  typedef std::map<std::string,DtDisplayProxyWP> DisplayEngineProxyMap;
722 
723  protected:
724 
725  static const char* myClassName;
726 
731  bool myStopFlag;
734  unsigned int myCurrentFrameNumber;
750 
753 
760  std::vector<bool> myActiveModelSets;
761 
762  mutable std::string myLastInstanceName;
763  mutable RootedSingletonMap::const_iterator myLastInstance;
764  mutable std::shared_timed_mutex myInternalDataMutex;
765  mutable std::shared_timed_mutex myErrorMutex;
766 
767  DtThreadId myThreadId;
768 
771 
773  {
774  NoLicense = -1,
775  Master3D_License = 0,
776  XR_License = 1,
777  PVD_License = 2
778  };
779 
781 
785 
786  // This is used to provide an advancing time to the observer and observer event processor
787  // when simulation time is paused. Users of this 'pausedTime' must deal with the fact that
788  // the switch from paused time back to simTime will go 'into the past'
790 
793 
796 
797  // used by IMGui Profiler to start before the rest of the events
800 
801  DtDrawnIntersectorManager* myDrawnIntersectorManager = nullptr;
802 
804 
806 
808  };
809 
810 
811  template <typename ManagerClass>
812  void defaultManagerRegisterInstanceFunction(DtDe& de, ManagerClass* mgr);
813 
848  template <typename ManagerClass>
849  ManagerClass& defaultManagerInstanceFunction(DtDe& de, bool allowedInSlave)
850  {
851  ManagerClass* mgr = dynamic_cast<ManagerClass*>
852  (de.findFastInstance(&ManagerClass::instance));
853 
854  if(!mgr)
855  {
856  //Require that manager is created before de is initialized.
857  if(de.initialized())
858  {
859  DtTHROW_NEW(DtCorruptedState,
860  "Manager created after display engine was initialized.");
861  }
862 
863  if(!allowedInSlave && de.isInSlaveMode())
864  {
865  DtTHROW_NEW(DtCorruptedState, "Create unsupported manager in slave.");
866  }
867 
868  //Create and register the manager.
869  mgr = new ManagerClass(de);
871  }
872  return *mgr;
873  }
874 
886  template <typename ManagerClass>
887  void defaultManagerRegisterInstanceFunction(DtDe& de, ManagerClass* mgr)
888  {
889  //Always override before init.
890  if(de.initialized())
891  {
892  DtTHROW_NEW(DtCorruptedState,
893  "Manager created after display engine was initialized.");
894  }
895 
896  de.registerFastInstance(&ManagerClass::instance,mgr);
897 
900  mgr->myConnections.manageConnection(
901  de.signal_initializeDefaultState.connect(boost::bind(
902  &ManagerClass::loadDefaults,mgr)));
903  }
904 
905 }


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