example browser: GUI improvements for CommonRigidBodyMT based demos

This commit is contained in:
Lunkhound
2017-06-10 16:24:21 -07:00
parent 444f206c7c
commit f86b9b4fc4

View File

@@ -285,6 +285,14 @@ public:
{ {
if ( ts ) if ( ts )
{ {
#if BT_THREADSAFE
// if initial number of threads is 0 or 1,
if (ts->getNumThreads() <= 1)
{
// for OpenMP, TBB, PPL set num threads to number of logical cores
ts->setNumThreads( ts->getMaxNumThreads() );
}
#endif // #if BT_THREADSAFE
m_taskSchedulers.push_back( ts ); m_taskSchedulers.push_back( ts );
} }
} }
@@ -364,14 +372,20 @@ static void toggleSolverModeCallback(int buttonId, bool buttonState, void* userP
} }
} }
static void setSolverTypeCallback(int buttonId, bool buttonState, void* userPointer) void setSolverTypeComboBoxCallback(int combobox, const char* item, void* userPointer)
{ {
if (buttonId >= 0 && buttonId < SOLVER_TYPE_COUNT) const char** items = static_cast<const char**>(userPointer);
for (int i = 0; i < SOLVER_TYPE_COUNT; ++i)
{ {
gSolverType = static_cast<SolverType>(buttonId); if (stricmp(item, items[i]) == 0)
{
gSolverType = static_cast<SolverType>(i);
break;
}
} }
} }
static void setNumThreads( int numThreads ) static void setNumThreads( int numThreads )
{ {
#if BT_THREADSAFE #if BT_THREADSAFE
@@ -385,18 +399,32 @@ static void setNumThreads( int numThreads )
#endif // #if BT_THREADSAFE #endif // #if BT_THREADSAFE
} }
static void apiSelectButtonCallback(int buttonId, bool buttonState, void* userPointer)
void setTaskSchedulerComboBoxCallback(int combobox, const char* item, void* userPointer)
{ {
#if BT_THREADSAFE #if BT_THREADSAFE
// change the task scheduler const char** items = static_cast<const char**>( userPointer );
btSetTaskScheduler( gTaskSchedulerMgr.getTaskScheduler( buttonId ) ); for ( int i = 0; i < 20; ++i )
setNumThreads( int( gSliderNumThreads ) ); {
if ( stricmp( item, items[ i ] ) == 0 )
{
// change the task scheduler
btITaskScheduler* ts = gTaskSchedulerMgr.getTaskScheduler( i );
btSetTaskScheduler( ts );
gSliderNumThreads = float(ts->getNumThreads());
break;
}
}
#endif // #if BT_THREADSAFE #endif // #if BT_THREADSAFE
} }
static void setThreadCountCallback(float val, void* userPtr) static void setThreadCountCallback(float val, void* userPtr)
{ {
#if BT_THREADSAFE
setNumThreads( int( gSliderNumThreads ) ); setNumThreads( int( gSliderNumThreads ) );
gSliderNumThreads = float(btGetTaskScheduler()->getNumThreads());
#endif // #if BT_THREADSAFE
} }
static void setSolverIterationCountCallback(float val, void* userPtr) static void setSolverIterationCountCallback(float val, void* userPtr)
@@ -490,16 +518,21 @@ void CommonRigidBodyMTBase::createDefaultParameters()
m_guiHelper->getParameterInterface()->registerButtonParameter( button ); m_guiHelper->getParameterInterface()->registerButtonParameter( button );
} }
// add buttons for switching to different solver types
for (int i = 0; i < SOLVER_TYPE_COUNT; ++i)
{ {
char buttonName[256]; // create a combo box for selecting the solver type
SolverType solverType = static_cast<SolverType>(i); static const char* sSolverTypeComboBoxItems[ SOLVER_TYPE_COUNT ];
sprintf(buttonName, "Solver Type %s", getSolverTypeName(solverType)); for ( int i = 0; i < SOLVER_TYPE_COUNT; ++i )
ButtonParams button( buttonName, 0, false ); {
button.m_buttonId = solverType; SolverType solverType = static_cast<SolverType>( i );
button.m_callback = setSolverTypeCallback; sSolverTypeComboBoxItems[ i ] = getSolverTypeName( solverType );
m_guiHelper->getParameterInterface()->registerButtonParameter( button ); }
ComboBoxParams comboParams;
comboParams.m_userPointer = sSolverTypeComboBoxItems;
comboParams.m_numItems = SOLVER_TYPE_COUNT;
comboParams.m_startItem = gSolverType;
comboParams.m_items = sSolverTypeComboBoxItems;
comboParams.m_callback = setSolverTypeComboBoxCallback;
m_guiHelper->getParameterInterface()->registerComboBox( comboParams );
} }
{ {
// a slider for the number of solver iterations // a slider for the number of solver iterations
@@ -562,14 +595,27 @@ void CommonRigidBodyMTBase::createDefaultParameters()
if (m_multithreadedWorld) if (m_multithreadedWorld)
{ {
#if BT_THREADSAFE #if BT_THREADSAFE
// create a button for each supported threading API if (gTaskSchedulerMgr.getNumTaskSchedulers() >= 1)
for ( int iApi = 0; iApi < gTaskSchedulerMgr.getNumTaskSchedulers(); ++iApi )
{ {
char str[ 1024 ]; // create a combo box for selecting the task scheduler
sprintf( str, "API %s", gTaskSchedulerMgr.getTaskScheduler(iApi)->getName() ); const int maxNumTaskSchedulers = 20;
ButtonParams button( str, iApi, false ); static const char* sTaskSchedulerComboBoxItems[ maxNumTaskSchedulers ];
button.m_callback = apiSelectButtonCallback; int startingItem = 0;
m_guiHelper->getParameterInterface()->registerButtonParameter( button ); for ( int i = 0; i < gTaskSchedulerMgr.getNumTaskSchedulers(); ++i )
{
sTaskSchedulerComboBoxItems[ i ] = gTaskSchedulerMgr.getTaskScheduler(i)->getName();
if (gTaskSchedulerMgr.getTaskScheduler(i) == btGetTaskScheduler())
{
startingItem = i;
}
}
ComboBoxParams comboParams;
comboParams.m_userPointer = sTaskSchedulerComboBoxItems;
comboParams.m_numItems = gTaskSchedulerMgr.getNumTaskSchedulers();
comboParams.m_startItem = startingItem;
comboParams.m_items = sTaskSchedulerComboBoxItems;
comboParams.m_callback = setTaskSchedulerComboBoxCallback;
m_guiHelper->getParameterInterface()->registerComboBox( comboParams );
} }
{ {
// create a slider to set the number of threads to use // create a slider to set the number of threads to use