Merge pull request #3342 from acemod/vehicleInteractionDistance

Uniformize interaction distance for vehicle based on bounding box
This commit is contained in:
Glowbal 2016-06-20 09:55:55 +02:00 committed by GitHub
commit afb9eb3084
5 changed files with 96 additions and 11 deletions

View File

@ -16,8 +16,8 @@ GVAR(currentOptions) = [];
private _player = ACE_player;
private _cameraPosASL = AGLtoASL (positionCameraToWorld [0, 0, 0]);
private _cameraDir = (AGLtoASL (positionCameraToWorld [0, 0, 1])) vectorDiff _cameraPosASL;
GVAR(cameraPosASL) = AGLtoASL (positionCameraToWorld [0, 0, 0]);
GVAR(cameraDir) = (AGLtoASL (positionCameraToWorld [0, 0, 1])) vectorDiff GVAR(cameraPosASL);
private _fnc_renderNearbyActions = {
// Render all nearby interaction menus
@ -32,7 +32,7 @@ private _fnc_renderNearbyActions = {
private _target = _x;
// Quick oclussion test. Skip objects more than 1 m behind the camera plane
private _lambda = ((getPosASL _x) vectorDiff _cameraPosASL) vectorDotProduct _cameraDir;
private _lambda = ((getPosASL _x) vectorDiff GVAR(cameraPosASL)) vectorDotProduct GVAR(cameraDir);
if ((_lambda > -1) && {!isObjectHidden _target}) then {
private _numInteractions = 0;
// Prevent interacting with yourself or your own vehicle

View File

@ -90,9 +90,8 @@ if (_activeActionTree isEqualTo []) exitWith {false};
BEGIN_COUNTER(fnc_renderMenus);
// IGNORE_PRIVATE_WARNING(_cameraPosASL,_cameraDir);
if (count _pos > 2) then {
_sPos pushBack (((AGLtoASL _pos) vectorDiff _cameraPosASL) vectorDotProduct _cameraDir);
_sPos pushBack (((AGLtoASL _pos) vectorDiff GVAR(cameraPosASL)) vectorDotProduct GVAR(cameraDir));
} else {
_sPos pushBack 0;
};

View File

@ -307,8 +307,9 @@ class CfgVehicles {
class ACE_Actions {
class ACE_MainActions {
displayName = CSTRING(MainAction);
position = QUOTE(call DFUNC(getVehiclePos));
selection = "";
distance = 10;
distance = 4;
condition = "true";
class ACE_Passengers {
displayName = CSTRING(Passengers);
@ -333,8 +334,9 @@ class CfgVehicles {
class ACE_Actions {
class ACE_MainActions {
displayName = CSTRING(MainAction);
position = QUOTE(call DFUNC(getVehiclePos));
selection = "";
distance = 10;
distance = 4;
condition = "true";
class ACE_Passengers {
displayName = CSTRING(Passengers);
@ -386,8 +388,9 @@ class CfgVehicles {
class ACE_Actions {
class ACE_MainActions {
displayName = CSTRING(MainAction);
position = QUOTE(call DFUNC(getVehiclePos));
selection = "";
distance = 10;
distance = 4;
condition = "true";
class ACE_Passengers {
displayName = CSTRING(Passengers);
@ -413,7 +416,7 @@ class CfgVehicles {
class ACE_MainActions {
displayName = CSTRING(MainAction);
selection = "";
distance = 10;
distance = 4;
condition = "true";
class ACE_Passengers {
displayName = CSTRING(Passengers);
@ -439,8 +442,9 @@ class CfgVehicles {
class ACE_Actions {
class ACE_MainActions {
displayName = CSTRING(MainAction);
position = QUOTE(call DFUNC(getVehiclePos));
selection = "";
distance = 10;
distance = 4;
condition = "true";
class ACE_Push {
@ -475,7 +479,7 @@ class CfgVehicles {
class ACE_MainActions {
displayName = CSTRING(MainAction);
selection = "gunnerview";
distance = 2;
distance = 4;
condition = "true";
class ACE_Passengers {
displayName = CSTRING(Passengers);

View File

@ -2,6 +2,7 @@
// interaction menu
PREP(addPassengerActions);
PREP(addPassengersActions);
PREP(getVehiclePos);
PREP(getWeaponPos);
PREP(moduleInteraction);

View File

@ -0,0 +1,81 @@
/*
* Author: esteldunedain
* Return a suitable position for the action point for the given target vehicle
*
* Arguments:
* None (uses local variable _target)
*
* Return value:
* Children actions <ARRAY>
*
* Example:
* call ace_interaction_fnc_getVehiclePos
*
* Public: No
*/
#include "script_component.hpp"
// IGNORE_PRIVATE_WARNING(_target);
private _bb = boundingBoxReal _target;
(_bb select 0) params ["_bbX", "_bbY", "_bbZ"];
//Helicopter's rotors distort the bounding box, assume a max of 3 meters width for the body
if (_target isKindOf "Helicopter") then {_bbX = (_bbx min 3) max -3;};
private _relPos = _target worldToModelVisual ASLToAGL EGVAR(interact_menu,cameraPosASL);
#ifdef DEBUG_MODE_FULL
_relPos = _target worldToModelVisual ASLToAGL eyePos ACE_player;
#endif
_relPos params ["_dx", "_dy", "_dz"];
private _ndx = (abs _dx) / ((abs (_bbx)) - 1);
private _ndy = (abs _dy) / ((abs (_bbY)) - 1);
private _ndz = (abs _dz) / ((abs (_bbZ)) - 1);
private "_pos";
if (_ndx > _ndy) then {
if (_ndx > _ndz) then {
// _ndx is greater, will colide with x plane first
_pos = _relPos vectorMultiply ((1 / _ndx) min 0.8);
} else {
// _ndz is greater, will colide with z plane first
_pos = _relPos vectorMultiply ((1 / _ndz) min 0.8);
};
} else {
if (_ndy > _ndz) then {
// _ndy is greater, will colide with y plane first
_pos = _relPos vectorMultiply ((1 / _ndy) min 0.8);
} else {
// _ndz is greater, will colide with z plane first
_pos = _relPos vectorMultiply ((1 / _ndz) min 0.8);
};
};
//Set max height at player's eye level (prevent very high interactin point on choppers)
_pos set [2, (_pos select 2) min _dz];
TRACE_4("",_bb,_bbX,_relPos, _pos);
_pos
///////////////////
// The code belows works very well for cursor mode, but not at all in normal mode
// maybe it could be enabled by default only for that mode
/*
if (cursorObject isEqualTo _target) exitWith {
private _dest = EGVAR(interact_menu,cameraPosASL) vectorAdd (EGVAR(interact_menu,cameraDir) vectorMultiply 50);
private _origin = EGVAR(interact_menu,cameraPosASL);
//private _origin = EGVAR(interact_menu,cameraPosASL) vectorAdd [0, 0, -0.35] vectorDiff (EGVAR(interact_menu,cameraDir) vectorMultiply 1.5);
//private _dest = AGLtoASL (_target modelToWorldVisual [0,0,0]);
private _results = lineIntersectsSurfaces [_origin, _dest, ACE_player, objNull, true, 5];
private _finalPos = [0,0,0];
{
_x params ["_pos", "", "_obj"];
TRACE_3("",_forEachIndex,_obj,_target);
if (_obj isEqualTo _target) exitWith {
_finalPos = _target worldToModelVisual ASLtoAGL (_pos vectorAdd (EGVAR(interact_menu,cameraDir) vectorMultiply 1.0));
};
} forEach _results;
_finalPos
};
[0,0,0]
*/
///////////////////