//-------------------------------------------------------------------------------------
// Stereo3DMatrixHelper.h -- SIMD C++ Math helper for Stereo 3D matrices
//
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
//-------------------------------------------------------------------------------------

#pragma once

#include "DirectXMath.h"

namespace DirectX
{
    // Enumeration for stereo channels (left and right).
    enum STEREO_CHANNEL
    {
        STEREO_CHANNEL_LEFT = 0,
        STEREO_CHANNEL_RIGHT
    };

    // Enumeration for stereo mode (normal or inverted).
    enum STEREO_MODE
    {
        STEREO_MODE_NORMAL = 0,
        STEREO_MODE_INVERTED,
    };

    //------------------------------------------------------------------------------
    //
    // Stereo calibration settings
    //
    // * Viewer distance to the display
    // * Physical display size
    // * Render resolution
    //
    // The stereo separation factor indicates how much separation is between the left and right
    // eyes.  0 is no separation, 1 is full separation. It defaults to 1.0.
    //
    // The debug stereo exaggeration factor indicates how much to increase the interocular spacing and
    // maximum acuity angle from comfortable defaults.  For retail builds, this value should always
    // be 1.0, but during development, on small screens, this value can be raised to up to 2.0 in
    // order to exaggerate the 3D effect.  Values over 1.0 may cause discomfort on normal sized
    // displays. It defaults to 1.0.
    // 
    struct STEREO_PARAMETERS
    {
        float fViewerDistanceInches;
        float fDisplaySizeInches;
        float fPixelResolutionWidth;
        float fPixelResolutionHeight;
        float fStereoSeparationFactor;
        float fStereoExaggerationFactor;
    };

    void StereoCreateDefaultParameters(STEREO_PARAMETERS& stereoParameters);

    XMMATRIX StereoProjectionFovLH(_In_opt_ const STEREO_PARAMETERS* pStereoParameters,
        STEREO_CHANNEL Channel, float FovAngleY, float AspectRatio, float NearZ, float FarZ,
        STEREO_MODE StereoMode = STEREO_MODE_NORMAL);

    XMMATRIX StereoProjectionFovRH(_In_opt_ const STEREO_PARAMETERS* pStereoParameters,
        STEREO_CHANNEL Channel, float FovAngleY, float AspectRatio, float NearZ, float FarZ,
        STEREO_MODE StereoMode = STEREO_MODE_NORMAL);
}