VR-Vantage 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) 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 
79  virtual ~DtDe();
80 
84  bool destructing();
85 
89  virtual void setDeInitializer(const DtDeInitializer& initializer);
90 
95  virtual void setPathConfiguration(const DtDePathConfiguration& pathConfig);
96 
99  {
100  Initialized = 1,
101  UnableToInitialize = 0,
102  UnableToInitializeDueToLicense = -1
103  };
104 
117  virtual InitializationResult initialize( bool abortOnLicenseFailure = true, bool useLicenseErrorDialog=true );
118 
120  bool initialized() const;
121 
125  DtThreadId threadId();
126 
132  virtual void setDeConfiguration(const DtDeConfiguration& deConfig);
133 
142  virtual void tick(double simTime);
143 
147  inline void retick() { tick(simulationTime()); }
148 
152  virtual bool timeToStop() const;
153 
155  virtual void setTimeToStop(bool flag = true);
156 
158  virtual void quit();
159 
161  virtual void reset();
162 
164  void updateScene();
165 
167 
168 
170  virtual const DtDeConfiguration& deConfiguration() const;
171 
174  virtual DtDeCommunicator& igCommunicator();
175 
177  DtMainEventQueue& mainEventQueue();
178 
181  virtual DtDisplay* display();
182 
187  virtual DtScene& scene();
188 
192  virtual DtDataBank& dataBank();
193 
197  virtual DtDriverManager& driverManager();
198 
200  bool driverManagerCreated() const;
201 
203  virtual DtMessageDispatcher& dispatcher();
204 
206  inline DtDebugLog& log() { return myDebugLog; }
207 
210  DtAgentManager& agentManager();
211 
213  virtual double simulationTime() const;
214 
216  virtual double syncedTime() 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() const;
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 
515  inline void setPagedLodMagnificationScaleFactor( float factor )
516  {
517  myPagedLodMagnificationScaleFactor = factor;
518  }
519 
520  inline float pagedLodMagnificationScaleFactor() const
521  {
522  return myPagedLodMagnificationScaleFactor;
523  }
524 
525  protected:
526 
528 
529 
531  virtual unsigned int countEmbeddedWindows( const DtDisplayConfiguration &dec );
532 
534 
535 
536  virtual void initializeSchemaManager();
537 
538  virtual void initializeLibXmlIfNecessary();
539 
542  virtual bool shouldSkipThisTick( double simulationTime );
543 
545  virtual void postInitialize();
546 
548  virtual void postInitializeMaster();
549 
551  virtual void checkForData();
552 
554 
555  //Default implementation of a slave's tick.
556  void slaveTick();
557 
558  //Default implementation of a master's tick.
559  void masterTick( double simulationTime );
560 
562  void renderTick();
563 
565  DtDeProctor* proctor();
566 
568  virtual bool local_realizeDisplayConfiguration(
569  const std::string& clientName, const std::string& displayName);
570 
573  virtual void local_destroyDisplay(const std::string& displayName);
574 
576  virtual bool local_modifyDisplay( const std::string& displayName,
577  const DtDisplayConfiguration& config );
578 
580  void createDisplay(DtDisplayConfiguration&);
581 
583  void createIgCommunicator( DtDriverConfiguration& config);
584 
586  void destroyDisplay();
587 
589  bool local_addDisplayConfiguration( const DtDisplayConfiguration& dec);
590 
591 
593 
594  protected:
595 
597  typedef std::vector<void*> InitFunctionVector;
598 
599  typedef std::map<std::string,DtVirtualBaseClass*> RootedSingletonMap;
600  typedef std::map<StaticInstanceFunction,DtVirtualBaseClass*> FastRootedSingletonMap;
601 
602  typedef std::map<std::string,DtDisplayProxyWP> DisplayEngineProxyMap;
603 
604  protected:
605 
606  static const char* myClassName;
607 
612  bool myStopFlag;
629 
632 
639 
641  mutable RootedSingletonMap::const_iterator myLastInstance;
642 
643  DtThreadId myThreadId;
644 
646 
647  double myTimeEpoch;
648 
650  {
651  NoLicense = -1,
652  Master3D_License = 0,
653  XR_License = 1,
654  PVD_License = 2
655  };
656 
658 
659  //temporary until this becomes a render setting (maybe)
661  };
662 
663 
664  template <typename ManagerClass>
665  void defaultManagerRegisterInstanceFunction(DtDe& de, ManagerClass* mgr);
666 
701  template <typename ManagerClass>
702  ManagerClass& defaultManagerInstanceFunction(DtDe& de, bool allowedInSlave)
703  {
704  ManagerClass* mgr = dynamic_cast<ManagerClass*>
705  (de.findFastInstance(&ManagerClass::instance));
706 
707  if(!mgr)
708  {
709  //Require that manager is created before de is initialized.
710  if(de.initialized())
711  {
712  DtTHROW_NEW(DtCorruptedState,
713  "Manager created after display engine was initialized.");
714  }
715 
716  if(!allowedInSlave && de.isInSlaveMode())
717  {
718  DtTHROW_NEW(DtCorruptedState, "Create unsupported manager in slave.");
719  }
720 
721  //Create and register the manager.
722  mgr = new ManagerClass(de);
724  }
725  return *mgr;
726  }
727 
739  template <typename ManagerClass>
740  void defaultManagerRegisterInstanceFunction(DtDe& de, ManagerClass* mgr)
741  {
742  //Always override before init.
743  if(de.initialized())
744  {
745  DtTHROW_NEW(DtCorruptedState,
746  "Manager created after display engine was initialized.");
747  }
748 
749  de.registerFastInstance(&ManagerClass::instance,mgr);
750 
753  mgr->myConnections.manageConnection(
754  de.signal_initializeDefaultState.connect(boost::bind(
755  &ManagerClass::loadDefaults,mgr)));
756  }
757 
758 }


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