mirror of
https://github.com/acemod/ACE3.git
synced 2024-08-30 18:23:18 +00:00
145 lines
5.4 KiB
Plaintext
145 lines
5.4 KiB
Plaintext
|
#include "script_component.hpp"
|
||
|
/*
|
||
|
* Author: PabstMirror
|
||
|
* Draw3D event handler when scope is active
|
||
|
*
|
||
|
* Arguments:
|
||
|
* None (implicit vars from missionEventHandler)
|
||
|
*
|
||
|
* Return Value:
|
||
|
* None
|
||
|
*
|
||
|
* Example:
|
||
|
* [] call ace_xm157_fnc_weaponInfo_draw
|
||
|
*
|
||
|
* Public: No
|
||
|
*/
|
||
|
|
||
|
//IGNORE_PRIVATE_WARNING ["_thisArgs", "_thisEventHandler"]; // from missionEventHandler
|
||
|
_thisArgs params ["_display"];
|
||
|
if (isNull _display) exitWith {
|
||
|
TRACE_1("cleaning up display",_thisEventHandler);
|
||
|
GVAR(shown) = false;
|
||
|
removeMissionEventHandler ["Draw3D", _thisEventHandler];
|
||
|
};
|
||
|
private _ctrlScopeObject = _display displayCtrl IDC_SCOPE_OBJECT;
|
||
|
private _ctrlScreenObject = _display displayCtrl IDC_SCREEN_OBJECT;
|
||
|
|
||
|
|
||
|
// Hide everything when not in scope
|
||
|
private _isUsingOptic = ctrlShown (_display displayCtrl 154);
|
||
|
if (!_isUsingOptic) exitWith {
|
||
|
_ctrlScopeObject ctrlShow false;
|
||
|
_ctrlScreenObject ctrlShow false;
|
||
|
};
|
||
|
_ctrlScopeObject ctrlShow true;
|
||
|
_ctrlScreenObject ctrlShow true;
|
||
|
BEGIN_COUNTER(draw);
|
||
|
|
||
|
// Get common info
|
||
|
private _weaponVec = ace_player weaponDirection currentWeapon ace_player;
|
||
|
(_weaponVec call CBA_fnc_vect2Polar) params ["", "_weaponDir", "_weaponPitch"];
|
||
|
private _weaponBank = call cba_optics_fnc_gunBank;
|
||
|
private _viewBank = _weaponBank;
|
||
|
if (isWeaponDeployed [player, true]) then { // prone deploy tilting is special (screen doesn't tilt, but player does)
|
||
|
_weaponBank = (((vectorUp ace_player) vectorCrossProduct _weaponVec) call CBA_fnc_vect2Polar) # 2; // I think this is right?
|
||
|
};
|
||
|
|
||
|
(0.25 call CBA_fnc_getFov) params ["_fov", "_zoom"];
|
||
|
private _fovMRAD = 1000 * _fov; // Real MRAD (not mils)
|
||
|
private _nonMagnified = _zoom < 1.1;
|
||
|
private _range = GVAR(data) getOrDefault ["range", 0];
|
||
|
private _needsUpdate = GVAR(data) getOrDefault ["menu_updated", true]; // Updated when a menu item changed
|
||
|
private _timeSinceLastInput = CBA_missionTime - (GVAR(data) getOrDefault ["lastInputTime", 0]);
|
||
|
|
||
|
|
||
|
// Bank-tilt display objects
|
||
|
_ctrlScopeObject ctrlSetModelDirAndUp [[0,1,0],[sin _viewBank,0,cos _viewBank]];
|
||
|
_ctrlScreenObject ctrlSetModelDirAndUp [[0,1,0],[sin _viewBank,0,cos _viewBank]];
|
||
|
|
||
|
|
||
|
// Scope - Handle etched reticle
|
||
|
private _retTex = QPATHTOF(data\mrad_10_ca.paa);
|
||
|
private _retScale = 4096/10; // texureResolution / (px/MRAD)
|
||
|
switch (true) do {
|
||
|
case (_fovMRAD < 4096/40): {
|
||
|
_retTex = QPATHTOF(data\mrad_40_ca.paa);
|
||
|
_retScale = 4096/40;
|
||
|
};
|
||
|
case (_fovMRAD < 4096/20): {
|
||
|
_retTex = QPATHTOF(data\mrad_20_ca.paa);
|
||
|
_retScale = 4096/20;
|
||
|
};
|
||
|
};
|
||
|
private _scale = 1 / (getResolution # 5);
|
||
|
_scale = 2 * _scale * _retScale / _fovMRAD;
|
||
|
_ctrlScopeObject ctrlSetModelScale _scale;
|
||
|
private _ctrlScopeReticle = _display displayCtrl IDC_SCOPE_RETICLE;
|
||
|
if (_retTex != ctrlText _ctrlScopeReticle) then { _ctrlScopeReticle ctrlSetText _retTex; };
|
||
|
|
||
|
|
||
|
// Screen - Draw menu
|
||
|
[_display, _needsUpdate] call FUNC(weaponInfo_drawMenu);
|
||
|
|
||
|
|
||
|
// Screen - Show range info
|
||
|
private _rangeInfo = _range call {
|
||
|
if (_range == 0) exitWith { "" };
|
||
|
if (_range < 0) exitWith { // range error - blink if recent
|
||
|
if ((_timeSinceLastInput < 3) && {(floor (4*_timeSinceLastInput)) % 2 == 1}) then { "----" } else { "" };
|
||
|
};
|
||
|
format ["%1 m", _range toFixed 0]
|
||
|
};
|
||
|
private _ctrl = _display displayCtrl IDC_SCREEN_TEXT_UPPER_RIGHT;
|
||
|
_ctrl ctrlSetText _rangeInfo;
|
||
|
|
||
|
|
||
|
// Screen - Show bearing info
|
||
|
private _bearingInfo = call {
|
||
|
private _bearingSetting = GVAR(data) getOrDefault ["bearing_show", 0];
|
||
|
if ((_bearingSetting == 2) && {_timeSinceLastInput > 2}) exitWith { "" };
|
||
|
if ((_bearingSetting == 1)) exitWith { format ["%1", floor (17.777777 * _weaponDir)]; }; // (6400 Mils, not MRAD)
|
||
|
format ["%1°", floor _weaponDir];
|
||
|
};
|
||
|
private _ctrl = _display displayCtrl IDC_SCREEN_TEXT_UPPER_LEFT;
|
||
|
_ctrl ctrlSetText _bearingInfo;
|
||
|
|
||
|
|
||
|
// Screen - update reticle type based on settings and zoom level
|
||
|
private _ctrl = _display displayCtrl IDC_SCREEN_RETICLE;
|
||
|
private _lastMagnified = GVAR(data) getOrDefault ["reticle_cache_lastMag", true];
|
||
|
private _size = GVAR(data) getOrDefault ["reticle_cache_size", 1];
|
||
|
if (_needsUpdate || {_nonMagnified isNotEqualTo _lastMagnified}) then {
|
||
|
private _tex = "";
|
||
|
if (_nonMagnified) then {
|
||
|
switch (GVAR(data) getOrDefault ["reticle_cqb", 0]) do {
|
||
|
case (0): { _tex = "\a3\weapons_f\acc\data\collimdot_dot_red_ca.paa"; _size = 1; };
|
||
|
case (1): { _tex = "\a3\weapons_f\acc\data\collimdot_dot_red_ca.paa"; _size = 2; };
|
||
|
case (2): { _tex = "\a3\weapons_f\acc\data\collimdot_circle_red_ca.paa"; _size = 1; };
|
||
|
case (3): { _tex = "\a3\weapons_f\acc\data\collimdot_dot_green_ca.paa"; _size = 1; };
|
||
|
case (4): { _size = 0; };
|
||
|
};
|
||
|
} else {
|
||
|
_tex = "\a3\weapons_f\acc\data\collimdot_dot_red_ca.paa"; _size = 1;
|
||
|
};
|
||
|
_ctrl ctrlSetText _tex;
|
||
|
GVAR(data) set ["reticle_cache_lastMag", _nonMagnified];
|
||
|
GVAR(data) set ["reticle_cache_size", _size];
|
||
|
};
|
||
|
|
||
|
|
||
|
// Screen - update reticle position based on ballistics computer
|
||
|
if (_range > 0 && {_size > 0}) then {
|
||
|
BEGIN_COUNTER(ballistics_calculator);
|
||
|
([_range, _weaponDir, _weaponPitch, _weaponBank] call FUNC(ballistics_calculator)) params ["_elevMRAD", "_windMRAD"];
|
||
|
END_COUNTER(ballistics_calculator);
|
||
|
_ctrl ctrlSetPosition [-_windMRAD / _fovMRAD + 0.5 - _size / 2, + 4/3 * (_elevMRAD / _fovMRAD + 0.5 - _size/2), _size, _size*4/3];
|
||
|
_ctrl ctrlCommit 0;
|
||
|
} else {
|
||
|
_ctrl ctrlSetPosition [0.5 - _size / 2, + 4/3 * (0.5 - _size/2), _size, _size*4/3];
|
||
|
_ctrl ctrlCommit 0;
|
||
|
};
|
||
|
|
||
|
|
||
|
END_COUNTER(draw);
|