#include "script_component.hpp"
/*
 * Author: Nelson Duarte, AACO, SilentSpike
 * Function used to perform camera ticks
 *
 * Updates camera position in follow mode
 * Updates camera focus if current focus becomes null (in unit modes)
 * Updates camera when focus enters/exits a vehicle
 * Updates camera lights position
 *
 * Arguments:
 * None
 *
 * Return Value:
 * None
 *
 * Example:
 * addMissionEventHandler ["EachFrame", {call ace_spectator_fnc_cam_tick}]
 *
 * Public: No
 */

BEGIN_COUNTER(camTick);
private _cameraMode = GVAR(camMode);
private _camTarget = GVAR(camFocus);

// UI mouse handler makes use of delta time between camera ticks
private _currentTime = diag_tickTime;
GVAR(camDeltaTime) = _currentTime - GVAR(camLastTickTime);
GVAR(camLastTickTime) = _currentTime;


// If no focus in unit camera modes try to find a new one
if (_cameraMode != MODE_FREE) then {
    private _focus = if (isNull _camTarget) then {
        private _testFocus = ([] call FUNC(getTargetEntities)) select 0;
        if (isNil "_testFocus") then {
            objNull
        } else {
            _testFocus
        }
    } else {
        _camTarget
    };

    // If new focus was found then switch to it
    if (!isNull _focus && {_focus != _camTarget}) then {
        [_focus] call FUNC(setFocus);
    };

    // Update the follow camera position
    if (!isNull _focus && {_cameraMode == MODE_FOLLOW}) then {
        [_focus] call FUNC(cam_prepareTarget);
    };
};

// Refresh the local variable
_camTarget = GVAR(camFocus);

// Focus get in / out of vehicle state
if !(isNull _camTarget) then {
    private _targetInVeh = GVAR(camTargetInVehicle);

    if (GVAR(camHasTarget)) then {
        if (!_targetInVeh && { vehicle _camTarget != _camTarget }) then {
            [_camTarget] call FUNC(cam_setTarget);
            GVAR(camTargetInVehicle) = true;
        };

        if (_targetInVeh && { vehicle _camTarget == _camTarget }) then {
            [_camTarget] call FUNC(cam_setTarget);
            GVAR(camTargetInVehicle) = false;
        };
    };
} else {
    GVAR(camTargetInVehicle) = false;
};

// Camera lights
if (count GVAR(camLights) > 1) then {
    (GVAR(camLights) select 1) setPosASL (AGLToASL (screenToWorld getMousePosition));
};
END_COUNTER(camTick);