mirror of
https://github.com/acemod/ACE3.git
synced 2024-08-30 18:23:18 +00:00
update caching access function names to align with each other and added some preliminary material consideration for spalling
This commit is contained in:
parent
278c09e4cb
commit
48d37a96e0
@ -44,7 +44,7 @@ private _maxFrags = round (linearConversion [0.1, 1.5, _timeSince, ACE_FRAG_COUN
|
|||||||
TRACE_3("",_timeSince,CBA_missionTime,_maxFrags);
|
TRACE_3("",_timeSince,CBA_missionTime,_maxFrags);
|
||||||
|
|
||||||
|
|
||||||
private _ammoArr = [_ammo] call FUNC(fragInfo);
|
private _ammoArr = [_ammo] call FUNC(getFragInfo);
|
||||||
_ammoArr params ["_fragRange", "_fragVel", "_fragTypes", "_modFragCount"];
|
_ammoArr params ["_fragRange", "_fragVel", "_fragTypes", "_modFragCount"];
|
||||||
|
|
||||||
private _heightAGL = (ASLToAGL _posASL)#2;
|
private _heightAGL = (ASLToAGL _posASL)#2;
|
||||||
|
@ -31,14 +31,13 @@ params [
|
|||||||
];
|
];
|
||||||
TRACE_5("fnc_doFragRandom", _posASL, _projVel, _heightAGL, _fragType, _fragCnt);
|
TRACE_5("fnc_doFragRandom", _posASL, _projVel, _heightAGL, _fragType, _fragCnt);
|
||||||
|
|
||||||
// See CfgAmmo for different frag types
|
// See cfgAmmoFragSpawner for different frag types
|
||||||
private _hMode = switch (true) do {
|
private _hMode = switch (true) do {
|
||||||
case (_heightAGL > 10): {"_top"};
|
case (_heightAGL > 10): {"_top"};
|
||||||
case (_heightAGL > 5): {"_hi"};
|
case (_heightAGL > 5): {"_hi"};
|
||||||
default {"_mid"};
|
default {"_mid"};
|
||||||
};
|
};
|
||||||
|
|
||||||
// Select the cfgAmmo type
|
|
||||||
private _type = if (count _fragType > 0 &&
|
private _type = if (count _fragType > 0 &&
|
||||||
{"ace_frag_tiny" isEqualTo (_fragType#0)}) then {
|
{"ace_frag_tiny" isEqualTo (_fragType#0)}) then {
|
||||||
QGVAR(def_tiny_)
|
QGVAR(def_tiny_)
|
||||||
|
@ -66,7 +66,7 @@ systemChat ("dV: " + str _dv + ", caliber: " + str _caliber + ", product: " + st
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (_explosive > 0) then {
|
if (_explosive > 0) then {
|
||||||
private _fragMod = (_ammo call FUNC(fragInfo))#1;
|
private _fragMod = (_ammo call FUNC(getFragInfo))#1;
|
||||||
_velMod = _fragMod * _velMod;
|
_velMod = _fragMod * _velMod;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -51,18 +51,19 @@ private _lVelUnit = vectorNormalized _lVel;
|
|||||||
private _ammo = typeOf _projectile;
|
private _ammo = typeOf _projectile;
|
||||||
private _dV = vectorMagnitude _lVel - vectorMagnitude _vel;
|
private _dV = vectorMagnitude _lVel - vectorMagnitude _vel;
|
||||||
private _caliber = getNumber (configFile >> "cfgAmmo" >> _ammo >> "caliber"); // !*! optimize this later?
|
private _caliber = getNumber (configFile >> "cfgAmmo" >> _ammo >> "caliber"); // !*! optimize this later?
|
||||||
private _deltaMomentum = 0.4 * _caliber * sqrt( _dV * 0.032 );
|
// scaled momentum change made on caliber-mass assumption ~sqrt(2)/20 * caliber ~= mass
|
||||||
|
private _deltaMomentum = 0.07071 * _caliber * sqrt( _dV );
|
||||||
|
|
||||||
TRACE_3("found speed",_dV,_caliber,_deltaMomentum);
|
TRACE_3("found speed",_dV,_caliber,_deltaMomentum);
|
||||||
|
|
||||||
if (_deltaMomentum < 1) exitWith {
|
if (_deltaMomentum < 2) exitWith {
|
||||||
TRACE_1("lowImpulse",_ammo);
|
TRACE_1("lowImpulse",_ammo);
|
||||||
};
|
};
|
||||||
|
|
||||||
//** start calculating where the spalling should come !*! could be better **//
|
//** start calculating where the spalling should come !*! could be better **//
|
||||||
private _unitStep = _lVelUnit vectorMultiply 0.05;
|
private _unitStep = _lVelUnit vectorMultiply 0.05;
|
||||||
private _spallPos = +_lPosASL;
|
private _spallPos = +_lPosASL;
|
||||||
// exit if we hit the ground
|
|
||||||
if (terrainIntersectASL [_lPosASL vectorAdd _unitStep, _lPosASL]) exitWith {
|
if (terrainIntersectASL [_lPosASL vectorAdd _unitStep, _lPosASL]) exitWith {
|
||||||
TRACE_3("terrainIntersect",_lPosASL,_unitStep,_lPosASL);
|
TRACE_3("terrainIntersect",_lPosASL,_unitStep,_lPosASL);
|
||||||
};
|
};
|
||||||
@ -81,16 +82,15 @@ for "_i" from 1 to 20 do
|
|||||||
[_spallPos, "green"] call FUNC(dev_sphereDraw);
|
[_spallPos, "green"] call FUNC(dev_sphereDraw);
|
||||||
[_lPosASL vectorAdd _lVelUnit, "orange"] call FUNC(dev_sphereDraw);
|
[_lPosASL vectorAdd _lVelUnit, "orange"] call FUNC(dev_sphereDraw);
|
||||||
[_lPosASL, "orange"] call FUNC(dev_sphereDraw);
|
[_lPosASL, "orange"] call FUNC(dev_sphereDraw);
|
||||||
private _str = GVAR(materialSpallCache) getOrDefault [str _surfaceType, "["];
|
|
||||||
_str =_str + str [_dV, _caliber, abs vectorMagnitude (_lPosASL vectorDiff _spallPos)] + ";";
|
|
||||||
GVAR(materialSpallCache) set [str _surfaceType, _str];
|
|
||||||
if (_deltaMomentum < 2) exitWith {};
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//***** Passed all other exit withs, performance o'clock */
|
//***** Passed all other exit withs, performance o'clock */
|
||||||
GVAR(lastSpallTime) = CBA_missionTime;
|
GVAR(lastSpallTime) = CBA_missionTime;
|
||||||
|
|
||||||
//***** Select spalled fragment spawner **//
|
//***** Select spalled fragment spawner **//
|
||||||
|
|
||||||
|
private _material = [_surfaceType] call FUNC(getMaterialInfo);
|
||||||
|
|
||||||
private _fragSpawnType = switch (true) do
|
private _fragSpawnType = switch (true) do
|
||||||
{
|
{
|
||||||
case (_deltaMomentum < 3): { QGVAR(spall_tiny) };
|
case (_deltaMomentum < 3): { QGVAR(spall_tiny) };
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
* of spherical fragmentation
|
* of spherical fragmentation
|
||||||
*
|
*
|
||||||
* Example:
|
* Example:
|
||||||
* ["B_556x45_Ball"] call ace_frag_fnc_fragInfo;
|
* ["B_556x45_Ball"] call ace_frag_fnc_getFragInfo;
|
||||||
*
|
*
|
||||||
* Public: No
|
* Public: No
|
||||||
*/
|
*/
|
35
addons/frag/functions/fnc_getMaterialInfo.sqf
Normal file
35
addons/frag/functions/fnc_getMaterialInfo.sqf
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
#include "script_component.hpp"
|
||||||
|
/*
|
||||||
|
* Author: Lambda.Tiger
|
||||||
|
* This function returns fragmentation parameters for a specific
|
||||||
|
* ammo type.
|
||||||
|
*
|
||||||
|
* Arguments:
|
||||||
|
* 0: _ammo <STRING> - cfgAmmo type of ammo to check
|
||||||
|
*
|
||||||
|
* Return Value:
|
||||||
|
* _ammoInfo <ARRAY>
|
||||||
|
* 0: _fragRange - search range for fragments
|
||||||
|
* 1: _fragVel - gurney equation calculated velocity
|
||||||
|
* 2: _fragTypes - array of fragment types
|
||||||
|
* 3: _fragCount - modified frag count used under assumptions
|
||||||
|
* of spherical fragmentation
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
* ["B_556x45_Ball"] call ace_frag_fnc_getFragInfo;
|
||||||
|
*
|
||||||
|
* Public: No
|
||||||
|
*/
|
||||||
|
|
||||||
|
params ["_surfType"];
|
||||||
|
|
||||||
|
private _material = GVAR(materialSpallCache) get _surfType;
|
||||||
|
|
||||||
|
if !(isNil "_material") exitWith {_material};
|
||||||
|
|
||||||
|
private _str = GVAR(materialSpallCache) getOrDefault [str _surfaceType, "["];
|
||||||
|
_str =_str + str [_dV, _caliber, abs vectorMagnitude (_lPosASL vectorDiff _spallPos)] + ";";
|
||||||
|
|
||||||
|
GVAR(materialSpallCache) set [_surfaceType, _material];
|
||||||
|
|
||||||
|
_material
|
Loading…
Reference in New Issue
Block a user