00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include "kernel.h"
00013 #include "flexilog.h"
00014 #include "iomanager.h"
00015 #include "rendermanager.h"
00016 #include "manipmanager.h"
00017 #include "generalmanager.h"
00018 #include "guienvironment.h"
00019
00020 using namespace VRUT;
00021
00022 Kernel * Kernel::instance = (Kernel *)NULL;
00023
00024 Kernel * Kernel::Instantiate(MainWindow * window)
00025 {
00026 if (!Kernel::instance)
00027 Kernel::instance = new Kernel(window);
00028
00029 return Kernel::instance;
00030 }
00031
00032
00033 void Kernel::Release()
00034 {
00035 SAFE_DELETE(instance);
00036 }
00037
00038
00039 Kernel::Kernel(MainWindow * window) : mainWindow(window), environment(), interpreter()
00040 {
00041 initialized = exiting = false;
00042 mainThreadID = wxThread::GetCurrentId();
00043 ioManager = (IOManager *)NULL;
00044 renderManager = (RenderManager *)NULL;
00045 sceneManager = (SceneManager *)NULL;
00046 manipManager = (ManipulatorManager *)NULL;
00047 generalManager = (GeneralManager *)NULL;
00048 eventHandler = (EventHandler *)NULL;
00049 FlexiLog * log = dynamic_cast<FlexiLog *>(wxLog::GetActiveTarget());
00050 if (log)
00051 log->kernel = this;
00052 }
00053
00054
00055 Kernel::~Kernel()
00056 {
00057 exiting = true;
00058 SAFE_DELETE(generalManager);
00059 SAFE_DELETE(renderManager);
00060 SAFE_DELETE(sceneManager);
00061 SAFE_DELETE(ioManager);
00062 SAFE_DELETE(manipManager);
00063 SAFE_DELETE(eventHandler);
00064 LOGVERBOSE(wxT("<Kernel>Deinitialized"));
00065 }
00066
00067
00068 Module * Kernel::GetModule(const MODULE_ID & id) const
00069 {
00070 switch (id.GetServerID())
00071 {
00072 case MANIP_MANAGER:
00073 return manipManager->getModule(id);
00074 case IO_MANAGER:
00075 return ioManager->getModule(id);
00076 case RENDER_MANAGER:
00077 return renderManager->getModule(id);
00078 case GENERAL_MANAGER:
00079 return generalManager->getModule(id);
00080 default:
00081 LOGERROR(wxString::Format(wxT("<Kernel>Unknown module server type, module ID '%s'"), id.ToString().c_str()));
00082 return (Module *)NULL;
00083 }
00084 }
00085
00086
00087 void Kernel::ReleaseModule(const MODULE_ID & id)
00088 {
00089 switch (id.GetServerID())
00090 {
00091 case MANIP_MANAGER:
00092 manipManager->releaseModule(id);
00093 break;
00094 case IO_MANAGER:
00095 ioManager->releaseModule(id);
00096 break;
00097 case RENDER_MANAGER:
00098 renderManager->releaseModule(id);
00099 break;
00100 case GENERAL_MANAGER:
00101 generalManager->releaseModule(id);
00102 break;
00103 default:
00104 LOGERROR(wxString::Format(wxT("<Kernel>Unknown module server type, module ID '%s'"), id.ToString().c_str()));
00105 break;
00106 }
00107 }
00108
00109
00110 std::vector<wxFileName> Kernel::GetAvailableModules() const
00111 {
00112 std::vector<wxFileName> mods;
00113 if (IsInitialized())
00114 {
00115 std::vector<wxFileName> mods1 = ioManager->GetAvailableModules();
00116 mods.insert(mods.end(), mods1.begin(), mods1.end());
00117 mods1 = renderManager->GetAvailableModules();
00118 mods.insert(mods.end(), mods1.begin(), mods1.end());
00119 mods1 = manipManager->GetAvailableModules();
00120 mods.insert(mods.end(), mods1.begin(), mods1.end());
00121 mods1 = generalManager->GetAvailableModules();
00122 mods.insert(mods.end(), mods1.begin(), mods1.end());
00123 }
00124 else
00125 LOGERROR(wxT("<Kernel>Kernel not initialized"));
00126
00127 return mods;
00128 }
00129
00130
00131 bool Kernel::Initialize()
00132 {
00133 eventHandler = new EventHandler();
00134 ioManager = new IOManager();
00135 renderManager = new RenderManager();
00136 sceneManager = new SceneManager();
00137 manipManager = new ManipulatorManager();
00138 generalManager = new GeneralManager();
00139 GUIEnvironment * guiEnv = new GUIEnvironment(mainWindow);
00140 if (eventHandler && ioManager && renderManager && sceneManager && manipManager && generalManager)
00141 {
00143 wxString paramsNbName = wxT("Parameters");
00144 guiEnv->SetName(paramsNbName);
00145 mainWindow->GetAUIManager()->AddPane(guiEnv, wxAuiPaneInfo().
00146 DefaultPane().Name(paramsNbName).
00147 Caption(paramsNbName).Top().
00148 PinButton().BestSize(480, 320));
00149 mainWindow->GetAUIManager()->Update();
00150
00151 initialized = true;
00152 LOGVERBOSE(wxT("<Kernel>Initialized"));
00153 return true;
00154 }
00155 return false;
00156 }
00157
00158
00159 bool Kernel::GetModules(std::vector<std::pair<Module *, MODULE_INSTANCE_ID> > * moduleList, const wxString & moduleName, MODULE_INSTANCE_ID instanceID)
00160 {
00161 bool ret = false;
00162 if (IsInitialized())
00163 {
00164 ret |= ioManager->GetModules(moduleList, moduleName, instanceID);
00165 ret |= renderManager->GetModules(moduleList, moduleName, instanceID);
00166 ret |= manipManager->GetModules(moduleList, moduleName, instanceID);
00167 ret |= generalManager->GetModules(moduleList, moduleName, instanceID);
00168 }
00169 else
00170 LOGERROR(wxT("<Kernel>Kernel not initialized"));
00171
00172 return ret;
00173 }
00174
00175
00176 void Kernel::PreferModule(const wxString & libName)
00177 {
00178 preferedModules.push_front(CloneWxString(libName));
00179 for (ModuleNamesList::iterator nameIt = forbiddenModules.begin();
00180 nameIt != forbiddenModules.end(); )
00181 {
00182 if (nameIt->IsSameAs(libName, false))
00183 nameIt = forbiddenModules.erase(nameIt);
00184 else
00185 nameIt++;
00186 }
00187 }
00188
00189
00190 void Kernel::ForbidModule(const wxString & libName)
00191 {
00192 forbiddenModules.push_front(CloneWxString(libName));
00193 for (ModuleNamesList::iterator nameIt = preferedModules.begin();
00194 nameIt != preferedModules.end(); )
00195 {
00196 if (nameIt->IsSameAs(libName, false))
00197 nameIt = preferedModules.erase(nameIt);
00198 else
00199 nameIt++;
00200 }
00201 }
00202
00203
00204 bool Kernel::IsForbidden(const wxString & libName) const
00205 {
00206 for (ModuleNamesList::const_iterator nameIt = forbiddenModules.begin();
00207 nameIt != forbiddenModules.end(); nameIt++)
00208 if (nameIt->IsSameAs(libName, false) || nameIt->IsSameAs(wxT("lib") + libName, false))
00209 return true;
00210 return false;
00211 }