ACE3/addons/spectator/functions/fnc_handleCamera.sqf
2015-07-15 12:23:25 +01:00

53 lines
1.8 KiB
Plaintext

#include "script_component.hpp"
// Don't recreate the PFH
if !(isNil QGVAR(camPFH)) exitWith {};
// Constantly handle camera manipulation
GVAR(camPFH) = [
{
// Kill PFH when display is closed
if (isNull (GETUVAR(GVAR(display),displayNull))) exitWith { [_this select 1] call CBA_fnc_removePerFrameHandler; GVAR(camPFH) = nil; };
// Different behaviour based on camera mode
switch (GVAR(camMode)) do {
case 0: { // Free
_oldPos = getPosASL GVAR(camera);
_mX = 0;
_mY = 0;
_mZ = 0;
if (GVAR(camDolly) select 0) then { // Forward
_mY = _mY + GVAR(camSpeed);
};
if (GVAR(camDolly) select 1) then { // Backward
_mY = _mY - GVAR(camSpeed);
};
if (GVAR(camDolly) select 2) then { // Left
_mX = _mX - GVAR(camSpeed);
};
if (GVAR(camDolly) select 3) then { // Right
_mX = _mX + GVAR(camSpeed);
};
if (GVAR(camBoom) select 0) then { // Up
_mZ = _mZ + 0.5;
};
if (GVAR(camBoom) select 1) then { // Down
_mZ = _mZ - 0.5;
};
_pan = (GVAR(camPan) + 360) % 360;
_x = (_oldPos select 0) + (_mX * cos(_pan)) + (_mY * sin(_pan));
_y = (_oldPos select 1) - (_mX * sin(_pan)) + (_mY * cos(_pan));
_z = (_oldPos select 2) + _mZ;
// Prevent camera going under terrain
GVAR(camPos) = [_x,_y,_z max (getTerrainHeightASL [_x,_y])];
// Update camera position and rotation
GVAR(camera) setPosASL GVAR(camPos);
GVAR(camera) setDir GVAR(camPan);
[GVAR(camera), GVAR(camTilt), GVAR(camBank)] call BIS_fnc_setPitchBank;
};
};
}, 0] call CBA_fnc_addPerFrameHandler;