// SPDX-License-Identifier: LGPL-2.1-only
// Copyright (C) 2021 James Hogan <james@albanarts.com>

#include <osgXR/Settings>

#include <openxr/openxr.h>

#include "OpenXR/Instance.h"

using namespace osgXR;

Settings::Settings() :
    _appName("osgXR"),
    _appVersion(1),
    _validationLayer(false),
    _depthInfo(false),
    _visibilityMask(true),
    _formFactor(HEAD_MOUNTED_DISPLAY),
    _preferredEnvBlendModeMask(0),
    _allowedEnvBlendModeMask(0),
    _preferredVRModeMask(0),
    _allowedVRModeMask(0),
    _preferredSwapchainModeMask(0),
    _allowedSwapchainModeMask(0),
    _viewAlignmentMask(0),
    _preferredRGBEncodingMask(0),
    _allowedRGBEncodingMask(0),
    _preferredDepthEncodingMask(0),
    _allowedDepthEncodingMask(0),
    _rgbBits(-1),
    _alphaBits(-1),
    _depthBits(-1),
    _stencilBits(-1),
    _unitsPerMeter(1.0f)
{
}

Settings::~Settings()
{
}

Settings *Settings::instance()
{
    static osg::ref_ptr<Settings> settings = new Settings();
    return settings;
}

unsigned int Settings::_diff(const Settings &other) const
{
    unsigned int ret = DIFF_NONE;
    if (_appName != other._appName ||
        _appVersion != other._appVersion)
        ret |= DIFF_APP_INFO;
    if (_validationLayer != other._validationLayer)
        ret |= DIFF_VALIDATION_LAYER;
    if (_depthInfo != other._depthInfo)
        ret |= DIFF_DEPTH_INFO;
    if (_visibilityMask != other._visibilityMask)
        ret |= DIFF_VISIBILITY_MASK;
    if (_formFactor != other._formFactor)
        ret |= DIFF_FORM_FACTOR;
    if (_preferredEnvBlendModeMask != other._preferredEnvBlendModeMask ||
        _allowedEnvBlendModeMask != other._allowedEnvBlendModeMask)
        ret |= DIFF_BLEND_MODE;
    if (_preferredVRModeMask != other._preferredVRModeMask ||
        _allowedVRModeMask != other._allowedVRModeMask)
        ret |= DIFF_VR_MODE;
    if (_preferredSwapchainModeMask != other._preferredSwapchainModeMask ||
        _allowedSwapchainModeMask != other._allowedSwapchainModeMask)
        ret |= DIFF_SWAPCHAIN_MODE;
    if (_viewAlignmentMask != other._viewAlignmentMask)
        ret |= DIFF_VIEW_ALIGN_MASK;
    if (_preferredRGBEncodingMask != other._preferredRGBEncodingMask ||
        _allowedRGBEncodingMask != other._allowedRGBEncodingMask)
        ret |= DIFF_RGB_ENCODING;
    if (_preferredDepthEncodingMask != other._preferredDepthEncodingMask ||
        _allowedDepthEncodingMask != other._allowedDepthEncodingMask)
        ret |= DIFF_DEPTH_ENCODING;
    if (_rgbBits != other._rgbBits)
        ret |= DIFF_RGB_BITS;
    if (_alphaBits != other._alphaBits)
        ret |= DIFF_ALPHA_BITS;
    if (_depthBits != other._depthBits)
        ret |= DIFF_DEPTH_BITS;
    if (_stencilBits != other._stencilBits)
        ret |= DIFF_STENCIL_BITS;
    if (_mirrorSettings != other._mirrorSettings)
        ret |= DIFF_MIRROR;
    if (_unitsPerMeter != other._unitsPerMeter)
        ret |= DIFF_SCALE;
    return ret;
}
