mirror of
https://github.com/EpochModTeam/DayZ-Epoch.git
synced 2025-12-14 20:13:13 +03:00
109 lines
2.1 KiB
Plaintext
109 lines
2.1 KiB
Plaintext
#include "\z\addons\dayz_code\util\Vector.hpp"
|
|
|
|
_project =
|
|
{
|
|
private ["_verts","_axis","_min","_max"];
|
|
local _verts = +(_this select 0);
|
|
local _axis = _this select 1;
|
|
|
|
{ _verts set [_foreachIndex, Vector_DotProduct_Fast(_axis, _x)] } foreach _verts;
|
|
|
|
local _min = _verts select 0;
|
|
local _max = _min;
|
|
|
|
{
|
|
if (_x < _min) then
|
|
{ _min = _x };
|
|
|
|
if (_x > _max) then
|
|
{ _max = _x };
|
|
}
|
|
foreach _verts;
|
|
|
|
[_min, _max]
|
|
};
|
|
|
|
_notOverlap =
|
|
{
|
|
#define AMIN (_this select 0 select 0)
|
|
#define AMAX (_this select 0 select 1)
|
|
#define BMIN (_this select 1 select 0)
|
|
#define BMAX (_this select 1 select 1)
|
|
|
|
AMAX < BMIN || AMIN > BMAX
|
|
};
|
|
|
|
_boundingBoxVertices =
|
|
{
|
|
private ["_min","_max","_verts","_v"];
|
|
local _min = _this select 0;
|
|
local _max = _this select 1;
|
|
local _verts = [_min, _max];
|
|
_verts resize 8;
|
|
|
|
local _v = +_min;
|
|
_v set [0, _max select 0];
|
|
_verts set [2, +_v];
|
|
_v set [1, _max select 1];
|
|
_verts set [3, +_v];
|
|
|
|
_v = +_min;
|
|
_v set [1, _max select 1];
|
|
_verts set [4, +_v];
|
|
_v set [2, _max select 2];
|
|
_verts set [5, +_v];
|
|
|
|
_v = +_min;
|
|
_v set [0, _max select 0];
|
|
_verts set [6, +_v];
|
|
_v set [2, _max select 2];
|
|
_verts set [7, _v];
|
|
|
|
_verts
|
|
};
|
|
|
|
_modelToWorld =
|
|
{
|
|
private ["_object","_verts"];
|
|
local _object = _this select 0;
|
|
local _verts = _this select 1;
|
|
|
|
{ _verts set [_foreachIndex, _object modelToWorld _x] } foreach _verts;
|
|
|
|
_verts
|
|
};
|
|
|
|
_getAxes =
|
|
{
|
|
private ["_dir","_up","_side"];
|
|
local _dir = vectorDir _this;
|
|
local _up = vectorUp _this;
|
|
|
|
local _side = Vector_Rotate3D_Fast(_dir, _up, 90);
|
|
|
|
[_dir, _side, _up]
|
|
};
|
|
|
|
_collision =
|
|
{
|
|
private ["_abb","_bbb","_averts","_bverts","_axes","_result"];
|
|
local _abb = boundingBox (_this select 0);
|
|
local _bbb = boundingBox (_this select 1);
|
|
local _averts = [_this select 0, _abb call _boundingBoxVertices] call _modelToWorld;
|
|
local _bverts = [_this select 1, _bbb call _boundingBoxVertices] call _modelToWorld;
|
|
|
|
local _axes = (_this select 0 call _getAxes) + (_this select 1 call _getAxes);
|
|
|
|
local _result = true;
|
|
|
|
{
|
|
if ([[_averts, _x] call _project, [_bverts, _x] call _project] call _notOverlap) exitWith
|
|
{ _result = false };
|
|
}
|
|
foreach _axes;
|
|
|
|
_result
|
|
};
|
|
|
|
_this call _collision;
|