VR-Forces 4.6 Class 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) 2017 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 
25 #define DT_DE_INIT_ONCE(de)\
26 if(de.isInitFunctionRegistered((void*)&init))\
27 {\
28  return;\
29 }\
30 else\
31 {\
32  de.registerInitFunction((void*)&init);\
33 }
34 
35 class DtClock;
36 
37 namespace makVrv
38 {
39  class DtAgentManager;
40  class DtDataBank;
41  class DtDeProctor;
42  class DtDeSharedState;
43  class DtDisplay;
44  class DtDriverManager;
45  class DtFileCache;
46  class DtInMemoryProfilerDistributorAgent;
47  class DtMessageDispatcher;
48  class DtProctor;
49  class DtRenderer;
50  class DtScene;
51  class DtVirtualBaseClass;
52  class DtSchemaManager;
53  class DtStatsSet;
54  class DtDeError;
55  class DtDisplayConfiguration;
56  class DtWindowConfiguration;
57  class DtChannelConfiguration;
58  class DtDriverConfiguration;
59  class DtSynchronizedTimeManager;
60 
65  {
66  public:
67 
68  friend class DtDeProctor;
69 
71  typedef std::vector<std::pair<DtDeError,bool> > DeErrors;
72 
73  public:
74 
76  DtDe();
77 
80  virtual ~DtDe();
81 
85  bool destructing();
86 
93  bool resetting();
94 
98  virtual void setDeInitializer(const DtDeInitializer& initializer);
99 
104  virtual void setPathConfiguration(const DtDePathConfiguration& pathConfig);
105 
108  {
109  Initialized = 1,
110  UnableToInitialize = 0,
111  UnableToInitializeDueToLicense = -1
112  };
113 
126  virtual InitializationResult initialize( bool abortOnLicenseFailure = true, bool useLicenseErrorDialog=true );
127 
129  bool initialized() const;
130 
134  DtThreadId threadId();
135 
141  virtual void setDeConfiguration(const DtDeConfiguration& deConfig);
142 
151  virtual void tick(double simTime);
152 
156  inline void retick() { tick(simulationTime()); }
157 
161  virtual bool timeToStop() const;
162 
164  virtual void setTimeToStop(bool flag = true);
165 
167  virtual void quit();
168 
170  virtual void reset();
171 
173  virtual void updateScene();
174 
176 
177 
179  virtual const DtDeConfiguration& deConfiguration() const;
180 
183  virtual DtDeCommunicator& igCommunicator();
184 
186  DtMainEventQueue& mainEventQueue();
187 
190  virtual DtDisplay* display();
191 
196  virtual DtScene& scene();
197 
201  virtual DtDataBank& dataBank();
202 
206  virtual DtDriverManager& driverManager();
207 
209  bool driverManagerCreated() const;
210 
212  virtual DtMessageDispatcher& dispatcher();
213 
215  inline DtDebugLog& log() { return *myDebugLog; }
216 
219  DtAgentManager& agentManager();
220 
222  virtual double simulationTime() const;
223 
226  virtual double syncedTime() const;
227 
231  virtual DtSynchronizedTimeManager* findSynchronizedTimeManager();
232 
234  virtual int displayCount() const;
235 
237  virtual const DtDeInitializer& deInitializer() const;
238 
240  virtual const DtDePathConfiguration& dePathConfiguration() const;
241 
243  virtual bool isInMasterMode() const;
244 
246  virtual bool isInSlaveMode() const;
247 
249  virtual DtDeSharedState& sharedState();
250  virtual const DtDeSharedState& sharedState() const;
251 
254  virtual const DtSchemaManager& schemaManager() const;
255  virtual DtSchemaManager& schemaManager();
256 
258  virtual DtFileCache* fileCache();
259 
261  virtual const DeErrors& deErrors() const;
262 
264  virtual void clearDeErrors();
265 
267  virtual DtRenderer& renderer() const;
268 
270  bool renderFrameThisTick() const;
271 
275  virtual bool licenseAvailable() const;
276 
278 
280 
281 
285  virtual bool addDisplayConfiguration(const DtDisplayConfiguration&);
286 
296  virtual void realizeDisplayConfiguration(const std::string& clientName,
297  const std::string& displayName);
298 
301  virtual void destroyDisplay(DtDisplayProxySP display);
302 
305  virtual void destroyDisplay(const std::string& displayName);
306 
308  virtual void destroyAllDisplays();
309 
311  virtual bool modifyDisplay( const std::string& displayName,
312  const DtDisplayConfiguration& config );
313 
315 
317 
318 
321  virtual void setSimulationTime(double time);
322 
326  virtual double systemTime() const;
327 
329  virtual bool isPaused() const;
330 
334  virtual void pause();
335 
337  virtual void resume();
338 
343  double pausedTime() const;
344 
346  typedef DtVirtualBaseClass& (*StaticInstanceFunction)(DtDe&);
347 
350  virtual DtVirtualBaseClass* findFastInstance(
351  StaticInstanceFunction classInstanceFunction) const;
352 
356  template <typename Class>
357  DtVirtualBaseClass* findFastInstance(Class& (*staticInstFunc)(DtDe&)) const
358  {
359  return findFastInstance(reinterpret_cast<StaticInstanceFunction>(staticInstFunc));
360  }
361 
364  virtual void registerFastInstance(
365  StaticInstanceFunction classInstanceFunction, DtVirtualBaseClass* inst);
366 
370  template <typename Class>
371  void registerFastInstance(Class& (*staticInstFunc)(DtDe&),DtVirtualBaseClass* inst)
372  {
373  registerFastInstance(reinterpret_cast<StaticInstanceFunction>(staticInstFunc),inst);
374  }
375 
378  virtual DtVirtualBaseClass* findInstance(
379  const std::string& instanceName) const;
380 
390  virtual void registerInstance(const std::string& instanceName,
391  DtVirtualBaseClass* instance);
392 
394  virtual void registerProctor(unsigned short handlerId,DtProctor*);
395 
398  virtual void unregisterProctor(unsigned short handlerId);
399 
401  DtProctor* findProctor(unsigned short handlerId) const;
402 
405  DtDisplayProxySP findDisplay(const std::string& displayName );
406 
408  virtual DtDisplayProxySP findDisplayByIndex(int index);
409 
411  void setRenderFrameThisTick(bool update);
412 
414  virtual bool isValidDisplayConfiguration( const DtDisplayConfiguration& dec );
415 
417  virtual void createDebugLog(const std::string& fileName, DtDebugLog::PrintLevel level);
418 
423  virtual void startLogFrameTime();
424  virtual void stopLogFrameTime();
425 
427 
428  //
430 
431 
437  boost::signal<void ()> signal_initializeDefaultState;
438 
443  boost::signal<void ()> signal_postInitialize;
444 
450  boost::signal<void (DtDe&)> signal_preTick;
451 
457  boost::signal<void ()> signal_postTick;
458 
461  boost::signal<void (const std::string&, const std::string&)>
463 
467  boost::signal<void (const DtDisplayConfiguration&)> signal_displayConfigurationAdded;
468 
472  boost::signal<void (const std::string&)> signal_displayToBeDestroyed;
473 
477  boost::signal<void (const std::string&, const DtDisplayConfiguration&)>
479 
483  boost::signal<void (const std::string&, const DtWindowConfiguration&)>
485 
490  boost::signal<void (const std::string&, const std::string&)>
492 
496  boost::signal<void (const std::string&, const std::string&,
498 
502  boost::signal<void (const std::string&, const std::string&,
504 
508  boost::signal<void (const std::string&, const std::string&,
509  const std::string&)> signal_channelToBeDestroyed;
510 
514  boost::signal<void (const std::string&, const std::string&,
515  const std::string&, const DtChannelConfiguration&)>
517 
520  boost::signal<void (const DtDeError& error, bool critical)> signal_deError;
521 
524  boost::signal<void ()> signal_quit;
525 
527  boost::signal<void()> signal_pause;
528 
530  boost::signal<void()> signal_resume;
531 
533 
534  //
536 
537 
539  virtual void onSlaveConnected(const std::string& igName);
540 
542  virtual void emitDeError(const DtDeError& error, bool criticalError);
543 
545 
548  static const char* className();
549 
552  void registerInitFunction(void* address);
553 
555  bool isInitFunctionRegistered(void* address);
556 
559  inline bool shouldSendMesssage()
560  {
561  return isInMasterMode() && myCommunicator && !myCommunicator->masterIgOnly();
562  }
563 
564  inline void setPagedLodMagnificationScaleFactor( float factor )
565  {
566  myPagedLodMagnificationScaleFactor = factor;
567  }
568 
569  inline float pagedLodMagnificationScaleFactor() const
570  {
571  return myPagedLodMagnificationScaleFactor;
572  }
573 
574  protected:
575 
577 
578 
580  virtual unsigned int countEmbeddedWindows( const DtDisplayConfiguration &dec );
581 
583 
584 
585  virtual void initializeSchemaManager();
586 
587  virtual void initializeLibXmlIfNecessary();
588 
591  virtual bool shouldSkipThisTick( double simulationTime );
592 
594  virtual void postInitialize();
595 
597  virtual void postInitializeMaster();
598 
600  virtual void checkForData();
601 
603 
604  //Default implementation of a slave's tick.
605  void slaveTick();
606 
607  //Default implementation of a master's tick.
608  void masterTick( double simulationTime );
609 
611  void renderTick();
612 
614  DtDeProctor* proctor();
615 
617  virtual bool local_realizeDisplayConfiguration(
618  const std::string& clientName, const std::string& displayName);
619 
622  virtual void local_destroyDisplay(const std::string& displayName);
623 
625  virtual bool local_modifyDisplay( const std::string& displayName,
626  const DtDisplayConfiguration& config );
627 
629  void createDisplay(DtDisplayConfiguration&);
630 
632  void createIgCommunicator( DtDriverConfiguration& config);
633 
635  void destroyDisplay();
636 
638  bool local_addDisplayConfiguration( const DtDisplayConfiguration& dec);
639 
640 
642 
643  protected:
644 
646  typedef std::vector<void*> InitFunctionVector;
647 
648  // Normal map here since add/remove order matters for destruction order
649  typedef std::map<std::string,DtVirtualBaseClass*> RootedSingletonMap;
650  typedef std::map<StaticInstanceFunction,DtVirtualBaseClass*> FastRootedSingletonMap;
651 
652  typedef std::map<std::string,DtDisplayProxyWP> DisplayEngineProxyMap;
653 
654  protected:
655 
656  static const char* myClassName;
657 
662  bool myStopFlag;
679 
682 
689 
690  mutable std::string myLastInstanceName;
691  mutable RootedSingletonMap::const_iterator myLastInstance;
692 
693  DtThreadId myThreadId;
694 
697 
699  {
700  NoLicense = -1,
701  Master3D_License = 0,
702  XR_License = 1,
703  PVD_License = 2
704  };
705 
707 
708  //temporary until this becomes a render setting (maybe)
710 
711  DtInMemoryProfilerDistributorAgent* myFrameTimeLogger;
715 
716  // This is used to provide an advancing time to the observer and observer event processor
717  // when simulation time is paused. Users of this 'pausedTime' must deal with the fact that
718  // the switch from paused time back to simTime will go 'into the past'
720  };
721 
722 
723  template <typename ManagerClass>
724  void defaultManagerRegisterInstanceFunction(DtDe& de, ManagerClass* mgr);
725 
760  template <typename ManagerClass>
761  ManagerClass& defaultManagerInstanceFunction(DtDe& de, bool allowedInSlave)
762  {
763  ManagerClass* mgr = dynamic_cast<ManagerClass*>
764  (de.findFastInstance(&ManagerClass::instance));
765 
766  if(!mgr)
767  {
768  //Require that manager is created before de is initialized.
769  if(de.initialized())
770  {
771  DtTHROW_NEW(DtCorruptedState,
772  "Manager created after display engine was initialized.");
773  }
774 
775  if(!allowedInSlave && de.isInSlaveMode())
776  {
777  DtTHROW_NEW(DtCorruptedState, "Create unsupported manager in slave.");
778  }
779 
780  //Create and register the manager.
781  mgr = new ManagerClass(de);
783  }
784  return *mgr;
785  }
786 
798  template <typename ManagerClass>
799  void defaultManagerRegisterInstanceFunction(DtDe& de, ManagerClass* mgr)
800  {
801  //Always override before init.
802  if(de.initialized())
803  {
804  DtTHROW_NEW(DtCorruptedState,
805  "Manager created after display engine was initialized.");
806  }
807 
808  de.registerFastInstance(&ManagerClass::instance,mgr);
809 
812  mgr->myConnections.manageConnection(
814  &ManagerClass::loadDefaults,mgr)));
815  }
816 
817 }

Document ID: Generated on Thu Apr 12 03:15:37 EDT 2018 from SVN revision 187986
Copyright © 2005-2018 VT MÄK. All Rights Reserved (www.mak.com)