From 85d664d980643b8121b0dac40efe977c919fcc23 Mon Sep 17 00:00:00 2001 From: pouillot Date: Sun, 11 Mar 2012 22:08:13 +0000 Subject: [PATCH] Make things work smoothly when Simu V2 and/or V3 modules are not there, whatever user settings (race engine and simu config menu) git-svn-id: https://svn.code.sf.net/p/speed-dreams/code/trunk@4584 30fe4595-0a0c-4342-8851-515496e4dcbd Former-commit-id: f0ad0fb5615ace636429a35277bd4f615a564b58 Former-commit-id: f2ed91062fe8d3083e2513c7b19a5b205c35ba68 --- src/libs/raceengine/raceengine.cpp | 25 +++++++++--- .../legacymenu/confscreens/simuconfig.cpp | 39 +++++++++++++++---- 2 files changed, 52 insertions(+), 12 deletions(-) diff --git a/src/libs/raceengine/raceengine.cpp b/src/libs/raceengine/raceengine.cpp index 0986fd02..81ea499c 100644 --- a/src/libs/raceengine/raceengine.cpp +++ b/src/libs/raceengine/raceengine.cpp @@ -270,15 +270,30 @@ bool RaceEngine::loadPhysicsEngine() if (_piPhysEngine) return true; - const char* pszModName = - GfParmGetStr(ReSituation::self().data()->_reParam, "Modules", "simu", ""); + // 1) Get the physics engine name from user settings (default: Simu V2.1) + static const char* pszDefaultModName = RM_VAL_MOD_SIMU_V2_1; + std::string strModName = + GfParmGetStr(ReSituation::self().data()->_reParam, "Modules", "simu", pszDefaultModName); + + // 2) Check if the module is really there, and fall back to the default one if not + // Note : The default module is supposed to be always there. + std::ostringstream ossModLibName; + ossModLibName << GfLibDir() << "modules/simu/" << strModName << '.' << DLLEXT; + if (!GfFileExists(ossModLibName.str().c_str())) + { + GfLogWarning("User settings %s physics engine module not found ; " + "falling back to %s\n", strModName.c_str(), pszDefaultModName); + strModName = pszDefaultModName; + ossModLibName.str(""); + ossModLibName << GfLibDir() << "modules/simu/" << strModName << '.' << DLLEXT; + } + + // 3) Load it. std::ostringstream ossLoadMsg; - ossLoadMsg << "Loading physics engine (" << pszModName<< ") ..."; + ossLoadMsg << "Loading physics engine (" << strModName<< ") ..."; if (_piUserItf) _piUserItf->addLoadingMessage(ossLoadMsg.str().c_str()); - std::ostringstream ossModLibName; - ossModLibName << GfLibDir() << "modules/simu/" << pszModName << '.' << DLLEXT; GfModule* pmodPhysEngine = GfModule::load(ossModLibName.str()); if (pmodPhysEngine) _piPhysEngine = pmodPhysEngine->getInterface(); diff --git a/src/modules/userinterface/legacymenu/confscreens/simuconfig.cpp b/src/modules/userinterface/legacymenu/confscreens/simuconfig.cpp index debc51d5..3dfd8075 100644 --- a/src/modules/userinterface/legacymenu/confscreens/simuconfig.cpp +++ b/src/modules/userinterface/legacymenu/confscreens/simuconfig.cpp @@ -36,11 +36,12 @@ /* list of available simulation engine */ +static const int DefaultSimuVersion = 1; static const char *SimuVersionList[] = {RM_VAL_MOD_SIMU_V2, RM_VAL_MOD_SIMU_V2_1, RM_VAL_MOD_SIMU_V3}; static const char *SimuVersionDispNameList[] = {"V2.0", "V2.1", "V3.0"}; static const int NbSimuVersions = sizeof(SimuVersionList) / sizeof(SimuVersionList[0]); -static int CurSimuVersion = 1; +static int CurSimuVersion = DefaultSimuVersion; /* list of available multi-threading schemes */ static const char *MultiThreadSchemeList[] = {RM_VAL_AUTO, RM_VAL_ON, RM_VAL_OFF}; @@ -71,11 +72,12 @@ static void loadSimuCfg(void) int i; char buf[1024]; - snprintf(buf, 1024, "%s%s", GfLocalDir(), RACE_ENG_CFG); + snprintf(buf, sizeof(buf), "%s%s", GfLocalDir(), RACE_ENG_CFG); void *paramHandle = GfParmReadFile(buf, GFPARM_RMODE_REREAD | GFPARM_RMODE_CREAT); - - simuVersionName = GfParmGetStr(paramHandle, RM_SECT_MODULES, RM_ATTR_MOD_SIMU, SimuVersionList[1]); + + // Simulation engine name. + simuVersionName = GfParmGetStr(paramHandle, RM_SECT_MODULES, RM_ATTR_MOD_SIMU, SimuVersionList[DefaultSimuVersion]); for (i = 0; i < NbSimuVersions; i++) { if (strcmp(simuVersionName, SimuVersionList[i]) == 0) { CurSimuVersion = i; @@ -83,6 +85,16 @@ static void loadSimuCfg(void) } } + // Check if the selected simulation module is there, and fall back to the default one if not. + snprintf(buf, sizeof(buf), "%smodules/simu/%s.%s", GfLibDir(), SimuVersionList[CurSimuVersion], DLLEXT); + if (!GfFileExists(buf)) + { + GfLogWarning("User settings %s physics engine module not found ; falling back to %s\n", + SimuVersionList[CurSimuVersion], SimuVersionList[DefaultSimuVersion]); + CurSimuVersion = DefaultSimuVersion; + } + + // Multi-threading. multiThreadSchemeName = GfParmGetStr(paramHandle, RM_SECT_RACE_ENGINE, RM_ATTR_MULTI_THREADING, MultiThreadSchemeList[0]); for (i = 0; i < NbMultiThreadSchemes; i++) { if (strcmp(multiThreadSchemeName, MultiThreadSchemeList[i]) == 0) { @@ -91,6 +103,7 @@ static void loadSimuCfg(void) } } + // Thread affinity. threadAffinitySchemeName = GfParmGetStr(paramHandle, RM_SECT_RACE_ENGINE, RM_ATTR_THREAD_AFFINITY, ThreadAffinitySchemeList[0]); for (i = 0; i < NbThreadAffinitySchemes; i++) { if (strcmp(threadAffinitySchemeName, ThreadAffinitySchemeList[i]) == 0) { @@ -111,7 +124,7 @@ static void loadSimuCfg(void) static void storeSimuCfg(void * /* dummy */) { char buf[1024]; - snprintf(buf, 1024, "%s%s", GfLocalDir(), RACE_ENG_CFG); + snprintf(buf, sizeof(buf), "%s%s", GfLocalDir(), RACE_ENG_CFG); void *paramHandle = GfParmReadFile(buf, GFPARM_RMODE_REREAD | GFPARM_RMODE_CREAT); GfParmSetStr(paramHandle, RM_SECT_MODULES, RM_ATTR_MOD_SIMU, SimuVersionList[CurSimuVersion]); @@ -125,12 +138,24 @@ static void storeSimuCfg(void * /* dummy */) return; } -/* Change the simulation version */ +/* Change the simulation version (but only show really available modules) */ static void onChangeSimuVersion(void *vp) { - CurSimuVersion = (CurSimuVersion + NbSimuVersions + (int)(long)vp) % NbSimuVersions; + char buf[1024]; + + if (!vp) + return; + + const int oldSimuVersion = CurSimuVersion; + do + { + CurSimuVersion = (CurSimuVersion + NbSimuVersions + (int)(long)vp) % NbSimuVersions; + snprintf(buf, sizeof(buf), "%smodules/simu/%s.%s", GfLibDir(), SimuVersionList[CurSimuVersion], DLLEXT); + } + while (!GfFileExists(buf) && CurSimuVersion != oldSimuVersion); + GfuiLabelSetText(ScrHandle, SimuVersionId, SimuVersionDispNameList[CurSimuVersion]); }