/*
**  Copyright (C) 1999 Microsoft Corporation. All Rights Reserved.
**
**  File:	setcontrolconstraintsaction.cpp
**
**  Author:  
**
**  Description:
**      Implementation of the training library "setcontrolconstraintsaction" interface.
**
**  History:
*/
#include    "pch.h"
#include    "SetControlConstraintsAction.h"

namespace Training
{
    //------------------------------------------------------------------------------
    // global variabes
    //------------------------------------------------------------------------------
    extern  ControlData g_allowableControlScalars;  // yaw, pitch, roll, throttle
    extern  int         g_iAllowableActionMask;

    //------------------------------------------------------------------------------
    // class methods
    //------------------------------------------------------------------------------
    /* void */  SetControlConstraintsAction::SetControlConstraintsAction (void)
    {
        // assign default values to the control masks
        m_inputControls.jsValues[c_axisYaw] = NA;
        m_inputControls.jsValues[c_axisPitch] = NA;
        m_inputControls.jsValues[c_axisRoll] = NA;
        m_inputControls.jsValues[c_axisThrottle] = NA;

        m_iEnableActionsMask = 0;
        m_iDisableActionsMask = 0;
    }

    //------------------------------------------------------------------------------
    /* void */  SetControlConstraintsAction::~SetControlConstraintsAction (void)
    {
    }

    //------------------------------------------------------------------------------
    void        SetControlConstraintsAction::Execute (void)
    {
        // Set the control values
        if (m_inputControls.jsValues[c_axisYaw] != NA)
            g_allowableControlScalars.jsValues[c_axisYaw] = m_inputControls.jsValues[c_axisYaw];
        if (m_inputControls.jsValues[c_axisPitch] != NA)
            g_allowableControlScalars.jsValues[c_axisPitch] = m_inputControls.jsValues[c_axisPitch];
        if (m_inputControls.jsValues[c_axisRoll] != NA)
            g_allowableControlScalars.jsValues[c_axisRoll] = m_inputControls.jsValues[c_axisRoll];
        if (m_inputControls.jsValues[c_axisThrottle] != NA)
            g_allowableControlScalars.jsValues[c_axisThrottle] = m_inputControls.jsValues[c_axisThrottle];

        // Set the disabled control masks
        for (int i = 0; i < 32; i++)
        {
            int action = m_iDisableActionsMask & (1 << i);
            if (g_iAllowableActionMask & action)
                g_iAllowableActionMask ^= action;
        }
        
        // Set the enabled control masks
        g_iAllowableActionMask |= m_iEnableActionsMask;
    }

    //------------------------------------------------------------------------------
    void        SetControlConstraintsAction::EnableInputAction (int iInputAction)
    {
        m_iEnableActionsMask |= iInputAction;
        for (int i = 0; i < 32; i++)
        {
            int action = m_iDisableActionsMask & (1 << i);
            if (iInputAction & action)
                m_iDisableActionsMask ^= action;
        }
    }

    //------------------------------------------------------------------------------
    void        SetControlConstraintsAction::DisableInputAction (int iInputAction)
    {
        m_iDisableActionsMask |= iInputAction;
        for (int i = 0; i < 32; i++)
        {
            int action = m_iEnableActionsMask & (1 << i);
            if (iInputAction & action)
                m_iEnableActionsMask ^= action;
        }
    }

    //------------------------------------------------------------------------------
    void        SetControlConstraintsAction::ScaleInputControl (Axis axis, float fScalar)
    {
        m_inputControls.jsValues[axis] = fScalar;
    }

    //------------------------------------------------------------------------------
}