VR-Forces 4.1 Class Documentation
DtDe.h
Go to the documentation of this file.
1 /******************************************************************************
2 ** Copyright (c) 2012 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 namespace makVrv
42 {
43  class DtAgentManager;
44  class DtDataBank;
45  class DtDeProctor;
46  class DtDeSharedState;
47  class DtDisplay;
48  class DtDriverManager;
49  class DtFileCache;
50  class DtMessageDispatcher;
51  class DtProctor;
52  class DtRenderer;
53  class DtScene;
54  class DtVirtualBaseClass;
55  class DtSchemaManager;
56  class DtStatsSet;
57 
62  {
63  public:
64 
65  friend class DtDeProctor;
66 
68  typedef std::vector<std::pair<DtDeError,bool> > DeErrors;
69 
70  public:
71 
73  DtDe();
74 
76  void buildPerformanceStats();
77 
80  virtual ~DtDe();
81 
85  bool destructing();
86 
90  virtual void setDeInitializer(const DtDeInitializer& initializer);
91 
96  virtual void setPathConfiguration(const DtDePathConfiguration& pathConfig);
97 
100  {
101  Initialized = 1,
102  UnableToInitialize = 0,
103  UnableToInitializeDueToLicense = -1
104  };
105 
111  virtual InitializationResult initialize();
112 
114  bool initialized() const;
115 
119  DtThreadId threadId();
120 
126  virtual void setDeConfiguration(const DtDeConfiguration& deConfig);
127 
136  virtual void tick(double simTime);
137 
141  inline void retick() { tick(simulationTime()); }
142 
146  virtual bool timeToStop() const;
147 
149  virtual void setTimeToStop(bool flag = true);
150 
152  virtual void quit();
153 
155  virtual void reset();
156 
158  void updateScene();
159 
161 
162 
164  virtual const DtDeConfiguration& deConfiguration() const;
165 
168  virtual DtDeCommunicator& igCommunicator();
169 
171  DtMainEventQueue& mainEventQueue();
172 
175  virtual DtDisplay* display();
176 
181  virtual DtScene& scene();
182 
186  virtual DtDataBank& dataBank();
187 
191  virtual DtDriverManager& driverManager();
192 
194  bool driverManagerCreated() const;
195 
197  virtual DtMessageDispatcher& dispatcher();
198 
200  inline DtDebugLog& log() { return myDebugLog; }
201 
204  DtAgentManager& agentManager();
205 
207  virtual double simulationTime() const;
208 
210  virtual int displayCount() const;
211 
213  virtual const DtDeInitializer& deInitializer() const;
214 
216  virtual const DtDePathConfiguration& dePathConfiguration() const;
217 
219  virtual bool isInMasterMode() const;
220 
222  virtual bool isInSlaveMode() const;
223 
225  virtual DtDeSharedState& sharedState();
226 
229  virtual const DtSchemaManager& schemaManager() const;
230  virtual DtSchemaManager& schemaManager();
231 
233  virtual DtFileCache* fileCache();
234 
236  virtual const DeErrors& deErrors() const;
237 
239  virtual void clearDeErrors();
240 
242  virtual DtRenderer& renderer() const;
243 
245  bool renderFrameThisTick() const;
246 
248 
250 
251 
255  virtual bool addDisplayConfiguration(const DtDisplayConfiguration&);
256 
266  virtual void realizeDisplayConfiguration(const std::string& clientName,
267  const std::string& displayName);
268 
271  virtual void destroyDisplay(DtDisplayProxySP display);
272 
275  virtual void destroyDisplay(const std::string& displayName);
276 
278  virtual void destroyAllDisplays();
279 
281  virtual bool modifyDisplay( const std::string& displayName,
282  const DtDisplayConfiguration& config );
283 
285 
287 
288 
291  virtual void setSimulationTime(double time);
292 
293 
295  typedef DtVirtualBaseClass& (*StaticInstanceFunction)(DtDe&);
296 
299  virtual DtVirtualBaseClass* findFastInstance(
300  StaticInstanceFunction classInstanceFunction) const;
301 
305  template <typename Class>
306  DtVirtualBaseClass* findFastInstance(Class& (*staticInstFunc)(DtDe&)) const
307  {
308  return findFastInstance(reinterpret_cast<StaticInstanceFunction>(staticInstFunc));
309  }
310 
313  virtual void registerFastInstance(
314  StaticInstanceFunction classInstanceFunction, DtVirtualBaseClass* inst);
315 
319  template <typename Class>
320  void registerFastInstance(Class& (*staticInstFunc)(DtDe&),DtVirtualBaseClass* inst)
321  {
322  registerFastInstance(reinterpret_cast<StaticInstanceFunction>(staticInstFunc),inst);
323  }
324 
327  virtual DtVirtualBaseClass* findInstance(
328  const std::string& instanceName) const;
329 
339  virtual void registerInstance(const std::string& instanceName,
340  DtVirtualBaseClass* instance);
341 
343  virtual void registerProctor(unsigned short handlerId,DtProctor*);
344 
347  virtual void unregisterProctor(unsigned short handlerId);
348 
350  DtProctor* findProctor(unsigned short handlerId) const;
351 
354  DtDisplayProxySP findDisplay(const std::string& displayName );
355 
357  virtual DtDisplayProxySP findDisplayByIndex(int index);
358 
360  void setRenderFrameThisTick(bool update);
361 
363  virtual bool isValidDisplayConfiguration( const DtDisplayConfiguration& dec );
364 
366 
367  //
369 
370 
376  boost::signal<void ()> signal_initializeDefaultState;
377 
382  boost::signal<void ()> signal_postInitialize;
383 
389  boost::signal<void (DtDe&)> signal_preTick;
390 
396  boost::signal<void ()> signal_postTick;
397 
400  boost::signal<void (const std::string&, const std::string&)>
402 
406  boost::signal<void (const DtDisplayConfiguration&)> signal_displayConfigurationAdded;
407 
411  boost::signal<void (const std::string&)> signal_displayToBeDestroyed;
412 
416  boost::signal<void (const std::string&, const DtDisplayConfiguration&)>
418 
422  boost::signal<void (const std::string&, const DtWindowConfiguration&)>
424 
429  boost::signal<void (const std::string&, const std::string&)>
431 
435  boost::signal<void (const std::string&, const std::string&,
437 
441  boost::signal<void (const std::string&, const std::string&,
443 
447  boost::signal<void (const std::string&, const std::string&,
448  const std::string&)> signal_channelToBeDestroyed;
449 
453  boost::signal<void (const std::string&, const std::string&,
454  const std::string&, const DtChannelConfiguration&)>
456 
459  boost::signal<void (const DtDeError& error, bool critical)> signal_deError;
460 
463  boost::signal<void ()> signal_quit;
464 
466 
467  //
469 
470 
472  virtual void onSlaveConnected(const std::string& igName);
473 
475  virtual void emitDeError(const DtDeError& error, bool criticalError);
476 
478 
481  static const char* className();
482 
485  void registerInitFunction(void* address);
486 
488  bool isInitFunctionRegistered(void* address);
489 
492  inline bool shouldSendMesssage()
493  {
494  return isInMasterMode() && myCommunicator && !myCommunicator->masterIgOnly();
495  }
496 
498  const DtStatsSet& lastTickStatistics() const;
499 
501  DtStatsSet& lastTickStatistics();
502 
503  protected:
504 
506 
507 
509  virtual unsigned int countEmbeddedWindows( const DtDisplayConfiguration &dec );
510 
512  virtual void timingFinishTick();
513 
515  virtual void timingFinishBetweenTicks();
516 
518 
519 
520  virtual void initializeSchemaManager();
521 
522  virtual void initializeLibXmlIfNecessary();
523 
526  virtual bool shouldSkipThisTick( double simulationTime );
527 
529  virtual void postInitialize();
530 
532  virtual void postInitializeMaster();
533 
535  virtual void checkForData();
536 
538 
539  //Default implementation of a slave's tick.
540  void slaveTick();
541 
542  //Default implementation of a master's tick.
543  void masterTick( double simulationTime );
544 
546  void renderTick();
547 
549  DtDeProctor* proctor();
550 
552  virtual bool local_realizeDisplayConfiguration(
553  const std::string& clientName, const std::string& displayName);
554 
557  virtual void local_destroyDisplay(const std::string& displayName);
558 
560  virtual bool local_modifyDisplay( const std::string& displayName,
561  const DtDisplayConfiguration& config );
562 
564  void createDisplay(DtDisplayConfiguration&);
565 
567  void createIgCommunicator( DtDriverConfiguration& config);
568 
570  void destroyDisplay();
571 
573  bool local_addDisplayConfiguration( const DtDisplayConfiguration& dec);
574 
575 
577 
578  protected:
579 
581  typedef std::vector<void*> InitFunctionVector;
582 
583  typedef std::map<std::string,DtVirtualBaseClass*> RootedSingletonMap;
584  typedef std::map<StaticInstanceFunction,DtVirtualBaseClass*> FastRootedSingletonMap;
585 
586  typedef std::map<std::string,DtDisplayProxyWP> DisplayEngineProxyMap;
587 
588  protected:
589 
590  static const char* myClassName;
591 
596  bool myStopFlag;
613 
616 
623 
624  mutable std::string myLastInstanceName;
625  mutable RootedSingletonMap::const_iterator myLastInstance;
626 
629  DtThreadId myThreadId;
630  };
631 
632 
633  template <typename ManagerClass>
634  void defaultManagerRegisterInstanceFunction(DtDe& de, ManagerClass* mgr);
635 
670  template <typename ManagerClass>
671  ManagerClass& defaultManagerInstanceFunction(DtDe& de, bool allowedInSlave)
672  {
673  ManagerClass* mgr = dynamic_cast<ManagerClass*>
674  (de.findFastInstance(&ManagerClass::instance));
675 
676  if(!mgr)
677  {
678  //Require that manager is created before de is initialized.
679  if(de.initialized())
680  {
681  DtTHROW_NEW(DtCorruptedState,
682  "Manager created after display engine was initialized.");
683  }
684 
685  if(!allowedInSlave && de.isInSlaveMode())
686  {
687  DtTHROW_NEW(DtCorruptedState, "Create unsupported manager in slave.");
688  }
689 
690  //Create and register the manager.
691  mgr = new ManagerClass(de);
693  }
694  return *mgr;
695  }
696 
708  template <typename ManagerClass>
709  void defaultManagerRegisterInstanceFunction(DtDe& de, ManagerClass* mgr)
710  {
711  //Always override before init.
712  if(de.initialized())
713  {
714  DtTHROW_NEW(DtCorruptedState,
715  "Manager created after display engine was initialized.");
716  }
717 
718  de.registerFastInstance(&ManagerClass::instance,mgr);
719 
722  mgr->myConnections.manageConnection(
723  de.signal_initializeDefaultState.connect(boost::bind(
724  &ManagerClass::loadDefaults,mgr)));
725  }
726 
727 }

Document ID: Generated on Tue Jan 29 18:21:16 EST 2013 from SVN revision 123193
Copyright © 2005-2013 VT MÄK Inc. All Rights Reserved (www.mak.com)