58 lines
2.0 KiB
C++
58 lines
2.0 KiB
C++
// Copyright 2016 Mookie. All Rights Reserved.
|
|
|
|
#include "EBBullet.h"
|
|
|
|
FVector AEBBullet::GetWind_Implementation(UWorld* World, FVector Location) const{
|
|
return Wind;
|
|
}
|
|
|
|
float AEBBullet::GetAirDensity_Implementation(UWorld* World, FVector Location) const{
|
|
switch (AtmosphereType) {
|
|
case (EEBAtmosphereType::AT_Curve): {
|
|
float airmp = SeaLevelAirDensity / GetCurveValue(AirDensityCurve, 0, SeaLevelAirDensity);
|
|
return GetCurveValue(AirDensityCurve, GetAltitude(World, Location) / WorldScale, SeaLevelAirDensity)* airmp;
|
|
}
|
|
case (EEBAtmosphereType::AT_Earth): {
|
|
return GetAltitudeDensity(GetAltitude(World, Location) / WorldScale / 100.0f);
|
|
}
|
|
default:{
|
|
return SeaLevelAirDensity;
|
|
}
|
|
}
|
|
}
|
|
|
|
float AEBBullet::GetSpeedOfSound_Implementation(UWorld* World, FVector Location) const{
|
|
if (!SpeedOfSoundVariesWithAltitude) {
|
|
return SeaLevelSpeedOfSound * WorldScale;
|
|
}
|
|
|
|
float Altitude = GetAltitude(World, Location);
|
|
float soundvmp = SeaLevelSpeedOfSound / GetCurveValue(SpeedOfSoundCurve, 0, SeaLevelSpeedOfSound);
|
|
return GetCurveValue(SpeedOfSoundCurve, Altitude, SeaLevelSpeedOfSound)*WorldScale*soundvmp;
|
|
}
|
|
|
|
|
|
float AEBBullet::GetAltitudePressure(float AltitudeMeter) const {
|
|
return FMath::Max(SeaLevelAirPressure * FMath::Pow((1 - (0.0000225577 * AltitudeMeter)), 5.25588), 0.0f);
|
|
}
|
|
|
|
float AEBBullet::GetAltitudeTemperature(float AltitudeMeter) const {
|
|
return SeaLevelAirTemperature - (TemperatureLapseRate * FMath::Min(AltitudeMeter, TropopauseAltitude));
|
|
}
|
|
|
|
float AEBBullet::GetAltitudeDensity(float AltitudeMeter) const {
|
|
float Temperature = GetAltitudeTemperature(AltitudeMeter);
|
|
float Pressure = GetAltitudePressure(AltitudeMeter);
|
|
return Pressure * 100.0f / ((Temperature + 273.15) * SpecificGasConstant);
|
|
}
|
|
|
|
float AEBBullet::GetAltitude(UWorld* World, FVector Location) const{
|
|
FVector DistanceFromOrigin = (Location - WorldCenterLocation + FVector(World->OriginLocation));
|
|
if (SphericalAltitude)
|
|
{
|
|
return (DistanceFromOrigin.Size() - SeaLevelRadius);
|
|
}
|
|
else {
|
|
return DistanceFromOrigin.Z;
|
|
}
|
|
} |