1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
|
#include "headtracking/headtracking.h"
#include "headtracking/headtracking_internal.h"
#ifdef WIN32
#include "headtracking/trackir.h"
#include "headtracking/freetrack.h"
#endif
#include <memory>
namespace headtracking
{
std::unique_ptr<internal::HeadTrackingProvider> currentProvider = nullptr;
HeadTrackingStatus status;
template<class Provider>
std::unique_ptr<internal::HeadTrackingProvider> initProvider()
{
std::unique_ptr<internal::HeadTrackingProvider> provider;
try
{
provider.reset(new Provider());
mprintf((" Successfully initialized '%s'\n", Provider::getName().c_str() ));
return provider;
}
catch(const internal::HeadTrackingException& e)
{
mprintf((" Failed to initialize '%s': %s.\n", Provider::getName().c_str(), e.what() ));
return nullptr;
}
}
bool init()
{
mprintf(("Initializing head tracking...\n"));
#ifdef WIN32
auto tir = initProvider<trackir::TrackIRProvider>();
if (tir)
{
currentProvider = std::move(tir);
return true;
}
auto freetrack = initProvider<freetrack::FreeTrackProvider>();
if (freetrack)
{
currentProvider = std::move(freetrack);
return true;
}
#endif
mprintf((" No supported provider found, headtracking will be disabled...\n"));
return false;
}
bool isEnabled()
{
return currentProvider != nullptr;
}
bool query()
{
if (currentProvider == nullptr)
{
return false;
}
return currentProvider->query(&status);
}
HeadTrackingStatus* getStatus()
{
return &status;
}
void shutdown()
{
currentProvider.reset();
}
}
|