Files
flightgear/3rdparty/osgXR/src/InteractionProfile.cpp
2022-10-20 20:29:11 +08:00

107 lines
2.6 KiB
C++

// SPDX-License-Identifier: LGPL-2.1-only
// Copyright (C) 2021 James Hogan <james@albanarts.com>
#include "Action.h"
#include "InteractionProfile.h"
#include "OpenXR/InteractionProfile.h"
#include "OpenXR/Path.h"
#include "OpenXR/Session.h"
#include <osgXR/Manager>
#include "XRState.h"
using namespace osgXR;
// Internal API
InteractionProfile::Private::Private(InteractionProfile *pub,
XRState *state,
const std::string &vendor,
const std::string &type) :
_pub(pub),
_state(state),
_vendor(vendor),
_type(type),
_updated(true)
{
state->addInteractionProfile(this);
}
InteractionProfile::Private::~Private()
{
XRState *state = _state.get();
if (state)
state->removeInteractionProfile(this);
}
void InteractionProfile::Private::suggestBinding(Action *action,
const std::string &binding)
{
_bindings.push_back({action, binding});
_updated = true;
}
bool InteractionProfile::Private::setup(OpenXR::Instance *instance)
{
// Recreate every time, as actions may have been altered and recreated
_profile = new OpenXR::InteractionProfile(instance, _vendor.c_str(),
_type.c_str());
for (Binding &binding: _bindings)
{
// ensure action is set up
OpenXR::Action *action = Action::Private::get(binding.action)->setup(instance);
if (action)
_profile->addBinding(action, binding.binding);
}
bool ret = _profile->suggestBindings();
if (ret)
_updated = false;
return ret;
}
void InteractionProfile::Private::cleanupInstance()
{
_profile = nullptr;
}
OpenXR::Path InteractionProfile::Private::getPath() const
{
if (_profile.valid())
return _profile->getPath();
else
return OpenXR::Path();
}
// Public API
InteractionProfile::InteractionProfile(Manager *manager,
const std::string &vendor,
const std::string &type) :
_private(new Private(this, manager->_getXrState(), vendor, type))
{
}
InteractionProfile::~InteractionProfile()
{
}
const std::string &InteractionProfile::getVendor() const
{
return _private->getVendor();
}
const std::string &InteractionProfile::getType() const
{
return _private->getType();
}
void InteractionProfile::suggestBinding(Action *action,
const std::string &binding)
{
_private->suggestBinding(action, binding);
}