Skip to content

Commit

Permalink
Add support for PF-style mass so interstages can use PF mass (#25)
Browse files Browse the repository at this point in the history
  • Loading branch information
NathanKell authored Sep 28, 2023
1 parent d465d49 commit 9cb36f1
Showing 1 changed file with 69 additions and 4 deletions.
73 changes: 69 additions & 4 deletions Source/ROLib/Modules/ModuleROTank.cs
Original file line number Diff line number Diff line change
Expand Up @@ -278,10 +278,17 @@ internal void ModelChangedHandler(bool pushNodes)
UpdateAvailableVariants();
SetPreviousModuleLength();
UpdateDragCubes();
if (scaleMass)
UpdateMass();
if (scaleCost)
UpdateCost();
if (usePFStyleMass)
{
UpdatePFMassCost();
}
else
{
if (scaleMass)
UpdateMass();
if (scaleCost)
UpdateCost();
}
SetupKorolevCross();
ROLStockInterop.UpdatePartHighlighting(part);
//if (HighLogic.LoadedSceneIsEditor)
Expand Down Expand Up @@ -312,6 +319,7 @@ public override void OnLoad(ConfigNode node)
UpdateModulePositions();
UpdateDimensions();
UpdateModelMeshes();
SetPFFields();
}

public override void OnStart(StartState state)
Expand All @@ -322,6 +330,7 @@ public override void OnStart(StartState state)
SetupKorolevCross();
GameEvents.onVesselGoOffRails.Add(OnVesselOffRails);
GameEvents.onVesselGoOnRails.Add(OnVesselOnRails);
SetPFFields();
}

public void OnDestroy()
Expand Down Expand Up @@ -1000,5 +1009,61 @@ private void OnMouseOver()
}

#endregion GUI

#region PF-style mass

[KSPField] public bool usePFStyleMass = false;
[KSPField(isPersistant = true, guiActiveEditor = false, guiName = "Side Density", groupName = GroupName, groupDisplayName = GroupDisplayName)]
[UI_FloatRange(minValue = 0.01f, maxValue = 1.0f, stepIncrement = 0.01f)]
public float density = 0.18f;
[KSPField] public float minDensity = 0.01f;
[KSPField] public float maxDensity = 1.0f;
[KSPField] public float stepDensity = 0.01f;
[KSPField] public Vector4 specificMass = new Vector4(0.005f, 0.011f, 0.009f, 0f);
[KSPField] public float decouplerMassMult = 4f;
[KSPField] public float pfCostPerTonBase = 500f;
[KSPField] public float pfCostPerTonSide = 100f;

private void SetPFFields()
{
var fieldDensity = Fields[nameof(density)];
var floatRange = fieldDensity.uiControlEditor as UI_FloatRange;
floatRange.minValue = minDensity;
floatRange.maxValue = maxDensity;
floatRange.stepIncrement = stepDensity;
fieldDensity.guiActiveEditor = usePFStyleMass;
if (usePFStyleMass)
{
floatRange.onFieldChanged = floatRange.onSymmetryFieldChanged = (a, b) =>
{
ModelChangedHandler(true);
};
}
}

private void UpdatePFMassCost()
{
const float baseSideThickness = 0.05f;
float radiusBot = coreModule.moduleLowerDiameter * 0.5f;
float radiusTop = coreModule.moduleUpperDiameter * 0.5f;
// Technically we should use Mathf.Sqrt((radiusBot - radiusTop) * (radiusBot - radiusTop) + coreModule.moduleHeight * coreModule.moduleHeight);
// but PF just uses the height.
float sideLength = coreModule.moduleActualHeight;
float sideSideThickness = Mathf.Min(baseSideThickness * Mathf.Max(coreModule.moduleLowerDiameter, coreModule.moduleUpperDiameter), 0.25f * Mathf.Min(coreModule.moduleLowerDiameter, coreModule.moduleUpperDiameter));
float sideArea = Mathf.PI * sideLength * (radiusBot + radiusTop - 2f * sideSideThickness);
float sideMass = sideArea * sideSideThickness * density;

float baseDiameterAdj = coreModule.moduleLowerDiameter - 2f * sideSideThickness;
float baseMass = (((((specificMass.x * baseDiameterAdj) + specificMass.y) * baseDiameterAdj) + specificMass.z) * baseDiameterAdj) + specificMass.w;

if (scaleCost)
modifiedCost = sideMass * pfCostPerTonSide + baseMass * pfCostPerTonBase;
if (scaleMass)
modifiedMass = sideMass + baseMass * decouplerMassMult;
}

//%specificMass = 0.0002, 0.01, 0.005, 0

#endregion
}
}

0 comments on commit 9cb36f1

Please sign in to comment.