VR-Forces 4.0.4 Class Documentation
include/vrvCore/DtDe.h
Go to the documentation of this file.
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 } 

Document ID: Generated on Fri Jun 29 16:33:32 EDT 2012 from SVN revision 116588
Copyright © 2005-2012 VT MÄK Inc. All Rights Reserved (www.mak.com)