2017-08-18 14:58:29 +02:00
|
|
|
#include "SettingsManager.h"
|
|
|
|
|
#include "Settings.h"
|
|
|
|
|
#include "REV_Math.h"
|
|
|
|
|
|
2017-12-07 03:57:00 +01:00
|
|
|
#include <Windows.h>
|
2017-12-08 15:48:10 +01:00
|
|
|
#include <Shlobj.h>
|
2017-12-14 18:37:35 +01:00
|
|
|
#include <atlbase.h>
|
2017-08-18 14:58:29 +02:00
|
|
|
#include <OVR_CAPI.h>
|
2017-12-07 03:57:00 +01:00
|
|
|
|
2017-08-18 14:58:29 +02:00
|
|
|
SettingsManager::SettingsManager()
|
2017-12-13 16:09:07 +01:00
|
|
|
: m_Section()
|
2017-08-18 14:58:29 +02:00
|
|
|
{
|
2017-12-13 16:09:07 +01:00
|
|
|
DWORD procId = GetCurrentProcessId();
|
|
|
|
|
vr::EVRApplicationError err = vr::VRApplications()->GetApplicationKeyByProcessId(procId, m_Section, vr::k_unMaxApplicationKeyLength);
|
|
|
|
|
if (err != vr::VRApplicationError_None)
|
|
|
|
|
strcpy(m_Section, REV_SETTINGS_SECTION);
|
2017-12-07 03:57:00 +01:00
|
|
|
ReloadSettings();
|
2017-08-18 14:58:29 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SettingsManager::~SettingsManager()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2017-08-31 18:00:44 +02:00
|
|
|
template<> float SettingsManager::Get<float>(const char* key, float defaultVal)
|
|
|
|
|
{
|
|
|
|
|
vr::EVRSettingsError err;
|
2017-12-13 16:09:07 +01:00
|
|
|
float result = vr::VRSettings()->GetFloat(m_Section, key, &err);
|
|
|
|
|
if (err != vr::VRSettingsError_None)
|
|
|
|
|
result = vr::VRSettings()->GetFloat(REV_SETTINGS_SECTION, key, &err);
|
2017-10-11 14:11:52 +02:00
|
|
|
return err == vr::VRSettingsError_None ? result : defaultVal;
|
2017-08-31 18:00:44 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template<> int SettingsManager::Get<int>(const char* key, int defaultVal)
|
|
|
|
|
{
|
|
|
|
|
vr::EVRSettingsError err;
|
2017-12-13 16:09:07 +01:00
|
|
|
int result = vr::VRSettings()->GetInt32(m_Section, key, &err);
|
|
|
|
|
if (err != vr::VRSettingsError_None)
|
|
|
|
|
result = vr::VRSettings()->GetInt32(REV_SETTINGS_SECTION, key, &err);
|
2017-10-11 14:11:52 +02:00
|
|
|
return err == vr::VRSettingsError_None ? result : defaultVal;
|
2017-08-31 18:00:44 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template<> bool SettingsManager::Get<bool>(const char* key, bool defaultVal)
|
|
|
|
|
{
|
|
|
|
|
vr::EVRSettingsError err;
|
2017-12-13 16:09:07 +01:00
|
|
|
bool result = vr::VRSettings()->GetBool(m_Section, key, &err);
|
|
|
|
|
if (err != vr::VRSettingsError_None)
|
|
|
|
|
result = vr::VRSettings()->GetBool(REV_SETTINGS_SECTION, key, &err);
|
2017-10-11 14:11:52 +02:00
|
|
|
return err == vr::VRSettingsError_None ? result : defaultVal;
|
2017-08-31 18:00:44 +02:00
|
|
|
}
|
|
|
|
|
|
2017-12-08 15:48:10 +01:00
|
|
|
template<> const char* SettingsManager::Get<const char*>(const char* key, const char* defaultVal)
|
|
|
|
|
{
|
|
|
|
|
vr::EVRSettingsError err;
|
|
|
|
|
static char result[MAX_PATH]; // TODO: Support larger string sizes
|
2017-12-13 16:09:07 +01:00
|
|
|
vr::VRSettings()->GetString(m_Section, key, result, MAX_PATH, &err);
|
|
|
|
|
if (err != vr::VRSettingsError_None)
|
|
|
|
|
vr::VRSettings()->GetString(REV_SETTINGS_SECTION, key, result, MAX_PATH, &err);
|
2017-12-08 15:48:10 +01:00
|
|
|
return err == vr::VRSettingsError_None ? result : defaultVal;
|
|
|
|
|
}
|
|
|
|
|
|
2017-12-07 03:57:00 +01:00
|
|
|
void SettingsManager::ReloadSettings()
|
2017-08-18 14:58:29 +02:00
|
|
|
{
|
2017-12-07 03:57:00 +01:00
|
|
|
InputSettings s = {
|
|
|
|
|
Get<float>(REV_KEY_THUMB_DEADZONE, REV_DEFAULT_THUMB_DEADZONE),
|
|
|
|
|
(revGripType)Get<int>(REV_KEY_TOGGLE_GRIP, REV_DEFAULT_TOGGLE_GRIP),
|
|
|
|
|
Get<bool>(REV_KEY_TRIGGER_GRIP, REV_DEFAULT_TRIGGER_GRIP),
|
|
|
|
|
Get<float>(REV_KEY_TOGGLE_DELAY, REV_DEFAULT_TOGGLE_DELAY)
|
|
|
|
|
};
|
2017-08-18 14:58:29 +02:00
|
|
|
|
|
|
|
|
OVR::Vector3f angles(
|
2017-08-31 18:00:44 +02:00
|
|
|
OVR::DegreeToRad(Get<float>(REV_KEY_TOUCH_PITCH, REV_DEFAULT_TOUCH_PITCH)),
|
|
|
|
|
OVR::DegreeToRad(Get<float>(REV_KEY_TOUCH_YAW, REV_DEFAULT_TOUCH_YAW)),
|
|
|
|
|
OVR::DegreeToRad(Get<float>(REV_KEY_TOUCH_ROLL, REV_DEFAULT_TOUCH_ROLL))
|
2017-08-18 14:58:29 +02:00
|
|
|
);
|
|
|
|
|
OVR::Vector3f offset(
|
2017-08-31 18:00:44 +02:00
|
|
|
Get<float>(REV_KEY_TOUCH_X, REV_DEFAULT_TOUCH_X),
|
|
|
|
|
Get<float>(REV_KEY_TOUCH_Y, REV_DEFAULT_TOUCH_Y),
|
|
|
|
|
Get<float>(REV_KEY_TOUCH_Z, REV_DEFAULT_TOUCH_Z)
|
2017-08-18 14:58:29 +02:00
|
|
|
);
|
|
|
|
|
|
2017-08-23 16:45:42 +02:00
|
|
|
for (int i = 0; i < ovrHand_Count; i++)
|
2017-08-18 14:58:29 +02:00
|
|
|
{
|
2017-08-23 16:45:42 +02:00
|
|
|
OVR::Matrix4f yaw = OVR::Matrix4f::RotationY(angles.y);
|
|
|
|
|
OVR::Matrix4f pitch = OVR::Matrix4f::RotationX(angles.x);
|
|
|
|
|
OVR::Matrix4f roll = OVR::Matrix4f::RotationZ(angles.z);
|
2017-08-18 14:58:29 +02:00
|
|
|
|
2017-08-23 16:45:42 +02:00
|
|
|
// Mirror the right touch controller offsets
|
|
|
|
|
if (i == ovrHand_Right)
|
2017-08-18 14:58:29 +02:00
|
|
|
{
|
2017-08-23 16:45:42 +02:00
|
|
|
yaw.Invert();
|
|
|
|
|
roll.Invert();
|
|
|
|
|
offset.x *= -1.0f;
|
2017-08-18 14:58:29 +02:00
|
|
|
}
|
|
|
|
|
|
2017-08-23 16:45:42 +02:00
|
|
|
OVR::Matrix4f matrix(yaw * pitch * roll);
|
|
|
|
|
matrix.SetTranslation(offset);
|
2017-12-07 03:57:00 +01:00
|
|
|
memcpy(s.TouchOffset[i].m, matrix.M, sizeof(vr::HmdMatrix34_t));
|
2017-08-18 14:58:29 +02:00
|
|
|
}
|
2017-12-07 03:57:00 +01:00
|
|
|
|
|
|
|
|
// Add the state to the list and update the pointer
|
|
|
|
|
InputSettingsList.push_back(s);
|
|
|
|
|
Input = &InputSettingsList.back();
|
2017-12-14 18:37:35 +01:00
|
|
|
}
|
2017-12-08 15:48:10 +01:00
|
|
|
|
2017-12-14 18:37:35 +01:00
|
|
|
bool SettingsManager::FileExists(const char* path)
|
|
|
|
|
{
|
|
|
|
|
DWORD attrib = GetFileAttributesA(path);
|
|
|
|
|
|
|
|
|
|
return (attrib != INVALID_FILE_ATTRIBUTES &&
|
|
|
|
|
!(attrib & FILE_ATTRIBUTE_DIRECTORY));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::string SettingsManager::GetInputScript()
|
|
|
|
|
{
|
|
|
|
|
CComHeapPtr<wchar_t> documents;
|
2017-12-08 15:48:10 +01:00
|
|
|
HRESULT hr = SHGetKnownFolderPath(FOLDERID_Documents, KF_FLAG_DEFAULT, NULL, &documents);
|
2017-12-14 18:37:35 +01:00
|
|
|
|
|
|
|
|
const char* script = Get<const char*>(REV_KEY_INPUT_SCRIPT, REV_DEFAULT_INPUT_SCRIPT);
|
2017-12-08 15:48:10 +01:00
|
|
|
if (SUCCEEDED(hr))
|
|
|
|
|
{
|
2017-12-13 16:20:57 +01:00
|
|
|
char path[MAX_PATH];
|
2017-12-14 18:37:35 +01:00
|
|
|
|
|
|
|
|
// If this is a known application, try to find a app-specific script for it.
|
|
|
|
|
if (strstr(m_Section, "revive.app."))
|
|
|
|
|
{
|
|
|
|
|
// Skip the session prefix
|
|
|
|
|
snprintf(path, MAX_PATH, "%ls\\Revive\\Input\\%s", (wchar_t*)documents, m_Section + strlen("revive.app."));
|
|
|
|
|
if (FileExists(path))
|
|
|
|
|
return std::string(path);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// If not follow the settings and use the script by that name
|
|
|
|
|
snprintf(path, MAX_PATH, "%ls\\Revive\\Input\\%s", (wchar_t*)documents, script);
|
|
|
|
|
return std::string(path);
|
2017-12-08 15:48:10 +01:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2017-12-14 18:37:35 +01:00
|
|
|
// Fall-back to a relative path
|
|
|
|
|
return std::string(script);
|
2017-12-08 15:48:10 +01:00
|
|
|
}
|
2017-08-18 14:58:29 +02:00
|
|
|
}
|