mirror of
https://github.com/acemod/ACE3.git
synced 2024-08-30 18:23:18 +00:00
Merge pull request #580 from acemod/seeker_fov
Seeker FOV check optimizations
This commit is contained in:
commit
0ae27d16c5
@ -4,7 +4,7 @@ TRACE_1("enter", _this);
|
|||||||
|
|
||||||
#define __TRACKINTERVAL 0 // how frequent the check should be.
|
#define __TRACKINTERVAL 0 // how frequent the check should be.
|
||||||
#define __LOCKONTIME 3 // Lock on won't occur sooner
|
#define __LOCKONTIME 3 // Lock on won't occur sooner
|
||||||
#define __LOCKONTIMERANDOM 2 // Deviation in lock on time
|
|
||||||
|
|
||||||
#define __OffsetX ((ctrlPosition __JavelinIGUITargetingLineV) select 0) - 0.5
|
#define __OffsetX ((ctrlPosition __JavelinIGUITargetingLineV) select 0) - 0.5
|
||||||
#define __OffsetY ((ctrlPosition __JavelinIGUITargetingLineH) select 1) - 0.5
|
#define __OffsetY ((ctrlPosition __JavelinIGUITargetingLineH) select 1) - 0.5
|
||||||
@ -39,6 +39,7 @@ _currentTarget = _args select 1;
|
|||||||
_runTime = _args select 2;
|
_runTime = _args select 2;
|
||||||
_lockTime = _args select 3;
|
_lockTime = _args select 3;
|
||||||
_soundTime = _args select 4;
|
_soundTime = _args select 4;
|
||||||
|
_randomLockInterval = _args select 5;
|
||||||
|
|
||||||
// Find a target within the optic range
|
// Find a target within the optic range
|
||||||
_newTarget = objNull;
|
_newTarget = objNull;
|
||||||
@ -135,7 +136,7 @@ if (isNull _newTarget) then {
|
|||||||
|
|
||||||
playSound "ACE_Javelin_Locking";
|
playSound "ACE_Javelin_Locking";
|
||||||
} else {
|
} else {
|
||||||
if(diag_tickTime - _lockTime > __LOCKONTIME + (random __LOCKONTIMERANDOM)) then {
|
if(diag_tickTime - _lockTime > __LOCKONTIME + _randomLockInterval) then {
|
||||||
TRACE_2("LOCKED!", _currentTarget, _lockTime);
|
TRACE_2("LOCKED!", _currentTarget, _lockTime);
|
||||||
|
|
||||||
__JavelinIGUISeek ctrlSetTextColor __ColorGreen;
|
__JavelinIGUISeek ctrlSetTextColor __ColorGreen;
|
||||||
|
@ -2,6 +2,8 @@
|
|||||||
#include "script_component.hpp"
|
#include "script_component.hpp"
|
||||||
TRACE_1("enter", _this);
|
TRACE_1("enter", _this);
|
||||||
|
|
||||||
|
#define __LOCKONTIMERANDOM 2 // Deviation in lock on time
|
||||||
|
|
||||||
if((count _this) > 0) then {
|
if((count _this) > 0) then {
|
||||||
uiNameSpace setVariable ['ACE_RscOptics_javelin',_this select 0];
|
uiNameSpace setVariable ['ACE_RscOptics_javelin',_this select 0];
|
||||||
};
|
};
|
||||||
@ -22,10 +24,13 @@ uiNameSpace setVariable [QGVAR(arguments),
|
|||||||
objNull, // currentTargetObject
|
objNull, // currentTargetObject
|
||||||
0, // Run Time
|
0, // Run Time
|
||||||
0, // Lock Time
|
0, // Lock Time
|
||||||
0 // Sound timer
|
0, // Sound timer
|
||||||
|
(random __LOCKONTIMERANDOM) // random lock time addition
|
||||||
]
|
]
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
_pfh_handle = uiNamespace getVariable ["ACE_RscOptics_javelin_PFH", nil];
|
_pfh_handle = uiNamespace getVariable ["ACE_RscOptics_javelin_PFH", nil];
|
||||||
if(isNil "_pfh_handle") then {
|
if(isNil "_pfh_handle") then {
|
||||||
_pfh_handle = [FUNC(onOpticDraw), 0, []] call CBA_fnc_addPerFrameHandler;
|
_pfh_handle = [FUNC(onOpticDraw), 0, []] call CBA_fnc_addPerFrameHandler;
|
||||||
|
@ -4,8 +4,10 @@
|
|||||||
*
|
*
|
||||||
* Arguments:
|
* Arguments:
|
||||||
* 0: Position of seeker (ASL) <position>
|
* 0: Position of seeker (ASL) <position>
|
||||||
* 1: Seeker wavelength sensitivity range, [1550,1550] is common eye safe. <array>
|
* 1: Direction vector (will be normalized) <vector>
|
||||||
* 2: Seeker laser code. <number>
|
* 2: Seeker FOV in degrees <number>
|
||||||
|
* 3: Seeker wavelength sensitivity range, [1550,1550] is common eye safe. <array>
|
||||||
|
* 4: Seeker laser code. <number>
|
||||||
*
|
*
|
||||||
* Return value:
|
* Return value:
|
||||||
* Array, [Strongest compatible laser spot ASL pos, owner object] Nil array values if nothing found.
|
* Array, [Strongest compatible laser spot ASL pos, owner object] Nil array values if nothing found.
|
||||||
@ -17,9 +19,14 @@ private ["_pos", "_seekerWavelengths", "_seekerCode", "_spots", "_buckets", "_ex
|
|||||||
"_emitterWavelength", "_laserCode", "_divergence", "_laser", "_laserPos", "_laserDir", "_res", "_bucketPos", "_bucketList", "_c", "_forEachIndex", "_index",
|
"_emitterWavelength", "_laserCode", "_divergence", "_laser", "_laserPos", "_laserDir", "_res", "_bucketPos", "_bucketList", "_c", "_forEachIndex", "_index",
|
||||||
"_testPos", "_finalBuckets", "_largest", "_largestIndex", "_finalBucket", "_owners", "_avgX", "_avgY", "_avgZ", "_count", "_maxOwner", "_maxOwnerIndex", "_finalOwner"];
|
"_testPos", "_finalBuckets", "_largest", "_largestIndex", "_finalBucket", "_owners", "_avgX", "_avgY", "_avgZ", "_count", "_maxOwner", "_maxOwnerIndex", "_finalOwner"];
|
||||||
|
|
||||||
_pos = _this select 0;
|
_pos = _this select 0;
|
||||||
_seekerWavelengths = _this select 1;
|
_dir = vectorNormalized (_this select 1);
|
||||||
_seekerCode = _this select 2;
|
_seekerFov = _this select 2;
|
||||||
|
_seekerWavelengths = _this select 3;
|
||||||
|
_seekerCode = _this select 4;
|
||||||
|
|
||||||
|
|
||||||
|
_seekerCos = cos _seekerFov;
|
||||||
|
|
||||||
_spots = [];
|
_spots = [];
|
||||||
_buckets = [];
|
_buckets = [];
|
||||||
@ -57,8 +64,13 @@ _finalOwner = nil;
|
|||||||
_laserPos = _laser select 0;
|
_laserPos = _laser select 0;
|
||||||
_laserDir = _laser select 1;
|
_laserDir = _laser select 1;
|
||||||
_res = [_laserPos, _laserDir, _divergence] call FUNC(shootCone);
|
_res = [_laserPos, _laserDir, _divergence] call FUNC(shootCone);
|
||||||
{
|
{
|
||||||
_spots pushBack [_x select 0, _owner];
|
_testPoint = _x select 0;
|
||||||
|
_testPointVector = vectorNormalized (_testPoint vectorDiff _pos);
|
||||||
|
_testDotProduct = _dir vectorDotProduct _testPointVector;
|
||||||
|
if(_testDotProduct > _seekerCos) then {
|
||||||
|
_spots pushBack [_testPoint, _owner];
|
||||||
|
};
|
||||||
} forEach (_res select 2);
|
} forEach (_res select 2);
|
||||||
};
|
};
|
||||||
} forEach (GVAR(laserEmitters) select 1);
|
} forEach (GVAR(laserEmitters) select 1);
|
||||||
|
@ -11,39 +11,20 @@
|
|||||||
* Return value:
|
* Return value:
|
||||||
* Boolean
|
* Boolean
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//#define DEBUG_MODE_FULL
|
|
||||||
#include "script_component.hpp"
|
#include "script_component.hpp"
|
||||||
private["_seeker", "_targetPos", "_seekerMaxAngle", "_vectorTo", "_sensorPos", "_vertOk", "_horzOk", "_dir", "_headingPitch"];
|
private["_seeker", "_targetPos", "_seekerMaxAngle", "_sensorPos", "_testPointVector", "_testDotProduct"];
|
||||||
|
|
||||||
_seeker = _this select 0;
|
_seeker = _this select 0;
|
||||||
_targetPos = _this select 1;
|
_targetPos = _this select 1;
|
||||||
_seekerMaxAngle = _this select 2;
|
_seekerMaxAngle = _this select 2;
|
||||||
|
|
||||||
_vertOk = false;
|
|
||||||
_horzOk = false;
|
|
||||||
|
|
||||||
_sensorPos = getPosASL _seeker;
|
_sensorPos = getPosASL _seeker;
|
||||||
_vectorTo = _sensorPos vectorFromTo _targetPos;
|
|
||||||
|
|
||||||
_headingPitch = (vectorDir _seeker) call CBA_fnc_vect2polar;
|
_testPointVector = vectorNormalized (_targetPos vectorDiff _sensorPos);
|
||||||
_polarTo = _vectorTo call CBA_fnc_vect2polar;
|
_testDotProduct = (vectorNormalized (velocity _seeker)) vectorDotProduct _testPointVector;
|
||||||
|
|
||||||
_dir = _polarTo select 1;
|
if(_testDotProduct < (cos _seekerMaxAngle)) exitWith {
|
||||||
_dir = _dir - (_headingPitch select 1);
|
|
||||||
|
|
||||||
if (_dir < 0) then {_dir = _dir + 360};
|
|
||||||
if (_dir > 360) then {_dir = _dir - 360};
|
|
||||||
_vertOk = false;
|
|
||||||
_horzOk = false;
|
|
||||||
if(_dir < _angleFov || {_dir > (360-_angleFov)}) then {
|
|
||||||
_horzOk = true;
|
|
||||||
};
|
|
||||||
if(abs((abs(_polarTo select 2))-(abs(_headingPitch select 2))) < _angleFov) then {
|
|
||||||
_vertOk = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
if(!_vertOk || !_horzOk ) exitWith {
|
|
||||||
false
|
false
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -6,15 +6,15 @@ _seekerTargetPos = _this select 0;
|
|||||||
|
|
||||||
_launchParams = _this select 1;
|
_launchParams = _this select 1;
|
||||||
_seekerParams = _launchParams select 3;
|
_seekerParams = _launchParams select 3;
|
||||||
|
_angleFov = _seekerParams select 0;
|
||||||
|
|
||||||
_laserResult = [(getPosASL _projectile), [ACE_DEFAULT_LASER_WAVELENGTH,ACE_DEFAULT_LASER_WAVELENGTH], ACE_DEFAULT_LASER_CODE] call EFUNC(laser,seekerFindLaserSpot);
|
_laserResult = [(getPosASL _projectile), (velocity _projectile), _angleFov, [ACE_DEFAULT_LASER_WAVELENGTH,ACE_DEFAULT_LASER_WAVELENGTH], ACE_DEFAULT_LASER_CODE] call EFUNC(laser,seekerFindLaserSpot);
|
||||||
_foundTargetPos = _laserResult select 0;
|
_foundTargetPos = _laserResult select 0;
|
||||||
TRACE_1("Search", _laserResult);
|
TRACE_1("Search", _laserResult);
|
||||||
|
|
||||||
|
|
||||||
if(!isNil "_foundTargetPos") then {
|
if(!isNil "_foundTargetPos") then {
|
||||||
_angleFov = _seekerParams select 0;
|
//_canSeeTarget = [_projectile, _foundTargetPos, _angleFov] call FUNC(checkSeekerAngle);
|
||||||
_canSeeTarget = [_projectile, _foundTargetPos, _angleFov] call FUNC(checkSeekerAngle);
|
|
||||||
|
|
||||||
// If we got here, it was an invalid target, just return a spot 5m in front of the missile
|
// If we got here, it was an invalid target, just return a spot 5m in front of the missile
|
||||||
if(!_canSeeTarget) then {
|
if(!_canSeeTarget) then {
|
||||||
|
Loading…
Reference in New Issue
Block a user