VR-Vantage 2.5 API Documentation
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
DtDe.h
Go to the documentation of this file.
1 /******************************************************************************
2 ** Copyright (c) 2018 MAK Technologies, Inc.
3 ** All rights reserved.
4 ******************************************************************************/
5 
9 
10 #pragma once
11 
13 #include <vrvCore/DtDisplayProxy.h>
14 
16 
17 #include <vlutil/vlThreadSysWrapper.h>
18 
19 #include <vector>
20 
21 #include <boost/bind.hpp>
22 #include <boost/thread.hpp>
23 
26 #define DT_DE_INIT_ONCE(de)\
27 if(de.isInitFunctionRegistered((void*)&init))\
28 {\
29  return;\
30 }\
31 else\
32 {\
33  de.registerInitFunction((void*)&init);\
34 }
35 
36 class DtClock;
37 
38 namespace makVrv
39 {
40  class DtAgentManager;
41  class DtBackgroundLoader;
42  class DtDataBank;
43  class DtDeProctor;
44  class DtDeSharedState;
45  class DtDisplay;
46  class DtDriverManager;
47  class DtFileCache;
48  class DtInMemoryProfilerDistributorAgent;
49  class DtMessageDispatcher;
50  class DtProctor;
51  class DtRenderer;
52  class DtScene;
53  class DtVirtualBaseClass;
54  class DtSchemaManager;
55  class DtStatsSet;
56  class DtDeError;
57  class DtDisplayConfiguration;
58  class DtWindowConfiguration;
59  class DtChannelConfiguration;
60  class DtDriverConfiguration;
61  class DtSynchronizedTimeManager;
62 
67  {
68  public:
69 
70  friend class DtDeProctor;
71 
73  typedef std::vector<std::pair<DtDeError,bool> > DeErrors;
74 
75  public:
76 
78  DtDe();
79 
82  virtual ~DtDe();
83 
87  bool destructing();
88 
95  bool resetting();
96 
100  virtual void setDeInitializer(const DtDeInitializer& initializer);
101 
106  virtual void setPathConfiguration(const DtDePathConfiguration& pathConfig);
107 
110  {
111  Initialized = 1,
112  UnableToInitialize = 0,
113  UnableToInitializeDueToLicense = -1
114  };
115 
128  virtual InitializationResult initialize( bool abortOnLicenseFailure = true, bool useLicenseErrorDialog=true );
129 
131  bool initialized() const;
132 
136  DtThreadId threadId();
137 
143  virtual void setDeConfiguration(const DtDeConfiguration& deConfig);
144 
153  virtual void tick(double simTime);
154 
158  inline void retick() { tick(simulationTime()); }
159 
163  virtual bool timeToStop() const;
164 
166  virtual void setTimeToStop(bool flag = true);
167 
169  virtual void quit();
170 
172  virtual void reset();
173 
175  virtual void updateScene();
176 
178 
179 
181  virtual const DtDeConfiguration& deConfiguration() const;
182 
185  virtual DtDeCommunicator& igCommunicator();
186 
188  DtMainEventQueue& mainEventQueue();
189 
192  virtual DtDisplay* display();
193 
198  virtual DtScene& scene();
199 
203  virtual DtDataBank& dataBank();
204 
208  virtual DtDriverManager& driverManager();
209 
211  bool driverManagerCreated() const;
212 
214  virtual DtMessageDispatcher& dispatcher();
215 
217  inline DtDebugLog& log() { return *myDebugLog; }
218 
221  DtAgentManager& agentManager();
222 
224  DtBackgroundLoader& backgroundLoader();
225 
227  virtual double simulationTime() const;
228 
231  virtual double syncedTime() const;
232 
236  virtual DtSynchronizedTimeManager* findSynchronizedTimeManager();
237 
239  virtual int displayCount() const;
240 
242  virtual const DtDeInitializer& deInitializer() const;
243 
245  virtual const DtDePathConfiguration& dePathConfiguration() const;
246 
248  virtual bool isInMasterMode() const;
249 
251  virtual bool isInSlaveMode() const;
252 
254  virtual DtDeSharedState& sharedState();
255  virtual const DtDeSharedState& sharedState() const;
256 
259  virtual const DtSchemaManager& schemaManager() const;
260  virtual DtSchemaManager& schemaManager();
261 
263  virtual DtFileCache* fileCache();
264 
266  virtual const DeErrors& deErrors() const;
267 
269  virtual void clearDeErrors();
270 
272  virtual DtRenderer& renderer() const;
273 
275  bool renderFrameThisTick() const;
276 
280  virtual bool licenseAvailable() const;
281 
283 
285 
286 
290  virtual bool addDisplayConfiguration(const DtDisplayConfiguration&);
291 
301  virtual void realizeDisplayConfiguration(const std::string& clientName,
302  const std::string& displayName);
303 
306  virtual void destroyDisplay(DtDisplayProxySP display);
307 
310  virtual void destroyDisplay(const std::string& displayName);
311 
313  virtual void destroyAllDisplays();
314 
316  virtual bool modifyDisplay( const std::string& displayName,
317  const DtDisplayConfiguration& config );
318 
320 
322 
323 
326  virtual void setSimulationTime(double time);
327 
331  virtual double systemTime() const;
332 
334  virtual bool isPaused() const;
335 
339  virtual void pause();
340 
342  virtual void resume();
343 
348  double pausedTime() const;
349 
351  typedef DtVirtualBaseClass& (*StaticInstanceFunction)(DtDe&);
352 
355  virtual DtVirtualBaseClass* findFastInstance(
356  StaticInstanceFunction classInstanceFunction) const;
357 
361  template <typename Class>
362  DtVirtualBaseClass* findFastInstance(Class& (*staticInstFunc)(DtDe&)) const
363  {
364  return findFastInstance(reinterpret_cast<StaticInstanceFunction>(staticInstFunc));
365  }
366 
369  virtual void registerFastInstance(
370  StaticInstanceFunction classInstanceFunction, DtVirtualBaseClass* inst);
371 
375  template <typename Class>
376  void registerFastInstance(Class& (*staticInstFunc)(DtDe&),DtVirtualBaseClass* inst)
377  {
378  registerFastInstance(reinterpret_cast<StaticInstanceFunction>(staticInstFunc),inst);
379  }
380 
383  virtual DtVirtualBaseClass* findInstance(
384  const std::string& instanceName) const;
385 
395  virtual void registerInstance(const std::string& instanceName,
396  DtVirtualBaseClass* instance);
397 
399  virtual void registerProctor(unsigned short handlerId,DtProctor*);
400 
403  virtual void unregisterProctor(unsigned short handlerId);
404 
406  DtProctor* findProctor(unsigned short handlerId) const;
407 
410  DtDisplayProxySP findDisplay(const std::string& displayName );
411 
413  virtual DtDisplayProxySP findDisplayByIndex(int index);
414 
416  void setRenderFrameThisTick(bool update);
417 
419  virtual bool isValidDisplayConfiguration( const DtDisplayConfiguration& dec );
420 
422  virtual void createDebugLog(const std::string& fileName, DtDebugLog::PrintLevel level);
423 
428  virtual void startLogFrameTime();
429  virtual void stopLogFrameTime();
430 
432 
433  //
435 
436 
442  boost::signal<void ()> signal_initializeDefaultState;
443 
448  boost::signal<void ()> signal_postInitialize;
449 
455  boost::signal<void (DtDe&)> signal_preTick;
456 
462  boost::signal<void ()> signal_postTick;
463 
466  boost::signal<void (const std::string&, const std::string&)>
468 
472  boost::signal<void (const DtDisplayConfiguration&)> signal_displayConfigurationAdded;
473 
477  boost::signal<void (const std::string&)> signal_displayToBeDestroyed;
478 
482  boost::signal<void (const std::string&, const DtDisplayConfiguration&)>
484 
488  boost::signal<void (const std::string&, const DtWindowConfiguration&)>
490 
495  boost::signal<void (const std::string&, const std::string&)>
497 
501  boost::signal<void (const std::string&, const std::string&,
503 
507  boost::signal<void (const std::string&, const std::string&,
509 
513  boost::signal<void (const std::string&, const std::string&,
515 
519  boost::signal<void (const std::string&, const std::string&,
520  const std::string&, const DtChannelConfiguration&)>
522 
525  boost::signal<void (const DtDeError& error, bool critical)> signal_deError;
526 
529  boost::signal<void ()> signal_quit;
530 
532  boost::signal<void()> signal_pause;
533 
535  boost::signal<void()> signal_resume;
536 
537  boost::signal<void()> signal_aboutToAutoStartDrivers;
538 
540 
541  //
543 
544 
546  virtual void onSlaveConnected(const std::string& igName);
547 
549  virtual void emitDeError(const DtDeError& error, bool criticalError);
550 
552 
555  static const char* className();
556 
559  void registerInitFunction(void* address);
560 
562  bool isInitFunctionRegistered(void* address);
563 
566  inline bool shouldSendMesssage()
567  {
568  return isInMasterMode() && myCommunicator && !myCommunicator->masterIgOnly();
569  }
570 
571  protected:
572 
574 
575 
577  virtual unsigned int countEmbeddedWindows( const DtDisplayConfiguration &dec );
578 
580 
581 
582  virtual void initializeSchemaManager();
583 
584  virtual void initializeLibXmlIfNecessary();
585 
588  virtual bool shouldSkipThisTick( double simulationTime );
589 
591  virtual void postInitialize();
592 
594  virtual void postInitializeMaster();
595 
597  virtual void checkForData();
598 
600 
601  //Default implementation of a slave's tick.
602  void slaveTick();
603 
604  //Default implementation of a master's tick.
605  void masterTick( double simulationTime );
606 
608  void renderTick();
609 
611  DtDeProctor* proctor();
612 
614  virtual bool local_realizeDisplayConfiguration(
615  const std::string& clientName, const std::string& displayName);
616 
619  virtual void local_destroyDisplay(const std::string& displayName);
620 
622  virtual bool local_modifyDisplay( const std::string& displayName,
623  const DtDisplayConfiguration& config );
624 
626  void createDisplay(DtDisplayConfiguration&);
627 
629  void createIgCommunicator( DtDriverConfiguration& config);
630 
632  void destroyDisplay();
633 
635  bool local_addDisplayConfiguration( const DtDisplayConfiguration& dec);
636 
638  virtual void intializeStatsManager(void);
639 
641 
642  protected:
643 
645  typedef std::vector<void*> InitFunctionVector;
646 
647  // Normal map here since add/remove order matters for destruction order
648  typedef std::map<std::string,DtVirtualBaseClass*> RootedSingletonMap;
649  typedef std::map<StaticInstanceFunction,DtVirtualBaseClass*> FastRootedSingletonMap;
650 
651  typedef std::map<std::string,DtDisplayProxyWP> DisplayEngineProxyMap;
652 
653  protected:
654 
655  static const char* myClassName;
656 
661  bool myStopFlag;
679 
682 
689 
691  mutable RootedSingletonMap::const_iterator myLastInstance;
692  mutable boost::mutex myInternalDataMutex;
693 
694  DtThreadId myThreadId;
695 
698 
700  {
701  NoLicense = -1,
702  Master3D_License = 0,
703  XR_License = 1,
704  PVD_License = 2
705  };
706 
708 
712 
713  // This is used to provide an advancing time to the observer and observer event processor
714  // when simulation time is paused. Users of this 'pausedTime' must deal with the fact that
715  // the switch from paused time back to simTime will go 'into the past'
717  };
718 
719 
720  template <typename ManagerClass>
721  void defaultManagerRegisterInstanceFunction(DtDe& de, ManagerClass* mgr);
722 
757  template <typename ManagerClass>
758  ManagerClass& defaultManagerInstanceFunction(DtDe& de, bool allowedInSlave)
759  {
760  ManagerClass* mgr = dynamic_cast<ManagerClass*>
761  (de.findFastInstance(&ManagerClass::instance));
762 
763  if(!mgr)
764  {
765  //Require that manager is created before de is initialized.
766  if(de.initialized())
767  {
768  DtTHROW_NEW(DtCorruptedState,
769  "Manager created after display engine was initialized.");
770  }
771 
772  if(!allowedInSlave && de.isInSlaveMode())
773  {
774  DtTHROW_NEW(DtCorruptedState, "Create unsupported manager in slave.");
775  }
776 
777  //Create and register the manager.
778  mgr = new ManagerClass(de);
780  }
781  return *mgr;
782  }
783 
795  template <typename ManagerClass>
796  void defaultManagerRegisterInstanceFunction(DtDe& de, ManagerClass* mgr)
797  {
798  //Always override before init.
799  if(de.initialized())
800  {
801  DtTHROW_NEW(DtCorruptedState,
802  "Manager created after display engine was initialized.");
803  }
804 
805  de.registerFastInstance(&ManagerClass::instance,mgr);
806 
809  mgr->myConnections.manageConnection(
811  &ManagerClass::loadDefaults,mgr)));
812  }
813 
814 }


Copyright © 2005-2019 VT MAK. All Rights Reserved (www.mak.com)