VR-Vantage 1.4.1 API Class Documentation
DtDe.h
Go to the documentation of this file.
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 } 


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