![]() |
VR-Vantage 1.4.1 API Class Documentation
|
00001 /****************************************************************************** 00002 ** Copyright (c) 2010 MAK Technologies, Inc. 00003 ** All rights reserved. 00004 ******************************************************************************/ 00005 /****************************************************************************** 00006 ** $RCSfile: DtDe.h,v $ $Revision: 1.110 $ $State: Exp $ 00007 ******************************************************************************/ 00008 00012 00013 #pragma once 00014 #include <vrvCore/vrvCore.h> 00015 #include <vrvUtil/DtDebugLog.h> 00016 #include <vrvCore/DtDeCommunicator.h> 00017 #include <vrvCore/DtDisplayProxy.h> 00018 #include <vrvUtil/DtDeConfiguration.h> 00019 #include <vrvUtil/DtDeError.h> 00020 #include <vrvUtil/DtDeInitializer.h> 00021 #include <vrvUtil/DtDePathConfiguration.h> 00022 #include <vrvUtil/DtMainEventQueue.h> 00023 #include <vlutil/vlUtil.h> 00024 #include <vlutil/vlThread.h> 00025 #include <vlutil/vlPerformanceStats.h> 00026 #include <boost/signal.hpp> 00027 #include <boost/bind.hpp> 00028 #include <map> 00029 #include <string> 00030 00033 #define DT_DE_INIT_ONCE(de)\ 00034 if(de.isInitFunctionRegistered((void*)&init))\ 00035 {\ 00036 return;\ 00037 }\ 00038 else\ 00039 {\ 00040 de.registerInitFunction((void*)&init);\ 00041 } 00042 00043 namespace makVrv 00044 { 00045 class DtAgentManager; 00046 class DtDataBank; 00047 class DtDeProctor; 00048 class DtDeSharedState; 00049 class DtDisplay; 00050 class DtDriverManager; 00051 class DtFileCache; 00052 class DtMessageDispatcher; 00053 class DtProctor; 00054 class DtRenderer; 00055 class DtScene; 00056 class DtVirtualBaseClass; 00057 class DtSchemaManager; 00058 00062 class DT_DLL_VRVCORE DtDe 00063 { 00064 public: 00065 00066 friend class DtDeProctor; 00067 00068 struct TimeStat 00069 { 00070 std::string myDescription; 00071 DtTimeStatistic myStatistic; 00072 }; 00073 00074 struct StatsSet 00075 { 00076 00077 void addStats(const std::string& name) 00078 { 00079 TimeStat stat = {name,DtTimeStatistic()}; 00080 myStats.push_back(stat); 00081 } 00082 00083 std::vector<TimeStat> myStats; 00084 double myTotalTime; 00085 }; 00086 00088 typedef std::vector<std::pair<DtDeError,bool> > DeErrors; 00089 00090 public: 00091 00093 DtDe(); 00094 00097 virtual ~DtDe(); 00098 00102 bool destructing(); 00103 00107 virtual void setDeInitializer(const DtDeInitializer& initializer); 00108 00113 virtual void setPathConfiguration(const DtDePathConfiguration& pathConfig); 00114 00116 enum InitializationResult 00117 { 00118 Initialized = 1, 00119 UnableToInitialize = 0, 00120 UnableToInitializeDueToLicense = -1 00121 }; 00122 00128 virtual InitializationResult initialize(); 00129 00131 bool initialized() const; 00132 00136 DtThreadId threadId(); 00137 00143 virtual void setDeConfiguration(const DtDeConfiguration& deConfig); 00144 00153 virtual void tick(double simTime); 00154 00158 inline void retick() { tick(simulationTime()); } 00159 00163 virtual bool timeToStop() const; 00164 00166 virtual void setTimeToStop(bool flag = true); 00167 00169 virtual void quit(); 00170 00172 virtual void reset(); 00173 00175 void updateScene(); 00176 00178 00179 00181 virtual const DtDeConfiguration& deConfiguration() const; 00182 00185 virtual DtDeCommunicator& igCommunicator(); 00186 00188 DtMainEventQueue& mainEventQueue(); 00189 00192 virtual DtDisplay* display(); 00193 00198 virtual DtScene& scene(); 00199 00203 virtual DtDataBank& dataBank(); 00204 00208 virtual DtDriverManager& driverManager(); 00209 00211 bool driverManagerCreated() const; 00212 00214 virtual DtMessageDispatcher& dispatcher(); 00215 00217 inline DtDebugLog& log() { return myDebugLog; } 00218 00220 DtPerformanceStats& stats(); 00221 00224 DtAgentManager& agentManager(); 00225 00227 virtual double simulationTime() const; 00228 00230 virtual int displayCount() const; 00231 00233 virtual const DtDeInitializer& deInitializer() const; 00234 00236 virtual const DtDePathConfiguration& dePathConfiguration() const; 00237 00239 virtual bool isInMasterMode() const; 00240 00242 virtual bool isInSlaveMode() const; 00243 00245 virtual DtDeSharedState& sharedState(); 00246 00249 virtual const DtSchemaManager& schemaManager() const; 00250 virtual DtSchemaManager& schemaManager(); 00251 00253 virtual DtFileCache* fileCache(); 00254 00256 virtual const DeErrors& deErrors() const; 00257 00259 virtual void clearDeErrors(); 00260 00262 virtual DtRenderer& renderer() const; 00263 00265 bool renderFrameThisTick() const; 00266 00268 00270 00271 00275 virtual bool addDisplayConfiguration(const DtDisplayConfiguration&); 00276 00286 virtual void realizeDisplayConfiguration(const std::string& clientName, 00287 const std::string& displayName); 00288 00291 virtual void destroyDisplay(DtDisplayProxySP display); 00292 00295 virtual void destroyDisplay(const std::string& displayName); 00296 00298 virtual void destroyAllDisplays(); 00299 00301 virtual bool modifyDisplay( const std::string& displayName, 00302 const DtDisplayConfiguration& config ); 00303 00305 00307 00308 00311 virtual void setSimulationTime(double time); 00312 00313 00315 typedef DtVirtualBaseClass& (*StaticInstanceFunction)(DtDe&); 00316 00319 virtual DtVirtualBaseClass* findFastInstance( 00320 StaticInstanceFunction classInstanceFunction) const; 00321 00325 template <typename Class> 00326 DtVirtualBaseClass* findFastInstance(Class& (*staticInstFunc)(DtDe&)) const 00327 { 00328 return findFastInstance(reinterpret_cast<StaticInstanceFunction>(staticInstFunc)); 00329 } 00330 00333 virtual void registerFastInstance( 00334 StaticInstanceFunction classInstanceFunction, DtVirtualBaseClass* inst); 00335 00339 template <typename Class> 00340 void registerFastInstance(Class& (*staticInstFunc)(DtDe&),DtVirtualBaseClass* inst) 00341 { 00342 registerFastInstance(reinterpret_cast<StaticInstanceFunction>(staticInstFunc),inst); 00343 } 00344 00347 virtual DtVirtualBaseClass* findInstance( 00348 const std::string& instanceName) const; 00349 00359 virtual void registerInstance(const std::string& instanceName, 00360 DtVirtualBaseClass* instance); 00361 00363 virtual void registerProctor(unsigned short handlerId,DtProctor*); 00364 00367 virtual void unregisterProctor(unsigned short handlerId); 00368 00370 DtProctor* findProctor(unsigned short handlerId) const; 00371 00374 DtDisplayProxySP findDisplay(const std::string& displayName ); 00375 00377 virtual DtDisplayProxySP findDisplayByIndex(int index); 00378 00380 void setRenderFrameThisTick(bool update); 00381 00383 virtual bool isValidDisplayConfiguration( const DtDisplayConfiguration& dec ); 00384 00386 00387 // 00389 00390 00396 boost::signal<void ()> signal_initializeDefaultState; 00397 00402 boost::signal<void ()> signal_postInitialize; 00403 00409 boost::signal<void (DtDe&)> signal_preTick; 00410 00416 boost::signal<void ()> signal_postTick; 00417 00420 boost::signal<void (const std::string&, const std::string&)> 00421 signal_displayConfigurationRealized; 00422 00426 boost::signal<void (const DtDisplayConfiguration&)> signal_displayConfigurationAdded; 00427 00431 boost::signal<void (const std::string&)> signal_displayToBeDestroyed; 00432 00436 boost::signal<void (const std::string&, const DtDisplayConfiguration&)> 00437 signal_displayModified; 00438 00442 boost::signal<void (const std::string&, const DtWindowConfiguration&)> 00443 signal_windowConfigurationAdded; 00444 00449 boost::signal<void (const std::string&, const std::string&)> 00450 signal_windowConfigurationToBeDestroyed; 00451 00455 boost::signal<void (const std::string&, const std::string&, 00456 const DtWindowConfiguration&)> signal_windowConfigurationModified; 00457 00461 boost::signal<void (const std::string&, const std::string&, 00462 const DtChannelConfiguration&)> signal_channelConfigurationAdded; 00463 00467 boost::signal<void (const std::string&, const std::string&, 00468 const std::string&)> signal_channelToBeDestroyed; 00469 00473 boost::signal<void (const std::string&, const std::string&, 00474 const std::string&, const DtChannelConfiguration&)> 00475 signal_channelConfigurationModified; 00476 00479 boost::signal<void (const DtDeError& error, bool critical)> signal_deError; 00480 00483 boost::signal<void ()> signal_quit; 00484 00486 00487 // 00489 00490 00492 virtual void onSlaveConnected(const std::string& igName); 00493 00495 virtual void emitDeError(const DtDeError& error, bool criticalError); 00496 00498 00501 static const char* className(); 00502 00505 void registerInitFunction(void* address); 00506 00508 bool isInitFunctionRegistered(void* address); 00509 00512 inline bool shouldSendMesssage() 00513 { 00514 return isInMasterMode() && myCommunicator && !myCommunicator->masterIgOnly(); 00515 } 00516 00518 const StatsSet& lastTickStatistics() const; 00519 00520 protected: 00521 00523 00524 00525 virtual void postInitialize(); 00526 00527 //Default implementation of a slave's tick. 00528 void slaveTick(); 00529 00530 //Default implementation of a master's tick. 00531 void masterTick( double simulationTime ); 00532 00534 void renderTick(); 00535 00537 DtDeProctor* proctor(); 00538 00540 virtual bool local_realizeDisplayConfiguration( 00541 const std::string& clientName, const std::string& displayName); 00542 00545 virtual void local_destroyDisplay(const std::string& displayName); 00546 00548 virtual bool local_modifyDisplay( const std::string& displayName, 00549 const DtDisplayConfiguration& config ); 00550 00552 void createDisplay(DtDisplayConfiguration&); 00553 00555 void createIgCommunicator( DtDriverConfiguration& config); 00556 00558 void destroyDisplay(); 00559 00561 bool local_addDisplayConfiguration( const DtDisplayConfiguration& dec); 00562 00563 00565 00566 protected: 00567 00569 typedef std::vector<void*> InitFunctionVector; 00570 00571 typedef std::map<std::string,DtVirtualBaseClass*> RootedSingletonMap; 00572 typedef std::map<StaticInstanceFunction,DtVirtualBaseClass*> FastRootedSingletonMap; 00573 00574 typedef std::map<std::string,DtDisplayProxyWP> DisplayEngineProxyMap; 00575 00576 protected: 00577 00578 static const char* myClassName; 00579 00580 RootedSingletonMap myRootedSingletonMap; 00581 FastRootedSingletonMap myFastRootedSingletonMap; 00582 DtDeInitializer myInitializer; 00583 DtDePathConfiguration myPathConfiguration; 00584 bool myStopFlag; 00585 bool myInitializeFlag; 00586 double mySimulationTime; 00587 double myNextFixedTime; 00588 DtDebugLog myDebugLog; 00589 DtDeConfiguration myConfiguration; 00590 DtMainEventQueue myMainEventQueue; 00591 DtDisplay* myDisplayEngine; 00592 DtDeCommunicator* myCommunicator; 00593 DtMessageDispatcher* myDispatcher; 00594 DtDeProctor* myIgProctor; 00595 DtDriverManager* myDriverManager; 00596 DtAgentManager* myAgentManager; 00597 DisplayEngineProxyMap myDisplayProxies; 00598 DtDeSharedState* myDeSharedState; 00599 DtPerformanceStats myStats; 00600 DtDataBank* myDataBank; 00601 DtSchemaManager* mySchemaManager; 00602 00603 InitFunctionVector myRegisteredInitFunctions; 00604 void* myRegInitFunction; 00605 00606 DtFileCache* myFileCache; 00607 DeErrors myIgErrors; 00608 DtRenderer* myRenderer; 00609 bool mySceneNeedsUpdateFlag; 00610 bool myDestructionFlag; 00611 bool myInTickFlag; 00612 00613 mutable std::string myLastInstanceName; 00614 mutable RootedSingletonMap::const_iterator myLastInstance; 00615 00616 StatsSet myLastTickStats; 00617 DtTimedSection myBetweenTicksTimedSection; 00618 DtThreadId myThreadId; 00619 }; 00620 00621 00622 template <typename ManagerClass> 00623 void defaultManagerRegisterInstanceFunction(DtDe& de, ManagerClass* mgr); 00624 00659 template <typename ManagerClass> 00660 ManagerClass& defaultManagerInstanceFunction(DtDe& de, bool allowedInSlave) 00661 { 00662 ManagerClass* mgr = dynamic_cast<ManagerClass*> 00663 (de.findFastInstance(&ManagerClass::instance)); 00664 00665 if(!mgr) 00666 { 00667 //Require that manager is created before de is initialized. 00668 if(de.initialized()) 00669 { 00670 DtTHROW_NEW(DtCorruptedState, 00671 "Manager created after display engine was initialized."); 00672 } 00673 00674 if(!allowedInSlave && de.isInSlaveMode()) 00675 { 00676 DtTHROW_NEW(DtCorruptedState, "Create unsupported manager in slave."); 00677 } 00678 00679 //Create and register the manager. 00680 mgr = new ManagerClass(de); 00681 defaultManagerRegisterInstanceFunction(de,mgr); 00682 } 00683 return *mgr; 00684 } 00685 00697 template <typename ManagerClass> 00698 void defaultManagerRegisterInstanceFunction(DtDe& de, ManagerClass* mgr) 00699 { 00700 //Always override before init. 00701 if(de.initialized()) 00702 { 00703 DtTHROW_NEW(DtCorruptedState, 00704 "Manager created after display engine was initialized."); 00705 } 00706 00707 de.registerFastInstance(&ManagerClass::instance,mgr); 00708 00711 mgr->myConnections.manageConnection( 00712 de.signal_initializeDefaultState.connect(boost::bind( 00713 &ManagerClass::loadDefaults,mgr))); 00714 } 00715 00716 }