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
This commit is contained in:
parent
3c46e58c90
commit
85d664d980
2 changed files with 52 additions and 12 deletions
|
@ -270,15 +270,30 @@ bool RaceEngine::loadPhysicsEngine()
|
||||||
if (_piPhysEngine)
|
if (_piPhysEngine)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
const char* pszModName =
|
// 1) Get the physics engine name from user settings (default: Simu V2.1)
|
||||||
GfParmGetStr(ReSituation::self().data()->_reParam, "Modules", "simu", "");
|
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;
|
std::ostringstream ossLoadMsg;
|
||||||
ossLoadMsg << "Loading physics engine (" << pszModName<< ") ...";
|
ossLoadMsg << "Loading physics engine (" << strModName<< ") ...";
|
||||||
if (_piUserItf)
|
if (_piUserItf)
|
||||||
_piUserItf->addLoadingMessage(ossLoadMsg.str().c_str());
|
_piUserItf->addLoadingMessage(ossLoadMsg.str().c_str());
|
||||||
|
|
||||||
std::ostringstream ossModLibName;
|
|
||||||
ossModLibName << GfLibDir() << "modules/simu/" << pszModName << '.' << DLLEXT;
|
|
||||||
GfModule* pmodPhysEngine = GfModule::load(ossModLibName.str());
|
GfModule* pmodPhysEngine = GfModule::load(ossModLibName.str());
|
||||||
if (pmodPhysEngine)
|
if (pmodPhysEngine)
|
||||||
_piPhysEngine = pmodPhysEngine->getInterface<IPhysicsEngine>();
|
_piPhysEngine = pmodPhysEngine->getInterface<IPhysicsEngine>();
|
||||||
|
|
|
@ -36,11 +36,12 @@
|
||||||
|
|
||||||
|
|
||||||
/* list of available simulation engine */
|
/* list of available simulation engine */
|
||||||
|
static const int DefaultSimuVersion = 1;
|
||||||
static const char *SimuVersionList[] =
|
static const char *SimuVersionList[] =
|
||||||
{RM_VAL_MOD_SIMU_V2, RM_VAL_MOD_SIMU_V2_1, RM_VAL_MOD_SIMU_V3};
|
{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 char *SimuVersionDispNameList[] = {"V2.0", "V2.1", "V3.0"};
|
||||||
static const int NbSimuVersions = sizeof(SimuVersionList) / sizeof(SimuVersionList[0]);
|
static const int NbSimuVersions = sizeof(SimuVersionList) / sizeof(SimuVersionList[0]);
|
||||||
static int CurSimuVersion = 1;
|
static int CurSimuVersion = DefaultSimuVersion;
|
||||||
|
|
||||||
/* list of available multi-threading schemes */
|
/* list of available multi-threading schemes */
|
||||||
static const char *MultiThreadSchemeList[] = {RM_VAL_AUTO, RM_VAL_ON, RM_VAL_OFF};
|
static const char *MultiThreadSchemeList[] = {RM_VAL_AUTO, RM_VAL_ON, RM_VAL_OFF};
|
||||||
|
@ -71,11 +72,12 @@ static void loadSimuCfg(void)
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
char buf[1024];
|
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);
|
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++) {
|
for (i = 0; i < NbSimuVersions; i++) {
|
||||||
if (strcmp(simuVersionName, SimuVersionList[i]) == 0) {
|
if (strcmp(simuVersionName, SimuVersionList[i]) == 0) {
|
||||||
CurSimuVersion = i;
|
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]);
|
multiThreadSchemeName = GfParmGetStr(paramHandle, RM_SECT_RACE_ENGINE, RM_ATTR_MULTI_THREADING, MultiThreadSchemeList[0]);
|
||||||
for (i = 0; i < NbMultiThreadSchemes; i++) {
|
for (i = 0; i < NbMultiThreadSchemes; i++) {
|
||||||
if (strcmp(multiThreadSchemeName, MultiThreadSchemeList[i]) == 0) {
|
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]);
|
threadAffinitySchemeName = GfParmGetStr(paramHandle, RM_SECT_RACE_ENGINE, RM_ATTR_THREAD_AFFINITY, ThreadAffinitySchemeList[0]);
|
||||||
for (i = 0; i < NbThreadAffinitySchemes; i++) {
|
for (i = 0; i < NbThreadAffinitySchemes; i++) {
|
||||||
if (strcmp(threadAffinitySchemeName, ThreadAffinitySchemeList[i]) == 0) {
|
if (strcmp(threadAffinitySchemeName, ThreadAffinitySchemeList[i]) == 0) {
|
||||||
|
@ -111,7 +124,7 @@ static void loadSimuCfg(void)
|
||||||
static void storeSimuCfg(void * /* dummy */)
|
static void storeSimuCfg(void * /* dummy */)
|
||||||
{
|
{
|
||||||
char buf[1024];
|
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);
|
void *paramHandle = GfParmReadFile(buf, GFPARM_RMODE_REREAD | GFPARM_RMODE_CREAT);
|
||||||
GfParmSetStr(paramHandle, RM_SECT_MODULES, RM_ATTR_MOD_SIMU, SimuVersionList[CurSimuVersion]);
|
GfParmSetStr(paramHandle, RM_SECT_MODULES, RM_ATTR_MOD_SIMU, SimuVersionList[CurSimuVersion]);
|
||||||
|
@ -125,12 +138,24 @@ static void storeSimuCfg(void * /* dummy */)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Change the simulation version */
|
/* Change the simulation version (but only show really available modules) */
|
||||||
static void
|
static void
|
||||||
onChangeSimuVersion(void *vp)
|
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]);
|
GfuiLabelSetText(ScrHandle, SimuVersionId, SimuVersionDispNameList[CurSimuVersion]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue