mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-08-09 15:00:36 +02:00
Isolate sixense dynamic linking for OSX
This commit is contained in:
parent
143e92ee1b
commit
298ac650d8
3 changed files with 109 additions and 107 deletions
|
@ -9,12 +9,21 @@
|
||||||
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
//
|
//
|
||||||
|
|
||||||
#include <vector>
|
#include "SixenseManager.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_SIXENSE
|
||||||
|
#include "sixense.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <QCoreApplication>
|
#include <QCoreApplication>
|
||||||
#include <QtCore/QSysInfo>
|
#include <QtCore/QSysInfo>
|
||||||
#include <QtGlobal>
|
#include <QtGlobal>
|
||||||
|
|
||||||
|
// TODO: This should not be here
|
||||||
|
#include <QLoggingCategory>
|
||||||
|
Q_DECLARE_LOGGING_CATEGORY(inputplugins)
|
||||||
|
Q_LOGGING_CATEGORY(inputplugins, "hifi.inputplugins")
|
||||||
|
|
||||||
#include <GLMHelpers.h>
|
#include <GLMHelpers.h>
|
||||||
#include <NumericalConstants.h>
|
#include <NumericalConstants.h>
|
||||||
#include <PerfStat.h>
|
#include <PerfStat.h>
|
||||||
|
@ -25,40 +34,12 @@
|
||||||
#include <UserActivityLogger.h>
|
#include <UserActivityLogger.h>
|
||||||
#include <controllers/UserInputMapper.h>
|
#include <controllers/UserInputMapper.h>
|
||||||
|
|
||||||
#include "SixenseManager.h"
|
#include "UserActivityLogger.h"
|
||||||
|
|
||||||
|
|
||||||
#ifdef HAVE_SIXENSE
|
|
||||||
#include "sixense.h"
|
|
||||||
|
|
||||||
#ifdef __APPLE__
|
|
||||||
static QLibrary* _sixenseLibrary { nullptr };
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// TODO: This should not be here
|
|
||||||
#include <QLoggingCategory>
|
|
||||||
Q_DECLARE_LOGGING_CATEGORY(inputplugins)
|
|
||||||
Q_LOGGING_CATEGORY(inputplugins, "hifi.inputplugins")
|
|
||||||
|
|
||||||
#ifdef HAVE_SIXENSE
|
|
||||||
|
|
||||||
|
|
||||||
const glm::vec3 SixenseManager::DEFAULT_AVATAR_POSITION { -0.25f, -0.35f, -0.3f }; // in hydra frame
|
const glm::vec3 SixenseManager::DEFAULT_AVATAR_POSITION { -0.25f, -0.35f, -0.3f }; // in hydra frame
|
||||||
const float SixenseManager::CONTROLLER_THRESHOLD { 0.35f };
|
const float SixenseManager::CONTROLLER_THRESHOLD { 0.35f };
|
||||||
const float SixenseManager::DEFAULT_REACH_LENGTH { 1.5f };
|
const float SixenseManager::DEFAULT_REACH_LENGTH { 1.5f };
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __APPLE__
|
|
||||||
typedef int (*SixenseBaseFunction)();
|
|
||||||
typedef int (*SixenseTakeIntFunction)(int);
|
|
||||||
#ifdef HAVE_SIXENSE
|
|
||||||
typedef int (*SixenseTakeIntAndSixenseControllerData)(int, sixenseControllerData*);
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
const QString SixenseManager::NAME = "Sixense";
|
const QString SixenseManager::NAME = "Sixense";
|
||||||
const QString SixenseManager::HYDRA_ID_STRING = "Razer Hydra";
|
const QString SixenseManager::HYDRA_ID_STRING = "Razer Hydra";
|
||||||
|
|
||||||
|
@ -94,31 +75,6 @@ void SixenseManager::activate() {
|
||||||
auto userInputMapper = DependencyManager::get<controller::UserInputMapper>();
|
auto userInputMapper = DependencyManager::get<controller::UserInputMapper>();
|
||||||
userInputMapper->registerDevice(_inputDevice);
|
userInputMapper->registerDevice(_inputDevice);
|
||||||
|
|
||||||
#ifdef __APPLE__
|
|
||||||
|
|
||||||
if (!_sixenseLibrary) {
|
|
||||||
|
|
||||||
#ifdef SIXENSE_LIB_FILENAME
|
|
||||||
_sixenseLibrary = new QLibrary(SIXENSE_LIB_FILENAME);
|
|
||||||
#else
|
|
||||||
const QString SIXENSE_LIBRARY_NAME = "libsixense_x64";
|
|
||||||
QString frameworkSixenseLibrary = QCoreApplication::applicationDirPath() + "/../Frameworks/"
|
|
||||||
+ SIXENSE_LIBRARY_NAME;
|
|
||||||
|
|
||||||
_sixenseLibrary = new QLibrary(frameworkSixenseLibrary);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_sixenseLibrary->load()){
|
|
||||||
qCDebug(inputplugins) << "Loaded sixense library for hydra support -" << _sixenseLibrary->fileName();
|
|
||||||
} else {
|
|
||||||
qCDebug(inputplugins) << "Sixense library at" << _sixenseLibrary->fileName() << "failed to load."
|
|
||||||
<< "Continuing without hydra support.";
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
SixenseBaseFunction sixenseInit = (SixenseBaseFunction) _sixenseLibrary->resolve("sixenseInit");
|
|
||||||
#endif
|
|
||||||
loadSettings();
|
loadSettings();
|
||||||
sixenseInit();
|
sixenseInit();
|
||||||
#endif
|
#endif
|
||||||
|
@ -139,26 +95,13 @@ void SixenseManager::deactivate() {
|
||||||
userInputMapper->removeDevice(_inputDevice->_deviceID);
|
userInputMapper->removeDevice(_inputDevice->_deviceID);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __APPLE__
|
|
||||||
SixenseBaseFunction sixenseExit = (SixenseBaseFunction)_sixenseLibrary->resolve("sixenseExit");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
sixenseExit();
|
sixenseExit();
|
||||||
|
|
||||||
#ifdef __APPLE__
|
|
||||||
delete _sixenseLibrary;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void SixenseManager::setSixenseFilter(bool filter) {
|
void SixenseManager::setSixenseFilter(bool filter) {
|
||||||
#ifdef HAVE_SIXENSE
|
#ifdef HAVE_SIXENSE
|
||||||
#ifdef __APPLE__
|
sixenseSetFilterEnabled(filter ? 1 : 0);
|
||||||
SixenseTakeIntFunction sixenseSetFilterEnabled = (SixenseTakeIntFunction) _sixenseLibrary->resolve("sixenseSetFilterEnabled");
|
|
||||||
#endif
|
|
||||||
int newFilter = filter ? 1 : 0;
|
|
||||||
sixenseSetFilterEnabled(newFilter);
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -180,11 +123,6 @@ void SixenseManager::InputDevice::update(float deltaTime, bool jointsCaptured) {
|
||||||
#ifdef HAVE_SIXENSE
|
#ifdef HAVE_SIXENSE
|
||||||
_buttonPressedMap.clear();
|
_buttonPressedMap.clear();
|
||||||
|
|
||||||
#ifdef __APPLE__
|
|
||||||
SixenseBaseFunction sixenseGetNumActiveControllers =
|
|
||||||
(SixenseBaseFunction) _sixenseLibrary->resolve("sixenseGetNumActiveControllers");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
auto userInputMapper = DependencyManager::get<controller::UserInputMapper>();
|
auto userInputMapper = DependencyManager::get<controller::UserInputMapper>();
|
||||||
|
|
||||||
static const float MAX_DISCONNECTED_TIME = 2.0f;
|
static const float MAX_DISCONNECTED_TIME = 2.0f;
|
||||||
|
@ -213,24 +151,11 @@ void SixenseManager::InputDevice::update(float deltaTime, bool jointsCaptured) {
|
||||||
// FIXME send this message once when we've positively identified hydra hardware
|
// FIXME send this message once when we've positively identified hydra hardware
|
||||||
//UserActivityLogger::getInstance().connectedDevice("spatial_controller", "hydra");
|
//UserActivityLogger::getInstance().connectedDevice("spatial_controller", "hydra");
|
||||||
|
|
||||||
#ifdef __APPLE__
|
|
||||||
SixenseBaseFunction sixenseGetMaxControllers =
|
|
||||||
(SixenseBaseFunction) _sixenseLibrary->resolve("sixenseGetMaxControllers");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int maxControllers = sixenseGetMaxControllers();
|
int maxControllers = sixenseGetMaxControllers();
|
||||||
|
|
||||||
// we only support two controllers
|
// we only support two controllers
|
||||||
sixenseControllerData controllers[2];
|
sixenseControllerData controllers[2];
|
||||||
|
|
||||||
#ifdef __APPLE__
|
|
||||||
SixenseTakeIntFunction sixenseIsControllerEnabled =
|
|
||||||
(SixenseTakeIntFunction) _sixenseLibrary->resolve("sixenseIsControllerEnabled");
|
|
||||||
|
|
||||||
SixenseTakeIntAndSixenseControllerData sixenseGetNewestData =
|
|
||||||
(SixenseTakeIntAndSixenseControllerData) _sixenseLibrary->resolve("sixenseGetNewestData");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int numActiveControllers = 0;
|
int numActiveControllers = 0;
|
||||||
for (int i = 0; i < maxControllers && numActiveControllers < 2; i++) {
|
for (int i = 0; i < maxControllers && numActiveControllers < 2; i++) {
|
||||||
if (!sixenseIsControllerEnabled(i)) {
|
if (!sixenseIsControllerEnabled(i)) {
|
||||||
|
@ -479,8 +404,6 @@ void SixenseManager::InputDevice::handlePoseEvent(float deltaTime, glm::vec3 pos
|
||||||
glm::vec3 velocity(0.0f);
|
glm::vec3 velocity(0.0f);
|
||||||
glm::quat angularVelocity;
|
glm::quat angularVelocity;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (prevPose.isValid() && deltaTime > std::numeric_limits<float>::epsilon()) {
|
if (prevPose.isValid() && deltaTime > std::numeric_limits<float>::epsilon()) {
|
||||||
|
|
||||||
velocity = (position - prevPose.getTranslation()) / deltaTime;
|
velocity = (position - prevPose.getTranslation()) / deltaTime;
|
||||||
|
|
|
@ -12,18 +12,6 @@
|
||||||
#ifndef hifi_SixenseManager_h
|
#ifndef hifi_SixenseManager_h
|
||||||
#define hifi_SixenseManager_h
|
#define hifi_SixenseManager_h
|
||||||
|
|
||||||
#ifdef HAVE_SIXENSE
|
|
||||||
#include <glm/glm.hpp>
|
|
||||||
#include <glm/gtc/quaternion.hpp>
|
|
||||||
#include "sixense.h"
|
|
||||||
|
|
||||||
#ifdef __APPLE__
|
|
||||||
#include <QCoreApplication>
|
|
||||||
#include <qlibrary.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <SimpleMovingAverage.h>
|
#include <SimpleMovingAverage.h>
|
||||||
|
|
||||||
#include <controllers/InputDevice.h>
|
#include <controllers/InputDevice.h>
|
||||||
|
@ -31,8 +19,6 @@
|
||||||
|
|
||||||
#include "InputPlugin.h"
|
#include "InputPlugin.h"
|
||||||
|
|
||||||
class QLibrary;
|
|
||||||
|
|
||||||
const unsigned int BUTTON_0 = 1U << 0; // the skinny button between 1 and 2
|
const unsigned int BUTTON_0 = 1U << 0; // the skinny button between 1 and 2
|
||||||
const unsigned int BUTTON_1 = 1U << 5;
|
const unsigned int BUTTON_1 = 1U << 5;
|
||||||
const unsigned int BUTTON_2 = 1U << 6;
|
const unsigned int BUTTON_2 = 1U << 6;
|
||||||
|
@ -75,7 +61,6 @@ private:
|
||||||
static const float CONTROLLER_THRESHOLD;
|
static const float CONTROLLER_THRESHOLD;
|
||||||
static const float DEFAULT_REACH_LENGTH;
|
static const float DEFAULT_REACH_LENGTH;
|
||||||
|
|
||||||
|
|
||||||
using Samples = std::pair< MovingAverage< glm::vec3, MAX_NUM_AVERAGING_SAMPLES>, MovingAverage< glm::vec4, MAX_NUM_AVERAGING_SAMPLES> >;
|
using Samples = std::pair< MovingAverage< glm::vec3, MAX_NUM_AVERAGING_SAMPLES>, MovingAverage< glm::vec4, MAX_NUM_AVERAGING_SAMPLES> >;
|
||||||
using MovingAverageMap = std::map< int, Samples >;
|
using MovingAverageMap = std::map< int, Samples >;
|
||||||
|
|
||||||
|
@ -113,9 +98,6 @@ private:
|
||||||
glm::vec3 _reachRight;
|
glm::vec3 _reachRight;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool _useSixenseFilter = true;
|
|
||||||
std::shared_ptr<InputDevice> _inputDevice { std::make_shared<InputDevice>() };
|
std::shared_ptr<InputDevice> _inputDevice { std::make_shared<InputDevice>() };
|
||||||
|
|
||||||
static const QString NAME;
|
static const QString NAME;
|
||||||
|
|
|
@ -0,0 +1,97 @@
|
||||||
|
//
|
||||||
|
// SixenseSupportOSX.cpp
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Created by Clement on 10/20/15.
|
||||||
|
// Copyright 2015 High Fidelity, Inc.
|
||||||
|
//
|
||||||
|
// Distributed under the Apache License, Version 2.0.
|
||||||
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifdef __APPLE__
|
||||||
|
#include "sixense.h"
|
||||||
|
|
||||||
|
#include <QtCore/QCoreApplication>
|
||||||
|
#include <QtCore/QDebug>
|
||||||
|
#include <QtCore/QLibrary>
|
||||||
|
|
||||||
|
using std::string;
|
||||||
|
using std::unique_ptr;
|
||||||
|
using SixenseBaseFunction = int (*)();
|
||||||
|
using SixenseTakeIntFunction = int (*)(int);
|
||||||
|
using SixenseTakeIntAndSixenseControllerData = int (*)(int, sixenseControllerData*);
|
||||||
|
|
||||||
|
static unique_ptr<QLibrary> SIXENSE;
|
||||||
|
|
||||||
|
bool loadSixense() {
|
||||||
|
if (!SIXENSE) {
|
||||||
|
static const QString LIBRARY_PATH =
|
||||||
|
#ifdef SIXENSE_LIB_FILENAME
|
||||||
|
SIXENSE_LIB_FILENAME;
|
||||||
|
#else
|
||||||
|
QCoreApplication::applicationDirPath() + "/../Frameworks/libsixense_x64";
|
||||||
|
#endif
|
||||||
|
SIXENSE.reset(new QLibrary(LIBRARY_PATH));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (SIXENSE->load()){
|
||||||
|
qDebug() << "Loaded sixense library for hydra support -" << SIXENSE->fileName();
|
||||||
|
} else {
|
||||||
|
qDebug() << "Sixense library at" << SIXENSE->fileName() << "failed to load:" << SIXENSE->errorString();
|
||||||
|
qDebug() << "Continuing without hydra support.";
|
||||||
|
}
|
||||||
|
return SIXENSE->isLoaded();
|
||||||
|
}
|
||||||
|
|
||||||
|
void unloadSixense() {
|
||||||
|
SIXENSE->unload();
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename Func>
|
||||||
|
Func resolve(const char* name) {
|
||||||
|
Q_ASSERT_X(SIXENSE && SIXENSE->isLoaded(), __FUNCTION__, "Sixense library not loaded");
|
||||||
|
auto func = reinterpret_cast<Func>(SIXENSE->resolve(name));
|
||||||
|
Q_ASSERT_X(func, __FUNCTION__, string("Could not resolve ").append(name).c_str());
|
||||||
|
return func;
|
||||||
|
}
|
||||||
|
|
||||||
|
// sixense.h wrapper for OSX dynamic linking
|
||||||
|
int sixenseInit() {
|
||||||
|
loadSixense();
|
||||||
|
auto sixenseInit = resolve<SixenseBaseFunction>("sixenseInit");
|
||||||
|
return sixenseInit();
|
||||||
|
}
|
||||||
|
|
||||||
|
int sixenseExit() {
|
||||||
|
auto sixenseExit = resolve<SixenseBaseFunction>("sixenseExit");
|
||||||
|
auto returnCode = sixenseExit();
|
||||||
|
unloadSixense();
|
||||||
|
return returnCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
int sixenseSetFilterEnabled(int input) {
|
||||||
|
auto sixenseSetFilterEnabled = resolve<SixenseTakeIntFunction>("sixenseSetFilterEnabled");
|
||||||
|
return sixenseSetFilterEnabled(input);
|
||||||
|
}
|
||||||
|
|
||||||
|
int sixenseGetNumActiveControllers() {
|
||||||
|
auto sixenseGetNumActiveControllers = resolve<SixenseBaseFunction>("sixenseGetNumActiveControllers");
|
||||||
|
return sixenseGetNumActiveControllers();
|
||||||
|
}
|
||||||
|
|
||||||
|
int sixenseGetMaxControllers() {
|
||||||
|
auto sixenseGetMaxControllers = resolve<SixenseBaseFunction>("sixenseGetMaxControllers");
|
||||||
|
return sixenseGetMaxControllers();
|
||||||
|
}
|
||||||
|
|
||||||
|
int sixenseIsControllerEnabled(int input) {
|
||||||
|
auto sixenseIsControllerEnabled = resolve<SixenseTakeIntFunction>("sixenseIsControllerEnabled");
|
||||||
|
return sixenseIsControllerEnabled(input);
|
||||||
|
}
|
||||||
|
|
||||||
|
int sixenseGetNewestData(int input1, sixenseControllerData* intput2) {
|
||||||
|
auto sixenseGetNewestData = resolve<SixenseTakeIntAndSixenseControllerData>("sixenseGetNewestData");
|
||||||
|
return sixenseGetNewestData(input1, intput2);
|
||||||
|
}
|
||||||
|
#endif
|
Loading…
Reference in a new issue