![]() |
VR-Forces 4.0.4 Class Documentation
|
00001 /****************************************************************************** 00002 ** Copyright (c) 2012 MAK Technologies, Inc. 00003 ** All rights reserved. 00004 ******************************************************************************/ 00005 00009 00010 #pragma once 00011 #include <vrvCore/vrvCore.h> 00012 #include <vrvUtil/DtDebugLog.h> 00013 #include <vrvCore/DtDeCommunicator.h> 00014 #include <vrvCore/DtDisplayProxy.h> 00015 #include <vrvUtil/DtDeConfiguration.h> 00016 #include <vrvUtil/DtDeError.h> 00017 #include <vrvUtil/DtDeInitializer.h> 00018 #include <vrvUtil/DtDePathConfiguration.h> 00019 #include <vrvUtil/DtMainEventQueue.h> 00020 #include <vlutil/vlUtil.h> 00021 #include <vlutil/vlThread.h> 00022 #include <vlutil/vlPerformanceStats.h> 00023 #include <boost/signal.hpp> 00024 #include <boost/bind.hpp> 00025 #include <map> 00026 #include <string> 00027 00030 #define DT_DE_INIT_ONCE(de)\ 00031 if(de.isInitFunctionRegistered((void*)&init))\ 00032 {\ 00033 return;\ 00034 }\ 00035 else\ 00036 {\ 00037 de.registerInitFunction((void*)&init);\ 00038 } 00039 00040 namespace makVrv 00041 { 00042 class DtAgentManager; 00043 class DtDataBank; 00044 class DtDeProctor; 00045 class DtDeSharedState; 00046 class DtDisplay; 00047 class DtDriverManager; 00048 class DtFileCache; 00049 class DtMessageDispatcher; 00050 class DtProctor; 00051 class DtRenderer; 00052 class DtScene; 00053 class DtVirtualBaseClass; 00054 class DtSchemaManager; 00055 class DtStatsSet; 00056 00060 class DT_DLL_VRVCORE DtDe 00061 { 00062 public: 00063 00064 friend class DtDeProctor; 00065 00067 typedef std::vector<std::pair<DtDeError,bool> > DeErrors; 00068 00069 public: 00070 00072 DtDe(); 00073 00076 virtual ~DtDe(); 00077 00081 bool destructing(); 00082 00086 virtual void setDeInitializer(const DtDeInitializer& initializer); 00087 00092 virtual void setPathConfiguration(const DtDePathConfiguration& pathConfig); 00093 00095 enum InitializationResult 00096 { 00097 Initialized = 1, 00098 UnableToInitialize = 0, 00099 UnableToInitializeDueToLicense = -1 00100 }; 00101 00107 virtual InitializationResult initialize(); 00108 00110 bool initialized() const; 00111 00115 DtThreadId threadId(); 00116 00122 virtual void setDeConfiguration(const DtDeConfiguration& deConfig); 00123 00132 virtual void tick(double simTime); 00133 00137 inline void retick() { tick(simulationTime()); } 00138 00142 virtual bool timeToStop() const; 00143 00145 virtual void setTimeToStop(bool flag = true); 00146 00148 virtual void quit(); 00149 00151 virtual void reset(); 00152 00154 void updateScene(); 00155 00157 00158 00160 virtual const DtDeConfiguration& deConfiguration() const; 00161 00164 virtual DtDeCommunicator& igCommunicator(); 00165 00167 DtMainEventQueue& mainEventQueue(); 00168 00171 virtual DtDisplay* display(); 00172 00177 virtual DtScene& scene(); 00178 00182 virtual DtDataBank& dataBank(); 00183 00187 virtual DtDriverManager& driverManager(); 00188 00190 bool driverManagerCreated() const; 00191 00193 virtual DtMessageDispatcher& dispatcher(); 00194 00196 inline DtDebugLog& log() { return myDebugLog; } 00197 00200 DtAgentManager& agentManager(); 00201 00203 virtual double simulationTime() const; 00204 00206 virtual int displayCount() const; 00207 00209 virtual const DtDeInitializer& deInitializer() const; 00210 00212 virtual const DtDePathConfiguration& dePathConfiguration() const; 00213 00215 virtual bool isInMasterMode() const; 00216 00218 virtual bool isInSlaveMode() const; 00219 00221 virtual DtDeSharedState& sharedState(); 00222 00225 virtual const DtSchemaManager& schemaManager() const; 00226 virtual DtSchemaManager& schemaManager(); 00227 00229 virtual DtFileCache* fileCache(); 00230 00232 virtual const DeErrors& deErrors() const; 00233 00235 virtual void clearDeErrors(); 00236 00238 virtual DtRenderer& renderer() const; 00239 00241 bool renderFrameThisTick() const; 00242 00244 00246 00247 00251 virtual bool addDisplayConfiguration(const DtDisplayConfiguration&); 00252 00262 virtual void realizeDisplayConfiguration(const std::string& clientName, 00263 const std::string& displayName); 00264 00267 virtual void destroyDisplay(DtDisplayProxySP display); 00268 00271 virtual void destroyDisplay(const std::string& displayName); 00272 00274 virtual void destroyAllDisplays(); 00275 00277 virtual bool modifyDisplay( const std::string& displayName, 00278 const DtDisplayConfiguration& config ); 00279 00281 00283 00284 00287 virtual void setSimulationTime(double time); 00288 00289 00291 typedef DtVirtualBaseClass& (*StaticInstanceFunction)(DtDe&); 00292 00295 virtual DtVirtualBaseClass* findFastInstance( 00296 StaticInstanceFunction classInstanceFunction) const; 00297 00301 template <typename Class> 00302 DtVirtualBaseClass* findFastInstance(Class& (*staticInstFunc)(DtDe&)) const 00303 { 00304 return findFastInstance(reinterpret_cast<StaticInstanceFunction>(staticInstFunc)); 00305 } 00306 00309 virtual void registerFastInstance( 00310 StaticInstanceFunction classInstanceFunction, DtVirtualBaseClass* inst); 00311 00315 template <typename Class> 00316 void registerFastInstance(Class& (*staticInstFunc)(DtDe&),DtVirtualBaseClass* inst) 00317 { 00318 registerFastInstance(reinterpret_cast<StaticInstanceFunction>(staticInstFunc),inst); 00319 } 00320 00323 virtual DtVirtualBaseClass* findInstance( 00324 const std::string& instanceName) const; 00325 00335 virtual void registerInstance(const std::string& instanceName, 00336 DtVirtualBaseClass* instance); 00337 00339 virtual void registerProctor(unsigned short handlerId,DtProctor*); 00340 00343 virtual void unregisterProctor(unsigned short handlerId); 00344 00346 DtProctor* findProctor(unsigned short handlerId) const; 00347 00350 DtDisplayProxySP findDisplay(const std::string& displayName ); 00351 00353 virtual DtDisplayProxySP findDisplayByIndex(int index); 00354 00356 void setRenderFrameThisTick(bool update); 00357 00359 virtual bool isValidDisplayConfiguration( const DtDisplayConfiguration& dec ); 00360 00362 00363 // 00365 00366 00372 boost::signal<void ()> signal_initializeDefaultState; 00373 00378 boost::signal<void ()> signal_postInitialize; 00379 00385 boost::signal<void (DtDe&)> signal_preTick; 00386 00392 boost::signal<void ()> signal_postTick; 00393 00396 boost::signal<void (const std::string&, const std::string&)> 00397 signal_displayConfigurationRealized; 00398 00402 boost::signal<void (const DtDisplayConfiguration&)> signal_displayConfigurationAdded; 00403 00407 boost::signal<void (const std::string&)> signal_displayToBeDestroyed; 00408 00412 boost::signal<void (const std::string&, const DtDisplayConfiguration&)> 00413 signal_displayModified; 00414 00418 boost::signal<void (const std::string&, const DtWindowConfiguration&)> 00419 signal_windowConfigurationAdded; 00420 00425 boost::signal<void (const std::string&, const std::string&)> 00426 signal_windowConfigurationToBeDestroyed; 00427 00431 boost::signal<void (const std::string&, const std::string&, 00432 const DtWindowConfiguration&)> signal_windowConfigurationModified; 00433 00437 boost::signal<void (const std::string&, const std::string&, 00438 const DtChannelConfiguration&)> signal_channelConfigurationAdded; 00439 00443 boost::signal<void (const std::string&, const std::string&, 00444 const std::string&)> signal_channelToBeDestroyed; 00445 00449 boost::signal<void (const std::string&, const std::string&, 00450 const std::string&, const DtChannelConfiguration&)> 00451 signal_channelConfigurationModified; 00452 00455 boost::signal<void (const DtDeError& error, bool critical)> signal_deError; 00456 00459 boost::signal<void ()> signal_quit; 00460 00462 00463 // 00465 00466 00468 virtual void onSlaveConnected(const std::string& igName); 00469 00471 virtual void emitDeError(const DtDeError& error, bool criticalError); 00472 00474 00477 static const char* className(); 00478 00481 void registerInitFunction(void* address); 00482 00484 bool isInitFunctionRegistered(void* address); 00485 00488 inline bool shouldSendMesssage() 00489 { 00490 return isInMasterMode() && myCommunicator && !myCommunicator->masterIgOnly(); 00491 } 00492 00494 const DtStatsSet& lastTickStatistics() const; 00495 00497 DtStatsSet& lastTickStatistics(); 00498 00499 protected: 00500 00502 00503 00504 virtual void postInitialize(); 00505 00506 //Default implementation of a slave's tick. 00507 void slaveTick(); 00508 00509 //Default implementation of a master's tick. 00510 void masterTick( double simulationTime ); 00511 00513 void renderTick(); 00514 00516 DtDeProctor* proctor(); 00517 00519 virtual bool local_realizeDisplayConfiguration( 00520 const std::string& clientName, const std::string& displayName); 00521 00524 virtual void local_destroyDisplay(const std::string& displayName); 00525 00527 virtual bool local_modifyDisplay( const std::string& displayName, 00528 const DtDisplayConfiguration& config ); 00529 00531 void createDisplay(DtDisplayConfiguration&); 00532 00534 void createIgCommunicator( DtDriverConfiguration& config); 00535 00537 void destroyDisplay(); 00538 00540 bool local_addDisplayConfiguration( const DtDisplayConfiguration& dec); 00541 00542 00544 00545 protected: 00546 00548 typedef std::vector<void*> InitFunctionVector; 00549 00550 typedef std::map<std::string,DtVirtualBaseClass*> RootedSingletonMap; 00551 typedef std::map<StaticInstanceFunction,DtVirtualBaseClass*> FastRootedSingletonMap; 00552 00553 typedef std::map<std::string,DtDisplayProxyWP> DisplayEngineProxyMap; 00554 00555 protected: 00556 00557 static const char* myClassName; 00558 00559 RootedSingletonMap myRootedSingletonMap; 00560 FastRootedSingletonMap myFastRootedSingletonMap; 00561 DtDeInitializer myInitializer; 00562 DtDePathConfiguration myPathConfiguration; 00563 bool myStopFlag; 00564 bool myInitializeFlag; 00565 double mySimulationTime; 00566 double myNextFixedTime; 00567 DtDebugLog myDebugLog; 00568 DtDeConfiguration myConfiguration; 00569 DtMainEventQueue myMainEventQueue; 00570 DtDisplay* myDisplayEngine; 00571 DtDeCommunicator* myCommunicator; 00572 DtMessageDispatcher* myDispatcher; 00573 DtDeProctor* myIgProctor; 00574 DtDriverManager* myDriverManager; 00575 DtAgentManager* myAgentManager; 00576 DisplayEngineProxyMap myDisplayProxies; 00577 DtDeSharedState* myDeSharedState; 00578 DtDataBank* myDataBank; 00579 DtSchemaManager* mySchemaManager; 00580 00581 InitFunctionVector myRegisteredInitFunctions; 00582 void* myRegInitFunction; 00583 00584 DtFileCache* myFileCache; 00585 DeErrors myIgErrors; 00586 DtRenderer* myRenderer; 00587 bool mySceneNeedsUpdateFlag; 00588 bool myDestructionFlag; 00589 bool myInTickFlag; 00590 00591 mutable std::string myLastInstanceName; 00592 mutable RootedSingletonMap::const_iterator myLastInstance; 00593 00594 DtStatsSet* myLastTickStats; 00595 DtTimedSection myBetweenTicksTimedSection; 00596 DtThreadId myThreadId; 00597 }; 00598 00599 00600 template <typename ManagerClass> 00601 void defaultManagerRegisterInstanceFunction(DtDe& de, ManagerClass* mgr); 00602 00637 template <typename ManagerClass> 00638 ManagerClass& defaultManagerInstanceFunction(DtDe& de, bool allowedInSlave) 00639 { 00640 ManagerClass* mgr = dynamic_cast<ManagerClass*> 00641 (de.findFastInstance(&ManagerClass::instance)); 00642 00643 if(!mgr) 00644 { 00645 //Require that manager is created before de is initialized. 00646 if(de.initialized()) 00647 { 00648 DtTHROW_NEW(DtCorruptedState, 00649 "Manager created after display engine was initialized."); 00650 } 00651 00652 if(!allowedInSlave && de.isInSlaveMode()) 00653 { 00654 DtTHROW_NEW(DtCorruptedState, "Create unsupported manager in slave."); 00655 } 00656 00657 //Create and register the manager. 00658 mgr = new ManagerClass(de); 00659 defaultManagerRegisterInstanceFunction(de,mgr); 00660 } 00661 return *mgr; 00662 } 00663 00675 template <typename ManagerClass> 00676 void defaultManagerRegisterInstanceFunction(DtDe& de, ManagerClass* mgr) 00677 { 00678 //Always override before init. 00679 if(de.initialized()) 00680 { 00681 DtTHROW_NEW(DtCorruptedState, 00682 "Manager created after display engine was initialized."); 00683 } 00684 00685 de.registerFastInstance(&ManagerClass::instance,mgr); 00686 00689 mgr->myConnections.manageConnection( 00690 de.signal_initializeDefaultState.connect(boost::bind( 00691 &ManagerClass::loadDefaults,mgr))); 00692 } 00693 00694 }