VR-Vantage API Documentation
DtDe.h
Go to the documentation of this file.
1 /******************************************************************************
2 ** Copyright (c) 2013 MAK Technologies, Inc.
3 ** All rights reserved.
4 ******************************************************************************/
5 
9 
10 #pragma once
11 #include <vrvCore/vrvCore.h>
12 #include <vrvUtil/DtDebugLog.h>
14 #include <vrvCore/DtDisplayProxy.h>
16 #include <vrvUtil/DtDeError.h>
20 #include <vlutil/vlUtil.h>
21 #include <vlutil/vlThread.h>
22 #include <vlutil/vlPerformanceStats.h>
23 
24 #include <boost/bind.hpp>
25 #include <boost/signal.hpp>
26 #include <map>
27 #include <string>
28 
31 #define DT_DE_INIT_ONCE(de)\
32 if(de.isInitFunctionRegistered((void*)&init))\
33 {\
34  return;\
35 }\
36 else\
37 {\
38  de.registerInitFunction((void*)&init);\
39 }
40 
41 class DtClock;
42 
43 namespace makVrv
44 {
45  class DtAgentManager;
46  class DtDataBank;
47  class DtDeProctor;
48  class DtDeSharedState;
49  class DtDisplay;
50  class DtDriverManager;
51  class DtFileCache;
52  class DtMessageDispatcher;
53  class DtProctor;
54  class DtRenderer;
55  class DtScene;
56  class DtVirtualBaseClass;
57  class DtSchemaManager;
58  class DtStatsSet;
59 
64  {
65  public:
66 
67  friend class DtDeProctor;
68 
70  typedef std::vector<std::pair<DtDeError,bool> > DeErrors;
71 
72  public:
73 
75  DtDe();
76 
78  void buildPerformanceStats();
79 
82  virtual ~DtDe();
83 
87  bool destructing();
88 
92  virtual void setDeInitializer(const DtDeInitializer& initializer);
93 
98  virtual void setPathConfiguration(const DtDePathConfiguration& pathConfig);
99 
102  {
103  Initialized = 1,
104  UnableToInitialize = 0,
105  UnableToInitializeDueToLicense = -1
106  };
107 
120  virtual InitializationResult initialize( bool abortOnLicenseFailure = true, bool useLicenseErrorDialog=true );
121 
123  bool initialized() const;
124 
128  DtThreadId threadId();
129 
135  virtual void setDeConfiguration(const DtDeConfiguration& deConfig);
136 
145  virtual void tick(double simTime);
146 
150  inline void retick() { tick(simulationTime()); }
151 
155  virtual bool timeToStop() const;
156 
158  virtual void setTimeToStop(bool flag = true);
159 
161  virtual void quit();
162 
164  virtual void reset();
165 
167  void updateScene();
168 
170 
171 
173  virtual const DtDeConfiguration& deConfiguration() const;
174 
177  virtual DtDeCommunicator& igCommunicator();
178 
180  DtMainEventQueue& mainEventQueue();
181 
184  virtual DtDisplay* display();
185 
190  virtual DtScene& scene();
191 
195  virtual DtDataBank& dataBank();
196 
200  virtual DtDriverManager& driverManager();
201 
203  bool driverManagerCreated() const;
204 
206  virtual DtMessageDispatcher& dispatcher();
207 
209  inline DtDebugLog& log() { return myDebugLog; }
210 
213  DtAgentManager& agentManager();
214 
216  virtual double simulationTime() const;
217 
219  virtual int displayCount() const;
220 
222  virtual const DtDeInitializer& deInitializer() const;
223 
225  virtual const DtDePathConfiguration& dePathConfiguration() const;
226 
228  virtual bool isInMasterMode() const;
229 
231  virtual bool isInSlaveMode() const;
232 
234  virtual DtDeSharedState& sharedState();
235 
238  virtual const DtSchemaManager& schemaManager() const;
239  virtual DtSchemaManager& schemaManager();
240 
242  virtual DtFileCache* fileCache();
243 
245  virtual const DeErrors& deErrors() const;
246 
248  virtual void clearDeErrors();
249 
251  virtual DtRenderer& renderer() const;
252 
254  bool renderFrameThisTick() const;
255 
259  virtual bool licenseAvailable() const;
260 
262 
264 
265 
269  virtual bool addDisplayConfiguration(const DtDisplayConfiguration&);
270 
280  virtual void realizeDisplayConfiguration(const std::string& clientName,
281  const std::string& displayName);
282 
285  virtual void destroyDisplay(DtDisplayProxySP display);
286 
289  virtual void destroyDisplay(const std::string& displayName);
290 
292  virtual void destroyAllDisplays();
293 
295  virtual bool modifyDisplay( const std::string& displayName,
296  const DtDisplayConfiguration& config );
297 
299 
301 
302 
305  virtual void setSimulationTime(double time);
306 
310  virtual double systemTime();
311 
313  typedef DtVirtualBaseClass& (*StaticInstanceFunction)(DtDe&);
314 
317  virtual DtVirtualBaseClass* findFastInstance(
318  StaticInstanceFunction classInstanceFunction) const;
319 
323  template <typename Class>
324  DtVirtualBaseClass* findFastInstance(Class& (*staticInstFunc)(DtDe&)) const
325  {
326  return findFastInstance(reinterpret_cast<StaticInstanceFunction>(staticInstFunc));
327  }
328 
331  virtual void registerFastInstance(
332  StaticInstanceFunction classInstanceFunction, DtVirtualBaseClass* inst);
333 
337  template <typename Class>
338  void registerFastInstance(Class& (*staticInstFunc)(DtDe&),DtVirtualBaseClass* inst)
339  {
340  registerFastInstance(reinterpret_cast<StaticInstanceFunction>(staticInstFunc),inst);
341  }
342 
345  virtual DtVirtualBaseClass* findInstance(
346  const std::string& instanceName) const;
347 
357  virtual void registerInstance(const std::string& instanceName,
358  DtVirtualBaseClass* instance);
359 
361  virtual void registerProctor(unsigned short handlerId,DtProctor*);
362 
365  virtual void unregisterProctor(unsigned short handlerId);
366 
368  DtProctor* findProctor(unsigned short handlerId) const;
369 
372  DtDisplayProxySP findDisplay(const std::string& displayName );
373 
375  virtual DtDisplayProxySP findDisplayByIndex(int index);
376 
378  void setRenderFrameThisTick(bool update);
379 
381  virtual bool isValidDisplayConfiguration( const DtDisplayConfiguration& dec );
382 
384 
385  //
387 
388 
394  boost::signal<void ()> signal_initializeDefaultState;
395 
400  boost::signal<void ()> signal_postInitialize;
401 
407  boost::signal<void (DtDe&)> signal_preTick;
408 
414  boost::signal<void ()> signal_postTick;
415 
418  boost::signal<void (const std::string&, const std::string&)>
420 
424  boost::signal<void (const DtDisplayConfiguration&)> signal_displayConfigurationAdded;
425 
429  boost::signal<void (const std::string&)> signal_displayToBeDestroyed;
430 
434  boost::signal<void (const std::string&, const DtDisplayConfiguration&)>
436 
440  boost::signal<void (const std::string&, const DtWindowConfiguration&)>
442 
447  boost::signal<void (const std::string&, const std::string&)>
449 
453  boost::signal<void (const std::string&, const std::string&,
455 
459  boost::signal<void (const std::string&, const std::string&,
461 
465  boost::signal<void (const std::string&, const std::string&,
467 
471  boost::signal<void (const std::string&, const std::string&,
472  const std::string&, const DtChannelConfiguration&)>
474 
477  boost::signal<void (const DtDeError& error, bool critical)> signal_deError;
478 
481  boost::signal<void ()> signal_quit;
482 
484 
485  //
487 
488 
490  virtual void onSlaveConnected(const std::string& igName);
491 
493  virtual void emitDeError(const DtDeError& error, bool criticalError);
494 
496 
499  static const char* className();
500 
503  void registerInitFunction(void* address);
504 
506  bool isInitFunctionRegistered(void* address);
507 
510  inline bool shouldSendMesssage()
511  {
512  return isInMasterMode() && myCommunicator && !myCommunicator->masterIgOnly();
513  }
514 
516  const DtStatsSet& lastTickStatistics() const;
517 
519  DtStatsSet& lastTickStatistics();
520 
521  protected:
522 
524 
525 
527  virtual unsigned int countEmbeddedWindows( const DtDisplayConfiguration &dec );
528 
530  virtual void timingFinishTick();
531 
533  virtual void timingFinishBetweenTicks();
534 
536 
537 
538  virtual void initializeSchemaManager();
539 
540  virtual void initializeLibXmlIfNecessary();
541 
544  virtual bool shouldSkipThisTick( double simulationTime );
545 
547  virtual void postInitialize();
548 
550  virtual void postInitializeMaster();
551 
553  virtual void checkForData();
554 
556 
557  //Default implementation of a slave's tick.
558  void slaveTick();
559 
560  //Default implementation of a master's tick.
561  void masterTick( double simulationTime );
562 
564  void renderTick();
565 
567  DtDeProctor* proctor();
568 
570  virtual bool local_realizeDisplayConfiguration(
571  const std::string& clientName, const std::string& displayName);
572 
575  virtual void local_destroyDisplay(const std::string& displayName);
576 
578  virtual bool local_modifyDisplay( const std::string& displayName,
579  const DtDisplayConfiguration& config );
580 
582  void createDisplay(DtDisplayConfiguration&);
583 
585  void createIgCommunicator( DtDriverConfiguration& config);
586 
588  void destroyDisplay();
589 
591  bool local_addDisplayConfiguration( const DtDisplayConfiguration& dec);
592 
593 
595 
596  protected:
597 
599  typedef std::vector<void*> InitFunctionVector;
600 
601  typedef std::map<std::string,DtVirtualBaseClass*> RootedSingletonMap;
602  typedef std::map<StaticInstanceFunction,DtVirtualBaseClass*> FastRootedSingletonMap;
603 
604  typedef std::map<std::string,DtDisplayProxyWP> DisplayEngineProxyMap;
605 
606  protected:
607 
608  static const char* myClassName;
609 
614  bool myStopFlag;
631 
634 
641 
643  mutable RootedSingletonMap::const_iterator myLastInstance;
644 
647  DtThreadId myThreadId;
648 
650 
652  {
653  NoLicense = -1,
654  Master3D_License = 0,
655  XR_License = 1,
656  PVD_License = 2
657  };
658 
660  };
661 
662 
663  template <typename ManagerClass>
664  void defaultManagerRegisterInstanceFunction(DtDe& de, ManagerClass* mgr);
665 
700  template <typename ManagerClass>
701  ManagerClass& defaultManagerInstanceFunction(DtDe& de, bool allowedInSlave)
702  {
703  ManagerClass* mgr = dynamic_cast<ManagerClass*>
704  (de.findFastInstance(&ManagerClass::instance));
705 
706  if(!mgr)
707  {
708  //Require that manager is created before de is initialized.
709  if(de.initialized())
710  {
711  DtTHROW_NEW(DtCorruptedState,
712  "Manager created after display engine was initialized.");
713  }
714 
715  if(!allowedInSlave && de.isInSlaveMode())
716  {
717  DtTHROW_NEW(DtCorruptedState, "Create unsupported manager in slave.");
718  }
719 
720  //Create and register the manager.
721  mgr = new ManagerClass(de);
723  }
724  return *mgr;
725  }
726 
738  template <typename ManagerClass>
739  void defaultManagerRegisterInstanceFunction(DtDe& de, ManagerClass* mgr)
740  {
741  //Always override before init.
742  if(de.initialized())
743  {
744  DtTHROW_NEW(DtCorruptedState,
745  "Manager created after display engine was initialized.");
746  }
747 
748  de.registerFastInstance(&ManagerClass::instance,mgr);
749 
752  mgr->myConnections.manageConnection(
753  de.signal_initializeDefaultState.connect(boost::bind(
754  &ManagerClass::loadDefaults,mgr)));
755  }
756 
757 }


Copyright © 2005-2013 VT MÄK. All Rights Reserved (www.mak.com)