From ea0df70c77b84d730536f3266420247b5a38a031 Mon Sep 17 00:00:00 2001 From: Lunkhound Date: Sun, 27 Nov 2016 02:33:16 -0800 Subject: [PATCH] example browser: fix for GUI button toggle state --- .../CommonParameterInterface.h | 2 ++ .../GwenGUISupport/GwenParameterInterface.cpp | 16 ++++++++++++---- .../CommonRigidBodyMTBase.cpp | 19 +++++++++++++++++-- 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/examples/CommonInterfaces/CommonParameterInterface.h b/examples/CommonInterfaces/CommonParameterInterface.h index e2334108c..da5b35342 100644 --- a/examples/CommonInterfaces/CommonParameterInterface.h +++ b/examples/CommonInterfaces/CommonParameterInterface.h @@ -43,6 +43,7 @@ struct ButtonParams int m_buttonId; void* m_userPointer; bool m_isTrigger; + bool m_initialState; ButtonParamChangedCallback m_callback; ButtonParams(const char* name, int buttonId, bool isTrigger) @@ -50,6 +51,7 @@ struct ButtonParams m_buttonId(buttonId), m_userPointer(0), m_isTrigger(isTrigger), + m_initialState(false), m_callback(0) { } diff --git a/examples/ExampleBrowser/GwenGUISupport/GwenParameterInterface.cpp b/examples/ExampleBrowser/GwenGUISupport/GwenParameterInterface.cpp index aa8c0b871..432137bcd 100644 --- a/examples/ExampleBrowser/GwenGUISupport/GwenParameterInterface.cpp +++ b/examples/ExampleBrowser/GwenGUISupport/GwenParameterInterface.cpp @@ -3,12 +3,14 @@ struct MyButtonEventHandler : public Gwen::Event::Handler { + Gwen::Controls::Button* m_buttonControl; ButtonParamChangedCallback m_callback; void* m_userPointer; int m_buttonId; - MyButtonEventHandler(ButtonParamChangedCallback callback, int buttonId, void* userPointer) - :m_callback(callback), + MyButtonEventHandler(Gwen::Controls::Button* buttonControl, ButtonParamChangedCallback callback, int buttonId, void* userPointer) + :m_buttonControl(buttonControl), + m_callback(callback), m_userPointer(userPointer), m_buttonId(buttonId) { @@ -18,7 +20,12 @@ struct MyButtonEventHandler : public Gwen::Event::Handler { if (m_callback) { - (*m_callback)(m_buttonId, true, m_userPointer); + bool buttonState = true; + if (m_buttonControl->IsToggle()) + { + buttonState = m_buttonControl->GetToggleState(); + } + ( *m_callback )( m_buttonId, buttonState, m_userPointer ); } } }; @@ -140,10 +147,11 @@ void GwenParameterInterface::registerButtonParameter(ButtonParams& params) { Gwen::Controls::Button* button = new Gwen::Controls::Button(m_gwenInternalData->m_demoPage->GetPage()); - MyButtonEventHandler* handler = new MyButtonEventHandler(params.m_callback,params.m_buttonId,params.m_userPointer); + MyButtonEventHandler* handler = new MyButtonEventHandler(button, params.m_callback,params.m_buttonId,params.m_userPointer); button->SetText(params.m_name); button->onPress.Add( handler, &MyButtonEventHandler::onButtonPress ); button->SetIsToggle(params.m_isTrigger); + button->SetToggleState(params.m_initialState); m_paramInternalData->m_buttons.push_back(button); m_paramInternalData->m_buttonEventHandlers.push_back(handler); diff --git a/examples/MultiThreadedDemo/CommonRigidBodyMTBase.cpp b/examples/MultiThreadedDemo/CommonRigidBodyMTBase.cpp index 56872e8a5..d29e3dd71 100644 --- a/examples/MultiThreadedDemo/CommonRigidBodyMTBase.cpp +++ b/examples/MultiThreadedDemo/CommonRigidBodyMTBase.cpp @@ -665,7 +665,14 @@ void boolPtrButtonCallback(int buttonId, bool buttonState, void* userPointer) void toggleSolverModeCallback(int buttonId, bool buttonState, void* userPointer) { - gSolverMode ^= buttonId; + if (buttonState) + { + gSolverMode |= buttonId; + } + else + { + gSolverMode &= ~buttonId; + } if (CommonRigidBodyMTBase* crb = reinterpret_cast(userPointer)) { if (crb->m_dynamicsWorld) @@ -795,6 +802,7 @@ void CommonRigidBodyMTBase::createDefaultParameters() { // create a button to toggle multithreaded world ButtonParams button( "Multithreaded world enable", 0, true ); + button.m_initialState = gMultithreadedWorld; button.m_userPointer = &gMultithreadedWorld; button.m_callback = boolPtrButtonCallback; m_guiHelper->getParameterInterface()->registerButtonParameter( button ); @@ -802,6 +810,7 @@ void CommonRigidBodyMTBase::createDefaultParameters() { // create a button to toggle profile printing ButtonParams button( "Display solver info", 0, true ); + button.m_initialState = gDisplayProfileInfo; button.m_userPointer = &gDisplayProfileInfo; button.m_callback = boolPtrButtonCallback; m_guiHelper->getParameterInterface()->registerButtonParameter( button ); @@ -813,7 +822,7 @@ void CommonRigidBodyMTBase::createDefaultParameters() char buttonName[256]; SolverType solverType = static_cast(i); sprintf(buttonName, "Solver Type %s", getSolverTypeName(solverType)); - ButtonParams button( buttonName, 0, true ); + ButtonParams button( buttonName, 0, false ); button.m_buttonId = solverType; button.m_callback = setSolverTypeCallback; m_guiHelper->getParameterInterface()->registerButtonParameter( button ); @@ -831,6 +840,7 @@ void CommonRigidBodyMTBase::createDefaultParameters() { ButtonParams button( "Solver use SIMD", 0, true ); button.m_buttonId = SOLVER_SIMD; + button.m_initialState = !! (gSolverMode & button.m_buttonId); button.m_callback = toggleSolverModeCallback; button.m_userPointer = this; m_guiHelper->getParameterInterface()->registerButtonParameter( button ); @@ -838,6 +848,7 @@ void CommonRigidBodyMTBase::createDefaultParameters() { ButtonParams button( "Solver randomize order", 0, true ); button.m_buttonId = SOLVER_RANDMIZE_ORDER; + button.m_initialState = !! (gSolverMode & button.m_buttonId); button.m_callback = toggleSolverModeCallback; button.m_userPointer = this; m_guiHelper->getParameterInterface()->registerButtonParameter( button ); @@ -845,6 +856,7 @@ void CommonRigidBodyMTBase::createDefaultParameters() { ButtonParams button( "Solver interleave contact/friction", 0, true ); button.m_buttonId = SOLVER_INTERLEAVE_CONTACT_AND_FRICTION_CONSTRAINTS; + button.m_initialState = !! (gSolverMode & button.m_buttonId); button.m_callback = toggleSolverModeCallback; button.m_userPointer = this; m_guiHelper->getParameterInterface()->registerButtonParameter( button ); @@ -852,6 +864,7 @@ void CommonRigidBodyMTBase::createDefaultParameters() { ButtonParams button( "Solver 2 friction directions", 0, true ); button.m_buttonId = SOLVER_USE_2_FRICTION_DIRECTIONS; + button.m_initialState = !! (gSolverMode & button.m_buttonId); button.m_callback = toggleSolverModeCallback; button.m_userPointer = this; m_guiHelper->getParameterInterface()->registerButtonParameter( button ); @@ -859,6 +872,7 @@ void CommonRigidBodyMTBase::createDefaultParameters() { ButtonParams button( "Solver friction dir caching", 0, true ); button.m_buttonId = SOLVER_ENABLE_FRICTION_DIRECTION_CACHING; + button.m_initialState = !! (gSolverMode & button.m_buttonId); button.m_callback = toggleSolverModeCallback; button.m_userPointer = this; m_guiHelper->getParameterInterface()->registerButtonParameter( button ); @@ -866,6 +880,7 @@ void CommonRigidBodyMTBase::createDefaultParameters() { ButtonParams button( "Solver warmstarting", 0, true ); button.m_buttonId = SOLVER_USE_WARMSTARTING; + button.m_initialState = !! (gSolverMode & button.m_buttonId); button.m_callback = toggleSolverModeCallback; button.m_userPointer = this; m_guiHelper->getParameterInterface()->registerButtonParameter( button );