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

126 lines
2.5 KiB
C++

// SPDX-License-Identifier: LGPL-2.1-only
// Copyright (C) 2022 James Hogan <james@albanarts.com>
#include "CompositionLayer.h"
#include "XRState.h"
using namespace osgXR;
// Internal API
CompositionLayer::Private::Private(XRState *state) :
_state(state),
_visible(true),
_order(1), // in front of perspective layer
_alphaMode(BLEND_NONE)
{
state->addCompositionLayer(this);
}
CompositionLayer::Private::~Private()
{
XRState *state = _state.get();
if (state)
state->removeCompositionLayer(this);
}
void CompositionLayer::Private::setVisible(bool visible)
{
_visible = visible;
}
bool CompositionLayer::Private::getVisible() const
{
return _visible;
}
void CompositionLayer::Private::setOrder(int order)
{
_order = order;
// FIXME reorder
}
int CompositionLayer::Private::getOrder() const
{
return _order;
}
void CompositionLayer::Private::setAlphaMode(AlphaMode mode)
{
_alphaMode = mode;
}
CompositionLayer::AlphaMode CompositionLayer::Private::getAlphaMode() const
{
return _alphaMode;
}
bool CompositionLayer::Private::writeCompositionLayer(OpenXR::Session *session,
OpenXR::CompositionLayer *layer,
bool disableAlpha) const
{
if (!_visible)
return false;
XrCompositionLayerFlags flags = 0;
AlphaMode alphaMode = disableAlpha ? BLEND_NONE : _alphaMode;
switch (alphaMode)
{
case BLEND_NONE:
break;
case BLEND_ALPHA_PREMULT:
flags |= XR_COMPOSITION_LAYER_BLEND_TEXTURE_SOURCE_ALPHA_BIT;
break;
case BLEND_ALPHA_UNPREMULT:
flags |= XR_COMPOSITION_LAYER_BLEND_TEXTURE_SOURCE_ALPHA_BIT |
XR_COMPOSITION_LAYER_UNPREMULTIPLIED_ALPHA_BIT;
break;
}
layer->setLayerFlags(flags);
layer->setSpace(session->getLocalSpace());
return true;
}
// Public API
CompositionLayer::CompositionLayer(Private *priv) :
_private(priv)
{
}
CompositionLayer::~CompositionLayer()
{
}
void CompositionLayer::setVisible(bool visible)
{
_private->setVisible(visible);
}
bool CompositionLayer::getVisible() const
{
return _private->getVisible();
}
void CompositionLayer::setOrder(int order)
{
_private->setOrder(order);
}
int CompositionLayer::getOrder() const
{
return _private->getOrder();
}
void CompositionLayer::setAlphaMode(AlphaMode mode)
{
_private->setAlphaMode(mode);
}
CompositionLayer::AlphaMode CompositionLayer::getAlphaMode() const
{
return _private->getAlphaMode();
}