Import osgXR from https://github.com/amalon/osgXR master branch into 3rdparty, specifically commit b7e222775553b529018ac4b847353327c24ae5d4, which is 0.3.7 with tweaks for building as a subproject in a subdirectory. This will allow VR support to be more conveniently built if not already installed, without having to fetch yet another dependency.
191 lines
3.7 KiB
C++
191 lines
3.7 KiB
C++
// SPDX-License-Identifier: LGPL-2.1-only
|
|
// Copyright (C) 2021 James Hogan <james@albanarts.com>
|
|
|
|
#include <osgXR/Manager>
|
|
#include <osgXR/Mirror>
|
|
|
|
#include "XRState.h"
|
|
#include "XRRealizeOperation.h"
|
|
|
|
using namespace osgXR;
|
|
|
|
Manager::Manager() :
|
|
_settings(Settings::instance()),
|
|
_destroying(false),
|
|
_state(new XRState(_settings, const_cast<Manager *>(this)))
|
|
{
|
|
}
|
|
|
|
Manager::~Manager()
|
|
{
|
|
}
|
|
|
|
void Manager::setVisibilityMaskNodeMasks(osg::Node::NodeMask left,
|
|
osg::Node::NodeMask right) const
|
|
{
|
|
_state->setVisibilityMaskNodeMasks(left, right);
|
|
}
|
|
|
|
void Manager::configure(osgViewer::View &view) const
|
|
{
|
|
osgViewer::ViewerBase *viewer = _viewer;
|
|
if (!viewer)
|
|
viewer = dynamic_cast<osgViewer::ViewerBase *>(&view);
|
|
if (!viewer)
|
|
return;
|
|
|
|
_state->setViewer(viewer);
|
|
|
|
// Its rather inconvenient that ViewConfig expects a const configure()
|
|
// Just cheat and cast away the constness here
|
|
osg::ref_ptr<XRRealizeOperation> realizeOp = new XRRealizeOperation(_state, &view);
|
|
viewer->setRealizeOperation(realizeOp);
|
|
if (viewer->isRealized())
|
|
{
|
|
osgViewer::ViewerBase::Contexts contexts;
|
|
viewer->getContexts(contexts, true);
|
|
if (contexts.size() > 0)
|
|
(*realizeOp)(contexts[0]);
|
|
}
|
|
}
|
|
|
|
void Manager::update()
|
|
{
|
|
_state->update();
|
|
}
|
|
|
|
bool Manager::checkAndResetStateChanged()
|
|
{
|
|
return _state->checkAndResetStateChanged();
|
|
}
|
|
|
|
bool Manager::getPresent() const
|
|
{
|
|
return _state->getUpState() >= XRState::VRSTATE_SYSTEM;
|
|
}
|
|
|
|
bool Manager::getEnabled() const
|
|
{
|
|
return _state->getUpState() == XRState::VRSTATE_ACTIONS;
|
|
}
|
|
|
|
void Manager::setEnabled(bool enabled)
|
|
{
|
|
// Avoid needlessly discarding of the instance
|
|
// SteamVR 1.15 and 1.16 have issues with xrDestroySession() hanging
|
|
if (enabled)
|
|
{
|
|
_destroying = false;
|
|
_state->setProbing(true);
|
|
}
|
|
else if (_destroying)
|
|
{
|
|
_state->setProbing(false);
|
|
}
|
|
|
|
_state->setDestState(enabled ? XRState::VRSTATE_ACTIONS
|
|
: _state->getProbingState());
|
|
}
|
|
|
|
void Manager::destroyAndWait()
|
|
{
|
|
_destroying = true;
|
|
setEnabled(false);
|
|
while (_state->isStateUpdateNeeded())
|
|
_state->update();
|
|
}
|
|
|
|
bool Manager::isDestroying() const
|
|
{
|
|
return _destroying;
|
|
}
|
|
|
|
bool Manager::isRunning() const
|
|
{
|
|
return _state->isRunning();
|
|
}
|
|
|
|
void Manager::syncSettings()
|
|
{
|
|
_state->syncSettings();
|
|
}
|
|
|
|
void Manager::syncActionSetup()
|
|
{
|
|
_state->syncActionSetup();
|
|
}
|
|
|
|
bool Manager::hasValidationLayer() const
|
|
{
|
|
return _state->hasValidationLayer();
|
|
}
|
|
|
|
bool Manager::hasDepthInfoExtension() const
|
|
{
|
|
return _state->hasDepthInfoExtension();
|
|
}
|
|
|
|
bool Manager::hasVisibilityMaskExtension() const
|
|
{
|
|
return _state->hasVisibilityMaskExtension();
|
|
}
|
|
|
|
const char *Manager::getRuntimeName() const
|
|
{
|
|
return _state->getRuntimeName();
|
|
}
|
|
|
|
const char *Manager::getSystemName() const
|
|
{
|
|
return _state->getSystemName();
|
|
}
|
|
|
|
const char *Manager::getStateString() const
|
|
{
|
|
return _state->getStateString();
|
|
}
|
|
|
|
void Manager::onRunning()
|
|
{
|
|
}
|
|
|
|
void Manager::onStopped()
|
|
{
|
|
}
|
|
|
|
void Manager::onFocus()
|
|
{
|
|
}
|
|
|
|
void Manager::onUnfocus()
|
|
{
|
|
}
|
|
|
|
void Manager::addMirror(Mirror *mirror)
|
|
{
|
|
if (!_state->valid())
|
|
{
|
|
// handle this later, _state may not be created yet
|
|
_mirrorQueue.push_back(mirror);
|
|
}
|
|
else
|
|
{
|
|
// init the mirror right away
|
|
mirror->_init();
|
|
}
|
|
}
|
|
|
|
void Manager::setupMirrorCamera(osg::Camera *camera)
|
|
{
|
|
addMirror(new Mirror(this, camera));
|
|
}
|
|
|
|
void Manager::_setupMirrors()
|
|
{
|
|
// init each mirror in the queue
|
|
while (!_mirrorQueue.empty())
|
|
{
|
|
_mirrorQueue.front()->_init();
|
|
_mirrorQueue.pop_front();
|
|
}
|
|
}
|