Just wonder would it be possible to simulate different effects of a bullet penetration of:
- full tank - fuel leaking as the only result
- empty/almost empty tank full of vapours - immediate detonation
- empty tank equipped with inerting system - no other result than holes.
I have dug around for ages looking for a copy of the RAF sector map. Can't find anything other than a few partial images.
(https://i.postimg.cc/QN9SDFCr/Desktop-Screenshot-2019-08-09-08-45-52-16.png) (https://postimg.cc/ThxnqYnk)
Thanks for digging those references out for me, I will dig through them and see what I can do
namespace GuruEngine.Characters.Ranks.Luftwaffe
{
/// <summary>
/// subcodes
/// 5 post 1944
/// 1 subrank
/// 2 cadet
/// 10 Flyers
/// 11 Paratroopers
/// 12 Anti aircraft gunner
/// 13 Communications
/// 14 Air force
/// </summary>
public class LuftwaffeRankTable
{
public static Dictionary<int, String> Ranks = new Dictionary<int, string>();
public static Dictionary<String, String> ShortForm = new Dictionary<string, string>();
public LuftwaffeRankTable()
{
Ranks.Add(Rank.MakeCode(RankCodes.QR1, 0, false), "Flieger");
Ranks.Add(Rank.MakeCode(RankCodes.QR2, 0, false), "Gefreiter");
Ranks.Add(Rank.MakeCode(RankCodes.QR3, 0, false), "Obergefreiter");
Ranks.Add(Rank.MakeCode(RankCodes.QR4, 0, false), "Hauptgefreiter");
Ranks.Add(Rank.MakeCode(RankCodes.QR4, 5, false), "Stabsgefreiter");
Ranks.Add(Rank.MakeCode(RankCodes.QR5, 0, false), "Unteroffizier");
Ranks.Add(Rank.MakeCode(RankCodes.QR5, 2, false), "Fahnenjunker");
Ranks.Add(Rank.MakeCode(RankCodes.QR5, 1, false), "Unterfeldwebel");
Ranks.Add(Rank.MakeCode(RankCodes.QR5, 3, false), "Fähnrich");
Ranks.Add(Rank.MakeCode(RankCodes.QR6, 0, false), "Feldwebel");
Ranks.Add(Rank.MakeCode(RankCodes.QR7, 0, false), "Oberfeldwebel");
Ranks.Add(Rank.MakeCode(RankCodes.QR7, 1, false), "Oberfähnrich");
Ranks.Add(Rank.MakeCode(RankCodes.QR8, 0, false), "Stabsfeldwebel");
Ranks.Add(Rank.MakeCode(RankCodes.OF0, 0, false), "Leutnant");
Ranks.Add(Rank.MakeCode(RankCodes.OF1, 0, false), "Oberleutnant");
Ranks.Add(Rank.MakeCode(RankCodes.OF2, 0, false), "Hauptmann");
Ranks.Add(Rank.MakeCode(RankCodes.OF3, 0, false), "Major");
Ranks.Add(Rank.MakeCode(RankCodes.OF4, 0, false), "Oberstleutnant");
Ranks.Add(Rank.MakeCode(RankCodes.OF5, 0, false), "Oberst");
Ranks.Add(Rank.MakeCode(RankCodes.OF6, 0, false), "Generalmajor");
Ranks.Add(Rank.MakeCode(RankCodes.OF7, 0, false), "Generalleutnant");
Ranks.Add(Rank.MakeCode(RankCodes.OF8, 10, false), "General der Flieger");
Ranks.Add(Rank.MakeCode(RankCodes.OF8, 11, false), "General der Fallschirmtruppe");
Ranks.Add(Rank.MakeCode(RankCodes.OF8, 13, false), "General der Luftnachrichtentruppe");
Ranks.Add(Rank.MakeCode(RankCodes.OF8, 12, false), "General der Flakartillerie");
Ranks.Add(Rank.MakeCode(RankCodes.OF8, 14, false), "General der Luftwaffe");
Ranks.Add(Rank.MakeCode(RankCodes.OF9, 0, false), "Generaloberst");
Ranks.Add(Rank.MakeCode(RankCodes.OF10, 0, false), "Generalfeldmarschall");
Ranks.Add(Rank.MakeCode(RankCodes.OF11, 0, false), "Reichsmarschall");
ShortForm.Add("Flieger", "Flg");
ShortForm.Add("Gefreiter", "Gefr");
ShortForm.Add("Obergefreiter", "Ogfr");
ShortForm.Add("Hauptgefreiter", "Hptgefr");
ShortForm.Add("Stabsgefreiter", "Sbsgefr");
ShortForm.Add("Unteroffizier", "Uffz");
ShortForm.Add("Fahnenjunker", "Fhr");
ShortForm.Add("Unterfeldwebel", "Ufw");
ShortForm.Add("Fähnrich", "Fhr");
ShortForm.Add("Feldwebel", "Fw");
ShortForm.Add("Oberfeldwebel", "Obfw");
ShortForm.Add("Oberfähnrich", " Obfhr");
ShortForm.Add("Stabsfeldwebel", "Stabsfw");
ShortForm.Add("Leutnant", "Lt");
ShortForm.Add("Oberleutnant", "Olt");
ShortForm.Add("Hauptmann", "Hptm");
ShortForm.Add("Major", "Maj");
ShortForm.Add("Oberstleutnant", "ObLt");
ShortForm.Add("Oberst", "Ob");
ShortForm.Add("Generalmajor", "GenMaj");
ShortForm.Add("Generalleutnant", "GenLt");
ShortForm.Add("General der Flieger", "GendFl");
ShortForm.Add("General der Fallschirmtruppe", "GendFal");
ShortForm.Add("General der Luftnachrichtentruppe", "GendLuft");
ShortForm.Add("General der Flakartillerie", "GendFlak");
ShortForm.Add("General der Luftwaffe", "GendL");
ShortForm.Add("Generaloberst", "GenOb");
ShortForm.Add("Generalfeldmarschall", "GenFeldm");
ShortForm.Add("Reichsmarschall", "RM");
}
}
}
I have added point lights to the deferred renderer when guns fire, the effect is very subtle, but interesting
I remember reading an after action report from a beaufighter pilot who claimed he was able to locate and shoot down two JU88's by tracking the light from the engines. He said that the engines sparked brightly enough for him to see the aircraft and get into a shooting position.
Does anyone else think this is correct?
Hook | To give location |
Particle system | This is the only way to do thousands of lights for the forward renderer, and an extra effect for the deferred renderer |
Lighting parameters | Colour, intensity, size |
Light shape |
float getball(float limit)
fm.getW()
fm.Or.getKren()
fm.Or.getTangage()
Code: [Select]float getball(float limit)
This seems to get acceleration values and convert them into an angle which is then limited to +- limit. What does it represent?
protected float getBall(double paramDouble)
{
double d1 = 0.0D;
long l1 = Time.current();
long l2 = l1 - this.oldBallTime;
this.oldBallTime = l1;
if (l2 > 200L) l2 = 200L;
double d2 = 0.00038D * l2;
if (-this.fm.getBallAccel().z > 0.001D) {
d1 = Math.toDegrees(Math.atan2(this.fm.getBallAccel().y, -this.fm.getBallAccel().z));
if (d1 > 20.0D) d1 = 20.0D;
else if (d1 < -20.0D) d1 = -20.0D;
this.pictBall = ((1.0D - d2) * this.pictBall + d2 * d1);
} else {
if (this.pictBall > 0.0D) d1 = 20.0D; else
d1 = -20.0D;
this.pictBall = ((1.0D - d2) * this.pictBall + d2 * d1);
}
if (this.pictBall > paramDouble) this.pictBall = paramDouble;
else if (this.pictBall < -paramDouble) this.pictBall = (-paramDouble);
return (float)this.pictBall;
}
public Vector3d getBallAccel() {
TmpV.set(this.LocalAccel);
if (this.Vwld.lengthSquared() < 10.0D) {
double d = this.Vwld.lengthSquared() - 5.0D;
if (d < 0.0D) d = 0.0D;
TmpV.scale(0.2D * d);
}
TmpA.set(0.0D, 0.0D, -Atmosphere.g());
this.Or.transformInv(TmpA);
TmpA.sub(TmpV);
return TmpA;
}
d1 = Math.toDegrees(Math.atan2(this.fm.getBallAccel().y, -this.fm.getBallAccel().z));
Capacity | In litres |
Automatic | Boolean |
I am using an approximation that the pilot requires 1 litre of oxygen per second for each ten thousand feet above 15000 feet.