diff options
| author | Andrey Kleshchev <andreykproductengine@lindenlab.com> | 2020-07-10 20:48:43 +0300 |
|---|---|---|
| committer | Andrey Kleshchev <andreykproductengine@lindenlab.com> | 2020-07-15 13:55:32 +0300 |
| commit | 54383cac8fa8a40d96590a300d4fce618f7413f3 (patch) | |
| tree | 25e5d5b28bcc914a779292f33a2070593f5c247f /indra/newview/llfloaterjoystick.cpp | |
| parent | 0fbe4cf62a236ea24f383818bf81b933f87380d8 (diff) | |
SL-5894 #3 WIP enumerate devices to flaoter, let floater set device
temp
Diffstat (limited to 'indra/newview/llfloaterjoystick.cpp')
| -rw-r--r-- | indra/newview/llfloaterjoystick.cpp | 87 |
1 files changed, 80 insertions, 7 deletions
diff --git a/indra/newview/llfloaterjoystick.cpp b/indra/newview/llfloaterjoystick.cpp index 4538d34c95..79814de28d 100644 --- a/indra/newview/llfloaterjoystick.cpp +++ b/indra/newview/llfloaterjoystick.cpp @@ -40,9 +40,21 @@ #include "llviewercontrol.h" #include "llappviewer.h" #include "llviewerjoystick.h" +#include "llviewerwindow.h" +#include "llwindow.h" #include "llcheckboxctrl.h" #include "llcombobox.h" +#if LL_WINDOWS && !LL_MESA_HEADLESS +// Require DirectInput version 8 +#define DIRECTINPUT_VERSION 0x0800 + +//#include <InitGuid.h> +//#pragma comment(lib, "dinput8") +//#pragma comment(lib, "dxguid.lib") +#include <dinput.h> +#endif + static LLTrace::SampleStatHandle<> sJoystickAxis0("Joystick axis 0"), sJoystickAxis1("Joystick axis 1"), sJoystickAxis2("Joystick axis 2"), @@ -59,6 +71,29 @@ static LLTrace::SampleStatHandle<>* sJoystickAxes[6] = &sJoystickAxis5 }; + +#if LL_WINDOWS && !LL_MESA_HEADLESS + +BOOL CALLBACK di8_list_devices_callback(LPCDIDEVICEINSTANCE device_instance_ptr, LPVOID pvRef) +{ + // Note: If a single device can function as more than one DirectInput + // device type, it is enumerated as each device type that it supports. + // Capable of detecting devices like Oculus Rift + if (device_instance_ptr && pvRef) + { + std::string product_name = utf16str_to_utf8str(llutf16string(device_instance_ptr->tszProductName)); + S32 size = sizeof(GUID); + LLSD::Binary data; //just an std::vector + data.resize(size); + memcpy(&data[0], &device_instance_ptr->guidInstance /*POD _GUID*/, size); + + LLFloaterJoystick * floater = (LLFloaterJoystick*)pvRef; + floater->addDevice(product_name, LLSD(data)); + } + return DIENUM_CONTINUE; +} +#endif + LLFloaterJoystick::LLFloaterJoystick(const LLSD& data) : LLFloater(data), mHasDeviceList(false) @@ -216,25 +251,62 @@ void LLFloaterJoystick::refresh() initFromSettings(); } +void LLFloaterJoystick::addDevice(std::string &name, LLSD& value) +{ + mJoysticksCombo->add(name, value, ADD_BOTTOM, 1); +} + void LLFloaterJoystick::refreshListOfDevices() { mJoysticksCombo->removeall(); - mJoysticksCombo->add(getString("JoystickDisabled"), LLSD(LLSD::Integer(0)), ADD_BOTTOM, 1); + std::string no_device = getString("JoystickDisabled"); + addDevice(no_device, LLSD(LLSD::Integer(0))); mHasDeviceList = false; - std::string desc = LLViewerJoystick::getInstance()->getDescription(); - if (!desc.empty()) + + // di8_devices_callback callback is immediate and happens in scope of getInputDevices() +#if LL_WINDOWS && !LL_MESA_HEADLESS + // space navigator is marked as DI8DEVCLASS_GAMECTRL in ndof lib + U32 device_type = DI8DEVCLASS_GAMECTRL; + void* callback = &di8_list_devices_callback; +#elif + // MAC doesn't support device search yet + // On MAC there is an ndof_idsearch and it is possible to specify product + // and manufacturer in NDOF_Device for ndof_init_first to pick specific one + U32 device_type = 0; + void* callback = NULL; +#endif + if (gViewerWindow->getWindow()->getInputDevices(device_type, callback, this)) { - mJoysticksCombo->add(desc, LLSD(LLSD::Integer(1)), ADD_BOTTOM, 1); mHasDeviceList = true; } - //todo: load list of devices + LLSD guid = LLViewerJoystick::getInstance()->getDeviceUUID(); + + if (LLViewerJoystick::getInstance()->isJoystickInitialized() && + (!mHasDeviceList || !guid.isBinary())) + { +#if LL_WINDOWS && !LL_MESA_HEADLESS + LL_WARNS() << "NDOF connected to device without using SL provided handle" << LL_ENDL; +#endif + std::string desc = LLViewerJoystick::getInstance()->getDescription(); + if (!desc.empty()) + { + addDevice(desc, LLSD(LLSD::Integer(1))); + mHasDeviceList = true; + } + } if (gSavedSettings.getBOOL("JoystickEnabled") && mHasDeviceList) { - // todo: select device according to data from LLViewerJoystick - mJoysticksCombo->selectByValue(LLSD::Integer(1)); + if (guid.isBinary()) + { + mJoysticksCombo->selectByValue(guid); + } + else + { + mJoysticksCombo->selectByValue(LLSD::Integer(1)); + } } else { @@ -324,6 +396,7 @@ void LLFloaterJoystick::onCommitJoystickEnabled(LLUICtrl*, void *joy_panel) } else { + LLViewerJoystick::getInstance()->initDevice(value); // else joystick is enabled, because combobox holds id of device joystick_enabled = true; // todo: make LLViewerJoystick select a device based on value |
